From 707f89585b0ec4ea19950e0288cf3d44f5839c04 Mon Sep 17 00:00:00 2001 From: vim-usds Date: Wed, 20 Oct 2021 00:25:07 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20usds/jus?= =?UTF-8?q?tice40-tool@0bf34ac718b61b68729f2f68afd60430d338a14a=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 803-0bf34ac/40194750-d595f8dc70f5f93f5ee1.js | 1 + 803-0bf34ac/404.html | 1 + 803-0bf34ac/404/index.html | 1 + 803-0bf34ac/app-174f0e3664b4ba1c5eea.js | 1 + 803-0bf34ac/cejst/index.html | 1 + 803-0bf34ac/chunk-map.json | 1 + 803-0bf34ac/commons-9eacb4ad8514df39f59c.js | 1 + ...-src-pages-404-tsx-72a295bef8763296f309.js | 1 + ...rc-pages-cejst-tsx-94f624af453524017476.js | 1 + ...-pages-contact-tsx-7f940e0ac0afa9fe32d0.js | 1 + ...rc-pages-index-tsx-d55ad365a816e2b3c6fc.js | 1 + ...es-methodology-tsx-4a1498992efe94aa545e.js | 1 + 803-0bf34ac/contact/index.html | 1 + 803-0bf34ac/d94c0b71-011c029866557a05ad48.js | 1 + ...0bf6c000a41750d3ae-01c585989aa2d2f2deba.js | 1 + 803-0bf34ac/en/404.html | 1 + 803-0bf34ac/en/404/index.html | 1 + 803-0bf34ac/en/cejst/index.html | 6 + 803-0bf34ac/en/contact/index.html | 1 + 803-0bf34ac/en/index.html | 1 + 803-0bf34ac/en/methodology/index.html | 24 + 803-0bf34ac/es/404.html | 1 + 803-0bf34ac/es/404/index.html | 1 + 803-0bf34ac/es/cejst/index.html | 6 + 803-0bf34ac/es/contact/index.html | 1 + 803-0bf34ac/es/index.html | 1 + 803-0bf34ac/es/methodology/index.html | 24 + 803-0bf34ac/favicon.ico | Bin 0 -> 2148 bytes 803-0bf34ac/framework-a3da6a89099751fcddf3.js | 1 + 803-0bf34ac/index.html | 1 + 803-0bf34ac/methodology/index.html | 1 + 803-0bf34ac/page-data/404.html/page-data.json | 1 + 803-0bf34ac/page-data/404/page-data.json | 1 + 803-0bf34ac/page-data/app-data.json | 1 + 803-0bf34ac/page-data/cejst/page-data.json | 1 + 803-0bf34ac/page-data/contact/page-data.json | 1 + .../page-data/dev-404-page/page-data.json | 1 + .../page-data/en/404.html/page-data.json | 1 + 803-0bf34ac/page-data/en/404/page-data.json | 1 + 803-0bf34ac/page-data/en/cejst/page-data.json | 1 + .../page-data/en/contact/page-data.json | 1 + .../page-data/en/dev-404-page/page-data.json | 1 + .../page-data/en/methodology/page-data.json | 1 + 803-0bf34ac/page-data/en/page-data.json | 1 + .../page-data/es/404.html/page-data.json | 1 + 803-0bf34ac/page-data/es/404/page-data.json | 1 + 803-0bf34ac/page-data/es/cejst/page-data.json | 1 + .../page-data/es/contact/page-data.json | 1 + .../page-data/es/dev-404-page/page-data.json | 1 + .../page-data/es/methodology/page-data.json | 1 + 803-0bf34ac/page-data/es/page-data.json | 1 + 803-0bf34ac/page-data/index/page-data.json | 1 + .../page-data/methodology/page-data.json | 1 + 803-0bf34ac/polyfill-6ed6bf3e44ff10cfb669.js | 1 + 803-0bf34ac/render-page.js | 2285 +++++++++++++++++ 803-0bf34ac/robots.txt | 2 + 803-0bf34ac/sitemap/sitemap-0.xml | 1 + 803-0bf34ac/sitemap/sitemap-index.xml | 1 + ...old-9caa42f21e4ae090b755f99d14c3a2fd.woff2 | Bin 0 -> 21308 bytes ...Bold-b6cbc321678701d773c6f86934c55901.woff | Bin 0 -> 26892 bytes ...-Bold-b87366633b1019e8c63c28ce979a1d44.ttf | Bin 0 -> 47228 bytes ...talic-4d74f3bda45f5aba1abf8d2a12313b56.ttf | Bin 0 -> 40472 bytes ...alic-a0bcf832ed51501c237c07d8909087e6.woff | Bin 0 -> 24464 bytes ...lic-dc8b76b44a8a6e5fad1c8c46568a5951.woff2 | Bin 0 -> 19568 bytes ...alic-80d8a9aff0d8bdeb966d443e9cfaa19d.woff | Bin 0 -> 24152 bytes ...talic-b60043e65fa5cbcedb809c19a4cdd4d6.ttf | Bin 0 -> 39480 bytes ...lic-c63d4066b0f133fc519f0504abf6ac55.woff2 | Bin 0 -> 19252 bytes ...Light-30dd683b4fcfe95b030b8c07c3482121.ttf | Bin 0 -> 49164 bytes ...ight-7b2a6350fcb212efe521caae9cf0d29b.woff | Bin 0 -> 26988 bytes ...ght-f347d9834a5feacbcefb85461ac77e70.woff2 | Bin 0 -> 21260 bytes ...talic-26ebdd3b8f1d039bc3dd95691ce27164.ttf | Bin 0 -> 39456 bytes ...lic-506121dad559538d44eda8fe540f9224.woff2 | Bin 0 -> 18976 bytes ...alic-8a239a410a47b6192e059fcf26556101.woff | Bin 0 -> 23808 bytes ...gular-43dc3080728216519bf08e82557e1912.ttf | Bin 0 -> 49484 bytes ...lar-a30c1b8fcb759e9fe728873f84044227.woff2 | Bin 0 -> 21692 bytes ...ular-add503b41601df15b97ed98d3ed46c95.woff | Bin 0 -> 27512 bytes ...map-1-4af6422a4e9622e0eac395f724cc4ee0.svg | 893 +++++++ ...-seal-12e5dcc4453cb3321515f50874d1f1f6.svg | 2036 +++++++++++++++ .../hero-64da0bc09eaff1000d48c416c82ea2db.png | Bin 0 -> 689079 bytes ...300-316b1352cc4ab2054de67541c69539d9.woff2 | Bin 0 -> 16380 bytes ...-300-92dd8f0ccfaebc33f817da19369100d8.woff | Bin 0 -> 19884 bytes ...n-300-ce3838471d62f8364e125cc74923e05b.ttf | Bin 0 -> 32160 bytes ...lic-09cc62a8fbd32c8b28124eecc228bc36.woff2 | Bin 0 -> 17340 bytes ...alic-1b8d46dae0a077f999ae901c213dcbd2.woff | Bin 0 -> 21052 bytes ...talic-93511dbad22ceb584f036ab660a563ba.ttf | Bin 0 -> 32596 bytes ...700-936869ba46988c2387481468c25686bc.woff2 | Bin 0 -> 15956 bytes ...-700-d85b43c39f4620dfa5b47b16e842c8a9.woff | Bin 0 -> 19564 bytes ...n-700-e57caf7ea634a258a9b2e06137755ec6.ttf | Bin 0 -> 31092 bytes ...alic-0a6791447401e0ebd70d98b0e4ecc5ff.woff | Bin 0 -> 21132 bytes ...lic-5a8f743549cc6cef9a001f0c21d55e5b.woff2 | Bin 0 -> 17336 bytes ...talic-da78bf0b1b435f40ca198525361d3b84.ttf | Bin 0 -> 32564 bytes ...lic-087069a9f454e2581ed6a7a84b142327.woff2 | Bin 0 -> 17312 bytes ...talic-4863add4d566a55b6a971780f0328e05.ttf | Bin 0 -> 32336 bytes ...alic-756750acefdb77704c08c235510f6e4c.woff | Bin 0 -> 21096 bytes ...gular-215adb34128fcb20668b963ec7926ef2.ttf | Bin 0 -> 31052 bytes ...ular-a3246d29b40a8b0da142caea1bc84974.woff | Bin 0 -> 19576 bytes ...lar-f1dc10a756c2c544588b7408095ffed7.woff2 | Bin 0 -> 16028 bytes ...ont-4a1efbe82eaa84ff89ed34a0bd374991.woff2 | Bin 0 -> 20368 bytes ...bfont-9a76932911f04be25044af15855ffeb2.ttf | Bin 0 -> 54340 bytes ...font-e7e051e1bc64fa89931760a52d0c8bd3.woff | Bin 0 -> 26040 bytes ...font-73021f1aabd43f50e16a6a0771c45689.woff | Bin 0 -> 20164 bytes ...bfont-af3dd40e0ac8e2ca50ac3943d5d7014d.ttf | Bin 0 -> 38760 bytes ...ont-ef69f0d737406260319a2c5ec73da3a8.woff2 | Bin 0 -> 16416 bytes ...font-0aaeabbaba38453310786c387d4a052a.woff | Bin 0 -> 20204 bytes ...bfont-3efee318468995ac04affb6a907a6b03.ttf | Bin 0 -> 38848 bytes ...ont-c6c9fd228e87eefaf1d4e4d8f439760b.woff2 | Bin 0 -> 16372 bytes ...font-70e7d719e258c9a7e68b19236a49bcc4.woff | Bin 0 -> 25956 bytes ...bfont-d6f73cf7210d3b5c2fa95f00e38396a2.ttf | Bin 0 -> 54504 bytes ...ont-e5f1a42e1c2b97e2587641dea75c548f.woff2 | Bin 0 -> 20412 bytes ...bfont-43ea3d39e6aa59fb6f1b4f974dfdc76b.ttf | Bin 0 -> 39144 bytes ...font-455d120362f79aa219d465e39fc66e82.woff | Bin 0 -> 20256 bytes ...ont-9c5bf2190b2471c2f22b96bb92249ecb.woff2 | Bin 0 -> 16316 bytes ...bfont-5acfe0d0f69444765ba489e2091c95cc.ttf | Bin 0 -> 54432 bytes ...font-c4e25ab10baa365dfc6620c04ea9202b.woff | Bin 0 -> 26140 bytes ...ont-e7bccfa631a0017f31da9e0c2fd2627b.woff2 | Bin 0 -> 20540 bytes 803-0bf34ac/styles.9187ea998b678a8804ed.css | 2 + .../webpack-runtime-937ffcec7d8c5573b409.js | 1 + 803-0bf34ac/webpack.stats.json | 1 + 118 files changed, 5331 insertions(+) create mode 100644 803-0bf34ac/40194750-d595f8dc70f5f93f5ee1.js create mode 100644 803-0bf34ac/404.html create mode 100644 803-0bf34ac/404/index.html create mode 100644 803-0bf34ac/app-174f0e3664b4ba1c5eea.js create mode 100644 803-0bf34ac/cejst/index.html create mode 100644 803-0bf34ac/chunk-map.json create mode 100644 803-0bf34ac/commons-9eacb4ad8514df39f59c.js create mode 100644 803-0bf34ac/component---src-pages-404-tsx-72a295bef8763296f309.js create mode 100644 803-0bf34ac/component---src-pages-cejst-tsx-94f624af453524017476.js create mode 100644 803-0bf34ac/component---src-pages-contact-tsx-7f940e0ac0afa9fe32d0.js create mode 100644 803-0bf34ac/component---src-pages-index-tsx-d55ad365a816e2b3c6fc.js create mode 100644 803-0bf34ac/component---src-pages-methodology-tsx-4a1498992efe94aa545e.js create mode 100644 803-0bf34ac/contact/index.html create mode 100644 803-0bf34ac/d94c0b71-011c029866557a05ad48.js create mode 100644 803-0bf34ac/dc6a8720040df98778fe970bf6c000a41750d3ae-01c585989aa2d2f2deba.js create mode 100644 803-0bf34ac/en/404.html create mode 100644 803-0bf34ac/en/404/index.html create mode 100644 803-0bf34ac/en/cejst/index.html create mode 100644 803-0bf34ac/en/contact/index.html create mode 100644 803-0bf34ac/en/index.html create mode 100644 803-0bf34ac/en/methodology/index.html create mode 100644 803-0bf34ac/es/404.html create mode 100644 803-0bf34ac/es/404/index.html create mode 100644 803-0bf34ac/es/cejst/index.html create mode 100644 803-0bf34ac/es/contact/index.html create mode 100644 803-0bf34ac/es/index.html create mode 100644 803-0bf34ac/es/methodology/index.html create mode 100644 803-0bf34ac/favicon.ico create mode 100644 803-0bf34ac/framework-a3da6a89099751fcddf3.js create mode 100644 803-0bf34ac/index.html create mode 100644 803-0bf34ac/methodology/index.html create mode 100644 803-0bf34ac/page-data/404.html/page-data.json create mode 100644 803-0bf34ac/page-data/404/page-data.json create mode 100644 803-0bf34ac/page-data/app-data.json create mode 100644 803-0bf34ac/page-data/cejst/page-data.json create mode 100644 803-0bf34ac/page-data/contact/page-data.json create mode 100644 803-0bf34ac/page-data/dev-404-page/page-data.json create mode 100644 803-0bf34ac/page-data/en/404.html/page-data.json create mode 100644 803-0bf34ac/page-data/en/404/page-data.json create mode 100644 803-0bf34ac/page-data/en/cejst/page-data.json create mode 100644 803-0bf34ac/page-data/en/contact/page-data.json create mode 100644 803-0bf34ac/page-data/en/dev-404-page/page-data.json create mode 100644 803-0bf34ac/page-data/en/methodology/page-data.json create mode 100644 803-0bf34ac/page-data/en/page-data.json create mode 100644 803-0bf34ac/page-data/es/404.html/page-data.json create mode 100644 803-0bf34ac/page-data/es/404/page-data.json create mode 100644 803-0bf34ac/page-data/es/cejst/page-data.json create mode 100644 803-0bf34ac/page-data/es/contact/page-data.json create mode 100644 803-0bf34ac/page-data/es/dev-404-page/page-data.json create mode 100644 803-0bf34ac/page-data/es/methodology/page-data.json create mode 100644 803-0bf34ac/page-data/es/page-data.json create mode 100644 803-0bf34ac/page-data/index/page-data.json create mode 100644 803-0bf34ac/page-data/methodology/page-data.json create mode 100644 803-0bf34ac/polyfill-6ed6bf3e44ff10cfb669.js create mode 100644 803-0bf34ac/render-page.js create mode 100644 803-0bf34ac/robots.txt create mode 100644 803-0bf34ac/sitemap/sitemap-0.xml create mode 100644 803-0bf34ac/sitemap/sitemap-index.xml create mode 100644 803-0bf34ac/static/Latin-Merriweather-Bold-9caa42f21e4ae090b755f99d14c3a2fd.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-Bold-b6cbc321678701d773c6f86934c55901.woff create mode 100644 803-0bf34ac/static/Latin-Merriweather-Bold-b87366633b1019e8c63c28ce979a1d44.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-BoldItalic-4d74f3bda45f5aba1abf8d2a12313b56.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-BoldItalic-a0bcf832ed51501c237c07d8909087e6.woff create mode 100644 803-0bf34ac/static/Latin-Merriweather-BoldItalic-dc8b76b44a8a6e5fad1c8c46568a5951.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-Italic-80d8a9aff0d8bdeb966d443e9cfaa19d.woff create mode 100644 803-0bf34ac/static/Latin-Merriweather-Italic-b60043e65fa5cbcedb809c19a4cdd4d6.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-Italic-c63d4066b0f133fc519f0504abf6ac55.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-Light-30dd683b4fcfe95b030b8c07c3482121.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-Light-7b2a6350fcb212efe521caae9cf0d29b.woff create mode 100644 803-0bf34ac/static/Latin-Merriweather-Light-f347d9834a5feacbcefb85461ac77e70.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-LightItalic-26ebdd3b8f1d039bc3dd95691ce27164.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-LightItalic-506121dad559538d44eda8fe540f9224.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-LightItalic-8a239a410a47b6192e059fcf26556101.woff create mode 100644 803-0bf34ac/static/Latin-Merriweather-Regular-43dc3080728216519bf08e82557e1912.ttf create mode 100644 803-0bf34ac/static/Latin-Merriweather-Regular-a30c1b8fcb759e9fe728873f84044227.woff2 create mode 100644 803-0bf34ac/static/Latin-Merriweather-Regular-add503b41601df15b97ed98d3ed46c95.woff create mode 100644 803-0bf34ac/static/about-usmap-1-4af6422a4e9622e0eac395f724cc4ee0.svg create mode 100644 803-0bf34ac/static/eop-seal-12e5dcc4453cb3321515f50874d1f1f6.svg create mode 100644 803-0bf34ac/static/hero-64da0bc09eaff1000d48c416c82ea2db.png create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300-316b1352cc4ab2054de67541c69539d9.woff2 create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300-92dd8f0ccfaebc33f817da19369100d8.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300-ce3838471d62f8364e125cc74923e05b.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300italic-09cc62a8fbd32c8b28124eecc228bc36.woff2 create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300italic-1b8d46dae0a077f999ae901c213dcbd2.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-300italic-93511dbad22ceb584f036ab660a563ba.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700-936869ba46988c2387481468c25686bc.woff2 create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700-d85b43c39f4620dfa5b47b16e842c8a9.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700-e57caf7ea634a258a9b2e06137755ec6.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700italic-0a6791447401e0ebd70d98b0e4ecc5ff.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700italic-5a8f743549cc6cef9a001f0c21d55e5b.woff2 create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-700italic-da78bf0b1b435f40ca198525361d3b84.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-italic-087069a9f454e2581ed6a7a84b142327.woff2 create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-italic-4863add4d566a55b6a971780f0328e05.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-italic-756750acefdb77704c08c235510f6e4c.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-regular-215adb34128fcb20668b963ec7926ef2.ttf create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-regular-a3246d29b40a8b0da142caea1bc84974.woff create mode 100644 803-0bf34ac/static/roboto-mono-v5-latin-regular-f1dc10a756c2c544588b7408095ffed7.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-bold-webfont-4a1efbe82eaa84ff89ed34a0bd374991.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-bold-webfont-9a76932911f04be25044af15855ffeb2.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-bold-webfont-e7e051e1bc64fa89931760a52d0c8bd3.woff create mode 100644 803-0bf34ac/static/sourcesanspro-bolditalic-webfont-73021f1aabd43f50e16a6a0771c45689.woff create mode 100644 803-0bf34ac/static/sourcesanspro-bolditalic-webfont-af3dd40e0ac8e2ca50ac3943d5d7014d.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-bolditalic-webfont-ef69f0d737406260319a2c5ec73da3a8.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-italic-webfont-0aaeabbaba38453310786c387d4a052a.woff create mode 100644 803-0bf34ac/static/sourcesanspro-italic-webfont-3efee318468995ac04affb6a907a6b03.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-italic-webfont-c6c9fd228e87eefaf1d4e4d8f439760b.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-light-webfont-70e7d719e258c9a7e68b19236a49bcc4.woff create mode 100644 803-0bf34ac/static/sourcesanspro-light-webfont-d6f73cf7210d3b5c2fa95f00e38396a2.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-light-webfont-e5f1a42e1c2b97e2587641dea75c548f.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-lightitalic-webfont-43ea3d39e6aa59fb6f1b4f974dfdc76b.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-lightitalic-webfont-455d120362f79aa219d465e39fc66e82.woff create mode 100644 803-0bf34ac/static/sourcesanspro-lightitalic-webfont-9c5bf2190b2471c2f22b96bb92249ecb.woff2 create mode 100644 803-0bf34ac/static/sourcesanspro-regular-webfont-5acfe0d0f69444765ba489e2091c95cc.ttf create mode 100644 803-0bf34ac/static/sourcesanspro-regular-webfont-c4e25ab10baa365dfc6620c04ea9202b.woff create mode 100644 803-0bf34ac/static/sourcesanspro-regular-webfont-e7bccfa631a0017f31da9e0c2fd2627b.woff2 create mode 100644 803-0bf34ac/styles.9187ea998b678a8804ed.css create mode 100644 803-0bf34ac/webpack-runtime-937ffcec7d8c5573b409.js create mode 100644 803-0bf34ac/webpack.stats.json diff --git a/803-0bf34ac/40194750-d595f8dc70f5f93f5ee1.js b/803-0bf34ac/40194750-d595f8dc70f5f93f5ee1.js new file mode 100644 index 00000000..25b1578d --- /dev/null +++ b/803-0bf34ac/40194750-d595f8dc70f5f93f5ee1.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[30],{2593:function(module,__unused_webpack_exports,__webpack_require__){eval('!function (e, t) {\n true ? module.exports = t(__webpack_require__(7294)) : 0;\n}(this, function (e) {\n return function (e) {\n var t = {};\n\n function r(a) {\n if (t[a]) return t[a].exports;\n var n = t[a] = {\n i: a,\n l: !1,\n exports: {}\n };\n return e[a].call(n.exports, n, n.exports, r), n.l = !0, n.exports;\n }\n\n return r.m = e, r.c = t, r.d = function (e, t, a) {\n r.o(e, t) || Object.defineProperty(e, t, {\n enumerable: !0,\n get: a\n });\n }, r.r = function (e) {\n "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: "Module"\n }), Object.defineProperty(e, "__esModule", {\n value: !0\n });\n }, r.t = function (e, t) {\n if (1 & t && (e = r(e)), 8 & t) return e;\n if (4 & t && "object" == typeof e && e && e.__esModule) return e;\n var a = Object.create(null);\n if (r.r(a), Object.defineProperty(a, "default", {\n enumerable: !0,\n value: e\n }), 2 & t && "string" != typeof e) for (var n in e) {\n r.d(a, n, function (t) {\n return e[t];\n }.bind(null, n));\n }\n return a;\n }, r.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return r.d(t, "a", t), t;\n }, r.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, r.p = "", r(r.s = 19);\n }([function (t, r) {\n t.exports = e;\n }, function (e, t, r) {\n var a;\n /*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n */\n\n !function () {\n "use strict";\n\n var r = {}.hasOwnProperty;\n\n function n() {\n for (var e = [], t = 0; t < arguments.length; t++) {\n var a = arguments[t];\n\n if (a) {\n var o = typeof a;\n if ("string" === o || "number" === o) e.push(a);else if (Array.isArray(a)) {\n if (a.length) {\n var i = n.apply(null, a);\n i && e.push(i);\n }\n } else if ("object" === o) if (a.toString === Object.prototype.toString) for (var l in a) {\n r.call(a, l) && a[l] && e.push(l);\n } else e.push(a.toString());\n }\n }\n\n return e.join(" ");\n }\n\n e.exports ? (n.default = n, e.exports = n) : void 0 === (a = function () {\n return n;\n }.apply(t, [])) || (e.exports = a);\n }();\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.deprecationWarning = void 0;\n\n var a = function a() {};\n\n t.deprecationWarning = a;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isIosDevice = t.handleTabKey = t.listToTable = t.isDateInvalid = t.formatDate = t.parseDateString = t.isDatesYearOutsideMinOrMax = t.isDatesMonthOutsideMinOrMax = t.isDateWithinMinAndMax = t.keepDateBetweenMinAndMax = t.isSameDay = t.isSameMonth = t.isSameYear = t.max = t.min = t.setYear = t.setMonth = t.subYears = t.addYears = t.subMonths = t.addMonths = t.endOfWeek = t.startOfWeek = t.subWeeks = t.addWeeks = t.subDays = t.addDays = t.lastDayOfMonth = t.startOfMonth = t.today = t.setDate = t.keepDateWithinMonth = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n },\n o = r(6);\n\n var i = function i(e, t) {\n return t !== e.getMonth() && e.setDate(0), e;\n };\n\n t.keepDateWithinMonth = i;\n\n var l = function l(e, t, r) {\n var a = new Date(0);\n return a.setFullYear(e, t, r), a;\n };\n\n t.setDate = l;\n\n var u = function u() {\n var e = new Date(),\n t = e.getDate(),\n r = e.getMonth(),\n a = e.getFullYear();\n return l(a, r, t);\n };\n\n t.today = u;\n\n var c = function c(e) {\n var t = new Date(0);\n return t.setFullYear(e.getFullYear(), e.getMonth(), 1), t;\n };\n\n t.startOfMonth = c;\n\n var s = function s(e) {\n var t = new Date(0);\n return t.setFullYear(e.getFullYear(), e.getMonth() + 1, 0), t;\n };\n\n t.lastDayOfMonth = s;\n\n var d = function d(e, t) {\n var r = new Date(e.getTime());\n return r.setDate(r.getDate() + t), r;\n };\n\n t.addDays = d;\n\n var f = function f(e, t) {\n return d(e, -t);\n };\n\n t.subDays = f;\n\n var p = function p(e, t) {\n return d(e, 7 * t);\n };\n\n t.addWeeks = p;\n\n t.subWeeks = function (e, t) {\n return p(e, -t);\n };\n\n t.startOfWeek = function (e) {\n var t = e.getDay();\n return f(e, t);\n };\n\n t.endOfWeek = function (e) {\n var t = e.getDay();\n return d(e, 6 - t);\n };\n\n var m = function m(e, t) {\n var r = new Date(e.getTime()),\n a = (r.getMonth() + 12 + t) % 12;\n return r.setMonth(r.getMonth() + t), i(r, a), r;\n };\n\n t.addMonths = m;\n\n t.subMonths = function (e, t) {\n return m(e, -t);\n };\n\n var y = function y(e, t) {\n return m(e, 12 * t);\n };\n\n t.addYears = y;\n\n t.subYears = function (e, t) {\n return y(e, -t);\n };\n\n var b = function b(e, t) {\n var r = new Date(e.getTime());\n return r.setMonth(t), i(r, t), r;\n };\n\n t.setMonth = b;\n\n t.setYear = function (e, t) {\n var r = new Date(e.getTime()),\n a = r.getMonth();\n return r.setFullYear(t), i(r, a), r;\n };\n\n t.min = function (e, t) {\n var r = e;\n return t < e && (r = t), new Date(r.getTime());\n };\n\n t.max = function (e, t) {\n var r = e;\n return t > e && (r = t), new Date(r.getTime());\n };\n\n var v = function v(e, t) {\n return e && t && e.getFullYear() === t.getFullYear();\n };\n\n t.isSameYear = v;\n\n var O = function O(e, t) {\n return v(e, t) && e.getMonth() === t.getMonth();\n };\n\n t.isSameMonth = O;\n\n t.isSameDay = function (e, t) {\n return O(e, t) && e.getDate() === t.getDate();\n };\n\n t.keepDateBetweenMinAndMax = function (e, t, r) {\n var a = e;\n return e < t ? a = t : r && e > r && (a = r), new Date(a.getTime());\n };\n\n var g = function g(e, t, r) {\n return e >= t && (!r || e <= r);\n };\n\n t.isDateWithinMinAndMax = g;\n\n t.isDatesMonthOutsideMinOrMax = function (e, t, r) {\n return s(e) < t || !!r && c(e) > r;\n };\n\n t.isDatesYearOutsideMinOrMax = function (e, t, r) {\n return s(b(e, 11)) < t || !!r && c(b(e, 0)) > r;\n };\n\n t.parseDateString = function (e, t, r) {\n var a, n, i, c, s, d, f;\n\n if (void 0 === t && (t = o.INTERNAL_DATE_FORMAT), void 0 === r && (r = !1), e) {\n var p = void 0,\n m = void 0,\n y = void 0;\n\n if (t === o.DEFAULT_EXTERNAL_DATE_FORMAT ? (p = (a = e.split("/"))[0], m = a[1], y = a[2]) : (y = (n = e.split("-"))[0], p = n[1], m = n[2]), y && (f = parseInt(y, 10), !Number.isNaN(f) && (d = f, r && (d = Math.max(0, d), y.length < 3)))) {\n var b = u().getFullYear();\n d = b - b % Math.pow(10, y.length) + f;\n }\n\n if (p && (f = parseInt(p, 10), Number.isNaN(f) || (c = f, r && (c = Math.max(1, c), c = Math.min(12, c)))), c && m && null != d && (f = parseInt(m, 10), !Number.isNaN(f) && (s = f, r))) {\n var v = l(d, c, 0).getDate();\n s = Math.max(1, s), s = Math.min(v, s);\n }\n\n c && s && null != d && (i = l(d, c - 1, s));\n }\n\n return i;\n };\n\n t.formatDate = function (e, t) {\n void 0 === t && (t = o.INTERNAL_DATE_FORMAT);\n\n var r = function r(e, t) {\n return ("0000" + e).slice(-t);\n },\n a = e.getMonth() + 1,\n n = e.getDate(),\n i = e.getFullYear();\n\n return t === o.DEFAULT_EXTERNAL_DATE_FORMAT ? [r(a, 2), r(n, 2), r(i, 4)].join("/") : [r(i, 4), r(a, 2), r(n, 2)].join("-");\n };\n\n t.isDateInvalid = function (e, t, r) {\n var a = !1;\n\n if (e) {\n a = !0;\n var n = e.split("/"),\n o = n.map(function (e) {\n var t,\n r = parseInt(e, 10);\n return Number.isNaN(r) || (t = r), t;\n }),\n i = o[0],\n u = o[1],\n c = o[2];\n\n if (i && u && null != c) {\n var s = l(c, i - 1, u);\n s.getMonth() === i - 1 && s.getDate() === u && s.getFullYear() === c && 4 === n[2].length && g(s, t, r) && (a = !1);\n }\n }\n\n return a;\n };\n\n t.listToTable = function (e, t) {\n for (var r = [], a = 0; a < e.length;) {\n for (var o = []; a < e.length && o.length < t;) {\n o.push(e[parseInt("" + a)]), a += 1;\n }\n\n r.push(o);\n }\n\n return n.default.createElement(n.default.Fragment, null, r.map(function (e, t) {\n return n.default.createElement("tr", {\n key: "row_" + t\n }, e.map(function (e, r) {\n return n.default.createElement("td", {\n key: "row_" + t + "_cell_" + r\n }, e);\n }));\n }));\n };\n\n t.handleTabKey = function (e, t) {\n if ("Tab" === e.key) {\n var r = t.filter(function (e) {\n return e && !e.disabled;\n }),\n a = null === document || void 0 === document ? void 0 : document.activeElement,\n n = r.length - 1,\n o = r[parseInt("0")],\n i = r[parseInt("" + n)],\n l = a instanceof HTMLButtonElement ? r.indexOf(a) : -1,\n u = l === n,\n c = 0 === l,\n s = -1 === l;\n e.shiftKey ? (c || s) && (e.preventDefault(), null == i || i.focus()) : (u || s) && (e.preventDefault(), null == o || o.focus());\n }\n };\n\n t.isIosDevice = function () {\n return "undefined" != typeof navigator && (navigator.userAgent.match(/(iPod|iPhone|iPad)/g) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1) && !window.MSStream;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavList = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l = function l() {\n return (_l = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavList = function (e) {\n var t = e.items,\n r = e.type,\n i = e.primary,\n c = e.secondary,\n s = e.subnav,\n d = e.megamenu,\n f = e.footerSecondary,\n p = e.className,\n m = u(e, ["items", "type", "primary", "secondary", "subnav", "megamenu", "footerSecondary", "className"]);\n i && (0, o.deprecationWarning)("NavList property primary is deprecated. Use type"), c && (0, o.deprecationWarning)("NavList property secondary is deprecated. Use type"), s && (0, o.deprecationWarning)("NavList property subnav is deprecated. Use type"), d && (0, o.deprecationWarning)("NavList property megamenu is deprecated. Use type"), f && (0, o.deprecationWarning)("NavList property footerSecondary is deprecated. Use type");\n\n var y = r ? "primary" === r : i,\n b = r ? "secondary" === r : c,\n v = r ? "subnav" === r : s,\n O = r ? "megamenu" === r : d,\n g = r ? "footerSecondary" === r : f,\n _ = (0, n.default)({\n "usa-nav__primary usa-accordion": y,\n "usa-nav__secondary-links": b,\n "usa-nav__submenu": v,\n "usa-nav__submenu-list": O,\n "usa-list usa-list--unstyled": g\n }, p),\n h = (0, n.default)({\n "usa-nav__primary-item": y,\n "usa-nav__secondary-item": b,\n "usa-nav__submenu-item": v || O,\n "usa-footer__secondary-link": g\n });\n\n return a.default.createElement("ul", _l({\n className: _\n }, m), t.map(function (e, t) {\n return a.default.createElement("li", {\n key: "item_" + t,\n className: h\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Label = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i = function i() {\n return (_i = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.htmlFor,\n o = e.className,\n u = e.error,\n c = e.hint,\n s = e.srOnly,\n d = l(e, ["children", "htmlFor", "className", "error", "hint", "srOnly"]),\n f = (0, n.default)({\n "usa-label": !s,\n "usa-sr-only": s,\n "usa-label--error": u\n }, o);\n return a.default.createElement("label", _i({}, d, {\n "data-testid": "label",\n className: f,\n htmlFor: r\n }), t, c && a.default.createElement("span", {\n className: "usa-hint"\n }, c));\n };\n\n t.Label = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.INTERNAL_DATE_FORMAT = t.DEFAULT_EXTERNAL_DATE_FORMAT = t.DEFAULT_MIN_DATE = t.YEAR_CHUNK = t.ENTER_KEYCODE = t.DAY_OF_WEEK_SHORT_LABELS = t.DAY_OF_WEEK_LABELS = t.MONTH_LABELS = t.VALIDATION_MESSAGE = void 0;\n t.VALIDATION_MESSAGE = "Please enter a valid date";\n t.MONTH_LABELS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];\n t.DAY_OF_WEEK_LABELS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\n t.DAY_OF_WEEK_SHORT_LABELS = ["S", "M", "T", "W", "Th", "F", "S"];\n t.ENTER_KEYCODE = 13;\n t.YEAR_CHUNK = 12;\n t.DEFAULT_MIN_DATE = "0000-01-01";\n t.DEFAULT_EXTERNAL_DATE_FORMAT = "MM/DD/YYYY";\n t.INTERNAL_DATE_FORMAT = "YYYY-MM-DD";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.TextInput = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l2 = function l() {\n return (_l2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.id,\n r = e.name,\n i = e.type,\n c = e.className,\n s = e.validationStatus,\n d = e.error,\n f = e.success,\n p = e.inputSize,\n m = e.small,\n y = e.medium,\n b = e.inputRef,\n v = u(e, ["id", "name", "type", "className", "validationStatus", "error", "success", "inputSize", "small", "medium", "inputRef"]);\n d && (0, o.deprecationWarning)("TextInput property error is deprecated. Use validationStatus"), f && (0, o.deprecationWarning)("TextInput property success is deprecated. Use validationStatus"), m && (0, o.deprecationWarning)("TextInput property small is deprecated. Use inputSize"), y && (0, o.deprecationWarning)("TextInput property medium is deprecated. Use inputSize");\n\n var O = s ? "error" === s : d,\n g = s ? "success" === s : f,\n _ = p ? "small" === p : m,\n h = p ? "medium" === p : y,\n j = (0, n.default)("usa-input", {\n "usa-input--error": O,\n "usa-input--success": g,\n "usa-input--small": _,\n "usa-input--medium": h\n }, c);\n\n return a.default.createElement("input", _l2({\n "data-testid": "textInput",\n className: j,\n id: t,\n name: r,\n type: i,\n ref: b\n }, v));\n };\n\n t.TextInput = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FormGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.FormGroup = function (e) {\n var t = e.children,\n r = e.className,\n o = e.error,\n i = (0, n.default)("usa-form-group", {\n "usa-form-group--error": o\n }, r);\n return a.default.createElement("div", {\n "data-testid": "formGroup",\n className: i\n }, t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.sampleLocalization = t.EN_US = void 0;\n var a = r(6),\n n = {\n months: a.MONTH_LABELS,\n daysOfWeek: a.DAY_OF_WEEK_LABELS,\n daysOfWeekShort: a.DAY_OF_WEEK_SHORT_LABELS,\n statuses: ["You can navigate by day using left and right arrows", "Weeks by using up and down arrows", "Months by using page up and page down keys", "Years by using shift plus page up and shift plus page down", "Home and end keys navigate to the beginning and end of a week"],\n selectedDate: "Selected date",\n selectAMonth: "Select a month.",\n toggleCalendar: "Toggle calendar",\n backOneYear: "Navigate back one year",\n backOneMonth: "Navigate back one month",\n forwardOneYear: "Navigate forward one year",\n forwardOneMonth: "Navigate forward one month",\n clickToSelectMonth: "Click to select month",\n clickToSelectYear: "Click to select year"\n };\n t.EN_US = n;\n t.sampleLocalization = {\n months: ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],\n daysOfWeek: ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"],\n daysOfWeekShort: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],\n statuses: ["Puede navegar por día usando las flechas izquierda y derecha", "Semanas usando flechas hacia arriba y hacia abajo", "Meses usando las teclas de avance y retroceso de página", "Años usando shift plus page up y shift plus page down", "Las teclas de inicio y finalización navegan hasta el principio y el final de una semana"],\n selectedDate: "Fecha seleccionada",\n selectAMonth: "Selecciona un mes.",\n toggleCalendar: "Alternar calendario",\n backOneYear: "Navegar hacia atrás un año",\n backOneMonth: "Navegar hacia atrás un mes",\n forwardOneYear: "Navegar hacia adelante un año",\n forwardOneMonth: "Navegar hacia adelante un mes",\n clickToSelectMonth: "Haga clic para seleccionar el mes",\n clickToSelectYear: "Haga clic para seleccionar el año"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = u, t.Link = function (e) {\n if (u(e)) {\n var t = e.variant,\n r = e.className,\n n = e.asCustom,\n o = e.children,\n s = l(e, ["variant", "className", "asCustom", "children"]),\n d = c(t, r);\n return a.default.createElement(n, _i2({\n className: d\n }, s), o);\n }\n\n o = e.children, r = e.className, t = e.variant, s = l(e, ["children", "className", "variant"]), d = c(t, r);\n return a.default.createElement("a", _i2({\n className: d\n }, s), o);\n };\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i2 = function i() {\n return (_i2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function u(e) {\n return "asCustom" in e;\n }\n\n function c(e, t) {\n var r = "external" === e,\n a = "nav" === e;\n return "unstyled" === e ? t : (0, n.default)("usa-link", {\n "usa-link--external": r,\n "usa-nav__link": a\n }, t);\n }\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ComboBox = t.FocusMode = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(49);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n var u,\n c,\n _s = function s() {\n return (_s = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n d = function d(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n !function (e) {\n e[e.Previous = -1] = "Previous", e[e.Next = 1] = "Next";\n }(u || (u = {})), t.FocusMode = c, function (e) {\n e[e.None = 0] = "None", e[e.Input = 1] = "Input", e[e.Item = 2] = "Item";\n }(c || (t.FocusMode = c = {}));\n\n var f = function f(e) {\n var t = e.focused,\n r = d(e, ["focused"]),\n a = (0, n.useRef)(null);\n return (0, n.useEffect)(function () {\n t && a.current && a.current.focus();\n }), n.default.createElement("input", _s({\n type: "text",\n className: "usa-combo-box__input",\n "data-testid": "combo-box-input"\n }, r, {\n autoCapitalize: "off",\n autoComplete: "off",\n ref: a\n }));\n },\n p = (0, n.forwardRef)(function (e, t) {\n var r,\n a,\n l = e.id,\n d = e.name,\n p = e.className,\n m = e.options,\n y = e.defaultValue,\n b = e.disabled,\n v = e.onChange,\n O = e.assistiveHint,\n g = e.noResults,\n _ = e.selectProps,\n h = e.inputProps,\n j = e.ulProps,\n M = e.customFilter,\n N = e.disableFiltering,\n E = void 0 !== N && N,\n P = !!b;\n y && (a = m.find(function (e) {\n return e.value === y;\n }));\n var w = M || {\n filter: ".*{{query}}.*"\n },\n I = {\n isOpen: !1,\n selectedOption: a || void 0,\n focusedOption: void 0,\n focusMode: c.None,\n filteredOptions: m,\n inputValue: a ? a.label : ""\n },\n D = (0, i.useComboBox)(I, m, E, w),\n S = D[0],\n x = D[1],\n k = (0, n.useRef)(null),\n A = (0, n.useRef)(null);\n (0, n.useEffect)(function () {\n var e;\n v && v((null === (e = S.selectedOption) || void 0 === e ? void 0 : e.value) || void 0);\n }, [S.selectedOption]), (0, n.useEffect)(function () {\n S.focusMode === c.Item && S.focusedOption && A.current && A.current.focus();\n }, [S.focusMode, S.focusedOption]), (0, n.useEffect)(function () {\n S.isOpen && S.focusedOption && A.current && S.focusMode === c.Input && A.current.scrollIntoView(!1);\n }, [S.isOpen, S.focusedOption]), (0, n.useEffect)(function () {\n var e;\n S.focusMode !== c.None && ((null === (e = k.current) || void 0 === e ? void 0 : e.contains(window.document.activeElement)) || x({\n type: i.ActionTypes.BLUR\n }));\n }, [S.focusMode]), (0, n.useImperativeHandle)(t, function () {\n return {\n clearSelection: function clearSelection() {\n return x({\n type: i.ActionTypes.CLEAR_SELECTION\n });\n }\n };\n }, []);\n\n var T = function T(e, t, r) {\n var a = t.focusedOption ? t.filteredOptions.indexOf(t.focusedOption) : -1,\n n = t.filteredOptions[0],\n o = t.filteredOptions[t.filteredOptions.length - 1];\n if (-1 === a) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: n\n });else {\n var l = a + r;\n if (l < 0 && t.selectedOption) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: n\n });else if (l < 0) e({\n type: i.ActionTypes.CLOSE_LIST\n });else if (l >= t.filteredOptions.length) e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: o\n });else {\n var u = t.filteredOptions[l];\n e({\n type: i.ActionTypes.FOCUS_OPTION,\n option: u\n });\n }\n }\n },\n L = function L(e) {\n var t,\n r = e.relatedTarget;\n (!r || r instanceof Node && !(null === (t = k.current) || void 0 === t ? void 0 : t.contains(r))) && x({\n type: i.ActionTypes.BLUR\n });\n },\n C = function C(e) {\n "Escape" === e.key ? x({\n type: i.ActionTypes.CLOSE_LIST\n }) : "Tab" === e.key || "Enter" === e.key ? (e.preventDefault(), S.focusedOption && x({\n type: i.ActionTypes.SELECT_OPTION,\n option: S.focusedOption\n })) : "ArrowDown" === e.key || "Down" === e.key ? (e.preventDefault(), T(x, S, u.Next)) : "ArrowUp" !== e.key && "Up" !== e.key || (e.preventDefault(), T(x, S, u.Previous));\n },\n F = S.selectedOption && S.selectedOption.label === S.inputValue,\n R = (0, o.default)("usa-combo-box", p, {\n "usa-combo-box--pristine": F\n }),\n U = "combobox-" + d + "-list",\n B = "combobox-" + d + "-assistive-hint";\n\n return n.default.createElement("div", {\n "data-testid": "combo-box",\n className: R,\n id: l,\n ref: k\n }, n.default.createElement("select", _s({\n className: "usa-select usa-sr-only usa-combo-box__select",\n name: d,\n "aria-hidden": !0,\n tabIndex: -1,\n defaultValue: null === (r = S.selectedOption) || void 0 === r ? void 0 : r.value,\n "data-testid": "combo-box-select",\n disabled: P\n }, _), m.map(function (e) {\n return n.default.createElement("option", {\n key: e.value,\n value: e.value\n }, e.label);\n })), n.default.createElement(f, _s({\n onChange: function onChange(e) {\n return x({\n type: i.ActionTypes.UPDATE_FILTER,\n value: e.target.value\n });\n },\n onClick: function onClick() {\n return x({\n type: i.ActionTypes.OPEN_LIST\n });\n },\n onBlur: function onBlur(e) {\n var t,\n r = e.relatedTarget;\n (!r || r instanceof Node && !(null === (t = k.current) || void 0 === t ? void 0 : t.contains(r))) && S.focusMode !== c.None && x({\n type: i.ActionTypes.BLUR\n });\n },\n onKeyDown: function onKeyDown(e) {\n if ("Escape" === e.key) x({\n type: i.ActionTypes.CLOSE_LIST\n });else if ("ArrowDown" === e.key || "Down" == e.key) e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: S.selectedOption || S.focusedOption || S.filteredOptions[0]\n });else if ("Tab" === e.key) {\n if (S.isOpen && !S.selectedOption) {\n var t = E ? S.focusedOption : S.selectedOption || S.focusedOption;\n t ? (e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: t\n })) : x({\n type: i.ActionTypes.BLUR\n });\n }\n\n !S.isOpen && S.selectedOption && x({\n type: i.ActionTypes.BLUR\n });\n } else if ("Enter" === e.key && S.isOpen) {\n e.preventDefault();\n var r = S.filteredOptions.find(function (e) {\n return e.label.toLowerCase() === S.inputValue.toLowerCase();\n });\n r ? x({\n type: i.ActionTypes.SELECT_OPTION,\n option: r\n }) : S.selectedOption ? x({\n type: i.ActionTypes.CLOSE_LIST\n }) : x({\n type: i.ActionTypes.CLEAR\n });\n }\n },\n value: S.inputValue,\n focused: S.focusMode === c.Input,\n role: "combobox",\n "aria-owns": U,\n "aria-describedby": B,\n "aria-expanded": S.isOpen,\n disabled: P\n }, h)), n.default.createElement("span", {\n className: "usa-combo-box__clear-input__wrapper",\n tabIndex: -1\n }, n.default.createElement("button", {\n type: "button",\n className: "usa-combo-box__clear-input",\n "aria-label": "Clear the select contents",\n onClick: function onClick() {\n return x({\n type: i.ActionTypes.CLEAR\n });\n },\n "data-testid": "combo-box-clear-button",\n onKeyDown: function onKeyDown(e) {\n "Tab" === e.key && S.isOpen && S.selectedOption && (e.preventDefault(), x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: S.selectedOption\n }));\n },\n hidden: !F\n }, " ")), n.default.createElement("span", {\n className: "usa-combo-box__input-button-separator"\n }, " "), n.default.createElement("span", {\n className: "usa-combo-box__toggle-list__wrapper",\n tabIndex: -1\n }, n.default.createElement("button", {\n "data-testid": "combo-box-toggle",\n type: "button",\n className: "usa-combo-box__toggle-list",\n tabIndex: -1,\n "aria-label": "Toggle the dropdown list",\n onClick: function onClick() {\n return x({\n type: S.isOpen ? i.ActionTypes.CLOSE_LIST : i.ActionTypes.OPEN_LIST\n });\n },\n disabled: P\n }, " ")), n.default.createElement("ul", _s({\n "data-testid": "combo-box-option-list",\n tabIndex: -1,\n id: U,\n className: "usa-combo-box__list",\n role: "listbox",\n hidden: !S.isOpen\n }, j), S.filteredOptions.map(function (e, t) {\n var r = e === S.focusedOption,\n a = e === S.selectedOption,\n l = (0, o.default)("usa-combo-box__list-option", {\n "usa-combo-box__list-option--focused": r,\n "usa-combo-box__list-option--selected": a\n });\n return n.default.createElement("li", {\n ref: r ? A : null,\n value: e.value,\n key: e.value,\n className: l,\n tabIndex: r ? 0 : -1,\n role: "option",\n "aria-selected": a,\n "aria-setsize": 64,\n "aria-posinset": t + 1,\n id: U + "--option-" + t,\n onKeyDown: C,\n onBlur: L,\n "data-testid": "combo-box-option-" + e.value,\n onMouseEnter: function onMouseEnter() {\n return x({\n type: i.ActionTypes.FOCUS_OPTION,\n option: e\n });\n },\n onClick: function onClick() {\n x({\n type: i.ActionTypes.SELECT_OPTION,\n option: e\n });\n }\n }, e.label);\n }), 0 === S.filteredOptions.length ? n.default.createElement("li", {\n className: "usa-combo-box__list-option--no-results"\n }, g || "No results found") : null), n.default.createElement("div", {\n className: "usa-combo-box__status usa-sr-only",\n role: "status"\n }), n.default.createElement("span", {\n id: B,\n className: "usa-sr-only",\n "data-testid": "combo-box-assistive-hint"\n }, O || "When autocomplete results are available use up and down arrows to review\\n and enter to select. Touch device users, explore by touch or with swipe\\n gestures."));\n });\n\n t.ComboBox = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.DatePicker = t.FocusMode = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(6),\n l = r(9),\n u = r(3),\n c = r(53);\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var d,\n _f = function f() {\n return (_f = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n p = function p(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.FocusMode = d, function (e) {\n e[e.None = 0] = "None", e[e.Input = 1] = "Input";\n }(d || (t.FocusMode = d = {}));\n\n var m = function m(e) {\n var t = e.id,\n r = e.name,\n a = e.className,\n s = e.defaultValue,\n m = e.disabled,\n y = e.required,\n b = e.minDate,\n v = void 0 === b ? i.DEFAULT_MIN_DATE : b,\n O = e.maxDate,\n g = e.rangeDate,\n _ = e.onChange,\n h = e.onBlur,\n j = e.i18n,\n M = void 0 === j ? l.EN_US : j,\n N = p(e, ["id", "name", "className", "defaultValue", "disabled", "required", "minDate", "maxDate", "rangeDate", "onChange", "onBlur", "i18n"]),\n E = (0, n.useRef)(null),\n P = (0, n.useRef)(null),\n w = (0, n.useState)(""),\n I = w[0],\n D = w[1],\n S = (0, n.useState)(""),\n x = S[0],\n k = S[1],\n A = (0, n.useState)(!1),\n T = A[0],\n L = A[1],\n C = (0, n.useState)(void 0),\n F = C[0],\n R = C[1],\n U = (0, n.useState)(0),\n B = U[0],\n W = U[1],\n z = (0, n.useState)([]),\n Y = z[0],\n V = z[1],\n G = (0, n.useState)(d.None),\n H = G[0],\n Q = G[1],\n K = (0, n.useState)(void 0),\n Z = K[0],\n X = K[1],\n J = (0, u.parseDateString)(v),\n q = O ? (0, u.parseDateString)(O) : void 0,\n $ = g ? (0, u.parseDateString)(g) : void 0,\n ee = function ee(e, t) {\n var r;\n void 0 === t && (t = !0);\n var a = (0, u.parseDateString)(e),\n n = a && (0, u.formatDate)(a, i.DEFAULT_EXTERNAL_DATE_FORMAT);\n a && D(e), n && k(n), _ && _(n), t && (L(!1), V([]), null === (r = null == P ? void 0 : P.current) || void 0 === r || r.focus());\n };\n\n (0, n.useEffect)(function () {\n s && ee(s, !1);\n }, []), (0, n.useEffect)(function () {\n if (T) {\n var e = E.current && E.current.querySelector(".usa-date-picker__calendar__date--focused");\n e && e.focus();\n }\n }, [T]), (0, n.useEffect)(function () {\n !function () {\n var e,\n t,\n r,\n a,\n n = (0, u.isDateInvalid)(x, J, q);\n n && !(null === (e = null == P ? void 0 : P.current) || void 0 === e ? void 0 : e.validationMessage) && (null === (t = null == P ? void 0 : P.current) || void 0 === t || t.setCustomValidity(i.VALIDATION_MESSAGE)), n || (null === (r = null == P ? void 0 : P.current) || void 0 === r ? void 0 : r.validationMessage) !== i.VALIDATION_MESSAGE || null === (a = null == P ? void 0 : P.current) || void 0 === a || a.setCustomValidity("");\n }();\n }, [x, v, O]);\n var te = (0, o.default)("usa-date-picker", "usa-date-picker--initialized", {\n "usa-date-picker--active": T\n }, a),\n re = M.toggleCalendar;\n return n.default.createElement("div", {\n "data-testid": "date-picker",\n className: te,\n ref: E,\n onBlur: function onBlur(e) {\n var t;\n (null === (t = E.current) || void 0 === t ? void 0 : t.contains(null == e ? void 0 : e.relatedTarget)) || (T && (L(!1), V([])), h && h(e));\n },\n onKeyDown: function onKeyDown(e) {\n var t;\n "Escape" === e.key && (T && (L(!1), V([]), null === (t = null == P ? void 0 : P.current) || void 0 === t || t.focus()), e.preventDefault());\n }\n }, n.default.createElement("input", _f({}, N, {\n name: r,\n "data-testid": "date-picker-internal-input",\n className: "usa-input usa-sr-only usa-date-picker__internal-input",\n type: "text",\n "aria-hidden": !0,\n tabIndex: -1,\n required: !1,\n disabled: !1,\n value: I,\n readOnly: !0\n })), n.default.createElement("div", {\n className: "usa-date-picker__wrapper",\n tabIndex: -1\n }, n.default.createElement("input", _f({}, N, {\n id: t,\n "data-testid": "date-picker-external-input",\n className: "usa-input usa-date-picker__external-input",\n type: "text",\n disabled: m,\n required: y,\n value: x,\n ref: P,\n onInput: function onInput(e) {\n var t = e.target.value;\n k(t), _ && _(t);\n var r = (0, u.parseDateString)(t, i.DEFAULT_EXTERNAL_DATE_FORMAT, !0),\n a = "";\n\n if (r && !(0, u.isDateInvalid)(t, J, q) && (a = (0, u.formatDate)(r)), I !== a && D(a), r && T) {\n var n = (0, u.keepDateBetweenMinAndMax)(r, J, q);\n R(n);\n }\n },\n onFocus: function onFocus() {\n Q(d.Input);\n },\n onBlur: function onBlur(e) {\n Q(d.None), h && h(e);\n }\n })), n.default.createElement("button", {\n "data-testid": "date-picker-button",\n type: "button",\n className: "usa-date-picker__button",\n "aria-haspopup": !0,\n "aria-label": re,\n disabled: m,\n onClick: function onClick() {\n var e;\n if (T) V([]);else {\n var t = (0, u.parseDateString)(x, i.DEFAULT_EXTERNAL_DATE_FORMAT, !0),\n r = (0, u.keepDateBetweenMinAndMax)(t || s && (0, u.parseDateString)(s) || (0, u.today)(), J, q);\n R(r), W(null === (e = null == E ? void 0 : E.current) || void 0 === e ? void 0 : e.offsetHeight);\n var a = M.statuses,\n n = (0, u.parseDateString)(I);\n\n if (n && (0, u.isSameDay)(n, (0, u.addDays)(r, 0))) {\n var o = M.selectedDate;\n a.unshift(o);\n }\n\n V(a);\n }\n L(!T);\n }\n }, " "), n.default.createElement("div", {\n "data-testid": "date-picker-calendar",\n className: "usa-date-picker__calendar",\n role: "dialog",\n "aria-modal": "true",\n hidden: !T,\n "data-value": F && (0, u.formatDate)(F),\n style: {\n top: B + "px"\n },\n onKeyDown: function onKeyDown(e) {\n X(e.keyCode);\n },\n onKeyUp: function onKeyUp(e) {\n e.keyCode !== Z && e.preventDefault();\n }\n }, T && n.default.createElement(c.Calendar, {\n date: F,\n handleSelectDate: ee,\n minDate: J,\n maxDate: q,\n rangeDate: $,\n selectedDate: (0, u.parseDateString)(I),\n setStatuses: V,\n focusMode: H,\n i18n: M\n })), n.default.createElement("div", {\n "data-testid": "date-picker-status",\n className: "usa-sr-only usa-date-picker__status",\n role: "status",\n "aria-live": "polite"\n }, Y.join(". "))));\n };\n\n t.DatePicker = m, m.displayName = "DatePicker", m.defaultProps = {\n minDate: i.DEFAULT_MIN_DATE\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavCloseButton = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(72));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l3 = function l() {\n return (_l3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavCloseButton = function (e) {\n var t = e.onClick,\n r = e.className,\n i = u(e, ["onClick", "className"]),\n c = (0, n.default)("usa-nav__close", r);\n return a.default.createElement("button", _l3({\n className: c,\n onClick: t,\n "data-testid": "navCloseButton"\n }, i, {\n type: "button"\n }), a.default.createElement("img", {\n src: o.default,\n alt: "close"\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Button = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l4 = function l() {\n return (_l4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.type,\n r = e.children,\n i = e.secondary,\n c = e.base,\n s = e.accent,\n d = e.accentStyle,\n f = e.outline,\n p = e.inverse,\n m = e.size,\n y = e.big,\n b = e.small,\n v = e.icon,\n O = e.unstyled,\n g = e.onClick,\n _ = e.className,\n h = u(e, ["type", "children", "secondary", "base", "accent", "accentStyle", "outline", "inverse", "size", "big", "small", "icon", "unstyled", "onClick", "className"]);\n y && (0, o.deprecationWarning)("Button property big is deprecated. Use size."), v && (0, o.deprecationWarning)("Button property icon is deprecated."), s && (0, o.deprecationWarning)("Button property accent is deprecated. Use accentStyle.");\n var j = m ? "big" === m : y,\n M = m ? "small" === m : b;\n M && (0, o.deprecationWarning)("Small button is deprecated. Use the default, pass in a custom className, or use size big.");\n var N = (0, n.default)("usa-button", {\n "usa-button--secondary": i,\n "usa-button--base": c,\n "usa-button--accent-cool": s || "cool" === d,\n "usa-button--accent-warm": "warm" === d,\n "usa-button--outline": f,\n "usa-button--inverse": p,\n "usa-button--big": j,\n "usa-button--small": M,\n "usa-button--icon": v,\n "usa-button--unstyled": O\n }, _);\n return a.default.createElement("button", _l4({\n type: t,\n className: N,\n onClick: g,\n "data-testid": "button"\n }, h), r);\n };\n\n t.Button = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = c, t.Grid = function (e) {\n var t = e.children,\n r = e.className,\n i = e.row,\n d = e.col,\n f = e.gap,\n p = e.offset,\n m = e.mobile,\n y = e.mobileLg,\n b = e.tablet,\n v = e.tabletLg,\n O = e.desktop,\n g = e.desktopLg,\n _ = e.widescreen,\n h = u(e, ["children", "className", "row", "col", "gap", "offset", "mobile", "mobileLg", "tablet", "tabletLg", "desktop", "desktopLg", "widescreen"]),\n j = {\n mobile: m,\n mobileLg: y,\n tablet: b,\n tabletLg: v,\n desktop: O,\n desktopLg: g,\n widescreen: _\n },\n M = s({\n row: i,\n col: d,\n gap: f,\n offset: p\n });\n\n if (Object.keys(o.breakpoints).forEach(function (t) {\n var r = t;\n\n if (Object.prototype.hasOwnProperty.call(j, r)) {\n var a = e[r];\n M = (0, n.default)(M, s(a, r));\n }\n }), M = (0, n.default)(M, r), c(h)) {\n var N = h.asCustom,\n E = u(h, ["asCustom"]);\n return a.default.createElement(N, _l5({\n className: M\n }, E), t);\n }\n\n return a.default.createElement("div", _l5({\n className: M,\n "data-testid": "grid"\n }, h), t);\n }, t.applyGridClasses = t.getGridClasses = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(46);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l5 = function l() {\n return (_l5 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function c(e) {\n return "asCustom" in e;\n }\n\n var s = function s(e, t) {\n var r;\n void 0 === e && (e = {});\n var a = t ? o.breakpoints[t] + ":" : "",\n i = e.row,\n l = e.col,\n u = e.gap,\n c = e.offset;\n return (0, n.default)(((r = {})[a + "grid-row"] = i, r[a + "grid-gap"] = !0 === u, r[a + "grid-gap-" + u] = !0 !== u && !!u, r[a + "grid-col"] = !0 === l, r[a + "grid-col-" + l] = !0 !== l && !!l, r[a + "grid-offset-" + c] = !!c, r));\n };\n\n t.getGridClasses = s;\n\n t.applyGridClasses = function (e) {\n var t = s(e);\n return Object.keys(o.breakpoints).forEach(function (r) {\n var a = r;\n\n if (Object.prototype.hasOwnProperty.call(e, a)) {\n var o = e[a];\n t = (0, n.default)(t, s(o, a));\n }\n }), t;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Textarea = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i3 = function i() {\n return (_i3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.error,\n c = e.success,\n s = e.children,\n d = e.inputRef,\n f = l(e, ["id", "name", "className", "error", "success", "children", "inputRef"]),\n p = (0, n.default)("usa-textarea", {\n "usa-input--error": u,\n "usa-input--success": c\n }, o);\n return a.default.createElement("textarea", _i3({\n "data-testid": "textarea",\n className: p,\n id: t,\n name: r,\n ref: d\n }, f), s);\n };\n\n t.Textarea = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Form = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i4 = function i() {\n return (_i4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Form = function (e) {\n var t = e.onSubmit,\n r = e.children,\n o = e.className,\n u = e.large,\n c = e.search,\n s = l(e, ["onSubmit", "children", "className", "large", "search"]),\n d = (0, n.default)({\n "usa-form": !c,\n "usa-form--large": u\n }, o);\n return a.default.createElement("form", _i4({\n "data-testid": "form",\n className: d,\n onSubmit: t\n }, s), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FooterExtendedNavList = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(4);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n t.FooterExtendedNavList = function (e) {\n var t = e.className,\n r = e.isMobile,\n a = e.nestedLinks,\n i = (0, o.default)("grid-row grid-gap-4", t),\n l = window && "object" == typeof window,\n c = n.default.useState(l && window.innerWidth < 480),\n s = c[0],\n d = c[1],\n f = (0, n.useState)(Array(a.length).fill(!1)),\n p = f[0],\n m = f[1],\n y = r || void 0 === r && s;\n (0, n.useEffect)(function () {\n if (!r) return window.addEventListener("resize", e), function () {\n return window.removeEventListener("resize", e);\n };\n\n function e() {\n var e = l && window.innerWidth < 480;\n e !== s && d(e);\n }\n }, []);\n return n.default.createElement("div", {\n className: i\n }, a.map(function (e, t) {\n return n.default.createElement("div", {\n key: "linkSection-" + t,\n className: "mobile-lg:grid-col-6 desktop:grid-col-3"\n }, n.default.createElement(u, {\n onToggle: y ? function () {\n return e = t, void m(function (t) {\n var r = Array(a.length).fill(!1);\n return r[e] = !t[e], r;\n });\n var e;\n } : void 0,\n isOpen: !y || p[t],\n links: e\n }));\n }));\n };\n\n var u = function u(e) {\n var t = e.isOpen,\n r = void 0 !== t && t,\n a = e.links,\n l = e.onToggle,\n u = a[0],\n c = a.slice(1),\n s = (0, o.default)("usa-footer__primary-content usa-footer__primary-content--collapsible", {\n hidden: !r\n });\n return n.default.createElement("section", {\n className: s,\n onClick: l,\n onKeyPress: l\n }, n.default.createElement("h4", {\n className: "usa-footer__primary-link"\n }, u), n.default.createElement(i.NavList, {\n type: "footerSecondary",\n items: c\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), Object.defineProperty(t, "Alert", {\n enumerable: !0,\n get: function get() {\n return a.Alert;\n }\n }), Object.defineProperty(t, "Accordion", {\n enumerable: !0,\n get: function get() {\n return n.Accordion;\n }\n }), Object.defineProperty(t, "GovBanner", {\n enumerable: !0,\n get: function get() {\n return o.GovBanner;\n }\n }), Object.defineProperty(t, "Button", {\n enumerable: !0,\n get: function get() {\n return i.Button;\n }\n }), Object.defineProperty(t, "ButtonGroup", {\n enumerable: !0,\n get: function get() {\n return l.ButtonGroup;\n }\n }), Object.defineProperty(t, "Link", {\n enumerable: !0,\n get: function get() {\n return u.Link;\n }\n }), Object.defineProperty(t, "Table", {\n enumerable: !0,\n get: function get() {\n return c.Table;\n }\n }), Object.defineProperty(t, "Tag", {\n enumerable: !0,\n get: function get() {\n return s.Tag;\n }\n }), Object.defineProperty(t, "Tooltip", {\n enumerable: !0,\n get: function get() {\n return d.Tooltip;\n }\n }), Object.defineProperty(t, "SideNav", {\n enumerable: !0,\n get: function get() {\n return f.SideNav;\n }\n }), Object.defineProperty(t, "Collection", {\n enumerable: !0,\n get: function get() {\n return p.Collection;\n }\n }), Object.defineProperty(t, "CollectionItem", {\n enumerable: !0,\n get: function get() {\n return m.CollectionItem;\n }\n }), Object.defineProperty(t, "CollectionHeading", {\n enumerable: !0,\n get: function get() {\n return y.CollectionHeading;\n }\n }), Object.defineProperty(t, "CollectionDescription", {\n enumerable: !0,\n get: function get() {\n return b.CollectionDescription;\n }\n }), Object.defineProperty(t, "CollectionMeta", {\n enumerable: !0,\n get: function get() {\n return v.CollectionMeta;\n }\n }), Object.defineProperty(t, "CollectionMetaItem", {\n enumerable: !0,\n get: function get() {\n return O.CollectionMetaItem;\n }\n }), Object.defineProperty(t, "CollectionMetaItemTag", {\n enumerable: !0,\n get: function get() {\n return g.CollectionMetaItemTag;\n }\n }), Object.defineProperty(t, "CollectionThumbnail", {\n enumerable: !0,\n get: function get() {\n return _.CollectionThumbnail;\n }\n }), Object.defineProperty(t, "CollectionCalendarDate", {\n enumerable: !0,\n get: function get() {\n return h.CollectionCalendarDate;\n }\n }), Object.defineProperty(t, "GridContainer", {\n enumerable: !0,\n get: function get() {\n return j.GridContainer;\n }\n }), Object.defineProperty(t, "Grid", {\n enumerable: !0,\n get: function get() {\n return M.Grid;\n }\n }), Object.defineProperty(t, "CharacterCount", {\n enumerable: !0,\n get: function get() {\n return N.CharacterCount;\n }\n }), Object.defineProperty(t, "Checkbox", {\n enumerable: !0,\n get: function get() {\n return E.Checkbox;\n }\n }), Object.defineProperty(t, "ComboBox", {\n enumerable: !0,\n get: function get() {\n return P.ComboBox;\n }\n }), Object.defineProperty(t, "DateInput", {\n enumerable: !0,\n get: function get() {\n return w.DateInput;\n }\n }), Object.defineProperty(t, "DateInputGroup", {\n enumerable: !0,\n get: function get() {\n return I.DateInputGroup;\n }\n }), Object.defineProperty(t, "DatePicker", {\n enumerable: !0,\n get: function get() {\n return D.DatePicker;\n }\n }), Object.defineProperty(t, "DateRangePicker", {\n enumerable: !0,\n get: function get() {\n return S.DateRangePicker;\n }\n }), Object.defineProperty(t, "Dropdown", {\n enumerable: !0,\n get: function get() {\n return x.Dropdown;\n }\n }), Object.defineProperty(t, "ErrorMessage", {\n enumerable: !0,\n get: function get() {\n return k.ErrorMessage;\n }\n }), Object.defineProperty(t, "Fieldset", {\n enumerable: !0,\n get: function get() {\n return A.Fieldset;\n }\n }), Object.defineProperty(t, "FileInput", {\n enumerable: !0,\n get: function get() {\n return T.FileInput;\n }\n }), Object.defineProperty(t, "Form", {\n enumerable: !0,\n get: function get() {\n return L.Form;\n }\n }), Object.defineProperty(t, "FormGroup", {\n enumerable: !0,\n get: function get() {\n return C.FormGroup;\n }\n }), Object.defineProperty(t, "Label", {\n enumerable: !0,\n get: function get() {\n return F.Label;\n }\n }), Object.defineProperty(t, "Radio", {\n enumerable: !0,\n get: function get() {\n return R.Radio;\n }\n }), Object.defineProperty(t, "RangeInput", {\n enumerable: !0,\n get: function get() {\n return U.RangeInput;\n }\n }), Object.defineProperty(t, "Textarea", {\n enumerable: !0,\n get: function get() {\n return B.Textarea;\n }\n }), Object.defineProperty(t, "TextInput", {\n enumerable: !0,\n get: function get() {\n return W.TextInput;\n }\n }), Object.defineProperty(t, "TimePicker", {\n enumerable: !0,\n get: function get() {\n return z.TimePicker;\n }\n }), Object.defineProperty(t, "ValidationChecklist", {\n enumerable: !0,\n get: function get() {\n return Y.ValidationChecklist;\n }\n }), Object.defineProperty(t, "ValidationItem", {\n enumerable: !0,\n get: function get() {\n return V.ValidationItem;\n }\n }), Object.defineProperty(t, "ExtendedNav", {\n enumerable: !0,\n get: function get() {\n return G.ExtendedNav;\n }\n }), Object.defineProperty(t, "Header", {\n enumerable: !0,\n get: function get() {\n return H.Header;\n }\n }), Object.defineProperty(t, "MegaMenu", {\n enumerable: !0,\n get: function get() {\n return Q.MegaMenu;\n }\n }), Object.defineProperty(t, "Menu", {\n enumerable: !0,\n get: function get() {\n return K.Menu;\n }\n }), Object.defineProperty(t, "NavCloseButton", {\n enumerable: !0,\n get: function get() {\n return Z.NavCloseButton;\n }\n }), Object.defineProperty(t, "NavList", {\n enumerable: !0,\n get: function get() {\n return X.NavList;\n }\n }), Object.defineProperty(t, "NavMenuButton", {\n enumerable: !0,\n get: function get() {\n return J.NavMenuButton;\n }\n }), Object.defineProperty(t, "NavDropDownButton", {\n enumerable: !0,\n get: function get() {\n return q.NavDropDownButton;\n }\n }), Object.defineProperty(t, "PrimaryNav", {\n enumerable: !0,\n get: function get() {\n return $.PrimaryNav;\n }\n }), Object.defineProperty(t, "Title", {\n enumerable: !0,\n get: function get() {\n return ee.Title;\n }\n }), Object.defineProperty(t, "Identifier", {\n enumerable: !0,\n get: function get() {\n return te.Identifier;\n }\n }), Object.defineProperty(t, "IdentifierGov", {\n enumerable: !0,\n get: function get() {\n return re.IdentifierGov;\n }\n }), Object.defineProperty(t, "IdentifierIdentity", {\n enumerable: !0,\n get: function get() {\n return ae.IdentifierIdentity;\n }\n }), Object.defineProperty(t, "IdentifierLink", {\n enumerable: !0,\n get: function get() {\n return ne.IdentifierLink;\n }\n }), Object.defineProperty(t, "IdentifierLinkItem", {\n enumerable: !0,\n get: function get() {\n return oe.IdentifierLinkItem;\n }\n }), Object.defineProperty(t, "IdentifierLinks", {\n enumerable: !0,\n get: function get() {\n return ie.IdentifierLinks;\n }\n }), Object.defineProperty(t, "IdentifierLogo", {\n enumerable: !0,\n get: function get() {\n return le.IdentifierLogo;\n }\n }), Object.defineProperty(t, "IdentifierLogos", {\n enumerable: !0,\n get: function get() {\n return ue.IdentifierLogos;\n }\n }), Object.defineProperty(t, "IdentifierMasthead", {\n enumerable: !0,\n get: function get() {\n return ce.IdentifierMasthead;\n }\n }), Object.defineProperty(t, "Address", {\n enumerable: !0,\n get: function get() {\n return se.Address;\n }\n }), Object.defineProperty(t, "Footer", {\n enumerable: !0,\n get: function get() {\n return de.Footer;\n }\n }), Object.defineProperty(t, "FooterExtendedNavList", {\n enumerable: !0,\n get: function get() {\n return fe.FooterExtendedNavList;\n }\n }), Object.defineProperty(t, "FooterNav", {\n enumerable: !0,\n get: function get() {\n return pe.FooterNav;\n }\n }), Object.defineProperty(t, "Logo", {\n enumerable: !0,\n get: function get() {\n return me.Logo;\n }\n }), Object.defineProperty(t, "SocialLinks", {\n enumerable: !0,\n get: function get() {\n return ye.SocialLinks;\n }\n }), Object.defineProperty(t, "CardGroup", {\n enumerable: !0,\n get: function get() {\n return be.CardGroup;\n }\n }), Object.defineProperty(t, "Card", {\n enumerable: !0,\n get: function get() {\n return ve.Card;\n }\n }), Object.defineProperty(t, "CardHeader", {\n enumerable: !0,\n get: function get() {\n return Oe.CardHeader;\n }\n }), Object.defineProperty(t, "CardMedia", {\n enumerable: !0,\n get: function get() {\n return ge.CardMedia;\n }\n }), Object.defineProperty(t, "CardBody", {\n enumerable: !0,\n get: function get() {\n return _e.CardBody;\n }\n }), Object.defineProperty(t, "CardFooter", {\n enumerable: !0,\n get: function get() {\n return he.CardFooter;\n }\n }), Object.defineProperty(t, "BreadcrumbBar", {\n enumerable: !0,\n get: function get() {\n return je.BreadcrumbBar;\n }\n }), Object.defineProperty(t, "Breadcrumb", {\n enumerable: !0,\n get: function get() {\n return Me.Breadcrumb;\n }\n }), Object.defineProperty(t, "BreadcrumbLink", {\n enumerable: !0,\n get: function get() {\n return Ne.BreadcrumbLink;\n }\n }), Object.defineProperty(t, "StepIndicator", {\n enumerable: !0,\n get: function get() {\n return Ee.StepIndicator;\n }\n }), Object.defineProperty(t, "StepIndicatorStep", {\n enumerable: !0,\n get: function get() {\n return Pe.StepIndicatorStep;\n }\n }), Object.defineProperty(t, "Search", {\n enumerable: !0,\n get: function get() {\n return we.Search;\n }\n }), Object.defineProperty(t, "SummaryBox", {\n enumerable: !0,\n get: function get() {\n return Ie.SummaryBox;\n }\n }), Object.defineProperty(t, "ProcessList", {\n enumerable: !0,\n get: function get() {\n return De.ProcessList;\n }\n }), Object.defineProperty(t, "ProcessListItem", {\n enumerable: !0,\n get: function get() {\n return Se.ProcessListItem;\n }\n }), Object.defineProperty(t, "ProcessListHeading", {\n enumerable: !0,\n get: function get() {\n return xe.ProcessListHeading;\n }\n }), Object.defineProperty(t, "SiteAlert", {\n enumerable: !0,\n get: function get() {\n return ke.SiteAlert;\n }\n }), r(20);\n\n var a = r(21),\n n = r(23),\n o = r(24),\n i = r(14),\n l = r(29),\n u = r(10),\n c = r(30),\n s = r(32),\n d = r(33),\n f = r(35),\n p = r(36),\n m = r(37),\n y = r(38),\n b = r(39),\n v = r(40),\n O = r(41),\n g = r(42),\n _ = r(43),\n h = r(44),\n j = r(45),\n M = r(15),\n N = r(47),\n E = r(48),\n P = r(11),\n w = r(51),\n I = r(52),\n D = r(12),\n S = r(57),\n x = r(58),\n k = r(59),\n A = r(60),\n T = r(61),\n L = r(17),\n C = r(8),\n F = r(5),\n R = r(64),\n U = r(65),\n B = r(16),\n W = r(7),\n z = r(66),\n Y = r(69),\n V = r(70),\n G = r(71),\n H = r(73),\n Q = r(74),\n K = r(75),\n Z = r(13),\n X = r(4),\n J = r(76),\n q = r(77),\n $ = r(78),\n ee = r(79),\n te = r(80),\n re = r(81),\n ae = r(82),\n ne = r(83),\n oe = r(84),\n ie = r(85),\n le = r(86),\n ue = r(87),\n ce = r(88),\n se = r(89),\n de = r(90),\n fe = r(18),\n pe = r(91),\n me = r(92),\n ye = r(93),\n be = r(94),\n ve = r(95),\n Oe = r(96),\n ge = r(97),\n _e = r(98),\n he = r(99),\n je = r(100),\n Me = r(101),\n Ne = r(102),\n Ee = r(103),\n Pe = r(104),\n we = r(105),\n Ie = r(106),\n De = r(107),\n Se = r(108),\n xe = r(109),\n ke = r(110);\n }, function (e, t, r) {\n "use strict";\n\n r.r(t);\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Alert = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(22));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l6 = function l() {\n return (_l6 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t,\n r = e.type,\n i = e.heading,\n c = e.cta,\n s = e.children,\n d = e.slim,\n f = e.noIcon,\n p = e.className,\n m = e.validation,\n y = u(e, ["type", "heading", "cta", "children", "slim", "noIcon", "className", "validation"]),\n b = (0, n.default)("usa-alert", ((t = {\n "usa-alert--success": "success" === r,\n "usa-alert--warning": "warning" === r,\n "usa-alert--error": "error" === r,\n "usa-alert--info": "info" === r,\n "usa-alert--slim": d,\n "usa-alert--no-icon": f,\n "usa-alert--validation": m\n })[o.default.alertWithCTA] = !!c, t), p);\n return a.default.createElement("div", _l6({\n className: b,\n "data-testid": "alert"\n }, y), a.default.createElement("div", {\n className: "usa-alert__body"\n }, i && a.default.createElement("h3", {\n className: "usa-alert__heading"\n }, i), s && (m ? s : a.default.createElement("p", {\n className: "usa-alert__text"\n }, s))), c && a.default.createElement("div", null, c));\n };\n\n t.Alert = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = {\n alertWithCTA: "src-components-Alert-Alert-module__alertWithCTA--1frj5"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Accordion = t.AccordionItem = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = i(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var l = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n l && (l.get || l.set) ? Object.defineProperty(a, o, l) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n };\n\n function i(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (i = function i(e) {\n return e ? r : t;\n })(e);\n }\n\n var _l7 = function l() {\n return (_l7 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n for (var r = 0, a = t.length, n = e.length; r < a; r++, n++) {\n e[n] = t[r];\n }\n\n return e;\n },\n c = function c(e) {\n var t = e.title,\n r = e.id,\n a = e.content,\n i = e.expanded,\n l = e.className,\n u = e.handleToggle,\n c = (0, o.default)("usa-accordion__heading", l),\n s = (0, o.default)("usa-accordion__content", "usa-prose", l);\n return n.default.createElement(n.default.Fragment, null, n.default.createElement("h2", {\n className: c\n }, n.default.createElement("button", {\n type: "button",\n className: "usa-accordion__button",\n "aria-expanded": i,\n "aria-controls": r,\n "data-testid": "accordionButton_" + r,\n onClick: u\n }, t)), n.default.createElement("div", {\n id: r,\n "data-testid": "accordionItem_" + r,\n className: s,\n hidden: !i\n }, a));\n };\n\n t.AccordionItem = c;\n\n var s = function s(e) {\n var t = e.bordered,\n r = e.items,\n a = e.className,\n i = e.multiselectable,\n s = void 0 !== i && i,\n d = (0, n.useState)(r.filter(function (e) {\n return !!e.expanded;\n }).map(function (e) {\n return e.id;\n })),\n f = d[0],\n p = d[1],\n m = (0, o.default)("usa-accordion", {\n "usa-accordion--bordered": t\n }, a);\n return n.default.createElement("div", {\n className: m,\n "data-testid": "accordion",\n "aria-multiselectable": s || void 0\n }, r.map(function (e, t) {\n return n.default.createElement(c, _l7({\n key: "accordionItem_" + t\n }, e, {\n expanded: f.indexOf(e.id) > -1,\n handleToggle: function handleToggle() {\n var t, r, a, n;\n t = e.id, r = u([], f), a = f.indexOf(t), n = s, a > -1 ? r.splice(a, 1) : (n || r.splice(0, r.length), r.push(t)), p(r);\n }\n }));\n }));\n };\n\n t.Accordion = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.GovBanner = void 0;\n\n var a = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n n = c(r(1)),\n o = c(r(25)),\n i = c(r(26)),\n l = c(r(27)),\n u = c(r(28));\n\n function c(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var _d = function d() {\n return (_d = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n f = function f(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n p = function p(e) {\n var t = e.tld,\n r = void 0 === t ? ".gov" : t,\n c = e.language,\n s = void 0 === c ? "english" : c,\n p = e.className,\n m = f(e, ["tld", "language", "className"]),\n y = (0, a.useState)(!1),\n b = y[0],\n v = y[1],\n O = (0, n.default)("usa-banner", p),\n g = function (e, t) {\n var r = a.default.createElement("span", {\n className: "icon-lock"\n }, a.default.createElement("img", {\n src: u.default,\n className: "usa-banner__lock-image",\n alt: "lock",\n title: "Lock",\n role: "img"\n }));\n\n switch (e) {\n case "english":\n return {\n header: "An official website of the United States government",\n headerAction: "Here’s how you know",\n tldSectionHeader: "Official websites use " + t,\n tldSectionContent: function () {\n switch (t) {\n case ".gov":\n return a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, ".gov"), " website belongs to an official government organization in the United States.");\n\n case ".mil":\n return a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, ".mil"), " website belongs to an official U.S. Department of Defense organization.");\n }\n }(),\n httpsSectionHeader: "Secure " + t + " websites use HTTPS",\n httpsSectionContent: a.default.createElement(a.default.Fragment, null, "A ", a.default.createElement("strong", null, "lock (", r, ")"), " or ", a.default.createElement("strong", null, "https://"), " means you’ve safely connected to the ", t, " website. Share sensitive information only on official, secure websites.")\n };\n\n case "spanish":\n return {\n header: "Un sitio oficial del Gobierno de Estados Unidos",\n headerAction: "Así es como usted puede verificarlo",\n tldSectionHeader: "Los sitios web oficiales usan " + t,\n tldSectionContent: function () {\n switch (t) {\n case ".gov":\n return a.default.createElement(a.default.Fragment, null, "Un sitio web ", a.default.createElement("strong", null, ".gov"), " pertenece a una organización oficial del Gobierno de Estados Unidos.");\n\n case ".mil":\n return a.default.createElement(a.default.Fragment, null, "Un sitio web ", a.default.createElement("strong", null, ".mil"), " pertenece a una organización oficial del Departamento de Defensa de EE. UU.");\n }\n }(),\n httpsSectionHeader: "Los sitios web seguros " + t + " usan HTTPS",\n httpsSectionContent: a.default.createElement(a.default.Fragment, null, "Un ", a.default.createElement("strong", null, "candado (", r, ")"), " o ", a.default.createElement("strong", null, "https://"), " ", "significa que usted se conectó de forma segura a un sitio web ", t, ". Comparta información sensible sólo en sitios web oficiales y seguros.")\n };\n }\n }(s, r);\n\n return a.default.createElement("section", _d({\n className: O,\n "data-testid": "govBanner"\n }, m), a.default.createElement("div", {\n className: "usa-accordion"\n }, a.default.createElement("header", {\n className: "usa-banner__header"\n }, a.default.createElement("div", {\n className: "usa-banner__inner"\n }, a.default.createElement("div", {\n className: "grid-col-auto"\n }, a.default.createElement("img", {\n className: "usa-banner__header-flag",\n src: o.default,\n alt: "U.S. flag"\n })), a.default.createElement("div", {\n className: "grid-col-fill tablet:grid-col-auto"\n }, a.default.createElement("p", {\n className: "usa-banner__header-text"\n }, g.header), a.default.createElement("p", {\n className: "usa-banner__header-action",\n "aria-hidden": "true"\n }, g.headerAction)), a.default.createElement("button", {\n type: "button",\n className: "usa-accordion__button usa-banner__button",\n "aria-expanded": b,\n "aria-controls": "gov-banner",\n onClick: function onClick() {\n v(function (e) {\n return !e;\n });\n }\n }, a.default.createElement("span", {\n className: "usa-banner__button-text"\n }, g.headerAction)))), a.default.createElement("div", {\n className: "usa-banner__content usa-accordion__content",\n id: "gov-banner",\n hidden: !b\n }, a.default.createElement("div", {\n className: "grid-row grid-gap-lg"\n }, a.default.createElement("div", {\n className: "usa-banner__guidance tablet:grid-col-6"\n }, a.default.createElement("img", {\n className: "usa-banner__icon usa-media-block__img",\n src: i.default,\n role: "img",\n alt: "",\n "aria-hidden": "true"\n }), a.default.createElement("div", {\n className: "usa-media-block__body"\n }, a.default.createElement("p", null, a.default.createElement("strong", null, g.tldSectionHeader), a.default.createElement("br", null), g.tldSectionContent))), a.default.createElement("div", {\n className: "usa-banner__guidance tablet:grid-col-6"\n }, a.default.createElement("img", {\n className: "usa-banner__icon usa-media-block__img",\n src: l.default,\n role: "img",\n alt: "",\n "aria-hidden": "true"\n }), a.default.createElement("div", {\n className: "usa-media-block__body"\n }, a.default.createElement("p", null, a.default.createElement("strong", null, g.httpsSectionHeader), a.default.createElement("br", null), g.httpsSectionContent)))))));\n };\n\n t.GovBanner = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAG1BMVEUdM7EeNLIeM7HgQCDaPh/bPh/bPx/////bPyBEby41AAAAUElEQVQI123MNw4CABDEwD3jC/9/MQ1BQrgeOSkIqYe2o2FZtthXgQLgbHVMZdlsfUQFQnHtjP1+8BUhBDKOqtmfot6ojqPzR7TjdU+f6vkED+IDPhTBcMAAAAAASUVORK5CYII=";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWRvdC1nb3Y8L3RpdGxlPjxwYXRoIGZpbGw9IiMyMzc4QzMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDBjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMyIDAgMTcuNjczLTE0LjMyNyAzMi0zMiAzMkMxNC4zMjcgNjQgMCA0OS42NzMgMCAzMiAwIDE0LjMyNyAxNC4zMjcgMCAzMiAwem0wIDEuMjA4QzE0Ljk5NCAxLjIwOCAxLjIwOCAxNC45OTQgMS4yMDggMzJTMTQuOTk0IDYyLjc5MiAzMiA2Mi43OTIgNjIuNzkyIDQ5LjAwNiA2Mi43OTIgMzIgNDkuMDA2IDEuMjA4IDMyIDEuMjA4em0xMC41OSAzOC44NThhLjg1Ny44NTcgMCAwIDEgLjg4Mi44MjJ2MS42NDJIMTguODg2di0xLjY0MmEuODU3Ljg1NyAwIDAgMSAuODgyLS44MjJINDIuNTl6TTI1LjQ0MyAyNy43NzR2OS44MjloMS42NDJ2LTkuODNoMy4yNzN2OS44M0gzMnYtOS44M2gzLjI3MnY5LjgzaDEuNjQzdi05LjgzaDMuMjcydjkuODNoLjc2YS44NTcuODU3IDAgMCAxIC44ODIuODIxdi44MjFoLTIxLjN2LS44MDlhLjg1Ny44NTcgMCAwIDEgLjg4LS44MmguNzYydi05Ljg0MmgzLjI3MnptNS43MzYtOC4xODhsMTIuMjkzIDQuOTE1djEuNjQyaC0xLjYzYS44NTcuODU3IDAgMCAxLS44ODIuODIySDIxLjQxYS44NTcuODU3IDAgMCAxLS44ODItLjgyMmgtMS42NDJ2LTEuNjQybDEyLjI5My00LjkxNXoiLz48L3N2Zz4=";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5pY29uLWh0dHBzPC90aXRsZT48cGF0aCBmaWxsPSIjNzE5RjJBIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMiAwYzE3LjY3MyAwIDMyIDE0LjMyNyAzMiAzMiAwIDE3LjY3My0xNC4zMjcgMzItMzIgMzJDMTQuMzI3IDY0IDAgNDkuNjczIDAgMzIgMCAxNC4zMjcgMTQuMzI3IDAgMzIgMHptMCAxLjIwOEMxNC45OTQgMS4yMDggMS4yMDggMTQuOTk0IDEuMjA4IDMyUzE0Ljk5NCA2Mi43OTIgMzIgNjIuNzkyIDYyLjc5MiA0OS4wMDYgNjIuNzkyIDMyIDQ5LjAwNiAxLjIwOCAzMiAxLjIwOHptMCAxOC44ODZhNy4yNDUgNy4yNDUgMCAwIDEgNy4yNDUgNy4yNDV2My4xMDNoLjUyYy44NiAwIDEuNTU3LjY5OCAxLjU1NyAxLjU1OHY5LjMyMmMwIC44Ni0uNjk3IDEuNTU4LTEuNTU3IDEuNTU4aC0xNS41M2MtLjg2IDAtMS41NTctLjY5Ny0xLjU1Ny0xLjU1OFYzMmMwLS44Ni42OTctMS41NTggMS41NTctMS41NThoLjUyVjI3LjM0QTcuMjQ1IDcuMjQ1IDAgMCAxIDMyIDIwLjA5NHptMCAzLjEwM2E0LjE0MiA0LjE0MiAwIDAgMC00LjE0MiA0LjE0MnYzLjEwM2g4LjI4NFYyNy4zNEE0LjE0MiA0LjE0MiAwIDAgMCAzMiAyMy4xOTd6Ii8+PC9zdmc+";\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjUyIiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNTIgNjQiPjx0aXRsZT5sb2NrPC90aXRsZT48cGF0aCBmaWxsPSIjMUIxQjFCIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNiAwYzEwLjQ5MyAwIDE5IDguNTA3IDE5IDE5djloM2E0IDQgMCAwIDEgNCA0djI4YTQgNCAwIDAgMS00IDRINGE0IDQgMCAwIDEtNC00VjMyYTQgNCAwIDAgMSA0LTRoM3YtOUM3IDguNTA3IDE1LjUwNyAwIDI2IDB6bTAgOGMtNS45NzkgMC0xMC44NDMgNC43Ny0xMC45OTYgMTAuNzEyTDE1IDE5djloMjJ2LTljMC02LjA3NS00LjkyNS0xMS0xMS0xMXoiLz48L3N2Zz4=";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ButtonGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i5 = function i() {\n return (_i5 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = e.type,\n u = void 0 === o ? "default" : o,\n c = l(e, ["className", "children", "type"]),\n s = (0, n.default)("usa-button-group", {\n "usa-button-group--segmented": "segmented" == u\n }, t);\n return a.default.createElement("ul", _i5({\n className: s\n }, c), a.default.Children.map(r, function (e) {\n return a.default.createElement("li", {\n className: "usa-button-group__item"\n }, e);\n }));\n };\n\n t.ButtonGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Table = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = i(r(31));\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var l = function l(e) {\n var t,\n r = e.bordered,\n i = e.caption,\n l = e.children,\n u = e.fullWidth,\n c = e.fixed,\n s = e.scrollable,\n d = e.striped,\n f = e.compact,\n p = e.stackedStyle,\n m = void 0 === p ? "none" : p,\n y = (0, n.default)("usa-table", ((t = {\n "usa-table--borderless": !r\n })["" + o.default.fullwidth] = u, t["" + o.default.fixed] = c, t["usa-table--striped"] = d, t["usa-table--compact"] = f, t["usa-table--stacked"] = "default" === m, t["usa-table--stacked-header"] = "headers" === m, t));\n f && "none" !== m && console.warn("USWDS states that compact styling is not suitable for use with stacked variants. See USWDS Table component, Table variants for more information: https://designsystem.digital.gov/components/table");\n var b = a.default.createElement("table", {\n className: y,\n "data-testid": "table"\n }, i && a.default.createElement("caption", null, i), l);\n return a.default.createElement(a.default.Fragment, null, s ? a.default.createElement("div", {\n "data-testid": "scrollable-table-container",\n className: "usa-table-container--scrollable"\n }, b) : b);\n };\n\n t.Table = l;\n var u = l;\n t.default = u;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = {\n fullwidth: "src-components-Table-Table-module__fullwidth--3-K3t",\n fixed: "src-components-Table-Table-module__fixed--2Awcy"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Tag = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i6 = function i() {\n return (_i6 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.background,\n o = e.className,\n u = l(e, ["children", "background", "className"]),\n c = {};\n r && (c.background = r);\n var s = (0, n.default)("usa-tag", o);\n return a.default.createElement("span", _i6({\n "data-testid": "tag",\n className: s,\n style: _i6({}, c)\n }, u), t);\n };\n\n t.Tag = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = s, t.Tooltip = d;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = l(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(34);\n\n function l(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (l = function l(e) {\n return e ? r : t;\n })(e);\n }\n\n var _u = function u() {\n return (_u = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function s(e) {\n return "asCustom" in e;\n }\n\n function d(e) {\n var t = (0, n.useRef)(null),\n r = (0, n.useRef)(null),\n a = (0, n.useRef)("tooltip-" + (Math.floor(9e5 * Math.random()) + 1e5)),\n l = (0, n.useState)(!1),\n d = l[0],\n f = l[1],\n p = function p(a, o) {\n (0, n.useEffect)(function () {\n var n = o;\n\n if (a.current && r.current && t.current) {\n var l = a.current,\n u = r.current,\n c = t.current,\n s = l.offsetWidth,\n d = l.offsetHeight,\n f = Number.parseInt(window.getComputedStyle(l).getPropertyValue("margin-top"), 10),\n p = Number.parseInt(window.getComputedStyle(l).getPropertyValue("margin-bottom"), 10),\n m = Number.parseInt(window.getComputedStyle(c).getPropertyValue("padding-top"), 10),\n y = Number.parseInt(window.getComputedStyle(c).getPropertyValue("padding-bottom"), 10),\n b = Number.parseInt(window.getComputedStyle(u).getPropertyValue("height"), 10),\n v = l.offsetLeft,\n O = u.offsetWidth,\n g = s / 2 + v,\n _ = s + 5 + 2,\n h = d + 5 + 2,\n j = function j(e) {\n u.classList.remove("usa-tooltip__body--" + n), n = e, u.classList.add("usa-tooltip__body--" + e);\n };\n\n if (e.wrapperclasses) e.wrapperclasses.split(" ").forEach(function (e) {\n return c.classList.add(e);\n });\n if (e.className) e.className.split(" ").forEach(function (e) {\n return l.classList.add(e);\n });\n\n var M = function M(e) {\n j("top"), e.style.marginLeft = g + "px", (0, i.isElementInViewport)(e) || e.classList.add("usa-tooltip__body--wrap"), e.style.marginBottom = h + p + y + "px";\n },\n N = function N(e) {\n j("bottom"), e.style.marginLeft = g + "px", (0, i.isElementInViewport)(e) || e.classList.add("usa-tooltip__body--wrap"), e.style.marginTop = h + f + m + "px";\n },\n E = function E(e) {\n j("right"), e.style.marginBottom = "0", e.style.marginLeft = _ + v + "px", e.style.bottom = (d - b) / 2 + p + y + "px";\n },\n P = function P(e) {\n j("left"), e.style.marginBottom = "0", e.style.marginLeft = v > O ? v - O - 7 + "px" : "-" + (O - v + 7) + "px", e.style.bottom = (d - b) / 2 + p + y + "px";\n };\n\n switch (o) {\n case "top":\n M(u), (0, i.isElementInViewport)(u) || N(u);\n break;\n\n case "bottom":\n N(u), (0, i.isElementInViewport)(u) || M(u);\n break;\n\n case "right":\n E(u), (0, i.isElementInViewport)(u) || (P(u), (0, i.isElementInViewport)(u) || M(u));\n break;\n\n case "left":\n P(u), (0, i.isElementInViewport)(u) || (E(u), (0, i.isElementInViewport)(u) || M(u));\n }\n }\n }, [d]);\n };\n\n if (s(e)) {\n var m = (0, n.useRef)(null),\n y = e.label,\n b = e.position,\n v = e.asCustom,\n O = e.children,\n g = N = c(e, ["label", "position", "asCustom", "children"]),\n _ = (0, o.default)("usa-tooltip__body", {\n "is-set": d,\n "usa-tooltip__body--top": "top" === b,\n "usa-tooltip__body--bottom": "bottom" === b,\n "usa-tooltip__body--right": "right" === b,\n "usa-tooltip__body--left": "left" === b,\n "is-visible": d\n }),\n h = function h() {\n f(!0);\n },\n j = function j() {\n f(!1);\n };\n\n p(m, b);\n var M = (0, n.createElement)(v, _u({\n ref: m,\n "data-testid": "triggerElement",\n onMouseEnter: function onMouseEnter() {\n return h();\n },\n onMouseOver: function onMouseOver() {\n return h();\n },\n onFocus: function onFocus() {\n return h();\n },\n onMouseLeave: function onMouseLeave() {\n return j();\n },\n onBlur: function onBlur() {\n return j();\n },\n onKeyDown: function onKeyDown() {\n return j();\n }\n }, g), O);\n return n.default.createElement("span", {\n "data-testid": "tooltipWrapper",\n ref: t,\n className: "usa-tooltip",\n role: "tooltip"\n }, M, n.default.createElement("span", {\n "data-testid": "tooltipBody",\n title: y,\n id: a.current,\n ref: r,\n className: _\n }, y));\n }\n\n m = (0, n.useRef)(null), y = e.label, b = e.position, O = e.children;\n\n var N = c(e, ["label", "position", "children"]),\n E = (_ = (0, o.default)("usa-tooltip__body", {\n "is-set": d,\n "usa-tooltip__body--top": "top" === b,\n "usa-tooltip__body--bottom": "bottom" === b,\n "usa-tooltip__body--right": "right" === b,\n "usa-tooltip__body--left": "left" === b,\n "is-visible": d\n }), function () {\n f(!0);\n }),\n P = function P() {\n f(!1);\n };\n\n return p(m, b), n.default.createElement("span", {\n "data-testid": "tooltipWrapper",\n ref: t,\n className: "usa-tooltip",\n role: "tooltip"\n }, n.default.createElement("button", _u({}, N, {\n "data-testid": "triggerElement",\n ref: m,\n "aria-describedby": a.current,\n type: "button",\n className: "usa-button usa-tooltip__trigger",\n title: y,\n onMouseEnter: E,\n onMouseOver: E,\n onFocus: E,\n onMouseLeave: P,\n onBlur: P,\n onKeyDown: P\n }), O), n.default.createElement("span", {\n "data-testid": "tooltipBody",\n title: y,\n id: a.current,\n ref: r,\n className: _\n }, y));\n }\n\n d.defaultProps = {\n position: "top"\n }, d.DisplayName = "Tooltip";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isElementInViewport = void 0;\n\n t.isElementInViewport = function (e, t, r) {\n void 0 === t && (t = window), void 0 === r && (r = document.documentElement);\n var a = e.getBoundingClientRect();\n return a.top >= 0 && a.left >= 0 && a.bottom <= (t.innerHeight || r.clientHeight) && a.right <= (t.innerWidth || r.clientWidth);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.SideNav = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.SideNav = function (e) {\n var t = e.items,\n r = e.isSubnav,\n o = void 0 !== r && r,\n i = (0, n.default)({\n "usa-sidenav": !o,\n "usa-sidenav__sublist": o\n });\n return a.default.createElement("ul", {\n className: i,\n "data-testid": "sidenav"\n }, t.map(function (e, t) {\n return a.default.createElement("li", {\n key: "sidenav_item_" + t,\n className: "usa-sidenav__item"\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Collection = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i7 = function i() {\n return (_i7 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Collection = function (e) {\n var t = e.children,\n r = e.className,\n o = e.condensed,\n u = l(e, ["children", "className", "condensed"]),\n c = (0, n.default)("usa-collection", {\n "usa-collection--condensed": o\n }, r);\n return a.default.createElement("ul", _i7({\n className: c,\n "data-testid": "collection"\n }, u), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i8 = function i() {\n return (_i8 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionItem = function (e) {\n var t = e.className,\n r = e.children,\n o = e.variantComponent,\n u = l(e, ["className", "children", "variantComponent"]),\n c = (0, n.default)("usa-collection__item", t);\n return a.default.createElement("li", _i8({\n className: c\n }, u), o, a.default.createElement("div", {\n className: "usa-collection__body"\n }, r));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionHeading = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i9 = function i() {\n return (_i9 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionHeading = function (e) {\n var t = e.headingLevel,\n r = e.className,\n o = e.children,\n u = l(e, ["headingLevel", "className", "children"]),\n c = t || "h3",\n s = (0, n.default)("usa-collection__heading", r);\n return a.default.createElement(c, _i9({\n className: s\n }, u), o);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionDescription = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i10 = function i() {\n return (_i10 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionDescription = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__description", t);\n return a.default.createElement("p", _i10({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMeta = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i11 = function i() {\n return (_i11 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMeta = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__meta", t);\n return a.default.createElement("ul", _i11({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMetaItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i12 = function i() {\n return (_i12 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMetaItem = function (e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-collection__meta-item", t);\n return a.default.createElement("li", _i12({\n className: u\n }, o), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionMetaItemTag = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i13 = function i() {\n return (_i13 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionMetaItemTag = function (e) {\n var t = e.className,\n r = e.children,\n o = e.tagStyle,\n u = l(e, ["className", "children", "tagStyle"]),\n c = (0, n.default)("usa-collection__meta-item", "usa-tag", {\n "usa-tag--new": "new" === o\n }, t);\n return a.default.createElement("li", _i13({\n className: c\n }, u), r);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionThumbnail = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i14 = function i() {\n return (_i14 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.CollectionThumbnail = function (e) {\n var t = e.className,\n r = e.src,\n o = e.alt,\n u = l(e, ["className", "src", "alt"]),\n c = (0, n.default)("usa-collection__img", t);\n return a.default.createElement("img", _i14({\n className: c,\n src: r,\n alt: o\n }, u));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.CollectionCalendarDate = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n };\n var o = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\n\n t.CollectionCalendarDate = function (e) {\n var t = e.datetime,\n r = new Date(t);\n return r && r.getTime && isNaN(r.getTime()) ? n.default.createElement(n.default.Fragment, null) : n.default.createElement("div", {\n className: "usa-collection__calendar-date",\n "data-testid": "collection-calendar-date"\n }, n.default.createElement("time", {\n dateTime: t\n }, n.default.createElement("span", {\n className: "usa-collection__calendar-date-month"\n }, o[r.getMonth()]), n.default.createElement("span", {\n className: "usa-collection__calendar-date-day"\n }, r.getDate())));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.isCustomProps = u, t.GridContainer = function (e) {\n if (u(e)) {\n var t = e.className,\n r = e.containerSize,\n n = e.asCustom,\n o = e.children,\n s = l(e, ["className", "containerSize", "asCustom", "children"]),\n d = c(t, r);\n return a.default.createElement(n, _i15({\n "data-testid": "gridContainer",\n className: d\n }, s), o);\n }\n\n t = e.className, r = e.containerSize, o = e.children, s = l(e, ["className", "containerSize", "children"]), d = c(t, r);\n return a.default.createElement("div", _i15({\n "data-testid": "gridContainer",\n className: d\n }, s), o);\n };\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i15 = function i() {\n return (_i15 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function u(e) {\n return "asCustom" in e;\n }\n\n function c(e, t) {\n var r;\n return (0, n.default)(((r = {\n "grid-container": !t\n })["grid-container-" + t] = !!t, r), e);\n }\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.breakpoints = void 0;\n t.breakpoints = {\n mobile: "mobile",\n mobileLg: "mobile-lg",\n tablet: "tablet",\n tabletLg: "tablet-lg",\n desktop: "desktop",\n desktopLg: "desktop-lg",\n widescreen: "widescreen"\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CharacterCount = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(7),\n l = r(16);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var _c = function c() {\n return (_c = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n d = function d(e) {\n return Array.from(e).length;\n },\n f = function f(e, t) {\n var r = t + " characters allowed",\n a = t - e;\n\n switch (a) {\n case t:\n return r;\n\n case 1:\n return "$0 character left".replace("$0", "1");\n\n case -1:\n return "$0 character over limit".replace("$0", "1");\n\n default:\n return a >= 0 ? "$0 characters left".replace("$0", a.toString()) : "$0 characters over limit".replace("$0", Math.abs(a).toString());\n }\n },\n p = function p(e) {\n var t = e.id,\n r = e.name,\n a = e.className,\n u = e.maxLength,\n p = e.defaultValue,\n m = void 0 === p ? "" : p,\n y = e.isTextArea,\n b = void 0 !== y && y,\n v = e.getCharacterCount,\n O = void 0 === v ? d : v,\n g = e.getMessage,\n _ = void 0 === g ? f : g,\n h = s(e, ["id", "name", "className", "maxLength", "defaultValue", "isTextArea", "getCharacterCount", "getMessage"]),\n j = O(m),\n M = (0, n.useState)(j),\n N = M[0],\n E = M[1],\n P = (0, n.useState)(_(j, u)),\n w = P[0],\n I = P[1],\n D = (0, n.useState)(j < u),\n S = D[0],\n x = D[1],\n k = (0, o.default)("usa-character-count__field", a),\n A = (0, o.default)("usa-hint", "usa-character-count__message", {\n "usa-character-count__message--invalid": !S\n });\n\n (0, n.useEffect)(function () {\n I(_(N, u)), x(N <= u);\n }, [N]);\n\n var T,\n L = function L(e, t) {\n var r = S ? "" : "The content is too long.";\n e.target.setCustomValidity(r), t && t(e);\n },\n C = function C(e, t) {\n var r = e.target.value;\n E(O(void 0 === r ? "" : r)), t && t(e);\n };\n\n if (b) {\n var F = h,\n R = F.onBlur,\n U = F.onChange,\n B = F.inputRef,\n W = s(F, ["onBlur", "onChange", "inputRef"]);\n T = n.default.createElement(l.Textarea, _c({\n id: t,\n name: r,\n className: k,\n defaultValue: m,\n onBlur: function onBlur(e) {\n return L(e, R);\n },\n onChange: function onChange(e) {\n return C(e, U);\n },\n inputRef: B\n }, W));\n } else {\n var z = h,\n Y = z.onBlur,\n V = z.onChange,\n G = (B = z.inputRef, z.type),\n H = void 0 === G ? "text" : G,\n Q = s(z, ["onBlur", "onChange", "inputRef", "type"]);\n T = n.default.createElement(i.TextInput, _c({\n id: t,\n type: H,\n name: r,\n className: k,\n defaultValue: m,\n onBlur: function onBlur(e) {\n return L(e, Y);\n },\n onChange: function onChange(e) {\n return C(e, V);\n },\n inputRef: B\n }, Q));\n }\n\n return n.default.createElement(n.default.Fragment, null, T, n.default.createElement("span", {\n "data-testid": "characterCountMessage",\n id: t + "-info",\n className: A,\n "aria-live": "polite"\n }, w));\n };\n\n t.CharacterCount = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Checkbox = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i16 = function i() {\n return (_i16 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.label,\n c = e.inputRef,\n s = e.tile,\n d = e.labelDescription,\n f = l(e, ["id", "name", "className", "label", "inputRef", "tile", "labelDescription"]),\n p = (0, n.default)("usa-checkbox", o),\n m = (0, n.default)("usa-checkbox__input", {\n "usa-checkbox__input--tile": s\n });\n return a.default.createElement("div", {\n "data-testid": "checkbox",\n className: p\n }, a.default.createElement("input", _i16({\n className: m,\n id: t,\n type: "checkbox",\n name: r,\n ref: c\n }, f)), a.default.createElement("label", {\n className: "usa-checkbox__label",\n htmlFor: t\n }, u, d && a.default.createElement("span", {\n className: "usa-checkbox__label-description"\n }, d)));\n };\n\n t.Checkbox = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.useComboBox = t.ActionTypes = void 0;\n\n var a,\n n = r(0),\n o = r(11),\n i = r(50),\n _l8 = function l() {\n return (_l8 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.ActionTypes = a, function (e) {\n e[e.SELECT_OPTION = 0] = "SELECT_OPTION", e[e.CLEAR = 1] = "CLEAR", e[e.OPEN_LIST = 2] = "OPEN_LIST", e[e.CLOSE_LIST = 3] = "CLOSE_LIST", e[e.FOCUS_OPTION = 4] = "FOCUS_OPTION", e[e.UPDATE_FILTER = 5] = "UPDATE_FILTER", e[e.BLUR = 6] = "BLUR", e[e.CLEAR_SELECTION = 7] = "CLEAR_SELECTION";\n }(a || (t.ActionTypes = a = {}));\n\n t.useComboBox = function (e, t, r, u) {\n return (0, n.useReducer)(function (e, n) {\n switch (n.type) {\n case a.SELECT_OPTION:\n return _l8(_l8({}, e), {\n isOpen: !1,\n selectedOption: n.option,\n focusMode: o.FocusMode.Input,\n inputValue: n.option.label,\n filteredOptions: t,\n focusedOption: n.option\n });\n\n case a.UPDATE_FILTER:\n var c = (p = n.value, m = (0, i.generateDynamicRegExp)(u.filter, p, u.extras), y = t.filter(function (e) {\n return m.test(e.label.toLowerCase());\n }), r ? {\n closestMatch: y.length > 0 ? y[0] : t[0],\n optionsToDisplay: t\n } : {\n closestMatch: y[0],\n optionsToDisplay: y\n }),\n s = c.closestMatch,\n d = c.optionsToDisplay,\n f = _l8(_l8({}, e), {\n isOpen: !0,\n filteredOptions: d,\n inputValue: n.value\n });\n\n return r || !e.selectedOption ? f.focusedOption = s : e.selectedOption && (f.filteredOptions.includes(e.selectedOption) ? f.focusedOption = e.selectedOption : f.focusedOption = s), f;\n\n case a.OPEN_LIST:\n return _l8(_l8({}, e), {\n isOpen: !0,\n focusMode: o.FocusMode.Input,\n focusedOption: e.selectedOption || e.focusedOption || t[0]\n });\n\n case a.CLOSE_LIST:\n f = _l8(_l8({}, e), {\n isOpen: !1,\n focusMode: o.FocusMode.Input,\n focusedOption: void 0\n });\n return 0 === e.filteredOptions.length && (f.filteredOptions = t, f.inputValue = ""), e.selectedOption && (f.inputValue = e.selectedOption.label), f;\n\n case a.FOCUS_OPTION:\n return _l8(_l8({}, e), {\n isOpen: !0,\n focusedOption: n.option,\n focusMode: o.FocusMode.Item\n });\n\n case a.CLEAR:\n return _l8(_l8({}, e), {\n inputValue: "",\n isOpen: !1,\n focusMode: o.FocusMode.Input,\n selectedOption: void 0,\n filteredOptions: t,\n focusedOption: t[0]\n });\n\n case a.BLUR:\n f = _l8(_l8({}, e), {\n isOpen: !1,\n focusMode: o.FocusMode.None,\n filteredOptions: t\n });\n return e.selectedOption ? (f.inputValue = e.selectedOption.label, f.focusedOption = e.selectedOption) : (f.inputValue = "", f.focusedOption = t[0]), f;\n\n case a.CLEAR_SELECTION:\n return _l8(_l8({}, e), {\n inputValue: "",\n isOpen: !1,\n focusMode: o.FocusMode.None,\n selectedOption: void 0,\n filteredOptions: t,\n focusedOption: void 0\n });\n\n default:\n throw new Error();\n }\n\n var p, m, y;\n }, e);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.generateDynamicRegExp = void 0;\n\n t.generateDynamicRegExp = function (e, t, r) {\n void 0 === t && (t = ""), void 0 === r && (r = {});\n\n var a = function a(e) {\n return e.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, "\\\\$&");\n },\n n = e.replace(/{{(.*?)}}/g, function (e, n) {\n var o = n.trim(),\n i = r[o];\n\n if ("query" !== o && i) {\n var l = new RegExp(i, "i"),\n u = t.match(l);\n return u ? a(u[1]) : "";\n }\n\n return a(t);\n });\n\n return n = "^(?:" + n + ")$", new RegExp(n, "i");\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.DateInput = void 0;\n var a = u(r(0)),\n n = u(r(1)),\n o = r(7),\n i = r(5),\n l = r(8);\n\n function u(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _c2 = function c() {\n return (_c2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n d = function d(e) {\n var t = e.id,\n r = e.name,\n u = e.label,\n d = e.unit,\n f = e.maxLength,\n p = e.minLength,\n m = e.className,\n y = s(e, ["id", "name", "label", "unit", "maxLength", "minLength", "className"]),\n b = (0, n.default)({\n "usa-form-group--month": "month" == d,\n "usa-form-group--day": "day" == d,\n "usa-form-group--year": "year" == d\n }),\n v = (0, n.default)("usa-input--inline", m);\n return a.default.createElement(l.FormGroup, {\n className: b\n }, a.default.createElement(i.Label, {\n htmlFor: t\n }, u), a.default.createElement(o.TextInput, _c2({}, y, {\n className: v,\n id: t,\n name: r,\n type: "text",\n maxLength: f,\n minLength: p,\n pattern: "[0-9]*",\n inputMode: "numeric"\n })));\n };\n\n t.DateInput = d;\n var f = d;\n t.default = f;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.DateInputGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i17 = function i() {\n return (_i17 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-memorable-date", r);\n return a.default.createElement("div", _i17({\n className: u\n }, o, {\n "data-testid": "dateInputGroup"\n }), t);\n };\n\n t.DateInputGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Calendar = void 0;\n\n var a = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = s(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n n = r(3),\n o = r(54),\n i = r(55),\n l = r(56),\n u = r(12),\n c = r(9);\n\n function s(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (s = function s(e) {\n return e ? r : t;\n })(e);\n }\n\n var d = "DATE_PICKER",\n f = "MONTH_PICKER",\n p = "YEAR_PICKER",\n m = function m(e) {\n var t = e.date,\n r = e.selectedDate,\n s = e.handleSelectDate,\n m = e.minDate,\n y = e.maxDate,\n b = e.rangeDate,\n v = e.setStatuses,\n O = e.focusMode,\n g = e.i18n,\n _ = void 0 === g ? c.EN_US : g,\n h = (0, a.useRef)(null),\n j = (0, a.useRef)(null),\n M = (0, a.useRef)(null),\n N = (0, a.useRef)(null),\n E = (0, a.useRef)(null),\n P = (0, a.useRef)(null),\n w = (0, a.useRef)(null),\n I = (0, a.useRef)(null),\n D = (0, a.useState)(t || (0, n.today)()),\n S = D[0],\n x = D[1],\n k = (0, a.useState)(d),\n A = k[0],\n T = k[1],\n L = (0, a.useState)([null, null]),\n C = L[0],\n F = L[1],\n R = !0,\n U = (0, n.addDays)(S, 0),\n B = S.getMonth(),\n W = S.getFullYear(),\n z = _.months[parseInt("" + B)],\n Y = _.daysOfWeekShort,\n V = _.daysOfWeek,\n G = _.backOneYear,\n H = _.backOneMonth,\n Q = z + ". " + _.clickToSelectMonth,\n K = W + ". " + _.clickToSelectYear,\n Z = _.forwardOneMonth,\n X = _.forwardOneYear;\n\n if ((0, a.useEffect)(function () {\n R = !1;\n }, []), (0, a.useEffect)(function () {\n t && A === d && x(t);\n }, [t]), (0, a.useEffect)(function () {\n if (O !== u.FocusMode.Input) {\n var e = C[0],\n t = C[1];\n if (e && t) e.disabled ? t.focus() : e.focus(), F([null, null]);else {\n var a = I.current && I.current.querySelector(".usa-date-picker__calendar__date--focused");\n a && a.focus();\n }\n }\n\n if (R) {\n var o = [z + " " + W];\n\n if (r && (0, n.isSameDay)(U, r)) {\n var i = _.selectedDate;\n o.unshift(i);\n }\n\n v(o);\n }\n }, [S]), A === f) return a.default.createElement(i.MonthPicker, {\n date: S,\n minDate: m,\n maxDate: y,\n handleSelectMonth: function handleSelectMonth(e) {\n var t = (0, n.setMonth)(S, e);\n t = (0, n.keepDateBetweenMinAndMax)(t, m, y), x(t), T(d);\n },\n i18n: _\n });\n if (A === p) return a.default.createElement(l.YearPicker, {\n date: S,\n minDate: m,\n maxDate: y,\n handleSelectYear: function handleSelectYear(e) {\n var t = (0, n.setYear)(S, e);\n t = (0, n.keepDateBetweenMinAndMax)(t, m, y), x(t), T(d);\n },\n setStatuses: v\n });\n\n for (var J = (0, n.subMonths)(S, 1), q = (0, n.addMonths)(S, 1), $ = (0, n.startOfMonth)(S), ee = (0, n.isSameMonth)(S, m), te = y && (0, n.isSameMonth)(S, y), re = r || S, ae = b && (0, n.min)(re, b), ne = b && (0, n.max)(re, b), oe = ae && (0, n.addDays)(ae, 1), ie = ne && (0, n.subDays)(ne, 1), le = function le(e) {\n var t;\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n t = (0, n.subWeeks)(S, 1);\n break;\n\n case "ArrowDown":\n case "Down":\n t = (0, n.addWeeks)(S, 1);\n break;\n\n case "ArrowLeft":\n case "Left":\n t = (0, n.subDays)(S, 1);\n break;\n\n case "ArrowRight":\n case "Right":\n t = (0, n.addDays)(S, 1);\n break;\n\n case "Home":\n t = (0, n.startOfWeek)(S);\n break;\n\n case "End":\n t = (0, n.endOfWeek)(S);\n break;\n\n case "PageDown":\n t = e.shiftKey ? (0, n.addYears)(S, 1) : (0, n.addMonths)(S, 1);\n break;\n\n case "PageUp":\n t = e.shiftKey ? (0, n.subYears)(S, 1) : (0, n.subMonths)(S, 1);\n break;\n\n default:\n return;\n }\n\n if (void 0 !== t) {\n var r = (0, n.keepDateBetweenMinAndMax)(t, m, y);\n (0, n.isSameDay)(S, r) || x(t);\n }\n\n e.preventDefault();\n }, ue = function ue(e) {\n e !== S && x(e);\n }, ce = [], se = (0, n.startOfWeek)($); ce.length < 28 || se.getMonth() === B || ce.length % 7 != 0;) {\n var de = (0, n.isSameDay)(se, U);\n ce.push(a.default.createElement(o.Day, {\n date: se,\n onClick: s,\n onKeyDown: le,\n onMouseMove: ue,\n ref: de ? w : null,\n isDisabled: !(0, n.isDateWithinMinAndMax)(se, m, y),\n isSelected: r && (0, n.isSameDay)(se, r),\n isFocused: de,\n isPrevMonth: (0, n.isSameMonth)(se, J),\n isFocusedMonth: (0, n.isSameMonth)(se, U),\n isNextMonth: (0, n.isSameMonth)(se, q),\n isToday: (0, n.isSameDay)(se, (0, n.today)()),\n isRangeDate: b && (0, n.isSameDay)(se, b),\n isRangeStart: ae && (0, n.isSameDay)(se, ae),\n isRangeEnd: ne && (0, n.isSameDay)(se, ne),\n isWithinRange: oe && ie && (0, n.isDateWithinMinAndMax)(se, oe, ie),\n i18n: _\n })), se = (0, n.addDays)(se, 1);\n }\n\n return a.default.createElement("div", {\n tabIndex: -1,\n className: "usa-date-picker__calendar__date-picker",\n "data-testid": "calendar-date-picker",\n ref: I,\n onKeyDown: function onKeyDown(e) {\n (0, n.handleTabKey)(e, [null == h ? void 0 : h.current, null == j ? void 0 : j.current, null == E ? void 0 : E.current, null == P ? void 0 : P.current, null == M ? void 0 : M.current, null == N ? void 0 : N.current, null == w ? void 0 : w.current]);\n }\n }, a.default.createElement("div", {\n className: "usa-date-picker__calendar__row"\n }, a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "previous-year",\n onClick: function onClick() {\n var e = (0, n.subYears)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([h.current, I.current]);\n },\n ref: h,\n className: "usa-date-picker__calendar__previous-year",\n "aria-label": G,\n disabled: ee\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "previous-month",\n onClick: function onClick() {\n var e = (0, n.subMonths)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([j.current, I.current]);\n },\n ref: j,\n className: "usa-date-picker__calendar__previous-month",\n "aria-label": H,\n disabled: ee\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__month-label"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "select-month",\n onClick: function onClick() {\n T(f);\n var e = _.selectAMonth;\n v([e]);\n },\n ref: E,\n className: "usa-date-picker__calendar__month-selection",\n "aria-label": Q\n }, z), a.default.createElement("button", {\n type: "button",\n "data-testid": "select-year",\n onClick: function onClick() {\n T(p);\n },\n ref: P,\n className: "usa-date-picker__calendar__year-selection",\n "aria-label": K\n }, W)), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "next-month",\n onClick: function onClick() {\n var e = (0, n.addMonths)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([M.current, I.current]);\n },\n ref: M,\n className: "usa-date-picker__calendar__next-month",\n "aria-label": Z,\n disabled: te\n }, " ")), a.default.createElement("div", {\n className: "usa-date-picker__calendar__cell usa-date-picker__calendar__cell--center-items"\n }, a.default.createElement("button", {\n type: "button",\n "data-testid": "next-year",\n onClick: function onClick() {\n var e = (0, n.addYears)(S, 1);\n e = (0, n.keepDateBetweenMinAndMax)(e, m, y), x(e), F([N.current, I.current]);\n },\n ref: N,\n className: "usa-date-picker__calendar__next-year",\n "aria-label": X,\n disabled: te\n }, " "))), a.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, a.default.createElement("thead", null, a.default.createElement("tr", null, Y.map(function (e, t) {\n return a.default.createElement("th", {\n className: "usa-date-picker__calendar__day-of-week",\n scope: "col",\n "aria-label": V[parseInt("" + t)],\n key: "day-of-week-" + e + "-" + t\n }, e);\n }))), a.default.createElement("tbody", null, (0, n.listToTable)(ce, 7))));\n };\n\n t.Calendar = m, m.displayName = "Calendar";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Day = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(3),\n l = r(9);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = (0, n.forwardRef)(function (e, t) {\n var r = e.date,\n a = e.onClick,\n u = e.onKeyDown,\n c = e.onMouseMove,\n s = e.isDisabled,\n d = void 0 !== s && s,\n f = e.isSelected,\n p = void 0 !== f && f,\n m = e.isFocused,\n y = void 0 !== m && m,\n b = e.isPrevMonth,\n v = void 0 !== b && b,\n O = e.isFocusedMonth,\n g = void 0 !== O && O,\n _ = e.isNextMonth,\n h = void 0 !== _ && _,\n j = e.isToday,\n M = void 0 !== j && j,\n N = e.isRangeDate,\n E = void 0 !== N && N,\n P = e.isRangeStart,\n w = void 0 !== P && P,\n I = e.isRangeEnd,\n D = void 0 !== I && I,\n S = e.isWithinRange,\n x = void 0 !== S && S,\n k = e.i18n,\n A = void 0 === k ? l.EN_US : k,\n T = r.getDate(),\n L = r.getMonth(),\n C = r.getFullYear(),\n F = r.getDay(),\n R = (0, i.formatDate)(r),\n U = y ? 0 : -1,\n B = (0, o.default)("usa-date-picker__calendar__date", {\n "usa-date-picker__calendar__date--previous-month": v,\n "usa-date-picker__calendar__date--current-month": g,\n "usa-date-picker__calendar__date--next-month": h,\n "usa-date-picker__calendar__date--selected": p,\n "usa-date-picker__calendar__date--today": M,\n "usa-date-picker__calendar__date--focused": y,\n "usa-date-picker__calendar__date--range-date": E,\n "usa-date-picker__calendar__date--range-date-start": w,\n "usa-date-picker__calendar__date--range-date-end": D,\n "usa-date-picker__calendar__date--within-range": x\n }),\n W = A.months[parseInt("" + L)],\n z = A.daysOfWeek[parseInt("" + F)];\n return n.default.createElement("button", {\n type: "button",\n "data-testid": "select-date",\n ref: t,\n onClick: function onClick() {\n a(R);\n },\n tabIndex: U,\n className: B,\n "data-day": T,\n "data-month": L + 1,\n "data-year": C,\n "data-value": R,\n "aria-label": T + " " + W + " " + C + " " + z,\n "aria-selected": !!p,\n disabled: d,\n onKeyDown: function onKeyDown(e) {\n u(e);\n },\n onMouseMove: g ? function () {\n d || (0, i.isIosDevice)() || c(r);\n } : void 0\n }, T);\n });\n t.Day = c, c.displayName = "Day";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.MonthPicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(3),\n l = r(9);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = function c(e) {\n var t = e.date,\n r = e.minDate,\n a = e.maxDate,\n u = e.handleSelectMonth,\n c = e.i18n,\n s = void 0 === c ? l.EN_US : c,\n d = t.getMonth(),\n f = (0, n.useState)(d),\n p = f[0],\n m = f[1],\n y = (0, n.useRef)(null),\n b = (0, n.useRef)(null);\n (0, n.useEffect)(function () {\n var e = y.current && y.current.querySelector(\'[data-value="\' + p + \'"]\');\n e && e.focus();\n }, [p]);\n\n var v = function v(e) {\n var n,\n o,\n l = e.target,\n u = parseInt((null === (n = l.dataset) || void 0 === n ? void 0 : n.value) || "", 10),\n c = (0, i.setMonth)(t, u);\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n o = u - 3;\n break;\n\n case "ArrowDown":\n case "Down":\n o = u + 3;\n break;\n\n case "ArrowLeft":\n case "Left":\n o = u - 1;\n break;\n\n case "ArrowRight":\n case "Right":\n o = u + 1;\n break;\n\n case "Home":\n o = u - u % 3;\n break;\n\n case "End":\n o = u + 2 - u % 3;\n break;\n\n case "PageDown":\n o = 11;\n break;\n\n case "PageUp":\n o = 0;\n break;\n\n default:\n return;\n }\n\n if (void 0 !== o) {\n o = Math.max(0, Math.min(11, o));\n var s = (0, i.setMonth)(t, o),\n d = (0, i.keepDateBetweenMinAndMax)(s, r, a);\n (0, i.isSameMonth)(c, d) || m(d.getMonth());\n }\n\n e.preventDefault();\n },\n O = s.months.map(function (e, l) {\n var c = (0, i.setMonth)(t, l),\n s = (0, i.isDatesMonthOutsideMinOrMax)(c, r, a),\n f = l === d,\n y = l === p,\n O = y ? 0 : -1,\n g = (0, o.default)("usa-date-picker__calendar__month", {\n "usa-date-picker__calendar__month--selected": f,\n "usa-date-picker__calendar__month--focused": y\n });\n return n.default.createElement("button", {\n type: "button",\n key: "selectMonth_" + e,\n ref: y ? b : null,\n tabIndex: O,\n className: g,\n "data-value": l,\n "data-label": e,\n "aria-selected": f,\n disabled: s,\n onClick: function onClick() {\n u(l);\n },\n onKeyDown: v,\n onMouseMove: function onMouseMove() {\n s || (0, i.isIosDevice)() || l !== p && m(l);\n }\n }, e);\n });\n\n return n.default.createElement("div", {\n tabIndex: -1,\n "data-testid": "calendar-month-picker",\n className: "usa-date-picker__calendar__month-picker",\n ref: y,\n onKeyDown: function onKeyDown(e) {\n (0, i.handleTabKey)(e, [null == b ? void 0 : b.current]);\n }\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, (0, i.listToTable)(O, 3))));\n };\n\n t.MonthPicker = c, c.displayName = "MonthPicker";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.YearPicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(6),\n l = r(3);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var c = function c(e) {\n var t = e.date,\n r = e.minDate,\n a = e.maxDate,\n u = e.handleSelectYear,\n c = e.setStatuses,\n s = (0, n.useRef)(null),\n d = (0, n.useRef)(null),\n f = (0, n.useRef)(null),\n p = (0, n.useRef)(null),\n m = t.getFullYear(),\n y = (0, n.useState)(m),\n b = y[0],\n v = y[1],\n O = (0, n.useState)([null, null]),\n g = O[0],\n _ = O[1],\n h = b;\n h -= h % i.YEAR_CHUNK, h = Math.max(0, h);\n var j = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, h - 1), r, a),\n M = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, h + i.YEAR_CHUNK), r, a);\n (0, n.useEffect)(function () {\n var e = "Showing years " + h + " to " + (h + i.YEAR_CHUNK - 1) + ". Select a year.";\n c([e]);\n var t = g[0],\n r = g[1];\n if (t && r) t.disabled ? r.focus() : t.focus(), _([null, null]);else {\n var a = p.current && p.current.querySelector(".usa-date-picker__calendar__year--focused");\n a && a.focus();\n }\n }, [b]), (0, n.useEffect)(function () {\n var e = p.current && p.current.querySelector(\'[data-value="\' + b + \'"]\');\n e && e.focus();\n }, []);\n\n for (var N = function N(e) {\n var n,\n o,\n u = e.target,\n c = parseInt((null === (n = u.dataset) || void 0 === n ? void 0 : n.value) || "", 10),\n s = (0, l.setYear)(t, c);\n\n switch (e.key) {\n case "ArrowUp":\n case "Up":\n o = c - 3;\n break;\n\n case "ArrowDown":\n case "Down":\n o = c + 3;\n break;\n\n case "ArrowLeft":\n case "Left":\n o = c - 1;\n break;\n\n case "ArrowRight":\n case "Right":\n o = c + 1;\n break;\n\n case "Home":\n o = c - c % 3;\n break;\n\n case "End":\n o = c + 2 - c % 3;\n break;\n\n case "PageDown":\n o = c + i.YEAR_CHUNK;\n break;\n\n case "PageUp":\n o = c - i.YEAR_CHUNK;\n break;\n\n default:\n return;\n }\n\n if (void 0 !== o) {\n o = Math.max(0, o);\n var d = (0, l.setYear)(t, o),\n f = (0, l.keepDateBetweenMinAndMax)(d, r, a);\n (0, l.isSameYear)(s, f) || v(f.getFullYear());\n }\n\n e.preventDefault();\n }, E = [], P = h, w = function w() {\n var e = P,\n i = (0, l.isDatesYearOutsideMinOrMax)((0, l.setYear)(t, e), r, a),\n c = e === m,\n s = e === b,\n d = s ? 0 : -1,\n p = (0, o.default)("usa-date-picker__calendar__year", {\n "usa-date-picker__calendar__year--selected": c,\n "usa-date-picker__calendar__year--focused": s\n });\n E.push(n.default.createElement("button", {\n type: "button",\n tabIndex: d,\n ref: s ? f : null,\n className: p,\n "data-value": e,\n "aria-selected": c,\n disabled: i,\n onClick: function onClick() {\n u(e);\n },\n onKeyDown: N,\n onMouseMove: function onMouseMove() {\n i || (0, l.isIosDevice)() || e !== b && v(e);\n }\n }, e)), P += 1;\n }; E.length < i.YEAR_CHUNK;) {\n w();\n }\n\n return n.default.createElement("div", {\n tabIndex: -1,\n className: "usa-date-picker__calendar__year-picker",\n "data-testid": "calendar-year-picker",\n ref: p,\n onKeyDown: function onKeyDown(e) {\n (0, l.handleTabKey)(e, [null == s ? void 0 : s.current, null == f ? void 0 : f.current, null == d ? void 0 : d.current]);\n }\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, n.default.createElement("tr", null, n.default.createElement("td", null, n.default.createElement("button", {\n type: "button",\n "data-testid": "previous-year-chunk",\n className: "usa-date-picker__calendar__previous-year-chunk",\n "aria-label": "Navigate back " + i.YEAR_CHUNK + " years",\n disabled: j,\n onClick: function onClick() {\n var e = b - i.YEAR_CHUNK;\n e = Math.max(0, e);\n var n = (0, l.setYear)(t, e);\n n = (0, l.keepDateBetweenMinAndMax)(n, r, a), _([s.current, p.current]), v(n.getFullYear());\n },\n ref: s\n }, " ")), n.default.createElement("td", {\n colSpan: 3\n }, n.default.createElement("table", {\n className: "usa-date-picker__calendar__table",\n role: "presentation"\n }, n.default.createElement("tbody", null, (0, l.listToTable)(E, 3)))), n.default.createElement("td", null, n.default.createElement("button", {\n type: "button",\n "data-testid": "next-year-chunk",\n className: "usa-date-picker__calendar__next-year-chunk",\n "aria-label": "Navigate forward " + i.YEAR_CHUNK + " years",\n disabled: M,\n onClick: function onClick() {\n var e = b + i.YEAR_CHUNK;\n e = Math.max(0, e);\n var n = (0, l.setYear)(t, e);\n n = (0, l.keepDateBetweenMinAndMax)(n, r, a), _([d.current, p.current]), v(n.getFullYear());\n },\n ref: d\n }, " "))))));\n };\n\n t.YearPicker = c, c.displayName = "YearPicker";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.DateRangePicker = void 0;\n\n var a,\n n = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n o = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = d(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n i = r(6),\n l = r(12),\n u = r(3),\n c = r(8),\n s = r(5);\n\n function d(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (d = function d(e) {\n return e ? r : t;\n })(e);\n }\n\n var _f2 = function f() {\n return (_f2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.DateRangePicker = function (e) {\n var t,\n r,\n a,\n d,\n p,\n m,\n y = e.startDateLabel,\n b = e.startDateHint,\n v = e.startDatePickerProps,\n O = e.endDateLabel,\n g = e.endDateHint,\n _ = e.endDatePickerProps,\n h = e.className,\n j = (0, o.useState)(v.defaultValue),\n M = j[0],\n N = j[1],\n E = (0, o.useState)(_.defaultValue),\n P = E[0],\n w = E[1],\n I = function I(e, t) {\n return function (r) {\n var a = r && (0, u.parseDateString)(r, i.DEFAULT_EXTERNAL_DATE_FORMAT);\n\n if (a) {\n var n = (0, u.formatDate)(a);\n t(n);\n } else t(r);\n\n e && e(r);\n };\n },\n D = I(v.onChange, N),\n S = I(_.onChange, w),\n x = (0, n.default)(h, "usa-date-range-picker"),\n k = (0, n.default)(v.className, "usa-date-range-picker__range-start"),\n A = (0, n.default)(_.className, "usa-date-range-picker__range-end"),\n T = v.id + "-label",\n L = v.id + "-hint",\n C = [y && T, b && L].join(" ").trim() || void 0,\n F = _.id + "-label",\n R = _.id + "-hint",\n U = [O && F, g && R].join(" ").trim() || void 0;\n\n return o.default.createElement("div", {\n className: x,\n "data-testid": "date-range-picker"\n }, o.default.createElement(c.FormGroup, null, y && o.default.createElement(s.Label, {\n id: T,\n htmlFor: v.id\n }, y), b && o.default.createElement("div", {\n className: "usa-hint",\n id: L\n }, b), o.default.createElement(l.DatePicker, _f2({\n className: k,\n rangeDate: P\n }, v, {\n "aria-describedby": C,\n onChange: D,\n maxDate: (d = v.maxDate, p = d && (0, u.parseDateString)(d), m = P && (0, u.parseDateString)(P), m && p ? m.getTime() < p.getTime() ? (0, u.formatDate)(m) : (0, u.formatDate)(p) : m && (0, u.formatDate)(m) || p && (0, u.formatDate)(p) || void 0)\n }))), o.default.createElement(c.FormGroup, null, O && o.default.createElement(s.Label, {\n id: F,\n htmlFor: _.id\n }, O), g && o.default.createElement("div", {\n className: "usa-hint",\n id: R\n }, g), o.default.createElement(l.DatePicker, _f2({\n className: A,\n rangeDate: M\n }, _, {\n "aria-describedby": U,\n onChange: S,\n minDate: (t = _.minDate, r = t && (0, u.parseDateString)(t), a = M && (0, u.parseDateString)(M), a && r ? a.getTime() > r.getTime() ? (0, u.formatDate)(a) : (0, u.formatDate)(r) : a && (0, u.formatDate)(a) || r && (0, u.formatDate)(r) || void 0)\n }))));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Dropdown = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i18 = function i() {\n return (_i18 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.inputRef,\n c = e.children,\n s = l(e, ["id", "name", "className", "inputRef", "children"]),\n d = (0, n.default)("usa-select", o);\n return a.default.createElement("select", _i18({\n "data-testid": "dropdown",\n className: d,\n id: t,\n name: r,\n ref: u\n }, s), c);\n };\n\n t.Dropdown = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ErrorMessage = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var i = function i(e) {\n var t = e.children,\n r = e.className,\n o = e.id,\n i = (0, n.default)("usa-error-message", r);\n return a.default.createElement("span", {\n "data-testid": "errorMessage",\n className: i,\n id: o,\n role: "alert"\n }, t);\n };\n\n t.ErrorMessage = i;\n var l = i;\n t.default = l;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Fieldset = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.Fieldset = function (e) {\n var t = e.children,\n r = e.legend,\n i = e.className,\n l = e.legendSrOnly,\n u = e.legendStyle,\n c = void 0 === u ? "default" : u,\n s = (0, n.default)("usa-fieldset", i);\n l && (0, o.deprecationWarning)("Fieldset property legendSrOnly is deprecated. Use legendStyle = \'srOnly\'.");\n var d = (0, n.default)({\n "usa-legend": "default" === c,\n "usa-legend--large": "large" === c,\n "usa-sr-only": "srOnly" === c || l\n });\n return a.default.createElement("fieldset", {\n "data-testid": "fieldset",\n className: s\n }, r && a.default.createElement("legend", {\n className: d\n }, r), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FileInput = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = u(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(62),\n l = r(63);\n\n function u(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (u = function u(e) {\n return e ? r : t;\n })(e);\n }\n\n var _c3 = function c() {\n return (_c3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n s = function s(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n d = (0, n.forwardRef)(function (e, t) {\n var r = e.name,\n a = e.id,\n u = e.disabled,\n d = e.multiple,\n f = e.className,\n p = e.accept,\n m = e.onChange,\n y = e.onDrop,\n b = s(e, ["name", "id", "disabled", "multiple", "className", "accept", "onChange", "onDrop"]),\n v = (0, n.useRef)(null),\n O = (0, n.useState)(!1),\n g = O[0],\n _ = O[1],\n h = (0, n.useState)(!1),\n j = h[0],\n M = h[1],\n N = (0, n.useState)([]),\n E = N[0],\n P = N[1];\n (0, n.useImperativeHandle)(t, function () {\n return {\n input: v.current,\n clearFiles: function clearFiles() {\n return P([]);\n },\n files: E\n };\n }, [E]);\n var w = (0, o.default)("usa-file-input", {\n "usa-file-input--disabled": u\n }, f),\n I = (0, o.default)("usa-file-input__target", {\n "usa-file-input--drag": g,\n "has-invalid-file": j\n }),\n D = /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent),\n S = d ? "Drag files here or " : "Drag file here or ",\n x = [];\n if (E) for (var k = 0; k < (null == E ? void 0 : E.length); k++) {\n var A = (0, l.makeSafeForID)(E[parseInt("" + k)].name),\n T = "filePreview_" + A;\n x.push(n.default.createElement(i.FilePreview, {\n key: T,\n imageId: A,\n file: E[parseInt("" + k)]\n }));\n }\n var L = (0, o.default)("usa-file-input__instructions", {\n "display-none": x.length > 0\n }),\n C = x.length > 1 ? x.length + " files selected" : "Selected file";\n return n.default.createElement("div", {\n "data-testid": "file-input",\n className: w,\n "aria-disabled": u\n }, n.default.createElement("div", {\n "data-testid": "file-input-droptarget",\n className: I,\n onDragOver: function onDragOver() {\n return _(!0);\n },\n onDragLeave: function onDragLeave() {\n return _(!1);\n },\n onDrop: function onDrop(e) {\n !function (e) {\n if (M(!1), p) {\n for (var t = p.split(","), r = !0, a = 0; a < e.dataTransfer.files.length; a += 1) {\n var n = e.dataTransfer.files[parseInt("" + a)];\n if (!r) break;\n\n for (var o = 0; o < t.length; o += 1) {\n var i = t[parseInt("" + o)];\n if (r = n.name.indexOf(i) > 0 || n.type.includes(i.replace(/\\*/g, ""))) break;\n }\n }\n\n r || (P([]), M(!0), e.preventDefault(), e.stopPropagation());\n }\n }(e), _(!1), y && y(e);\n }\n }, x.length > 0 && n.default.createElement("div", {\n "data-testid": "file-input-preview-heading",\n className: "usa-file-input__preview-heading"\n }, C, " ", n.default.createElement("span", {\n className: "usa-file-input__choose"\n }, "Change file", x.length > 1 && "s")), n.default.createElement("div", {\n "data-testid": "file-input-instructions",\n className: L,\n "aria-hidden": "true"\n }, !D && n.default.createElement("span", {\n className: "usa-file-input__drag-text"\n }, S), n.default.createElement("span", {\n className: "usa-file-input__choose"\n }, "choose from folder")), x, n.default.createElement("div", {\n "data-testid": "file-input-box",\n className: "usa-file-input__box"\n }), j && n.default.createElement("div", {\n "data-testid": "file-input-error",\n className: "usa-file-input__accepted-files-message"\n }, "This is not a valid file type."), n.default.createElement("input", _c3({}, b, {\n ref: v,\n type: "file",\n "data-testid": "file-input-input",\n name: r,\n id: a,\n className: "usa-file-input__input",\n disabled: u,\n onChange: function onChange(e) {\n var t, r, a, n;\n M(!1);\n var o = [];\n if (null === (r = null === (t = e.target) || void 0 === t ? void 0 : t.files) || void 0 === r ? void 0 : r.length) for (var i = (null === (n = null === (a = e.target) || void 0 === a ? void 0 : a.files) || void 0 === n ? void 0 : n.length) || 0, l = 0; l < i; l++) {\n var u = e.target.files.item(l);\n u && o.push(u);\n }\n P(o), m && m(e);\n },\n multiple: d,\n accept: p\n }))));\n });\n\n t.FileInput = d;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FilePreview = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = i(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var l = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n l && (l.get || l.set) ? Object.defineProperty(a, o, l) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n };\n\n function i(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (i = function i(e) {\n return e ? r : t;\n })(e);\n }\n\n var l = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";\n\n t.FilePreview = function (e) {\n var t = e.imageId,\n r = e.file,\n a = (0, n.useRef)(new FileReader()),\n i = (0, n.useState)(!0),\n u = i[0],\n c = i[1],\n s = (0, n.useState)(l),\n d = s[0],\n f = s[1],\n p = (0, n.useState)(!1),\n m = p[0],\n y = p[1];\n (0, n.useEffect)(function () {\n return a.current.onloadend = function () {\n c(!1), f(a.current.result);\n }, a.current.readAsDataURL(r), function () {\n a.current.onloadend = null;\n };\n }, []);\n\n var b = r.name,\n v = b.indexOf(".pdf") > 0,\n O = b.indexOf(".doc") > 0 || b.indexOf(".pages") > 0,\n g = b.indexOf(".mov") > 0 || b.indexOf(".mp4") > 0,\n _ = b.indexOf(".xls") > 0 || b.indexOf(".numbers") > 0,\n h = !(v || O || g || _),\n j = (0, o.default)("usa-file-input__preview-image", {\n "is-loading": u,\n "usa-file-input__preview-image--pdf": m && v,\n "usa-file-input__preview-image--word": m && O,\n "usa-file-input__preview-image--video": m && g,\n "usa-file-input__preview-image--excel": m && _,\n "usa-file-input__preview-image--generic": m && h\n });\n\n return n.default.createElement("div", {\n "data-testid": "file-input-preview",\n className: "usa-file-input__preview",\n "aria-hidden": "true"\n }, n.default.createElement("img", {\n id: t,\n "data-testid": "file-input-preview-image",\n src: d,\n alt: "",\n className: j,\n onError: function onError() {\n f(l), y(!0);\n }\n }), b);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.makeSafeForID = void 0;\n\n t.makeSafeForID = function (e) {\n return e.replace(/[^a-z0-9]/g, function (e) {\n var t = e.charCodeAt(0);\n return 32 === t ? "-" : t >= 65 && t <= 90 ? "img_" + e.toLowerCase() : "__" + t.toString(16).slice(-4);\n });\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Radio = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i19 = function i() {\n return (_i19 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.id,\n r = e.name,\n o = e.className,\n u = e.label,\n c = e.inputRef,\n s = e.tile,\n d = e.labelDescription,\n f = l(e, ["id", "name", "className", "label", "inputRef", "tile", "labelDescription"]),\n p = (0, n.default)("usa-radio", o),\n m = (0, n.default)("usa-radio__input", {\n "usa-radio__input--tile": s\n });\n return a.default.createElement("div", {\n "data-testid": "radio",\n className: p\n }, a.default.createElement("input", _i19({\n className: m,\n id: t,\n type: "radio",\n name: r,\n ref: c\n }, f)), a.default.createElement("label", {\n className: "usa-radio__label",\n htmlFor: t\n }, u, d && a.default.createElement("span", {\n className: "usa-checkbox__label-description"\n }, d)));\n };\n\n t.Radio = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.RangeInput = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i20 = function i() {\n return (_i20 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.inputRef,\n o = l(e, ["className", "inputRef"]),\n u = (0, n.default)("usa-range", t);\n return a.default.createElement("input", _i20({\n "data-testid": "range",\n className: u,\n ref: r,\n type: "range"\n }, o));\n };\n\n t.RangeInput = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.TimePicker = void 0;\n\n var a,\n n = function (e, t) {\n if (!t && e && e.__esModule) return e;\n if (null === e || "object" != typeof e && "function" != typeof e) return {\n default: e\n };\n var r = d(t);\n if (r && r.has(e)) return r.get(e);\n var a = {},\n n = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var o in e) {\n if ("default" !== o && Object.prototype.hasOwnProperty.call(e, o)) {\n var i = n ? Object.getOwnPropertyDescriptor(e, o) : null;\n i && (i.get || i.set) ? Object.defineProperty(a, o, i) : a[o] = e[o];\n }\n }\n\n a.default = e, r && r.set(e, a);\n return a;\n }(r(0)),\n o = (a = r(1)) && a.__esModule ? a : {\n default: a\n },\n i = r(8),\n l = r(5),\n u = r(11),\n c = r(67),\n s = r(68);\n\n function d(e) {\n if ("function" != typeof WeakMap) return null;\n var t = new WeakMap(),\n r = new WeakMap();\n return (d = function d(e) {\n return e ? r : t;\n })(e);\n }\n\n t.TimePicker = function (e) {\n var t = e.id,\n r = e.name,\n a = e.onChange,\n d = e.label,\n f = e.defaultValue,\n p = e.disabled,\n m = e.minTime,\n y = void 0 === m ? s.DEFAULT_MIN_TIME : m,\n b = e.maxTime,\n v = void 0 === b ? s.DEFAULT_MAX_TIME : b,\n O = e.step,\n g = void 0 === O ? s.DEFAULT_STEP : O,\n _ = e.hint,\n h = e.className,\n j = (0, o.default)("usa-time-picker", h),\n M = (0, c.parseTimeString)(y) || s.DEFAULT_MIN_TIME_MINUTES,\n N = (0, c.parseTimeString)(v) || s.DEFAULT_MAX_TIME_MINUTES,\n E = g < s.MIN_STEP ? s.MIN_STEP : g,\n P = (0, n.useMemo)(function () {\n return (0, c.getTimeOptions)(M, N, E);\n }, [y, v, g]),\n w = r + "-label",\n I = r + "-hint";\n return n.default.createElement(i.FormGroup, null, n.default.createElement(l.Label, {\n className: "usa-label",\n id: w,\n htmlFor: t\n }, d), _ && n.default.createElement("div", {\n className: "usa-hint",\n id: I\n }, _), n.default.createElement(u.ComboBox, {\n id: t,\n name: r,\n className: j,\n onChange: a,\n defaultValue: f,\n options: P,\n disabled: p,\n customFilter: s.TIME_PICKER_CUSTOM_FILTER,\n disableFiltering: !0\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.getTimeOptions = t.parseTimeString = void 0;\n\n t.parseTimeString = function (e) {\n var t;\n\n if (e) {\n var r = e.split(":").map(function (e) {\n var t,\n r = parseInt(e, 10);\n return Number.isNaN(r) || (t = r), t;\n }),\n a = r[0],\n n = r[1];\n null != a && null != n && (t = 60 * a + n);\n }\n\n return t;\n };\n\n var a = function a(e) {\n var t = e % 60,\n r = Math.floor(e / 60);\n return {\n minute: t,\n hour24: r,\n hour12: r % 12 || 12,\n ampm: r < 12 ? "am" : "pm"\n };\n },\n n = function n(e, t) {\n return ("0000" + e).slice(-t);\n };\n\n t.getTimeOptions = function (e, t, r) {\n for (var o = [], i = e; i <= t; i += r) {\n var l = a(i),\n u = l.minute,\n c = l.hour24,\n s = l.hour12,\n d = l.ampm;\n o.push({\n value: n(c, 2) + ":" + n(u, 2),\n label: s + ":" + n(u, 2) + d\n });\n }\n\n return o;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.TIME_PICKER_CUSTOM_FILTER = t.MIN_STEP = t.DEFAULT_STEP = t.DEFAULT_MIN_TIME_MINUTES = t.DEFAULT_MIN_TIME = t.DEFAULT_MAX_TIME_MINUTES = t.DEFAULT_MAX_TIME = void 0;\n t.DEFAULT_MAX_TIME = "23:59";\n t.DEFAULT_MAX_TIME_MINUTES = 1439;\n t.DEFAULT_MIN_TIME = "00:00";\n t.DEFAULT_MIN_TIME_MINUTES = 0;\n t.DEFAULT_STEP = 30;\n t.MIN_STEP = 1;\n t.TIME_PICKER_CUSTOM_FILTER = {\n filter: "0?{{ hourQueryFilter }}:{{minuteQueryFilter}}.*{{ apQueryFilter }}m?",\n extras: {\n apQueryFilter: "([ap])",\n hourQueryFilter: "([1-9][0-2]?)",\n minuteQueryFilter: "[\\\\d]+:([0-9]{0,2})"\n }\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ValidationChecklist = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i21 = function i() {\n return (_i21 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)(r, "usa-checklist");\n return a.default.createElement("ul", _i21({\n className: u,\n "data-testid": "validationChecklist"\n }, o), t);\n };\n\n t.ValidationChecklist = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ValidationItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i22 = function i() {\n return (_i22 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = e.isValid,\n u = l(e, ["children", "className", "isValid"]),\n c = (0, n.default)("usa-checklist__item", {\n "usa-checklist__item--checked": o\n }, r);\n return a.default.createElement("li", _i22({\n className: c\n }, u), t);\n };\n\n t.ValidationItem = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ExtendedNav = void 0;\n var a = l(r(0)),\n n = l(r(1)),\n o = r(13),\n i = r(4);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u2 = function u() {\n return (_u2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n s = function s(e) {\n var t = e.primaryItems,\n r = e.secondaryItems,\n l = e.mobileExpanded,\n s = void 0 !== l && l,\n d = e.children,\n f = e.className,\n p = e.onToggleMobileNav,\n m = c(e, ["primaryItems", "secondaryItems", "mobileExpanded", "children", "className", "onToggleMobileNav"]),\n y = (0, n.default)("usa-nav", {\n "is-visible": s\n }, f);\n return a.default.createElement("nav", _u2({\n className: y\n }, m), a.default.createElement("div", {\n className: "usa-nav__inner"\n }, a.default.createElement(o.NavCloseButton, {\n onClick: p\n }), a.default.createElement(i.NavList, {\n items: t,\n type: "primary"\n }), a.default.createElement("div", {\n className: "usa-nav__secondary"\n }, a.default.createElement(i.NavList, {\n items: r,\n type: "secondary"\n }), d)));\n };\n\n t.ExtendedNav = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n r.r(t), t.default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiPjx0aXRsZT5jbG9zZTwvdGl0bGU+PHBhdGggZmlsbD0iIzU2NUM2NSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTcuMDQyIDEuMTVsNS44MDkgNS44MDhhNCA0IDAgMCAxIDAgNS42NTdMNDMuNDY1IDMybDE5LjM4NiAxOS4zODVhNCA0IDAgMCAxIDAgNS42NTdsLTUuODA5IDUuODA5YTQgNCAwIDAgMS01LjY1NyAwTDMyIDQzLjQ2NSAxMi42MTUgNjIuODUxYTQgNCAwIDAgMS01LjY1NyAwbC01LjgwOS01LjgwOWE0IDQgMCAwIDEgMC01LjY1N0wyMC41MzUgMzIgMS4xNDkgMTIuNjE1YTQgNCAwIDAgMSAwLTUuNjU3bDUuODA5LTUuODA5YTQgNCAwIDAgMSA1LjY1NyAwTDMyIDIwLjUzNSA1MS4zODUgMS4xNDlhNCA0IDAgMCAxIDUuNjU3IDB6Ii8+PC9zdmc+";\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Header = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i23 = function i() {\n return (_i23 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Header = function (e) {\n var t = e.basic,\n r = e.extended,\n o = e.basicWithMegaMenu,\n u = e.children,\n c = e.className,\n s = l(e, ["basic", "extended", "basicWithMegaMenu", "children", "className"]),\n d = (0, n.default)("usa-header", {\n "usa-header--basic": t,\n "usa-header--megamenu": o,\n "usa-header--extended": r\n }, c);\n return a.default.createElement("header", _i23({\n "data-testid": "header",\n className: d\n }, s), u);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.MegaMenu = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(4);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l9 = function l() {\n return (_l9 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.items,\n r = e.isOpen,\n i = e.className,\n c = u(e, ["items", "isOpen", "className"]),\n s = (0, n.default)("usa-nav__submenu usa-megamenu", i);\n return a.default.createElement("div", {\n className: s,\n hidden: !r,\n "data-testid": "megamenu"\n }, a.default.createElement("div", {\n className: "grid-row grid-gap-4"\n }, t.map(function (e, t) {\n return a.default.createElement("div", {\n className: "usa-col",\n key: "subnav_col_" + t\n }, a.default.createElement(o.NavList, _l9({\n items: e,\n type: "megamenu"\n }, c)));\n })));\n };\n\n t.MegaMenu = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Menu = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n },\n o = r(4);\n\n var _i24 = function i() {\n return (_i24 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.items,\n a = e.isOpen,\n u = l(e, ["className", "items", "isOpen"]);\n return n.default.createElement(o.NavList, _i24({\n className: t,\n items: r,\n type: "subnav",\n hidden: !a\n }, u));\n };\n\n t.Menu = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.NavMenuButton = void 0;\n var a,\n n = (a = r(0)) && a.__esModule ? a : {\n default: a\n };\n\n var _o = function o() {\n return (_o = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n i = function i(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.NavMenuButton = function (e) {\n var t = e.label,\n r = e.onClick,\n a = i(e, ["label", "onClick"]);\n return n.default.createElement("button", _o({\n className: "usa-menu-btn",\n onClick: r,\n "data-testid": "navMenuButton"\n }, a, {\n type: "button"\n }), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.NavDropDownButton = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i25 = function i() {\n return (_i25 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.label,\n r = e.menuId,\n o = e.isOpen,\n u = e.onToggle,\n c = e.isCurrent,\n s = e.className,\n d = l(e, ["label", "menuId", "isOpen", "onToggle", "isCurrent", "className"]),\n f = (0, n.default)("usa-accordion__button", "usa-nav__link", {\n "usa-current": c\n }, s);\n return a.default.createElement("button", _i25({\n "data-testid": "navDropDownButton",\n className: f,\n "aria-expanded": o,\n "aria-controls": r,\n onClick: function onClick() {\n return u();\n }\n }, d, {\n type: "button"\n }), a.default.createElement("span", null, t));\n };\n\n t.NavDropDownButton = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.PrimaryNav = void 0;\n var a = l(r(0)),\n n = l(r(1)),\n o = r(13),\n i = r(4);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u3 = function u() {\n return (_u3 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n s = function s(e) {\n var t = e.items,\n r = e.onToggleMobileNav,\n l = e.mobileExpanded,\n s = e.children,\n d = e.className,\n f = c(e, ["items", "onToggleMobileNav", "mobileExpanded", "children", "className"]),\n p = (0, n.default)("usa-nav", {\n "is-visible": l\n }, d);\n return a.default.createElement("nav", _u3({\n className: p\n }, f), a.default.createElement(o.NavCloseButton, {\n onClick: r\n }), a.default.createElement(i.NavList, {\n items: t,\n type: "primary"\n }), s);\n };\n\n t.PrimaryNav = s;\n var d = s;\n t.default = d;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Title = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i26 = function i() {\n return (_i26 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-logo", t);\n return a.default.createElement("div", _i26({\n className: u\n }, o), a.default.createElement("em", {\n className: "usa-logo__text"\n }, r));\n };\n\n t.Title = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Identifier = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i27 = function i() {\n return (_i27 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-identifier", t);\n return a.default.createElement("div", _i27({\n "data-testid": "identifier",\n className: u\n }, o), r);\n };\n\n t.Identifier = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierGov = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i28 = function i() {\n return (_i28 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__section usa-identifier__section--usagov", r);\n return a.default.createElement("section", _i28({\n "data-testid": "identifierGov",\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, t));\n };\n\n t.IdentifierGov = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierIdentity = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i29 = function i() {\n return (_i29 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.domain,\n o = e.className,\n u = l(e, ["children", "domain", "className"]),\n c = (0, n.default)("usa-identifier__identity", o);\n return a.default.createElement("div", _i29({\n "data-testid": "identifierIdentity",\n className: c\n }, u), a.default.createElement("p", {\n className: "usa-identifier__identity-domain"\n }, r), a.default.createElement("p", {\n className: "usa-identifier__identity-disclaimer"\n }, t));\n };\n\n t.IdentifierIdentity = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLink = function (e) {\n var t = e.className,\n r = u(e, ["className"]),\n i = (0, n.default)(t, "usa-identifier__required-link"),\n c = _l10(_l10({}, r), {\n className: i\n });\n\n if ((0, o.isCustomProps)(c)) return a.default.createElement(o.Link, _l10({}, c));\n return a.default.createElement(o.Link, _l10({}, c));\n };\n var a = i(r(0)),\n n = i(r(1)),\n o = r(10);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l10 = function l() {\n return (_l10 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLinkItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i30 = function i() {\n return (_i30 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.IdentifierLinkItem = function (e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__required-links-item", r);\n return a.default.createElement("li", _i30({\n className: u\n }, o), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierLinks = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i31 = function i() {\n return (_i31 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e) {\n var t = e.children,\n r = e.className,\n o = e.navProps,\n l = e.listProps,\n u = (0, n.default)("usa-identifier__section usa-identifier__section--required-links", r);\n return a.default.createElement("nav", _i31({\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, a.default.createElement("ul", _i31({\n className: "usa-identifier__required-links-list"\n }, l), t)));\n };\n\n t.IdentifierLinks = l;\n var u = l;\n t.default = u;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.IdentifierLogo = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i32 = function i() {\n return (_i32 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.IdentifierLogo = function (e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__logo", r);\n return a.default.createElement("a", _i32({\n className: u\n }, o), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierLogos = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i33 = function i() {\n return (_i33 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-identifier__logos", r);\n return a.default.createElement("div", _i33({\n "data-testid": "identifierLogos",\n className: u\n }, o), t);\n };\n\n t.IdentifierLogos = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.IdentifierMasthead = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i34 = function i() {\n return (_i34 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-identifier__section usa-identifier__section--masthead", t);\n return a.default.createElement("section", _i34({\n "data-testid": "identifierMasthead",\n className: u\n }, o), a.default.createElement("div", {\n className: "usa-identifier__container"\n }, r));\n };\n\n t.IdentifierMasthead = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Address = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.Address = function (e) {\n var t = e.size,\n r = e.className,\n i = e.big,\n l = e.medium,\n u = e.slim,\n c = e.items;\n i && (0, o.deprecationWarning)("FooterNav property big is deprecated. Use size"), l && (0, o.deprecationWarning)("FooterNav property medium is deprecated. Use size"), u && (0, o.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n var s = t ? "big" === t : i,\n d = t ? "medium" === t : l,\n f = t ? "slim" === t : u,\n p = (0, n.default)("usa-footer__address", r),\n m = (0, n.default)({\n "grid-col-auto": s || d,\n "grid-col-auto mobile-lg:grid-col-12 desktop:grid-col-auto": f\n });\n return a.default.createElement("address", {\n className: p\n }, f ? a.default.createElement("div", {\n className: "grid-row grid-gap"\n }, c.map(function (e, t) {\n return a.default.createElement("div", {\n className: m,\n key: "addressItem-" + t\n }, a.default.createElement("div", {\n className: "usa-footer__contact-info"\n }, e));\n })) : a.default.createElement("div", {\n className: "usa-footer__contact-info grid-row grid-gap"\n }, c.map(function (e, t) {\n return a.default.createElement("div", {\n className: m,\n key: "addressItem-" + t\n }, e);\n })));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Footer = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l11 = function l() {\n return (_l11 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Footer = function (e) {\n var t = e.size,\n r = e.big,\n i = e.medium,\n c = e.slim,\n s = e.returnToTop,\n d = e.primary,\n f = e.secondary,\n p = u(e, ["size", "big", "medium", "slim", "returnToTop", "primary", "secondary"]);\n r && (0, o.deprecationWarning)("Footer property big is deprecated. Use size"), i && (0, o.deprecationWarning)("Footer property medium is deprecated. Use size"), c && (0, o.deprecationWarning)("Footer property slim is deprecated. Use size");\n var m = t ? "big" === t : r,\n y = t ? "medium" === t : i,\n b = t ? "slim" === t : c,\n v = (0, n.default)("usa-footer", {\n "usa-footer--big": m,\n "usa-footer--medium": y,\n "usa-footer--slim": b\n }, p.className);\n return a.default.createElement("footer", _l11({}, p, {\n className: v\n }), s && s, a.default.createElement("div", {\n className: "usa-footer__primary-section"\n }, d), a.default.createElement("div", {\n className: "usa-footer__secondary-section"\n }, a.default.createElement("div", {\n className: "grid-container"\n }, f)));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.FooterNav = void 0;\n var a = l(r(0)),\n n = r(18),\n o = l(r(1)),\n i = r(2);\n\n function l(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _u4 = function u() {\n return (_u4 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n c = function c(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n function s(e) {\n return e[0].constructor === Array;\n }\n\n t.FooterNav = function (e) {\n var t = e.className,\n r = e.size,\n l = e.big,\n d = e.medium,\n f = e.slim,\n p = e.isMobile,\n m = e.links,\n y = c(e, ["className", "size", "big", "medium", "slim", "isMobile", "links"]);\n l && (0, i.deprecationWarning)("FooterNav property big is deprecated. Use size"), d && (0, i.deprecationWarning)("FooterNav property medium is deprecated. Use size"), f && (0, i.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n\n var b = r ? "big" === r : l,\n v = r ? "medium" === r : d,\n O = r ? "slim" === r : f,\n g = (0, o.default)("usa-footer__nav", t),\n _ = (0, o.default)("desktop:grid-col-auto usa-footer__primary-content", {\n "mobile-lg:grid-col-4": b || v,\n "mobile-lg:grid-col-6": O\n });\n\n return a.default.createElement("nav", _u4({\n className: g\n }, y), b && s(m) && a.default.createElement(n.FooterExtendedNavList, {\n isMobile: p,\n nestedLinks: m\n }), !s(m) && a.default.createElement("ul", {\n className: "grid-row grid-gap"\n }, m.map(function (e, t) {\n return a.default.createElement("li", {\n key: "navLink-" + t,\n className: _\n }, e);\n })));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Logo = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(2);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Logo = function (e) {\n var t = e.size,\n r = e.big,\n i = e.medium,\n u = e.slim,\n c = e.heading,\n s = e.image,\n d = l(e, ["size", "big", "medium", "slim", "heading", "image"]);\n r && (0, o.deprecationWarning)("FooterNav property big is deprecated. Use size"), i && (0, o.deprecationWarning)("FooterNav property medium is deprecated. Use size"), u && (0, o.deprecationWarning)("FooterNav property slim is deprecated. Use size");\n var f = t ? "big" === t : r,\n p = t ? "medium" === t : i,\n m = t ? "slim" === t : u,\n y = (0, n.default)("usa-footer__logo grid-row", {\n "mobile-lg:grid-col-6 mobile-lg:grid-gap-2": f || p,\n "grid-gap-2": m\n }, d.className),\n b = (0, n.default)({\n "mobile-lg:grid-col-auto": f || p,\n "grid-col-auto": m\n });\n return a.default.createElement("div", {\n className: y,\n "data-testid": "footerLogo"\n }, a.default.createElement(a.default.Fragment, null, a.default.createElement("div", {\n className: b\n }, s), c && a.default.createElement("div", {\n className: b\n }, c)));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.SocialLinks = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n t.SocialLinks = function (e) {\n var t = e.className,\n r = e.links,\n o = (0, n.default)("usa-footer__social-links grid-row grid-gap-1", t);\n return a.default.createElement("div", {\n className: o\n }, r.map(function (e, t) {\n return a.default.createElement("div", {\n key: "socialLink" + t,\n className: "grid-col-auto"\n }, e);\n }));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardGroup = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i35 = function i() {\n return (_i35 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.children,\n r = e.className,\n o = l(e, ["children", "className"]),\n u = (0, n.default)("usa-card-group", r);\n return a.default.createElement("ul", _i35({\n className: u,\n "data-testid": "CardGroup"\n }, o), t);\n };\n\n t.CardGroup = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Card = void 0;\n var a = i(r(0)),\n n = i(r(1)),\n o = r(15);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l12 = function l() {\n return (_l12 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n c = function c(e) {\n var t = e.layout,\n r = void 0 === t ? "standardDefault" : t,\n i = e.headerFirst,\n c = e.children,\n s = e.className,\n d = e.gridLayout,\n f = e.containerProps,\n p = u(e, ["layout", "headerFirst", "children", "className", "gridLayout", "containerProps"]),\n m = f || {},\n y = m.className,\n b = u(m, ["className"]),\n v = d && (0, o.applyGridClasses)(d),\n O = (0, n.default)("usa-card", {\n "usa-card--header-first": i,\n "usa-card--flag": "flagDefault" === r || "flagMediaRight" === r,\n "usa-card--media-right": "flagMediaRight" === r\n }, v, s),\n g = (0, n.default)("usa-card__container", y);\n return a.default.createElement("li", _l12({\n className: O,\n "data-testid": "Card"\n }, p), a.default.createElement("div", _l12({\n className: g\n }, b), c));\n };\n\n t.Card = c;\n var s = c;\n t.default = s;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardHeader = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i36 = function i() {\n return (_i36 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__header", {\n "usa-card__header--exdent": t\n }, o);\n return a.default.createElement("header", _i36({\n className: c\n }, u, {\n "data-testid": "CardHeader"\n }), r);\n };\n\n t.CardHeader = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardMedia = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i37 = function i() {\n return (_i37 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.inset,\n o = e.imageClass,\n u = e.children,\n c = e.className,\n s = l(e, ["exdent", "inset", "imageClass", "children", "className"]),\n d = (0, n.default)("usa-card__media", {\n "usa-card__media--exdent": t,\n "usa-card__media--inset": r\n }, c),\n f = (0, n.default)("usa-card__img", o);\n return a.default.createElement("div", _i37({\n className: d\n }, s, {\n "data-testid": "CardMedia"\n }), a.default.createElement("div", {\n className: f\n }, u));\n };\n\n t.CardMedia = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardBody = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i38 = function i() {\n return (_i38 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__body", {\n "usa-card__body--exdent": t\n }, o);\n return a.default.createElement("div", _i38({\n className: c\n }, u, {\n "data-testid": "CardBody"\n }), r);\n };\n\n t.CardBody = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.CardFooter = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i39 = function i() {\n return (_i39 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.exdent,\n r = e.children,\n o = e.className,\n u = l(e, ["exdent", "children", "className"]),\n c = (0, n.default)("usa-card__footer", {\n "usa-card__footer--exdent": t\n }, o);\n return a.default.createElement("div", _i39({\n className: c\n }, u, {\n "data-testid": "CardFooter"\n }), r);\n };\n\n t.CardFooter = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.BreadcrumbBar = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i40 = function i() {\n return (_i40 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.BreadcrumbBar = function (e) {\n var t = e.variant,\n r = void 0 === t ? "default" : t,\n o = e.children,\n l = e.className,\n u = e.navProps,\n c = e.listProps,\n s = (0, n.default)("usa-breadcrumb", {\n "usa-breadcrumb--wrap": "wrap" === r\n }, l);\n return a.default.createElement("nav", _i40({\n className: s\n }, u, {\n "aria-label": "Breadcrumbs"\n }), a.default.createElement("ol", _i40({\n className: "usa-breadcrumb__list"\n }, c), o));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.Breadcrumb = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i41 = function i() {\n return (_i41 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.Breadcrumb = function (e) {\n var t = e.children,\n r = e.current,\n o = void 0 !== r && r,\n u = e.className,\n c = l(e, ["children", "current", "className"]),\n s = (0, n.default)("usa-breadcrumb__list-item", {\n "usa-current": o\n }, u);\n return a.default.createElement("li", _i41({\n className: s,\n "aria-current": o ? "page" : void 0\n }, c), t);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.BreadcrumbLink = function (e) {\n var t = e.className,\n r = u(e, ["className"]),\n i = (0, a.default)(t, "usa-breadcrumb__link"),\n c = _l13(_l13({}, r), {\n className: i\n });\n\n if ((0, o.isCustomProps)(c)) return n.default.createElement(o.Link, _l13({}, c, {\n variant: "unstyled"\n }));\n return n.default.createElement(o.Link, _l13({}, c, {\n variant: "unstyled"\n }));\n };\n var a = i(r(1)),\n n = i(r(0)),\n o = r(10);\n\n function i(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _l13 = function l() {\n return (_l13 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n u = function u(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.StepIndicator = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i42 = function i() {\n return (_i42 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n };\n\n t.StepIndicator = function (e) {\n var t,\n r = e.showLabels,\n o = void 0 === r || r,\n l = e.counters,\n u = void 0 === l ? "none" : l,\n c = e.centered,\n s = void 0 !== c && c,\n d = e.children,\n f = e.className,\n p = e.divProps,\n m = e.listProps,\n y = (0, n.default)("usa-step-indicator", {\n "usa-step-indicator--no-labels": !o,\n "usa-step-indicator--counters": "default" === u,\n "usa-step-indicator--counters-sm": "small" === u,\n "usa-step-indicator--center": s\n }, f),\n b = -1 === (t = d.findIndex(function (e) {\n return "current" === e.props.status;\n })) ? 0 : t,\n v = b + 1,\n O = d[parseInt("" + b)].props.label,\n g = d.length;\n return a.default.createElement("div", _i42({\n className: y,\n "data-testid": "step-indicator",\n "aria-label": "progress"\n }, p), a.default.createElement("ol", _i42({\n className: "usa-step-indicator__segments"\n }, m), d), a.default.createElement("div", {\n className: "usa-step-indicator__header"\n }, a.default.createElement("h2", {\n className: "usa-step-indicator__heading"\n }, a.default.createElement("span", {\n className: "usa-step-indicator__heading-counter"\n }, a.default.createElement("span", {\n className: "usa-sr-only"\n }, "Step"), a.default.createElement("span", {\n className: "usa-step-indicator__current-step"\n }, v), " ", a.default.createElement("span", {\n className: "usa-step-indicator__total-steps"\n }, "of " + g), " "), a.default.createElement("span", {\n className: "usa-step-indicator__heading-text"\n }, O))));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.StepIndicatorStep = void 0;\n var a = o(r(1)),\n n = o(r(0));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i43 = function i() {\n return (_i43 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.StepIndicatorStep = function (e) {\n var t = e.label,\n r = e.status,\n o = void 0 === r ? "incomplete" : r,\n u = e.className,\n c = l(e, ["label", "status", "className"]),\n s = (0, a.default)("usa-step-indicator__segment", {\n "usa-step-indicator__segment--complete": "complete" === o,\n "usa-step-indicator__segment--current": "current" === o\n }, u);\n return n.default.createElement("li", _i43({\n className: s,\n "aria-current": "current" === o ? "true" : void 0\n }, c), n.default.createElement("span", {\n className: "usa-step-indicator__segment-label"\n }, t, " ", "current" !== o && n.default.createElement("span", {\n className: "usa-sr-only"\n }, "complete" === o ? "completed" : "not completed")));\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.Search = void 0;\n var a = s(r(0)),\n n = s(r(1)),\n o = r(2),\n i = r(14),\n l = r(17),\n u = r(5),\n c = r(7);\n\n function s(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _d2 = function d() {\n return (_d2 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n f = function f(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n p = function p(e) {\n var t = e.onSubmit,\n r = e.size,\n s = e.big,\n p = e.small,\n m = e.className,\n y = e.placeholder,\n b = e.inputName,\n v = void 0 === b ? "search" : b,\n O = e.label,\n g = void 0 === O ? "Search" : O,\n _ = e.inputId,\n h = void 0 === _ ? "search-field" : _,\n j = e.i18n,\n M = f(e, ["onSubmit", "size", "big", "small", "className", "placeholder", "inputName", "label", "inputId", "i18n"]);\n s && (0, o.deprecationWarning)("Search property big is deprecated. Use size"), p && (0, o.deprecationWarning)("Search property small is deprecated. Use size");\n var N = (null == j ? void 0 : j.buttonText) || "Search",\n E = r ? "big" === r : s,\n P = r ? "small" === r : p,\n w = (0, n.default)("usa-search", {\n "usa-search--small": P,\n "usa-search--big": E\n }, m);\n return a.default.createElement(l.Form, _d2({\n onSubmit: t,\n className: w,\n role: "search",\n search: !0\n }, M), a.default.createElement(u.Label, {\n srOnly: !0,\n htmlFor: h\n }, g), a.default.createElement(c.TextInput, {\n id: h,\n type: "search",\n name: v,\n placeholder: y\n }), a.default.createElement(i.Button, {\n type: "submit"\n }, a.default.createElement("span", {\n className: P ? "usa-sr-only" : "usa-search__submit-text"\n }, N)));\n };\n\n t.Search = p;\n var m = p;\n t.default = m;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.SummaryBox = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i44 = function i() {\n return (_i44 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.heading,\n r = e.children,\n o = e.className,\n u = l(e, ["heading", "children", "className"]),\n c = (0, n.default)("usa-summary-box", o);\n return a.default.createElement("div", _i44({\n className: c,\n "data-testid": "summary-box"\n }, u), a.default.createElement("div", {\n className: "usa-summary-box__body"\n }, a.default.createElement("h3", {\n className: "usa-summary-box__heading"\n }, t), a.default.createElement("div", {\n className: "usa-summary-box__text"\n }, r)));\n };\n\n t.SummaryBox = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ProcessList = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i45 = function i() {\n return (_i45 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-process-list", t);\n return a.default.createElement("ol", _i45({\n className: u\n }, o), r);\n };\n\n t.ProcessList = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.ProcessListItem = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i46 = function i() {\n return (_i46 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.className,\n r = e.children,\n o = l(e, ["className", "children"]),\n u = (0, n.default)("usa-process-list__item", t);\n return a.default.createElement("li", _i46({\n className: u\n }, o), r);\n };\n\n t.ProcessListItem = u;\n var c = u;\n t.default = c;\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.ProcessListHeading = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i47 = function i() {\n return (_i47 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n };\n\n t.ProcessListHeading = function (e) {\n var t = e.type,\n r = e.className,\n o = e.children,\n u = l(e, ["type", "className", "children"]),\n c = (0, n.default)("usa-process-list__heading", r),\n s = t;\n return a.default.createElement(s, _i47({\n "data-testid": "processListHeading",\n className: c\n }, u), o);\n };\n }, function (e, t, r) {\n "use strict";\n\n Object.defineProperty(t, "__esModule", {\n value: !0\n }), t.default = t.SiteAlert = void 0;\n var a = o(r(0)),\n n = o(r(1));\n\n function o(e) {\n return e && e.__esModule ? e : {\n default: e\n };\n }\n\n var _i48 = function i() {\n return (_i48 = Object.assign || function (e) {\n for (var t, r = 1, a = arguments.length; r < a; r++) {\n for (var n in t = arguments[r]) {\n Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n }\n }\n\n return e;\n }).apply(this, arguments);\n },\n l = function l(e, t) {\n var r = {};\n\n for (var a in e) {\n Object.prototype.hasOwnProperty.call(e, a) && t.indexOf(a) < 0 && (r[a] = e[a]);\n }\n\n if (null != e && "function" == typeof Object.getOwnPropertySymbols) {\n var n = 0;\n\n for (a = Object.getOwnPropertySymbols(e); n < a.length; n++) {\n t.indexOf(a[n]) < 0 && Object.prototype.propertyIsEnumerable.call(e, a[n]) && (r[a[n]] = e[a[n]]);\n }\n }\n\n return r;\n },\n u = function u(e) {\n var t = e.variant,\n r = e.children,\n o = e.heading,\n u = e.showIcon,\n c = void 0 === u || u,\n s = e.slim,\n d = void 0 !== s && s,\n f = e.className,\n p = l(e, ["variant", "children", "heading", "showIcon", "slim", "className"]),\n m = (0, n.default)("usa-site-alert", {\n "usa-site-alert--info": "info" === t,\n "usa-site-alert--emergency": "emergency" === t,\n "usa-site-alert--no-heading": void 0 === o && !d,\n "usa-site-alert--no-icon": !c,\n "usa-site-alert--slim": d\n }, f);\n return a.default.createElement("section", _i48({\n "data-testid": "siteAlert",\n className: m,\n "aria-label": "Site alert"\n }, p), a.default.createElement("div", {\n className: "usa-alert"\n }, a.default.createElement("div", {\n className: "usa-alert__body"\n }, o && a.default.createElement("h3", {\n className: "usa-alert__heading"\n }, o), r)));\n };\n\n t.SiteAlert = u;\n var c = u;\n t.default = c;\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcy9saWIvaW5kZXguanM/YjE4MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLEVBQUUsS0FBdUQsc0JBQXNCLG1CQUFPLENBQUMsSUFBTyxLQUFLLENBQW9LO0FBQ3ZRLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0JBQWdCOztBQUVoQjtBQUNBLCtCQUErQixzQkFBc0I7QUFDckQ7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixjQUFjO0FBQzNDLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLGFBQWE7QUFDbEI7QUFDQSxLQUFLLDJCQUEyQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHFCQUFxQixPQUFPO0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFD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Szs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLGlEQUFpRCxPQUFPO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNB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O0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU8sc0NBQXNDLDZEQUE2RDtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUSx5QkFBeUI7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSw0Q0FBNEM7QUFDNUMsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNU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QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDIiwiZmlsZSI6IjI1OTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24gKGUsIHQpIHtcbiAgXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyAmJiBcIm9iamVjdFwiID09IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoW1wicmVhY3RcIl0sIHQpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHMuUmVhY3RVU1dEUyA9IHQocmVxdWlyZShcInJlYWN0XCIpKSA6IGUuUmVhY3RVU1dEUyA9IHQoZS5SZWFjdCk7XG59KHRoaXMsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ID0ge307XG5cbiAgICBmdW5jdGlvbiByKGEpIHtcbiAgICAgIGlmICh0W2FdKSByZXR1cm4gdFthXS5leHBvcnRzO1xuICAgICAgdmFyIG4gPSB0W2FdID0ge1xuICAgICAgICBpOiBhLFxuICAgICAgICBsOiAhMSxcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH07XG4gICAgICByZXR1cm4gZVthXS5jYWxsKG4uZXhwb3J0cywgbiwgbi5leHBvcnRzLCByKSwgbi5sID0gITAsIG4uZXhwb3J0cztcbiAgICB9XG5cbiAgICByZXR1cm4gci5tID0gZSwgci5jID0gdCwgci5kID0gZnVuY3Rpb24gKGUsIHQsIGEpIHtcbiAgICAgIHIubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBhXG4gICAgICB9KTtcbiAgICB9LCByLnIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIHZhbHVlOiBcIk1vZHVsZVwiXG4gICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgfSwgci50ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICgxICYgdCAmJiAoZSA9IHIoZSkpLCA4ICYgdCkgcmV0dXJuIGU7XG4gICAgICBpZiAoNCAmIHQgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICB2YXIgYSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoci5yKGEpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgXCJkZWZhdWx0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBlXG4gICAgICB9KSwgMiAmIHQgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZSkgZm9yICh2YXIgbiBpbiBlKSB7XG4gICAgICAgIHIuZChhLCBuLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBlW3RdO1xuICAgICAgICB9LmJpbmQobnVsbCwgbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgci5uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZSAmJiBlLl9fZXNNb2R1bGUgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBlLmRlZmF1bHQ7XG4gICAgICB9IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gci5kKHQsIFwiYVwiLCB0KSwgdDtcbiAgICB9LCByLm8gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KTtcbiAgICB9LCByLnAgPSBcIlwiLCByKHIucyA9IDE5KTtcbiAgfShbZnVuY3Rpb24gKHQsIHIpIHtcbiAgICB0LmV4cG9ydHMgPSBlO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBhO1xuICAgIC8qIVxuICAgICAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICAgICAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuICAgICovXG5cbiAgICAhZnVuY3Rpb24gKCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciByID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBbXSwgdCA9IDA7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICB2YXIgYSA9IGFyZ3VtZW50c1t0XTtcblxuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHR5cGVvZiBhO1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IG8gfHwgXCJudW1iZXJcIiA9PT0gbykgZS5wdXNoKGEpO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgICAgaWYgKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBuLmFwcGx5KG51bGwsIGEpO1xuICAgICAgICAgICAgICAgIGkgJiYgZS5wdXNoKGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwib2JqZWN0XCIgPT09IG8pIGlmIChhLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSBmb3IgKHZhciBsIGluIGEpIHtcbiAgICAgICAgICAgICAgci5jYWxsKGEsIGwpICYmIGFbbF0gJiYgZS5wdXNoKGwpO1xuICAgICAgICAgICAgfSBlbHNlIGUucHVzaChhLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuXG4gICAgICBlLmV4cG9ydHMgPyAobi5kZWZhdWx0ID0gbiwgZS5leHBvcnRzID0gbikgOiB2b2lkIDAgPT09IChhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH0uYXBwbHkodCwgW10pKSB8fCAoZS5leHBvcnRzID0gYSk7XG4gICAgfSgpO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZXByZWNhdGlvbldhcm5pbmcgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoKSB7fTtcblxuICAgIHQuZGVwcmVjYXRpb25XYXJuaW5nID0gYTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNJb3NEZXZpY2UgPSB0LmhhbmRsZVRhYktleSA9IHQubGlzdFRvVGFibGUgPSB0LmlzRGF0ZUludmFsaWQgPSB0LmZvcm1hdERhdGUgPSB0LnBhcnNlRGF0ZVN0cmluZyA9IHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSB0LmlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCA9IHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSB0LmlzU2FtZURheSA9IHQuaXNTYW1lTW9udGggPSB0LmlzU2FtZVllYXIgPSB0Lm1heCA9IHQubWluID0gdC5zZXRZZWFyID0gdC5zZXRNb250aCA9IHQuc3ViWWVhcnMgPSB0LmFkZFllYXJzID0gdC5zdWJNb250aHMgPSB0LmFkZE1vbnRocyA9IHQuZW5kT2ZXZWVrID0gdC5zdGFydE9mV2VlayA9IHQuc3ViV2Vla3MgPSB0LmFkZFdlZWtzID0gdC5zdWJEYXlzID0gdC5hZGREYXlzID0gdC5sYXN0RGF5T2ZNb250aCA9IHQuc3RhcnRPZk1vbnRoID0gdC50b2RheSA9IHQuc2V0RGF0ZSA9IHQua2VlcERhdGVXaXRoaW5Nb250aCA9IHZvaWQgMDtcbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigwKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gcig2KTtcblxuICAgIHZhciBpID0gZnVuY3Rpb24gaShlLCB0KSB7XG4gICAgICByZXR1cm4gdCAhPT0gZS5nZXRNb250aCgpICYmIGUuc2V0RGF0ZSgwKSwgZTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZVdpdGhpbk1vbnRoID0gaTtcblxuICAgIHZhciBsID0gZnVuY3Rpb24gbChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIGEuc2V0RnVsbFllYXIoZSwgdCwgciksIGE7XG4gICAgfTtcblxuICAgIHQuc2V0RGF0ZSA9IGw7XG5cbiAgICB2YXIgdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICB2YXIgZSA9IG5ldyBEYXRlKCksXG4gICAgICAgICAgdCA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIHIgPSBlLmdldE1vbnRoKCksXG4gICAgICAgICAgYSA9IGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHJldHVybiBsKGEsIHIsIHQpO1xuICAgIH07XG5cbiAgICB0LnRvZGF5ID0gdTtcblxuICAgIHZhciBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IG5ldyBEYXRlKDApO1xuICAgICAgcmV0dXJuIHQuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpLCBlLmdldE1vbnRoKCksIDEpLCB0O1xuICAgIH07XG5cbiAgICB0LnN0YXJ0T2ZNb250aCA9IGM7XG5cbiAgICB2YXIgcyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgwKTtcbiAgICAgIHJldHVybiB0LnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSwgZS5nZXRNb250aCgpICsgMSwgMCksIHQ7XG4gICAgfTtcblxuICAgIHQubGFzdERheU9mTW9udGggPSBzO1xuXG4gICAgdmFyIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpO1xuICAgICAgcmV0dXJuIHIuc2V0RGF0ZShyLmdldERhdGUoKSArIHQpLCByO1xuICAgIH07XG5cbiAgICB0LmFkZERheXMgPSBkO1xuXG4gICAgdmFyIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHJldHVybiBkKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdC5zdWJEYXlzID0gZjtcblxuICAgIHZhciBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICByZXR1cm4gZChlLCA3ICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkV2Vla3MgPSBwO1xuXG4gICAgdC5zdWJXZWVrcyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gcChlLCAtdCk7XG4gICAgfTtcblxuICAgIHQuc3RhcnRPZldlZWsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmdldERheSgpO1xuICAgICAgcmV0dXJuIGYoZSwgdCk7XG4gICAgfTtcblxuICAgIHQuZW5kT2ZXZWVrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5nZXREYXkoKTtcbiAgICAgIHJldHVybiBkKGUsIDYgLSB0KTtcbiAgICB9O1xuXG4gICAgdmFyIG0gPSBmdW5jdGlvbiBtKGUsIHQpIHtcbiAgICAgIHZhciByID0gbmV3IERhdGUoZS5nZXRUaW1lKCkpLFxuICAgICAgICAgIGEgPSAoci5nZXRNb250aCgpICsgMTIgKyB0KSAlIDEyO1xuICAgICAgcmV0dXJuIHIuc2V0TW9udGgoci5nZXRNb250aCgpICsgdCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQuYWRkTW9udGhzID0gbTtcblxuICAgIHQuc3ViTW9udGhzID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIC10KTtcbiAgICB9O1xuXG4gICAgdmFyIHkgPSBmdW5jdGlvbiB5KGUsIHQpIHtcbiAgICAgIHJldHVybiBtKGUsIDEyICogdCk7XG4gICAgfTtcblxuICAgIHQuYWRkWWVhcnMgPSB5O1xuXG4gICAgdC5zdWJZZWFycyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4geShlLCAtdCk7XG4gICAgfTtcblxuICAgIHZhciBiID0gZnVuY3Rpb24gYihlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKTtcbiAgICAgIHJldHVybiByLnNldE1vbnRoKHQpLCBpKHIsIHQpLCByO1xuICAgIH07XG5cbiAgICB0LnNldE1vbnRoID0gYjtcblxuICAgIHQuc2V0WWVhciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKSxcbiAgICAgICAgICBhID0gci5nZXRNb250aCgpO1xuICAgICAgcmV0dXJuIHIuc2V0RnVsbFllYXIodCksIGkociwgYSksIHI7XG4gICAgfTtcblxuICAgIHQubWluID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0IDwgZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHQubWF4ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZTtcbiAgICAgIHJldHVybiB0ID4gZSAmJiAociA9IHQpLCBuZXcgRGF0ZShyLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIHZhciB2ID0gZnVuY3Rpb24gdihlLCB0KSB7XG4gICAgICByZXR1cm4gZSAmJiB0ICYmIGUuZ2V0RnVsbFllYXIoKSA9PT0gdC5nZXRGdWxsWWVhcigpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZVllYXIgPSB2O1xuXG4gICAgdmFyIE8gPSBmdW5jdGlvbiBPKGUsIHQpIHtcbiAgICAgIHJldHVybiB2KGUsIHQpICYmIGUuZ2V0TW9udGgoKSA9PT0gdC5nZXRNb250aCgpO1xuICAgIH07XG5cbiAgICB0LmlzU2FtZU1vbnRoID0gTztcblxuICAgIHQuaXNTYW1lRGF5ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHJldHVybiBPKGUsIHQpICYmIGUuZ2V0RGF0ZSgpID09PSB0LmdldERhdGUoKTtcbiAgICB9O1xuXG4gICAgdC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdmFyIGEgPSBlO1xuICAgICAgcmV0dXJuIGUgPCB0ID8gYSA9IHQgOiByICYmIGUgPiByICYmIChhID0gciksIG5ldyBEYXRlKGEuZ2V0VGltZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGcgPSBmdW5jdGlvbiBnKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBlID49IHQgJiYgKCFyIHx8IGUgPD0gcik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlV2l0aGluTWluQW5kTWF4ID0gZztcblxuICAgIHQuaXNEYXRlc01vbnRoT3V0c2lkZU1pbk9yTWF4ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiBzKGUpIDwgdCB8fCAhIXIgJiYgYyhlKSA+IHI7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXggPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgcmV0dXJuIHMoYihlLCAxMSkpIDwgdCB8fCAhIXIgJiYgYyhiKGUsIDApKSA+IHI7XG4gICAgfTtcblxuICAgIHQucGFyc2VEYXRlU3RyaW5nID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBhLCBuLCBpLCBjLCBzLCBkLCBmO1xuXG4gICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gby5JTlRFUk5BTF9EQVRFX0ZPUk1BVCksIHZvaWQgMCA9PT0gciAmJiAociA9ICExKSwgZSkge1xuICAgICAgICB2YXIgcCA9IHZvaWQgMCxcbiAgICAgICAgICAgIG0gPSB2b2lkIDAsXG4gICAgICAgICAgICB5ID0gdm9pZCAwO1xuXG4gICAgICAgIGlmICh0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyAocCA9IChhID0gZS5zcGxpdChcIi9cIikpWzBdLCBtID0gYVsxXSwgeSA9IGFbMl0pIDogKHkgPSAobiA9IGUuc3BsaXQoXCItXCIpKVswXSwgcCA9IG5bMV0sIG0gPSBuWzJdKSwgeSAmJiAoZiA9IHBhcnNlSW50KHksIDEwKSwgIU51bWJlci5pc05hTihmKSAmJiAoZCA9IGYsIHIgJiYgKGQgPSBNYXRoLm1heCgwLCBkKSwgeS5sZW5ndGggPCAzKSkpKSB7XG4gICAgICAgICAgdmFyIGIgPSB1KCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICBkID0gYiAtIGIgJSBNYXRoLnBvdygxMCwgeS5sZW5ndGgpICsgZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwICYmIChmID0gcGFyc2VJbnQocCwgMTApLCBOdW1iZXIuaXNOYU4oZikgfHwgKGMgPSBmLCByICYmIChjID0gTWF0aC5tYXgoMSwgYyksIGMgPSBNYXRoLm1pbigxMiwgYykpKSksIGMgJiYgbSAmJiBudWxsICE9IGQgJiYgKGYgPSBwYXJzZUludChtLCAxMCksICFOdW1iZXIuaXNOYU4oZikgJiYgKHMgPSBmLCByKSkpIHtcbiAgICAgICAgICB2YXIgdiA9IGwoZCwgYywgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICAgIHMgPSBNYXRoLm1heCgxLCBzKSwgcyA9IE1hdGgubWluKHYsIHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYyAmJiBzICYmIG51bGwgIT0gZCAmJiAoaSA9IGwoZCwgYyAtIDEsIHMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIHQuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBvLklOVEVSTkFMX0RBVEVfRk9STUFUKTtcblxuICAgICAgdmFyIHIgPSBmdW5jdGlvbiByKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIChcIjAwMDBcIiArIGUpLnNsaWNlKC10KTtcbiAgICAgIH0sXG4gICAgICAgICAgYSA9IGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgbiA9IGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgIGkgPSBlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgIHJldHVybiB0ID09PSBvLkRFRkFVTFRfRVhURVJOQUxfREFURV9GT1JNQVQgPyBbcihhLCAyKSwgcihuLCAyKSwgcihpLCA0KV0uam9pbihcIi9cIikgOiBbcihpLCA0KSwgcihhLCAyKSwgcihuLCAyKV0uam9pbihcIi1cIik7XG4gICAgfTtcblxuICAgIHQuaXNEYXRlSW52YWxpZCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgYSA9ICExO1xuXG4gICAgICBpZiAoZSkge1xuICAgICAgICBhID0gITA7XG4gICAgICAgIHZhciBuID0gZS5zcGxpdChcIi9cIiksXG4gICAgICAgICAgICBvID0gbi5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgICAgciA9IHBhcnNlSW50KGUsIDEwKTtcbiAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHIpIHx8ICh0ID0gciksIHQ7XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaSA9IG9bMF0sXG4gICAgICAgICAgICB1ID0gb1sxXSxcbiAgICAgICAgICAgIGMgPSBvWzJdO1xuXG4gICAgICAgIGlmIChpICYmIHUgJiYgbnVsbCAhPSBjKSB7XG4gICAgICAgICAgdmFyIHMgPSBsKGMsIGkgLSAxLCB1KTtcbiAgICAgICAgICBzLmdldE1vbnRoKCkgPT09IGkgLSAxICYmIHMuZ2V0RGF0ZSgpID09PSB1ICYmIHMuZ2V0RnVsbFllYXIoKSA9PT0gYyAmJiA0ID09PSBuWzJdLmxlbmd0aCAmJiBnKHMsIHQsIHIpICYmIChhID0gITEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH07XG5cbiAgICB0Lmxpc3RUb1RhYmxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSBbXSwgYSA9IDA7IGEgPCBlLmxlbmd0aDspIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IFtdOyBhIDwgZS5sZW5ndGggJiYgby5sZW5ndGggPCB0Oykge1xuICAgICAgICAgIG8ucHVzaChlW3BhcnNlSW50KFwiXCIgKyBhKV0pLCBhICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICByLnB1c2gobyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHIubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgICAgICBrZXk6IFwicm93X1wiICsgdFxuICAgICAgICB9LCBlLm1hcChmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgIGtleTogXCJyb3dfXCIgKyB0ICsgXCJfY2VsbF9cIiArIHJcbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB0LmhhbmRsZVRhYktleSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoXCJUYWJcIiA9PT0gZS5rZXkpIHtcbiAgICAgICAgdmFyIHIgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlICYmICFlLmRpc2FibGVkO1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGEgPSBudWxsID09PSBkb2N1bWVudCB8fCB2b2lkIDAgPT09IGRvY3VtZW50ID8gdm9pZCAwIDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIG4gPSByLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBvID0gcltwYXJzZUludChcIjBcIildLFxuICAgICAgICAgICAgaSA9IHJbcGFyc2VJbnQoXCJcIiArIG4pXSxcbiAgICAgICAgICAgIGwgPSBhIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQgPyByLmluZGV4T2YoYSkgOiAtMSxcbiAgICAgICAgICAgIHUgPSBsID09PSBuLFxuICAgICAgICAgICAgYyA9IDAgPT09IGwsXG4gICAgICAgICAgICBzID0gLTEgPT09IGw7XG4gICAgICAgIGUuc2hpZnRLZXkgPyAoYyB8fCBzKSAmJiAoZS5wcmV2ZW50RGVmYXVsdCgpLCBudWxsID09IGkgfHwgaS5mb2N1cygpKSA6ICh1IHx8IHMpICYmIChlLnByZXZlbnREZWZhdWx0KCksIG51bGwgPT0gbyB8fCBvLmZvY3VzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0LmlzSW9zRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQb2R8aVBob25lfGlQYWQpL2cpIHx8IFwiTWFjSW50ZWxcIiA9PT0gbmF2aWdhdG9yLnBsYXRmb3JtICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpICYmICF3aW5kb3cuTVNTdHJlYW07XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuTmF2TGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcigyKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2TGlzdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUudHlwZSxcbiAgICAgICAgICBpID0gZS5wcmltYXJ5LFxuICAgICAgICAgIGMgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBzID0gZS5zdWJuYXYsXG4gICAgICAgICAgZCA9IGUubWVnYW1lbnUsXG4gICAgICAgICAgZiA9IGUuZm9vdGVyU2Vjb25kYXJ5LFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gdShlLCBbXCJpdGVtc1wiLCBcInR5cGVcIiwgXCJwcmltYXJ5XCIsIFwic2Vjb25kYXJ5XCIsIFwic3VibmF2XCIsIFwibWVnYW1lbnVcIiwgXCJmb290ZXJTZWNvbmRhcnlcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBwcmltYXJ5IGlzIGRlcHJlY2F0ZWQuICBVc2UgdHlwZVwiKSwgYyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiTmF2TGlzdCBwcm9wZXJ0eSBzZWNvbmRhcnkgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBzICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IHN1Ym5hdiBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIiksIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIk5hdkxpc3QgcHJvcGVydHkgbWVnYW1lbnUgaXMgZGVwcmVjYXRlZC4gIFVzZSB0eXBlXCIpLCBmICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJOYXZMaXN0IHByb3BlcnR5IGZvb3RlclNlY29uZGFyeSBpcyBkZXByZWNhdGVkLiAgVXNlIHR5cGVcIik7XG5cbiAgICAgIHZhciB5ID0gciA/IFwicHJpbWFyeVwiID09PSByIDogaSxcbiAgICAgICAgICBiID0gciA/IFwic2Vjb25kYXJ5XCIgPT09IHIgOiBjLFxuICAgICAgICAgIHYgPSByID8gXCJzdWJuYXZcIiA9PT0gciA6IHMsXG4gICAgICAgICAgTyA9IHIgPyBcIm1lZ2FtZW51XCIgPT09IHIgOiBkLFxuICAgICAgICAgIGcgPSByID8gXCJmb290ZXJTZWNvbmRhcnlcIiA9PT0gciA6IGYsXG4gICAgICAgICAgXyA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2EtbmF2X19wcmltYXJ5IHVzYS1hY2NvcmRpb25cIjogeSxcbiAgICAgICAgXCJ1c2EtbmF2X19zZWNvbmRhcnktbGlua3NcIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51XCI6IHYsXG4gICAgICAgIFwidXNhLW5hdl9fc3VibWVudS1saXN0XCI6IE8sXG4gICAgICAgIFwidXNhLWxpc3QgdXNhLWxpc3QtLXVuc3R5bGVkXCI6IGdcbiAgICAgIH0sIHApLFxuICAgICAgICAgIGggPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLW5hdl9fcHJpbWFyeS1pdGVtXCI6IHksXG4gICAgICAgIFwidXNhLW5hdl9fc2Vjb25kYXJ5LWl0ZW1cIjogYixcbiAgICAgICAgXCJ1c2EtbmF2X19zdWJtZW51LWl0ZW1cIjogdiB8fCBPLFxuICAgICAgICBcInVzYS1mb290ZXJfX3NlY29uZGFyeS1saW5rXCI6IGdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfbCh7XG4gICAgICAgIGNsYXNzTmFtZTogX1xuICAgICAgfSwgbSksIHQubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICBrZXk6IFwiaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBoXG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkxhYmVsID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5odG1sRm9yLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gZS5lcnJvcixcbiAgICAgICAgICBjID0gZS5oaW50LFxuICAgICAgICAgIHMgPSBlLnNyT25seSxcbiAgICAgICAgICBkID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImh0bWxGb3JcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcImhpbnRcIiwgXCJzck9ubHlcIl0pLFxuICAgICAgICAgIGYgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWxhYmVsXCI6ICFzLFxuICAgICAgICBcInVzYS1zci1vbmx5XCI6IHMsXG4gICAgICAgIFwidXNhLWxhYmVsLS1lcnJvclwiOiB1XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIF9pKHt9LCBkLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJsYWJlbFwiLFxuICAgICAgICBjbGFzc05hbWU6IGYsXG4gICAgICAgIGh0bWxGb3I6IHJcbiAgICAgIH0pLCB0LCBjICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaGludFwiXG4gICAgICB9LCBjKSk7XG4gICAgfTtcblxuICAgIHQuTGFiZWwgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCA9IHQuREVGQVVMVF9NSU5fREFURSA9IHQuWUVBUl9DSFVOSyA9IHQuRU5URVJfS0VZQ09ERSA9IHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gdC5EQVlfT0ZfV0VFS19MQUJFTFMgPSB0Lk1PTlRIX0xBQkVMUyA9IHQuVkFMSURBVElPTl9NRVNTQUdFID0gdm9pZCAwO1xuICAgIHQuVkFMSURBVElPTl9NRVNTQUdFID0gXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCI7XG4gICAgdC5NT05USF9MQUJFTFMgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcbiAgICB0LkRBWV9PRl9XRUVLX0xBQkVMUyA9IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdO1xuICAgIHQuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTID0gW1wiU1wiLCBcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRoXCIsIFwiRlwiLCBcIlNcIl07XG4gICAgdC5FTlRFUl9LRVlDT0RFID0gMTM7XG4gICAgdC5ZRUFSX0NIVU5LID0gMTI7XG4gICAgdC5ERUZBVUxUX01JTl9EQVRFID0gXCIwMDAwLTAxLTAxXCI7XG4gICAgdC5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFUID0gXCJNTS9ERC9ZWVlZXCI7XG4gICAgdC5JTlRFUk5BTF9EQVRFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5UZXh0SW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMiA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgaSA9IGUudHlwZSxcbiAgICAgICAgICBjID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgcyA9IGUudmFsaWRhdGlvblN0YXR1cyxcbiAgICAgICAgICBkID0gZS5lcnJvcixcbiAgICAgICAgICBmID0gZS5zdWNjZXNzLFxuICAgICAgICAgIHAgPSBlLmlucHV0U2l6ZSxcbiAgICAgICAgICBtID0gZS5zbWFsbCxcbiAgICAgICAgICB5ID0gZS5tZWRpdW0sXG4gICAgICAgICAgYiA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgdiA9IHUoZSwgW1wiaWRcIiwgXCJuYW1lXCIsIFwidHlwZVwiLCBcImNsYXNzTmFtZVwiLCBcInZhbGlkYXRpb25TdGF0dXNcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJpbnB1dFNpemVcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgIGQgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBlcnJvciBpcyBkZXByZWNhdGVkLiAgVXNlIHZhbGlkYXRpb25TdGF0dXNcIiksIGYgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIlRleHRJbnB1dCBwcm9wZXJ0eSBzdWNjZXNzIGlzIGRlcHJlY2F0ZWQuICBVc2UgdmFsaWRhdGlvblN0YXR1c1wiKSwgbSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiVGV4dElucHV0IHByb3BlcnR5IHNtYWxsIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpLCB5ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJUZXh0SW5wdXQgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2UgaW5wdXRTaXplXCIpO1xuXG4gICAgICB2YXIgTyA9IHMgPyBcImVycm9yXCIgPT09IHMgOiBkLFxuICAgICAgICAgIGcgPSBzID8gXCJzdWNjZXNzXCIgPT09IHMgOiBmLFxuICAgICAgICAgIF8gPSBwID8gXCJzbWFsbFwiID09PSBwIDogbSxcbiAgICAgICAgICBoID0gcCA/IFwibWVkaXVtXCIgPT09IHAgOiB5LFxuICAgICAgICAgIGogPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pbnB1dFwiLCB7XG4gICAgICAgIFwidXNhLWlucHV0LS1lcnJvclwiOiBPLFxuICAgICAgICBcInVzYS1pbnB1dC0tc3VjY2Vzc1wiOiBnLFxuICAgICAgICBcInVzYS1pbnB1dC0tc21hbGxcIjogXyxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLW1lZGl1bVwiOiBoXG4gICAgICB9LCBjKTtcblxuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2wyKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRleHRJbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IGosXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICB0eXBlOiBpLFxuICAgICAgICByZWY6IGJcbiAgICAgIH0sIHYpKTtcbiAgICB9O1xuXG4gICAgdC5UZXh0SW5wdXQgPSBjO1xuICAgIHZhciBzID0gYztcbiAgICB0LmRlZmF1bHQgPSBzO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0LkZvcm1Hcm91cCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmVycm9yLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb3JtLWdyb3VwXCIsIHtcbiAgICAgICAgXCJ1c2EtZm9ybS1ncm91cC0tZXJyb3JcIjogb1xuICAgICAgfSwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybUdyb3VwXCIsXG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuc2FtcGxlTG9jYWxpemF0aW9uID0gdC5FTl9VUyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IHIoNiksXG4gICAgICAgIG4gPSB7XG4gICAgICBtb250aHM6IGEuTU9OVEhfTEFCRUxTLFxuICAgICAgZGF5c09mV2VlazogYS5EQVlfT0ZfV0VFS19MQUJFTFMsXG4gICAgICBkYXlzT2ZXZWVrU2hvcnQ6IGEuREFZX09GX1dFRUtfU0hPUlRfTEFCRUxTLFxuICAgICAgc3RhdHVzZXM6IFtcIllvdSBjYW4gbmF2aWdhdGUgYnkgZGF5IHVzaW5nIGxlZnQgYW5kIHJpZ2h0IGFycm93c1wiLCBcIldlZWtzIGJ5IHVzaW5nIHVwIGFuZCBkb3duIGFycm93c1wiLCBcIk1vbnRocyBieSB1c2luZyBwYWdlIHVwIGFuZCBwYWdlIGRvd24ga2V5c1wiLCBcIlllYXJzIGJ5IHVzaW5nIHNoaWZ0IHBsdXMgcGFnZSB1cCBhbmQgc2hpZnQgcGx1cyBwYWdlIGRvd25cIiwgXCJIb21lIGFuZCBlbmQga2V5cyBuYXZpZ2F0ZSB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSB3ZWVrXCJdLFxuICAgICAgc2VsZWN0ZWREYXRlOiBcIlNlbGVjdGVkIGRhdGVcIixcbiAgICAgIHNlbGVjdEFNb250aDogXCJTZWxlY3QgYSBtb250aC5cIixcbiAgICAgIHRvZ2dsZUNhbGVuZGFyOiBcIlRvZ2dsZSBjYWxlbmRhclwiLFxuICAgICAgYmFja09uZVllYXI6IFwiTmF2aWdhdGUgYmFjayBvbmUgeWVhclwiLFxuICAgICAgYmFja09uZU1vbnRoOiBcIk5hdmlnYXRlIGJhY2sgb25lIG1vbnRoXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZpZ2F0ZSBmb3J3YXJkIG9uZSB5ZWFyXCIsXG4gICAgICBmb3J3YXJkT25lTW9udGg6IFwiTmF2aWdhdGUgZm9yd2FyZCBvbmUgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RNb250aDogXCJDbGljayB0byBzZWxlY3QgbW9udGhcIixcbiAgICAgIGNsaWNrVG9TZWxlY3RZZWFyOiBcIkNsaWNrIHRvIHNlbGVjdCB5ZWFyXCJcbiAgICB9O1xuICAgIHQuRU5fVVMgPSBuO1xuICAgIHQuc2FtcGxlTG9jYWxpemF0aW9uID0ge1xuICAgICAgbW9udGhzOiBbXCJlbmVyb1wiLCBcImZlYnJlcm9cIiwgXCJtYXJ6b1wiLCBcImFicmlsXCIsIFwibWF5b1wiLCBcImp1bmlvXCIsIFwianVsaW9cIiwgXCJhZ29zdG9cIiwgXCJzZXB0aWVtYnJlXCIsIFwib2N0dWJyZVwiLCBcIm5vdmllbWJyZVwiLCBcImRpY2llbWJyZVwiXSxcbiAgICAgIGRheXNPZldlZWs6IFtcImRvbWluZ29cIiwgXCJsdW5lc1wiLCBcIm1hcnRlc1wiLCBcIm1pw6lyY29sZXNcIiwgXCJqdWV2ZXNcIiwgXCJ2aWVybmVzXCIsIFwic8OhYmFkb1wiXSxcbiAgICAgIGRheXNPZldlZWtTaG9ydDogW1wiRG9cIiwgXCJMdVwiLCBcIk1hXCIsIFwiTWlcIiwgXCJKdVwiLCBcIlZpXCIsIFwiU2FcIl0sXG4gICAgICBzdGF0dXNlczogW1wiUHVlZGUgbmF2ZWdhciBwb3IgZMOtYSB1c2FuZG8gbGFzIGZsZWNoYXMgaXpxdWllcmRhIHkgZGVyZWNoYVwiLCBcIlNlbWFuYXMgdXNhbmRvIGZsZWNoYXMgaGFjaWEgYXJyaWJhIHkgaGFjaWEgYWJham9cIiwgXCJNZXNlcyB1c2FuZG8gbGFzIHRlY2xhcyBkZSBhdmFuY2UgeSByZXRyb2Nlc28gZGUgcMOhZ2luYVwiLCBcIkHDsW9zIHVzYW5kbyBzaGlmdCBwbHVzIHBhZ2UgdXAgeSBzaGlmdCBwbHVzIHBhZ2UgZG93blwiLCBcIkxhcyB0ZWNsYXMgZGUgaW5pY2lvIHkgZmluYWxpemFjacOzbiBuYXZlZ2FuIGhhc3RhIGVsIHByaW5jaXBpbyB5IGVsIGZpbmFsIGRlIHVuYSBzZW1hbmFcIl0sXG4gICAgICBzZWxlY3RlZERhdGU6IFwiRmVjaGEgc2VsZWNjaW9uYWRhXCIsXG4gICAgICBzZWxlY3RBTW9udGg6IFwiU2VsZWNjaW9uYSB1biBtZXMuXCIsXG4gICAgICB0b2dnbGVDYWxlbmRhcjogXCJBbHRlcm5hciBjYWxlbmRhcmlvXCIsXG4gICAgICBiYWNrT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGF0csOhcyB1biBhw7FvXCIsXG4gICAgICBiYWNrT25lTW9udGg6IFwiTmF2ZWdhciBoYWNpYSBhdHLDoXMgdW4gbWVzXCIsXG4gICAgICBmb3J3YXJkT25lWWVhcjogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIGHDsW9cIixcbiAgICAgIGZvcndhcmRPbmVNb250aDogXCJOYXZlZ2FyIGhhY2lhIGFkZWxhbnRlIHVuIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdE1vbnRoOiBcIkhhZ2EgY2xpYyBwYXJhIHNlbGVjY2lvbmFyIGVsIG1lc1wiLFxuICAgICAgY2xpY2tUb1NlbGVjdFllYXI6IFwiSGFnYSBjbGljIHBhcmEgc2VsZWNjaW9uYXIgZWwgYcOxb1wiXG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNDdXN0b21Qcm9wcyA9IHUsIHQuTGluayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodShlKSkge1xuICAgICAgICB2YXIgdCA9IGUudmFyaWFudCxcbiAgICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIG4gPSBlLmFzQ3VzdG9tLFxuICAgICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBzID0gbChlLCBbXCJ2YXJpYW50XCIsIFwiY2xhc3NOYW1lXCIsIFwiYXNDdXN0b21cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgICBkID0gYyh0LCByKTtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4sIF9pMih7XG4gICAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICAgIH0sIHMpLCBvKTtcbiAgICAgIH1cblxuICAgICAgbyA9IGUuY2hpbGRyZW4sIHIgPSBlLmNsYXNzTmFtZSwgdCA9IGUudmFyaWFudCwgcyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJ2YXJpYW50XCJdKSwgZCA9IGModCwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIF9pMih7XG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgcyksIG8pO1xuICAgIH07XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IFwiZXh0ZXJuYWxcIiA9PT0gZSxcbiAgICAgICAgICBhID0gXCJuYXZcIiA9PT0gZTtcbiAgICAgIHJldHVybiBcInVuc3R5bGVkXCIgPT09IGUgPyB0IDogKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbGlua1wiLCB7XG4gICAgICAgIFwidXNhLWxpbmstLWV4dGVybmFsXCI6IHIsXG4gICAgICAgIFwidXNhLW5hdl9fbGlua1wiOiBhXG4gICAgICB9LCB0KTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNvbWJvQm94ID0gdC5Gb2N1c01vZGUgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IGwodCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG8gPSAoYSA9IHIoMSkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgaSA9IHIoNDkpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIHUsXG4gICAgICAgIGMsXG4gICAgICAgIF9zID0gZnVuY3Rpb24gcygpIHtcbiAgICAgIHJldHVybiAoX3MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICAhZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5QcmV2aW91cyA9IC0xXSA9IFwiUHJldmlvdXNcIiwgZVtlLk5leHQgPSAxXSA9IFwiTmV4dFwiO1xuICAgIH0odSB8fCAodSA9IHt9KSksIHQuRm9jdXNNb2RlID0gYywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVbZS5Ob25lID0gMF0gPSBcIk5vbmVcIiwgZVtlLklucHV0ID0gMV0gPSBcIklucHV0XCIsIGVbZS5JdGVtID0gMl0gPSBcIkl0ZW1cIjtcbiAgICB9KGMgfHwgKHQuRm9jdXNNb2RlID0gYyA9IHt9KSk7XG5cbiAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgdmFyIHQgPSBlLmZvY3VzZWQsXG4gICAgICAgICAgciA9IGQoZSwgW1wiZm9jdXNlZFwiXSksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikobnVsbCk7XG4gICAgICByZXR1cm4gKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQgJiYgYS5jdXJyZW50ICYmIGEuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX3Moe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2lucHV0XCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtaW5wdXRcIlxuICAgICAgfSwgciwge1xuICAgICAgICBhdXRvQ2FwaXRhbGl6ZTogXCJvZmZcIixcbiAgICAgICAgYXV0b0NvbXBsZXRlOiBcIm9mZlwiLFxuICAgICAgICByZWY6IGFcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgICAgICBwID0gKDAsIG4uZm9yd2FyZFJlZikoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgbCA9IGUuaWQsXG4gICAgICAgICAgZCA9IGUubmFtZSxcbiAgICAgICAgICBwID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbSA9IGUub3B0aW9ucyxcbiAgICAgICAgICB5ID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgYiA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgdiA9IGUub25DaGFuZ2UsXG4gICAgICAgICAgTyA9IGUuYXNzaXN0aXZlSGludCxcbiAgICAgICAgICBnID0gZS5ub1Jlc3VsdHMsXG4gICAgICAgICAgXyA9IGUuc2VsZWN0UHJvcHMsXG4gICAgICAgICAgaCA9IGUuaW5wdXRQcm9wcyxcbiAgICAgICAgICBqID0gZS51bFByb3BzLFxuICAgICAgICAgIE0gPSBlLmN1c3RvbUZpbHRlcixcbiAgICAgICAgICBOID0gZS5kaXNhYmxlRmlsdGVyaW5nLFxuICAgICAgICAgIEUgPSB2b2lkIDAgIT09IE4gJiYgTixcbiAgICAgICAgICBQID0gISFiO1xuICAgICAgeSAmJiAoYSA9IG0uZmluZChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS52YWx1ZSA9PT0geTtcbiAgICAgIH0pKTtcbiAgICAgIHZhciB3ID0gTSB8fCB7XG4gICAgICAgIGZpbHRlcjogXCIuKnt7cXVlcnl9fS4qXCJcbiAgICAgIH0sXG4gICAgICAgICAgSSA9IHtcbiAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgc2VsZWN0ZWRPcHRpb246IGEgfHwgdm9pZCAwLFxuICAgICAgICBmb2N1c2VkT3B0aW9uOiB2b2lkIDAsXG4gICAgICAgIGZvY3VzTW9kZTogYy5Ob25lLFxuICAgICAgICBmaWx0ZXJlZE9wdGlvbnM6IG0sXG4gICAgICAgIGlucHV0VmFsdWU6IGEgPyBhLmxhYmVsIDogXCJcIlxuICAgICAgfSxcbiAgICAgICAgICBEID0gKDAsIGkudXNlQ29tYm9Cb3gpKEksIG0sIEUsIHcpLFxuICAgICAgICAgIFMgPSBEWzBdLFxuICAgICAgICAgIHggPSBEWzFdLFxuICAgICAgICAgIGsgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEEgPSAoMCwgbi51c2VSZWYpKG51bGwpO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICB2ICYmIHYoKG51bGwgPT09IChlID0gUy5zZWxlY3RlZE9wdGlvbikgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52YWx1ZSkgfHwgdm9pZCAwKTtcbiAgICAgIH0sIFtTLnNlbGVjdGVkT3B0aW9uXSksICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBTLmZvY3VzTW9kZSA9PT0gYy5JdGVtICYmIFMuZm9jdXNlZE9wdGlvbiAmJiBBLmN1cnJlbnQgJiYgQS5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9LCBbUy5mb2N1c01vZGUsIFMuZm9jdXNlZE9wdGlvbl0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUy5pc09wZW4gJiYgUy5mb2N1c2VkT3B0aW9uICYmIEEuY3VycmVudCAmJiBTLmZvY3VzTW9kZSA9PT0gYy5JbnB1dCAmJiBBLmN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoITEpO1xuICAgICAgfSwgW1MuaXNPcGVuLCBTLmZvY3VzZWRPcHRpb25dKSwgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBTLmZvY3VzTW9kZSAhPT0gYy5Ob25lICYmICgobnVsbCA9PT0gKGUgPSBrLmN1cnJlbnQpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuY29udGFpbnMod2luZG93LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB8fCB4KHtcbiAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgfSkpO1xuICAgICAgfSwgW1MuZm9jdXNNb2RlXSksICgwLCBuLnVzZUltcGVyYXRpdmVIYW5kbGUpKHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4geCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xFQVJfU0VMRUNUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIHZhciBUID0gZnVuY3Rpb24gVChlLCB0LCByKSB7XG4gICAgICAgIHZhciBhID0gdC5mb2N1c2VkT3B0aW9uID8gdC5maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZih0LmZvY3VzZWRPcHRpb24pIDogLTEsXG4gICAgICAgICAgICBuID0gdC5maWx0ZXJlZE9wdGlvbnNbMF0sXG4gICAgICAgICAgICBvID0gdC5maWx0ZXJlZE9wdGlvbnNbdC5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICgtMSA9PT0gYSkgZSh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgb3B0aW9uOiBuXG4gICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgIHZhciBsID0gYSArIHI7XG4gICAgICAgICAgaWYgKGwgPCAwICYmIHQuc2VsZWN0ZWRPcHRpb24pIGUoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IG5cbiAgICAgICAgICB9KTtlbHNlIGlmIChsIDwgMCkgZSh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMT1NFX0xJU1RcbiAgICAgICAgICB9KTtlbHNlIGlmIChsID49IHQuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCkgZSh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkZPQ1VTX09QVElPTixcbiAgICAgICAgICAgIG9wdGlvbjogb1xuICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIHUgPSB0LmZpbHRlcmVkT3B0aW9uc1tsXTtcbiAgICAgICAgICAgIGUoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkZPQ1VTX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiB1XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAgICAgTCA9IGZ1bmN0aW9uIEwoZSkge1xuICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgIHIgPSBlLnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICghciB8fCByIGluc3RhbmNlb2YgTm9kZSAmJiAhKG51bGwgPT09ICh0ID0gay5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LmNvbnRhaW5zKHIpKSkgJiYgeCh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5CTFVSXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICAgICBDID0gZnVuY3Rpb24gQyhlKSB7XG4gICAgICAgIFwiRXNjYXBlXCIgPT09IGUua2V5ID8geCh7XG4gICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUXG4gICAgICAgIH0pIDogXCJUYWJcIiA9PT0gZS5rZXkgfHwgXCJFbnRlclwiID09PSBlLmtleSA/IChlLnByZXZlbnREZWZhdWx0KCksIFMuZm9jdXNlZE9wdGlvbiAmJiB4KHtcbiAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLlNFTEVDVF9PUFRJT04sXG4gICAgICAgICAgb3B0aW9uOiBTLmZvY3VzZWRPcHRpb25cbiAgICAgICAgfSkpIDogXCJBcnJvd0Rvd25cIiA9PT0gZS5rZXkgfHwgXCJEb3duXCIgPT09IGUua2V5ID8gKGUucHJldmVudERlZmF1bHQoKSwgVCh4LCBTLCB1Lk5leHQpKSA6IFwiQXJyb3dVcFwiICE9PSBlLmtleSAmJiBcIlVwXCIgIT09IGUua2V5IHx8IChlLnByZXZlbnREZWZhdWx0KCksIFQoeCwgUywgdS5QcmV2aW91cykpO1xuICAgICAgfSxcbiAgICAgICAgICBGID0gUy5zZWxlY3RlZE9wdGlvbiAmJiBTLnNlbGVjdGVkT3B0aW9uLmxhYmVsID09PSBTLmlucHV0VmFsdWUsXG4gICAgICAgICAgUiA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWNvbWJvLWJveFwiLCBwLCB7XG4gICAgICAgIFwidXNhLWNvbWJvLWJveC0tcHJpc3RpbmVcIjogRlxuICAgICAgfSksXG4gICAgICAgICAgVSA9IFwiY29tYm9ib3gtXCIgKyBkICsgXCItbGlzdFwiLFxuICAgICAgICAgIEIgPSBcImNvbWJvYm94LVwiICsgZCArIFwiLWFzc2lzdGl2ZS1oaW50XCI7XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3hcIixcbiAgICAgICAgY2xhc3NOYW1lOiBSLFxuICAgICAgICBpZDogbCxcbiAgICAgICAgcmVmOiBrXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLCBfcyh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc2VsZWN0IHVzYS1zci1vbmx5IHVzYS1jb21iby1ib3hfX3NlbGVjdFwiLFxuICAgICAgICBuYW1lOiBkLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICEwLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogbnVsbCA9PT0gKHIgPSBTLnNlbGVjdGVkT3B0aW9uKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLnZhbHVlLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29tYm8tYm94LXNlbGVjdFwiLFxuICAgICAgICBkaXNhYmxlZDogUFxuICAgICAgfSwgXyksIG0ubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCB7XG4gICAgICAgICAga2V5OiBlLnZhbHVlLFxuICAgICAgICAgIHZhbHVlOiBlLnZhbHVlXG4gICAgICAgIH0sIGUubGFiZWwpO1xuICAgICAgfSkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChmLCBfcyh7XG4gICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgICAgcmV0dXJuIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5VUERBVEVfRklMVEVSLFxuICAgICAgICAgICAgdmFsdWU6IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgcmV0dXJuIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5PUEVOX0xJU1RcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgICByID0gZS5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICghciB8fCByIGluc3RhbmNlb2YgTm9kZSAmJiAhKG51bGwgPT09ICh0ID0gay5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LmNvbnRhaW5zKHIpKSkgJiYgUy5mb2N1c01vZGUgIT09IGMuTm9uZSAmJiB4KHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQkxVUlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgaWYgKFwiRXNjYXBlXCIgPT09IGUua2V5KSB4KHtcbiAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuQ0xPU0VfTElTVFxuICAgICAgICAgIH0pO2Vsc2UgaWYgKFwiQXJyb3dEb3duXCIgPT09IGUua2V5IHx8IFwiRG93blwiID09IGUua2V5KSBlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IFMuc2VsZWN0ZWRPcHRpb24gfHwgUy5mb2N1c2VkT3B0aW9uIHx8IFMuZmlsdGVyZWRPcHRpb25zWzBdXG4gICAgICAgICAgfSk7ZWxzZSBpZiAoXCJUYWJcIiA9PT0gZS5rZXkpIHtcbiAgICAgICAgICAgIGlmIChTLmlzT3BlbiAmJiAhUy5zZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICB2YXIgdCA9IEUgPyBTLmZvY3VzZWRPcHRpb24gOiBTLnNlbGVjdGVkT3B0aW9uIHx8IFMuZm9jdXNlZE9wdGlvbjtcbiAgICAgICAgICAgICAgdCA/IChlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuRk9DVVNfT1BUSU9OLFxuICAgICAgICAgICAgICAgIG9wdGlvbjogdFxuICAgICAgICAgICAgICB9KSkgOiB4KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICFTLmlzT3BlbiAmJiBTLnNlbGVjdGVkT3B0aW9uICYmIHgoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkJMVVJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCJFbnRlclwiID09PSBlLmtleSAmJiBTLmlzT3Blbikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIHIgPSBTLmZpbHRlcmVkT3B0aW9ucy5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IFMuaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByID8geCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuU0VMRUNUX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiByXG4gICAgICAgICAgICB9KSA6IFMuc2VsZWN0ZWRPcHRpb24gPyB4KHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUXG4gICAgICAgICAgICB9KSA6IHgoe1xuICAgICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMRUFSXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBTLmlucHV0VmFsdWUsXG4gICAgICAgIGZvY3VzZWQ6IFMuZm9jdXNNb2RlID09PSBjLklucHV0LFxuICAgICAgICByb2xlOiBcImNvbWJvYm94XCIsXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IFUsXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiBCLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogUy5pc09wZW4sXG4gICAgICAgIGRpc2FibGVkOiBQXG4gICAgICB9LCBoKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29tYm8tYm94X19jbGVhci1pbnB1dF9fd3JhcHBlclwiLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb21iby1ib3hfX2NsZWFyLWlucHV0XCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIkNsZWFyIHRoZSBzZWxlY3QgY29udGVudHNcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICByZXR1cm4geCh7XG4gICAgICAgICAgICB0eXBlOiBpLkFjdGlvblR5cGVzLkNMRUFSXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtY2xlYXItYnV0dG9uXCIsXG4gICAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgICAgICBcIlRhYlwiID09PSBlLmtleSAmJiBTLmlzT3BlbiAmJiBTLnNlbGVjdGVkT3B0aW9uICYmIChlLnByZXZlbnREZWZhdWx0KCksIHgoe1xuICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICBvcHRpb246IFMuc2VsZWN0ZWRPcHRpb25cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhpZGRlbjogIUZcbiAgICAgIH0sIFwiwqBcIikpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9faW5wdXQtYnV0dG9uLXNlcGFyYXRvclwiXG4gICAgICB9LCBcIsKgXCIpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fdG9nZ2xlLWxpc3RfX3dyYXBwZXJcIixcbiAgICAgICAgdGFiSW5kZXg6IC0xXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtdG9nZ2xlXCIsXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29tYm8tYm94X190b2dnbGUtbGlzdFwiLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIlRvZ2dsZSB0aGUgZHJvcGRvd24gbGlzdFwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHJldHVybiB4KHtcbiAgICAgICAgICAgIHR5cGU6IFMuaXNPcGVuID8gaS5BY3Rpb25UeXBlcy5DTE9TRV9MSVNUIDogaS5BY3Rpb25UeXBlcy5PUEVOX0xJU1RcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZWQ6IFBcbiAgICAgIH0sIFwiwqBcIikpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9zKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNvbWJvLWJveC1vcHRpb24tbGlzdFwiLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGlkOiBVLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fbGlzdFwiLFxuICAgICAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICAgICAgaGlkZGVuOiAhUy5pc09wZW5cbiAgICAgIH0sIGopLCBTLmZpbHRlcmVkT3B0aW9ucy5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBlID09PSBTLmZvY3VzZWRPcHRpb24sXG4gICAgICAgICAgICBhID0gZSA9PT0gUy5zZWxlY3RlZE9wdGlvbixcbiAgICAgICAgICAgIGwgPSAoMCwgby5kZWZhdWx0KShcInVzYS1jb21iby1ib3hfX2xpc3Qtb3B0aW9uXCIsIHtcbiAgICAgICAgICBcInVzYS1jb21iby1ib3hfX2xpc3Qtb3B0aW9uLS1mb2N1c2VkXCI6IHIsXG4gICAgICAgICAgXCJ1c2EtY29tYm8tYm94X19saXN0LW9wdGlvbi0tc2VsZWN0ZWRcIjogYVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIHJlZjogciA/IEEgOiBudWxsLFxuICAgICAgICAgIHZhbHVlOiBlLnZhbHVlLFxuICAgICAgICAgIGtleTogZS52YWx1ZSxcbiAgICAgICAgICBjbGFzc05hbWU6IGwsXG4gICAgICAgICAgdGFiSW5kZXg6IHIgPyAwIDogLTEsXG4gICAgICAgICAgcm9sZTogXCJvcHRpb25cIixcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogYSxcbiAgICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiA2NCxcbiAgICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogdCArIDEsXG4gICAgICAgICAgaWQ6IFUgKyBcIi0tb3B0aW9uLVwiICsgdCxcbiAgICAgICAgICBvbktleURvd246IEMsXG4gICAgICAgICAgb25CbHVyOiBMLFxuICAgICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtb3B0aW9uLVwiICsgZS52YWx1ZSxcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB4KHtcbiAgICAgICAgICAgICAgdHlwZTogaS5BY3Rpb25UeXBlcy5GT0NVU19PUFRJT04sXG4gICAgICAgICAgICAgIG9wdGlvbjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgeCh7XG4gICAgICAgICAgICAgIHR5cGU6IGkuQWN0aW9uVHlwZXMuU0VMRUNUX09QVElPTixcbiAgICAgICAgICAgICAgb3B0aW9uOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUubGFiZWwpO1xuICAgICAgfSksIDAgPT09IFMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA/IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fbGlzdC1vcHRpb24tLW5vLXJlc3VsdHNcIlxuICAgICAgfSwgZyB8fCBcIk5vIHJlc3VsdHMgZm91bmRcIikgOiBudWxsKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbWJvLWJveF9fc3RhdHVzIHVzYS1zci1vbmx5XCIsXG4gICAgICAgIHJvbGU6IFwic3RhdHVzXCJcbiAgICAgIH0pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBpZDogQixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zci1vbmx5XCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJjb21iby1ib3gtYXNzaXN0aXZlLWhpbnRcIlxuICAgICAgfSwgTyB8fCBcIldoZW4gYXV0b2NvbXBsZXRlIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB1c2UgdXAgYW5kIGRvd24gYXJyb3dzIHRvIHJldmlld1xcbiAgICAgICAgICAgYW5kIGVudGVyIHRvIHNlbGVjdC4gVG91Y2ggZGV2aWNlIHVzZXJzLCBleHBsb3JlIGJ5IHRvdWNoIG9yIHdpdGggc3dpcGVcXG4gICAgICAgICAgIGdlc3R1cmVzLlwiKSk7XG4gICAgfSk7XG5cbiAgICB0LkNvbWJvQm94ID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRGF0ZVBpY2tlciA9IHQuRm9jdXNNb2RlID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBzKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDYpLFxuICAgICAgICBsID0gcig5KSxcbiAgICAgICAgdSA9IHIoMyksXG4gICAgICAgIGMgPSByKDUzKTtcblxuICAgIGZ1bmN0aW9uIHMoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBkLFxuICAgICAgICBfZiA9IGZ1bmN0aW9uIGYoKSB7XG4gICAgICByZXR1cm4gKF9mID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBwID0gZnVuY3Rpb24gcChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Gb2N1c01vZGUgPSBkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLk5vbmUgPSAwXSA9IFwiTm9uZVwiLCBlW2UuSW5wdXQgPSAxXSA9IFwiSW5wdXRcIjtcbiAgICB9KGQgfHwgKHQuRm9jdXNNb2RlID0gZCA9IHt9KSk7XG5cbiAgICB2YXIgbSA9IGZ1bmN0aW9uIG0oZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHMgPSBlLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICBtID0gZS5kaXNhYmxlZCxcbiAgICAgICAgICB5ID0gZS5yZXF1aXJlZCxcbiAgICAgICAgICBiID0gZS5taW5EYXRlLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBpLkRFRkFVTFRfTUlOX0RBVEUgOiBiLFxuICAgICAgICAgIE8gPSBlLm1heERhdGUsXG4gICAgICAgICAgZyA9IGUucmFuZ2VEYXRlLFxuICAgICAgICAgIF8gPSBlLm9uQ2hhbmdlLFxuICAgICAgICAgIGggPSBlLm9uQmx1cixcbiAgICAgICAgICBqID0gZS5pMThuLFxuICAgICAgICAgIE0gPSB2b2lkIDAgPT09IGogPyBsLkVOX1VTIDogaixcbiAgICAgICAgICBOID0gcChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJkaXNhYmxlZFwiLCBcInJlcXVpcmVkXCIsIFwibWluRGF0ZVwiLCBcIm1heERhdGVcIiwgXCJyYW5nZURhdGVcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQmx1clwiLCBcImkxOG5cIl0pLFxuICAgICAgICAgIEUgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIHcgPSAoMCwgbi51c2VTdGF0ZSkoXCJcIiksXG4gICAgICAgICAgSSA9IHdbMF0sXG4gICAgICAgICAgRCA9IHdbMV0sXG4gICAgICAgICAgUyA9ICgwLCBuLnVzZVN0YXRlKShcIlwiKSxcbiAgICAgICAgICB4ID0gU1swXSxcbiAgICAgICAgICBrID0gU1sxXSxcbiAgICAgICAgICBBID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBUID0gQVswXSxcbiAgICAgICAgICBMID0gQVsxXSxcbiAgICAgICAgICBDID0gKDAsIG4udXNlU3RhdGUpKHZvaWQgMCksXG4gICAgICAgICAgRiA9IENbMF0sXG4gICAgICAgICAgUiA9IENbMV0sXG4gICAgICAgICAgVSA9ICgwLCBuLnVzZVN0YXRlKSgwKSxcbiAgICAgICAgICBCID0gVVswXSxcbiAgICAgICAgICBXID0gVVsxXSxcbiAgICAgICAgICB6ID0gKDAsIG4udXNlU3RhdGUpKFtdKSxcbiAgICAgICAgICBZID0gelswXSxcbiAgICAgICAgICBWID0gelsxXSxcbiAgICAgICAgICBHID0gKDAsIG4udXNlU3RhdGUpKGQuTm9uZSksXG4gICAgICAgICAgSCA9IEdbMF0sXG4gICAgICAgICAgUSA9IEdbMV0sXG4gICAgICAgICAgSyA9ICgwLCBuLnVzZVN0YXRlKSh2b2lkIDApLFxuICAgICAgICAgIFogPSBLWzBdLFxuICAgICAgICAgIFggPSBLWzFdLFxuICAgICAgICAgIEogPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHYpLFxuICAgICAgICAgIHEgPSBPID8gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShPKSA6IHZvaWQgMCxcbiAgICAgICAgICAkID0gZyA/ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoZykgOiB2b2lkIDAsXG4gICAgICAgICAgZWUgPSBmdW5jdGlvbiBlZShlLCB0KSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAhMCk7XG4gICAgICAgIHZhciBhID0gKDAsIHUucGFyc2VEYXRlU3RyaW5nKShlKSxcbiAgICAgICAgICAgIG4gPSBhICYmICgwLCB1LmZvcm1hdERhdGUpKGEsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCk7XG4gICAgICAgIGEgJiYgRChlKSwgbiAmJiBrKG4pLCBfICYmIF8obiksIHQgJiYgKEwoITEpLCBWKFtdKSwgbnVsbCA9PT0gKHIgPSBudWxsID09IFAgPyB2b2lkIDAgOiBQLmN1cnJlbnQpIHx8IHZvaWQgMCA9PT0gciB8fCByLmZvY3VzKCkpO1xuICAgICAgfTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHMgJiYgZWUocywgITEpO1xuICAgICAgfSwgW10pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFQpIHtcbiAgICAgICAgICB2YXIgZSA9IEUuY3VycmVudCAmJiBFLmN1cnJlbnQucXVlcnlTZWxlY3RvcihcIi51c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1mb2N1c2VkXCIpO1xuICAgICAgICAgIGUgJiYgZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCBbVF0pLCAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZSxcbiAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgcixcbiAgICAgICAgICAgICAgYSxcbiAgICAgICAgICAgICAgbiA9ICgwLCB1LmlzRGF0ZUludmFsaWQpKHgsIEosIHEpO1xuICAgICAgICAgIG4gJiYgIShudWxsID09PSAoZSA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52YWxpZGF0aW9uTWVzc2FnZSkgJiYgKG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5zZXRDdXN0b21WYWxpZGl0eShpLlZBTElEQVRJT05fTUVTU0FHRSkpLCBuIHx8IChudWxsID09PSAociA9IG51bGwgPT0gUCA/IHZvaWQgMCA6IFAuY3VycmVudCkgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci52YWxpZGF0aW9uTWVzc2FnZSkgIT09IGkuVkFMSURBVElPTl9NRVNTQUdFIHx8IG51bGwgPT09IChhID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IGEgfHwgYS5zZXRDdXN0b21WYWxpZGl0eShcIlwiKTtcbiAgICAgICAgfSgpO1xuICAgICAgfSwgW3gsIHYsIE9dKTtcbiAgICAgIHZhciB0ZSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyXCIsIFwidXNhLWRhdGUtcGlja2VyLS1pbml0aWFsaXplZFwiLCB7XG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyLS1hY3RpdmVcIjogVFxuICAgICAgfSwgYSksXG4gICAgICAgICAgcmUgPSBNLnRvZ2dsZUNhbGVuZGFyO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdGUsXG4gICAgICAgIHJlZjogRSxcbiAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIChudWxsID09PSAodCA9IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5jb250YWlucyhudWxsID09IGUgPyB2b2lkIDAgOiBlLnJlbGF0ZWRUYXJnZXQpKSB8fCAoVCAmJiAoTCghMSksIFYoW10pKSwgaCAmJiBoKGUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIFwiRXNjYXBlXCIgPT09IGUua2V5ICYmIChUICYmIChMKCExKSwgVihbXSksIG51bGwgPT09ICh0ID0gbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5mb2N1cygpKSwgZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZih7fSwgTiwge1xuICAgICAgICBuYW1lOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZGF0ZS1waWNrZXItaW50ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pbnB1dCB1c2Etc3Itb25seSB1c2EtZGF0ZS1waWNrZXJfX2ludGVybmFsLWlucHV0XCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6ICEwLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIHJlcXVpcmVkOiAhMSxcbiAgICAgICAgZGlzYWJsZWQ6ICExLFxuICAgICAgICB2YWx1ZTogSSxcbiAgICAgICAgcmVhZE9ubHk6ICEwXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fd3JhcHBlclwiLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2Yoe30sIE4sIHtcbiAgICAgICAgaWQ6IHQsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1leHRlcm5hbC1pbnB1dFwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWlucHV0IHVzYS1kYXRlLXBpY2tlcl9fZXh0ZXJuYWwtaW5wdXRcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGRpc2FibGVkOiBtLFxuICAgICAgICByZXF1aXJlZDogeSxcbiAgICAgICAgdmFsdWU6IHgsXG4gICAgICAgIHJlZjogUCxcbiAgICAgICAgb25JbnB1dDogZnVuY3Rpb24gb25JbnB1dChlKSB7XG4gICAgICAgICAgdmFyIHQgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICBrKHQpLCBfICYmIF8odCk7XG4gICAgICAgICAgdmFyIHIgPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHQsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCwgITApLFxuICAgICAgICAgICAgICBhID0gXCJcIjtcblxuICAgICAgICAgIGlmIChyICYmICEoMCwgdS5pc0RhdGVJbnZhbGlkKSh0LCBKLCBxKSAmJiAoYSA9ICgwLCB1LmZvcm1hdERhdGUpKHIpKSwgSSAhPT0gYSAmJiBEKGEpLCByICYmIFQpIHtcbiAgICAgICAgICAgIHZhciBuID0gKDAsIHUua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShyLCBKLCBxKTtcbiAgICAgICAgICAgIFIobik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICAgIFEoZC5JbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICAgICAgICBRKGQuTm9uZSksIGggJiYgaChlKTtcbiAgICAgICAgfVxuICAgICAgfSkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1idXR0b25cIixcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiAhMCxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHJlLFxuICAgICAgICBkaXNhYmxlZDogbSxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICBpZiAoVCkgVihbXSk7ZWxzZSB7XG4gICAgICAgICAgICB2YXIgdCA9ICgwLCB1LnBhcnNlRGF0ZVN0cmluZykoeCwgaS5ERUZBVUxUX0VYVEVSTkFMX0RBVEVfRk9STUFULCAhMCksXG4gICAgICAgICAgICAgICAgciA9ICgwLCB1LmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCB8fCBzICYmICgwLCB1LnBhcnNlRGF0ZVN0cmluZykocykgfHwgKDAsIHUudG9kYXkpKCksIEosIHEpO1xuICAgICAgICAgICAgUihyKSwgVyhudWxsID09PSAoZSA9IG51bGwgPT0gRSA/IHZvaWQgMCA6IEUuY3VycmVudCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgdmFyIGEgPSBNLnN0YXR1c2VzLFxuICAgICAgICAgICAgICAgIG4gPSAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpO1xuXG4gICAgICAgICAgICBpZiAobiAmJiAoMCwgdS5pc1NhbWVEYXkpKG4sICgwLCB1LmFkZERheXMpKHIsIDApKSkge1xuICAgICAgICAgICAgICB2YXIgbyA9IE0uc2VsZWN0ZWREYXRlO1xuICAgICAgICAgICAgICBhLnVuc2hpZnQobyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFYoYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEwoIVQpO1xuICAgICAgICB9XG4gICAgICB9LCBcIsKgXCIpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlLXBpY2tlci1jYWxlbmRhclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhclwiLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJ0cnVlXCIsXG4gICAgICAgIGhpZGRlbjogIVQsXG4gICAgICAgIFwiZGF0YS12YWx1ZVwiOiBGICYmICgwLCB1LmZvcm1hdERhdGUpKEYpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHRvcDogQiArIFwicHhcIlxuICAgICAgICB9LFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgWChlLmtleUNvZGUpO1xuICAgICAgICB9LFxuICAgICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKGUpIHtcbiAgICAgICAgICBlLmtleUNvZGUgIT09IFogJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9LCBUICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuQ2FsZW5kYXIsIHtcbiAgICAgICAgZGF0ZTogRixcbiAgICAgICAgaGFuZGxlU2VsZWN0RGF0ZTogZWUsXG4gICAgICAgIG1pbkRhdGU6IEosXG4gICAgICAgIG1heERhdGU6IHEsXG4gICAgICAgIHJhbmdlRGF0ZTogJCxcbiAgICAgICAgc2VsZWN0ZWREYXRlOiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKEkpLFxuICAgICAgICBzZXRTdGF0dXNlczogVixcbiAgICAgICAgZm9jdXNNb2RlOiBILFxuICAgICAgICBpMThuOiBNXG4gICAgICB9KSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcGlja2VyLXN0YXR1c1wiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXNyLW9ubHkgdXNhLWRhdGUtcGlja2VyX19zdGF0dXNcIixcbiAgICAgICAgcm9sZTogXCJzdGF0dXNcIixcbiAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgfSwgWS5qb2luKFwiLiBcIikpKSk7XG4gICAgfTtcblxuICAgIHQuRGF0ZVBpY2tlciA9IG0sIG0uZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJcIiwgbS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBtaW5EYXRlOiBpLkRFRkFVTFRfTUlOX0RBVEVcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5OYXZDbG9zZUJ1dHRvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gaShyKDcyKSk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMyA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuTmF2Q2xvc2VCdXR0b24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGkgPSB1KGUsIFtcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1uYXZfX2Nsb3NlXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9sMyh7XG4gICAgICAgIGNsYXNzTmFtZTogYyxcbiAgICAgICAgb25DbGljazogdCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5hdkNsb3NlQnV0dG9uXCJcbiAgICAgIH0sIGksIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJjbG9zZVwiXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDQgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS50eXBlLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGkgPSBlLnNlY29uZGFyeSxcbiAgICAgICAgICBjID0gZS5iYXNlLFxuICAgICAgICAgIHMgPSBlLmFjY2VudCxcbiAgICAgICAgICBkID0gZS5hY2NlbnRTdHlsZSxcbiAgICAgICAgICBmID0gZS5vdXRsaW5lLFxuICAgICAgICAgIHAgPSBlLmludmVyc2UsXG4gICAgICAgICAgbSA9IGUuc2l6ZSxcbiAgICAgICAgICB5ID0gZS5iaWcsXG4gICAgICAgICAgYiA9IGUuc21hbGwsXG4gICAgICAgICAgdiA9IGUuaWNvbixcbiAgICAgICAgICBPID0gZS51bnN0eWxlZCxcbiAgICAgICAgICBnID0gZS5vbkNsaWNrLFxuICAgICAgICAgIF8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBoID0gdShlLCBbXCJ0eXBlXCIsIFwiY2hpbGRyZW5cIiwgXCJzZWNvbmRhcnlcIiwgXCJiYXNlXCIsIFwiYWNjZW50XCIsIFwiYWNjZW50U3R5bGVcIiwgXCJvdXRsaW5lXCIsIFwiaW52ZXJzZVwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJzbWFsbFwiLCBcImljb25cIiwgXCJ1bnN0eWxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgICAgeSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemUuXCIpLCB2ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJCdXR0b24gcHJvcGVydHkgaWNvbiBpcyBkZXByZWNhdGVkLlwiKSwgcyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiQnV0dG9uIHByb3BlcnR5IGFjY2VudCBpcyBkZXByZWNhdGVkLiBVc2UgYWNjZW50U3R5bGUuXCIpO1xuICAgICAgdmFyIGogPSBtID8gXCJiaWdcIiA9PT0gbSA6IHksXG4gICAgICAgICAgTSA9IG0gPyBcInNtYWxsXCIgPT09IG0gOiBiO1xuICAgICAgTSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiU21hbGwgYnV0dG9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZGVmYXVsdCwgcGFzcyBpbiBhIGN1c3RvbSBjbGFzc05hbWUsIG9yIHVzZSBzaXplIGJpZy5cIik7XG4gICAgICB2YXIgTiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJ1dHRvblwiLCB7XG4gICAgICAgIFwidXNhLWJ1dHRvbi0tc2Vjb25kYXJ5XCI6IGksXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYmFzZVwiOiBjLFxuICAgICAgICBcInVzYS1idXR0b24tLWFjY2VudC1jb29sXCI6IHMgfHwgXCJjb29sXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tYWNjZW50LXdhcm1cIjogXCJ3YXJtXCIgPT09IGQsXG4gICAgICAgIFwidXNhLWJ1dHRvbi0tb3V0bGluZVwiOiBmLFxuICAgICAgICBcInVzYS1idXR0b24tLWludmVyc2VcIjogcCxcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1iaWdcIjogaixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS1zbWFsbFwiOiBNLFxuICAgICAgICBcInVzYS1idXR0b24tLWljb25cIjogdixcbiAgICAgICAgXCJ1c2EtYnV0dG9uLS11bnN0eWxlZFwiOiBPXG4gICAgICB9LCBfKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfbDQoe1xuICAgICAgICB0eXBlOiB0LFxuICAgICAgICBjbGFzc05hbWU6IE4sXG4gICAgICAgIG9uQ2xpY2s6IGcsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJidXR0b25cIlxuICAgICAgfSwgaCksIHIpO1xuICAgIH07XG5cbiAgICB0LkJ1dHRvbiA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBjLCB0LkdyaWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBpID0gZS5yb3csXG4gICAgICAgICAgZCA9IGUuY29sLFxuICAgICAgICAgIGYgPSBlLmdhcCxcbiAgICAgICAgICBwID0gZS5vZmZzZXQsXG4gICAgICAgICAgbSA9IGUubW9iaWxlLFxuICAgICAgICAgIHkgPSBlLm1vYmlsZUxnLFxuICAgICAgICAgIGIgPSBlLnRhYmxldCxcbiAgICAgICAgICB2ID0gZS50YWJsZXRMZyxcbiAgICAgICAgICBPID0gZS5kZXNrdG9wLFxuICAgICAgICAgIGcgPSBlLmRlc2t0b3BMZyxcbiAgICAgICAgICBfID0gZS53aWRlc2NyZWVuLFxuICAgICAgICAgIGggPSB1KGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwicm93XCIsIFwiY29sXCIsIFwiZ2FwXCIsIFwib2Zmc2V0XCIsIFwibW9iaWxlXCIsIFwibW9iaWxlTGdcIiwgXCJ0YWJsZXRcIiwgXCJ0YWJsZXRMZ1wiLCBcImRlc2t0b3BcIiwgXCJkZXNrdG9wTGdcIiwgXCJ3aWRlc2NyZWVuXCJdKSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICBtb2JpbGU6IG0sXG4gICAgICAgIG1vYmlsZUxnOiB5LFxuICAgICAgICB0YWJsZXQ6IGIsXG4gICAgICAgIHRhYmxldExnOiB2LFxuICAgICAgICBkZXNrdG9wOiBPLFxuICAgICAgICBkZXNrdG9wTGc6IGcsXG4gICAgICAgIHdpZGVzY3JlZW46IF9cbiAgICAgIH0sXG4gICAgICAgICAgTSA9IHMoe1xuICAgICAgICByb3c6IGksXG4gICAgICAgIGNvbDogZCxcbiAgICAgICAgZ2FwOiBmLFxuICAgICAgICBvZmZzZXQ6IHBcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoby5icmVha3BvaW50cykuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgciA9IHQ7XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqLCByKSkge1xuICAgICAgICAgIHZhciBhID0gZVtyXTtcbiAgICAgICAgICBNID0gKDAsIG4uZGVmYXVsdCkoTSwgcyhhLCByKSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCBNID0gKDAsIG4uZGVmYXVsdCkoTSwgciksIGMoaCkpIHtcbiAgICAgICAgdmFyIE4gPSBoLmFzQ3VzdG9tLFxuICAgICAgICAgICAgRSA9IHUoaCwgW1wiYXNDdXN0b21cIl0pO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTiwgX2w1KHtcbiAgICAgICAgICBjbGFzc05hbWU6IE1cbiAgICAgICAgfSwgRSksIHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2w1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBNLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZ3JpZFwiXG4gICAgICB9LCBoKSwgdCk7XG4gICAgfSwgdC5hcHBseUdyaWRDbGFzc2VzID0gdC5nZXRHcmlkQ2xhc3NlcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcig0Nik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sNSA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGMoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIHZhciBzID0gZnVuY3Rpb24gcyhlLCB0KSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHt9KTtcbiAgICAgIHZhciBhID0gdCA/IG8uYnJlYWtwb2ludHNbdF0gKyBcIjpcIiA6IFwiXCIsXG4gICAgICAgICAgaSA9IGUucm93LFxuICAgICAgICAgIGwgPSBlLmNvbCxcbiAgICAgICAgICB1ID0gZS5nYXAsXG4gICAgICAgICAgYyA9IGUub2Zmc2V0O1xuICAgICAgcmV0dXJuICgwLCBuLmRlZmF1bHQpKCgociA9IHt9KVthICsgXCJncmlkLXJvd1wiXSA9IGksIHJbYSArIFwiZ3JpZC1nYXBcIl0gPSAhMCA9PT0gdSwgclthICsgXCJncmlkLWdhcC1cIiArIHVdID0gITAgIT09IHUgJiYgISF1LCByW2EgKyBcImdyaWQtY29sXCJdID0gITAgPT09IGwsIHJbYSArIFwiZ3JpZC1jb2wtXCIgKyBsXSA9ICEwICE9PSBsICYmICEhbCwgclthICsgXCJncmlkLW9mZnNldC1cIiArIGNdID0gISFjLCByKSk7XG4gICAgfTtcblxuICAgIHQuZ2V0R3JpZENsYXNzZXMgPSBzO1xuXG4gICAgdC5hcHBseUdyaWRDbGFzc2VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gcyhlKTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvLmJyZWFrcG9pbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIHZhciBhID0gcjtcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpKSB7XG4gICAgICAgICAgdmFyIG8gPSBlW2FdO1xuICAgICAgICAgIHQgPSAoMCwgbi5kZWZhdWx0KSh0LCBzKG8sIGEpKTtcbiAgICAgICAgfVxuICAgICAgfSksIHQ7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVGV4dGFyZWEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBvID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgdSA9IGUuZXJyb3IsXG4gICAgICAgICAgYyA9IGUuc3VjY2VzcyxcbiAgICAgICAgICBzID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBkID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcInN1Y2Nlc3NcIiwgXCJjaGlsZHJlblwiLCBcImlucHV0UmVmXCJdKSxcbiAgICAgICAgICBwID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtdGV4dGFyZWFcIiwge1xuICAgICAgICBcInVzYS1pbnB1dC0tZXJyb3JcIjogdSxcbiAgICAgICAgXCJ1c2EtaW5wdXQtLXN1Y2Nlc3NcIjogY1xuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfaTMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidGV4dGFyZWFcIixcbiAgICAgICAgY2xhc3NOYW1lOiBwLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgcmVmOiBkXG4gICAgICB9LCBmKSwgcyk7XG4gICAgfTtcblxuICAgIHQuVGV4dGFyZWEgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb3JtID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuRm9ybSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUub25TdWJtaXQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhcmdlLFxuICAgICAgICAgIGMgPSBlLnNlYXJjaCxcbiAgICAgICAgICBzID0gbChlLCBbXCJvblN1Ym1pdFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwibGFyZ2VcIiwgXCJzZWFyY2hcIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWZvcm1cIjogIWMsXG4gICAgICAgIFwidXNhLWZvcm0tLWxhcmdlXCI6IHVcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCBfaTQoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9ybVwiLFxuICAgICAgICBjbGFzc05hbWU6IGQsXG4gICAgICAgIG9uU3VibWl0OiB0XG4gICAgICB9LCBzKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRm9vdGVyRXh0ZW5kZWROYXZMaXN0ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAobCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdC5Gb290ZXJFeHRlbmRlZE5hdkxpc3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5pc01vYmlsZSxcbiAgICAgICAgICBhID0gZS5uZXN0ZWRMaW5rcyxcbiAgICAgICAgICBpID0gKDAsIG8uZGVmYXVsdCkoXCJncmlkLXJvdyBncmlkLWdhcC00XCIsIHQpLFxuICAgICAgICAgIGwgPSB3aW5kb3cgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93LFxuICAgICAgICAgIGMgPSBuLmRlZmF1bHQudXNlU3RhdGUobCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDQ4MCksXG4gICAgICAgICAgcyA9IGNbMF0sXG4gICAgICAgICAgZCA9IGNbMV0sXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVN0YXRlKShBcnJheShhLmxlbmd0aCkuZmlsbCghMSkpLFxuICAgICAgICAgIHAgPSBmWzBdLFxuICAgICAgICAgIG0gPSBmWzFdLFxuICAgICAgICAgIHkgPSByIHx8IHZvaWQgMCA9PT0gciAmJiBzO1xuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcikgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGUpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgICAgdmFyIGUgPSBsICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgNDgwO1xuICAgICAgICAgIGUgIT09IHMgJiYgZChlKTtcbiAgICAgICAgfVxuICAgICAgfSwgW10pO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpXG4gICAgICB9LCBhLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGtleTogXCJsaW5rU2VjdGlvbi1cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIm1vYmlsZS1sZzpncmlkLWNvbC02IGRlc2t0b3A6Z3JpZC1jb2wtM1wiXG4gICAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHUsIHtcbiAgICAgICAgICBvblRvZ2dsZTogeSA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlID0gdCwgdm9pZCBtKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHZhciByID0gQXJyYXkoYS5sZW5ndGgpLmZpbGwoITEpO1xuICAgICAgICAgICAgICByZXR1cm4gcltlXSA9ICF0W2VdLCByO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgICB9IDogdm9pZCAwLFxuICAgICAgICAgIGlzT3BlbjogIXkgfHwgcFt0XSxcbiAgICAgICAgICBsaW5rczogZVxuICAgICAgICB9KSk7XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHZhciB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuaXNPcGVuLFxuICAgICAgICAgIHIgPSB2b2lkIDAgIT09IHQgJiYgdCxcbiAgICAgICAgICBhID0gZS5saW5rcyxcbiAgICAgICAgICBsID0gZS5vblRvZ2dsZSxcbiAgICAgICAgICB1ID0gYVswXSxcbiAgICAgICAgICBjID0gYS5zbGljZSgxKSxcbiAgICAgICAgICBzID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19wcmltYXJ5LWNvbnRlbnQgdXNhLWZvb3Rlcl9fcHJpbWFyeS1jb250ZW50LS1jb2xsYXBzaWJsZVwiLCB7XG4gICAgICAgIGhpZGRlbjogIXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgb25DbGljazogbCxcbiAgICAgICAgb25LZXlQcmVzczogbFxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoNFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZm9vdGVyX19wcmltYXJ5LWxpbmtcIlxuICAgICAgfSwgdSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICB0eXBlOiBcImZvb3RlclNlY29uZGFyeVwiLFxuICAgICAgICBpdGVtczogY1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbGVydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gYS5BbGVydDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWNjb3JkaW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuLkFjY29yZGlvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR292QmFubmVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvLkdvdkJhbm5lcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnV0dG9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLkJ1dHRvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQnV0dG9uR3JvdXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGwuQnV0dG9uR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxpbmtcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHUuTGluaztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGFibGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGMuVGFibGU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRhZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gcy5UYWc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlRvb2x0aXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGQuVG9vbHRpcDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU2lkZU5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZi5TaWRlTmF2O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBwLkNvbGxlY3Rpb247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25JdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBtLkNvbGxlY3Rpb25JdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb2xsZWN0aW9uSGVhZGluZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4geS5Db2xsZWN0aW9uSGVhZGluZztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbkRlc2NyaXB0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBiLkNvbGxlY3Rpb25EZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbk1ldGFcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHYuQ29sbGVjdGlvbk1ldGE7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25NZXRhSXRlbVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gTy5Db2xsZWN0aW9uTWV0YUl0ZW07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25NZXRhSXRlbVRhZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZy5Db2xsZWN0aW9uTWV0YUl0ZW1UYWc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNvbGxlY3Rpb25UaHVtYm5haWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIF8uQ29sbGVjdGlvblRodW1ibmFpbDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ29sbGVjdGlvbkNhbGVuZGFyRGF0ZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaC5Db2xsZWN0aW9uQ2FsZW5kYXJEYXRlO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJHcmlkQ29udGFpbmVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBqLkdyaWRDb250YWluZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkdyaWRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE0uR3JpZDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2hhcmFjdGVyQ291bnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE4uQ2hhcmFjdGVyQ291bnQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNoZWNrYm94XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFLkNoZWNrYm94O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDb21ib0JveFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUC5Db21ib0JveDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZUlucHV0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB3LkRhdGVJbnB1dDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZUlucHV0R3JvdXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEkuRGF0ZUlucHV0R3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkRhdGVQaWNrZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEQuRGF0ZVBpY2tlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRGF0ZVJhbmdlUGlja2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBTLkRhdGVSYW5nZVBpY2tlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRHJvcGRvd25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHguRHJvcGRvd247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkVycm9yTWVzc2FnZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gay5FcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZpZWxkc2V0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBBLkZpZWxkc2V0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGaWxlSW5wdXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFQuRmlsZUlucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGb3JtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBMLkZvcm07XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvcm1Hcm91cFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gQy5Gb3JtR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxhYmVsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBGLkxhYmVsO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJSYWRpb1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gUi5SYWRpbztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUmFuZ2VJbnB1dFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVS5SYW5nZUlucHV0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUZXh0YXJlYVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gQi5UZXh0YXJlYTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGV4dElucHV0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBXLlRleHRJbnB1dDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVGltZVBpY2tlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gei5UaW1lUGlja2VyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJWYWxpZGF0aW9uQ2hlY2tsaXN0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBZLlZhbGlkYXRpb25DaGVja2xpc3Q7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlZhbGlkYXRpb25JdGVtXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWLlZhbGlkYXRpb25JdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJFeHRlbmRlZE5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRy5FeHRlbmRlZE5hdjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSGVhZGVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBILkhlYWRlcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTWVnYU1lbnVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFEuTWVnYU1lbnU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1lbnVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEsuTWVudTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTmF2Q2xvc2VCdXR0b25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFouTmF2Q2xvc2VCdXR0b247XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk5hdkxpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFguTmF2TGlzdDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiTmF2TWVudUJ1dHRvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSi5OYXZNZW51QnV0dG9uO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJOYXZEcm9wRG93bkJ1dHRvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gcS5OYXZEcm9wRG93bkJ1dHRvbjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJpbWFyeU5hdlwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gJC5QcmltYXJ5TmF2O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJUaXRsZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZWUuVGl0bGU7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRlLklkZW50aWZpZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJHb3ZcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHJlLklkZW50aWZpZXJHb3Y7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJJZGVudGl0eVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gYWUuSWRlbnRpZmllcklkZW50aXR5O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTGlua1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbmUuSWRlbnRpZmllckxpbms7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIklkZW50aWZpZXJMaW5rSXRlbVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gb2UuSWRlbnRpZmllckxpbmtJdGVtO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTGlua3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGllLklkZW50aWZpZXJMaW5rcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllckxvZ29cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGxlLklkZW50aWZpZXJMb2dvO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJJZGVudGlmaWVyTG9nb3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVlLklkZW50aWZpZXJMb2dvcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSWRlbnRpZmllck1hc3RoZWFkXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBjZS5JZGVudGlmaWVyTWFzdGhlYWQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkFkZHJlc3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHNlLkFkZHJlc3M7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkZvb3RlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZGUuRm9vdGVyO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJGb290ZXJFeHRlbmRlZE5hdkxpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZlLkZvb3RlckV4dGVuZGVkTmF2TGlzdDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRm9vdGVyTmF2XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZS5Gb290ZXJOYXY7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkxvZ29cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG1lLkxvZ287XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlNvY2lhbExpbmtzXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB5ZS5Tb2NpYWxMaW5rcztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQ2FyZEdyb3VwXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBiZS5DYXJkR3JvdXA7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHZlLkNhcmQ7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRIZWFkZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE9lLkNhcmRIZWFkZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRNZWRpYVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZ2UuQ2FyZE1lZGlhO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDYXJkQm9keVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gX2UuQ2FyZEJvZHk7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkNhcmRGb290ZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGhlLkNhcmRGb290ZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJCYXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGplLkJyZWFkY3J1bWJCYXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE1lLkJyZWFkY3J1bWI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkJyZWFkY3J1bWJMaW5rXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBOZS5CcmVhZGNydW1iTGluaztcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3RlcEluZGljYXRvclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRWUuU3RlcEluZGljYXRvcjtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3RlcEluZGljYXRvclN0ZXBcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFBlLlN0ZXBJbmRpY2F0b3JTdGVwO1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJTZWFyY2hcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHdlLlNlYXJjaDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU3VtbWFyeUJveFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gSWUuU3VtbWFyeUJveDtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJvY2Vzc0xpc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlLlByb2Nlc3NMaXN0O1xuICAgICAgfVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJQcm9jZXNzTGlzdEl0ZW1cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFNlLlByb2Nlc3NMaXN0SXRlbTtcbiAgICAgIH1cbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUHJvY2Vzc0xpc3RIZWFkaW5nXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiB4ZS5Qcm9jZXNzTGlzdEhlYWRpbmc7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlNpdGVBbGVydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4ga2UuU2l0ZUFsZXJ0O1xuICAgICAgfVxuICAgIH0pLCByKDIwKTtcblxuICAgIHZhciBhID0gcigyMSksXG4gICAgICAgIG4gPSByKDIzKSxcbiAgICAgICAgbyA9IHIoMjQpLFxuICAgICAgICBpID0gcigxNCksXG4gICAgICAgIGwgPSByKDI5KSxcbiAgICAgICAgdSA9IHIoMTApLFxuICAgICAgICBjID0gcigzMCksXG4gICAgICAgIHMgPSByKDMyKSxcbiAgICAgICAgZCA9IHIoMzMpLFxuICAgICAgICBmID0gcigzNSksXG4gICAgICAgIHAgPSByKDM2KSxcbiAgICAgICAgbSA9IHIoMzcpLFxuICAgICAgICB5ID0gcigzOCksXG4gICAgICAgIGIgPSByKDM5KSxcbiAgICAgICAgdiA9IHIoNDApLFxuICAgICAgICBPID0gcig0MSksXG4gICAgICAgIGcgPSByKDQyKSxcbiAgICAgICAgXyA9IHIoNDMpLFxuICAgICAgICBoID0gcig0NCksXG4gICAgICAgIGogPSByKDQ1KSxcbiAgICAgICAgTSA9IHIoMTUpLFxuICAgICAgICBOID0gcig0NyksXG4gICAgICAgIEUgPSByKDQ4KSxcbiAgICAgICAgUCA9IHIoMTEpLFxuICAgICAgICB3ID0gcig1MSksXG4gICAgICAgIEkgPSByKDUyKSxcbiAgICAgICAgRCA9IHIoMTIpLFxuICAgICAgICBTID0gcig1NyksXG4gICAgICAgIHggPSByKDU4KSxcbiAgICAgICAgayA9IHIoNTkpLFxuICAgICAgICBBID0gcig2MCksXG4gICAgICAgIFQgPSByKDYxKSxcbiAgICAgICAgTCA9IHIoMTcpLFxuICAgICAgICBDID0gcig4KSxcbiAgICAgICAgRiA9IHIoNSksXG4gICAgICAgIFIgPSByKDY0KSxcbiAgICAgICAgVSA9IHIoNjUpLFxuICAgICAgICBCID0gcigxNiksXG4gICAgICAgIFcgPSByKDcpLFxuICAgICAgICB6ID0gcig2NiksXG4gICAgICAgIFkgPSByKDY5KSxcbiAgICAgICAgViA9IHIoNzApLFxuICAgICAgICBHID0gcig3MSksXG4gICAgICAgIEggPSByKDczKSxcbiAgICAgICAgUSA9IHIoNzQpLFxuICAgICAgICBLID0gcig3NSksXG4gICAgICAgIFogPSByKDEzKSxcbiAgICAgICAgWCA9IHIoNCksXG4gICAgICAgIEogPSByKDc2KSxcbiAgICAgICAgcSA9IHIoNzcpLFxuICAgICAgICAkID0gcig3OCksXG4gICAgICAgIGVlID0gcig3OSksXG4gICAgICAgIHRlID0gcig4MCksXG4gICAgICAgIHJlID0gcig4MSksXG4gICAgICAgIGFlID0gcig4MiksXG4gICAgICAgIG5lID0gcig4MyksXG4gICAgICAgIG9lID0gcig4NCksXG4gICAgICAgIGllID0gcig4NSksXG4gICAgICAgIGxlID0gcig4NiksXG4gICAgICAgIHVlID0gcig4NyksXG4gICAgICAgIGNlID0gcig4OCksXG4gICAgICAgIHNlID0gcig4OSksXG4gICAgICAgIGRlID0gcig5MCksXG4gICAgICAgIGZlID0gcigxOCksXG4gICAgICAgIHBlID0gcig5MSksXG4gICAgICAgIG1lID0gcig5MiksXG4gICAgICAgIHllID0gcig5MyksXG4gICAgICAgIGJlID0gcig5NCksXG4gICAgICAgIHZlID0gcig5NSksXG4gICAgICAgIE9lID0gcig5NiksXG4gICAgICAgIGdlID0gcig5NyksXG4gICAgICAgIF9lID0gcig5OCksXG4gICAgICAgIGhlID0gcig5OSksXG4gICAgICAgIGplID0gcigxMDApLFxuICAgICAgICBNZSA9IHIoMTAxKSxcbiAgICAgICAgTmUgPSByKDEwMiksXG4gICAgICAgIEVlID0gcigxMDMpLFxuICAgICAgICBQZSA9IHIoMTA0KSxcbiAgICAgICAgd2UgPSByKDEwNSksXG4gICAgICAgIEllID0gcigxMDYpLFxuICAgICAgICBEZSA9IHIoMTA3KSxcbiAgICAgICAgU2UgPSByKDEwOCksXG4gICAgICAgIHhlID0gcigxMDkpLFxuICAgICAgICBrZSA9IHIoMTEwKTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQWxlcnQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IGkocigyMikpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDYgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0LFxuICAgICAgICAgIHIgPSBlLnR5cGUsXG4gICAgICAgICAgaSA9IGUuaGVhZGluZyxcbiAgICAgICAgICBjID0gZS5jdGEsXG4gICAgICAgICAgcyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZCA9IGUuc2xpbSxcbiAgICAgICAgICBmID0gZS5ub0ljb24sXG4gICAgICAgICAgcCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG0gPSBlLnZhbGlkYXRpb24sXG4gICAgICAgICAgeSA9IHUoZSwgW1widHlwZVwiLCBcImhlYWRpbmdcIiwgXCJjdGFcIiwgXCJjaGlsZHJlblwiLCBcInNsaW1cIiwgXCJub0ljb25cIiwgXCJjbGFzc05hbWVcIiwgXCJ2YWxpZGF0aW9uXCJdKSxcbiAgICAgICAgICBiID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtYWxlcnRcIiwgKCh0ID0ge1xuICAgICAgICBcInVzYS1hbGVydC0tc3VjY2Vzc1wiOiBcInN1Y2Nlc3NcIiA9PT0gcixcbiAgICAgICAgXCJ1c2EtYWxlcnQtLXdhcm5pbmdcIjogXCJ3YXJuaW5nXCIgPT09IHIsXG4gICAgICAgIFwidXNhLWFsZXJ0LS1lcnJvclwiOiBcImVycm9yXCIgPT09IHIsXG4gICAgICAgIFwidXNhLWFsZXJ0LS1pbmZvXCI6IFwiaW5mb1wiID09PSByLFxuICAgICAgICBcInVzYS1hbGVydC0tc2xpbVwiOiBkLFxuICAgICAgICBcInVzYS1hbGVydC0tbm8taWNvblwiOiBmLFxuICAgICAgICBcInVzYS1hbGVydC0tdmFsaWRhdGlvblwiOiBtXG4gICAgICB9KVtvLmRlZmF1bHQuYWxlcnRXaXRoQ1RBXSA9ICEhYywgdCksIHApO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9sNih7XG4gICAgICAgIGNsYXNzTmFtZTogYixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImFsZXJ0XCJcbiAgICAgIH0sIHkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2JvZHlcIlxuICAgICAgfSwgaSAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hbGVydF9faGVhZGluZ1wiXG4gICAgICB9LCBpKSwgcyAmJiAobSA/IHMgOiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWFsZXJ0X190ZXh0XCJcbiAgICAgIH0sIHMpKSksIGMgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgYykpO1xuICAgIH07XG5cbiAgICB0LkFsZXJ0ID0gYztcbiAgICB2YXIgcyA9IGM7XG4gICAgdC5kZWZhdWx0ID0gcztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0ge1xuICAgICAgYWxlcnRXaXRoQ1RBOiBcInNyYy1jb21wb25lbnRzLUFsZXJ0LUFsZXJ0LW1vZHVsZV9fYWxlcnRXaXRoQ1RBLS0xZnJqNVwiXG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQWNjb3JkaW9uID0gdC5BY2NvcmRpb25JdGVtID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBpKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBsID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGwgJiYgKGwuZ2V0IHx8IGwuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBsKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuIChpID0gZnVuY3Rpb24gaShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgX2w3ID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2w3ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gMCwgYSA9IHQubGVuZ3RoLCBuID0gZS5sZW5ndGg7IHIgPCBhOyByKyssIG4rKykge1xuICAgICAgICBlW25dID0gdFtyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfSxcbiAgICAgICAgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLnRpdGxlLFxuICAgICAgICAgIHIgPSBlLmlkLFxuICAgICAgICAgIGEgPSBlLmNvbnRlbnQsXG4gICAgICAgICAgaSA9IGUuZXhwYW5kZWQsXG4gICAgICAgICAgbCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVRvZ2dsZSxcbiAgICAgICAgICBjID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtYWNjb3JkaW9uX19oZWFkaW5nXCIsIGwpLFxuICAgICAgICAgIHMgPSAoMCwgby5kZWZhdWx0KShcInVzYS1hY2NvcmRpb25fX2NvbnRlbnRcIiwgXCJ1c2EtcHJvc2VcIiwgbCk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobi5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWNjb3JkaW9uX19idXR0b25cIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGksXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiYWNjb3JkaW9uQnV0dG9uX1wiICsgcixcbiAgICAgICAgb25DbGljazogdVxuICAgICAgfSwgdCkpLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGlkOiByLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiYWNjb3JkaW9uSXRlbV9cIiArIHIsXG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgaGlkZGVuOiAhaVxuICAgICAgfSwgYSkpO1xuICAgIH07XG5cbiAgICB0LkFjY29yZGlvbkl0ZW0gPSBjO1xuXG4gICAgdmFyIHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHZhciB0ID0gZS5ib3JkZXJlZCxcbiAgICAgICAgICByID0gZS5pdGVtcyxcbiAgICAgICAgICBhID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgaSA9IGUubXVsdGlzZWxlY3RhYmxlLFxuICAgICAgICAgIHMgPSB2b2lkIDAgIT09IGkgJiYgaSxcbiAgICAgICAgICBkID0gKDAsIG4udXNlU3RhdGUpKHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiAhIWUuZXhwYW5kZWQ7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaWQ7XG4gICAgICB9KSksXG4gICAgICAgICAgZiA9IGRbMF0sXG4gICAgICAgICAgcCA9IGRbMV0sXG4gICAgICAgICAgbSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWFjY29yZGlvblwiLCB7XG4gICAgICAgIFwidXNhLWFjY29yZGlvbi0tYm9yZGVyZWRcIjogdFxuICAgICAgfSwgYSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJhY2NvcmRpb25cIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBzIHx8IHZvaWQgMFxuICAgICAgfSwgci5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMsIF9sNyh7XG4gICAgICAgICAga2V5OiBcImFjY29yZGlvbkl0ZW1fXCIgKyB0XG4gICAgICAgIH0sIGUsIHtcbiAgICAgICAgICBleHBhbmRlZDogZi5pbmRleE9mKGUuaWQpID4gLTEsXG4gICAgICAgICAgaGFuZGxlVG9nZ2xlOiBmdW5jdGlvbiBoYW5kbGVUb2dnbGUoKSB7XG4gICAgICAgICAgICB2YXIgdCwgciwgYSwgbjtcbiAgICAgICAgICAgIHQgPSBlLmlkLCByID0gdShbXSwgZiksIGEgPSBmLmluZGV4T2YodCksIG4gPSBzLCBhID4gLTEgPyByLnNwbGljZShhLCAxKSA6IChuIHx8IHIuc3BsaWNlKDAsIHIubGVuZ3RoKSwgci5wdXNoKHQpKSwgcChyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5BY2NvcmRpb24gPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Hb3ZCYW5uZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBpZiAoIXQgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgICAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgICB2YXIgciA9IHModCk7XG4gICAgICBpZiAociAmJiByLmhhcyhlKSkgcmV0dXJuIHIuZ2V0KGUpO1xuICAgICAgdmFyIGEgPSB7fSxcbiAgICAgICAgICBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gZSkge1xuICAgICAgICBpZiAoXCJkZWZhdWx0XCIgIT09IG8gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7XG4gICAgICAgICAgdmFyIGkgPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7XG4gICAgICAgICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIG8sIGkpIDogYVtvXSA9IGVbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYS5kZWZhdWx0ID0gZSwgciAmJiByLnNldChlLCBhKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0ocigwKSksXG4gICAgICAgIG4gPSBjKHIoMSkpLFxuICAgICAgICBvID0gYyhyKDI1KSksXG4gICAgICAgIGkgPSBjKHIoMjYpKSxcbiAgICAgICAgbCA9IGMocigyNykpLFxuICAgICAgICB1ID0gYyhyKDI4KSk7XG5cbiAgICBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAocyA9IGZ1bmN0aW9uIHMoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9kID0gZnVuY3Rpb24gZCgpIHtcbiAgICAgIHJldHVybiAoX2QgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHAgPSBmdW5jdGlvbiBwKGUpIHtcbiAgICAgIHZhciB0ID0gZS50bGQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwiLmdvdlwiIDogdCxcbiAgICAgICAgICBjID0gZS5sYW5ndWFnZSxcbiAgICAgICAgICBzID0gdm9pZCAwID09PSBjID8gXCJlbmdsaXNoXCIgOiBjLFxuICAgICAgICAgIHAgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBtID0gZihlLCBbXCJ0bGRcIiwgXCJsYW5ndWFnZVwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgeSA9ICgwLCBhLnVzZVN0YXRlKSghMSksXG4gICAgICAgICAgYiA9IHlbMF0sXG4gICAgICAgICAgdiA9IHlbMV0sXG4gICAgICAgICAgTyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWJhbm5lclwiLCBwKSxcbiAgICAgICAgICBnID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJpY29uLWxvY2tcIlxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgICAgc3JjOiB1LmRlZmF1bHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2xvY2staW1hZ2VcIixcbiAgICAgICAgICBhbHQ6IFwibG9ja1wiLFxuICAgICAgICAgIHRpdGxlOiBcIkxvY2tcIixcbiAgICAgICAgICByb2xlOiBcImltZ1wiXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIFwiZW5nbGlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIkFuIG9mZmljaWFsIHdlYnNpdGUgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgZ292ZXJubWVudFwiLFxuICAgICAgICAgICAgICBoZWFkZXJBY3Rpb246IFwiSGVyZeKAmXMgaG93IHlvdSBrbm93XCIsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25IZWFkZXI6IFwiT2ZmaWNpYWwgd2Vic2l0ZXMgdXNlIFwiICsgdCxcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIuZ292XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiQSBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiB3ZWJzaXRlIGJlbG9uZ3MgdG8gYW4gb2ZmaWNpYWwgZ292ZXJubWVudCBvcmdhbml6YXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuXCIpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLm1pbFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIkEgXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiLm1pbFwiKSwgXCIgd2Vic2l0ZSBiZWxvbmdzIHRvIGFuIG9mZmljaWFsIFUuUy4gRGVwYXJ0bWVudCBvZiBEZWZlbnNlIG9yZ2FuaXphdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJTZWN1cmUgXCIgKyB0ICsgXCIgd2Vic2l0ZXMgdXNlIEhUVFBTXCIsXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkNvbnRlbnQ6IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGEuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgXCJBIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImxvY2sgKFwiLCByLCBcIilcIiksIFwiIG9yIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImh0dHBzOi8vXCIpLCBcIiBtZWFucyB5b3XigJl2ZSBzYWZlbHkgY29ubmVjdGVkIHRvIHRoZSBcIiwgdCwgXCIgd2Vic2l0ZS4gU2hhcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIG9ubHkgb24gb2ZmaWNpYWwsIHNlY3VyZSB3ZWJzaXRlcy5cIilcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIFwic3BhbmlzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGVhZGVyOiBcIlVuIHNpdGlvIG9maWNpYWwgZGVsIEdvYmllcm5vIGRlIEVzdGFkb3MgVW5pZG9zXCIsXG4gICAgICAgICAgICAgIGhlYWRlckFjdGlvbjogXCJBc8OtIGVzIGNvbW8gdXN0ZWQgcHVlZGUgdmVyaWZpY2FybG9cIixcbiAgICAgICAgICAgICAgdGxkU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBvZmljaWFsZXMgdXNhbiBcIiArIHQsXG4gICAgICAgICAgICAgIHRsZFNlY3Rpb25Db250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiLmdvdlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIHNpdGlvIHdlYiBcIiwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgXCIuZ292XCIpLCBcIiBwZXJ0ZW5lY2UgYSB1bmEgb3JnYW5pemFjacOzbiBvZmljaWFsIGRlbCBHb2JpZXJubyBkZSBFc3RhZG9zIFVuaWRvcy5cIik7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCIubWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiVW4gc2l0aW8gd2ViIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcIi5taWxcIiksIFwiIHBlcnRlbmVjZSBhIHVuYSBvcmdhbml6YWNpw7NuIG9maWNpYWwgZGVsIERlcGFydGFtZW50byBkZSBEZWZlbnNhIGRlIEVFLiBVVS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KCksXG4gICAgICAgICAgICAgIGh0dHBzU2VjdGlvbkhlYWRlcjogXCJMb3Mgc2l0aW9zIHdlYiBzZWd1cm9zIFwiICsgdCArIFwiIHVzYW4gSFRUUFNcIixcbiAgICAgICAgICAgICAgaHR0cHNTZWN0aW9uQ29udGVudDogYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYS5kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBcIlVuIFwiLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBcImNhbmRhZG8gKFwiLCByLCBcIilcIiksIFwiIG8gXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIG51bGwsIFwiaHR0cHM6Ly9cIiksIFwiIFwiLCBcInNpZ25pZmljYSBxdWUgdXN0ZWQgc2UgY29uZWN0w7MgZGUgZm9ybWEgc2VndXJhIGEgdW4gc2l0aW8gd2ViIFwiLCB0LCBcIi4gQ29tcGFydGEgaW5mb3JtYWNpw7NuIHNlbnNpYmxlIHPDs2xvIGVuIHNpdGlvcyB3ZWIgb2ZpY2lhbGVzIHkgc2VndXJvcy5cIilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0ocywgcik7XG5cbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2Qoe1xuICAgICAgICBjbGFzc05hbWU6IE8sXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJnb3ZCYW5uZXJcIlxuICAgICAgfSwgbSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2lubmVyXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtY29sLWF1dG9cIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faGVhZGVyLWZsYWdcIixcbiAgICAgICAgc3JjOiBvLmRlZmF1bHQsXG4gICAgICAgIGFsdDogXCJVLlMuIGZsYWdcIlxuICAgICAgfSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbC1maWxsIHRhYmxldDpncmlkLWNvbC1hdXRvXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19oZWFkZXItYWN0aW9uXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcbiAgICAgIH0sIGcuaGVhZGVyQWN0aW9uKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1hY2NvcmRpb25fX2J1dHRvbiB1c2EtYmFubmVyX19idXR0b25cIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGIsXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBcImdvdi1iYW5uZXJcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gIWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYmFubmVyX19idXR0b24tdGV4dFwiXG4gICAgICB9LCBnLmhlYWRlckFjdGlvbikpKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2NvbnRlbnQgdXNhLWFjY29yZGlvbl9fY29udGVudFwiLFxuICAgICAgICBpZDogXCJnb3YtYmFubmVyXCIsXG4gICAgICAgIGhpZGRlbjogIWJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImdyaWQtcm93IGdyaWQtZ2FwLWxnXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2d1aWRhbmNlIHRhYmxldDpncmlkLWNvbC02XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1iYW5uZXJfX2ljb24gdXNhLW1lZGlhLWJsb2NrX19pbWdcIixcbiAgICAgICAgc3JjOiBpLmRlZmF1bHQsXG4gICAgICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1tZWRpYS1ibG9ja19fYm9keVwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBcIiwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwgbnVsbCwgZy50bGRTZWN0aW9uSGVhZGVyKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJiclwiLCBudWxsKSwgZy50bGRTZWN0aW9uQ29udGVudCkpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9fZ3VpZGFuY2UgdGFibGV0OmdyaWQtY29sLTZcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJhbm5lcl9faWNvbiB1c2EtbWVkaWEtYmxvY2tfX2ltZ1wiLFxuICAgICAgICBzcmM6IGwuZGVmYXVsdCxcbiAgICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgICAgYWx0OiBcIlwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW1lZGlhLWJsb2NrX19ib2R5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCBudWxsLCBnLmh0dHBzU2VjdGlvbkhlYWRlciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnJcIiwgbnVsbCksIGcuaHR0cHNTZWN0aW9uQ29udGVudCkpKSkpKSk7XG4gICAgfTtcblxuICAgIHQuR292QmFubmVyID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQUxDQU1BQUFCQlBQMExBQUFBRzFCTVZFVWRNN0VlTkxJZU03SGdRQ0RhUGgvYlBoL2JQeC8vLy8vYlB5QkVieTQxQUFBQVVFbEVRVlFJMTIzTU53NENBQkRFd0QzakMvOS9NUTFCUXJnZU9Ta0lxWWUybzJGWnR0aFhnUUxnYkhWTVpkbHNmVVFGUW5IdGpQMSs4QlVoQkRLT3F0bWZvdDZvanFQelI3VGpkVStmNnZrRUQrSURQaFRCY01BQUFBQUFTVVZPUks1Q1lJST1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlWVlJHTFRnaVB6NDhjM1puSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZDJsa2RHZzlJalkwSWlCb1pXbG5hSFE5SWpZMElpQjJhV1YzUW05NFBTSXdJREFnTmpRZ05qUWlQangwYVhSc1pUNXBZMjl1TFdSdmRDMW5iM1k4TDNScGRHeGxQanh3WVhSb0lHWnBiR3c5SWlNeU16YzRRek1pSUdacGJHd3RjblZzWlQwaVpYWmxibTlrWkNJZ1pEMGlUVE15SURCak1UY3VOamN6SURBZ016SWdNVFF1TXpJM0lETXlJRE15SURBZ01UY3VOamN6TFRFMExqTXlOeUF6TWkwek1pQXpNa014TkM0ek1qY2dOalFnTUNBME9TNDJOek1nTUNBek1pQXdJREUwTGpNeU55QXhOQzR6TWpjZ01DQXpNaUF3ZW0wd0lERXVNakE0UXpFMExqazVOQ0F4TGpJd09DQXhMakl3T0NBeE5DNDVPVFFnTVM0eU1EZ2dNekpUTVRRdU9UazBJRFl5TGpjNU1pQXpNaUEyTWk0M09USWdOakl1TnpreUlEUTVMakF3TmlBMk1pNDNPVElnTXpJZ05Ea3VNREEySURFdU1qQTRJRE15SURFdU1qQTRlbTB4TUM0MU9TQXpPQzQ0TlRoaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNE1pNDRNakoyTVM0Mk5ESklNVGd1T0RnMmRpMHhMalkwTW1FdU9EVTNMamcxTnlBd0lEQWdNU0F1T0RneUxTNDRNakpJTkRJdU5UbDZUVEkxTGpRME15QXlOeTQzTnpSMk9TNDRNamxvTVM0Mk5ESjJMVGt1T0ROb015NHlOek4yT1M0NE0wZ3pNbll0T1M0NE0yZ3pMakkzTW5ZNUxqZ3phREV1TmpRemRpMDVMamd6YURNdU1qY3lkamt1T0ROb0xqYzJZUzQ0TlRjdU9EVTNJREFnTUNBeElDNDRPREl1T0RJeGRpNDRNakZvTFRJeExqTjJMUzQ0TURsaExqZzFOeTQ0TlRjZ01DQXdJREVnTGpnNExTNDRNbWd1TnpZeWRpMDVMamcwTW1nekxqSTNNbnB0TlM0M016WXRPQzR4T0Roc01USXVNamt6SURRdU9URTFkakV1TmpReWFDMHhMall6WVM0NE5UY3VPRFUzSURBZ01DQXhMUzQ0T0RJdU9ESXlTREl4TGpReFlTNDROVGN1T0RVM0lEQWdNQ0F4TFM0NE9ESXRMamd5TW1ndE1TNDJOREoyTFRFdU5qUXliREV5TGpJNU15MDBMamt4TlhvaUx6NDhMM04yWno0PVwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0OGMzWm5JSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkMmxrZEdnOUlqWTBJaUJvWldsbmFIUTlJalkwSWlCMmFXVjNRbTk0UFNJd0lEQWdOalFnTmpRaVBqeDBhWFJzWlQ1cFkyOXVMV2gwZEhCelBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpOekU1UmpKQklpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWswek1pQXdZekUzTGpZM015QXdJRE15SURFMExqTXlOeUF6TWlBek1pQXdJREUzTGpZM015MHhOQzR6TWpjZ016SXRNeklnTXpKRE1UUXVNekkzSURZMElEQWdORGt1TmpjeklEQWdNeklnTUNBeE5DNHpNamNnTVRRdU16STNJREFnTXpJZ01IcHRNQ0F4TGpJd09FTXhOQzQ1T1RRZ01TNHlNRGdnTVM0eU1EZ2dNVFF1T1RrMElERXVNakE0SURNeVV6RTBMams1TkNBMk1pNDNPVElnTXpJZ05qSXVOemt5SURZeUxqYzVNaUEwT1M0d01EWWdOakl1TnpreUlETXlJRFE1TGpBd05pQXhMakl3T0NBek1pQXhMakl3T0hwdE1DQXhPQzQ0T0RaaE55NHlORFVnTnk0eU5EVWdNQ0F3SURFZ055NHlORFVnTnk0eU5EVjJNeTR4TUROb0xqVXlZeTQ0TmlBd0lERXVOVFUzTGpZNU9DQXhMalUxTnlBeExqVTFPSFk1TGpNeU1tTXdJQzQ0TmkwdU5qazNJREV1TlRVNExURXVOVFUzSURFdU5UVTRhQzB4TlM0MU0yTXRMamcySURBdE1TNDFOVGN0TGpZNU55MHhMalUxTnkweExqVTFPRll6TW1Nd0xTNDROaTQyT1RjdE1TNDFOVGdnTVM0MU5UY3RNUzQxTlRob0xqVXlWakkzTGpNMFFUY3VNalExSURjdU1qUTFJREFnTUNBeElETXlJREl3TGpBNU5IcHRNQ0F6TGpFd00yRTBMakUwTWlBMExqRTBNaUF3SURBZ01DMDBMakUwTWlBMExqRTBNbll6TGpFd00yZzRMakk0TkZZeU55NHpORUUwTGpFME1pQTBMakUwTWlBd0lEQWdNQ0F6TWlBeU15NHhPVGQ2SWk4K1BDOXpkbWMrXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICByLnIodCksIHQuZGVmYXVsdCA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejQ4YzNabklIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2QybGtkR2c5SWpVeUlpQm9aV2xuYUhROUlqWTBJaUIyYVdWM1FtOTRQU0l3SURBZ05USWdOalFpUGp4MGFYUnNaVDVzYjJOclBDOTBhWFJzWlQ0OGNHRjBhQ0JtYVd4c1BTSWpNVUl4UWpGQ0lpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWsweU5pQXdZekV3TGpRNU15QXdJREU1SURndU5UQTNJREU1SURFNWRqbG9NMkUwSURRZ01DQXdJREVnTkNBMGRqSTRZVFFnTkNBd0lEQWdNUzAwSURSSU5HRTBJRFFnTUNBd0lERXROQzAwVmpNeVlUUWdOQ0F3SURBZ01TQTBMVFJvTTNZdE9VTTNJRGd1TlRBM0lERTFMalV3TnlBd0lESTJJREI2YlRBZ09HTXROUzQ1TnprZ01DMHhNQzQ0TkRNZ05DNDNOeTB4TUM0NU9UWWdNVEF1TnpFeVRERTFJREU1ZGpsb01qSjJMVGxqTUMwMkxqQTNOUzAwTGpreU5TMHhNUzB4TVMweE1Yb2lMejQ4TDNOMlp6ND1cIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQnV0dG9uR3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnR5cGUsXG4gICAgICAgICAgdSA9IHZvaWQgMCA9PT0gbyA/IFwiZGVmYXVsdFwiIDogbyxcbiAgICAgICAgICBjID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInR5cGVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1idXR0b24tZ3JvdXBcIiwge1xuICAgICAgICBcInVzYS1idXR0b24tZ3JvdXAtLXNlZ21lbnRlZFwiOiBcInNlZ21lbnRlZFwiID09IHVcbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k1KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCBjKSwgYS5kZWZhdWx0LkNoaWxkcmVuLm1hcChyLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1idXR0b24tZ3JvdXBfX2l0ZW1cIlxuICAgICAgICB9LCBlKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdC5CdXR0b25Hcm91cCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhYmxlID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSBpKHIoMzEpKTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGZ1bmN0aW9uIGwoZSkge1xuICAgICAgdmFyIHQsXG4gICAgICAgICAgciA9IGUuYm9yZGVyZWQsXG4gICAgICAgICAgaSA9IGUuY2FwdGlvbixcbiAgICAgICAgICBsID0gZS5jaGlsZHJlbixcbiAgICAgICAgICB1ID0gZS5mdWxsV2lkdGgsXG4gICAgICAgICAgYyA9IGUuZml4ZWQsXG4gICAgICAgICAgcyA9IGUuc2Nyb2xsYWJsZSxcbiAgICAgICAgICBkID0gZS5zdHJpcGVkLFxuICAgICAgICAgIGYgPSBlLmNvbXBhY3QsXG4gICAgICAgICAgcCA9IGUuc3RhY2tlZFN0eWxlLFxuICAgICAgICAgIG0gPSB2b2lkIDAgPT09IHAgPyBcIm5vbmVcIiA6IHAsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXRhYmxlXCIsICgodCA9IHtcbiAgICAgICAgXCJ1c2EtdGFibGUtLWJvcmRlcmxlc3NcIjogIXJcbiAgICAgIH0pW1wiXCIgKyBvLmRlZmF1bHQuZnVsbHdpZHRoXSA9IHUsIHRbXCJcIiArIG8uZGVmYXVsdC5maXhlZF0gPSBjLCB0W1widXNhLXRhYmxlLS1zdHJpcGVkXCJdID0gZCwgdFtcInVzYS10YWJsZS0tY29tcGFjdFwiXSA9IGYsIHRbXCJ1c2EtdGFibGUtLXN0YWNrZWRcIl0gPSBcImRlZmF1bHRcIiA9PT0gbSwgdFtcInVzYS10YWJsZS0tc3RhY2tlZC1oZWFkZXJcIl0gPSBcImhlYWRlcnNcIiA9PT0gbSwgdCkpO1xuICAgICAgZiAmJiBcIm5vbmVcIiAhPT0gbSAmJiBjb25zb2xlLndhcm4oXCJVU1dEUyBzdGF0ZXMgdGhhdCBjb21wYWN0IHN0eWxpbmcgaXMgbm90IHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBzdGFja2VkIHZhcmlhbnRzLiBTZWUgVVNXRFMgVGFibGUgY29tcG9uZW50LCBUYWJsZSB2YXJpYW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9kZXNpZ25zeXN0ZW0uZGlnaXRhbC5nb3YvY29tcG9uZW50cy90YWJsZVwiKTtcbiAgICAgIHZhciBiID0gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogeSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRhYmxlXCJcbiAgICAgIH0sIGkgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJjYXB0aW9uXCIsIG51bGwsIGkpLCBsKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIHMgPyBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzY3JvbGxhYmxlLXRhYmxlLWNvbnRhaW5lclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXRhYmxlLWNvbnRhaW5lci0tc2Nyb2xsYWJsZVwiXG4gICAgICB9LCBiKSA6IGIpO1xuICAgIH07XG5cbiAgICB0LlRhYmxlID0gbDtcbiAgICB2YXIgdSA9IGw7XG4gICAgdC5kZWZhdWx0ID0gdTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHIucih0KSwgdC5kZWZhdWx0ID0ge1xuICAgICAgZnVsbHdpZHRoOiBcInNyYy1jb21wb25lbnRzLVRhYmxlLVRhYmxlLW1vZHVsZV9fZnVsbHdpZHRoLS0zLUszdFwiLFxuICAgICAgZml4ZWQ6IFwic3JjLWNvbXBvbmVudHMtVGFibGUtVGFibGUtbW9kdWxlX19maXhlZC0tMkF3Y3lcIlxuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlRhZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTYgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImJhY2tncm91bmRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGMgPSB7fTtcbiAgICAgIHIgJiYgKGMuYmFja2dyb3VuZCA9IHIpO1xuICAgICAgdmFyIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS10YWdcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9pNih7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJ0YWdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBzdHlsZTogX2k2KHt9LCBjKVxuICAgICAgfSwgdSksIHQpO1xuICAgIH07XG5cbiAgICB0LlRhZyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmlzQ3VzdG9tUHJvcHMgPSBzLCB0LlRvb2x0aXAgPSBkO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBsKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDM0KTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGwgPSBmdW5jdGlvbiBsKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfdSA9IGZ1bmN0aW9uIHUoKSB7XG4gICAgICByZXR1cm4gKF91ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICByZXR1cm4gXCJhc0N1c3RvbVwiIGluIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZChlKSB7XG4gICAgICB2YXIgdCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgciA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgYSA9ICgwLCBuLnVzZVJlZikoXCJ0b29sdGlwLVwiICsgKE1hdGguZmxvb3IoOWU1ICogTWF0aC5yYW5kb20oKSkgKyAxZTUpKSxcbiAgICAgICAgICBsID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBkID0gbFswXSxcbiAgICAgICAgICBmID0gbFsxXSxcbiAgICAgICAgICBwID0gZnVuY3Rpb24gcChhLCBvKSB7XG4gICAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBuID0gbztcblxuICAgICAgICAgIGlmIChhLmN1cnJlbnQgJiYgci5jdXJyZW50ICYmIHQuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIGwgPSBhLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgdSA9IHIuY3VycmVudCxcbiAgICAgICAgICAgICAgICBjID0gdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIHMgPSBsLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGQgPSBsLm9mZnNldEhlaWdodCxcbiAgICAgICAgICAgICAgICBmID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGwpLmdldFByb3BlcnR5VmFsdWUoXCJtYXJnaW4tdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgcCA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsKS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLWJvdHRvbVwiKSwgMTApLFxuICAgICAgICAgICAgICAgIG0gPSBOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYykuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpLCAxMCksXG4gICAgICAgICAgICAgICAgeSA9IE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjKS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1ib3R0b21cIiksIDEwKSxcbiAgICAgICAgICAgICAgICBiID0gTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKSxcbiAgICAgICAgICAgICAgICB2ID0gbC5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgICAgIE8gPSB1Lm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGcgPSBzIC8gMiArIHYsXG4gICAgICAgICAgICAgICAgXyA9IHMgKyA1ICsgMixcbiAgICAgICAgICAgICAgICBoID0gZCArIDUgKyAyLFxuICAgICAgICAgICAgICAgIGogPSBmdW5jdGlvbiBqKGUpIHtcbiAgICAgICAgICAgICAgdS5jbGFzc0xpc3QucmVtb3ZlKFwidXNhLXRvb2x0aXBfX2JvZHktLVwiICsgbiksIG4gPSBlLCB1LmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0tXCIgKyBlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChlLndyYXBwZXJjbGFzc2VzKSBlLndyYXBwZXJjbGFzc2VzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjLmNsYXNzTGlzdC5hZGQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlLmNsYXNzTmFtZSkgZS5jbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGwuY2xhc3NMaXN0LmFkZChlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgTSA9IGZ1bmN0aW9uIE0oZSkge1xuICAgICAgICAgICAgICBqKFwidG9wXCIpLCBlLnN0eWxlLm1hcmdpbkxlZnQgPSBnICsgXCJweFwiLCAoMCwgaS5pc0VsZW1lbnRJblZpZXdwb3J0KShlKSB8fCBlLmNsYXNzTGlzdC5hZGQoXCJ1c2EtdG9vbHRpcF9fYm9keS0td3JhcFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBoICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE4gPSBmdW5jdGlvbiBOKGUpIHtcbiAgICAgICAgICAgICAgaihcImJvdHRvbVwiKSwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gZyArIFwicHhcIiwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkoZSkgfHwgZS5jbGFzc0xpc3QuYWRkKFwidXNhLXRvb2x0aXBfX2JvZHktLXdyYXBcIiksIGUuc3R5bGUubWFyZ2luVG9wID0gaCArIGYgKyBtICsgXCJweFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBFID0gZnVuY3Rpb24gRShlKSB7XG4gICAgICAgICAgICAgIGooXCJyaWdodFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gXyArIHYgKyBcInB4XCIsIGUuc3R5bGUuYm90dG9tID0gKGQgLSBiKSAvIDIgKyBwICsgeSArIFwicHhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgUCA9IGZ1bmN0aW9uIFAoZSkge1xuICAgICAgICAgICAgICBqKFwibGVmdFwiKSwgZS5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjBcIiwgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gdiA+IE8gPyB2IC0gTyAtIDcgKyBcInB4XCIgOiBcIi1cIiArIChPIC0gdiArIDcpICsgXCJweFwiLCBlLnN0eWxlLmJvdHRvbSA9IChkIC0gYikgLyAyICsgcCArIHkgKyBcInB4XCI7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG8pIHtcbiAgICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgICAgIE0odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE4odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgICAgIE4odSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgRSh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKFAodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgUCh1KSwgKDAsIGkuaXNFbGVtZW50SW5WaWV3cG9ydCkodSkgfHwgKEUodSksICgwLCBpLmlzRWxlbWVudEluVmlld3BvcnQpKHUpIHx8IE0odSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgW2RdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChzKGUpKSB7XG4gICAgICAgIHZhciBtID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICAgIHkgPSBlLmxhYmVsLFxuICAgICAgICAgICAgYiA9IGUucG9zaXRpb24sXG4gICAgICAgICAgICB2ID0gZS5hc0N1c3RvbSxcbiAgICAgICAgICAgIE8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgICAgZyA9IE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIF8gPSAoMCwgby5kZWZhdWx0KShcInVzYS10b29sdGlwX19ib2R5XCIsIHtcbiAgICAgICAgICBcImlzLXNldFwiOiBkLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLWJvdHRvbVwiOiBcImJvdHRvbVwiID09PSBiLFxuICAgICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXJpZ2h0XCI6IFwicmlnaHRcIiA9PT0gYixcbiAgICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICAgIFwiaXMtdmlzaWJsZVwiOiBkXG4gICAgICAgIH0pLFxuICAgICAgICAgICAgaCA9IGZ1bmN0aW9uIGgoKSB7XG4gICAgICAgICAgZighMCk7XG4gICAgICAgIH0sXG4gICAgICAgICAgICBqID0gZnVuY3Rpb24gaigpIHtcbiAgICAgICAgICBmKCExKTtcbiAgICAgICAgfTtcblxuICAgICAgICBwKG0sIGIpO1xuICAgICAgICB2YXIgTSA9ICgwLCBuLmNyZWF0ZUVsZW1lbnQpKHYsIF91KHtcbiAgICAgICAgICByZWY6IG0sXG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRyaWdnZXJFbGVtZW50XCIsXG4gICAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZU92ZXI6IGZ1bmN0aW9uIG9uTW91c2VPdmVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIGgoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oKSB7XG4gICAgICAgICAgICByZXR1cm4gaigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZyksIE8pO1xuICAgICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcFdyYXBwZXJcIixcbiAgICAgICAgICByZWY6IHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgICAgcm9sZTogXCJ0b29sdGlwXCJcbiAgICAgICAgfSwgTSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgICBpZDogYS5jdXJyZW50LFxuICAgICAgICAgIHJlZjogcixcbiAgICAgICAgICBjbGFzc05hbWU6IF9cbiAgICAgICAgfSwgeSkpO1xuICAgICAgfVxuXG4gICAgICBtID0gKDAsIG4udXNlUmVmKShudWxsKSwgeSA9IGUubGFiZWwsIGIgPSBlLnBvc2l0aW9uLCBPID0gZS5jaGlsZHJlbjtcblxuICAgICAgdmFyIE4gPSBjKGUsIFtcImxhYmVsXCIsIFwicG9zaXRpb25cIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgRSA9IChfID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtdG9vbHRpcF9fYm9keVwiLCB7XG4gICAgICAgIFwiaXMtc2V0XCI6IGQsXG4gICAgICAgIFwidXNhLXRvb2x0aXBfX2JvZHktLXRvcFwiOiBcInRvcFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1ib3R0b21cIjogXCJib3R0b21cIiA9PT0gYixcbiAgICAgICAgXCJ1c2EtdG9vbHRpcF9fYm9keS0tcmlnaHRcIjogXCJyaWdodFwiID09PSBiLFxuICAgICAgICBcInVzYS10b29sdGlwX19ib2R5LS1sZWZ0XCI6IFwibGVmdFwiID09PSBiLFxuICAgICAgICBcImlzLXZpc2libGVcIjogZFxuICAgICAgfSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZighMCk7XG4gICAgICB9KSxcbiAgICAgICAgICBQID0gZnVuY3Rpb24gUCgpIHtcbiAgICAgICAgZighMSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcChtLCBiKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInRvb2x0aXBXcmFwcGVyXCIsXG4gICAgICAgIHJlZjogdCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS10b29sdGlwXCIsXG4gICAgICAgIHJvbGU6IFwidG9vbHRpcFwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfdSh7fSwgTiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidHJpZ2dlckVsZW1lbnRcIixcbiAgICAgICAgcmVmOiBtLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogYS5jdXJyZW50LFxuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWJ1dHRvbiB1c2EtdG9vbHRpcF9fdHJpZ2dlclwiLFxuICAgICAgICB0aXRsZTogeSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBFLFxuICAgICAgICBvbk1vdXNlT3ZlcjogRSxcbiAgICAgICAgb25Gb2N1czogRSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBQLFxuICAgICAgICBvbkJsdXI6IFAsXG4gICAgICAgIG9uS2V5RG93bjogUFxuICAgICAgfSksIE8pLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwidG9vbHRpcEJvZHlcIixcbiAgICAgICAgdGl0bGU6IHksXG4gICAgICAgIGlkOiBhLmN1cnJlbnQsXG4gICAgICAgIHJlZjogcixcbiAgICAgICAgY2xhc3NOYW1lOiBfXG4gICAgICB9LCB5KSk7XG4gICAgfVxuXG4gICAgZC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIlxuICAgIH0sIGQuRGlzcGxheU5hbWUgPSBcIlRvb2x0aXBcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IHZvaWQgMDtcblxuICAgIHQuaXNFbGVtZW50SW5WaWV3cG9ydCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSB3aW5kb3cpLCB2b2lkIDAgPT09IHIgJiYgKHIgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgdmFyIGEgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIGEudG9wID49IDAgJiYgYS5sZWZ0ID49IDAgJiYgYS5ib3R0b20gPD0gKHQuaW5uZXJIZWlnaHQgfHwgci5jbGllbnRIZWlnaHQpICYmIGEucmlnaHQgPD0gKHQuaW5uZXJXaWR0aCB8fCByLmNsaWVudFdpZHRoKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5TaWRlTmF2ID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5TaWRlTmF2ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5pdGVtcyxcbiAgICAgICAgICByID0gZS5pc1N1Ym5hdixcbiAgICAgICAgICBvID0gdm9pZCAwICE9PSByICYmIHIsXG4gICAgICAgICAgaSA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJ1c2Etc2lkZW5hdlwiOiAhbyxcbiAgICAgICAgXCJ1c2Etc2lkZW5hdl9fc3VibGlzdFwiOiBvXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBpLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwic2lkZW5hdlwiXG4gICAgICB9LCB0Lm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAga2V5OiBcInNpZGVuYXZfaXRlbV9cIiArIHQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zaWRlbmF2X19pdGVtXCJcbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5jb25kZW5zZWQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb25kZW5zZWRcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uXCIsIHtcbiAgICAgICAgXCJ1c2EtY29sbGVjdGlvbi0tY29uZGVuc2VkXCI6IG9cbiAgICAgIH0sIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2k3KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvblwiXG4gICAgICB9LCB1KSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k4ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uSXRlbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLnZhcmlhbnRDb21wb25lbnQsXG4gICAgICAgICAgdSA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJ2YXJpYW50Q29tcG9uZW50XCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9faXRlbVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIsIF9pOCh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIG8sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19ib2R5XCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Db2xsZWN0aW9uSGVhZGluZyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25IZWFkaW5nID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5oZWFkaW5nTGV2ZWwsXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImhlYWRpbmdMZXZlbFwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBjID0gdCB8fCBcImgzXCIsXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2hlYWRpbmdcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYywgX2k5KHtcbiAgICAgICAgY2xhc3NOYW1lOiBzXG4gICAgICB9LCB1KSwgbyk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbkRlc2NyaXB0aW9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2Rlc2NyaXB0aW9uXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCBfaTEwKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGEgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxMSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25NZXRhID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2kxMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25NZXRhSXRlbSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTEyID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuQ29sbGVjdGlvbk1ldGFJdGVtID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jb2xsZWN0aW9uX19tZXRhLWl0ZW1cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTEyKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQ29sbGVjdGlvbk1ldGFJdGVtVGFnID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMTMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTEzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Db2xsZWN0aW9uTWV0YUl0ZW1UYWcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gZS50YWdTdHlsZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInRhZ1N0eWxlXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY29sbGVjdGlvbl9fbWV0YS1pdGVtXCIsIFwidXNhLXRhZ1wiLCB7XG4gICAgICAgIFwidXNhLXRhZy0tbmV3XCI6IFwibmV3XCIgPT09IG9cbiAgICAgIH0sIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2kxMyh7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSksIHIpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkNvbGxlY3Rpb25UaHVtYm5haWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5zcmMsXG4gICAgICAgICAgbyA9IGUuYWx0LFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcInNyY1wiLCBcImFsdFwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNvbGxlY3Rpb25fX2ltZ1wiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCBfaTE0KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjLFxuICAgICAgICBzcmM6IHIsXG4gICAgICAgIGFsdDogb1xuICAgICAgfSwgdSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkNvbGxlY3Rpb25DYWxlbmRhckRhdGUgPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfTtcbiAgICB2YXIgbyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuICAgIHQuQ29sbGVjdGlvbkNhbGVuZGFyRGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuZGF0ZXRpbWUsXG4gICAgICAgICAgciA9IG5ldyBEYXRlKHQpO1xuICAgICAgcmV0dXJuIHIgJiYgci5nZXRUaW1lICYmIGlzTmFOKHIuZ2V0VGltZSgpKSA/IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCkgOiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY29sbGVjdGlvbl9fY2FsZW5kYXItZGF0ZVwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY29sbGVjdGlvbi1jYWxlbmRhci1kYXRlXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGltZVwiLCB7XG4gICAgICAgIGRhdGVUaW1lOiB0XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWNvbGxlY3Rpb25fX2NhbGVuZGFyLWRhdGUtbW9udGhcIlxuICAgICAgfSwgb1tyLmdldE1vbnRoKCldKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xsZWN0aW9uX19jYWxlbmRhci1kYXRlLWRheVwiXG4gICAgICB9LCByLmdldERhdGUoKSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5pc0N1c3RvbVByb3BzID0gdSwgdC5HcmlkQ29udGFpbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh1KGUpKSB7XG4gICAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgICByID0gZS5jb250YWluZXJTaXplLFxuICAgICAgICAgICAgbiA9IGUuYXNDdXN0b20sXG4gICAgICAgICAgICBvID0gZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHMgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcImNvbnRhaW5lclNpemVcIiwgXCJhc0N1c3RvbVwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICAgIGQgPSBjKHQsIHIpO1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobiwgX2kxNSh7XG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgICAgfSwgcyksIG8pO1xuICAgICAgfVxuXG4gICAgICB0ID0gZS5jbGFzc05hbWUsIHIgPSBlLmNvbnRhaW5lclNpemUsIG8gPSBlLmNoaWxkcmVuLCBzID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjb250YWluZXJTaXplXCIsIFwiY2hpbGRyZW5cIl0pLCBkID0gYyh0LCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTE1KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImdyaWRDb250YWluZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCBzKSwgbyk7XG4gICAgfTtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgcmV0dXJuIFwiYXNDdXN0b21cIiBpbiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgdmFyIHI7XG4gICAgICByZXR1cm4gKDAsIG4uZGVmYXVsdCkoKChyID0ge1xuICAgICAgICBcImdyaWQtY29udGFpbmVyXCI6ICF0XG4gICAgICB9KVtcImdyaWQtY29udGFpbmVyLVwiICsgdF0gPSAhIXQsIHIpLCBlKTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmJyZWFrcG9pbnRzID0gdm9pZCAwO1xuICAgIHQuYnJlYWtwb2ludHMgPSB7XG4gICAgICBtb2JpbGU6IFwibW9iaWxlXCIsXG4gICAgICBtb2JpbGVMZzogXCJtb2JpbGUtbGdcIixcbiAgICAgIHRhYmxldDogXCJ0YWJsZXRcIixcbiAgICAgIHRhYmxldExnOiBcInRhYmxldC1sZ1wiLFxuICAgICAgZGVza3RvcDogXCJkZXNrdG9wXCIsXG4gICAgICBkZXNrdG9wTGc6IFwiZGVza3RvcC1sZ1wiLFxuICAgICAgd2lkZXNjcmVlbjogXCJ3aWRlc2NyZWVuXCJcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGFyYWN0ZXJDb3VudCA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig3KSxcbiAgICAgICAgbCA9IHIoMTYpO1xuXG4gICAgZnVuY3Rpb24gdShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIF9jID0gZnVuY3Rpb24gYygpIHtcbiAgICAgIHJldHVybiAoX2MgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpLmxlbmd0aDtcbiAgICB9LFxuICAgICAgICBmID0gZnVuY3Rpb24gZihlLCB0KSB7XG4gICAgICB2YXIgciA9IHQgKyBcIiBjaGFyYWN0ZXJzIGFsbG93ZWRcIixcbiAgICAgICAgICBhID0gdCAtIGU7XG5cbiAgICAgIHN3aXRjaCAoYSkge1xuICAgICAgICBjYXNlIHQ6XG4gICAgICAgICAgcmV0dXJuIHI7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBsZWZ0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIHJldHVybiBcIiQwIGNoYXJhY3RlciBvdmVyIGxpbWl0XCIucmVwbGFjZShcIiQwXCIsIFwiMVwiKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBhID49IDAgPyBcIiQwIGNoYXJhY3RlcnMgbGVmdFwiLnJlcGxhY2UoXCIkMFwiLCBhLnRvU3RyaW5nKCkpIDogXCIkMCBjaGFyYWN0ZXJzIG92ZXIgbGltaXRcIi5yZXBsYWNlKFwiJDBcIiwgTWF0aC5hYnMoYSkudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgcCA9IGZ1bmN0aW9uIHAoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLm1heExlbmd0aCxcbiAgICAgICAgICBwID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgbSA9IHZvaWQgMCA9PT0gcCA/IFwiXCIgOiBwLFxuICAgICAgICAgIHkgPSBlLmlzVGV4dEFyZWEsXG4gICAgICAgICAgYiA9IHZvaWQgMCAhPT0geSAmJiB5LFxuICAgICAgICAgIHYgPSBlLmdldENoYXJhY3RlckNvdW50LFxuICAgICAgICAgIE8gPSB2b2lkIDAgPT09IHYgPyBkIDogdixcbiAgICAgICAgICBnID0gZS5nZXRNZXNzYWdlLFxuICAgICAgICAgIF8gPSB2b2lkIDAgPT09IGcgPyBmIDogZyxcbiAgICAgICAgICBoID0gcyhlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJtYXhMZW5ndGhcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJpc1RleHRBcmVhXCIsIFwiZ2V0Q2hhcmFjdGVyQ291bnRcIiwgXCJnZXRNZXNzYWdlXCJdKSxcbiAgICAgICAgICBqID0gTyhtKSxcbiAgICAgICAgICBNID0gKDAsIG4udXNlU3RhdGUpKGopLFxuICAgICAgICAgIE4gPSBNWzBdLFxuICAgICAgICAgIEUgPSBNWzFdLFxuICAgICAgICAgIFAgPSAoMCwgbi51c2VTdGF0ZSkoXyhqLCB1KSksXG4gICAgICAgICAgdyA9IFBbMF0sXG4gICAgICAgICAgSSA9IFBbMV0sXG4gICAgICAgICAgRCA9ICgwLCBuLnVzZVN0YXRlKShqIDwgdSksXG4gICAgICAgICAgUyA9IERbMF0sXG4gICAgICAgICAgeCA9IERbMV0sXG4gICAgICAgICAgayA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWNoYXJhY3Rlci1jb3VudF9fZmllbGRcIiwgYSksXG4gICAgICAgICAgQSA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWhpbnRcIiwgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlXCIsIHtcbiAgICAgICAgXCJ1c2EtY2hhcmFjdGVyLWNvdW50X19tZXNzYWdlLS1pbnZhbGlkXCI6ICFTXG4gICAgICB9KTtcblxuICAgICAgKDAsIG4udXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgICAgIEkoXyhOLCB1KSksIHgoTiA8PSB1KTtcbiAgICAgIH0sIFtOXSk7XG5cbiAgICAgIHZhciBULFxuICAgICAgICAgIEwgPSBmdW5jdGlvbiBMKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBTID8gXCJcIiA6IFwiVGhlIGNvbnRlbnQgaXMgdG9vIGxvbmcuXCI7XG4gICAgICAgIGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KHIpLCB0ICYmIHQoZSk7XG4gICAgICB9LFxuICAgICAgICAgIEMgPSBmdW5jdGlvbiBDKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgRShPKHZvaWQgMCA9PT0gciA/IFwiXCIgOiByKSksIHQgJiYgdChlKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChiKSB7XG4gICAgICAgIHZhciBGID0gaCxcbiAgICAgICAgICAgIFIgPSBGLm9uQmx1cixcbiAgICAgICAgICAgIFUgPSBGLm9uQ2hhbmdlLFxuICAgICAgICAgICAgQiA9IEYuaW5wdXRSZWYsXG4gICAgICAgICAgICBXID0gcyhGLCBbXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcImlucHV0UmVmXCJdKTtcbiAgICAgICAgVCA9IG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuVGV4dGFyZWEsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICBuYW1lOiByLFxuICAgICAgICAgIGNsYXNzTmFtZTogayxcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IG0sXG4gICAgICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEwoZSwgUik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgICAgcmV0dXJuIEMoZSwgVSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnB1dFJlZjogQlxuICAgICAgICB9LCBXKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgeiA9IGgsXG4gICAgICAgICAgICBZID0gei5vbkJsdXIsXG4gICAgICAgICAgICBWID0gei5vbkNoYW5nZSxcbiAgICAgICAgICAgIEcgPSAoQiA9IHouaW5wdXRSZWYsIHoudHlwZSksXG4gICAgICAgICAgICBIID0gdm9pZCAwID09PSBHID8gXCJ0ZXh0XCIgOiBHLFxuICAgICAgICAgICAgUSA9IHMoeiwgW1wib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJpbnB1dFJlZlwiLCBcInR5cGVcIl0pO1xuICAgICAgICBUID0gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5UZXh0SW5wdXQsIF9jKHtcbiAgICAgICAgICBpZDogdCxcbiAgICAgICAgICB0eXBlOiBILFxuICAgICAgICAgIG5hbWU6IHIsXG4gICAgICAgICAgY2xhc3NOYW1lOiBrLFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbSxcbiAgICAgICAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cihlKSB7XG4gICAgICAgICAgICByZXR1cm4gTChlLCBZKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgICAgICByZXR1cm4gQyhlLCBWKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlucHV0UmVmOiBCXG4gICAgICAgIH0sIFEpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgVCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoYXJhY3RlckNvdW50TWVzc2FnZVwiLFxuICAgICAgICBpZDogdCArIFwiLWluZm9cIixcbiAgICAgICAgY2xhc3NOYW1lOiBBLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiXG4gICAgICB9LCB3KSk7XG4gICAgfTtcblxuICAgIHQuQ2hhcmFjdGVyQ291bnQgPSBwO1xuICAgIHZhciBtID0gcDtcbiAgICB0LmRlZmF1bHQgPSBtO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DaGVja2JveCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE2ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxNiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhYmVsLFxuICAgICAgICAgIGMgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIHMgPSBlLnRpbGUsXG4gICAgICAgICAgZCA9IGUubGFiZWxEZXNjcmlwdGlvbixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0UmVmXCIsIFwidGlsZVwiLCBcImxhYmVsRGVzY3JpcHRpb25cIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jaGVja2JveFwiLCBvKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2hlY2tib3hfX2lucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtY2hlY2tib3hfX2lucHV0LS10aWxlXCI6IHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNoZWNrYm94XCIsXG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfaTE2KHtcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IGNcbiAgICAgIH0sIGYpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtY2hlY2tib3hfX2xhYmVsXCIsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUsIGQgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jaGVja2JveF9fbGFiZWwtZGVzY3JpcHRpb25cIlxuICAgICAgfSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5DaGVja2JveCA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LnVzZUNvbWJvQm94ID0gdC5BY3Rpb25UeXBlcyA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gcigwKSxcbiAgICAgICAgbyA9IHIoMTEpLFxuICAgICAgICBpID0gcig1MCksXG4gICAgICAgIF9sOCA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHQuQWN0aW9uVHlwZXMgPSBhLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZVtlLlNFTEVDVF9PUFRJT04gPSAwXSA9IFwiU0VMRUNUX09QVElPTlwiLCBlW2UuQ0xFQVIgPSAxXSA9IFwiQ0xFQVJcIiwgZVtlLk9QRU5fTElTVCA9IDJdID0gXCJPUEVOX0xJU1RcIiwgZVtlLkNMT1NFX0xJU1QgPSAzXSA9IFwiQ0xPU0VfTElTVFwiLCBlW2UuRk9DVVNfT1BUSU9OID0gNF0gPSBcIkZPQ1VTX09QVElPTlwiLCBlW2UuVVBEQVRFX0ZJTFRFUiA9IDVdID0gXCJVUERBVEVfRklMVEVSXCIsIGVbZS5CTFVSID0gNl0gPSBcIkJMVVJcIiwgZVtlLkNMRUFSX1NFTEVDVElPTiA9IDddID0gXCJDTEVBUl9TRUxFQ1RJT05cIjtcbiAgICB9KGEgfHwgKHQuQWN0aW9uVHlwZXMgPSBhID0ge30pKTtcblxuICAgIHQudXNlQ29tYm9Cb3ggPSBmdW5jdGlvbiAoZSwgdCwgciwgdSkge1xuICAgICAgcmV0dXJuICgwLCBuLnVzZVJlZHVjZXIpKGZ1bmN0aW9uIChlLCBuKSB7XG4gICAgICAgIHN3aXRjaCAobi50eXBlKSB7XG4gICAgICAgICAgY2FzZSBhLlNFTEVDVF9PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IG4ub3B0aW9uLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBuLm9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBuLm9wdGlvblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuVVBEQVRFX0ZJTFRFUjpcbiAgICAgICAgICAgIHZhciBjID0gKHAgPSBuLnZhbHVlLCBtID0gKDAsIGkuZ2VuZXJhdGVEeW5hbWljUmVnRXhwKSh1LmZpbHRlciwgcCwgdS5leHRyYXMpLCB5ID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG0udGVzdChlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSksIHIgPyB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeS5sZW5ndGggPiAwID8geVswXSA6IHRbMF0sXG4gICAgICAgICAgICAgIG9wdGlvbnNUb0Rpc3BsYXk6IHRcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgIGNsb3Nlc3RNYXRjaDogeVswXSxcbiAgICAgICAgICAgICAgb3B0aW9uc1RvRGlzcGxheTogeVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcyA9IGMuY2xvc2VzdE1hdGNoLFxuICAgICAgICAgICAgICAgIGQgPSBjLm9wdGlvbnNUb0Rpc3BsYXksXG4gICAgICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITAsXG4gICAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9uczogZCxcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogbi52YWx1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByIHx8ICFlLnNlbGVjdGVkT3B0aW9uID8gZi5mb2N1c2VkT3B0aW9uID0gcyA6IGUuc2VsZWN0ZWRPcHRpb24gJiYgKGYuZmlsdGVyZWRPcHRpb25zLmluY2x1ZGVzKGUuc2VsZWN0ZWRPcHRpb24pID8gZi5mb2N1c2VkT3B0aW9uID0gZS5zZWxlY3RlZE9wdGlvbiA6IGYuZm9jdXNlZE9wdGlvbiA9IHMpLCBmO1xuXG4gICAgICAgICAgY2FzZSBhLk9QRU5fTElTVDpcbiAgICAgICAgICAgIHJldHVybiBfbDgoX2w4KHt9LCBlKSwge1xuICAgICAgICAgICAgICBpc09wZW46ICEwLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLklucHV0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiBlLnNlbGVjdGVkT3B0aW9uIHx8IGUuZm9jdXNlZE9wdGlvbiB8fCB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5DTE9TRV9MSVNUOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSW5wdXQsXG4gICAgICAgICAgICAgIGZvY3VzZWRPcHRpb246IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIChmLmZpbHRlcmVkT3B0aW9ucyA9IHQsIGYuaW5wdXRWYWx1ZSA9IFwiXCIpLCBlLnNlbGVjdGVkT3B0aW9uICYmIChmLmlucHV0VmFsdWUgPSBlLnNlbGVjdGVkT3B0aW9uLmxhYmVsKSwgZjtcblxuICAgICAgICAgIGNhc2UgYS5GT0NVU19PUFRJT046XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMCxcbiAgICAgICAgICAgICAgZm9jdXNlZE9wdGlvbjogbi5vcHRpb24sXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuSXRlbVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIGEuQ0xFQVI6XG4gICAgICAgICAgICByZXR1cm4gX2w4KF9sOCh7fSwgZSksIHtcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZTogXCJcIixcbiAgICAgICAgICAgICAgaXNPcGVuOiAhMSxcbiAgICAgICAgICAgICAgZm9jdXNNb2RlOiBvLkZvY3VzTW9kZS5JbnB1dCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb246IHZvaWQgMCxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0LFxuICAgICAgICAgICAgICBmb2N1c2VkT3B0aW9uOiB0WzBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgYS5CTFVSOlxuICAgICAgICAgICAgZiA9IF9sOChfbDgoe30sIGUpLCB7XG4gICAgICAgICAgICAgIGlzT3BlbjogITEsXG4gICAgICAgICAgICAgIGZvY3VzTW9kZTogby5Gb2N1c01vZGUuTm9uZSxcbiAgICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zOiB0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlLnNlbGVjdGVkT3B0aW9uID8gKGYuaW5wdXRWYWx1ZSA9IGUuc2VsZWN0ZWRPcHRpb24ubGFiZWwsIGYuZm9jdXNlZE9wdGlvbiA9IGUuc2VsZWN0ZWRPcHRpb24pIDogKGYuaW5wdXRWYWx1ZSA9IFwiXCIsIGYuZm9jdXNlZE9wdGlvbiA9IHRbMF0pLCBmO1xuXG4gICAgICAgICAgY2FzZSBhLkNMRUFSX1NFTEVDVElPTjpcbiAgICAgICAgICAgIHJldHVybiBfbDgoX2w4KHt9LCBlKSwge1xuICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICBpc09wZW46ICExLFxuICAgICAgICAgICAgICBmb2N1c01vZGU6IG8uRm9jdXNNb2RlLk5vbmUsXG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9uczogdCxcbiAgICAgICAgICAgICAgZm9jdXNlZE9wdGlvbjogdm9pZCAwXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwLCBtLCB5O1xuICAgICAgfSwgZSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZ2VuZXJhdGVEeW5hbWljUmVnRXhwID0gdm9pZCAwO1xuXG4gICAgdC5nZW5lcmF0ZUR5bmFtaWNSZWdFeHAgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gXCJcIiksIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KTtcblxuICAgICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xuICAgICAgfSxcbiAgICAgICAgICBuID0gZS5yZXBsYWNlKC97eyguKj8pfX0vZywgZnVuY3Rpb24gKGUsIG4pIHtcbiAgICAgICAgdmFyIG8gPSBuLnRyaW0oKSxcbiAgICAgICAgICAgIGkgPSByW29dO1xuXG4gICAgICAgIGlmIChcInF1ZXJ5XCIgIT09IG8gJiYgaSkge1xuICAgICAgICAgIHZhciBsID0gbmV3IFJlZ0V4cChpLCBcImlcIiksXG4gICAgICAgICAgICAgIHUgPSB0Lm1hdGNoKGwpO1xuICAgICAgICAgIHJldHVybiB1ID8gYSh1WzFdKSA6IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYSh0KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbiA9IFwiXig/OlwiICsgbiArIFwiKSRcIiwgbmV3IFJlZ0V4cChuLCBcImlcIik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRGF0ZUlucHV0ID0gdm9pZCAwO1xuICAgIHZhciBhID0gdShyKDApKSxcbiAgICAgICAgbiA9IHUocigxKSksXG4gICAgICAgIG8gPSByKDcpLFxuICAgICAgICBpID0gcig1KSxcbiAgICAgICAgbCA9IHIoOCk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9jMiA9IGZ1bmN0aW9uIGMoKSB7XG4gICAgICByZXR1cm4gKF9jMiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHMoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgZCA9IGZ1bmN0aW9uIGQoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgdSA9IGUubGFiZWwsXG4gICAgICAgICAgZCA9IGUudW5pdCxcbiAgICAgICAgICBmID0gZS5tYXhMZW5ndGgsXG4gICAgICAgICAgcCA9IGUubWluTGVuZ3RoLFxuICAgICAgICAgIG0gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB5ID0gcyhlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJsYWJlbFwiLCBcInVuaXRcIiwgXCJtYXhMZW5ndGhcIiwgXCJtaW5MZW5ndGhcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGIgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWZvcm0tZ3JvdXAtLW1vbnRoXCI6IFwibW9udGhcIiA9PSBkLFxuICAgICAgICBcInVzYS1mb3JtLWdyb3VwLS1kYXlcIjogXCJkYXlcIiA9PSBkLFxuICAgICAgICBcInVzYS1mb3JtLWdyb3VwLS15ZWFyXCI6IFwieWVhclwiID09IGRcbiAgICAgIH0pLFxuICAgICAgICAgIHYgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pbnB1dC0taW5saW5lXCIsIG0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuRm9ybUdyb3VwLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5MYWJlbCwge1xuICAgICAgICBodG1sRm9yOiB0XG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5UZXh0SW5wdXQsIF9jMih7fSwgeSwge1xuICAgICAgICBjbGFzc05hbWU6IHYsXG4gICAgICAgIGlkOiB0LFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgbWF4TGVuZ3RoOiBmLFxuICAgICAgICBtaW5MZW5ndGg6IHAsXG4gICAgICAgIHBhdHRlcm46IFwiWzAtOV0qXCIsXG4gICAgICAgIGlucHV0TW9kZTogXCJudW1lcmljXCJcbiAgICAgIH0pKSk7XG4gICAgfTtcblxuICAgIHQuRGF0ZUlucHV0ID0gZDtcbiAgICB2YXIgZiA9IGQ7XG4gICAgdC5kZWZhdWx0ID0gZjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRGF0ZUlucHV0R3JvdXAgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxNyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1tZW1vcmFibGUtZGF0ZVwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTE3KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJkYXRlSW5wdXRHcm91cFwiXG4gICAgICB9KSwgdCk7XG4gICAgfTtcblxuICAgIHQuRGF0ZUlucHV0R3JvdXAgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5DYWxlbmRhciA9IHZvaWQgMDtcblxuICAgIHZhciBhID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gcyh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbiA9IHIoMyksXG4gICAgICAgIG8gPSByKDU0KSxcbiAgICAgICAgaSA9IHIoNTUpLFxuICAgICAgICBsID0gcig1NiksXG4gICAgICAgIHUgPSByKDEyKSxcbiAgICAgICAgYyA9IHIoOSk7XG5cbiAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuIChzID0gZnVuY3Rpb24gcyhlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgZCA9IFwiREFURV9QSUNLRVJcIixcbiAgICAgICAgZiA9IFwiTU9OVEhfUElDS0VSXCIsXG4gICAgICAgIHAgPSBcIllFQVJfUElDS0VSXCIsXG4gICAgICAgIG0gPSBmdW5jdGlvbiBtKGUpIHtcbiAgICAgIHZhciB0ID0gZS5kYXRlLFxuICAgICAgICAgIHIgPSBlLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgICBzID0gZS5oYW5kbGVTZWxlY3REYXRlLFxuICAgICAgICAgIG0gPSBlLm1pbkRhdGUsXG4gICAgICAgICAgeSA9IGUubWF4RGF0ZSxcbiAgICAgICAgICBiID0gZS5yYW5nZURhdGUsXG4gICAgICAgICAgdiA9IGUuc2V0U3RhdHVzZXMsXG4gICAgICAgICAgTyA9IGUuZm9jdXNNb2RlLFxuICAgICAgICAgIGcgPSBlLmkxOG4sXG4gICAgICAgICAgXyA9IHZvaWQgMCA9PT0gZyA/IGMuRU5fVVMgOiBnLFxuICAgICAgICAgIGggPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIGogPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIE0gPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIE4gPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEUgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIFAgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIHcgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEkgPSAoMCwgYS51c2VSZWYpKG51bGwpLFxuICAgICAgICAgIEQgPSAoMCwgYS51c2VTdGF0ZSkodCB8fCAoMCwgbi50b2RheSkoKSksXG4gICAgICAgICAgUyA9IERbMF0sXG4gICAgICAgICAgeCA9IERbMV0sXG4gICAgICAgICAgayA9ICgwLCBhLnVzZVN0YXRlKShkKSxcbiAgICAgICAgICBBID0ga1swXSxcbiAgICAgICAgICBUID0ga1sxXSxcbiAgICAgICAgICBMID0gKDAsIGEudXNlU3RhdGUpKFtudWxsLCBudWxsXSksXG4gICAgICAgICAgQyA9IExbMF0sXG4gICAgICAgICAgRiA9IExbMV0sXG4gICAgICAgICAgUiA9ICEwLFxuICAgICAgICAgIFUgPSAoMCwgbi5hZGREYXlzKShTLCAwKSxcbiAgICAgICAgICBCID0gUy5nZXRNb250aCgpLFxuICAgICAgICAgIFcgPSBTLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgeiA9IF8ubW9udGhzW3BhcnNlSW50KFwiXCIgKyBCKV0sXG4gICAgICAgICAgWSA9IF8uZGF5c09mV2Vla1Nob3J0LFxuICAgICAgICAgIFYgPSBfLmRheXNPZldlZWssXG4gICAgICAgICAgRyA9IF8uYmFja09uZVllYXIsXG4gICAgICAgICAgSCA9IF8uYmFja09uZU1vbnRoLFxuICAgICAgICAgIFEgPSB6ICsgXCIuIFwiICsgXy5jbGlja1RvU2VsZWN0TW9udGgsXG4gICAgICAgICAgSyA9IFcgKyBcIi4gXCIgKyBfLmNsaWNrVG9TZWxlY3RZZWFyLFxuICAgICAgICAgIFogPSBfLmZvcndhcmRPbmVNb250aCxcbiAgICAgICAgICBYID0gXy5mb3J3YXJkT25lWWVhcjtcblxuICAgICAgaWYgKCgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBSID0gITE7XG4gICAgICB9LCBbXSksICgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB0ICYmIEEgPT09IGQgJiYgeCh0KTtcbiAgICAgIH0sIFt0XSksICgwLCBhLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoTyAhPT0gdS5Gb2N1c01vZGUuSW5wdXQpIHtcbiAgICAgICAgICB2YXIgZSA9IENbMF0sXG4gICAgICAgICAgICAgIHQgPSBDWzFdO1xuICAgICAgICAgIGlmIChlICYmIHQpIGUuZGlzYWJsZWQgPyB0LmZvY3VzKCkgOiBlLmZvY3VzKCksIEYoW251bGwsIG51bGxdKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBhID0gSS5jdXJyZW50ICYmIEkuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLWZvY3VzZWRcIik7XG4gICAgICAgICAgICBhICYmIGEuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoUikge1xuICAgICAgICAgIHZhciBvID0gW3ogKyBcIiBcIiArIFddO1xuXG4gICAgICAgICAgaWYgKHIgJiYgKDAsIG4uaXNTYW1lRGF5KShVLCByKSkge1xuICAgICAgICAgICAgdmFyIGkgPSBfLnNlbGVjdGVkRGF0ZTtcbiAgICAgICAgICAgIG8udW5zaGlmdChpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2KG8pO1xuICAgICAgICB9XG4gICAgICB9LCBbU10pLCBBID09PSBmKSByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5Nb250aFBpY2tlciwge1xuICAgICAgICBkYXRlOiBTLFxuICAgICAgICBtaW5EYXRlOiBtLFxuICAgICAgICBtYXhEYXRlOiB5LFxuICAgICAgICBoYW5kbGVTZWxlY3RNb250aDogZnVuY3Rpb24gaGFuZGxlU2VsZWN0TW9udGgoZSkge1xuICAgICAgICAgIHZhciB0ID0gKDAsIG4uc2V0TW9udGgpKFMsIGUpO1xuICAgICAgICAgIHQgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKHQsIG0sIHkpLCB4KHQpLCBUKGQpO1xuICAgICAgICB9LFxuICAgICAgICBpMThuOiBfXG4gICAgICB9KTtcbiAgICAgIGlmIChBID09PSBwKSByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5ZZWFyUGlja2VyLCB7XG4gICAgICAgIGRhdGU6IFMsXG4gICAgICAgIG1pbkRhdGU6IG0sXG4gICAgICAgIG1heERhdGU6IHksXG4gICAgICAgIGhhbmRsZVNlbGVjdFllYXI6IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdFllYXIoZSkge1xuICAgICAgICAgIHZhciB0ID0gKDAsIG4uc2V0WWVhcikoUywgZSk7XG4gICAgICAgICAgdCA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkodCwgbSwgeSksIHgodCksIFQoZCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXR1c2VzOiB2XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgSiA9ICgwLCBuLnN1Yk1vbnRocykoUywgMSksIHEgPSAoMCwgbi5hZGRNb250aHMpKFMsIDEpLCAkID0gKDAsIG4uc3RhcnRPZk1vbnRoKShTKSwgZWUgPSAoMCwgbi5pc1NhbWVNb250aCkoUywgbSksIHRlID0geSAmJiAoMCwgbi5pc1NhbWVNb250aCkoUywgeSksIHJlID0gciB8fCBTLCBhZSA9IGIgJiYgKDAsIG4ubWluKShyZSwgYiksIG5lID0gYiAmJiAoMCwgbi5tYXgpKHJlLCBiKSwgb2UgPSBhZSAmJiAoMCwgbi5hZGREYXlzKShhZSwgMSksIGllID0gbmUgJiYgKDAsIG4uc3ViRGF5cykobmUsIDEpLCBsZSA9IGZ1bmN0aW9uIGxlKGUpIHtcbiAgICAgICAgdmFyIHQ7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgY2FzZSBcIlVwXCI6XG4gICAgICAgICAgICB0ID0gKDAsIG4uc3ViV2Vla3MpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIHQgPSAoMCwgbi5hZGRXZWVrcykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgICBjYXNlIFwiTGVmdFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLnN1YkRheXMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dSaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJSaWdodFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLmFkZERheXMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiSG9tZVwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLnN0YXJ0T2ZXZWVrKShTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgICAgdCA9ICgwLCBuLmVuZE9mV2VlaykoUyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJQYWdlRG93blwiOlxuICAgICAgICAgICAgdCA9IGUuc2hpZnRLZXkgPyAoMCwgbi5hZGRZZWFycykoUywgMSkgOiAoMCwgbi5hZGRNb250aHMpKFMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgICB0ID0gZS5zaGlmdEtleSA/ICgwLCBuLnN1YlllYXJzKShTLCAxKSA6ICgwLCBuLnN1Yk1vbnRocykoUywgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodm9pZCAwICE9PSB0KSB7XG4gICAgICAgICAgdmFyIHIgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKHQsIG0sIHkpO1xuICAgICAgICAgICgwLCBuLmlzU2FtZURheSkoUywgcikgfHwgeCh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIHVlID0gZnVuY3Rpb24gdWUoZSkge1xuICAgICAgICBlICE9PSBTICYmIHgoZSk7XG4gICAgICB9LCBjZSA9IFtdLCBzZSA9ICgwLCBuLnN0YXJ0T2ZXZWVrKSgkKTsgY2UubGVuZ3RoIDwgMjggfHwgc2UuZ2V0TW9udGgoKSA9PT0gQiB8fCBjZS5sZW5ndGggJSA3ICE9IDA7KSB7XG4gICAgICAgIHZhciBkZSA9ICgwLCBuLmlzU2FtZURheSkoc2UsIFUpO1xuICAgICAgICBjZS5wdXNoKGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uRGF5LCB7XG4gICAgICAgICAgZGF0ZTogc2UsXG4gICAgICAgICAgb25DbGljazogcyxcbiAgICAgICAgICBvbktleURvd246IGxlLFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiB1ZSxcbiAgICAgICAgICByZWY6IGRlID8gdyA6IG51bGwsXG4gICAgICAgICAgaXNEaXNhYmxlZDogISgwLCBuLmlzRGF0ZVdpdGhpbk1pbkFuZE1heCkoc2UsIG0sIHkpLFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6IHIgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgciksXG4gICAgICAgICAgaXNGb2N1c2VkOiBkZSxcbiAgICAgICAgICBpc1ByZXZNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBKKSxcbiAgICAgICAgICBpc0ZvY3VzZWRNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBVKSxcbiAgICAgICAgICBpc05leHRNb250aDogKDAsIG4uaXNTYW1lTW9udGgpKHNlLCBxKSxcbiAgICAgICAgICBpc1RvZGF5OiAoMCwgbi5pc1NhbWVEYXkpKHNlLCAoMCwgbi50b2RheSkoKSksXG4gICAgICAgICAgaXNSYW5nZURhdGU6IGIgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgYiksXG4gICAgICAgICAgaXNSYW5nZVN0YXJ0OiBhZSAmJiAoMCwgbi5pc1NhbWVEYXkpKHNlLCBhZSksXG4gICAgICAgICAgaXNSYW5nZUVuZDogbmUgJiYgKDAsIG4uaXNTYW1lRGF5KShzZSwgbmUpLFxuICAgICAgICAgIGlzV2l0aGluUmFuZ2U6IG9lICYmIGllICYmICgwLCBuLmlzRGF0ZVdpdGhpbk1pbkFuZE1heCkoc2UsIG9lLCBpZSksXG4gICAgICAgICAgaTE4bjogX1xuICAgICAgICB9KSksIHNlID0gKDAsIG4uYWRkRGF5cykoc2UsIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLXBpY2tlclwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiY2FsZW5kYXItZGF0ZS1waWNrZXJcIixcbiAgICAgICAgcmVmOiBJLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgKDAsIG4uaGFuZGxlVGFiS2V5KShlLCBbbnVsbCA9PSBoID8gdm9pZCAwIDogaC5jdXJyZW50LCBudWxsID09IGogPyB2b2lkIDAgOiBqLmN1cnJlbnQsIG51bGwgPT0gRSA/IHZvaWQgMCA6IEUuY3VycmVudCwgbnVsbCA9PSBQID8gdm9pZCAwIDogUC5jdXJyZW50LCBudWxsID09IE0gPyB2b2lkIDAgOiBNLmN1cnJlbnQsIG51bGwgPT0gTiA/IHZvaWQgMCA6IE4uY3VycmVudCwgbnVsbCA9PSB3ID8gdm9pZCAwIDogdy5jdXJyZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3Jvd1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19jZWxsIHVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwtLWNlbnRlci1pdGVtc1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJwcmV2aW91cy15ZWFyXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSAoMCwgbi5zdWJZZWFycykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW2guY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogaCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3ByZXZpb3VzLXllYXJcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEcsXG4gICAgICAgIGRpc2FibGVkOiBlZVxuICAgICAgfSwgXCLCoFwiKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByZXZpb3VzLW1vbnRoXCIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgdmFyIGUgPSAoMCwgbi5zdWJNb250aHMpKFMsIDEpO1xuICAgICAgICAgIGUgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGUsIG0sIHkpLCB4KGUpLCBGKFtqLmN1cnJlbnQsIEkuY3VycmVudF0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IGosXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19wcmV2aW91cy1tb250aFwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogSCxcbiAgICAgICAgZGlzYWJsZWQ6IGVlXG4gICAgICB9LCBcIsKgXCIpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbCB1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC1sYWJlbFwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzZWxlY3QtbW9udGhcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICBUKGYpO1xuICAgICAgICAgIHZhciBlID0gXy5zZWxlY3RBTW9udGg7XG4gICAgICAgICAgdihbZV0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IEUsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFFcbiAgICAgIH0sIHopLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzZWxlY3QteWVhclwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIFQocCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogUCxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItc2VsZWN0aW9uXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBLXG4gICAgICB9LCBXKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5leHQtbW9udGhcIixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9ICgwLCBuLmFkZE1vbnRocykoUywgMSk7XG4gICAgICAgICAgZSA9ICgwLCBuLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkoZSwgbSwgeSksIHgoZSksIEYoW00uY3VycmVudCwgSS5jdXJyZW50XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZjogTSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX25leHQtbW9udGhcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFosXG4gICAgICAgIGRpc2FibGVkOiB0ZVxuICAgICAgfSwgXCLCoFwiKSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2NlbGwgdXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fY2VsbC0tY2VudGVyLWl0ZW1zXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIm5leHQteWVhclwiLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gKDAsIG4uYWRkWWVhcnMpKFMsIDEpO1xuICAgICAgICAgIGUgPSAoMCwgbi5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGUsIG0sIHkpLCB4KGUpLCBGKFtOLmN1cnJlbnQsIEkuY3VycmVudF0pO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IE4sXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19uZXh0LXllYXJcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFgsXG4gICAgICAgIGRpc2FibGVkOiB0ZVxuICAgICAgfSwgXCLCoFwiKSkpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3RhYmxlXCIsXG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGhlYWRcIiwgbnVsbCwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBudWxsLCBZLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RheS1vZi13ZWVrXCIsXG4gICAgICAgICAgc2NvcGU6IFwiY29sXCIsXG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFZbcGFyc2VJbnQoXCJcIiArIHQpXSxcbiAgICAgICAgICBrZXk6IFwiZGF5LW9mLXdlZWstXCIgKyBlICsgXCItXCIgKyB0XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCAoMCwgbi5saXN0VG9UYWJsZSkoY2UsIDcpKSkpO1xuICAgIH07XG5cbiAgICB0LkNhbGVuZGFyID0gbSwgbS5kaXNwbGF5TmFtZSA9IFwiQ2FsZW5kYXJcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRGF5ID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSB1KHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDMpLFxuICAgICAgICBsID0gcig5KTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBjID0gKDAsIG4uZm9yd2FyZFJlZikoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS5kYXRlLFxuICAgICAgICAgIGEgPSBlLm9uQ2xpY2ssXG4gICAgICAgICAgdSA9IGUub25LZXlEb3duLFxuICAgICAgICAgIGMgPSBlLm9uTW91c2VNb3ZlLFxuICAgICAgICAgIHMgPSBlLmlzRGlzYWJsZWQsXG4gICAgICAgICAgZCA9IHZvaWQgMCAhPT0gcyAmJiBzLFxuICAgICAgICAgIGYgPSBlLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgcCA9IHZvaWQgMCAhPT0gZiAmJiBmLFxuICAgICAgICAgIG0gPSBlLmlzRm9jdXNlZCxcbiAgICAgICAgICB5ID0gdm9pZCAwICE9PSBtICYmIG0sXG4gICAgICAgICAgYiA9IGUuaXNQcmV2TW9udGgsXG4gICAgICAgICAgdiA9IHZvaWQgMCAhPT0gYiAmJiBiLFxuICAgICAgICAgIE8gPSBlLmlzRm9jdXNlZE1vbnRoLFxuICAgICAgICAgIGcgPSB2b2lkIDAgIT09IE8gJiYgTyxcbiAgICAgICAgICBfID0gZS5pc05leHRNb250aCxcbiAgICAgICAgICBoID0gdm9pZCAwICE9PSBfICYmIF8sXG4gICAgICAgICAgaiA9IGUuaXNUb2RheSxcbiAgICAgICAgICBNID0gdm9pZCAwICE9PSBqICYmIGosXG4gICAgICAgICAgTiA9IGUuaXNSYW5nZURhdGUsXG4gICAgICAgICAgRSA9IHZvaWQgMCAhPT0gTiAmJiBOLFxuICAgICAgICAgIFAgPSBlLmlzUmFuZ2VTdGFydCxcbiAgICAgICAgICB3ID0gdm9pZCAwICE9PSBQICYmIFAsXG4gICAgICAgICAgSSA9IGUuaXNSYW5nZUVuZCxcbiAgICAgICAgICBEID0gdm9pZCAwICE9PSBJICYmIEksXG4gICAgICAgICAgUyA9IGUuaXNXaXRoaW5SYW5nZSxcbiAgICAgICAgICB4ID0gdm9pZCAwICE9PSBTICYmIFMsXG4gICAgICAgICAgayA9IGUuaTE4bixcbiAgICAgICAgICBBID0gdm9pZCAwID09PSBrID8gbC5FTl9VUyA6IGssXG4gICAgICAgICAgVCA9IHIuZ2V0RGF0ZSgpLFxuICAgICAgICAgIEwgPSByLmdldE1vbnRoKCksXG4gICAgICAgICAgQyA9IHIuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICBGID0gci5nZXREYXkoKSxcbiAgICAgICAgICBSID0gKDAsIGkuZm9ybWF0RGF0ZSkociksXG4gICAgICAgICAgVSA9IHkgPyAwIDogLTEsXG4gICAgICAgICAgQiA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZVwiLCB7XG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tcHJldmlvdXMtbW9udGhcIjogdixcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1jdXJyZW50LW1vbnRoXCI6IGcsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tbmV4dC1tb250aFwiOiBoLFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXNlbGVjdGVkXCI6IHAsXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tdG9kYXlcIjogTSxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1mb2N1c2VkXCI6IHksXG4gICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fZGF0ZS0tcmFuZ2UtZGF0ZVwiOiBFLFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXJhbmdlLWRhdGUtc3RhcnRcIjogdyxcbiAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19kYXRlLS1yYW5nZS1kYXRlLWVuZFwiOiBELFxuICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX2RhdGUtLXdpdGhpbi1yYW5nZVwiOiB4XG4gICAgICB9KSxcbiAgICAgICAgICBXID0gQS5tb250aHNbcGFyc2VJbnQoXCJcIiArIEwpXSxcbiAgICAgICAgICB6ID0gQS5kYXlzT2ZXZWVrW3BhcnNlSW50KFwiXCIgKyBGKV07XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwic2VsZWN0LWRhdGVcIixcbiAgICAgICAgcmVmOiB0LFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIGEoUik7XG4gICAgICAgIH0sXG4gICAgICAgIHRhYkluZGV4OiBVLFxuICAgICAgICBjbGFzc05hbWU6IEIsXG4gICAgICAgIFwiZGF0YS1kYXlcIjogVCxcbiAgICAgICAgXCJkYXRhLW1vbnRoXCI6IEwgKyAxLFxuICAgICAgICBcImRhdGEteWVhclwiOiBDLFxuICAgICAgICBcImRhdGEtdmFsdWVcIjogUixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFQgKyBcIiBcIiArIFcgKyBcIiBcIiArIEMgKyBcIiBcIiArIHosXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiAhIXAsXG4gICAgICAgIGRpc2FibGVkOiBkLFxuICAgICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICAgICAgdShlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZU1vdmU6IGcgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZCB8fCAoMCwgaS5pc0lvc0RldmljZSkoKSB8fCBjKHIpO1xuICAgICAgICB9IDogdm9pZCAwXG4gICAgICB9LCBUKTtcbiAgICB9KTtcbiAgICB0LkRheSA9IGMsIGMuZGlzcGxheU5hbWUgPSBcIkRheVwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Nb250aFBpY2tlciA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcigzKSxcbiAgICAgICAgbCA9IHIoOSk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuICh1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmRhdGUsXG4gICAgICAgICAgciA9IGUubWluRGF0ZSxcbiAgICAgICAgICBhID0gZS5tYXhEYXRlLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVNlbGVjdE1vbnRoLFxuICAgICAgICAgIGMgPSBlLmkxOG4sXG4gICAgICAgICAgcyA9IHZvaWQgMCA9PT0gYyA/IGwuRU5fVVMgOiBjLFxuICAgICAgICAgIGQgPSB0LmdldE1vbnRoKCksXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVN0YXRlKShkKSxcbiAgICAgICAgICBwID0gZlswXSxcbiAgICAgICAgICBtID0gZlsxXSxcbiAgICAgICAgICB5ID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBiID0gKDAsIG4udXNlUmVmKShudWxsKTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHkuY3VycmVudCAmJiB5LmN1cnJlbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdmFsdWU9XCInICsgcCArICdcIl0nKTtcbiAgICAgICAgZSAmJiBlLmZvY3VzKCk7XG4gICAgICB9LCBbcF0pO1xuXG4gICAgICB2YXIgdiA9IGZ1bmN0aW9uIHYoZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICAgIG8sXG4gICAgICAgICAgICBsID0gZS50YXJnZXQsXG4gICAgICAgICAgICB1ID0gcGFyc2VJbnQoKG51bGwgPT09IChuID0gbC5kYXRhc2V0KSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlKSB8fCBcIlwiLCAxMCksXG4gICAgICAgICAgICBjID0gKDAsIGkuc2V0TW9udGgpKHQsIHUpO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGNhc2UgXCJVcFwiOlxuICAgICAgICAgICAgbyA9IHUgLSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIG8gPSB1ICsgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJMZWZ0XCI6XG4gICAgICAgICAgICBvID0gdSAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcIlJpZ2h0XCI6XG4gICAgICAgICAgICBvID0gdSArIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgICBvID0gdSAtIHUgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgICBvID0gdSArIDIgLSB1ICUgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VEb3duXCI6XG4gICAgICAgICAgICBvID0gMTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJQYWdlVXBcIjpcbiAgICAgICAgICAgIG8gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gbykge1xuICAgICAgICAgIG8gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMSwgbykpO1xuICAgICAgICAgIHZhciBzID0gKDAsIGkuc2V0TW9udGgpKHQsIG8pLFxuICAgICAgICAgICAgICBkID0gKDAsIGkua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShzLCByLCBhKTtcbiAgICAgICAgICAoMCwgaS5pc1NhbWVNb250aCkoYywgZCkgfHwgbShkLmdldE1vbnRoKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcbiAgICAgICAgICBPID0gcy5tb250aHMubWFwKGZ1bmN0aW9uIChlLCBsKSB7XG4gICAgICAgIHZhciBjID0gKDAsIGkuc2V0TW9udGgpKHQsIGwpLFxuICAgICAgICAgICAgcyA9ICgwLCBpLmlzRGF0ZXNNb250aE91dHNpZGVNaW5Pck1heCkoYywgciwgYSksXG4gICAgICAgICAgICBmID0gbCA9PT0gZCxcbiAgICAgICAgICAgIHkgPSBsID09PSBwLFxuICAgICAgICAgICAgTyA9IHkgPyAwIDogLTEsXG4gICAgICAgICAgICBnID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aFwiLCB7XG4gICAgICAgICAgXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19tb250aC0tc2VsZWN0ZWRcIjogZixcbiAgICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX21vbnRoLS1mb2N1c2VkXCI6IHlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICBrZXk6IFwic2VsZWN0TW9udGhfXCIgKyBlLFxuICAgICAgICAgIHJlZjogeSA/IGIgOiBudWxsLFxuICAgICAgICAgIHRhYkluZGV4OiBPLFxuICAgICAgICAgIGNsYXNzTmFtZTogZyxcbiAgICAgICAgICBcImRhdGEtdmFsdWVcIjogbCxcbiAgICAgICAgICBcImRhdGEtbGFiZWxcIjogZSxcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogZixcbiAgICAgICAgICBkaXNhYmxlZDogcyxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdShsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogdixcbiAgICAgICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgICAgICBzIHx8ICgwLCBpLmlzSW9zRGV2aWNlKSgpIHx8IGwgIT09IHAgJiYgbShsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNhbGVuZGFyLW1vbnRoLXBpY2tlclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fbW9udGgtcGlja2VyXCIsXG4gICAgICAgIHJlZjogeSxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgICgwLCBpLmhhbmRsZVRhYktleSkoZSwgW251bGwgPT0gYiA/IHZvaWQgMCA6IGIuY3VycmVudF0pO1xuICAgICAgICB9XG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3RhYmxlXCIsXG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgbnVsbCwgKDAsIGkubGlzdFRvVGFibGUpKE8sIDMpKSkpO1xuICAgIH07XG5cbiAgICB0Lk1vbnRoUGlja2VyID0gYywgYy5kaXNwbGF5TmFtZSA9IFwiTW9udGhQaWNrZXJcIjtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuWWVhclBpY2tlciA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig2KSxcbiAgICAgICAgbCA9IHIoMyk7XG5cbiAgICBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIFdlYWtNYXApIHJldHVybiBudWxsO1xuICAgICAgdmFyIHQgPSBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgIHIgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgcmV0dXJuICh1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICAgIHJldHVybiBlID8gciA6IHQ7XG4gICAgICB9KShlKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IGZ1bmN0aW9uIGMoZSkge1xuICAgICAgdmFyIHQgPSBlLmRhdGUsXG4gICAgICAgICAgciA9IGUubWluRGF0ZSxcbiAgICAgICAgICBhID0gZS5tYXhEYXRlLFxuICAgICAgICAgIHUgPSBlLmhhbmRsZVNlbGVjdFllYXIsXG4gICAgICAgICAgYyA9IGUuc2V0U3RhdHVzZXMsXG4gICAgICAgICAgcyA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgZCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgZiA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgcCA9ICgwLCBuLnVzZVJlZikobnVsbCksXG4gICAgICAgICAgbSA9IHQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICB5ID0gKDAsIG4udXNlU3RhdGUpKG0pLFxuICAgICAgICAgIGIgPSB5WzBdLFxuICAgICAgICAgIHYgPSB5WzFdLFxuICAgICAgICAgIE8gPSAoMCwgbi51c2VTdGF0ZSkoW251bGwsIG51bGxdKSxcbiAgICAgICAgICBnID0gT1swXSxcbiAgICAgICAgICBfID0gT1sxXSxcbiAgICAgICAgICBoID0gYjtcbiAgICAgIGggLT0gaCAlIGkuWUVBUl9DSFVOSywgaCA9IE1hdGgubWF4KDAsIGgpO1xuICAgICAgdmFyIGogPSAoMCwgbC5pc0RhdGVzWWVhck91dHNpZGVNaW5Pck1heCkoKDAsIGwuc2V0WWVhcikodCwgaCAtIDEpLCByLCBhKSxcbiAgICAgICAgICBNID0gKDAsIGwuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgpKCgwLCBsLnNldFllYXIpKHQsIGggKyBpLllFQVJfQ0hVTkspLCByLCBhKTtcbiAgICAgICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IFwiU2hvd2luZyB5ZWFycyBcIiArIGggKyBcIiB0byBcIiArIChoICsgaS5ZRUFSX0NIVU5LIC0gMSkgKyBcIi4gU2VsZWN0IGEgeWVhci5cIjtcbiAgICAgICAgYyhbZV0pO1xuICAgICAgICB2YXIgdCA9IGdbMF0sXG4gICAgICAgICAgICByID0gZ1sxXTtcbiAgICAgICAgaWYgKHQgJiYgcikgdC5kaXNhYmxlZCA/IHIuZm9jdXMoKSA6IHQuZm9jdXMoKSwgXyhbbnVsbCwgbnVsbF0pO2Vsc2Uge1xuICAgICAgICAgIHZhciBhID0gcC5jdXJyZW50ICYmIHAuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLnVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItLWZvY3VzZWRcIik7XG4gICAgICAgICAgYSAmJiBhLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIFtiXSksICgwLCBuLnVzZUVmZmVjdCkoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHAuY3VycmVudCAmJiBwLmN1cnJlbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdmFsdWU9XCInICsgYiArICdcIl0nKTtcbiAgICAgICAgZSAmJiBlLmZvY3VzKCk7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIGZvciAodmFyIE4gPSBmdW5jdGlvbiBOKGUpIHtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgICBvLFxuICAgICAgICAgICAgdSA9IGUudGFyZ2V0LFxuICAgICAgICAgICAgYyA9IHBhcnNlSW50KChudWxsID09PSAobiA9IHUuZGF0YXNldCkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi52YWx1ZSkgfHwgXCJcIiwgMTApLFxuICAgICAgICAgICAgcyA9ICgwLCBsLnNldFllYXIpKHQsIGMpO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGNhc2UgXCJVcFwiOlxuICAgICAgICAgICAgbyA9IGMgLSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgY2FzZSBcIkRvd25cIjpcbiAgICAgICAgICAgIG8gPSBjICsgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJMZWZ0XCI6XG4gICAgICAgICAgICBvID0gYyAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcIlJpZ2h0XCI6XG4gICAgICAgICAgICBvID0gYyArIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgICBvID0gYyAtIGMgJSAzO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgICBvID0gYyArIDIgLSBjICUgMztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VEb3duXCI6XG4gICAgICAgICAgICBvID0gYyArIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlBhZ2VVcFwiOlxuICAgICAgICAgICAgbyA9IGMgLSBpLllFQVJfQ0hVTks7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodm9pZCAwICE9PSBvKSB7XG4gICAgICAgICAgbyA9IE1hdGgubWF4KDAsIG8pO1xuICAgICAgICAgIHZhciBkID0gKDAsIGwuc2V0WWVhcikodCwgbyksXG4gICAgICAgICAgICAgIGYgPSAoMCwgbC5rZWVwRGF0ZUJldHdlZW5NaW5BbmRNYXgpKGQsIHIsIGEpO1xuICAgICAgICAgICgwLCBsLmlzU2FtZVllYXIpKHMsIGYpIHx8IHYoZi5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIEUgPSBbXSwgUCA9IGgsIHcgPSBmdW5jdGlvbiB3KCkge1xuICAgICAgICB2YXIgZSA9IFAsXG4gICAgICAgICAgICBpID0gKDAsIGwuaXNEYXRlc1llYXJPdXRzaWRlTWluT3JNYXgpKCgwLCBsLnNldFllYXIpKHQsIGUpLCByLCBhKSxcbiAgICAgICAgICAgIGMgPSBlID09PSBtLFxuICAgICAgICAgICAgcyA9IGUgPT09IGIsXG4gICAgICAgICAgICBkID0gcyA/IDAgOiAtMSxcbiAgICAgICAgICAgIHAgPSAoMCwgby5kZWZhdWx0KShcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXJcIiwge1xuICAgICAgICAgIFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci0tc2VsZWN0ZWRcIjogYyxcbiAgICAgICAgICBcInVzYS1kYXRlLXBpY2tlcl9fY2FsZW5kYXJfX3llYXItLWZvY3VzZWRcIjogc1xuICAgICAgICB9KTtcbiAgICAgICAgRS5wdXNoKG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgIHRhYkluZGV4OiBkLFxuICAgICAgICAgIHJlZjogcyA/IGYgOiBudWxsLFxuICAgICAgICAgIGNsYXNzTmFtZTogcCxcbiAgICAgICAgICBcImRhdGEtdmFsdWVcIjogZSxcbiAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogYyxcbiAgICAgICAgICBkaXNhYmxlZDogaSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgdShlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogTixcbiAgICAgICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgICAgICBpIHx8ICgwLCBsLmlzSW9zRGV2aWNlKSgpIHx8IGUgIT09IGIgJiYgdihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGUpKSwgUCArPSAxO1xuICAgICAgfTsgRS5sZW5ndGggPCBpLllFQVJfQ0hVTks7KSB7XG4gICAgICAgIHcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9feWVhci1waWNrZXJcIixcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImNhbGVuZGFyLXllYXItcGlja2VyXCIsXG4gICAgICAgIHJlZjogcCxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgICAgICgwLCBsLmhhbmRsZVRhYktleSkoZSwgW251bGwgPT0gcyA/IHZvaWQgMCA6IHMuY3VycmVudCwgbnVsbCA9PSBmID8gdm9pZCAwIDogZi5jdXJyZW50LCBudWxsID09IGQgPyB2b2lkIDAgOiBkLmN1cnJlbnRdKTtcbiAgICAgICAgfVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX190YWJsZVwiLFxuICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gICAgICB9LCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgbnVsbCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJwcmV2aW91cy15ZWFyLWNodW5rXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19wcmV2aW91cy15ZWFyLWNodW5rXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBcIk5hdmlnYXRlIGJhY2sgXCIgKyBpLllFQVJfQ0hVTksgKyBcIiB5ZWFyc1wiLFxuICAgICAgICBkaXNhYmxlZDogaixcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICB2YXIgZSA9IGIgLSBpLllFQVJfQ0hVTks7XG4gICAgICAgICAgZSA9IE1hdGgubWF4KDAsIGUpO1xuICAgICAgICAgIHZhciBuID0gKDAsIGwuc2V0WWVhcikodCwgZSk7XG4gICAgICAgICAgbiA9ICgwLCBsLmtlZXBEYXRlQmV0d2Vlbk1pbkFuZE1heCkobiwgciwgYSksIF8oW3MuY3VycmVudCwgcC5jdXJyZW50XSksIHYobi5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmOiBzXG4gICAgICB9LCBcIsKgXCIpKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7XG4gICAgICAgIGNvbFNwYW46IDNcbiAgICAgIH0sIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWRhdGUtcGlja2VyX19jYWxlbmRhcl9fdGFibGVcIixcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCAoMCwgbC5saXN0VG9UYWJsZSkoRSwgMykpKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGRcIiwgbnVsbCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmV4dC15ZWFyLWNodW5rXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZGF0ZS1waWNrZXJfX2NhbGVuZGFyX19uZXh0LXllYXItY2h1bmtcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiTmF2aWdhdGUgZm9yd2FyZCBcIiArIGkuWUVBUl9DSFVOSyArIFwiIHllYXJzXCIsXG4gICAgICAgIGRpc2FibGVkOiBNLFxuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgIHZhciBlID0gYiArIGkuWUVBUl9DSFVOSztcbiAgICAgICAgICBlID0gTWF0aC5tYXgoMCwgZSk7XG4gICAgICAgICAgdmFyIG4gPSAoMCwgbC5zZXRZZWFyKSh0LCBlKTtcbiAgICAgICAgICBuID0gKDAsIGwua2VlcERhdGVCZXR3ZWVuTWluQW5kTWF4KShuLCByLCBhKSwgXyhbZC5jdXJyZW50LCBwLmN1cnJlbnRdKSwgdihuLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICB9LFxuICAgICAgICByZWY6IGRcbiAgICAgIH0sIFwiwqBcIikpKSkpKTtcbiAgICB9O1xuXG4gICAgdC5ZZWFyUGlja2VyID0gYywgYy5kaXNwbGF5TmFtZSA9IFwiWWVhclBpY2tlclwiO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5EYXRlUmFuZ2VQaWNrZXIgPSB2b2lkIDA7XG5cbiAgICB2YXIgYSxcbiAgICAgICAgbiA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBvID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gZCh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgaSA9IHIoNiksXG4gICAgICAgIGwgPSByKDEyKSxcbiAgICAgICAgdSA9IHIoMyksXG4gICAgICAgIGMgPSByKDgpLFxuICAgICAgICBzID0gcig1KTtcblxuICAgIGZ1bmN0aW9uIGQoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfZjIgPSBmdW5jdGlvbiBmKCkge1xuICAgICAgcmV0dXJuIChfZjIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICB0LkRhdGVSYW5nZVBpY2tlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCxcbiAgICAgICAgICByLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgZCxcbiAgICAgICAgICBwLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgeSA9IGUuc3RhcnREYXRlTGFiZWwsXG4gICAgICAgICAgYiA9IGUuc3RhcnREYXRlSGludCxcbiAgICAgICAgICB2ID0gZS5zdGFydERhdGVQaWNrZXJQcm9wcyxcbiAgICAgICAgICBPID0gZS5lbmREYXRlTGFiZWwsXG4gICAgICAgICAgZyA9IGUuZW5kRGF0ZUhpbnQsXG4gICAgICAgICAgXyA9IGUuZW5kRGF0ZVBpY2tlclByb3BzLFxuICAgICAgICAgIGggPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBqID0gKDAsIG8udXNlU3RhdGUpKHYuZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICBNID0galswXSxcbiAgICAgICAgICBOID0galsxXSxcbiAgICAgICAgICBFID0gKDAsIG8udXNlU3RhdGUpKF8uZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICBQID0gRVswXSxcbiAgICAgICAgICB3ID0gRVsxXSxcbiAgICAgICAgICBJID0gZnVuY3Rpb24gSShlLCB0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHZhciBhID0gciAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKHIsIGkuREVGQVVMVF9FWFRFUk5BTF9EQVRFX0ZPUk1BVCk7XG5cbiAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgdmFyIG4gPSAoMCwgdS5mb3JtYXREYXRlKShhKTtcbiAgICAgICAgICAgIHQobik7XG4gICAgICAgICAgfSBlbHNlIHQocik7XG5cbiAgICAgICAgICBlICYmIGUocik7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgICAgIEQgPSBJKHYub25DaGFuZ2UsIE4pLFxuICAgICAgICAgIFMgPSBJKF8ub25DaGFuZ2UsIHcpLFxuICAgICAgICAgIHggPSAoMCwgbi5kZWZhdWx0KShoLCBcInVzYS1kYXRlLXJhbmdlLXBpY2tlclwiKSxcbiAgICAgICAgICBrID0gKDAsIG4uZGVmYXVsdCkodi5jbGFzc05hbWUsIFwidXNhLWRhdGUtcmFuZ2UtcGlja2VyX19yYW5nZS1zdGFydFwiKSxcbiAgICAgICAgICBBID0gKDAsIG4uZGVmYXVsdCkoXy5jbGFzc05hbWUsIFwidXNhLWRhdGUtcmFuZ2UtcGlja2VyX19yYW5nZS1lbmRcIiksXG4gICAgICAgICAgVCA9IHYuaWQgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIEwgPSB2LmlkICsgXCItaGludFwiLFxuICAgICAgICAgIEMgPSBbeSAmJiBULCBiICYmIExdLmpvaW4oXCIgXCIpLnRyaW0oKSB8fCB2b2lkIDAsXG4gICAgICAgICAgRiA9IF8uaWQgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIFIgPSBfLmlkICsgXCItaGludFwiLFxuICAgICAgICAgIFUgPSBbTyAmJiBGLCBnICYmIFJdLmpvaW4oXCIgXCIpLnRyaW0oKSB8fCB2b2lkIDA7XG5cbiAgICAgIHJldHVybiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogeCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImRhdGUtcmFuZ2UtcGlja2VyXCJcbiAgICAgIH0sIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuRm9ybUdyb3VwLCBudWxsLCB5ICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KHMuTGFiZWwsIHtcbiAgICAgICAgaWQ6IFQsXG4gICAgICAgIGh0bWxGb3I6IHYuaWRcbiAgICAgIH0sIHkpLCBiICYmIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1oaW50XCIsXG4gICAgICAgIGlkOiBMXG4gICAgICB9LCBiKSwgby5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobC5EYXRlUGlja2VyLCBfZjIoe1xuICAgICAgICBjbGFzc05hbWU6IGssXG4gICAgICAgIHJhbmdlRGF0ZTogUFxuICAgICAgfSwgdiwge1xuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogQyxcbiAgICAgICAgb25DaGFuZ2U6IEQsXG4gICAgICAgIG1heERhdGU6IChkID0gdi5tYXhEYXRlLCBwID0gZCAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKGQpLCBtID0gUCAmJiAoMCwgdS5wYXJzZURhdGVTdHJpbmcpKFApLCBtICYmIHAgPyBtLmdldFRpbWUoKSA8IHAuZ2V0VGltZSgpID8gKDAsIHUuZm9ybWF0RGF0ZSkobSkgOiAoMCwgdS5mb3JtYXREYXRlKShwKSA6IG0gJiYgKDAsIHUuZm9ybWF0RGF0ZSkobSkgfHwgcCAmJiAoMCwgdS5mb3JtYXREYXRlKShwKSB8fCB2b2lkIDApXG4gICAgICB9KSkpLCBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLkZvcm1Hcm91cCwgbnVsbCwgTyAmJiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChzLkxhYmVsLCB7XG4gICAgICAgIGlkOiBGLFxuICAgICAgICBodG1sRm9yOiBfLmlkXG4gICAgICB9LCBPKSwgZyAmJiBvLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaGludFwiLFxuICAgICAgICBpZDogUlxuICAgICAgfSwgZyksIG8uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuRGF0ZVBpY2tlciwgX2YyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBBLFxuICAgICAgICByYW5nZURhdGU6IE1cbiAgICAgIH0sIF8sIHtcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IFUsXG4gICAgICAgIG9uQ2hhbmdlOiBTLFxuICAgICAgICBtaW5EYXRlOiAodCA9IF8ubWluRGF0ZSwgciA9IHQgJiYgKDAsIHUucGFyc2VEYXRlU3RyaW5nKSh0KSwgYSA9IE0gJiYgKDAsIHUucGFyc2VEYXRlU3RyaW5nKShNKSwgYSAmJiByID8gYS5nZXRUaW1lKCkgPiByLmdldFRpbWUoKSA/ICgwLCB1LmZvcm1hdERhdGUpKGEpIDogKDAsIHUuZm9ybWF0RGF0ZSkocikgOiBhICYmICgwLCB1LmZvcm1hdERhdGUpKGEpIHx8IHIgJiYgKDAsIHUuZm9ybWF0RGF0ZSkocikgfHwgdm9pZCAwKVxuICAgICAgfSkpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuRHJvcGRvd24gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kxOCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMTggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5pZCxcbiAgICAgICAgICByID0gZS5uYW1lLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gZS5pbnB1dFJlZixcbiAgICAgICAgICBjID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBzID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJpbnB1dFJlZlwiLCBcImNoaWxkcmVuXCJdKSxcbiAgICAgICAgICBkID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2VsZWN0XCIsIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIsIF9pMTgoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZHJvcGRvd25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBkLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgcmVmOiB1XG4gICAgICB9LCBzKSwgYyk7XG4gICAgfTtcblxuICAgIHQuRHJvcGRvd24gPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5FcnJvck1lc3NhZ2UgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IGZ1bmN0aW9uIGkoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gZS5pZCxcbiAgICAgICAgICBpID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZXJyb3ItbWVzc2FnZVwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZXJyb3JNZXNzYWdlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogaSxcbiAgICAgICAgaWQ6IG8sXG4gICAgICAgIHJvbGU6IFwiYWxlcnRcIlxuICAgICAgfSwgdCk7XG4gICAgfTtcblxuICAgIHQuRXJyb3JNZXNzYWdlID0gaTtcbiAgICB2YXIgbCA9IGk7XG4gICAgdC5kZWZhdWx0ID0gbDtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuRmllbGRzZXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdC5GaWVsZHNldCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUubGVnZW5kLFxuICAgICAgICAgIGkgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBsID0gZS5sZWdlbmRTck9ubHksXG4gICAgICAgICAgdSA9IGUubGVnZW5kU3R5bGUsXG4gICAgICAgICAgYyA9IHZvaWQgMCA9PT0gdSA/IFwiZGVmYXVsdFwiIDogdSxcbiAgICAgICAgICBzID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZmllbGRzZXRcIiwgaSk7XG4gICAgICBsICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGaWVsZHNldCBwcm9wZXJ0eSBsZWdlbmRTck9ubHkgaXMgZGVwcmVjYXRlZC4gVXNlIGxlZ2VuZFN0eWxlID0gJ3NyT25seScuXCIpO1xuICAgICAgdmFyIGQgPSAoMCwgbi5kZWZhdWx0KSh7XG4gICAgICAgIFwidXNhLWxlZ2VuZFwiOiBcImRlZmF1bHRcIiA9PT0gYyxcbiAgICAgICAgXCJ1c2EtbGVnZW5kLS1sYXJnZVwiOiBcImxhcmdlXCIgPT09IGMsXG4gICAgICAgIFwidXNhLXNyLW9ubHlcIjogXCJzck9ubHlcIiA9PT0gYyB8fCBsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpZWxkc2V0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogc1xuICAgICAgfSwgciAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxlZ2VuZFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogZFxuICAgICAgfSwgciksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZpbGVJbnB1dCA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gdSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgaSA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgaSkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9LFxuICAgICAgICBpID0gcig2MiksXG4gICAgICAgIGwgPSByKDYzKTtcblxuICAgIGZ1bmN0aW9uIHUoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHZhciBfYzMgPSBmdW5jdGlvbiBjKCkge1xuICAgICAgcmV0dXJuIChfYzMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGQgPSAoMCwgbi5mb3J3YXJkUmVmKShmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSBlLm5hbWUsXG4gICAgICAgICAgYSA9IGUuaWQsXG4gICAgICAgICAgdSA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgZCA9IGUubXVsdGlwbGUsXG4gICAgICAgICAgZiA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHAgPSBlLmFjY2VwdCxcbiAgICAgICAgICBtID0gZS5vbkNoYW5nZSxcbiAgICAgICAgICB5ID0gZS5vbkRyb3AsXG4gICAgICAgICAgYiA9IHMoZSwgW1wibmFtZVwiLCBcImlkXCIsIFwiZGlzYWJsZWRcIiwgXCJtdWx0aXBsZVwiLCBcImNsYXNzTmFtZVwiLCBcImFjY2VwdFwiLCBcIm9uQ2hhbmdlXCIsIFwib25Ecm9wXCJdKSxcbiAgICAgICAgICB2ID0gKDAsIG4udXNlUmVmKShudWxsKSxcbiAgICAgICAgICBPID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBnID0gT1swXSxcbiAgICAgICAgICBfID0gT1sxXSxcbiAgICAgICAgICBoID0gKDAsIG4udXNlU3RhdGUpKCExKSxcbiAgICAgICAgICBqID0gaFswXSxcbiAgICAgICAgICBNID0gaFsxXSxcbiAgICAgICAgICBOID0gKDAsIG4udXNlU3RhdGUpKFtdKSxcbiAgICAgICAgICBFID0gTlswXSxcbiAgICAgICAgICBQID0gTlsxXTtcbiAgICAgICgwLCBuLnVzZUltcGVyYXRpdmVIYW5kbGUpKHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnB1dDogdi5jdXJyZW50LFxuICAgICAgICAgIGNsZWFyRmlsZXM6IGZ1bmN0aW9uIGNsZWFyRmlsZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gUChbXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWxlczogRVxuICAgICAgICB9O1xuICAgICAgfSwgW0VdKTtcbiAgICAgIHZhciB3ID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZmlsZS1pbnB1dFwiLCB7XG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXQtLWRpc2FibGVkXCI6IHVcbiAgICAgIH0sIGYpLFxuICAgICAgICAgIEkgPSAoMCwgby5kZWZhdWx0KShcInVzYS1maWxlLWlucHV0X190YXJnZXRcIiwge1xuICAgICAgICBcInVzYS1maWxlLWlucHV0LS1kcmFnXCI6IGcsXG4gICAgICAgIFwiaGFzLWludmFsaWQtZmlsZVwiOiBqXG4gICAgICB9KSxcbiAgICAgICAgICBEID0gL3J2OjExLjAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IC9FZGdlXFwvXFxkLi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksXG4gICAgICAgICAgUyA9IGQgPyBcIkRyYWcgZmlsZXMgaGVyZSBvciBcIiA6IFwiRHJhZyBmaWxlIGhlcmUgb3IgXCIsXG4gICAgICAgICAgeCA9IFtdO1xuICAgICAgaWYgKEUpIGZvciAodmFyIGsgPSAwOyBrIDwgKG51bGwgPT0gRSA/IHZvaWQgMCA6IEUubGVuZ3RoKTsgaysrKSB7XG4gICAgICAgIHZhciBBID0gKDAsIGwubWFrZVNhZmVGb3JJRCkoRVtwYXJzZUludChcIlwiICsgayldLm5hbWUpLFxuICAgICAgICAgICAgVCA9IFwiZmlsZVByZXZpZXdfXCIgKyBBO1xuICAgICAgICB4LnB1c2gobi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoaS5GaWxlUHJldmlldywge1xuICAgICAgICAgIGtleTogVCxcbiAgICAgICAgICBpbWFnZUlkOiBBLFxuICAgICAgICAgIGZpbGU6IEVbcGFyc2VJbnQoXCJcIiArIGspXVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICB2YXIgTCA9ICgwLCBvLmRlZmF1bHQpKFwidXNhLWZpbGUtaW5wdXRfX2luc3RydWN0aW9uc1wiLCB7XG4gICAgICAgIFwiZGlzcGxheS1ub25lXCI6IHgubGVuZ3RoID4gMFxuICAgICAgfSksXG4gICAgICAgICAgQyA9IHgubGVuZ3RoID4gMSA/IHgubGVuZ3RoICsgXCIgZmlsZXMgc2VsZWN0ZWRcIiA6IFwiU2VsZWN0ZWQgZmlsZVwiO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXRcIixcbiAgICAgICAgY2xhc3NOYW1lOiB3LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogdVxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1kcm9wdGFyZ2V0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogSSxcbiAgICAgICAgb25EcmFnT3ZlcjogZnVuY3Rpb24gb25EcmFnT3ZlcigpIHtcbiAgICAgICAgICByZXR1cm4gXyghMCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRHJhZ0xlYXZlOiBmdW5jdGlvbiBvbkRyYWdMZWF2ZSgpIHtcbiAgICAgICAgICByZXR1cm4gXyghMSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRHJvcDogZnVuY3Rpb24gb25Ecm9wKGUpIHtcbiAgICAgICAgICAhZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChNKCExKSwgcCkge1xuICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gcC5zcGxpdChcIixcIiksIHIgPSAhMCwgYSA9IDA7IGEgPCBlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gZS5kYXRhVHJhbnNmZXIuZmlsZXNbcGFyc2VJbnQoXCJcIiArIGEpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXIpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbcGFyc2VJbnQoXCJcIiArIG8pXTtcbiAgICAgICAgICAgICAgICAgIGlmIChyID0gbi5uYW1lLmluZGV4T2YoaSkgPiAwIHx8IG4udHlwZS5pbmNsdWRlcyhpLnJlcGxhY2UoL1xcKi9nLCBcIlwiKSkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHIgfHwgKFAoW10pLCBNKCEwKSwgZS5wcmV2ZW50RGVmYXVsdCgpLCBlLnN0b3BQcm9wYWdhdGlvbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KGUpLCBfKCExKSwgeSAmJiB5KGUpO1xuICAgICAgICB9XG4gICAgICB9LCB4Lmxlbmd0aCA+IDAgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1wcmV2aWV3LWhlYWRpbmdcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWhlYWRpbmdcIlxuICAgICAgfSwgQywgXCIgXCIsIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiQ2hhbmdlIGZpbGVcIiwgeC5sZW5ndGggPiAxICYmIFwic1wiKSksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtaW5zdHJ1Y3Rpb25zXCIsXG4gICAgICAgIGNsYXNzTmFtZTogTCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgIUQgJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19kcmFnLXRleHRcIlxuICAgICAgfSwgUyksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZmlsZS1pbnB1dF9fY2hvb3NlXCJcbiAgICAgIH0sIFwiY2hvb3NlIGZyb20gZm9sZGVyXCIpKSwgeCwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1ib3hcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1maWxlLWlucHV0X19ib3hcIlxuICAgICAgfSksIGogJiYgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZmlsZS1pbnB1dC1lcnJvclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2FjY2VwdGVkLWZpbGVzLW1lc3NhZ2VcIlxuICAgICAgfSwgXCJUaGlzIGlzIG5vdCBhIHZhbGlkIGZpbGUgdHlwZS5cIiksIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2MzKHt9LCBiLCB7XG4gICAgICAgIHJlZjogdixcbiAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJmaWxlLWlucHV0LWlucHV0XCIsXG4gICAgICAgIG5hbWU6IHIsXG4gICAgICAgIGlkOiBhLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX2lucHV0XCIsXG4gICAgICAgIGRpc2FibGVkOiB1LFxuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICAgIHZhciB0LCByLCBhLCBuO1xuICAgICAgICAgIE0oITEpO1xuICAgICAgICAgIHZhciBvID0gW107XG4gICAgICAgICAgaWYgKG51bGwgPT09IChyID0gbnVsbCA9PT0gKHQgPSBlLnRhcmdldCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5maWxlcykgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci5sZW5ndGgpIGZvciAodmFyIGkgPSAobnVsbCA9PT0gKG4gPSBudWxsID09PSAoYSA9IGUudGFyZ2V0KSB8fCB2b2lkIDAgPT09IGEgPyB2b2lkIDAgOiBhLmZpbGVzKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLmxlbmd0aCkgfHwgMCwgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICAgIHZhciB1ID0gZS50YXJnZXQuZmlsZXMuaXRlbShsKTtcbiAgICAgICAgICAgIHUgJiYgby5wdXNoKHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBQKG8pLCBtICYmIG0oZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpcGxlOiBkLFxuICAgICAgICBhY2NlcHQ6IHBcbiAgICAgIH0pKSkpO1xuICAgIH0pO1xuXG4gICAgdC5GaWxlSW5wdXQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5GaWxlUHJldmlldyA9IHZvaWQgMDtcblxuICAgIHZhciBhLFxuICAgICAgICBuID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmICghdCAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICAgIHZhciByID0gaSh0KTtcbiAgICAgIGlmIChyICYmIHIuaGFzKGUpKSByZXR1cm4gci5nZXQoZSk7XG4gICAgICB2YXIgYSA9IHt9LFxuICAgICAgICAgIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgIGlmIChcImRlZmF1bHRcIiAhPT0gbyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHtcbiAgICAgICAgICB2YXIgbCA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDtcbiAgICAgICAgICBsICYmIChsLmdldCB8fCBsLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgbywgbCkgOiBhW29dID0gZVtvXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhLmRlZmF1bHQgPSBlLCByICYmIHIuc2V0KGUsIGEpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfShyKDApKSxcbiAgICAgICAgbyA9IChhID0gcigxKSkgJiYgYS5fX2VzTW9kdWxlID8gYSA6IHtcbiAgICAgIGRlZmF1bHQ6IGFcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB0ID0gbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICByID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHJldHVybiAoaSA9IGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICByZXR1cm4gZSA/IHIgOiB0O1xuICAgICAgfSkoZSk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBN1wiO1xuXG4gICAgdC5GaWxlUHJldmlldyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaW1hZ2VJZCxcbiAgICAgICAgICByID0gZS5maWxlLFxuICAgICAgICAgIGEgPSAoMCwgbi51c2VSZWYpKG5ldyBGaWxlUmVhZGVyKCkpLFxuICAgICAgICAgIGkgPSAoMCwgbi51c2VTdGF0ZSkoITApLFxuICAgICAgICAgIHUgPSBpWzBdLFxuICAgICAgICAgIGMgPSBpWzFdLFxuICAgICAgICAgIHMgPSAoMCwgbi51c2VTdGF0ZSkobCksXG4gICAgICAgICAgZCA9IHNbMF0sXG4gICAgICAgICAgZiA9IHNbMV0sXG4gICAgICAgICAgcCA9ICgwLCBuLnVzZVN0YXRlKSghMSksXG4gICAgICAgICAgbSA9IHBbMF0sXG4gICAgICAgICAgeSA9IHBbMV07XG4gICAgICAoMCwgbi51c2VFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGEuY3VycmVudC5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYyghMSksIGYoYS5jdXJyZW50LnJlc3VsdCk7XG4gICAgICAgIH0sIGEuY3VycmVudC5yZWFkQXNEYXRhVVJMKHIpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYS5jdXJyZW50Lm9ubG9hZGVuZCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIHZhciBiID0gci5uYW1lLFxuICAgICAgICAgIHYgPSBiLmluZGV4T2YoXCIucGRmXCIpID4gMCxcbiAgICAgICAgICBPID0gYi5pbmRleE9mKFwiLmRvY1wiKSA+IDAgfHwgYi5pbmRleE9mKFwiLnBhZ2VzXCIpID4gMCxcbiAgICAgICAgICBnID0gYi5pbmRleE9mKFwiLm1vdlwiKSA+IDAgfHwgYi5pbmRleE9mKFwiLm1wNFwiKSA+IDAsXG4gICAgICAgICAgXyA9IGIuaW5kZXhPZihcIi54bHNcIikgPiAwIHx8IGIuaW5kZXhPZihcIi5udW1iZXJzXCIpID4gMCxcbiAgICAgICAgICBoID0gISh2IHx8IE8gfHwgZyB8fCBfKSxcbiAgICAgICAgICBqID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlldy1pbWFnZVwiLCB7XG4gICAgICAgIFwiaXMtbG9hZGluZ1wiOiB1LFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS1wZGZcIjogbSAmJiB2LFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS13b3JkXCI6IG0gJiYgTyxcbiAgICAgICAgXCJ1c2EtZmlsZS1pbnB1dF9fcHJldmlldy1pbWFnZS0tdmlkZW9cIjogbSAmJiBnLFxuICAgICAgICBcInVzYS1maWxlLWlucHV0X19wcmV2aWV3LWltYWdlLS1leGNlbFwiOiBtICYmIF8sXG4gICAgICAgIFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXctaW1hZ2UtLWdlbmVyaWNcIjogbSAmJiBoXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtcHJldmlld1wiLFxuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZpbGUtaW5wdXRfX3ByZXZpZXdcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImZpbGUtaW5wdXQtcHJldmlldy1pbWFnZVwiLFxuICAgICAgICBzcmM6IGQsXG4gICAgICAgIGFsdDogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBqLFxuICAgICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKCkge1xuICAgICAgICAgIGYobCksIHkoITApO1xuICAgICAgICB9XG4gICAgICB9KSwgYik7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQubWFrZVNhZmVGb3JJRCA9IHZvaWQgMDtcblxuICAgIHQubWFrZVNhZmVGb3JJRCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5yZXBsYWNlKC9bXmEtejAtOV0vZywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHQgPSBlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIHJldHVybiAzMiA9PT0gdCA/IFwiLVwiIDogdCA+PSA2NSAmJiB0IDw9IDkwID8gXCJpbWdfXCIgKyBlLnRvTG93ZXJDYXNlKCkgOiBcIl9fXCIgKyB0LnRvU3RyaW5nKDE2KS5zbGljZSgtNCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5SYWRpbyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTE5ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kxOSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmlkLFxuICAgICAgICAgIHIgPSBlLm5hbWUsXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLmxhYmVsLFxuICAgICAgICAgIGMgPSBlLmlucHV0UmVmLFxuICAgICAgICAgIHMgPSBlLnRpbGUsXG4gICAgICAgICAgZCA9IGUubGFiZWxEZXNjcmlwdGlvbixcbiAgICAgICAgICBmID0gbChlLCBbXCJpZFwiLCBcIm5hbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJsYWJlbFwiLCBcImlucHV0UmVmXCIsIFwidGlsZVwiLCBcImxhYmVsRGVzY3JpcHRpb25cIl0pLFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1yYWRpb1wiLCBvKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtcmFkaW9fX2lucHV0XCIsIHtcbiAgICAgICAgXCJ1c2EtcmFkaW9fX2lucHV0LS10aWxlXCI6IHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInJhZGlvXCIsXG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfaTE5KHtcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBpZDogdCxcbiAgICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgICBuYW1lOiByLFxuICAgICAgICByZWY6IGNcbiAgICAgIH0sIGYpKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtcmFkaW9fX2xhYmVsXCIsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIHUsIGQgJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jaGVja2JveF9fbGFiZWwtZGVzY3JpcHRpb25cIlxuICAgICAgfSwgZCkpKTtcbiAgICB9O1xuXG4gICAgdC5SYWRpbyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlJhbmdlSW5wdXQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyMCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjAgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuaW5wdXRSZWYsXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiaW5wdXRSZWZcIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1yYW5nZVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9pMjAoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwicmFuZ2VcIixcbiAgICAgICAgY2xhc3NOYW1lOiB1LFxuICAgICAgICByZWY6IHIsXG4gICAgICAgIHR5cGU6IFwicmFuZ2VcIlxuICAgICAgfSwgbykpO1xuICAgIH07XG5cbiAgICB0LlJhbmdlSW5wdXQgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5UaW1lUGlja2VyID0gdm9pZCAwO1xuXG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKCF0ICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICAgIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgICAgdmFyIHIgPSBkKHQpO1xuICAgICAgaWYgKHIgJiYgci5oYXMoZSkpIHJldHVybiByLmdldChlKTtcbiAgICAgIHZhciBhID0ge30sXG4gICAgICAgICAgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gICAgICBmb3IgKHZhciBvIGluIGUpIHtcbiAgICAgICAgaWYgKFwiZGVmYXVsdFwiICE9PSBvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkge1xuICAgICAgICAgIHZhciBpID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsO1xuICAgICAgICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBvLCBpKSA6IGFbb10gPSBlW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGEuZGVmYXVsdCA9IGUsIHIgJiYgci5zZXQoZSwgYSk7XG4gICAgICByZXR1cm4gYTtcbiAgICB9KHIoMCkpLFxuICAgICAgICBvID0gKGEgPSByKDEpKSAmJiBhLl9fZXNNb2R1bGUgPyBhIDoge1xuICAgICAgZGVmYXVsdDogYVxuICAgIH0sXG4gICAgICAgIGkgPSByKDgpLFxuICAgICAgICBsID0gcig1KSxcbiAgICAgICAgdSA9IHIoMTEpLFxuICAgICAgICBjID0gcig2NyksXG4gICAgICAgIHMgPSByKDY4KTtcblxuICAgIGZ1bmN0aW9uIGQoZSkge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdCA9IG5ldyBXZWFrTWFwKCksXG4gICAgICAgICAgciA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICByZXR1cm4gKGQgPSBmdW5jdGlvbiBkKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyByIDogdDtcbiAgICAgIH0pKGUpO1xuICAgIH1cblxuICAgIHQuVGltZVBpY2tlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuaWQsXG4gICAgICAgICAgciA9IGUubmFtZSxcbiAgICAgICAgICBhID0gZS5vbkNoYW5nZSxcbiAgICAgICAgICBkID0gZS5sYWJlbCxcbiAgICAgICAgICBmID0gZS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgcCA9IGUuZGlzYWJsZWQsXG4gICAgICAgICAgbSA9IGUubWluVGltZSxcbiAgICAgICAgICB5ID0gdm9pZCAwID09PSBtID8gcy5ERUZBVUxUX01JTl9USU1FIDogbSxcbiAgICAgICAgICBiID0gZS5tYXhUaW1lLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBzLkRFRkFVTFRfTUFYX1RJTUUgOiBiLFxuICAgICAgICAgIE8gPSBlLnN0ZXAsXG4gICAgICAgICAgZyA9IHZvaWQgMCA9PT0gTyA/IHMuREVGQVVMVF9TVEVQIDogTyxcbiAgICAgICAgICBfID0gZS5oaW50LFxuICAgICAgICAgIGggPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBqID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtdGltZS1waWNrZXJcIiwgaCksXG4gICAgICAgICAgTSA9ICgwLCBjLnBhcnNlVGltZVN0cmluZykoeSkgfHwgcy5ERUZBVUxUX01JTl9USU1FX01JTlVURVMsXG4gICAgICAgICAgTiA9ICgwLCBjLnBhcnNlVGltZVN0cmluZykodikgfHwgcy5ERUZBVUxUX01BWF9USU1FX01JTlVURVMsXG4gICAgICAgICAgRSA9IGcgPCBzLk1JTl9TVEVQID8gcy5NSU5fU1RFUCA6IGcsXG4gICAgICAgICAgUCA9ICgwLCBuLnVzZU1lbW8pKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBjLmdldFRpbWVPcHRpb25zKShNLCBOLCBFKTtcbiAgICAgIH0sIFt5LCB2LCBnXSksXG4gICAgICAgICAgdyA9IHIgKyBcIi1sYWJlbFwiLFxuICAgICAgICAgIEkgPSByICsgXCItaGludFwiO1xuICAgICAgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuRm9ybUdyb3VwLCBudWxsLCBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLkxhYmVsLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbGFiZWxcIixcbiAgICAgICAgaWQ6IHcsXG4gICAgICAgIGh0bWxGb3I6IHRcbiAgICAgIH0sIGQpLCBfICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1oaW50XCIsXG4gICAgICAgIGlkOiBJXG4gICAgICB9LCBfKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodS5Db21ib0JveCwge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgY2xhc3NOYW1lOiBqLFxuICAgICAgICBvbkNoYW5nZTogYSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBmLFxuICAgICAgICBvcHRpb25zOiBQLFxuICAgICAgICBkaXNhYmxlZDogcCxcbiAgICAgICAgY3VzdG9tRmlsdGVyOiBzLlRJTUVfUElDS0VSX0NVU1RPTV9GSUxURVIsXG4gICAgICAgIGRpc2FibGVGaWx0ZXJpbmc6ICEwXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZ2V0VGltZU9wdGlvbnMgPSB0LnBhcnNlVGltZVN0cmluZyA9IHZvaWQgMDtcblxuICAgIHQucGFyc2VUaW1lU3RyaW5nID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0O1xuXG4gICAgICBpZiAoZSkge1xuICAgICAgICB2YXIgciA9IGUuc3BsaXQoXCI6XCIpLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgICByID0gcGFyc2VJbnQoZSwgMTApO1xuICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocikgfHwgKHQgPSByKSwgdDtcbiAgICAgICAgfSksXG4gICAgICAgICAgICBhID0gclswXSxcbiAgICAgICAgICAgIG4gPSByWzFdO1xuICAgICAgICBudWxsICE9IGEgJiYgbnVsbCAhPSBuICYmICh0ID0gNjAgKiBhICsgbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoZSkge1xuICAgICAgdmFyIHQgPSBlICUgNjAsXG4gICAgICAgICAgciA9IE1hdGguZmxvb3IoZSAvIDYwKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1pbnV0ZTogdCxcbiAgICAgICAgaG91cjI0OiByLFxuICAgICAgICBob3VyMTI6IHIgJSAxMiB8fCAxMixcbiAgICAgICAgYW1wbTogciA8IDEyID8gXCJhbVwiIDogXCJwbVwiXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIG4gPSBmdW5jdGlvbiBuKGUsIHQpIHtcbiAgICAgIHJldHVybiAoXCIwMDAwXCIgKyBlKS5zbGljZSgtdCk7XG4gICAgfTtcblxuICAgIHQuZ2V0VGltZU9wdGlvbnMgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgZm9yICh2YXIgbyA9IFtdLCBpID0gZTsgaSA8PSB0OyBpICs9IHIpIHtcbiAgICAgICAgdmFyIGwgPSBhKGkpLFxuICAgICAgICAgICAgdSA9IGwubWludXRlLFxuICAgICAgICAgICAgYyA9IGwuaG91cjI0LFxuICAgICAgICAgICAgcyA9IGwuaG91cjEyLFxuICAgICAgICAgICAgZCA9IGwuYW1wbTtcbiAgICAgICAgby5wdXNoKHtcbiAgICAgICAgICB2YWx1ZTogbihjLCAyKSArIFwiOlwiICsgbih1LCAyKSxcbiAgICAgICAgICBsYWJlbDogcyArIFwiOlwiICsgbih1LCAyKSArIGRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlRJTUVfUElDS0VSX0NVU1RPTV9GSUxURVIgPSB0Lk1JTl9TVEVQID0gdC5ERUZBVUxUX1NURVAgPSB0LkRFRkFVTFRfTUlOX1RJTUVfTUlOVVRFUyA9IHQuREVGQVVMVF9NSU5fVElNRSA9IHQuREVGQVVMVF9NQVhfVElNRV9NSU5VVEVTID0gdC5ERUZBVUxUX01BWF9USU1FID0gdm9pZCAwO1xuICAgIHQuREVGQVVMVF9NQVhfVElNRSA9IFwiMjM6NTlcIjtcbiAgICB0LkRFRkFVTFRfTUFYX1RJTUVfTUlOVVRFUyA9IDE0Mzk7XG4gICAgdC5ERUZBVUxUX01JTl9USU1FID0gXCIwMDowMFwiO1xuICAgIHQuREVGQVVMVF9NSU5fVElNRV9NSU5VVEVTID0gMDtcbiAgICB0LkRFRkFVTFRfU1RFUCA9IDMwO1xuICAgIHQuTUlOX1NURVAgPSAxO1xuICAgIHQuVElNRV9QSUNLRVJfQ1VTVE9NX0ZJTFRFUiA9IHtcbiAgICAgIGZpbHRlcjogXCIwP3t7IGhvdXJRdWVyeUZpbHRlciB9fTp7e21pbnV0ZVF1ZXJ5RmlsdGVyfX0uKnt7IGFwUXVlcnlGaWx0ZXIgfX1tP1wiLFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIGFwUXVlcnlGaWx0ZXI6IFwiKFthcF0pXCIsXG4gICAgICAgIGhvdXJRdWVyeUZpbHRlcjogXCIoWzEtOV1bMC0yXT8pXCIsXG4gICAgICAgIG1pbnV0ZVF1ZXJ5RmlsdGVyOiBcIltcXFxcZF0rOihbMC05XXswLDJ9KVwiXG4gICAgICB9XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVmFsaWRhdGlvbkNoZWNrbGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIxID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKHIsIFwidXNhLWNoZWNrbGlzdFwiKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIsIF9pMjEoe1xuICAgICAgICBjbGFzc05hbWU6IHUsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJ2YWxpZGF0aW9uQ2hlY2tsaXN0XCJcbiAgICAgIH0sIG8pLCB0KTtcbiAgICB9O1xuXG4gICAgdC5WYWxpZGF0aW9uQ2hlY2tsaXN0ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVmFsaWRhdGlvbkl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyMiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgbyA9IGUuaXNWYWxpZCxcbiAgICAgICAgICB1ID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImlzVmFsaWRcIl0pLFxuICAgICAgICAgIGMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jaGVja2xpc3RfX2l0ZW1cIiwge1xuICAgICAgICBcInVzYS1jaGVja2xpc3RfX2l0ZW0tLWNoZWNrZWRcIjogb1xuICAgICAgfSwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTIyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1KSwgdCk7XG4gICAgfTtcblxuICAgIHQuVmFsaWRhdGlvbkl0ZW0gPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5FeHRlbmRlZE5hdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGwocigwKSksXG4gICAgICAgIG4gPSBsKHIoMSkpLFxuICAgICAgICBvID0gcigxMyksXG4gICAgICAgIGkgPSByKDQpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfdTIgPSBmdW5jdGlvbiB1KCkge1xuICAgICAgcmV0dXJuIChfdTIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHZhciB0ID0gZS5wcmltYXJ5SXRlbXMsXG4gICAgICAgICAgciA9IGUuc2Vjb25kYXJ5SXRlbXMsXG4gICAgICAgICAgbCA9IGUubW9iaWxlRXhwYW5kZWQsXG4gICAgICAgICAgcyA9IHZvaWQgMCAhPT0gbCAmJiBsLFxuICAgICAgICAgIGQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gZS5vblRvZ2dsZU1vYmlsZU5hdixcbiAgICAgICAgICBtID0gYyhlLCBbXCJwcmltYXJ5SXRlbXNcIiwgXCJzZWNvbmRhcnlJdGVtc1wiLCBcIm1vYmlsZUV4cGFuZGVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJvblRvZ2dsZU1vYmlsZU5hdlwiXSksXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLW5hdlwiLCB7XG4gICAgICAgIFwiaXMtdmlzaWJsZVwiOiBzXG4gICAgICB9LCBmKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm5hdlwiLCBfdTIoe1xuICAgICAgICBjbGFzc05hbWU6IHlcbiAgICAgIH0sIG0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtbmF2X19pbm5lclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLk5hdkNsb3NlQnV0dG9uLCB7XG4gICAgICAgIG9uQ2xpY2s6IHBcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLk5hdkxpc3QsIHtcbiAgICAgICAgaXRlbXM6IHQsXG4gICAgICAgIHR5cGU6IFwicHJpbWFyeVwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW5hdl9fc2Vjb25kYXJ5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICBpdGVtczogcixcbiAgICAgICAgdHlwZTogXCJzZWNvbmRhcnlcIlxuICAgICAgfSksIGQpKSk7XG4gICAgfTtcblxuICAgIHQuRXh0ZW5kZWROYXYgPSBzO1xuICAgIHZhciBkID0gcztcbiAgICB0LmRlZmF1bHQgPSBkO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgci5yKHQpLCB0LmRlZmF1bHQgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0OGMzWm5JSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkMmxrZEdnOUlqWTBJaUJvWldsbmFIUTlJalkwSWlCMmFXVjNRbTk0UFNJd0lEQWdOalFnTmpRaVBqeDBhWFJzWlQ1amJHOXpaVHd2ZEdsMGJHVStQSEJoZEdnZ1ptbHNiRDBpSXpVMk5VTTJOU0lnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCa1BTSk5OVGN1TURReUlERXVNVFZzTlM0NE1Ea2dOUzQ0TURoaE5DQTBJREFnTUNBeElEQWdOUzQyTlRkTU5ETXVORFkxSURNeWJERTVMak00TmlBeE9TNHpPRFZoTkNBMElEQWdNQ0F4SURBZ05TNDJOVGRzTFRVdU9EQTVJRFV1T0RBNVlUUWdOQ0F3SURBZ01TMDFMalkxTnlBd1RETXlJRFF6TGpRMk5TQXhNaTQyTVRVZ05qSXVPRFV4WVRRZ05DQXdJREFnTVMwMUxqWTFOeUF3YkMwMUxqZ3dPUzAxTGpnd09XRTBJRFFnTUNBd0lERWdNQzAxTGpZMU4wd3lNQzQxTXpVZ016SWdNUzR4TkRrZ01USXVOakUxWVRRZ05DQXdJREFnTVNBd0xUVXVOalUzYkRVdU9EQTVMVFV1T0RBNVlUUWdOQ0F3SURBZ01TQTFMalkxTnlBd1RETXlJREl3TGpVek5TQTFNUzR6T0RVZ01TNHhORGxoTkNBMElEQWdNQ0F4SURVdU5qVTNJREI2SWk4K1BDOXpkbWMrXCI7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkhlYWRlciA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTIzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHQuSGVhZGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5iYXNpYyxcbiAgICAgICAgICByID0gZS5leHRlbmRlZCxcbiAgICAgICAgICBvID0gZS5iYXNpY1dpdGhNZWdhTWVudSxcbiAgICAgICAgICB1ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBjID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgcyA9IGwoZSwgW1wiYmFzaWNcIiwgXCJleHRlbmRlZFwiLCBcImJhc2ljV2l0aE1lZ2FNZW51XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGQgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1oZWFkZXJcIiwge1xuICAgICAgICBcInVzYS1oZWFkZXItLWJhc2ljXCI6IHQsXG4gICAgICAgIFwidXNhLWhlYWRlci0tbWVnYW1lbnVcIjogbyxcbiAgICAgICAgXCJ1c2EtaGVhZGVyLS1leHRlbmRlZFwiOiByXG4gICAgICB9LCBjKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImhlYWRlclwiLCBfaTIzKHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImhlYWRlclwiLFxuICAgICAgICBjbGFzc05hbWU6IGRcbiAgICAgIH0sIHMpLCB1KTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5NZWdhTWVudSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGkocigwKSksXG4gICAgICAgIG4gPSBpKHIoMSkpLFxuICAgICAgICBvID0gcig0KTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2w5ID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2w5ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUuaXNPcGVuLFxuICAgICAgICAgIGkgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBjID0gdShlLCBbXCJpdGVtc1wiLCBcImlzT3BlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgcyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLW5hdl9fc3VibWVudSB1c2EtbWVnYW1lbnVcIiwgaSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHMsXG4gICAgICAgIGhpZGRlbjogIXIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJtZWdhbWVudVwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLXJvdyBncmlkLWdhcC00XCJcbiAgICAgIH0sIHQubWFwKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1jb2xcIixcbiAgICAgICAgICBrZXk6IFwic3VibmF2X2NvbF9cIiArIHRcbiAgICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoby5OYXZMaXN0LCBfbDkoe1xuICAgICAgICAgIGl0ZW1zOiBlLFxuICAgICAgICAgIHR5cGU6IFwibWVnYW1lbnVcIlxuICAgICAgICB9LCBjKSkpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuXG4gICAgdC5NZWdhTWVudSA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0Lk1lbnUgPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfSxcbiAgICAgICAgbyA9IHIoNCk7XG5cbiAgICB2YXIgX2kyNCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuaXRlbXMsXG4gICAgICAgICAgYSA9IGUuaXNPcGVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNsYXNzTmFtZVwiLCBcIml0ZW1zXCIsIFwiaXNPcGVuXCJdKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLk5hdkxpc3QsIF9pMjQoe1xuICAgICAgICBjbGFzc05hbWU6IHQsXG4gICAgICAgIGl0ZW1zOiByLFxuICAgICAgICB0eXBlOiBcInN1Ym5hdlwiLFxuICAgICAgICBoaWRkZW46ICFhXG4gICAgICB9LCB1KSk7XG4gICAgfTtcblxuICAgIHQuTWVudSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0Lk5hdk1lbnVCdXR0b24gPSB2b2lkIDA7XG4gICAgdmFyIGEsXG4gICAgICAgIG4gPSAoYSA9IHIoMCkpICYmIGEuX19lc01vZHVsZSA/IGEgOiB7XG4gICAgICBkZWZhdWx0OiBhXG4gICAgfTtcblxuICAgIHZhciBfbyA9IGZ1bmN0aW9uIG8oKSB7XG4gICAgICByZXR1cm4gKF9vID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBpID0gZnVuY3Rpb24gaShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5OYXZNZW51QnV0dG9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYWJlbCxcbiAgICAgICAgICByID0gZS5vbkNsaWNrLFxuICAgICAgICAgIGEgPSBpKGUsIFtcImxhYmVsXCIsIFwib25DbGlja1wiXSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX28oe1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLW1lbnUtYnRuXCIsXG4gICAgICAgIG9uQ2xpY2s6IHIsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJuYXZNZW51QnV0dG9uXCJcbiAgICAgIH0sIGEsIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0Lk5hdkRyb3BEb3duQnV0dG9uID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMjUgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTI1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUubGFiZWwsXG4gICAgICAgICAgciA9IGUubWVudUlkLFxuICAgICAgICAgIG8gPSBlLmlzT3BlbixcbiAgICAgICAgICB1ID0gZS5vblRvZ2dsZSxcbiAgICAgICAgICBjID0gZS5pc0N1cnJlbnQsXG4gICAgICAgICAgcyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGQgPSBsKGUsIFtcImxhYmVsXCIsIFwibWVudUlkXCIsIFwiaXNPcGVuXCIsIFwib25Ub2dnbGVcIiwgXCJpc0N1cnJlbnRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGYgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1hY2NvcmRpb25fX2J1dHRvblwiLCBcInVzYS1uYXZfX2xpbmtcIiwge1xuICAgICAgICBcInVzYS1jdXJyZW50XCI6IGNcbiAgICAgIH0sIHMpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9pMjUoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwibmF2RHJvcERvd25CdXR0b25cIixcbiAgICAgICAgY2xhc3NOYW1lOiBmLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogbyxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHIsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgcmV0dXJuIHUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZCwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiXG4gICAgICB9KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIHQpKTtcbiAgICB9O1xuXG4gICAgdC5OYXZEcm9wRG93bkJ1dHRvbiA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LlByaW1hcnlOYXYgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBsKHIoMCkpLFxuICAgICAgICBuID0gbChyKDEpKSxcbiAgICAgICAgbyA9IHIoMTMpLFxuICAgICAgICBpID0gcig0KTtcblxuICAgIGZ1bmN0aW9uIGwoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3UzID0gZnVuY3Rpb24gdSgpIHtcbiAgICAgIHJldHVybiAoX3UzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBjID0gZnVuY3Rpb24gYyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICBzID0gZnVuY3Rpb24gcyhlKSB7XG4gICAgICB2YXIgdCA9IGUuaXRlbXMsXG4gICAgICAgICAgciA9IGUub25Ub2dnbGVNb2JpbGVOYXYsXG4gICAgICAgICAgbCA9IGUubW9iaWxlRXhwYW5kZWQsXG4gICAgICAgICAgcyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgZCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGYgPSBjKGUsIFtcIml0ZW1zXCIsIFwib25Ub2dnbGVNb2JpbGVOYXZcIiwgXCJtb2JpbGVFeHBhbmRlZFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBwID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtbmF2XCIsIHtcbiAgICAgICAgXCJpcy12aXNpYmxlXCI6IGxcbiAgICAgIH0sIGQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibmF2XCIsIF91Myh7XG4gICAgICAgIGNsYXNzTmFtZTogcFxuICAgICAgfSwgZiksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTmF2Q2xvc2VCdXR0b24sIHtcbiAgICAgICAgb25DbGljazogclxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGkuTmF2TGlzdCwge1xuICAgICAgICBpdGVtczogdCxcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCJcbiAgICAgIH0pLCBzKTtcbiAgICB9O1xuXG4gICAgdC5QcmltYXJ5TmF2ID0gcztcbiAgICB2YXIgZCA9IHM7XG4gICAgdC5kZWZhdWx0ID0gZDtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuVGl0bGUgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyNiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1sb2dvXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMjYoe1xuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImVtXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1sb2dvX190ZXh0XCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuXG4gICAgdC5UaXRsZSA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyNyA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjcgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1pZGVudGlmaWVyXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMjcoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaWRlbnRpZmllclwiLFxuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCByKTtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllckdvdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTI4ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kyOCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3NlY3Rpb24gdXNhLWlkZW50aWZpZXJfX3NlY3Rpb24tLXVzYWdvdlwiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2kyOCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVyR292XCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19jb250YWluZXJcIlxuICAgICAgfSwgdCkpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJHb3YgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5JZGVudGlmaWVySWRlbnRpdHkgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kyOSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMjkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jaGlsZHJlbixcbiAgICAgICAgICByID0gZS5kb21haW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiZG9tYWluXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9faWRlbnRpdHlcIiwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2kyOSh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJpZGVudGlmaWVySWRlbnRpdHlcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19pZGVudGl0eS1kb21haW5cIlxuICAgICAgfSwgciksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaWRlbnRpZmllcl9faWRlbnRpdHktZGlzY2xhaW1lclwiXG4gICAgICB9LCB0KSk7XG4gICAgfTtcblxuICAgIHQuSWRlbnRpZmllcklkZW50aXR5ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSWRlbnRpZmllckxpbmsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gdShlLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGkgPSAoMCwgbi5kZWZhdWx0KSh0LCBcInVzYS1pZGVudGlmaWVyX19yZXF1aXJlZC1saW5rXCIpLFxuICAgICAgICAgIGMgPSBfbDEwKF9sMTAoe30sIHIpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSk7XG5cbiAgICAgIGlmICgoMCwgby5pc0N1c3RvbVByb3BzKShjKSkgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMCh7fSwgYykpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMCh7fSwgYykpO1xuICAgIH07XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMTApO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfbDEwID0gZnVuY3Rpb24gbCgpIHtcbiAgICAgIHJldHVybiAoX2wxMCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuSWRlbnRpZmllckxpbmtJdGVtID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTGlua0l0ZW0gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3JlcXVpcmVkLWxpbmtzLWl0ZW1cIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTMwKHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuSWRlbnRpZmllckxpbmtzID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzEgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMxID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLm5hdlByb3BzLFxuICAgICAgICAgIGwgPSBlLmxpc3RQcm9wcyxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fc2VjdGlvbiB1c2EtaWRlbnRpZmllcl9fc2VjdGlvbi0tcmVxdWlyZWQtbGlua3NcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX2kzMSh7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19jb250YWluZXJcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfaTMxKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1pZGVudGlmaWVyX19yZXF1aXJlZC1saW5rcy1saXN0XCJcbiAgICAgIH0sIGwpLCB0KSkpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMaW5rcyA9IGw7XG4gICAgdmFyIHUgPSBsO1xuICAgIHQuZGVmYXVsdCA9IHU7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LklkZW50aWZpZXJMb2dvID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzIgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTMyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTG9nbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBsKGUsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICB1ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtaWRlbnRpZmllcl9fbG9nb1wiLCByKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwgX2kzMih7XG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXJMb2dvcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTMzID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzMyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX2xvZ29zXCIsIHIpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzMoe1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiaWRlbnRpZmllckxvZ29zXCIsXG4gICAgICAgIGNsYXNzTmFtZTogdVxuICAgICAgfSwgbyksIHQpO1xuICAgIH07XG5cbiAgICB0LklkZW50aWZpZXJMb2dvcyA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LklkZW50aWZpZXJNYXN0aGVhZCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM0ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5jaGlsZHJlbixcbiAgICAgICAgICBvID0gbChlLCBbXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWlkZW50aWZpZXJfX3NlY3Rpb24gdXNhLWlkZW50aWZpZXJfX3NlY3Rpb24tLW1hc3RoZWFkXCIsIHQpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiLCBfaTM0KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcImlkZW50aWZpZXJNYXN0aGVhZFwiLFxuICAgICAgICBjbGFzc05hbWU6IHVcbiAgICAgIH0sIG8pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtaWRlbnRpZmllcl9fY29udGFpbmVyXCJcbiAgICAgIH0sIHIpKTtcbiAgICB9O1xuXG4gICAgdC5JZGVudGlmaWVyTWFzdGhlYWQgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5BZGRyZXNzID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHQuQWRkcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuc2l6ZSxcbiAgICAgICAgICByID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgaSA9IGUuYmlnLFxuICAgICAgICAgIGwgPSBlLm1lZGl1bSxcbiAgICAgICAgICB1ID0gZS5zbGltLFxuICAgICAgICAgIGMgPSBlLml0ZW1zO1xuICAgICAgaSAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGwgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBtZWRpdW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCB1ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgc2xpbSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIik7XG4gICAgICB2YXIgcyA9IHQgPyBcImJpZ1wiID09PSB0IDogaSxcbiAgICAgICAgICBkID0gdCA/IFwibWVkaXVtXCIgPT09IHQgOiBsLFxuICAgICAgICAgIGYgPSB0ID8gXCJzbGltXCIgPT09IHQgOiB1LFxuICAgICAgICAgIHAgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJfX2FkZHJlc3NcIiwgciksXG4gICAgICAgICAgbSA9ICgwLCBuLmRlZmF1bHQpKHtcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvXCI6IHMgfHwgZCxcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvIG1vYmlsZS1sZzpncmlkLWNvbC0xMiBkZXNrdG9wOmdyaWQtY29sLWF1dG9cIjogZlxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhZGRyZXNzXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBwXG4gICAgICB9LCBmID8gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1yb3cgZ3JpZC1nYXBcIlxuICAgICAgfSwgYy5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IG0sXG4gICAgICAgICAga2V5OiBcImFkZHJlc3NJdGVtLVwiICsgdFxuICAgICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX2NvbnRhY3QtaW5mb1wiXG4gICAgICAgIH0sIGUpKTtcbiAgICAgIH0pKSA6IGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1mb290ZXJfX2NvbnRhY3QtaW5mbyBncmlkLXJvdyBncmlkLWdhcFwiXG4gICAgICB9LCBjLm1hcChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogbSxcbiAgICAgICAgICBrZXk6IFwiYWRkcmVzc0l0ZW0tXCIgKyB0XG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Gb290ZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMTEgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDExID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Gb290ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnNpemUsXG4gICAgICAgICAgciA9IGUuYmlnLFxuICAgICAgICAgIGkgPSBlLm1lZGl1bSxcbiAgICAgICAgICBjID0gZS5zbGltLFxuICAgICAgICAgIHMgPSBlLnJldHVyblRvVG9wLFxuICAgICAgICAgIGQgPSBlLnByaW1hcnksXG4gICAgICAgICAgZiA9IGUuc2Vjb25kYXJ5LFxuICAgICAgICAgIHAgPSB1KGUsIFtcInNpemVcIiwgXCJiaWdcIiwgXCJtZWRpdW1cIiwgXCJzbGltXCIsIFwicmV0dXJuVG9Ub3BcIiwgXCJwcmltYXJ5XCIsIFwic2Vjb25kYXJ5XCJdKTtcbiAgICAgIHIgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3RlciBwcm9wZXJ0eSBiaWcgaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCBpICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXIgcHJvcGVydHkgbWVkaXVtIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgYyAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyIHByb3BlcnR5IHNsaW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpO1xuICAgICAgdmFyIG0gPSB0ID8gXCJiaWdcIiA9PT0gdCA6IHIsXG4gICAgICAgICAgeSA9IHQgPyBcIm1lZGl1bVwiID09PSB0IDogaSxcbiAgICAgICAgICBiID0gdCA/IFwic2xpbVwiID09PSB0IDogYyxcbiAgICAgICAgICB2ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyXCIsIHtcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1iaWdcIjogbSxcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1tZWRpdW1cIjogeSxcbiAgICAgICAgXCJ1c2EtZm9vdGVyLS1zbGltXCI6IGJcbiAgICAgIH0sIHAuY2xhc3NOYW1lKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImZvb3RlclwiLCBfbDExKHt9LCBwLCB7XG4gICAgICAgIGNsYXNzTmFtZTogdlxuICAgICAgfSksIHMgJiYgcywgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWZvb3Rlcl9fcHJpbWFyeS1zZWN0aW9uXCJcbiAgICAgIH0sIGQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtZm9vdGVyX19zZWNvbmRhcnktc2VjdGlvblwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJncmlkLWNvbnRhaW5lclwiXG4gICAgICB9LCBmKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkZvb3Rlck5hdiA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IGwocigwKSksXG4gICAgICAgIG4gPSByKDE4KSxcbiAgICAgICAgbyA9IGwocigxKSksXG4gICAgICAgIGkgPSByKDIpO1xuXG4gICAgZnVuY3Rpb24gbChlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfdTQgPSBmdW5jdGlvbiB1KCkge1xuICAgICAgcmV0dXJuIChfdTQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgIHJldHVybiBlWzBdLmNvbnN0cnVjdG9yID09PSBBcnJheTtcbiAgICB9XG5cbiAgICB0LkZvb3Rlck5hdiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHIgPSBlLnNpemUsXG4gICAgICAgICAgbCA9IGUuYmlnLFxuICAgICAgICAgIGQgPSBlLm1lZGl1bSxcbiAgICAgICAgICBmID0gZS5zbGltLFxuICAgICAgICAgIHAgPSBlLmlzTW9iaWxlLFxuICAgICAgICAgIG0gPSBlLmxpbmtzLFxuICAgICAgICAgIHkgPSBjKGUsIFtcImNsYXNzTmFtZVwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJtZWRpdW1cIiwgXCJzbGltXCIsIFwiaXNNb2JpbGVcIiwgXCJsaW5rc1wiXSk7XG4gICAgICBsICYmICgwLCBpLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgZCAmJiAoMCwgaS5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IG1lZGl1bSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGYgJiYgKDAsIGkuZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBzbGltIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcblxuICAgICAgdmFyIGIgPSByID8gXCJiaWdcIiA9PT0gciA6IGwsXG4gICAgICAgICAgdiA9IHIgPyBcIm1lZGl1bVwiID09PSByIDogZCxcbiAgICAgICAgICBPID0gciA/IFwic2xpbVwiID09PSByIDogZixcbiAgICAgICAgICBnID0gKDAsIG8uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19uYXZcIiwgdCksXG4gICAgICAgICAgXyA9ICgwLCBvLmRlZmF1bHQpKFwiZGVza3RvcDpncmlkLWNvbC1hdXRvIHVzYS1mb290ZXJfX3ByaW1hcnktY29udGVudFwiLCB7XG4gICAgICAgIFwibW9iaWxlLWxnOmdyaWQtY29sLTRcIjogYiB8fCB2LFxuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC02XCI6IE9cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJuYXZcIiwgX3U0KHtcbiAgICAgICAgY2xhc3NOYW1lOiBnXG4gICAgICB9LCB5KSwgYiAmJiBzKG0pICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4uRm9vdGVyRXh0ZW5kZWROYXZMaXN0LCB7XG4gICAgICAgIGlzTW9iaWxlOiBwLFxuICAgICAgICBuZXN0ZWRMaW5rczogbVxuICAgICAgfSksICFzKG0pICYmIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1yb3cgZ3JpZC1nYXBcIlxuICAgICAgfSwgbS5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgIGtleTogXCJuYXZMaW5rLVwiICsgdCxcbiAgICAgICAgICBjbGFzc05hbWU6IF9cbiAgICAgICAgfSwgZSk7XG4gICAgICB9KSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkxvZ28gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBpKHIoMCkpLFxuICAgICAgICBuID0gaShyKDEpKSxcbiAgICAgICAgbyA9IHIoMik7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkxvZ28gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnNpemUsXG4gICAgICAgICAgciA9IGUuYmlnLFxuICAgICAgICAgIGkgPSBlLm1lZGl1bSxcbiAgICAgICAgICB1ID0gZS5zbGltLFxuICAgICAgICAgIGMgPSBlLmhlYWRpbmcsXG4gICAgICAgICAgcyA9IGUuaW1hZ2UsXG4gICAgICAgICAgZCA9IGwoZSwgW1wic2l6ZVwiLCBcImJpZ1wiLCBcIm1lZGl1bVwiLCBcInNsaW1cIiwgXCJoZWFkaW5nXCIsIFwiaW1hZ2VcIl0pO1xuICAgICAgciAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiRm9vdGVyTmF2IHByb3BlcnR5IGJpZyBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIiksIGkgJiYgKDAsIG8uZGVwcmVjYXRpb25XYXJuaW5nKShcIkZvb3Rlck5hdiBwcm9wZXJ0eSBtZWRpdW0gaXMgZGVwcmVjYXRlZC4gIFVzZSBzaXplXCIpLCB1ICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJGb290ZXJOYXYgcHJvcGVydHkgc2xpbSBpcyBkZXByZWNhdGVkLiAgVXNlIHNpemVcIik7XG4gICAgICB2YXIgZiA9IHQgPyBcImJpZ1wiID09PSB0IDogcixcbiAgICAgICAgICBwID0gdCA/IFwibWVkaXVtXCIgPT09IHQgOiBpLFxuICAgICAgICAgIG0gPSB0ID8gXCJzbGltXCIgPT09IHQgOiB1LFxuICAgICAgICAgIHkgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1mb290ZXJfX2xvZ28gZ3JpZC1yb3dcIiwge1xuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC02IG1vYmlsZS1sZzpncmlkLWdhcC0yXCI6IGYgfHwgcCxcbiAgICAgICAgXCJncmlkLWdhcC0yXCI6IG1cbiAgICAgIH0sIGQuY2xhc3NOYW1lKSxcbiAgICAgICAgICBiID0gKDAsIG4uZGVmYXVsdCkoe1xuICAgICAgICBcIm1vYmlsZS1sZzpncmlkLWNvbC1hdXRvXCI6IGYgfHwgcCxcbiAgICAgICAgXCJncmlkLWNvbC1hdXRvXCI6IG1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB5LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiZm9vdGVyTG9nb1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBiXG4gICAgICB9LCBzKSwgYyAmJiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYlxuICAgICAgfSwgYykpKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5Tb2NpYWxMaW5rcyA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHQuU29jaWFsTGlua3MgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gZS5saW5rcyxcbiAgICAgICAgICBvID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtZm9vdGVyX19zb2NpYWwtbGlua3MgZ3JpZC1yb3cgZ3JpZC1nYXAtMVwiLCB0KTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogb1xuICAgICAgfSwgci5tYXAoZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBrZXk6IFwic29jaWFsTGlua1wiICsgdCxcbiAgICAgICAgICBjbGFzc05hbWU6IFwiZ3JpZC1jb2wtYXV0b1wiXG4gICAgICAgIH0sIGUpO1xuICAgICAgfSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRHcm91cCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM1ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBvID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgdSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmQtZ3JvdXBcIiwgcik7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfaTM1KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1LFxuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZEdyb3VwXCJcbiAgICAgIH0sIG8pLCB0KTtcbiAgICB9O1xuXG4gICAgdC5DYXJkR3JvdXAgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DYXJkID0gdm9pZCAwO1xuICAgIHZhciBhID0gaShyKDApKSxcbiAgICAgICAgbiA9IGkocigxKSksXG4gICAgICAgIG8gPSByKDE1KTtcblxuICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2wxMiA9IGZ1bmN0aW9uIGwoKSB7XG4gICAgICByZXR1cm4gKF9sMTIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIGMgPSBmdW5jdGlvbiBjKGUpIHtcbiAgICAgIHZhciB0ID0gZS5sYXlvdXQsXG4gICAgICAgICAgciA9IHZvaWQgMCA9PT0gdCA/IFwic3RhbmRhcmREZWZhdWx0XCIgOiB0LFxuICAgICAgICAgIGkgPSBlLmhlYWRlckZpcnN0LFxuICAgICAgICAgIGMgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHMgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBkID0gZS5ncmlkTGF5b3V0LFxuICAgICAgICAgIGYgPSBlLmNvbnRhaW5lclByb3BzLFxuICAgICAgICAgIHAgPSB1KGUsIFtcImxheW91dFwiLCBcImhlYWRlckZpcnN0XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJncmlkTGF5b3V0XCIsIFwiY29udGFpbmVyUHJvcHNcIl0pLFxuICAgICAgICAgIG0gPSBmIHx8IHt9LFxuICAgICAgICAgIHkgPSBtLmNsYXNzTmFtZSxcbiAgICAgICAgICBiID0gdShtLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHYgPSBkICYmICgwLCBvLmFwcGx5R3JpZENsYXNzZXMpKGQpLFxuICAgICAgICAgIE8gPSAoMCwgbi5kZWZhdWx0KShcInVzYS1jYXJkXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZC0taGVhZGVyLWZpcnN0XCI6IGksXG4gICAgICAgIFwidXNhLWNhcmQtLWZsYWdcIjogXCJmbGFnRGVmYXVsdFwiID09PSByIHx8IFwiZmxhZ01lZGlhUmlnaHRcIiA9PT0gcixcbiAgICAgICAgXCJ1c2EtY2FyZC0tbWVkaWEtcmlnaHRcIjogXCJmbGFnTWVkaWFSaWdodFwiID09PSByXG4gICAgICB9LCB2LCBzKSxcbiAgICAgICAgICBnID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fY29udGFpbmVyXCIsIHkpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2wxMih7XG4gICAgICAgIGNsYXNzTmFtZTogTyxcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRcIlxuICAgICAgfSwgcCksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9sMTIoe1xuICAgICAgICBjbGFzc05hbWU6IGdcbiAgICAgIH0sIGIpLCBjKSk7XG4gICAgfTtcblxuICAgIHQuQ2FyZCA9IGM7XG4gICAgdmFyIHMgPSBjO1xuICAgIHQuZGVmYXVsdCA9IHM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRIZWFkZXIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzNiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5leGRlbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImV4ZGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9faGVhZGVyXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9faGVhZGVyLS1leGRlbnRcIjogdFxuICAgICAgfSwgbyk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoZWFkZXJcIiwgX2kzNih7XG4gICAgICAgIGNsYXNzTmFtZTogY1xuICAgICAgfSwgdSwge1xuICAgICAgICBcImRhdGEtdGVzdGlkXCI6IFwiQ2FyZEhlYWRlclwiXG4gICAgICB9KSwgcik7XG4gICAgfTtcblxuICAgIHQuQ2FyZEhlYWRlciA9IHU7XG4gICAgdmFyIGMgPSB1O1xuICAgIHQuZGVmYXVsdCA9IGM7XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LmRlZmF1bHQgPSB0LkNhcmRNZWRpYSA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTM3ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2kzNyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmV4ZGVudCxcbiAgICAgICAgICByID0gZS5pbnNldCxcbiAgICAgICAgICBvID0gZS5pbWFnZUNsYXNzLFxuICAgICAgICAgIHUgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGMgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBzID0gbChlLCBbXCJleGRlbnRcIiwgXCJpbnNldFwiLCBcImltYWdlQ2xhc3NcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgZCA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX21lZGlhXCIsIHtcbiAgICAgICAgXCJ1c2EtY2FyZF9fbWVkaWEtLWV4ZGVudFwiOiB0LFxuICAgICAgICBcInVzYS1jYXJkX19tZWRpYS0taW5zZXRcIjogclxuICAgICAgfSwgYyksXG4gICAgICAgICAgZiA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX2ltZ1wiLCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTM3KHtcbiAgICAgICAgY2xhc3NOYW1lOiBkXG4gICAgICB9LCBzLCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkTWVkaWFcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBmXG4gICAgICB9LCB1KSk7XG4gICAgfTtcblxuICAgIHQuQ2FyZE1lZGlhID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuQ2FyZEJvZHkgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2kzOCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pMzggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5leGRlbnQsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImV4ZGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBjID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtY2FyZF9fYm9keVwiLCB7XG4gICAgICAgIFwidXNhLWNhcmRfX2JvZHktLWV4ZGVudFwiOiB0XG4gICAgICB9LCBvKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfaTM4KHtcbiAgICAgICAgY2xhc3NOYW1lOiBjXG4gICAgICB9LCB1LCB7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJDYXJkQm9keVwiXG4gICAgICB9KSwgcik7XG4gICAgfTtcblxuICAgIHQuQ2FyZEJvZHkgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5DYXJkRm9vdGVyID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pMzkgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTM5ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlKSB7XG4gICAgICB2YXIgdCA9IGUuZXhkZW50LFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICB1ID0gbChlLCBbXCJleGRlbnRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLWNhcmRfX2Zvb3RlclwiLCB7XG4gICAgICAgIFwidXNhLWNhcmRfX2Zvb3Rlci0tZXhkZW50XCI6IHRcbiAgICAgIH0sIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pMzkoe1xuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUsIHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcIkNhcmRGb290ZXJcIlxuICAgICAgfSksIHIpO1xuICAgIH07XG5cbiAgICB0LkNhcmRGb290ZXIgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5CcmVhZGNydW1iQmFyID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDAgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdC5CcmVhZGNydW1iQmFyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gZS52YXJpYW50LFxuICAgICAgICAgIHIgPSB2b2lkIDAgPT09IHQgPyBcImRlZmF1bHRcIiA6IHQsXG4gICAgICAgICAgbyA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbCA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBlLm5hdlByb3BzLFxuICAgICAgICAgIGMgPSBlLmxpc3RQcm9wcyxcbiAgICAgICAgICBzID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2EtYnJlYWRjcnVtYlwiLCB7XG4gICAgICAgIFwidXNhLWJyZWFkY3J1bWItLXdyYXBcIjogXCJ3cmFwXCIgPT09IHJcbiAgICAgIH0sIGwpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibmF2XCIsIF9pNDAoe1xuICAgICAgICBjbGFzc05hbWU6IHNcbiAgICAgIH0sIHUsIHtcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQnJlYWRjcnVtYnNcIlxuICAgICAgfSksIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib2xcIiwgX2k0MCh7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYnJlYWRjcnVtYl9fbGlzdFwiXG4gICAgICB9LCBjKSwgbykpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LkJyZWFkY3J1bWIgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0MSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDEgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICB0LkJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHIgPSBlLmN1cnJlbnQsXG4gICAgICAgICAgbyA9IHZvaWQgMCAhPT0gciAmJiByLFxuICAgICAgICAgIHUgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBjID0gbChlLCBbXCJjaGlsZHJlblwiLCBcImN1cnJlbnRcIiwgXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIHMgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1icmVhZGNydW1iX19saXN0LWl0ZW1cIiwge1xuICAgICAgICBcInVzYS1jdXJyZW50XCI6IG9cbiAgICAgIH0sIHUpO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgX2k0MSh7XG4gICAgICAgIGNsYXNzTmFtZTogcyxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogbyA/IFwicGFnZVwiIDogdm9pZCAwXG4gICAgICB9LCBjKSwgdCk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuQnJlYWRjcnVtYkxpbmsgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICByID0gdShlLCBbXCJjbGFzc05hbWVcIl0pLFxuICAgICAgICAgIGkgPSAoMCwgYS5kZWZhdWx0KSh0LCBcInVzYS1icmVhZGNydW1iX19saW5rXCIpLFxuICAgICAgICAgIGMgPSBfbDEzKF9sMTMoe30sIHIpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaVxuICAgICAgfSk7XG5cbiAgICAgIGlmICgoMCwgby5pc0N1c3RvbVByb3BzKShjKSkgcmV0dXJuIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8uTGluaywgX2wxMyh7fSwgYywge1xuICAgICAgICB2YXJpYW50OiBcInVuc3R5bGVkXCJcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBuLmRlZmF1bHQuY3JlYXRlRWxlbWVudChvLkxpbmssIF9sMTMoe30sIGMsIHtcbiAgICAgICAgdmFyaWFudDogXCJ1bnN0eWxlZFwiXG4gICAgICB9KSk7XG4gICAgfTtcbiAgICB2YXIgYSA9IGkocigxKSksXG4gICAgICAgIG4gPSBpKHIoMCkpLFxuICAgICAgICBvID0gcigxMCk7XG5cbiAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9sMTMgPSBmdW5jdGlvbiBsKCkge1xuICAgICAgcmV0dXJuIChfbDEzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICB1ID0gZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5TdGVwSW5kaWNhdG9yID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDIgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdC5TdGVwSW5kaWNhdG9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0LFxuICAgICAgICAgIHIgPSBlLnNob3dMYWJlbHMsXG4gICAgICAgICAgbyA9IHZvaWQgMCA9PT0gciB8fCByLFxuICAgICAgICAgIGwgPSBlLmNvdW50ZXJzLFxuICAgICAgICAgIHUgPSB2b2lkIDAgPT09IGwgPyBcIm5vbmVcIiA6IGwsXG4gICAgICAgICAgYyA9IGUuY2VudGVyZWQsXG4gICAgICAgICAgcyA9IHZvaWQgMCAhPT0gYyAmJiBjLFxuICAgICAgICAgIGQgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gZS5kaXZQcm9wcyxcbiAgICAgICAgICBtID0gZS5saXN0UHJvcHMsXG4gICAgICAgICAgeSA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXN0ZXAtaW5kaWNhdG9yXCIsIHtcbiAgICAgICAgXCJ1c2Etc3RlcC1pbmRpY2F0b3ItLW5vLWxhYmVsc1wiOiAhbyxcbiAgICAgICAgXCJ1c2Etc3RlcC1pbmRpY2F0b3ItLWNvdW50ZXJzXCI6IFwiZGVmYXVsdFwiID09PSB1LFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tY291bnRlcnMtc21cIjogXCJzbWFsbFwiID09PSB1LFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvci0tY2VudGVyXCI6IHNcbiAgICAgIH0sIGYpLFxuICAgICAgICAgIGIgPSAtMSA9PT0gKHQgPSBkLmZpbmRJbmRleChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gXCJjdXJyZW50XCIgPT09IGUucHJvcHMuc3RhdHVzO1xuICAgICAgfSkpID8gMCA6IHQsXG4gICAgICAgICAgdiA9IGIgKyAxLFxuICAgICAgICAgIE8gPSBkW3BhcnNlSW50KFwiXCIgKyBiKV0ucHJvcHMubGFiZWwsXG4gICAgICAgICAgZyA9IGQubGVuZ3RoO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pNDIoe1xuICAgICAgICBjbGFzc05hbWU6IHksXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzdGVwLWluZGljYXRvclwiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJwcm9ncmVzc1wiXG4gICAgICB9LCBwKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvbFwiLCBfaTQyKHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudHNcIlxuICAgICAgfSwgbSksIGQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX2hlYWRlclwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9faGVhZGluZ1wiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN0ZXAtaW5kaWNhdG9yX19oZWFkaW5nLWNvdW50ZXJcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zci1vbmx5XCJcbiAgICAgIH0sIFwiU3RlcFwiKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fY3VycmVudC1zdGVwXCJcbiAgICAgIH0sIHYpLCBcIsKgXCIsIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX3RvdGFsLXN0ZXBzXCJcbiAgICAgIH0sIFwib2YgXCIgKyBnKSwgXCLCoFwiKSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9faGVhZGluZy10ZXh0XCJcbiAgICAgIH0sIE8pKSkpO1xuICAgIH07XG4gIH0sIGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiAhMFxuICAgIH0pLCB0LlN0ZXBJbmRpY2F0b3JTdGVwID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDEpKSxcbiAgICAgICAgbiA9IG8ocigwKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDMgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5TdGVwSW5kaWNhdG9yU3RlcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IGUubGFiZWwsXG4gICAgICAgICAgciA9IGUuc3RhdHVzLFxuICAgICAgICAgIG8gPSB2b2lkIDAgPT09IHIgPyBcImluY29tcGxldGVcIiA6IHIsXG4gICAgICAgICAgdSA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIGMgPSBsKGUsIFtcImxhYmVsXCIsIFwic3RhdHVzXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBzID0gKDAsIGEuZGVmYXVsdCkoXCJ1c2Etc3RlcC1pbmRpY2F0b3JfX3NlZ21lbnRcIiwge1xuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC0tY29tcGxldGVcIjogXCJjb21wbGV0ZVwiID09PSBvLFxuICAgICAgICBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC0tY3VycmVudFwiOiBcImN1cnJlbnRcIiA9PT0gb1xuICAgICAgfSwgdSk7XG4gICAgICByZXR1cm4gbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTQzKHtcbiAgICAgICAgY2xhc3NOYW1lOiBzLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBcImN1cnJlbnRcIiA9PT0gbyA/IFwidHJ1ZVwiIDogdm9pZCAwXG4gICAgICB9LCBjKSwgbi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInVzYS1zdGVwLWluZGljYXRvcl9fc2VnbWVudC1sYWJlbFwiXG4gICAgICB9LCB0LCBcIsKgXCIsIFwiY3VycmVudFwiICE9PSBvICYmIG4uZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3Itb25seVwiXG4gICAgICB9LCBcImNvbXBsZXRlXCIgPT09IG8gPyBcImNvbXBsZXRlZFwiIDogXCJub3QgY29tcGxldGVkXCIpKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuU2VhcmNoID0gdm9pZCAwO1xuICAgIHZhciBhID0gcyhyKDApKSxcbiAgICAgICAgbiA9IHMocigxKSksXG4gICAgICAgIG8gPSByKDIpLFxuICAgICAgICBpID0gcigxNCksXG4gICAgICAgIGwgPSByKDE3KSxcbiAgICAgICAgdSA9IHIoNSksXG4gICAgICAgIGMgPSByKDcpO1xuXG4gICAgZnVuY3Rpb24gcyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfZDIgPSBmdW5jdGlvbiBkKCkge1xuICAgICAgcmV0dXJuIChfZDIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHAgPSBmdW5jdGlvbiBwKGUpIHtcbiAgICAgIHZhciB0ID0gZS5vblN1Ym1pdCxcbiAgICAgICAgICByID0gZS5zaXplLFxuICAgICAgICAgIHMgPSBlLmJpZyxcbiAgICAgICAgICBwID0gZS5zbWFsbCxcbiAgICAgICAgICBtID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgeSA9IGUucGxhY2Vob2xkZXIsXG4gICAgICAgICAgYiA9IGUuaW5wdXROYW1lLFxuICAgICAgICAgIHYgPSB2b2lkIDAgPT09IGIgPyBcInNlYXJjaFwiIDogYixcbiAgICAgICAgICBPID0gZS5sYWJlbCxcbiAgICAgICAgICBnID0gdm9pZCAwID09PSBPID8gXCJTZWFyY2hcIiA6IE8sXG4gICAgICAgICAgXyA9IGUuaW5wdXRJZCxcbiAgICAgICAgICBoID0gdm9pZCAwID09PSBfID8gXCJzZWFyY2gtZmllbGRcIiA6IF8sXG4gICAgICAgICAgaiA9IGUuaTE4bixcbiAgICAgICAgICBNID0gZihlLCBbXCJvblN1Ym1pdFwiLCBcInNpemVcIiwgXCJiaWdcIiwgXCJzbWFsbFwiLCBcImNsYXNzTmFtZVwiLCBcInBsYWNlaG9sZGVyXCIsIFwiaW5wdXROYW1lXCIsIFwibGFiZWxcIiwgXCJpbnB1dElkXCIsIFwiaTE4blwiXSk7XG4gICAgICBzICYmICgwLCBvLmRlcHJlY2F0aW9uV2FybmluZykoXCJTZWFyY2ggcHJvcGVydHkgYmlnIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKSwgcCAmJiAoMCwgby5kZXByZWNhdGlvbldhcm5pbmcpKFwiU2VhcmNoIHByb3BlcnR5IHNtYWxsIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc2l6ZVwiKTtcbiAgICAgIHZhciBOID0gKG51bGwgPT0gaiA/IHZvaWQgMCA6IGouYnV0dG9uVGV4dCkgfHwgXCJTZWFyY2hcIixcbiAgICAgICAgICBFID0gciA/IFwiYmlnXCIgPT09IHIgOiBzLFxuICAgICAgICAgIFAgPSByID8gXCJzbWFsbFwiID09PSByIDogcCxcbiAgICAgICAgICB3ID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2VhcmNoXCIsIHtcbiAgICAgICAgXCJ1c2Etc2VhcmNoLS1zbWFsbFwiOiBQLFxuICAgICAgICBcInVzYS1zZWFyY2gtLWJpZ1wiOiBFXG4gICAgICB9LCBtKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLkZvcm0sIF9kMih7XG4gICAgICAgIG9uU3VibWl0OiB0LFxuICAgICAgICBjbGFzc05hbWU6IHcsXG4gICAgICAgIHJvbGU6IFwic2VhcmNoXCIsXG4gICAgICAgIHNlYXJjaDogITBcbiAgICAgIH0sIE0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LkxhYmVsLCB7XG4gICAgICAgIHNyT25seTogITAsXG4gICAgICAgIGh0bWxGb3I6IGhcbiAgICAgIH0sIGcpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLlRleHRJbnB1dCwge1xuICAgICAgICBpZDogaCxcbiAgICAgICAgdHlwZTogXCJzZWFyY2hcIixcbiAgICAgICAgbmFtZTogdixcbiAgICAgICAgcGxhY2Vob2xkZXI6IHlcbiAgICAgIH0pLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChpLkJ1dHRvbiwge1xuICAgICAgICB0eXBlOiBcInN1Ym1pdFwiXG4gICAgICB9LCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFAgPyBcInVzYS1zci1vbmx5XCIgOiBcInVzYS1zZWFyY2hfX3N1Ym1pdC10ZXh0XCJcbiAgICAgIH0sIE4pKSk7XG4gICAgfTtcblxuICAgIHQuU2VhcmNoID0gcDtcbiAgICB2YXIgbSA9IHA7XG4gICAgdC5kZWZhdWx0ID0gbTtcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuU3VtbWFyeUJveCA9IHZvaWQgMDtcbiAgICB2YXIgYSA9IG8ocigwKSksXG4gICAgICAgIG4gPSBvKHIoMSkpO1xuXG4gICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgICAgICBkZWZhdWx0OiBlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfaTQ0ID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgIHJldHVybiAoX2k0NCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCwgciA9IDEsIGEgPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgYTsgcisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0ID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgKGVbbl0gPSB0W25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAgICAgbCA9IGZ1bmN0aW9uIGwoZSwgdCkge1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBhKSAmJiB0LmluZGV4T2YoYSkgPCAwICYmIChyW2FdID0gZVthXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9IGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBuID0gMDtcblxuICAgICAgICBmb3IgKGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyBuIDwgYS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQuaW5kZXhPZihhW25dKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIGFbbl0pICYmIChyW2Fbbl1dID0gZVthW25dXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICAgICAgdSA9IGZ1bmN0aW9uIHUoZSkge1xuICAgICAgdmFyIHQgPSBlLmhlYWRpbmcsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIHUgPSBsKGUsIFtcImhlYWRpbmdcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXN1bW1hcnktYm94XCIsIG8pO1xuICAgICAgcmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9pNDQoe1xuICAgICAgICBjbGFzc05hbWU6IGMsXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzdW1tYXJ5LWJveFwiXG4gICAgICB9LCB1KSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN1bW1hcnktYm94X19ib2R5XCJcbiAgICAgIH0sIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLXN1bW1hcnktYm94X19oZWFkaW5nXCJcbiAgICAgIH0sIHQpLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2Etc3VtbWFyeS1ib3hfX3RleHRcIlxuICAgICAgfSwgcikpKTtcbiAgICB9O1xuXG4gICAgdC5TdW1tYXJ5Qm94ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuZGVmYXVsdCA9IHQuUHJvY2Vzc0xpc3QgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0NSA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDUgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1wcm9jZXNzLWxpc3RcIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvbFwiLCBfaTQ1KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcblxuICAgIHQuUHJvY2Vzc0xpc3QgPSB1O1xuICAgIHZhciBjID0gdTtcbiAgICB0LmRlZmF1bHQgPSBjO1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5Qcm9jZXNzTGlzdEl0ZW0gPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0NiA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS5jbGFzc05hbWUsXG4gICAgICAgICAgciA9IGUuY2hpbGRyZW4sXG4gICAgICAgICAgbyA9IGwoZSwgW1wiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIl0pLFxuICAgICAgICAgIHUgPSAoMCwgbi5kZWZhdWx0KShcInVzYS1wcm9jZXNzLWxpc3RfX2l0ZW1cIiwgdCk7XG4gICAgICByZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBfaTQ2KHtcbiAgICAgICAgY2xhc3NOYW1lOiB1XG4gICAgICB9LCBvKSwgcik7XG4gICAgfTtcblxuICAgIHQuUHJvY2Vzc0xpc3RJdGVtID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfSwgZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSksIHQuUHJvY2Vzc0xpc3RIZWFkaW5nID0gdm9pZCAwO1xuICAgIHZhciBhID0gbyhyKDApKSxcbiAgICAgICAgbiA9IG8ocigxKSk7XG5cbiAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgICAgIGRlZmF1bHQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9pNDcgPSBmdW5jdGlvbiBpKCkge1xuICAgICAgcmV0dXJuIChfaTQ3ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciB0LCByID0gMSwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBhOyByKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHQgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgICAgICBsID0gZnVuY3Rpb24gbChlLCB0KSB7XG4gICAgICB2YXIgciA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBhIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpICYmIHQuaW5kZXhPZihhKSA8IDAgJiYgKHJbYV0gPSBlW2FdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bGwgIT0gZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuXG4gICAgICAgIGZvciAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdC5pbmRleE9mKGFbbl0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgYVtuXSkgJiYgKHJbYVtuXV0gPSBlW2Fbbl1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgdC5Qcm9jZXNzTGlzdEhlYWRpbmcgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSBlLnR5cGUsXG4gICAgICAgICAgciA9IGUuY2xhc3NOYW1lLFxuICAgICAgICAgIG8gPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIHUgPSBsKGUsIFtcInR5cGVcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSksXG4gICAgICAgICAgYyA9ICgwLCBuLmRlZmF1bHQpKFwidXNhLXByb2Nlc3MtbGlzdF9faGVhZGluZ1wiLCByKSxcbiAgICAgICAgICBzID0gdDtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChzLCBfaTQ3KHtcbiAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBcInByb2Nlc3NMaXN0SGVhZGluZ1wiLFxuICAgICAgICBjbGFzc05hbWU6IGNcbiAgICAgIH0sIHUpLCBvKTtcbiAgICB9O1xuICB9LCBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogITBcbiAgICB9KSwgdC5kZWZhdWx0ID0gdC5TaXRlQWxlcnQgPSB2b2lkIDA7XG4gICAgdmFyIGEgPSBvKHIoMCkpLFxuICAgICAgICBuID0gbyhyKDEpKTtcblxuICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICAgICAgZGVmYXVsdDogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2k0OCA9IGZ1bmN0aW9uIGkoKSB7XG4gICAgICByZXR1cm4gKF9pNDggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvciAodmFyIHQsIHIgPSAxLCBhID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IGE7IHIrKykge1xuICAgICAgICAgIGZvciAodmFyIG4gaW4gdCA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIChlW25dID0gdFtuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKGUsIHQpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIGEgaW4gZSkge1xuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgYSkgJiYgdC5pbmRleE9mKGEpIDwgMCAmJiAoclthXSA9IGVbYV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVsbCAhPSBlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgbiA9IDA7XG5cbiAgICAgICAgZm9yIChhID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgbiA8IGEubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICB0LmluZGV4T2YoYVtuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCBhW25dKSAmJiAoclthW25dXSA9IGVbYVtuXV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgICAgIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIHZhciB0ID0gZS52YXJpYW50LFxuICAgICAgICAgIHIgPSBlLmNoaWxkcmVuLFxuICAgICAgICAgIG8gPSBlLmhlYWRpbmcsXG4gICAgICAgICAgdSA9IGUuc2hvd0ljb24sXG4gICAgICAgICAgYyA9IHZvaWQgMCA9PT0gdSB8fCB1LFxuICAgICAgICAgIHMgPSBlLnNsaW0sXG4gICAgICAgICAgZCA9IHZvaWQgMCAhPT0gcyAmJiBzLFxuICAgICAgICAgIGYgPSBlLmNsYXNzTmFtZSxcbiAgICAgICAgICBwID0gbChlLCBbXCJ2YXJpYW50XCIsIFwiY2hpbGRyZW5cIiwgXCJoZWFkaW5nXCIsIFwic2hvd0ljb25cIiwgXCJzbGltXCIsIFwiY2xhc3NOYW1lXCJdKSxcbiAgICAgICAgICBtID0gKDAsIG4uZGVmYXVsdCkoXCJ1c2Etc2l0ZS1hbGVydFwiLCB7XG4gICAgICAgIFwidXNhLXNpdGUtYWxlcnQtLWluZm9cIjogXCJpbmZvXCIgPT09IHQsXG4gICAgICAgIFwidXNhLXNpdGUtYWxlcnQtLWVtZXJnZW5jeVwiOiBcImVtZXJnZW5jeVwiID09PSB0LFxuICAgICAgICBcInVzYS1zaXRlLWFsZXJ0LS1uby1oZWFkaW5nXCI6IHZvaWQgMCA9PT0gbyAmJiAhZCxcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0tbm8taWNvblwiOiAhYyxcbiAgICAgICAgXCJ1c2Etc2l0ZS1hbGVydC0tc2xpbVwiOiBkXG4gICAgICB9LCBmKTtcbiAgICAgIHJldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwgX2k0OCh7XG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogXCJzaXRlQWxlcnRcIixcbiAgICAgICAgY2xhc3NOYW1lOiBtLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJTaXRlIGFsZXJ0XCJcbiAgICAgIH0sIHApLCBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRcIlxuICAgICAgfSwgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidXNhLWFsZXJ0X19ib2R5XCJcbiAgICAgIH0sIG8gJiYgYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ1c2EtYWxlcnRfX2hlYWRpbmdcIlxuICAgICAgfSwgbyksIHIpKSk7XG4gICAgfTtcblxuICAgIHQuU2l0ZUFsZXJ0ID0gdTtcbiAgICB2YXIgYyA9IHU7XG4gICAgdC5kZWZhdWx0ID0gYztcbiAgfV0pO1xufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2593\n')}}]); \ No newline at end of file diff --git a/803-0bf34ac/404.html b/803-0bf34ac/404.html new file mode 100644 index 00000000..8e593103 --- /dev/null +++ b/803-0bf34ac/404.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/404/index.html b/803-0bf34ac/404/index.html new file mode 100644 index 00000000..e3b28319 --- /dev/null +++ b/803-0bf34ac/404/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/app-174f0e3664b4ba1c5eea.js b/803-0bf34ac/app-174f0e3664b4ba1c5eea.js new file mode 100644 index 00000000..8f8f9060 --- /dev/null +++ b/803-0bf34ac/app-174f0e3664b4ba1c5eea.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[143],{7228:function(module){eval("function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanM/NWE0MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjcyMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7228\n")},3646:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayLikeToArray = __webpack_require__(7228);\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzPzIyMzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjM2NDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3646\n")},1506:function(module){eval("function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz8zYzk2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIxNTA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1506\n")},676:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _arrayLikeToArray; }\n/* harmony export */ });\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzPzZiNzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWU7QUFDZjs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNjc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///676\n')},1788:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _inheritsLoose; }\n/* harmony export */ });\n/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4665);\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(subClass, superClass);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzPzc0OGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFpRDtBQUNsQztBQUNmO0FBQ0E7QUFDQSxFQUFFLG9FQUFjO0FBQ2hCIiwiZmlsZSI6IjE3ODguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1788\n')},4665:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _setPrototypeOf; }\n/* harmony export */ });\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcz9iMzgwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0NjY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4665\n')},7329:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _toConsumableArray; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\nvar arrayLikeToArray = __webpack_require__(676);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return (0,arrayLikeToArray/* default */.Z)(arr);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\nvar unsupportedIterableToArray = __webpack_require__(2961);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\nfunction _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\n\n\n\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || (0,unsupportedIterableToArray/* default */.Z)(arr) || _nonIterableSpread();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcz82MDA1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheS5qcz9kYjkwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzM0MjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanM/MjkwOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBcUQ7QUFDdEM7QUFDZixpQ0FBaUMsbUNBQWdCO0FBQ2pELEM7O0FDSGU7QUFDZjtBQUNBLEM7Ozs7QUNGZTtBQUNmO0FBQ0EsQzs7QUNGdUQ7QUFDSjtBQUNzQjtBQUNsQjtBQUN4QztBQUNmLFNBQVMsa0JBQWlCLFNBQVMsZ0JBQWUsU0FBUyw2Q0FBMEIsU0FBUyxrQkFBaUI7QUFDL0ciLCJmaWxlIjoiNzMyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn0iLCJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7329\n')},2961:function(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ _unsupportedIterableToArray; }\n/* harmony export */ });\n/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(676);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z)(o, minLen);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcz8wNmM1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBcUQ7QUFDdEM7QUFDZjtBQUNBLG9DQUFvQyxzRUFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLHNFQUFnQjtBQUN0RyIsImZpbGUiOiIyOTYxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2961\n')},7154:function(module){eval("function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanM/YTU1OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxFQUFFLHNCQUF5QixtQkFBbUIseUJBQXlCO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI3MTU0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7154\n")},5354:function(module,__unused_webpack_exports,__webpack_require__){eval("var setPrototypeOf = __webpack_require__(9489);\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2UuanM/NTViNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjUzNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzTG9vc2U7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5354\n")},5318:function(module){eval('function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n "default": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcz80ZWE0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI1MzE4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5318\n')},6860:function(module){eval('function _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcz8xMWIwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjY4NjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6860\n')},8206:function(module){eval('function _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzA2NzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiODIwNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8206\n')},7316:function(module){eval("function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/ZjBlNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI3MzE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2U7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7316\n")},9489:function(module){eval("function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzPzRhNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHNCQUF5QixtQkFBbUIseUJBQXlCO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI5NDg5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9489\n")},319:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayWithoutHoles = __webpack_require__(3646);\n\nvar iterableToArray = __webpack_require__(6860);\n\nvar unsupportedIterableToArray = __webpack_require__(379);\n\nvar nonIterableSpread = __webpack_require__(8206);\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxpQ0FBaUMsbUJBQU8sQ0FBQyxHQUFpQzs7QUFFMUUsd0JBQXdCLG1CQUFPLENBQUMsSUFBd0I7O0FBRXhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjMxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///319\n")},379:function(module,__unused_webpack_exports,__webpack_require__){eval('var arrayLikeToArray = __webpack_require__(7228);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsSUFBdUI7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///379\n')},7625:function(n,I,g){var t={"./en":4574,"./en.js":4574,"./es":3745,"./es.js":3745,"./ses":6867,"./ses.js":6867};function e(n){var I=B(n);return g(I)}function B(n){if(!g.o(t,n)){var I=new Error("Cannot find module '"+n+"'");throw I.code="MODULE_NOT_FOUND",I}return t[n]}e.keys=function(){return Object.keys(t)},e.resolve=B,n.exports=e,e.id=7625},7991:function(n){"use strict";n.exports=JSON.parse('{"data":{"en-001":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}}},"en-150":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yr"},"past":{"one":"{0} yr ago","other":"{0} yr ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo","other":"in {0} mo"},"past":{"one":"{0} mo ago","other":"{0} mo ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wk"},"past":{"one":"{0} wk ago","other":"{0} wk ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hr"},"past":{"one":"{0} hr ago","other":"{0} hr ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min","other":"in {0} min"},"past":{"one":"{0} min ago","other":"{0} min ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec","other":"in {0} sec"},"past":{"one":"{0} sec ago","other":"{0} sec ago"}}},"en-AU":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yrs"},"past":{"one":"{0} yr ago","other":"{0} yrs ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr","other":"in {0} yrs"},"past":{"one":"{0} yr ago","other":"{0} yrs ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"{0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"in {0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wks"},"past":{"one":"{0} wk ago","other":"{0} wks ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk","other":"in {0} wks"},"past":{"one":"{0} wk ago","other":"{0} wks ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hrs"},"past":{"one":"{0} hr ago","other":"{0} hrs ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr","other":"in {0} hrs"},"past":{"one":"{0} hr ago","other":"{0} hrs ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins"},"past":{"one":"{0} min. ago","other":"{0} mins ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins"},"past":{"one":"{0} min. ago","other":"{0} mins ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs"},"past":{"one":"{0} sec. ago","other":"{0} secs ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs"},"past":{"one":"{0} sec. ago","other":"{0} secs ago"}}},"en-CA":{"year-short":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr.","other":"in {0} yrs."},"past":{"one":"{0} yr. ago","other":"{0} yrs. ago"},"-1":"last yr"},"year-narrow":{"0":"this yr","1":"next yr","future":{"one":"in {0} yr.","other":"in {0} yrs."},"past":{"one":"{0} yr. ago","other":"{0} yrs. ago"},"-1":"last yr"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"month-short":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mos."},"past":{"one":"{0} mo. ago","other":"{0} mos. ago"},"-1":"last mo"},"month-narrow":{"0":"this mo","1":"next mo","future":{"one":"in {0} mo.","other":"in {0} mos."},"past":{"one":"{0} mo. ago","other":"{0} mos. ago"},"-1":"last mo"},"week-short":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk.","other":"in {0} wks."},"past":{"one":"{0} wk. ago","other":"{0} wks. ago"},"-1":"last wk"},"week-narrow":{"0":"this wk","1":"next wk","future":{"one":"in {0} wk.","other":"in {0} wks."},"past":{"one":"{0} wk. ago","other":"{0} wks. ago"},"-1":"last wk"},"hour-short":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hrs."},"past":{"one":"{0} hr. ago","other":"{0} hrs. ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hrs."},"past":{"one":"{0} hr. ago","other":"{0} hrs. ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins."},"past":{"one":"{0} min. ago","other":"{0} mins. ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} mins."},"past":{"one":"{0} min. ago","other":"{0} mins. ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs."},"past":{"one":"{0} sec. ago","other":"{0} secs. ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} secs."},"past":{"one":"{0} sec. ago","other":"{0} secs. ago"}}},"en-SG":{"quarter-short":{"0":"this qtr","1":"next qtr","future":{"one":"in {0} qtr","other":"in {0} qtrs"},"past":{"one":"{0} qtr ago","other":"{0} qtrs ago"},"-1":"last qtr"},"quarter-narrow":{"0":"this qtr","1":"next qtr","future":{"one":"in {0} qtr","other":"in {0} qtr"},"past":{"one":"{0} qtr ago","other":"{0} qtr ago"},"-1":"last qtr"},"month-short":{"0":"this mth","1":"next mth","future":{"one":"in {0} mth","other":"in {0} mth"},"past":{"one":"{0} mth ago","other":"{0} mth ago"},"-1":"last mth"}},"en":{"nu":["latn"],"year":{"0":"this year","1":"next year","future":{"one":"in {0} year","other":"in {0} years"},"past":{"one":"{0} year ago","other":"{0} years ago"},"-1":"last year"},"year-short":{"0":"this yr.","1":"next yr.","future":{"one":"in {0} yr.","other":"in {0} yr."},"past":{"one":"{0} yr. ago","other":"{0} yr. ago"},"-1":"last yr."},"year-narrow":{"0":"this yr.","1":"next yr.","future":{"one":"in {0} yr.","other":"in {0} yr."},"past":{"one":"{0} yr. ago","other":"{0} yr. ago"},"-1":"last yr."},"quarter":{"0":"this quarter","1":"next quarter","future":{"one":"in {0} quarter","other":"in {0} quarters"},"past":{"one":"{0} quarter ago","other":"{0} quarters ago"},"-1":"last quarter"},"quarter-short":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"quarter-narrow":{"0":"this qtr.","1":"next qtr.","future":{"one":"in {0} qtr.","other":"in {0} qtrs."},"past":{"one":"{0} qtr. ago","other":"{0} qtrs. ago"},"-1":"last qtr."},"month":{"0":"this month","1":"next month","future":{"one":"in {0} month","other":"in {0} months"},"past":{"one":"{0} month ago","other":"{0} months ago"},"-1":"last month"},"month-short":{"0":"this mo.","1":"next mo.","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo."},"month-narrow":{"0":"this mo.","1":"next mo.","future":{"one":"in {0} mo.","other":"in {0} mo."},"past":{"one":"{0} mo. ago","other":"{0} mo. ago"},"-1":"last mo."},"week":{"0":"this week","1":"next week","future":{"one":"in {0} week","other":"in {0} weeks"},"past":{"one":"{0} week ago","other":"{0} weeks ago"},"-1":"last week"},"week-short":{"0":"this wk.","1":"next wk.","future":{"one":"in {0} wk.","other":"in {0} wk."},"past":{"one":"{0} wk. ago","other":"{0} wk. ago"},"-1":"last wk."},"week-narrow":{"0":"this wk.","1":"next wk.","future":{"one":"in {0} wk.","other":"in {0} wk."},"past":{"one":"{0} wk. ago","other":"{0} wk. ago"},"-1":"last wk."},"day":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"day-short":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"day-narrow":{"0":"today","1":"tomorrow","future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"},"-1":"yesterday"},"hour":{"0":"this hour","future":{"one":"in {0} hour","other":"in {0} hours"},"past":{"one":"{0} hour ago","other":"{0} hours ago"}},"hour-short":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hr."},"past":{"one":"{0} hr. ago","other":"{0} hr. ago"}},"hour-narrow":{"0":"this hour","future":{"one":"in {0} hr.","other":"in {0} hr."},"past":{"one":"{0} hr. ago","other":"{0} hr. ago"}},"minute":{"0":"this minute","future":{"one":"in {0} minute","other":"in {0} minutes"},"past":{"one":"{0} minute ago","other":"{0} minutes ago"}},"minute-short":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} min."},"past":{"one":"{0} min. ago","other":"{0} min. ago"}},"minute-narrow":{"0":"this minute","future":{"one":"in {0} min.","other":"in {0} min."},"past":{"one":"{0} min. ago","other":"{0} min. ago"}},"second":{"0":"now","future":{"one":"in {0} second","other":"in {0} seconds"},"past":{"one":"{0} second ago","other":"{0} seconds ago"}},"second-short":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} sec."},"past":{"one":"{0} sec. ago","other":"{0} sec. ago"}},"second-narrow":{"0":"now","future":{"one":"in {0} sec.","other":"in {0} sec."},"past":{"one":"{0} sec. ago","other":"{0} sec. ago"}}}},"availableLocales":["en-001","en-150","en-AE","en-AG","en-AI","en-AS","en-AT","en-AU","en-BB","en-BE","en-BI","en-BM","en-BS","en-BW","en-BZ","en-CA","en-CC","en-CH","en-CK","en-CM","en-CX","en-CY","en-DE","en-DG","en-DK","en-DM","en-ER","en-FI","en-FJ","en-FK","en-FM","en-GB","en-GD","en-GG","en-GH","en-GI","en-GM","en-GU","en-GY","en-HK","en-IE","en-IL","en-IM","en-IN","en-IO","en-JE","en-JM","en-KE","en-KI","en-KN","en-KY","en-LC","en-LR","en-LS","en-MG","en-MH","en-MO","en-MP","en-MS","en-MT","en-MU","en-MW","en-MY","en-NA","en-NF","en-NG","en-NL","en-NR","en-NU","en-NZ","en-PG","en-PH","en-PK","en-PN","en-PR","en-PW","en-RW","en-SB","en-SC","en-SD","en-SE","en-SG","en-SH","en-SI","en-SL","en-SS","en-SX","en-SZ","en-TC","en-TK","en-TO","en-TT","en-TV","en-TZ","en-UG","en-UM","en-US-POSIX","en-US","en-VC","en-VG","en-VI","en-VU","en-WS","en-ZA","en-ZM","en-ZW","en"],"aliases":{},"parentLocales":{"en-150":"en-001","en-AG":"en-001","en-AI":"en-001","en-AU":"en-001","en-BB":"en-001","en-BM":"en-001","en-BS":"en-001","en-BW":"en-001","en-BZ":"en-001","en-CA":"en-001","en-CC":"en-001","en-CK":"en-001","en-CM":"en-001","en-CX":"en-001","en-CY":"en-001","en-DG":"en-001","en-DM":"en-001","en-ER":"en-001","en-FJ":"en-001","en-FK":"en-001","en-FM":"en-001","en-GB":"en-001","en-GD":"en-001","en-GG":"en-001","en-GH":"en-001","en-GI":"en-001","en-GM":"en-001","en-GY":"en-001","en-HK":"en-001","en-IE":"en-001","en-IL":"en-001","en-IM":"en-001","en-IN":"en-001","en-IO":"en-001","en-JE":"en-001","en-JM":"en-001","en-KE":"en-001","en-KI":"en-001","en-KN":"en-001","en-KY":"en-001","en-LC":"en-001","en-LR":"en-001","en-LS":"en-001","en-MG":"en-001","en-MO":"en-001","en-MS":"en-001","en-MT":"en-001","en-MU":"en-001","en-MW":"en-001","en-MY":"en-001","en-NA":"en-001","en-NF":"en-001","en-NG":"en-001","en-NR":"en-001","en-NU":"en-001","en-NZ":"en-001","en-PG":"en-001","en-PH":"en-001","en-PK":"en-001","en-PN":"en-001","en-PW":"en-001","en-RW":"en-001","en-SB":"en-001","en-SC":"en-001","en-SD":"en-001","en-SG":"en-001","en-SH":"en-001","en-SL":"en-001","en-SS":"en-001","en-SX":"en-001","en-SZ":"en-001","en-TC":"en-001","en-TK":"en-001","en-TO":"en-001","en-TT":"en-001","en-TV":"en-001","en-TZ":"en-001","en-UG":"en-001","en-VC":"en-001","en-VG":"en-001","en-VU":"en-001","en-WS":"en-001","en-ZA":"en-001","en-ZM":"en-001","en-ZW":"en-001","en-AT":"en-150","en-BE":"en-150","en-CH":"en-150","en-DE":"en-150","en-DK":"en-150","en-FI":"en-150","en-NL":"en-150","en-SE":"en-150","en-SI":"en-150"}}')},7684:function(n){"use strict";n.exports=JSON.parse('{"data":{"es-419":{"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."},"week-narrow":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."}},"es-AR":{"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} días","other":"dentro de {0} días"},"past":{"one":"hace {0} días","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} días","other":"dentro de {0} días"},"past":{"one":"hace {0} días","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"second-short":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}}},"es-MX":{"year":{"0":"este año","1":"el año próximo","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"year-short":{"0":"este año","1":"el próximo año","future":{"one":"en {0} a","other":"en {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"year-narrow":{"0":"este año","1":"el próximo año","future":{"one":"en {0} a","other":"en {0} a"},"past":{"one":"-{0} a","other":"-{0} a"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trimestre","other":"dentro de {0} trimetres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"quarter-short":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trim.","other":"en {0} trim"},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"quarter-narrow":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"en {0} trim.","other":"en {0} trim."},"past":{"one":"-{0} T","other":"-{0} T"},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el mes próximo","future":{"one":"en {0} mes","other":"en {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"month-short":{"0":"este mes","1":"el próximo mes","future":{"one":"en {0} m","other":"en {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"month-narrow":{"0":"este mes","1":"el próximo mes","future":{"one":"+{0} m","other":"+{0} m"},"past":{"one":"-{0} m","other":"-{0} m"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la semana próxima","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"},"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"en {0} sem.","other":"en {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. pas."},"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"en {0} día","other":"en {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"+{0} día","other":"en {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"hour-short":{"0":"esta hora","future":{"one":"en {0} h","other":"en {0} n"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"minute-short":{"0":"este minuto","future":{"one":"en {0} min","other":"en {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"minute-narrow":{"0":"este minuto","future":{"one":"en {0} min","other":"en {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"second-short":{"0":"ahora","future":{"one":"en {0} s","other":"en {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}},"second-narrow":{"0":"ahora","future":{"one":"+{0} s","other":"+{0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}}},"es-PY":{"second-short":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} seg.","other":"dentro de {0} seg."},"past":{"one":"hace {0} seg.","other":"hace {0} seg."}}},"es-SV":{"day":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"antier","-1":"ayer"}},"es-US":{"year":{"0":"este año","1":"el año próximo","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trimetre","other":"dentro de {0} trimetres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el mes próximo","future":{"one":"dentro de {0} mes","other":"dentro de {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la semana próxima","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"}},"es":{"nu":["latn"],"year":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} año","other":"dentro de {0} años"},"past":{"one":"hace {0} año","other":"hace {0} años"},"-1":"el año pasado"},"year-short":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} a","other":"dentro de {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"year-narrow":{"0":"este año","1":"el próximo año","future":{"one":"dentro de {0} a","other":"dentro de {0} a"},"past":{"one":"hace {0} a","other":"hace {0} a"},"-1":"el año pasado"},"quarter":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trimestre","other":"dentro de {0} trimestres"},"past":{"one":"hace {0} trimestre","other":"hace {0} trimestres"},"-1":"el trimestre pasado"},"quarter-short":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trim.","other":"dentro de {0} trim."},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"quarter-narrow":{"0":"este trimestre","1":"el próximo trimestre","future":{"one":"dentro de {0} trim.","other":"dentro de {0} trim."},"past":{"one":"hace {0} trim.","other":"hace {0} trim."},"-1":"el trimestre pasado"},"month":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} mes","other":"dentro de {0} meses"},"past":{"one":"hace {0} mes","other":"hace {0} meses"},"-1":"el mes pasado"},"month-short":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} m","other":"dentro de {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"month-narrow":{"0":"este mes","1":"el próximo mes","future":{"one":"dentro de {0} m","other":"dentro de {0} m"},"past":{"one":"hace {0} m","other":"hace {0} m"},"-1":"el mes pasado"},"week":{"0":"esta semana","1":"la próxima semana","future":{"one":"dentro de {0} semana","other":"dentro de {0} semanas"},"past":{"one":"hace {0} semana","other":"hace {0} semanas"},"-1":"la semana pasada"},"week-short":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. ant."},"week-narrow":{"0":"esta sem.","1":"próx. sem.","future":{"one":"dentro de {0} sem.","other":"dentro de {0} sem."},"past":{"one":"hace {0} sem.","other":"hace {0} sem."},"-1":"sem. ant."},"day":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-short":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"day-narrow":{"0":"hoy","1":"mañana","2":"pasado mañana","future":{"one":"dentro de {0} día","other":"dentro de {0} días"},"past":{"one":"hace {0} día","other":"hace {0} días"},"-2":"anteayer","-1":"ayer"},"hour":{"0":"esta hora","future":{"one":"dentro de {0} hora","other":"dentro de {0} horas"},"past":{"one":"hace {0} hora","other":"hace {0} horas"}},"hour-short":{"0":"esta hora","future":{"one":"dentro de {0} h","other":"dentro de {0} h"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"hour-narrow":{"0":"esta hora","future":{"one":"dentro de {0} h","other":"dentro de {0} h"},"past":{"one":"hace {0} h","other":"hace {0} h"}},"minute":{"0":"este minuto","future":{"one":"dentro de {0} minuto","other":"dentro de {0} minutos"},"past":{"one":"hace {0} minuto","other":"hace {0} minutos"}},"minute-short":{"0":"este minuto","future":{"one":"dentro de {0} min","other":"dentro de {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"minute-narrow":{"0":"este minuto","future":{"one":"dentro de {0} min","other":"dentro de {0} min"},"past":{"one":"hace {0} min","other":"hace {0} min"}},"second":{"0":"ahora","future":{"one":"dentro de {0} segundo","other":"dentro de {0} segundos"},"past":{"one":"hace {0} segundo","other":"hace {0} segundos"}},"second-short":{"0":"ahora","future":{"one":"dentro de {0} s","other":"dentro de {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}},"second-narrow":{"0":"ahora","future":{"one":"dentro de {0} s","other":"dentro de {0} s"},"past":{"one":"hace {0} s","other":"hace {0} s"}}}},"availableLocales":["es-419","es-AR","es-BO","es-BR","es-BZ","es-CL","es-CO","es-CR","es-CU","es-DO","es-EA","es-EC","es-GQ","es-GT","es-HN","es-IC","es-MX","es-NI","es-PA","es-PE","es-PH","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","es"],"aliases":{},"parentLocales":{"es-AR":"es-419","es-BO":"es-419","es-BR":"es-419","es-BZ":"es-419","es-CL":"es-419","es-CO":"es-419","es-CR":"es-419","es-CU":"es-419","es-DO":"es-419","es-EC":"es-419","es-GT":"es-419","es-HN":"es-419","es-MX":"es-419","es-NI":"es-419","es-PA":"es-419","es-PE":"es-419","es-PR":"es-419","es-PY":"es-419","es-SV":"es-419","es-US":"es-419","es-UY":"es-419","es-VE":"es-419"}}')},8385:function(n){"use strict";n.exports=JSON.parse('{"data":{"ses":{"nu":["latn"],"year":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"year-short":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"year-narrow":{"0":"this year","1":"next year","future":{"other":"+{0} y"},"past":{"other":"-{0} y"},"-1":"last year"},"quarter":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"quarter-short":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"quarter-narrow":{"0":"this quarter","1":"next quarter","future":{"other":"+{0} Q"},"past":{"other":"-{0} Q"},"-1":"last quarter"},"month":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"month-short":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"month-narrow":{"0":"this month","1":"next month","future":{"other":"+{0} m"},"past":{"other":"-{0} m"},"-1":"last month"},"week":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"week-short":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"week-narrow":{"0":"this week","1":"next week","future":{"other":"+{0} w"},"past":{"other":"-{0} w"},"-1":"last week"},"day":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"day-short":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"day-narrow":{"0":"Hõo","1":"Suba","future":{"other":"+{0} d"},"past":{"other":"-{0} d"},"-1":"Bi"},"hour":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"hour-short":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"hour-narrow":{"0":"this hour","future":{"other":"+{0} h"},"past":{"other":"-{0} h"}},"minute":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"minute-short":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"minute-narrow":{"0":"this minute","future":{"other":"+{0} min"},"past":{"other":"-{0} min"}},"second":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}},"second-short":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}},"second-narrow":{"0":"now","future":{"other":"+{0} s"},"past":{"other":"-{0} s"}}}},"availableLocales":["ses"],"aliases":{},"parentLocales":{}}')},1666:function(n,I,g){var t={"./en":8079,"./en.js":8079,"./en.json":7991,"./es":4033,"./es.js":4033,"./es.json":7684,"./ses":9584,"./ses.js":9584,"./ses.json":8385};function e(n){var I=B(n);return g(I)}function B(n){if(!g.o(t,n)){var I=new Error("Cannot find module '"+n+"'");throw I.code="MODULE_NOT_FOUND",I}return t[n]}e.keys=function(){return Object.keys(t)},e.resolve=B,n.exports=e,e.id=1666},3012:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar __spreadArrays = this && this.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar intl_utils_1 = __webpack_require__(2650);\n\nfunction validateInstance(instance, method) {\n if (!(instance instanceof PluralRules)) {\n throw new TypeError(\"Method Intl.PluralRules.prototype.\" + method + \" called on incompatible receiver \" + String(instance));\n }\n}\n/**\n * https://tc39.es/ecma402/#sec-torawprecision\n * @param x\n * @param minPrecision\n * @param maxPrecision\n */\n\n\nfunction toRawPrecision(x, minPrecision, maxPrecision) {\n var m = x.toPrecision(maxPrecision);\n\n if (~m.indexOf('.') && maxPrecision > minPrecision) {\n var cut = maxPrecision - minPrecision;\n\n while (cut > 0 && m[m.length - 1] === '0') {\n m = m.slice(0, m.length - 1);\n cut--;\n }\n\n if (m[m.length - 1] === '.') {\n return m.slice(0, m.length - 1);\n }\n }\n\n return m;\n}\n/**\n * https://tc39.es/ecma402/#sec-torawfixed\n * @param x\n * @param minInteger\n * @param minFraction\n * @param maxFraction\n */\n\n\nfunction toRawFixed(x, minInteger, minFraction, maxFraction) {\n var cut = maxFraction - minFraction;\n var m = x.toFixed(maxFraction);\n\n while (cut > 0 && m[m.length - 1] === '0') {\n m = m.slice(0, m.length - 1);\n cut--;\n }\n\n if (m[m.length - 1] === '.') {\n m = m.slice(0, m.length - 1);\n }\n\n var int = m.split('.')[0].length;\n\n if (int < minInteger) {\n var z = '';\n\n for (; z.length < minInteger - int; z += '0') {\n ;\n }\n\n m = z + m;\n }\n\n return m;\n}\n\nfunction formatNumericToString(internalSlotMap, pl, x) {\n var minimumSignificantDigits = intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumSignificantDigits');\n var maximumSignificantDigits = intl_utils_1.getInternalSlot(internalSlotMap, pl, 'maximumSignificantDigits');\n\n if (minimumSignificantDigits !== undefined && maximumSignificantDigits !== undefined) {\n return toRawPrecision(x, minimumSignificantDigits, maximumSignificantDigits);\n }\n\n return toRawFixed(x, intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumIntegerDigits'), intl_utils_1.getInternalSlot(internalSlotMap, pl, 'minimumFractionDigits'), intl_utils_1.getInternalSlot(internalSlotMap, pl, 'maximumFractionDigits'));\n}\n\nvar PluralRules =\n/** @class */\nfunction () {\n function PluralRules(locales, options) {\n // test262/test/intl402/RelativeTimeFormat/constructor/constructor/newtarget-undefined.js\n // Cannot use `new.target` bc of IE11 & TS transpiles it to something else\n var newTarget = this && this instanceof PluralRules ? this.constructor : void 0;\n\n if (!newTarget) {\n throw new TypeError(\"Intl.PluralRules must be called with 'new'\");\n }\n\n var requestedLocales = intl_utils_1.getCanonicalLocales(locales);\n var opt = Object.create(null);\n var opts = options === undefined ? Object.create(null) : intl_utils_1.toObject(options);\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'initializedPluralRules', true);\n var matcher = intl_utils_1.getOption(opts, 'localeMatcher', 'string', ['best fit', 'lookup'], 'best fit');\n opt.localeMatcher = matcher;\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type', intl_utils_1.getOption(opts, 'type', 'string', ['cardinal', 'ordinal'], 'cardinal'));\n intl_utils_1.setNumberFormatDigitOptions(PluralRules.__INTERNAL_SLOT_MAP__, this, opts, 0, 3);\n var r = intl_utils_1.createResolveLocale(PluralRules.getDefaultLocale)(PluralRules.availableLocales, requestedLocales, opt, PluralRules.relevantExtensionKeys, PluralRules.localeData);\n intl_utils_1.setInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale', r.locale);\n }\n\n PluralRules.prototype.resolvedOptions = function () {\n var _this = this;\n\n validateInstance(this, 'resolvedOptions');\n var opts = Object.create(null);\n opts.locale = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale');\n opts.type = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type');\n ['minimumIntegerDigits', 'minimumFractionDigits', 'maximumFractionDigits', 'minimumSignificantDigits', 'maximumSignificantDigits'].forEach(function (field) {\n var val = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, _this, field);\n\n if (val !== undefined) {\n opts[field] = val;\n }\n });\n opts.pluralCategories = __spreadArrays(PluralRules.localeData[opts.locale].categories[opts.type]);\n return opts;\n };\n\n PluralRules.prototype.select = function (val) {\n validateInstance(this, 'select');\n var locale = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'locale');\n var type = intl_utils_1.getInternalSlot(PluralRules.__INTERNAL_SLOT_MAP__, this, 'type');\n return PluralRules.localeData[locale].fn(formatNumericToString(PluralRules.__INTERNAL_SLOT_MAP__, this, Math.abs(Number(val))), type == 'ordinal');\n };\n\n PluralRules.prototype.toString = function () {\n return '[object Intl.PluralRules]';\n };\n\n PluralRules.supportedLocalesOf = function (locales, options) {\n return intl_utils_1.supportedLocales(PluralRules.availableLocales, intl_utils_1.getCanonicalLocales(locales), options);\n };\n\n PluralRules.__addLocaleData = function () {\n var data = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n data[_i] = arguments[_i];\n }\n\n var _loop_1 = function _loop_1(datum) {\n var availableLocales = Object.keys(__spreadArrays(datum.availableLocales, Object.keys(datum.aliases), Object.keys(datum.parentLocales)).reduce(function (all, k) {\n all[k] = true;\n return all;\n }, {}));\n availableLocales.forEach(function (locale) {\n try {\n PluralRules.localeData[locale] = intl_utils_1.unpackData(locale, datum);\n } catch (e) {\n if (intl_utils_1.isMissingLocaleDataError(e)) {\n // If we just don't have data for certain locale, that's ok\n return;\n }\n\n throw e;\n }\n });\n };\n\n for (var _a = 0, data_1 = data; _a < data_1.length; _a++) {\n var datum = data_1[_a];\n\n _loop_1(datum);\n }\n\n PluralRules.availableLocales = Object.keys(PluralRules.localeData);\n\n if (!PluralRules.__defaultLocale) {\n PluralRules.__defaultLocale = PluralRules.availableLocales[0];\n }\n };\n\n PluralRules.getDefaultLocale = function () {\n return PluralRules.__defaultLocale;\n };\n\n PluralRules.localeData = {};\n PluralRules.availableLocales = [];\n PluralRules.__defaultLocale = 'en';\n PluralRules.relevantExtensionKeys = [];\n PluralRules.polyfilled = true;\n PluralRules.__INTERNAL_SLOT_MAP__ = new WeakMap();\n return PluralRules;\n}();\n\nexports.PluralRules = PluralRules;\n\ntry {\n // https://github.com/tc39/test262/blob/master/test/intl402/PluralRules/length.js\n Object.defineProperty(PluralRules, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/length.js\n\n Object.defineProperty(PluralRules.prototype.constructor, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/supportedLocalesOf/length.js\n\n Object.defineProperty(PluralRules.supportedLocalesOf, 'length', {\n value: 1,\n writable: false,\n enumerable: false,\n configurable: true\n });\n} catch (ex) {// Meta fixes for test262\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2NvcmUuanM/NjIxMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7O0FBRUEsc0NBQXNDLFFBQVE7QUFDOUMsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDOztBQUVGLG1CQUFtQixtQkFBTyxDQUFDLElBQXNCOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsVUFBVSw2QkFBNkI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQUk7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSxtQ0FBbUMsb0JBQW9CO0FBQ3ZEOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLGFBQWE7QUFDZCIsImZpbGUiOiIzMDEyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfX3NwcmVhZEFycmF5cyA9IHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5cyB8fCBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBpbnRsX3V0aWxzXzEgPSByZXF1aXJlKFwiQGZvcm1hdGpzL2ludGwtdXRpbHNcIik7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW5zdGFuY2UoaW5zdGFuY2UsIG1ldGhvZCkge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIFBsdXJhbFJ1bGVzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXRob2QgSW50bC5QbHVyYWxSdWxlcy5wcm90b3R5cGUuXCIgKyBtZXRob2QgKyBcIiBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyIFwiICsgU3RyaW5nKGluc3RhbmNlKSk7XG4gIH1cbn1cbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy10b3Jhd3ByZWNpc2lvblxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBtaW5QcmVjaXNpb25cbiAqIEBwYXJhbSBtYXhQcmVjaXNpb25cbiAqL1xuXG5cbmZ1bmN0aW9uIHRvUmF3UHJlY2lzaW9uKHgsIG1pblByZWNpc2lvbiwgbWF4UHJlY2lzaW9uKSB7XG4gIHZhciBtID0geC50b1ByZWNpc2lvbihtYXhQcmVjaXNpb24pO1xuXG4gIGlmICh+bS5pbmRleE9mKCcuJykgJiYgbWF4UHJlY2lzaW9uID4gbWluUHJlY2lzaW9uKSB7XG4gICAgdmFyIGN1dCA9IG1heFByZWNpc2lvbiAtIG1pblByZWNpc2lvbjtcblxuICAgIHdoaWxlIChjdXQgPiAwICYmIG1bbS5sZW5ndGggLSAxXSA9PT0gJzAnKSB7XG4gICAgICBtID0gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgICAgY3V0LS07XG4gICAgfVxuXG4gICAgaWYgKG1bbS5sZW5ndGggLSAxXSA9PT0gJy4nKSB7XG4gICAgICByZXR1cm4gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTQwMi8jc2VjLXRvcmF3Zml4ZWRcbiAqIEBwYXJhbSB4XG4gKiBAcGFyYW0gbWluSW50ZWdlclxuICogQHBhcmFtIG1pbkZyYWN0aW9uXG4gKiBAcGFyYW0gbWF4RnJhY3Rpb25cbiAqL1xuXG5cbmZ1bmN0aW9uIHRvUmF3Rml4ZWQoeCwgbWluSW50ZWdlciwgbWluRnJhY3Rpb24sIG1heEZyYWN0aW9uKSB7XG4gIHZhciBjdXQgPSBtYXhGcmFjdGlvbiAtIG1pbkZyYWN0aW9uO1xuICB2YXIgbSA9IHgudG9GaXhlZChtYXhGcmFjdGlvbik7XG5cbiAgd2hpbGUgKGN1dCA+IDAgJiYgbVttLmxlbmd0aCAtIDFdID09PSAnMCcpIHtcbiAgICBtID0gbS5zbGljZSgwLCBtLmxlbmd0aCAtIDEpO1xuICAgIGN1dC0tO1xuICB9XG5cbiAgaWYgKG1bbS5sZW5ndGggLSAxXSA9PT0gJy4nKSB7XG4gICAgbSA9IG0uc2xpY2UoMCwgbS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHZhciBpbnQgPSBtLnNwbGl0KCcuJylbMF0ubGVuZ3RoO1xuXG4gIGlmIChpbnQgPCBtaW5JbnRlZ2VyKSB7XG4gICAgdmFyIHogPSAnJztcblxuICAgIGZvciAoOyB6Lmxlbmd0aCA8IG1pbkludGVnZXIgLSBpbnQ7IHogKz0gJzAnKSB7XG4gICAgICA7XG4gICAgfVxuXG4gICAgbSA9IHogKyBtO1xuICB9XG5cbiAgcmV0dXJuIG07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bWVyaWNUb1N0cmluZyhpbnRlcm5hbFNsb3RNYXAsIHBsLCB4KSB7XG4gIHZhciBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMnKTtcbiAgdmFyIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBwbCwgJ21heGltdW1TaWduaWZpY2FudERpZ2l0cycpO1xuXG4gIGlmIChtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgIT09IHVuZGVmaW5lZCAmJiBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0b1Jhd1ByZWNpc2lvbih4LCBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMsIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyk7XG4gIH1cblxuICByZXR1cm4gdG9SYXdGaXhlZCh4LCBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtSW50ZWdlckRpZ2l0cycpLCBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcGwsICdtaW5pbXVtRnJhY3Rpb25EaWdpdHMnKSwgaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHBsLCAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJykpO1xufVxuXG52YXIgUGx1cmFsUnVsZXMgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQbHVyYWxSdWxlcyhsb2NhbGVzLCBvcHRpb25zKSB7XG4gICAgLy8gdGVzdDI2Mi90ZXN0L2ludGw0MDIvUmVsYXRpdmVUaW1lRm9ybWF0L2NvbnN0cnVjdG9yL2NvbnN0cnVjdG9yL25ld3RhcmdldC11bmRlZmluZWQuanNcbiAgICAvLyBDYW5ub3QgdXNlIGBuZXcudGFyZ2V0YCBiYyBvZiBJRTExICYgVFMgdHJhbnNwaWxlcyBpdCB0byBzb21ldGhpbmcgZWxzZVxuICAgIHZhciBuZXdUYXJnZXQgPSB0aGlzICYmIHRoaXMgaW5zdGFuY2VvZiBQbHVyYWxSdWxlcyA/IHRoaXMuY29uc3RydWN0b3IgOiB2b2lkIDA7XG5cbiAgICBpZiAoIW5ld1RhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludGwuUGx1cmFsUnVsZXMgbXVzdCBiZSBjYWxsZWQgd2l0aCAnbmV3J1wiKTtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdGVkTG9jYWxlcyA9IGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpO1xuICAgIHZhciBvcHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGludGxfdXRpbHNfMS50b09iamVjdChvcHRpb25zKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2luaXRpYWxpemVkUGx1cmFsUnVsZXMnLCB0cnVlKTtcbiAgICB2YXIgbWF0Y2hlciA9IGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ2xvY2FsZU1hdGNoZXInLCAnc3RyaW5nJywgWydiZXN0IGZpdCcsICdsb29rdXAnXSwgJ2Jlc3QgZml0Jyk7XG4gICAgb3B0LmxvY2FsZU1hdGNoZXIgPSBtYXRjaGVyO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScsIGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ3R5cGUnLCAnc3RyaW5nJywgWydjYXJkaW5hbCcsICdvcmRpbmFsJ10sICdjYXJkaW5hbCcpKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0TnVtYmVyRm9ybWF0RGlnaXRPcHRpb25zKFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgb3B0cywgMCwgMyk7XG4gICAgdmFyIHIgPSBpbnRsX3V0aWxzXzEuY3JlYXRlUmVzb2x2ZUxvY2FsZShQbHVyYWxSdWxlcy5nZXREZWZhdWx0TG9jYWxlKShQbHVyYWxSdWxlcy5hdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzLCBvcHQsIFBsdXJhbFJ1bGVzLnJlbGV2YW50RXh0ZW5zaW9uS2V5cywgUGx1cmFsUnVsZXMubG9jYWxlRGF0YSk7XG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChQbHVyYWxSdWxlcy5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdsb2NhbGUnLCByLmxvY2FsZSk7XG4gIH1cblxuICBQbHVyYWxSdWxlcy5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMsICdyZXNvbHZlZE9wdGlvbnMnKTtcbiAgICB2YXIgb3B0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgb3B0cy5sb2NhbGUgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2xvY2FsZScpO1xuICAgIG9wdHMudHlwZSA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScpO1xuICAgIFsnbWluaW11bUludGVnZXJEaWdpdHMnLCAnbWluaW11bUZyYWN0aW9uRGlnaXRzJywgJ21heGltdW1GcmFjdGlvbkRpZ2l0cycsICdtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMnLCAnbWF4aW11bVNpZ25pZmljYW50RGlnaXRzJ10uZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciB2YWwgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgX3RoaXMsIGZpZWxkKTtcblxuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdHNbZmllbGRdID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9wdHMucGx1cmFsQ2F0ZWdvcmllcyA9IF9fc3ByZWFkQXJyYXlzKFBsdXJhbFJ1bGVzLmxvY2FsZURhdGFbb3B0cy5sb2NhbGVdLmNhdGVnb3JpZXNbb3B0cy50eXBlXSk7XG4gICAgcmV0dXJuIG9wdHM7XG4gIH07XG5cbiAgUGx1cmFsUnVsZXMucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMsICdzZWxlY3QnKTtcbiAgICB2YXIgbG9jYWxlID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChQbHVyYWxSdWxlcy5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdsb2NhbGUnKTtcbiAgICB2YXIgdHlwZSA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUGx1cmFsUnVsZXMuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAndHlwZScpO1xuICAgIHJldHVybiBQbHVyYWxSdWxlcy5sb2NhbGVEYXRhW2xvY2FsZV0uZm4oZm9ybWF0TnVtZXJpY1RvU3RyaW5nKFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgTWF0aC5hYnMoTnVtYmVyKHZhbCkpKSwgdHlwZSA9PSAnb3JkaW5hbCcpO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgSW50bC5QbHVyYWxSdWxlc10nO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLnN1cHBvcnRlZExvY2FsZXNPZiA9IGZ1bmN0aW9uIChsb2NhbGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGludGxfdXRpbHNfMS5zdXBwb3J0ZWRMb2NhbGVzKFBsdXJhbFJ1bGVzLmF2YWlsYWJsZUxvY2FsZXMsIGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpLCBvcHRpb25zKTtcbiAgfTtcblxuICBQbHVyYWxSdWxlcy5fX2FkZExvY2FsZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBkYXRhW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGRhdHVtKSB7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlcyA9IE9iamVjdC5rZXlzKF9fc3ByZWFkQXJyYXlzKGRhdHVtLmF2YWlsYWJsZUxvY2FsZXMsIE9iamVjdC5rZXlzKGRhdHVtLmFsaWFzZXMpLCBPYmplY3Qua2V5cyhkYXR1bS5wYXJlbnRMb2NhbGVzKSkucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGspIHtcbiAgICAgICAgYWxsW2tdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICAgIH0sIHt9KSk7XG4gICAgICBhdmFpbGFibGVMb2NhbGVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFBsdXJhbFJ1bGVzLmxvY2FsZURhdGFbbG9jYWxlXSA9IGludGxfdXRpbHNfMS51bnBhY2tEYXRhKGxvY2FsZSwgZGF0dW0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGludGxfdXRpbHNfMS5pc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IoZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGp1c3QgZG9uJ3QgaGF2ZSBkYXRhIGZvciBjZXJ0YWluIGxvY2FsZSwgdGhhdCdzIG9rXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9hID0gMCwgZGF0YV8xID0gZGF0YTsgX2EgPCBkYXRhXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICB2YXIgZGF0dW0gPSBkYXRhXzFbX2FdO1xuXG4gICAgICBfbG9vcF8xKGRhdHVtKTtcbiAgICB9XG5cbiAgICBQbHVyYWxSdWxlcy5hdmFpbGFibGVMb2NhbGVzID0gT2JqZWN0LmtleXMoUGx1cmFsUnVsZXMubG9jYWxlRGF0YSk7XG5cbiAgICBpZiAoIVBsdXJhbFJ1bGVzLl9fZGVmYXVsdExvY2FsZSkge1xuICAgICAgUGx1cmFsUnVsZXMuX19kZWZhdWx0TG9jYWxlID0gUGx1cmFsUnVsZXMuYXZhaWxhYmxlTG9jYWxlc1swXTtcbiAgICB9XG4gIH07XG5cbiAgUGx1cmFsUnVsZXMuZ2V0RGVmYXVsdExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUGx1cmFsUnVsZXMuX19kZWZhdWx0TG9jYWxlO1xuICB9O1xuXG4gIFBsdXJhbFJ1bGVzLmxvY2FsZURhdGEgPSB7fTtcbiAgUGx1cmFsUnVsZXMuYXZhaWxhYmxlTG9jYWxlcyA9IFtdO1xuICBQbHVyYWxSdWxlcy5fX2RlZmF1bHRMb2NhbGUgPSAnZW4nO1xuICBQbHVyYWxSdWxlcy5yZWxldmFudEV4dGVuc2lvbktleXMgPSBbXTtcbiAgUGx1cmFsUnVsZXMucG9seWZpbGxlZCA9IHRydWU7XG4gIFBsdXJhbFJ1bGVzLl9fSU5URVJOQUxfU0xPVF9NQVBfXyA9IG5ldyBXZWFrTWFwKCk7XG4gIHJldHVybiBQbHVyYWxSdWxlcztcbn0oKTtcblxuZXhwb3J0cy5QbHVyYWxSdWxlcyA9IFBsdXJhbFJ1bGVzO1xuXG50cnkge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9QbHVyYWxSdWxlcy9sZW5ndGguanNcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsdXJhbFJ1bGVzLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Rlc3QyNjIvYmxvYi9tYXN0ZXIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9jb25zdHJ1Y3Rvci9sZW5ndGguanNcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGx1cmFsUnVsZXMucHJvdG90eXBlLmNvbnN0cnVjdG9yLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Rlc3QyNjIvYmxvYi9tYXN0ZXIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9jb25zdHJ1Y3Rvci9zdXBwb3J0ZWRMb2NhbGVzT2YvbGVuZ3RoLmpzXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsdXJhbFJ1bGVzLnN1cHBvcnRlZExvY2FsZXNPZiwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufSBjYXRjaCAoZXgpIHsvLyBNZXRhIGZpeGVzIGZvciB0ZXN0MjYyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3012\n")},4574:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "en": {\n "categories": {\n "cardinal": ["one", "other"],\n "ordinal": ["one", "two", "few", "other"]\n },\n "fn": function fn(n, ord) {\n var s = String(n).split(\'.\'),\n v0 = !s[1],\n t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1),\n n100 = t0 && s[0].slice(-2);\n if (ord) return n10 == 1 && n100 != 11 ? \'one\' : n10 == 2 && n100 != 12 ? \'two\' : n10 == 3 && n100 != 13 ? \'few\' : \'other\';\n return n == 1 && v0 ? \'one\' : \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150"\n },\n "availableLocales": ["en"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL2VuLmpzPzQ3N2MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQ1NzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlBsdXJhbFJ1bGVzICYmIHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZW5cIjoge1xuICAgICAgICBcImNhdGVnb3JpZXNcIjoge1xuICAgICAgICAgIFwiY2FyZGluYWxcIjogW1wib25lXCIsIFwib3RoZXJcIl0sXG4gICAgICAgICAgXCJvcmRpbmFsXCI6IFtcIm9uZVwiLCBcInR3b1wiLCBcImZld1wiLCBcIm90aGVyXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm5cIjogZnVuY3Rpb24gZm4obiwgb3JkKSB7XG4gICAgICAgICAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgdjAgPSAhc1sxXSxcbiAgICAgICAgICAgICAgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgICAgICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksXG4gICAgICAgICAgICAgIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtcbiAgICAgICAgICBpZiAob3JkKSByZXR1cm4gbjEwID09IDEgJiYgbjEwMCAhPSAxMSA/ICdvbmUnIDogbjEwID09IDIgJiYgbjEwMCAhPSAxMiA/ICd0d28nIDogbjEwID09IDMgJiYgbjEwMCAhPSAxMyA/ICdmZXcnIDogJ290aGVyJztcbiAgICAgICAgICByZXR1cm4gbiA9PSAxICYmIHYwID8gJ29uZScgOiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZW4tMTUwXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFVXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUJaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNBXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNYXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUNZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLURHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLURNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUVSXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZKXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUZNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdEXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUdZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUhLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlMXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUlPXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUpFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUpNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtFXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtJXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUtZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxSXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUxTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1HXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1PXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1TXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1UXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1VXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1XXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU1ZXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5BXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5GXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5HXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5SXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5VXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLU5aXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBOXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVBXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVJXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNCXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNEXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNIXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNMXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNYXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVNaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRLXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRPXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRUXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRWXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVRaXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVVHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZDXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZHXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVZVXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVdTXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpBXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpNXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLVpXXCI6IFwiZW4tMDAxXCIsXG4gICAgICBcImVuLUFUXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUJFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUNIXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLURFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLURLXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLUZJXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLU5MXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLVNFXCI6IFwiZW4tMTUwXCIsXG4gICAgICBcImVuLVNJXCI6IFwiZW4tMTUwXCJcbiAgICB9LFxuICAgIFwiYXZhaWxhYmxlTG9jYWxlc1wiOiBbXCJlblwiXVxuICB9KTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4574\n')},3745:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "es": {\n "categories": {\n "cardinal": ["one", "other"],\n "ordinal": ["other"]\n },\n "fn": function fn(n, ord) {\n if (ord) return \'other\';\n return n == 1 ? \'one\' : \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419"\n },\n "availableLocales": ["es"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL2VzLmpzPzNmZTYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMzc0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIEBnZW5lcmF0ZWQgKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxuaWYgKEludGwuUGx1cmFsUnVsZXMgJiYgdHlwZW9mIEludGwuUGx1cmFsUnVsZXMuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUGx1cmFsUnVsZXMuX19hZGRMb2NhbGVEYXRhKHtcbiAgICBcImRhdGFcIjoge1xuICAgICAgXCJlc1wiOiB7XG4gICAgICAgIFwiY2F0ZWdvcmllc1wiOiB7XG4gICAgICAgICAgXCJjYXJkaW5hbFwiOiBbXCJvbmVcIiwgXCJvdGhlclwiXSxcbiAgICAgICAgICBcIm9yZGluYWxcIjogW1wib3RoZXJcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmblwiOiBmdW5jdGlvbiBmbihuLCBvcmQpIHtcbiAgICAgICAgICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgICAgICAgICByZXR1cm4gbiA9PSAxID8gJ29uZScgOiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZXMtQVJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlpcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ09cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1JcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRE9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRUNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtSE5cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTVhcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEFcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEVcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtU1ZcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVkVcIjogXCJlcy00MTlcIlxuICAgIH0sXG4gICAgXCJhdmFpbGFibGVMb2NhbGVzXCI6IFtcImVzXCJdXG4gIH0pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3745\n')},6867:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.PluralRules && typeof Intl.PluralRules.__addLocaleData === \'function\') {\n Intl.PluralRules.__addLocaleData({\n "data": {\n "ses": {\n "categories": {\n "cardinal": ["other"],\n "ordinal": ["other"]\n },\n "fn": function fn(n, ord) {\n return \'other\';\n }\n }\n },\n "aliases": {},\n "parentLocales": {},\n "availableLocales": ["ses"]\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L2xvY2FsZS1kYXRhL3Nlcy5qcz8yOTM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxpQkFBaUI7QUFDakIsdUJBQXVCO0FBQ3ZCO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjY4NjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlBsdXJhbFJ1bGVzICYmIHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlBsdXJhbFJ1bGVzLl9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwic2VzXCI6IHtcbiAgICAgICAgXCJjYXRlZ29yaWVzXCI6IHtcbiAgICAgICAgICBcImNhcmRpbmFsXCI6IFtcIm90aGVyXCJdLFxuICAgICAgICAgIFwib3JkaW5hbFwiOiBbXCJvdGhlclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImZuXCI6IGZ1bmN0aW9uIGZuKG4sIG9yZCkge1xuICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHt9LFxuICAgIFwiYXZhaWxhYmxlTG9jYWxlc1wiOiBbXCJzZXNcIl1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6867\n')},2157:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar core_1 = __webpack_require__(3012);\n\nif (typeof Intl.PluralRules === 'undefined' || !Intl.PluralRules.polyfilled && new Intl.PluralRules('en', {\n minimumFractionDigits: 2\n}).select(1) === 'one') {\n Object.defineProperty(Intl, 'PluralRules', {\n value: core_1.PluralRules,\n writable: true,\n enumerable: false,\n configurable: true\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9kaXN0L3BvbHlmaWxsLmpzP2FkY2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDOztBQUVGLGFBQWEsbUJBQU8sQ0FBQyxJQUFROztBQUU3QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMjE1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgY29yZV8xID0gcmVxdWlyZShcIi4vY29yZVwiKTtcblxuaWYgKHR5cGVvZiBJbnRsLlBsdXJhbFJ1bGVzID09PSAndW5kZWZpbmVkJyB8fCAhSW50bC5QbHVyYWxSdWxlcy5wb2x5ZmlsbGVkICYmIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKCdlbicsIHtcbiAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyXG59KS5zZWxlY3QoMSkgPT09ICdvbmUnKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRsLCAnUGx1cmFsUnVsZXMnLCB7XG4gICAgdmFsdWU6IGNvcmVfMS5QbHVyYWxSdWxlcyxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2157\n")},3228:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("__webpack_require__(2157);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1wbHVyYWxydWxlcy9wb2x5ZmlsbC5qcz8xYTM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFPLENBQUMsSUFBaUIiLCJmaWxlIjoiMzIyOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vZGlzdC9wb2x5ZmlsbCcpOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3228\n")},9905:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar __assign = this && this.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nvar __values = this && this.__values || function (o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\n\nvar __read = this && this.__read || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n};\n\nvar __spread = this && this.__spread || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n};\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar intl_utils_1 = __webpack_require__(2650);\n\nfunction unpackData(locale, localeData) {\n var localeHierarchy = intl_utils_1.getLocaleHierarchy(locale, localeData.aliases, localeData.parentLocales);\n var dataToMerge = localeHierarchy.map(function (l) {\n return localeData.data[l];\n }).filter(Boolean);\n\n if (!dataToMerge.length) {\n throw new Error(\"Missing locale data for \\\"\" + locale + \"\\\", lookup hierarchy: \" + localeHierarchy.join(', '));\n }\n\n dataToMerge.reverse();\n return dataToMerge.reduce(function (all, d) {\n return __assign(__assign({}, all), d);\n }, {\n nu: []\n });\n}\n/**\n * https://tc39.es/proposal-intl-relative-time/#sec-singularrelativetimeunit\n * @param unit\n */\n\n\nfunction singularRelativeTimeUnit(unit) {\n intl_utils_1.invariant(typeof unit === 'string', \"unit must be a string, instead got \" + typeof unit, TypeError);\n if (unit === 'seconds') return 'second';\n if (unit === 'minutes') return 'minute';\n if (unit === 'hours') return 'hour';\n if (unit === 'days') return 'day';\n if (unit === 'weeks') return 'week';\n if (unit === 'months') return 'month';\n if (unit === 'quarters') return 'quarter';\n if (unit === 'years') return 'year';\n\n if (unit !== 'second' && unit !== 'minute' && unit !== 'hour' && unit !== 'day' && unit !== 'week' && unit !== 'month' && unit !== 'quarter' && unit !== 'year') {\n throw new RangeError(\"Invalid unit \" + unit);\n }\n\n return unit;\n}\n\nvar NUMBERING_SYSTEM_REGEX = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/i;\n/**\n * https://tc39.es/proposal-intl-relative-time/#sec-makepartslist\n * @param pattern\n * @param unit\n * @param parts\n */\n\nfunction makePartsList(pattern, unit, parts) {\n var e_1, _a, e_2, _b;\n\n var patternParts = intl_utils_1.partitionPattern(pattern);\n var result = [];\n\n try {\n for (var patternParts_1 = __values(patternParts), patternParts_1_1 = patternParts_1.next(); !patternParts_1_1.done; patternParts_1_1 = patternParts_1.next()) {\n var patternPart = patternParts_1_1.value;\n\n if (intl_utils_1.isLiteralPart(patternPart)) {\n result.push({\n type: 'literal',\n value: patternPart.value\n });\n } else {\n intl_utils_1.invariant(patternPart.type === '0', \"Malformed pattern \" + pattern);\n\n try {\n for (var parts_1 = (e_2 = void 0, __values(parts)), parts_1_1 = parts_1.next(); !parts_1_1.done; parts_1_1 = parts_1.next()) {\n var part = parts_1_1.value;\n result.push({\n type: part.type,\n value: part.value,\n unit: unit\n });\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (parts_1_1 && !parts_1_1.done && (_b = parts_1.return)) _b.call(parts_1);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (patternParts_1_1 && !patternParts_1_1.done && (_a = patternParts_1.return)) _a.call(patternParts_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return result;\n}\n\nfunction objectIs(x, y) {\n if (Object.is) {\n return Object.is(x, y);\n } // SameValue algorithm\n\n\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } // Step 6.a: NaN == NaN\n\n\n return x !== x && y !== y;\n}\n\nfunction toString(arg) {\n return arg + '';\n}\n/**\n * PartitionRelativeTimePattern\n * @param rtf\n * @param value\n * @param unit\n */\n\n\nfunction partitionRelativeTimePattern(internalSlotMap, rtf, value, unit) {\n intl_utils_1.invariant(typeof value === 'number', \"value must be number, instead got \" + typeof value, TypeError);\n intl_utils_1.invariant(typeof unit === 'string', \"unit must be number, instead got \" + typeof value, TypeError);\n\n if (isNaN(value) || value === Infinity || value === -Infinity) {\n throw new RangeError(\"Invalid value \" + value);\n }\n\n var resolvedUnit = singularRelativeTimeUnit(unit);\n var fields = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'fields');\n var style = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'style');\n var entry = resolvedUnit;\n\n if (style === 'short') {\n entry = unit + \"-short\";\n } else if (style === 'narrow') {\n entry = unit + \"-narrow\";\n }\n\n if (!(entry in fields)) {\n entry = unit;\n }\n\n var patterns = fields[entry];\n var numeric = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'numeric');\n\n if (numeric === 'auto') {\n if (toString(value) in patterns) {\n return [{\n type: 'literal',\n value: patterns[toString(value)]\n }];\n }\n }\n\n var tl = 'future';\n\n if (objectIs(value, -0) || value < 0) {\n tl = 'past';\n }\n\n var po = patterns[tl];\n var pluralRules = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'pluralRules');\n var numberFormat = intl_utils_1.getInternalSlot(internalSlotMap, rtf, 'numberFormat');\n var fv = typeof numberFormat.formatToParts === 'function' ? numberFormat.formatToParts(Math.abs(value)) : // TODO: If formatToParts is not supported, we assume the whole formatted\n // number is a part\n [{\n type: 'literal',\n value: numberFormat.format(Math.abs(value)),\n unit: unit\n }];\n var pr = pluralRules.select(value);\n var pattern = po[pr];\n return makePartsList(pattern, resolvedUnit, fv);\n}\n\nvar RelativeTimeFormat =\n/** @class */\nfunction () {\n function RelativeTimeFormat(locales, options) {\n // test262/test/intl402/RelativeTimeFormat/constructor/constructor/newtarget-undefined.js\n // Cannot use `new.target` bc of IE11 & TS transpiles it to something else\n var newTarget = this && this instanceof RelativeTimeFormat ? this.constructor : void 0;\n\n if (!newTarget) {\n throw new TypeError(\"Intl.RelativeTimeFormat must be called with 'new'\");\n }\n\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat', true);\n var requestedLocales = intl_utils_1.getCanonicalLocales(locales);\n var opt = Object.create(null);\n var opts = options === undefined ? Object.create(null) : intl_utils_1.toObject(options);\n var matcher = intl_utils_1.getOption(opts, 'localeMatcher', 'string', ['best fit', 'lookup'], 'best fit');\n opt.localeMatcher = matcher;\n var numberingSystem = intl_utils_1.getOption(opts, 'numberingSystem', 'string', undefined, undefined);\n\n if (numberingSystem !== undefined) {\n if (!NUMBERING_SYSTEM_REGEX.test(numberingSystem)) {\n throw new RangeError(\"Invalid numbering system \" + numberingSystem);\n }\n }\n\n opt.nu = numberingSystem;\n var r = intl_utils_1.createResolveLocale(RelativeTimeFormat.getDefaultLocale)(RelativeTimeFormat.availableLocales, requestedLocales, opt, RelativeTimeFormat.relevantExtensionKeys, RelativeTimeFormat.localeData);\n var locale = r.locale,\n nu = r.nu;\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'locale', locale);\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'style', intl_utils_1.getOption(opts, 'style', 'string', ['long', 'narrow', 'short'], 'long'));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numeric', intl_utils_1.getOption(opts, 'numeric', 'string', ['always', 'auto'], 'always'));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'fields', RelativeTimeFormat.localeData[locale]);\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberFormat', new Intl.NumberFormat(locales));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'pluralRules', new Intl.PluralRules(locales));\n intl_utils_1.setInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberingSystem', nu);\n }\n\n RelativeTimeFormat.prototype.format = function (value, unit) {\n if (typeof this !== 'object') {\n throw new TypeError('format was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('format was called on a invalid context');\n }\n\n return partitionRelativeTimePattern(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, Number(value), toString(unit)).map(function (el) {\n return el.value;\n }).join('');\n };\n\n RelativeTimeFormat.prototype.formatToParts = function (value, unit) {\n if (typeof this !== 'object') {\n throw new TypeError('formatToParts was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('formatToParts was called on a invalid context');\n }\n\n return partitionRelativeTimePattern(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, Number(value), toString(unit));\n };\n\n RelativeTimeFormat.prototype.resolvedOptions = function () {\n if (typeof this !== 'object') {\n throw new TypeError('resolvedOptions was called on a non-object');\n }\n\n if (!intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'initializedRelativeTimeFormat')) {\n throw new TypeError('resolvedOptions was called on a invalid context');\n } // test262/test/intl402/RelativeTimeFormat/prototype/resolvedOptions/type.js\n\n\n return {\n locale: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'locale'),\n style: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'style'),\n numeric: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numeric'),\n numberingSystem: intl_utils_1.getInternalSlot(RelativeTimeFormat.__INTERNAL_SLOT_MAP__, this, 'numberingSystem')\n };\n };\n\n RelativeTimeFormat.supportedLocalesOf = function (locales, options) {\n return intl_utils_1.supportedLocales(RelativeTimeFormat.availableLocales, intl_utils_1.getCanonicalLocales(locales), options);\n };\n\n RelativeTimeFormat.__addLocaleData = function () {\n var e_3, _a;\n\n var data = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n data[_i] = arguments[_i];\n }\n\n var _loop_1 = function _loop_1(datum) {\n var availableLocales = Object.keys(__spread(datum.availableLocales, Object.keys(datum.aliases), Object.keys(datum.parentLocales)).reduce(function (all, k) {\n all[k] = true;\n return all;\n }, {}));\n availableLocales.forEach(function (locale) {\n try {\n RelativeTimeFormat.localeData[locale] = unpackData(locale, datum);\n } catch (e) {// If we can't unpack this data, ignore the locale\n }\n });\n };\n\n try {\n for (var data_1 = __values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {\n var datum = data_1_1.value;\n\n _loop_1(datum);\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n RelativeTimeFormat.availableLocales = Object.keys(RelativeTimeFormat.localeData);\n\n if (!RelativeTimeFormat.__defaultLocale) {\n RelativeTimeFormat.__defaultLocale = RelativeTimeFormat.availableLocales[0];\n }\n };\n\n RelativeTimeFormat.getDefaultLocale = function () {\n return RelativeTimeFormat.__defaultLocale;\n };\n\n RelativeTimeFormat.localeData = {};\n RelativeTimeFormat.availableLocales = [];\n RelativeTimeFormat.__defaultLocale = 'en';\n RelativeTimeFormat.relevantExtensionKeys = ['nu'];\n RelativeTimeFormat.polyfilled = true;\n RelativeTimeFormat.__INTERNAL_SLOT_MAP__ = new WeakMap();\n return RelativeTimeFormat;\n}();\n\nexports.default = RelativeTimeFormat;\n\ntry {\n // IE11 does not have Symbol\n if (typeof Symbol !== 'undefined') {\n Object.defineProperty(RelativeTimeFormat.prototype, Symbol.toStringTag, {\n value: 'Intl.RelativeTimeFormat',\n writable: false,\n enumerable: false,\n configurable: true\n });\n } // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/length.js\n\n\n Object.defineProperty(RelativeTimeFormat.prototype.constructor, 'length', {\n value: 0,\n writable: false,\n enumerable: false,\n configurable: true\n }); // https://github.com/tc39/test262/blob/master/test/intl402/RelativeTimeFormat/constructor/supportedLocalesOf/length.js\n\n Object.defineProperty(RelativeTimeFormat.supportedLocalesOf, 'length', {\n value: 1,\n writable: false,\n enumerable: false,\n configurable: true\n });\n} catch (e) {// Meta fix so we're test262-compliant, not important\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9jb3JlLmpzPzcyNDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQixzQkFBc0I7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQzs7QUFFRixtQkFBbUIsbUJBQU8sQ0FBQyxJQUFzQjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0MsSUFBSSxXQUFXLElBQUk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtGQUErRix3QkFBd0I7QUFDdkg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0EseUZBQXlGLGlCQUFpQjtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQUk7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTLFlBQVk7QUFDckI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxpRUFBaUUsZ0JBQWdCO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLFlBQVk7QUFDYiIsImZpbGUiOiI5OTA1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxudmFyIF9fdmFsdWVzID0gdGhpcyAmJiB0aGlzLl9fdmFsdWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIG0gPSBzICYmIG9bc10sXG4gICAgICBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBvICYmIG9baSsrXSxcbiAgICAgICAgZG9uZTogIW9cbiAgICAgIH07XG4gICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuXG52YXIgX19yZWFkID0gdGhpcyAmJiB0aGlzLl9fcmVhZCB8fCBmdW5jdGlvbiAobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufTtcblxudmFyIF9fc3ByZWFkID0gdGhpcyAmJiB0aGlzLl9fc3ByZWFkIHx8IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gYXI7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgaW50bF91dGlsc18xID0gcmVxdWlyZShcIkBmb3JtYXRqcy9pbnRsLXV0aWxzXCIpO1xuXG5mdW5jdGlvbiB1bnBhY2tEYXRhKGxvY2FsZSwgbG9jYWxlRGF0YSkge1xuICB2YXIgbG9jYWxlSGllcmFyY2h5ID0gaW50bF91dGlsc18xLmdldExvY2FsZUhpZXJhcmNoeShsb2NhbGUsIGxvY2FsZURhdGEuYWxpYXNlcywgbG9jYWxlRGF0YS5wYXJlbnRMb2NhbGVzKTtcbiAgdmFyIGRhdGFUb01lcmdlID0gbG9jYWxlSGllcmFyY2h5Lm1hcChmdW5jdGlvbiAobCkge1xuICAgIHJldHVybiBsb2NhbGVEYXRhLmRhdGFbbF07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAoIWRhdGFUb01lcmdlLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIFxcXCJcIiArIGxvY2FsZSArIFwiXFxcIiwgbG9va3VwIGhpZXJhcmNoeTogXCIgKyBsb2NhbGVIaWVyYXJjaHkuam9pbignLCAnKSk7XG4gIH1cblxuICBkYXRhVG9NZXJnZS5yZXZlcnNlKCk7XG4gIHJldHVybiBkYXRhVG9NZXJnZS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgZCkge1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYWxsKSwgZCk7XG4gIH0sIHtcbiAgICBudTogW11cbiAgfSk7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbnRsLXJlbGF0aXZlLXRpbWUvI3NlYy1zaW5ndWxhcnJlbGF0aXZldGltZXVuaXRcbiAqIEBwYXJhbSB1bml0XG4gKi9cblxuXG5mdW5jdGlvbiBzaW5ndWxhclJlbGF0aXZlVGltZVVuaXQodW5pdCkge1xuICBpbnRsX3V0aWxzXzEuaW52YXJpYW50KHR5cGVvZiB1bml0ID09PSAnc3RyaW5nJywgXCJ1bml0IG11c3QgYmUgYSBzdHJpbmcsIGluc3RlYWQgZ290IFwiICsgdHlwZW9mIHVuaXQsIFR5cGVFcnJvcik7XG4gIGlmICh1bml0ID09PSAnc2Vjb25kcycpIHJldHVybiAnc2Vjb25kJztcbiAgaWYgKHVuaXQgPT09ICdtaW51dGVzJykgcmV0dXJuICdtaW51dGUnO1xuICBpZiAodW5pdCA9PT0gJ2hvdXJzJykgcmV0dXJuICdob3VyJztcbiAgaWYgKHVuaXQgPT09ICdkYXlzJykgcmV0dXJuICdkYXknO1xuICBpZiAodW5pdCA9PT0gJ3dlZWtzJykgcmV0dXJuICd3ZWVrJztcbiAgaWYgKHVuaXQgPT09ICdtb250aHMnKSByZXR1cm4gJ21vbnRoJztcbiAgaWYgKHVuaXQgPT09ICdxdWFydGVycycpIHJldHVybiAncXVhcnRlcic7XG4gIGlmICh1bml0ID09PSAneWVhcnMnKSByZXR1cm4gJ3llYXInO1xuXG4gIGlmICh1bml0ICE9PSAnc2Vjb25kJyAmJiB1bml0ICE9PSAnbWludXRlJyAmJiB1bml0ICE9PSAnaG91cicgJiYgdW5pdCAhPT0gJ2RheScgJiYgdW5pdCAhPT0gJ3dlZWsnICYmIHVuaXQgIT09ICdtb250aCcgJiYgdW5pdCAhPT0gJ3F1YXJ0ZXInICYmIHVuaXQgIT09ICd5ZWFyJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB1bml0IFwiICsgdW5pdCk7XG4gIH1cblxuICByZXR1cm4gdW5pdDtcbn1cblxudmFyIE5VTUJFUklOR19TWVNURU1fUkVHRVggPSAvXlthLXowLTldezMsOH0oLVthLXowLTldezMsOH0pKiQvaTtcbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWludGwtcmVsYXRpdmUtdGltZS8jc2VjLW1ha2VwYXJ0c2xpc3RcbiAqIEBwYXJhbSBwYXR0ZXJuXG4gKiBAcGFyYW0gdW5pdFxuICogQHBhcmFtIHBhcnRzXG4gKi9cblxuZnVuY3Rpb24gbWFrZVBhcnRzTGlzdChwYXR0ZXJuLCB1bml0LCBwYXJ0cykge1xuICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcblxuICB2YXIgcGF0dGVyblBhcnRzID0gaW50bF91dGlsc18xLnBhcnRpdGlvblBhdHRlcm4ocGF0dGVybik7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB0cnkge1xuICAgIGZvciAodmFyIHBhdHRlcm5QYXJ0c18xID0gX192YWx1ZXMocGF0dGVyblBhcnRzKSwgcGF0dGVyblBhcnRzXzFfMSA9IHBhdHRlcm5QYXJ0c18xLm5leHQoKTsgIXBhdHRlcm5QYXJ0c18xXzEuZG9uZTsgcGF0dGVyblBhcnRzXzFfMSA9IHBhdHRlcm5QYXJ0c18xLm5leHQoKSkge1xuICAgICAgdmFyIHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzXzFfMS52YWx1ZTtcblxuICAgICAgaWYgKGludGxfdXRpbHNfMS5pc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICAgIHZhbHVlOiBwYXR0ZXJuUGFydC52YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGxfdXRpbHNfMS5pbnZhcmlhbnQocGF0dGVyblBhcnQudHlwZSA9PT0gJzAnLCBcIk1hbGZvcm1lZCBwYXR0ZXJuIFwiICsgcGF0dGVybik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBwYXJ0c18xID0gKGVfMiA9IHZvaWQgMCwgX192YWx1ZXMocGFydHMpKSwgcGFydHNfMV8xID0gcGFydHNfMS5uZXh0KCk7ICFwYXJ0c18xXzEuZG9uZTsgcGFydHNfMV8xID0gcGFydHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBwYXJ0LnR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJ0LnZhbHVlLFxuICAgICAgICAgICAgICB1bml0OiB1bml0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0ge1xuICAgICAgICAgICAgZXJyb3I6IGVfMl8xXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHBhcnRzXzFfMSAmJiAhcGFydHNfMV8xLmRvbmUgJiYgKF9iID0gcGFydHNfMS5yZXR1cm4pKSBfYi5jYWxsKHBhcnRzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlXzFfMSkge1xuICAgIGVfMSA9IHtcbiAgICAgIGVycm9yOiBlXzFfMVxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNfMV8xICYmICFwYXR0ZXJuUGFydHNfMV8xLmRvbmUgJiYgKF9hID0gcGF0dGVyblBhcnRzXzEucmV0dXJuKSkgX2EuY2FsbChwYXR0ZXJuUGFydHNfMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvYmplY3RJcyh4LCB5KSB7XG4gIGlmIChPYmplY3QuaXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmlzKHgsIHkpO1xuICB9IC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cblxuXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cblxuXG4gIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nKGFyZykge1xuICByZXR1cm4gYXJnICsgJyc7XG59XG4vKipcbiAqIFBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm5cbiAqIEBwYXJhbSBydGZcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHVuaXRcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm4oaW50ZXJuYWxTbG90TWFwLCBydGYsIHZhbHVlLCB1bml0KSB7XG4gIGludGxfdXRpbHNfMS5pbnZhcmlhbnQodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJywgXCJ2YWx1ZSBtdXN0IGJlIG51bWJlciwgaW5zdGVhZCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUsIFR5cGVFcnJvcik7XG4gIGludGxfdXRpbHNfMS5pbnZhcmlhbnQodHlwZW9mIHVuaXQgPT09ICdzdHJpbmcnLCBcInVuaXQgbXVzdCBiZSBudW1iZXIsIGluc3RlYWQgZ290IFwiICsgdHlwZW9mIHZhbHVlLCBUeXBlRXJyb3IpO1xuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5IHx8IHZhbHVlID09PSAtSW5maW5pdHkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgXCIgKyB2YWx1ZSk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZWRVbml0ID0gc2luZ3VsYXJSZWxhdGl2ZVRpbWVVbml0KHVuaXQpO1xuICB2YXIgZmllbGRzID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHJ0ZiwgJ2ZpZWxkcycpO1xuICB2YXIgc3R5bGUgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcnRmLCAnc3R5bGUnKTtcbiAgdmFyIGVudHJ5ID0gcmVzb2x2ZWRVbml0O1xuXG4gIGlmIChzdHlsZSA9PT0gJ3Nob3J0Jykge1xuICAgIGVudHJ5ID0gdW5pdCArIFwiLXNob3J0XCI7XG4gIH0gZWxzZSBpZiAoc3R5bGUgPT09ICduYXJyb3cnKSB7XG4gICAgZW50cnkgPSB1bml0ICsgXCItbmFycm93XCI7XG4gIH1cblxuICBpZiAoIShlbnRyeSBpbiBmaWVsZHMpKSB7XG4gICAgZW50cnkgPSB1bml0O1xuICB9XG5cbiAgdmFyIHBhdHRlcm5zID0gZmllbGRzW2VudHJ5XTtcbiAgdmFyIG51bWVyaWMgPSBpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgcnRmLCAnbnVtZXJpYycpO1xuXG4gIGlmIChudW1lcmljID09PSAnYXV0bycpIHtcbiAgICBpZiAodG9TdHJpbmcodmFsdWUpIGluIHBhdHRlcm5zKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICB2YWx1ZTogcGF0dGVybnNbdG9TdHJpbmcodmFsdWUpXVxuICAgICAgfV07XG4gICAgfVxuICB9XG5cbiAgdmFyIHRsID0gJ2Z1dHVyZSc7XG5cbiAgaWYgKG9iamVjdElzKHZhbHVlLCAtMCkgfHwgdmFsdWUgPCAwKSB7XG4gICAgdGwgPSAncGFzdCc7XG4gIH1cblxuICB2YXIgcG8gPSBwYXR0ZXJuc1t0bF07XG4gIHZhciBwbHVyYWxSdWxlcyA9IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBydGYsICdwbHVyYWxSdWxlcycpO1xuICB2YXIgbnVtYmVyRm9ybWF0ID0gaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIHJ0ZiwgJ251bWJlckZvcm1hdCcpO1xuICB2YXIgZnYgPSB0eXBlb2YgbnVtYmVyRm9ybWF0LmZvcm1hdFRvUGFydHMgPT09ICdmdW5jdGlvbicgPyBudW1iZXJGb3JtYXQuZm9ybWF0VG9QYXJ0cyhNYXRoLmFicyh2YWx1ZSkpIDogLy8gVE9ETzogSWYgZm9ybWF0VG9QYXJ0cyBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBhc3N1bWUgdGhlIHdob2xlIGZvcm1hdHRlZFxuICAvLyBudW1iZXIgaXMgYSBwYXJ0XG4gIFt7XG4gICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgIHZhbHVlOiBudW1iZXJGb3JtYXQuZm9ybWF0KE1hdGguYWJzKHZhbHVlKSksXG4gICAgdW5pdDogdW5pdFxuICB9XTtcbiAgdmFyIHByID0gcGx1cmFsUnVsZXMuc2VsZWN0KHZhbHVlKTtcbiAgdmFyIHBhdHRlcm4gPSBwb1twcl07XG4gIHJldHVybiBtYWtlUGFydHNMaXN0KHBhdHRlcm4sIHJlc29sdmVkVW5pdCwgZnYpO1xufVxuXG52YXIgUmVsYXRpdmVUaW1lRm9ybWF0ID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVsYXRpdmVUaW1lRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpIHtcbiAgICAvLyB0ZXN0MjYyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3IvY29uc3RydWN0b3IvbmV3dGFyZ2V0LXVuZGVmaW5lZC5qc1xuICAgIC8vIENhbm5vdCB1c2UgYG5ldy50YXJnZXRgIGJjIG9mIElFMTEgJiBUUyB0cmFuc3BpbGVzIGl0IHRvIHNvbWV0aGluZyBlbHNlXG4gICAgdmFyIG5ld1RhcmdldCA9IHRoaXMgJiYgdGhpcyBpbnN0YW5jZW9mIFJlbGF0aXZlVGltZUZvcm1hdCA/IHRoaXMuY29uc3RydWN0b3IgOiB2b2lkIDA7XG5cbiAgICBpZiAoIW5ld1RhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludGwuUmVsYXRpdmVUaW1lRm9ybWF0IG11c3QgYmUgY2FsbGVkIHdpdGggJ25ldydcIik7XG4gICAgfVxuXG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnLCB0cnVlKTtcbiAgICB2YXIgcmVxdWVzdGVkTG9jYWxlcyA9IGludGxfdXRpbHNfMS5nZXRDYW5vbmljYWxMb2NhbGVzKGxvY2FsZXMpO1xuICAgIHZhciBvcHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBvcHRzID0gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGludGxfdXRpbHNfMS50b09iamVjdChvcHRpb25zKTtcbiAgICB2YXIgbWF0Y2hlciA9IGludGxfdXRpbHNfMS5nZXRPcHRpb24ob3B0cywgJ2xvY2FsZU1hdGNoZXInLCAnc3RyaW5nJywgWydiZXN0IGZpdCcsICdsb29rdXAnXSwgJ2Jlc3QgZml0Jyk7XG4gICAgb3B0LmxvY2FsZU1hdGNoZXIgPSBtYXRjaGVyO1xuICAgIHZhciBudW1iZXJpbmdTeXN0ZW0gPSBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdudW1iZXJpbmdTeXN0ZW0nLCAnc3RyaW5nJywgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKG51bWJlcmluZ1N5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIU5VTUJFUklOR19TWVNURU1fUkVHRVgudGVzdChudW1iZXJpbmdTeXN0ZW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBudW1iZXJpbmcgc3lzdGVtIFwiICsgbnVtYmVyaW5nU3lzdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvcHQubnUgPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgdmFyIHIgPSBpbnRsX3V0aWxzXzEuY3JlYXRlUmVzb2x2ZUxvY2FsZShSZWxhdGl2ZVRpbWVGb3JtYXQuZ2V0RGVmYXVsdExvY2FsZSkoUmVsYXRpdmVUaW1lRm9ybWF0LmF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMsIG9wdCwgUmVsYXRpdmVUaW1lRm9ybWF0LnJlbGV2YW50RXh0ZW5zaW9uS2V5cywgUmVsYXRpdmVUaW1lRm9ybWF0LmxvY2FsZURhdGEpO1xuICAgIHZhciBsb2NhbGUgPSByLmxvY2FsZSxcbiAgICAgICAgbnUgPSByLm51O1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ2xvY2FsZScsIGxvY2FsZSk7XG4gICAgaW50bF91dGlsc18xLnNldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnc3R5bGUnLCBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdzdHlsZScsICdzdHJpbmcnLCBbJ2xvbmcnLCAnbmFycm93JywgJ3Nob3J0J10sICdsb25nJykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWVyaWMnLCBpbnRsX3V0aWxzXzEuZ2V0T3B0aW9uKG9wdHMsICdudW1lcmljJywgJ3N0cmluZycsIFsnYWx3YXlzJywgJ2F1dG8nXSwgJ2Fsd2F5cycpKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdmaWVsZHMnLCBSZWxhdGl2ZVRpbWVGb3JtYXQubG9jYWxlRGF0YVtsb2NhbGVdKTtcbiAgICBpbnRsX3V0aWxzXzEuc2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdudW1iZXJGb3JtYXQnLCBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlcykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ3BsdXJhbFJ1bGVzJywgbmV3IEludGwuUGx1cmFsUnVsZXMobG9jYWxlcykpO1xuICAgIGludGxfdXRpbHNfMS5zZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWJlcmluZ1N5c3RlbScsIG51KTtcbiAgfVxuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlLCB1bml0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0IHdhcyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnRsX3V0aWxzXzEuZ2V0SW50ZXJuYWxTbG90KFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsICdpbml0aWFsaXplZFJlbGF0aXZlVGltZUZvcm1hdCcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmb3JtYXQgd2FzIGNhbGxlZCBvbiBhIGludmFsaWQgY29udGV4dCcpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0aXRpb25SZWxhdGl2ZVRpbWVQYXR0ZXJuKFJlbGF0aXZlVGltZUZvcm1hdC5fX0lOVEVSTkFMX1NMT1RfTUFQX18sIHRoaXMsIE51bWJlcih2YWx1ZSksIHRvU3RyaW5nKHVuaXQpKS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgfSkuam9pbignJyk7XG4gIH07XG5cbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzID0gZnVuY3Rpb24gKHZhbHVlLCB1bml0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0VG9QYXJ0cyB3YXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZm9ybWF0VG9QYXJ0cyB3YXMgY2FsbGVkIG9uIGEgaW52YWxpZCBjb250ZXh0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRpdGlvblJlbGF0aXZlVGltZVBhdHRlcm4oUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgTnVtYmVyKHZhbHVlKSwgdG9TdHJpbmcodW5pdCkpO1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jlc29sdmVkT3B0aW9ucyB3YXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnaW5pdGlhbGl6ZWRSZWxhdGl2ZVRpbWVGb3JtYXQnKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzb2x2ZWRPcHRpb25zIHdhcyBjYWxsZWQgb24gYSBpbnZhbGlkIGNvbnRleHQnKTtcbiAgICB9IC8vIHRlc3QyNjIvdGVzdC9pbnRsNDAyL1JlbGF0aXZlVGltZUZvcm1hdC9wcm90b3R5cGUvcmVzb2x2ZWRPcHRpb25zL3R5cGUuanNcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsZTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnbG9jYWxlJyksXG4gICAgICBzdHlsZTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnc3R5bGUnKSxcbiAgICAgIG51bWVyaWM6IGludGxfdXRpbHNfMS5nZXRJbnRlcm5hbFNsb3QoUmVsYXRpdmVUaW1lRm9ybWF0Ll9fSU5URVJOQUxfU0xPVF9NQVBfXywgdGhpcywgJ251bWVyaWMnKSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogaW50bF91dGlsc18xLmdldEludGVybmFsU2xvdChSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fLCB0aGlzLCAnbnVtYmVyaW5nU3lzdGVtJylcbiAgICB9O1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5zdXBwb3J0ZWRMb2NhbGVzT2YgPSBmdW5jdGlvbiAobG9jYWxlcywgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnRsX3V0aWxzXzEuc3VwcG9ydGVkTG9jYWxlcyhSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcywgaW50bF91dGlsc18xLmdldENhbm9uaWNhbExvY2FsZXMobG9jYWxlcyksIG9wdGlvbnMpO1xuICB9O1xuXG4gIFJlbGF0aXZlVGltZUZvcm1hdC5fX2FkZExvY2FsZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVfMywgX2E7XG5cbiAgICB2YXIgZGF0YSA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGRhdGFbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIF9sb29wXzEoZGF0dW0pIHtcbiAgICAgIHZhciBhdmFpbGFibGVMb2NhbGVzID0gT2JqZWN0LmtleXMoX19zcHJlYWQoZGF0dW0uYXZhaWxhYmxlTG9jYWxlcywgT2JqZWN0LmtleXMoZGF0dW0uYWxpYXNlcyksIE9iamVjdC5rZXlzKGRhdHVtLnBhcmVudExvY2FsZXMpKS5yZWR1Y2UoZnVuY3Rpb24gKGFsbCwgaykge1xuICAgICAgICBhbGxba10gPSB0cnVlO1xuICAgICAgICByZXR1cm4gYWxsO1xuICAgICAgfSwge30pKTtcbiAgICAgIGF2YWlsYWJsZUxvY2FsZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVsYXRpdmVUaW1lRm9ybWF0LmxvY2FsZURhdGFbbG9jYWxlXSA9IHVucGFja0RhdGEobG9jYWxlLCBkYXR1bSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsvLyBJZiB3ZSBjYW4ndCB1bnBhY2sgdGhpcyBkYXRhLCBpZ25vcmUgdGhlIGxvY2FsZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIGRhdGFfMSA9IF9fdmFsdWVzKGRhdGEpLCBkYXRhXzFfMSA9IGRhdGFfMS5uZXh0KCk7ICFkYXRhXzFfMS5kb25lOyBkYXRhXzFfMSA9IGRhdGFfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGRhdHVtID0gZGF0YV8xXzEudmFsdWU7XG5cbiAgICAgICAgX2xvb3BfMShkYXR1bSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZV8zXzEpIHtcbiAgICAgIGVfMyA9IHtcbiAgICAgICAgZXJyb3I6IGVfM18xXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZGF0YV8xXzEgJiYgIWRhdGFfMV8xLmRvbmUgJiYgKF9hID0gZGF0YV8xLnJldHVybikpIF9hLmNhbGwoZGF0YV8xKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcyA9IE9iamVjdC5rZXlzKFJlbGF0aXZlVGltZUZvcm1hdC5sb2NhbGVEYXRhKTtcblxuICAgIGlmICghUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZSkge1xuICAgICAgUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZSA9IFJlbGF0aXZlVGltZUZvcm1hdC5hdmFpbGFibGVMb2NhbGVzWzBdO1xuICAgIH1cbiAgfTtcblxuICBSZWxhdGl2ZVRpbWVGb3JtYXQuZ2V0RGVmYXVsdExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVsYXRpdmVUaW1lRm9ybWF0Ll9fZGVmYXVsdExvY2FsZTtcbiAgfTtcblxuICBSZWxhdGl2ZVRpbWVGb3JtYXQubG9jYWxlRGF0YSA9IHt9O1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuYXZhaWxhYmxlTG9jYWxlcyA9IFtdO1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuX19kZWZhdWx0TG9jYWxlID0gJ2VuJztcbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnJlbGV2YW50RXh0ZW5zaW9uS2V5cyA9IFsnbnUnXTtcbiAgUmVsYXRpdmVUaW1lRm9ybWF0LnBvbHlmaWxsZWQgPSB0cnVlO1xuICBSZWxhdGl2ZVRpbWVGb3JtYXQuX19JTlRFUk5BTF9TTE9UX01BUF9fID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIFJlbGF0aXZlVGltZUZvcm1hdDtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUmVsYXRpdmVUaW1lRm9ybWF0O1xuXG50cnkge1xuICAvLyBJRTExIGRvZXMgbm90IGhhdmUgU3ltYm9sXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZVRpbWVGb3JtYXQucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgIHZhbHVlOiAnSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQnLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3IvbGVuZ3RoLmpzXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpdmVUaW1lRm9ybWF0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pOyAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS90ZXN0MjYyL2Jsb2IvbWFzdGVyL3Rlc3QvaW50bDQwMi9SZWxhdGl2ZVRpbWVGb3JtYXQvY29uc3RydWN0b3Ivc3VwcG9ydGVkTG9jYWxlc09mL2xlbmd0aC5qc1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZVRpbWVGb3JtYXQuc3VwcG9ydGVkTG9jYWxlc09mLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAxLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59IGNhdGNoIChlKSB7Ly8gTWV0YSBmaXggc28gd2UncmUgdGVzdDI2Mi1jb21wbGlhbnQsIG5vdCBpbXBvcnRhbnRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9905\n")},8079:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "en-001": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n }\n },\n "en-150": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yr"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yr ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo",\n "other": "in {0} mo"\n },\n "past": {\n "one": "{0} mo ago",\n "other": "{0} mo ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wk"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wk ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hr"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hr ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min",\n "other": "in {0} min"\n },\n "past": {\n "one": "{0} min ago",\n "other": "{0} min ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec",\n "other": "in {0} sec"\n },\n "past": {\n "one": "{0} sec ago",\n "other": "{0} sec ago"\n }\n }\n },\n "en-AU": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yrs"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yrs ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr",\n "other": "in {0} yrs"\n },\n "past": {\n "one": "{0} yr ago",\n "other": "{0} yrs ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "in {0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wks"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wks ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk",\n "other": "in {0} wks"\n },\n "past": {\n "one": "{0} wk ago",\n "other": "{0} wks ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hrs"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hrs ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr",\n "other": "in {0} hrs"\n },\n "past": {\n "one": "{0} hr ago",\n "other": "{0} hrs ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins"\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins"\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs"\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs"\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs ago"\n }\n }\n },\n "en-CA": {\n "year-short": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yrs."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yrs. ago"\n },\n "-1": "last yr"\n },\n "year-narrow": {\n "0": "this yr",\n "1": "next yr",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yrs."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yrs. ago"\n },\n "-1": "last yr"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "month-short": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mos."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mos. ago"\n },\n "-1": "last mo"\n },\n "month-narrow": {\n "0": "this mo",\n "1": "next mo",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mos."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mos. ago"\n },\n "-1": "last mo"\n },\n "week-short": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wks."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wks. ago"\n },\n "-1": "last wk"\n },\n "week-narrow": {\n "0": "this wk",\n "1": "next wk",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wks."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wks. ago"\n },\n "-1": "last wk"\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hrs."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hrs. ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hrs."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hrs. ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins. ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} mins."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} mins. ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs. ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} secs."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} secs. ago"\n }\n }\n },\n "en-SG": {\n "quarter-short": {\n "0": "this qtr",\n "1": "next qtr",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtrs"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtrs ago"\n },\n "-1": "last qtr"\n },\n "quarter-narrow": {\n "0": "this qtr",\n "1": "next qtr",\n "future": {\n "one": "in {0} qtr",\n "other": "in {0} qtr"\n },\n "past": {\n "one": "{0} qtr ago",\n "other": "{0} qtr ago"\n },\n "-1": "last qtr"\n },\n "month-short": {\n "0": "this mth",\n "1": "next mth",\n "future": {\n "one": "in {0} mth",\n "other": "in {0} mth"\n },\n "past": {\n "one": "{0} mth ago",\n "other": "{0} mth ago"\n },\n "-1": "last mth"\n }\n },\n "en": {\n "nu": ["latn"],\n "year": {\n "0": "this year",\n "1": "next year",\n "future": {\n "one": "in {0} year",\n "other": "in {0} years"\n },\n "past": {\n "one": "{0} year ago",\n "other": "{0} years ago"\n },\n "-1": "last year"\n },\n "year-short": {\n "0": "this yr.",\n "1": "next yr.",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yr."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yr. ago"\n },\n "-1": "last yr."\n },\n "year-narrow": {\n "0": "this yr.",\n "1": "next yr.",\n "future": {\n "one": "in {0} yr.",\n "other": "in {0} yr."\n },\n "past": {\n "one": "{0} yr. ago",\n "other": "{0} yr. ago"\n },\n "-1": "last yr."\n },\n "quarter": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "one": "in {0} quarter",\n "other": "in {0} quarters"\n },\n "past": {\n "one": "{0} quarter ago",\n "other": "{0} quarters ago"\n },\n "-1": "last quarter"\n },\n "quarter-short": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "quarter-narrow": {\n "0": "this qtr.",\n "1": "next qtr.",\n "future": {\n "one": "in {0} qtr.",\n "other": "in {0} qtrs."\n },\n "past": {\n "one": "{0} qtr. ago",\n "other": "{0} qtrs. ago"\n },\n "-1": "last qtr."\n },\n "month": {\n "0": "this month",\n "1": "next month",\n "future": {\n "one": "in {0} month",\n "other": "in {0} months"\n },\n "past": {\n "one": "{0} month ago",\n "other": "{0} months ago"\n },\n "-1": "last month"\n },\n "month-short": {\n "0": "this mo.",\n "1": "next mo.",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo."\n },\n "month-narrow": {\n "0": "this mo.",\n "1": "next mo.",\n "future": {\n "one": "in {0} mo.",\n "other": "in {0} mo."\n },\n "past": {\n "one": "{0} mo. ago",\n "other": "{0} mo. ago"\n },\n "-1": "last mo."\n },\n "week": {\n "0": "this week",\n "1": "next week",\n "future": {\n "one": "in {0} week",\n "other": "in {0} weeks"\n },\n "past": {\n "one": "{0} week ago",\n "other": "{0} weeks ago"\n },\n "-1": "last week"\n },\n "week-short": {\n "0": "this wk.",\n "1": "next wk.",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wk."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wk. ago"\n },\n "-1": "last wk."\n },\n "week-narrow": {\n "0": "this wk.",\n "1": "next wk.",\n "future": {\n "one": "in {0} wk.",\n "other": "in {0} wk."\n },\n "past": {\n "one": "{0} wk. ago",\n "other": "{0} wk. ago"\n },\n "-1": "last wk."\n },\n "day": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "day-short": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "day-narrow": {\n "0": "today",\n "1": "tomorrow",\n "future": {\n "one": "in {0} day",\n "other": "in {0} days"\n },\n "past": {\n "one": "{0} day ago",\n "other": "{0} days ago"\n },\n "-1": "yesterday"\n },\n "hour": {\n "0": "this hour",\n "future": {\n "one": "in {0} hour",\n "other": "in {0} hours"\n },\n "past": {\n "one": "{0} hour ago",\n "other": "{0} hours ago"\n }\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hr."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hr. ago"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "one": "in {0} hr.",\n "other": "in {0} hr."\n },\n "past": {\n "one": "{0} hr. ago",\n "other": "{0} hr. ago"\n }\n },\n "minute": {\n "0": "this minute",\n "future": {\n "one": "in {0} minute",\n "other": "in {0} minutes"\n },\n "past": {\n "one": "{0} minute ago",\n "other": "{0} minutes ago"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} min."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} min. ago"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "one": "in {0} min.",\n "other": "in {0} min."\n },\n "past": {\n "one": "{0} min. ago",\n "other": "{0} min. ago"\n }\n },\n "second": {\n "0": "now",\n "future": {\n "one": "in {0} second",\n "other": "in {0} seconds"\n },\n "past": {\n "one": "{0} second ago",\n "other": "{0} seconds ago"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} sec."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} sec. ago"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "one": "in {0} sec.",\n "other": "in {0} sec."\n },\n "past": {\n "one": "{0} sec. ago",\n "other": "{0} sec. ago"\n }\n }\n }\n },\n "availableLocales": ["en-001", "en-150", "en-AE", "en-AG", "en-AI", "en-AS", "en-AT", "en-AU", "en-BB", "en-BE", "en-BI", "en-BM", "en-BS", "en-BW", "en-BZ", "en-CA", "en-CC", "en-CH", "en-CK", "en-CM", "en-CX", "en-CY", "en-DE", "en-DG", "en-DK", "en-DM", "en-ER", "en-FI", "en-FJ", "en-FK", "en-FM", "en-GB", "en-GD", "en-GG", "en-GH", "en-GI", "en-GM", "en-GU", "en-GY", "en-HK", "en-IE", "en-IL", "en-IM", "en-IN", "en-IO", "en-JE", "en-JM", "en-KE", "en-KI", "en-KN", "en-KY", "en-LC", "en-LR", "en-LS", "en-MG", "en-MH", "en-MO", "en-MP", "en-MS", "en-MT", "en-MU", "en-MW", "en-MY", "en-NA", "en-NF", "en-NG", "en-NL", "en-NR", "en-NU", "en-NZ", "en-PG", "en-PH", "en-PK", "en-PN", "en-PR", "en-PW", "en-RW", "en-SB", "en-SC", "en-SD", "en-SE", "en-SG", "en-SH", "en-SI", "en-SL", "en-SS", "en-SX", "en-SZ", "en-TC", "en-TK", "en-TO", "en-TT", "en-TV", "en-TZ", "en-UG", "en-UM", "en-US-POSIX", "en-US", "en-VC", "en-VG", "en-VI", "en-VU", "en-WS", "en-ZA", "en-ZM", "en-ZW", "en"],\n "aliases": {},\n "parentLocales": {\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150"\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9lbi5qcz8zZTMyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QixXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsMEJBQTBCLEVBQUU7QUFDNUIsV0FBVztBQUNYO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIsdUJBQXVCLEVBQUU7QUFDekIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHVCQUF1QixFQUFFO0FBQ3pCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsRUFBRTtBQUMxQiwwQkFBMEIsRUFBRTtBQUM1QixXQUFXO0FBQ1g7QUFDQSxxQkFBcUIsRUFBRTtBQUN2Qix1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjgwNzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCAmJiB0eXBlb2YgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZW4tMDAxXCI6IHtcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5clwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlyIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbW9cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG1vXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtbyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2sgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2tcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2tcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3ayBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2tcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1pbiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tMTUwXCI6IHtcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5clwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlyIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0clwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHIgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbW9cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG1vXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtbyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2sgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2tcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2tcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3ayBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2tcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBociBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHIgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1pbiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2VjXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tQVVcIjoge1xuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0geXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0geXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0cnNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXRycyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtby5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbW8uIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtby5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG1vLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbW8uIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3a1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBoclwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBocnNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBocnMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGhyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gaHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGhycyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1pbnV0ZS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gc2VjLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWNzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBzZWNzIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gc2VjLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gc2VjcyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZW4tQ0FcIjoge1xuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHlyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXJzLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB5clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5cnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHlycy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF0ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0ci5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHF0cnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBxdHJzLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0ci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdHIuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtby5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbW9zLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtb3MuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtb3MuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtby4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vcy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHdrXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3a1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHdrLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3a3MuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB3ay4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrcy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdrXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3a1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2tcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3ay5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2tzLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2suIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB3a3MuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3a1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHJzLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IGhyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gaHJzLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbWluLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW5zLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWlucy4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtaW51dGVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBtaW4uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1pbnMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW4uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtaW5zLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjcy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY3MuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlYy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjcy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY3MuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlbi1TR1wiOiB7XG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF0clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0clwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0clwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBxdHJcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBxdHIgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0ciBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgcXRyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtdGhcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IG10aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG10aFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtdGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IG10aCBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbXRoIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBtdGhcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlblwiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHllYXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHllYXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB5ZWFyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHllYXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB5ZWFyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB5ZWFycyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB5ci5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHlyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHlyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB5ci5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHlyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0geXIuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB5ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHlyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeXIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0geXIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHlyLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0geXIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSB5ci4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHlyLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdWFydGVyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdWFydGVyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXVhcnRlclwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdWFydGVyc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXVhcnRlciBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXVhcnRlcnMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgcXRyLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgcXRyLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHF0ci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gcXRycy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHF0ci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHF0cnMuIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdHIuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdHIuXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdHIuXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gcXRyLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBxdHJzLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gcXRyLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gcXRycy4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF0ci5cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1vbnRoXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vbnRoc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW9udGggYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1vbnRocyBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW8uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW8uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtby4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vLlwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW8uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gbW8uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IG1vLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbW8uIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBtby4gYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3ZWVrXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3ZWVrXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gd2Vla1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3ZWVrc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gd2VlayBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gd2Vla3MgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdlZWtcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2suXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCB3ay5cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSB3ay5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gd2suXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSB3ay4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHdrLiBhZ29cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2suXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyB3ay5cIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdrLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHdrLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSB3ay5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHdrLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gd2suIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCB3ay5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheVwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidG9kYXlcIixcbiAgICAgICAgICBcIjFcIjogXCJ0b21vcnJvd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGRheVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBkYXlzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBkYXkgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGRheXMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJ5ZXN0ZXJkYXlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidG9kYXlcIixcbiAgICAgICAgICBcIjFcIjogXCJ0b21vcnJvd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IGRheVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBkYXlzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBkYXkgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGRheXMgYWdvXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJ5ZXN0ZXJkYXlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRvZGF5XCIsXG4gICAgICAgICAgXCIxXCI6IFwidG9tb3Jyb3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBkYXlcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gZGF5c1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gZGF5IGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBkYXlzIGFnb1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwieWVzdGVyZGF5XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBob3VyXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhvdXJzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBob3VyIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBob3VycyBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBoci5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gaHIuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBoci4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IGhyLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBob3VyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gaHIuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IGhyLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gaHIuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBoci4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbnV0ZVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBtaW51dGVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBtaW51dGUgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IG1pbnV0ZXMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbi5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbWluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IG1pbi5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJpbiB7MH0gbWluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJ7MH0gbWluLiBhZ29cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJ7MH0gbWluLiBhZ29cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIm5vd1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaW4gezB9IHNlY29uZFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWNvbmRzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWNvbmQgYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlY29uZHMgYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImluIHswfSBzZWMuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaW4gezB9IHNlYy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiezB9IHNlYy4gYWdvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiezB9IHNlYy4gYWdvXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJpbiB7MH0gc2VjLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImluIHswfSBzZWMuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcInswfSBzZWMuIGFnb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcInswfSBzZWMuIGFnb1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImF2YWlsYWJsZUxvY2FsZXNcIjogW1wiZW4tMDAxXCIsIFwiZW4tMTUwXCIsIFwiZW4tQUVcIiwgXCJlbi1BR1wiLCBcImVuLUFJXCIsIFwiZW4tQVNcIiwgXCJlbi1BVFwiLCBcImVuLUFVXCIsIFwiZW4tQkJcIiwgXCJlbi1CRVwiLCBcImVuLUJJXCIsIFwiZW4tQk1cIiwgXCJlbi1CU1wiLCBcImVuLUJXXCIsIFwiZW4tQlpcIiwgXCJlbi1DQVwiLCBcImVuLUNDXCIsIFwiZW4tQ0hcIiwgXCJlbi1DS1wiLCBcImVuLUNNXCIsIFwiZW4tQ1hcIiwgXCJlbi1DWVwiLCBcImVuLURFXCIsIFwiZW4tREdcIiwgXCJlbi1ES1wiLCBcImVuLURNXCIsIFwiZW4tRVJcIiwgXCJlbi1GSVwiLCBcImVuLUZKXCIsIFwiZW4tRktcIiwgXCJlbi1GTVwiLCBcImVuLUdCXCIsIFwiZW4tR0RcIiwgXCJlbi1HR1wiLCBcImVuLUdIXCIsIFwiZW4tR0lcIiwgXCJlbi1HTVwiLCBcImVuLUdVXCIsIFwiZW4tR1lcIiwgXCJlbi1IS1wiLCBcImVuLUlFXCIsIFwiZW4tSUxcIiwgXCJlbi1JTVwiLCBcImVuLUlOXCIsIFwiZW4tSU9cIiwgXCJlbi1KRVwiLCBcImVuLUpNXCIsIFwiZW4tS0VcIiwgXCJlbi1LSVwiLCBcImVuLUtOXCIsIFwiZW4tS1lcIiwgXCJlbi1MQ1wiLCBcImVuLUxSXCIsIFwiZW4tTFNcIiwgXCJlbi1NR1wiLCBcImVuLU1IXCIsIFwiZW4tTU9cIiwgXCJlbi1NUFwiLCBcImVuLU1TXCIsIFwiZW4tTVRcIiwgXCJlbi1NVVwiLCBcImVuLU1XXCIsIFwiZW4tTVlcIiwgXCJlbi1OQVwiLCBcImVuLU5GXCIsIFwiZW4tTkdcIiwgXCJlbi1OTFwiLCBcImVuLU5SXCIsIFwiZW4tTlVcIiwgXCJlbi1OWlwiLCBcImVuLVBHXCIsIFwiZW4tUEhcIiwgXCJlbi1QS1wiLCBcImVuLVBOXCIsIFwiZW4tUFJcIiwgXCJlbi1QV1wiLCBcImVuLVJXXCIsIFwiZW4tU0JcIiwgXCJlbi1TQ1wiLCBcImVuLVNEXCIsIFwiZW4tU0VcIiwgXCJlbi1TR1wiLCBcImVuLVNIXCIsIFwiZW4tU0lcIiwgXCJlbi1TTFwiLCBcImVuLVNTXCIsIFwiZW4tU1hcIiwgXCJlbi1TWlwiLCBcImVuLVRDXCIsIFwiZW4tVEtcIiwgXCJlbi1UT1wiLCBcImVuLVRUXCIsIFwiZW4tVFZcIiwgXCJlbi1UWlwiLCBcImVuLVVHXCIsIFwiZW4tVU1cIiwgXCJlbi1VUy1QT1NJWFwiLCBcImVuLVVTXCIsIFwiZW4tVkNcIiwgXCJlbi1WR1wiLCBcImVuLVZJXCIsIFwiZW4tVlVcIiwgXCJlbi1XU1wiLCBcImVuLVpBXCIsIFwiZW4tWk1cIiwgXCJlbi1aV1wiLCBcImVuXCJdLFxuICAgIFwiYWxpYXNlc1wiOiB7fSxcbiAgICBcInBhcmVudExvY2FsZXNcIjoge1xuICAgICAgXCJlbi0xNTBcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQUlcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQVVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQkJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQlNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQlpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0FcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ0tcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ01cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ1hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQ1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tREdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRE1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRVJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRkpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRktcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tRk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0JcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0RcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0dcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR0lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR01cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tR1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSUVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSUxcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU5cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSU9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSkVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tSk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS0VcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS0lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS05cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tS1lcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTENcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTFJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTFNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTU9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVRcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTVlcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkFcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkZcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTkdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlJcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tTlpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEhcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUE5cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUFdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tUldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0JcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0RcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0dcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU0xcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1hcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tU1pcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVENcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVEtcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVE9cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFRcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFZcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVFpcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVUdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVkNcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVkdcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tVlVcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tV1NcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWkFcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWk1cIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tWldcIjogXCJlbi0wMDFcIixcbiAgICAgIFwiZW4tQVRcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tQkVcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tQ0hcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tREVcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tREtcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tRklcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tTkxcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tU0VcIjogXCJlbi0xNTBcIixcbiAgICAgIFwiZW4tU0lcIjogXCJlbi0xNTBcIlxuICAgIH1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8079\n')},4033:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "es-419": {\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n },\n "week-narrow": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n }\n },\n "es-AR": {\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} días",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} días",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} días",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} días",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n }\n },\n "es-MX": {\n "year": {\n "0": "este año",\n "1": "el año próximo",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "year-short": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "en {0} a",\n "other": "en {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "year-narrow": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "en {0} a",\n "other": "en {0} a"\n },\n "past": {\n "one": "-{0} a",\n "other": "-{0} a"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trimestre",\n "other": "dentro de {0} trimetres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "quarter-short": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trim.",\n "other": "en {0} trim"\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "quarter-narrow": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "en {0} trim.",\n "other": "en {0} trim."\n },\n "past": {\n "one": "-{0} T",\n "other": "-{0} T"\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el mes próximo",\n "future": {\n "one": "en {0} mes",\n "other": "en {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "month-short": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "en {0} m",\n "other": "en {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "month-narrow": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "+{0} m",\n "other": "+{0} m"\n },\n "past": {\n "one": "-{0} m",\n "other": "-{0} m"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la semana próxima",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n },\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "en {0} sem.",\n "other": "en {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. pas."\n },\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "en {0} día",\n "other": "en {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "+{0} día",\n "other": "en {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "hour-short": {\n "0": "esta hora",\n "future": {\n "one": "en {0} h",\n "other": "en {0} n"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "minute-short": {\n "0": "este minuto",\n "future": {\n "one": "en {0} min",\n "other": "en {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "minute-narrow": {\n "0": "este minuto",\n "future": {\n "one": "en {0} min",\n "other": "en {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "en {0} s",\n "other": "en {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "+{0} s",\n "other": "+{0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n }\n },\n "es-PY": {\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} seg.",\n "other": "dentro de {0} seg."\n },\n "past": {\n "one": "hace {0} seg.",\n "other": "hace {0} seg."\n }\n }\n },\n "es-SV": {\n "day": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "antier",\n "-1": "ayer"\n }\n },\n "es-US": {\n "year": {\n "0": "este año",\n "1": "el año próximo",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trimetre",\n "other": "dentro de {0} trimetres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el mes próximo",\n "future": {\n "one": "dentro de {0} mes",\n "other": "dentro de {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la semana próxima",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n }\n },\n "es": {\n "nu": ["latn"],\n "year": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} año",\n "other": "dentro de {0} años"\n },\n "past": {\n "one": "hace {0} año",\n "other": "hace {0} años"\n },\n "-1": "el año pasado"\n },\n "year-short": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} a",\n "other": "dentro de {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "year-narrow": {\n "0": "este año",\n "1": "el próximo año",\n "future": {\n "one": "dentro de {0} a",\n "other": "dentro de {0} a"\n },\n "past": {\n "one": "hace {0} a",\n "other": "hace {0} a"\n },\n "-1": "el año pasado"\n },\n "quarter": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trimestre",\n "other": "dentro de {0} trimestres"\n },\n "past": {\n "one": "hace {0} trimestre",\n "other": "hace {0} trimestres"\n },\n "-1": "el trimestre pasado"\n },\n "quarter-short": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trim.",\n "other": "dentro de {0} trim."\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "quarter-narrow": {\n "0": "este trimestre",\n "1": "el próximo trimestre",\n "future": {\n "one": "dentro de {0} trim.",\n "other": "dentro de {0} trim."\n },\n "past": {\n "one": "hace {0} trim.",\n "other": "hace {0} trim."\n },\n "-1": "el trimestre pasado"\n },\n "month": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} mes",\n "other": "dentro de {0} meses"\n },\n "past": {\n "one": "hace {0} mes",\n "other": "hace {0} meses"\n },\n "-1": "el mes pasado"\n },\n "month-short": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} m",\n "other": "dentro de {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "month-narrow": {\n "0": "este mes",\n "1": "el próximo mes",\n "future": {\n "one": "dentro de {0} m",\n "other": "dentro de {0} m"\n },\n "past": {\n "one": "hace {0} m",\n "other": "hace {0} m"\n },\n "-1": "el mes pasado"\n },\n "week": {\n "0": "esta semana",\n "1": "la próxima semana",\n "future": {\n "one": "dentro de {0} semana",\n "other": "dentro de {0} semanas"\n },\n "past": {\n "one": "hace {0} semana",\n "other": "hace {0} semanas"\n },\n "-1": "la semana pasada"\n },\n "week-short": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. ant."\n },\n "week-narrow": {\n "0": "esta sem.",\n "1": "próx. sem.",\n "future": {\n "one": "dentro de {0} sem.",\n "other": "dentro de {0} sem."\n },\n "past": {\n "one": "hace {0} sem.",\n "other": "hace {0} sem."\n },\n "-1": "sem. ant."\n },\n "day": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-short": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "day-narrow": {\n "0": "hoy",\n "1": "mañana",\n "2": "pasado mañana",\n "future": {\n "one": "dentro de {0} día",\n "other": "dentro de {0} días"\n },\n "past": {\n "one": "hace {0} día",\n "other": "hace {0} días"\n },\n "-2": "anteayer",\n "-1": "ayer"\n },\n "hour": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} hora",\n "other": "dentro de {0} horas"\n },\n "past": {\n "one": "hace {0} hora",\n "other": "hace {0} horas"\n }\n },\n "hour-short": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} h",\n "other": "dentro de {0} h"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "hour-narrow": {\n "0": "esta hora",\n "future": {\n "one": "dentro de {0} h",\n "other": "dentro de {0} h"\n },\n "past": {\n "one": "hace {0} h",\n "other": "hace {0} h"\n }\n },\n "minute": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} minuto",\n "other": "dentro de {0} minutos"\n },\n "past": {\n "one": "hace {0} minuto",\n "other": "hace {0} minutos"\n }\n },\n "minute-short": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} min",\n "other": "dentro de {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "minute-narrow": {\n "0": "este minuto",\n "future": {\n "one": "dentro de {0} min",\n "other": "dentro de {0} min"\n },\n "past": {\n "one": "hace {0} min",\n "other": "hace {0} min"\n }\n },\n "second": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} segundo",\n "other": "dentro de {0} segundos"\n },\n "past": {\n "one": "hace {0} segundo",\n "other": "hace {0} segundos"\n }\n },\n "second-short": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} s",\n "other": "dentro de {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n },\n "second-narrow": {\n "0": "ahora",\n "future": {\n "one": "dentro de {0} s",\n "other": "dentro de {0} s"\n },\n "past": {\n "one": "hace {0} s",\n "other": "hace {0} s"\n }\n }\n }\n },\n "availableLocales": ["es-419", "es-AR", "es-BO", "es-BR", "es-BZ", "es-CL", "es-CO", "es-CR", "es-CU", "es-DO", "es-EA", "es-EC", "es-GQ", "es-GT", "es-HN", "es-IC", "es-MX", "es-NI", "es-PA", "es-PE", "es-PH", "es-PR", "es-PY", "es-SV", "es-US", "es-UY", "es-VE", "es"],\n "aliases": {},\n "parentLocales": {\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419"\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9lcy5qcz9mY2VlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHNCQUFzQixFQUFFO0FBQ3hCLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLDBCQUEwQixFQUFFO0FBQzVCLFdBQVc7QUFDWDtBQUNBLHNCQUFzQixFQUFFO0FBQ3hCLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsV0FBVztBQUNYO0FBQ0EsMEJBQTBCLEVBQUU7QUFDNUIsNEJBQTRCLEVBQUU7QUFDOUIsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLFdBQVc7QUFDWDtBQUNBLDBCQUEwQixFQUFFO0FBQzVCLDRCQUE0QixFQUFFO0FBQzlCLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QixXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsRUFBRTtBQUNqQyxpQ0FBaUMsRUFBRTtBQUNuQyxXQUFXO0FBQ1g7QUFDQSwwQkFBMEIsRUFBRTtBQUM1Qiw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQwMzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmlmIChJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCAmJiB0eXBlb2YgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuX19hZGRMb2NhbGVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSh7XG4gICAgXCJkYXRhXCI6IHtcbiAgICAgIFwiZXMtNDE5XCI6IHtcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlcy1BUlwiOiB7XG4gICAgICAgIFwiZGF5LXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGVheWVyXCIsXG4gICAgICAgICAgXCItMVwiOiBcImF5ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBkw61hc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWcuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VnLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc2VnLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gc2VnLlwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlcy1NWFwiOiB7XG4gICAgICAgIFwieWVhclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBhw7FvXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgYcOxbyBwcsOzeGltb1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBhw7FvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBhw7Fvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBhw7FvXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gYcOxb3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIGHDsW8gcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5ZWFyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIGHDsW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiLXswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBhXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1ldHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltZXN0cmVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IHRyaW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IHRyaW1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgdHJpbWVzdHJlXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gdHJpbWVzdHJlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiLXswfSBUXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBUXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtZXNcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBtZXMgcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBtZXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGgtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcIi17MH0gbVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBzZW1hbmFcIixcbiAgICAgICAgICBcIjFcIjogXCJsYSBzZW1hbmEgcHLDs3hpbWFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlbWFuYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhIHNlbWFuYSBwYXNhZGFcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGEgc2VtLlwiLFxuICAgICAgICAgIFwiMVwiOiBcInByw7N4LiBzZW0uXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gc2VtLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIHBhcy5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiaG95XCIsXG4gICAgICAgICAgXCIxXCI6IFwibWHDsWFuYVwiLFxuICAgICAgICAgIFwiMlwiOiBcInBhc2FkbyBtYcOxYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGVheWVyXCIsXG4gICAgICAgICAgXCItMVwiOiBcImF5ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJlbiB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBoXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZW4gezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImVuIHswfSBtaW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWluXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWluXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtaW51dG9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJlbiB7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IG1pblwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IG1pblwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImVuIHswfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZW4gezB9IHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiK3swfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVzLVBZXCI6IHtcbiAgICAgICAgXCJzZWNvbmQtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNlZy5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc2VnLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlZy5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmQtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJhaG9yYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZWcuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZy5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWcuXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVzLVNWXCI6IHtcbiAgICAgICAgXCJkYXlcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImhveVwiLFxuICAgICAgICAgIFwiMVwiOiBcIm1hw7FhbmFcIixcbiAgICAgICAgICBcIjJcIjogXCJwYXNhZG8gbWHDsWFuYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBkw61hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMlwiOiBcImFudGllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZXMtVVNcIjoge1xuICAgICAgICBcInllYXJcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIGHDsW8gcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gYcOxb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gYcOxb3NcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gYcOxb1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGHDsW9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBhw7FvIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gdHJpbWV0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1ldHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltZXN0cmVzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCB0cmltZXN0cmUgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSBtZXNcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBtZXMgcHLDs3hpbW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBtZXNlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtZXNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtZXNlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgbWVzIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBzZW1hbmFcIixcbiAgICAgICAgICBcIjFcIjogXCJsYSBzZW1hbmEgcHLDs3hpbWFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNlbWFuYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhIHNlbWFuYSBwYXNhZGFcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlc1wiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGHDsW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGHDsW9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGHDsW9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBhw7Fvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgYcOxbyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgYcOxb1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIGHDsW9cIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gYVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBhXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gYVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgYcOxbyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIGHDsW9cIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyBhw7FvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGFcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIGHDsW8gcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSB0cmltZXN0cmVcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW1lc3RyZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbWVzdHJlXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gdHJpbWVzdHJlc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0ZSB0cmltZXN0cmVcIixcbiAgICAgICAgICBcIjFcIjogXCJlbCBwcsOzeGltbyB0cmltZXN0cmVcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHRyaW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHRyaW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIHRyaW1lc3RyZSBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIHRyaW1lc3RyZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSB0cmltLlwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gdHJpbS5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gdHJpbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSB0cmltLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiZWwgdHJpbWVzdHJlIHBhc2Fkb1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWVzXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gbWVzXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1lc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbWVzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gbWVzZXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1lc1wiLFxuICAgICAgICAgIFwiMVwiOiBcImVsIHByw7N4aW1vIG1lc1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJlbCBtZXMgcGFzYWRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb250aC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWVzXCIsXG4gICAgICAgICAgXCIxXCI6IFwiZWwgcHLDs3hpbW8gbWVzXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gbVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImVsIG1lcyBwYXNhZG9cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGEgc2VtYW5hXCIsXG4gICAgICAgICAgXCIxXCI6IFwibGEgcHLDs3hpbWEgc2VtYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlbWFuYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc2VtYW5hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzZW1hbmFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW1hbmFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYSBzZW1hbmEgcGFzYWRhXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIGFudC5cIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIHNlbS5cIixcbiAgICAgICAgICBcIjFcIjogXCJwcsOzeC4gc2VtLlwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiZGVudHJvIGRlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlbS5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZW0uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJzZW0uIGFudC5cIlxuICAgICAgICB9LFxuICAgICAgICBcImRheVwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiaG95XCIsXG4gICAgICAgICAgXCIxXCI6IFwibWHDsWFuYVwiLFxuICAgICAgICAgIFwiMlwiOiBcInBhc2FkbyBtYcOxYW5hXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IGTDrWFcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBkw61hc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0yXCI6IFwiYW50ZWF5ZXJcIixcbiAgICAgICAgICBcIi0xXCI6IFwiYXllclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF5LXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTJcIjogXCJhbnRlYXllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXktbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJob3lcIixcbiAgICAgICAgICBcIjFcIjogXCJtYcOxYW5hXCIsXG4gICAgICAgICAgXCIyXCI6IFwicGFzYWRvIG1hw7FhbmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gZMOtYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gZMOtYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGTDrWFzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTJcIjogXCJhbnRlYXllclwiLFxuICAgICAgICAgIFwiLTFcIjogXCJheWVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RhIGhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gaG9yYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gaG9yYXNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaG9yYVwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhvcmFzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiZXN0YSBob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IGhcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gaFwiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGVcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImVzdGUgbWludXRvXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gbWludXRvc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW51dG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW51dG9zXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWludXRlLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJlc3RlIG1pbnV0b1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiZGVudHJvIGRlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBtaW5cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWNvbmRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImhhY2UgezB9IHNlZ3VuZG9cIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJoYWNlIHswfSBzZWd1bmRvc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1zaG9ydFwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwiYWhvcmFcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm9uZVwiOiBcImRlbnRybyBkZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImRlbnRybyBkZSB7MH0gc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJoYWNlIHswfSBzXCIsXG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiaGFjZSB7MH0gc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY29uZC1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcImFob3JhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvbmVcIjogXCJkZW50cm8gZGUgezB9IHNcIixcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCJkZW50cm8gZGUgezB9IHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib25lXCI6IFwiaGFjZSB7MH0gc1wiLFxuICAgICAgICAgICAgXCJvdGhlclwiOiBcImhhY2UgezB9IHNcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJhdmFpbGFibGVMb2NhbGVzXCI6IFtcImVzLTQxOVwiLCBcImVzLUFSXCIsIFwiZXMtQk9cIiwgXCJlcy1CUlwiLCBcImVzLUJaXCIsIFwiZXMtQ0xcIiwgXCJlcy1DT1wiLCBcImVzLUNSXCIsIFwiZXMtQ1VcIiwgXCJlcy1ET1wiLCBcImVzLUVBXCIsIFwiZXMtRUNcIiwgXCJlcy1HUVwiLCBcImVzLUdUXCIsIFwiZXMtSE5cIiwgXCJlcy1JQ1wiLCBcImVzLU1YXCIsIFwiZXMtTklcIiwgXCJlcy1QQVwiLCBcImVzLVBFXCIsIFwiZXMtUEhcIiwgXCJlcy1QUlwiLCBcImVzLVBZXCIsIFwiZXMtU1ZcIiwgXCJlcy1VU1wiLCBcImVzLVVZXCIsIFwiZXMtVkVcIiwgXCJlc1wiXSxcbiAgICBcImFsaWFzZXNcIjoge30sXG4gICAgXCJwYXJlbnRMb2NhbGVzXCI6IHtcbiAgICAgIFwiZXMtQVJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQlpcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ09cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1JcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRE9cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtRUNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtSE5cIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTVhcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEFcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUEVcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtUFlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtU1ZcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVVlcIjogXCJlcy00MTlcIixcbiAgICAgIFwiZXMtVkVcIjogXCJlcy00MTlcIlxuICAgIH1cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4033\n')},9584:function(){eval('/* @generated */\n// prettier-ignore\nif (Intl.RelativeTimeFormat && typeof Intl.RelativeTimeFormat.__addLocaleData === \'function\') {\n Intl.RelativeTimeFormat.__addLocaleData({\n "data": {\n "ses": {\n "nu": ["latn"],\n "year": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "year-short": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "year-narrow": {\n "0": "this year",\n "1": "next year",\n "future": {\n "other": "+{0} y"\n },\n "past": {\n "other": "-{0} y"\n },\n "-1": "last year"\n },\n "quarter": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "quarter-short": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "quarter-narrow": {\n "0": "this quarter",\n "1": "next quarter",\n "future": {\n "other": "+{0} Q"\n },\n "past": {\n "other": "-{0} Q"\n },\n "-1": "last quarter"\n },\n "month": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "month-short": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "month-narrow": {\n "0": "this month",\n "1": "next month",\n "future": {\n "other": "+{0} m"\n },\n "past": {\n "other": "-{0} m"\n },\n "-1": "last month"\n },\n "week": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "week-short": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "week-narrow": {\n "0": "this week",\n "1": "next week",\n "future": {\n "other": "+{0} w"\n },\n "past": {\n "other": "-{0} w"\n },\n "-1": "last week"\n },\n "day": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "day-short": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "day-narrow": {\n "0": "Hõo",\n "1": "Suba",\n "future": {\n "other": "+{0} d"\n },\n "past": {\n "other": "-{0} d"\n },\n "-1": "Bi"\n },\n "hour": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "hour-short": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "hour-narrow": {\n "0": "this hour",\n "future": {\n "other": "+{0} h"\n },\n "past": {\n "other": "-{0} h"\n }\n },\n "minute": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "minute-short": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "minute-narrow": {\n "0": "this minute",\n "future": {\n "other": "+{0} min"\n },\n "past": {\n "other": "-{0} min"\n }\n },\n "second": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n },\n "second-short": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n },\n "second-narrow": {\n "0": "now",\n "future": {\n "other": "+{0} s"\n },\n "past": {\n "other": "-{0} s"\n }\n }\n }\n },\n "availableLocales": ["ses"],\n "aliases": {},\n "parentLocales": {}\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9sb2NhbGUtZGF0YS9zZXMuanM/Mjg4ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUIsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCLFdBQVc7QUFDWDtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI5NTg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogQGdlbmVyYXRlZCAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5pZiAoSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQgJiYgdHlwZW9mIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5fX2FkZExvY2FsZURhdGEoe1xuICAgIFwiZGF0YVwiOiB7XG4gICAgICBcInNlc1wiOiB7XG4gICAgICAgIFwibnVcIjogW1wibGF0blwiXSxcbiAgICAgICAgXCJ5ZWFyXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHllYXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHllYXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSB5XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSB5XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHllYXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInllYXItc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeWVhclwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeWVhclwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwieWVhci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgeWVhclwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgeWVhclwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHlcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgeWVhclwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVhcnRlclwiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBxdWFydGVyXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBxdWFydGVyXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gUVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gUVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwibGFzdCBxdWFydGVyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJxdWFydGVyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF1YXJ0ZXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF1YXJ0ZXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcInF1YXJ0ZXItbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHF1YXJ0ZXJcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHF1YXJ0ZXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBRXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHF1YXJ0ZXJcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsXG4gICAgICAgICAgXCIxXCI6IFwibmV4dCBtb250aFwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IG1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3QgbW9udGhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1vbnRoLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwidGhpcyBtb250aFwiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgbW9udGhcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IG1vbnRoXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWVrXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIHdlZWtcIixcbiAgICAgICAgICBcIjFcIjogXCJuZXh0IHdlZWtcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSB3XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSB3XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLTFcIjogXCJsYXN0IHdlZWtcIlxuICAgICAgICB9LFxuICAgICAgICBcIndlZWstc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2Vla1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2Vla1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2Vla1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwid2Vlay1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgd2Vla1wiLFxuICAgICAgICAgIFwiMVwiOiBcIm5leHQgd2Vla1wiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IHdcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcImxhc3Qgd2Vla1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF5XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJIw7VvXCIsXG4gICAgICAgICAgXCIxXCI6IFwiU3ViYVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCItMVwiOiBcIkJpXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXktc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIkjDtW9cIixcbiAgICAgICAgICBcIjFcIjogXCJTdWJhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiQmlcIlxuICAgICAgICB9LFxuICAgICAgICBcImRheS1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcIkjDtW9cIixcbiAgICAgICAgICBcIjFcIjogXCJTdWJhXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi0xXCI6IFwiQmlcIlxuICAgICAgICB9LFxuICAgICAgICBcImhvdXJcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJob3VyLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIGhvdXJcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBoXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBoXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG91ci1uYXJyb3dcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgaG91clwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IGhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYXN0XCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCItezB9IGhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGVcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtc2hvcnRcIjoge1xuICAgICAgICAgIFwiMFwiOiBcInRoaXMgbWludXRlXCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gbWluXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBtaW5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW51dGUtbmFycm93XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJ0aGlzIG1pbnV0ZVwiLFxuICAgICAgICAgIFwiZnV0dXJlXCI6IHtcbiAgICAgICAgICAgIFwib3RoZXJcIjogXCIrezB9IG1pblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gbWluXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kXCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLXNob3J0XCI6IHtcbiAgICAgICAgICBcIjBcIjogXCJub3dcIixcbiAgICAgICAgICBcImZ1dHVyZVwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiK3swfSBzXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicGFzdFwiOiB7XG4gICAgICAgICAgICBcIm90aGVyXCI6IFwiLXswfSBzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2Vjb25kLW5hcnJvd1wiOiB7XG4gICAgICAgICAgXCIwXCI6IFwibm93XCIsXG4gICAgICAgICAgXCJmdXR1cmVcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIit7MH0gc1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhc3RcIjoge1xuICAgICAgICAgICAgXCJvdGhlclwiOiBcIi17MH0gc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcImF2YWlsYWJsZUxvY2FsZXNcIjogW1wic2VzXCJdLFxuICAgIFwiYWxpYXNlc1wiOiB7fSxcbiAgICBcInBhcmVudExvY2FsZXNcIjoge31cbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9584\n')},8709:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\n\nvar core_1 = __webpack_require__(9905);\n\nif (!('RelativeTimeFormat' in Intl)) {\n Object.defineProperty(Intl, 'RelativeTimeFormat', {\n value: core_1.default,\n writable: true,\n enumerable: false,\n configurable: true\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvZGlzdC9wb2x5ZmlsbC5qcz83ODNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQzs7QUFFRixhQUFhLG1CQUFPLENBQUMsSUFBUTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6Ijg3MDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIGNvcmVfMSA9IHJlcXVpcmUoXCIuL2NvcmVcIik7XG5cbmlmICghKCdSZWxhdGl2ZVRpbWVGb3JtYXQnIGluIEludGwpKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnRsLCAnUmVsYXRpdmVUaW1lRm9ybWF0Jywge1xuICAgIHZhbHVlOiBjb3JlXzEuZGVmYXVsdCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8709\n")},5316:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("__webpack_require__(8709);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC1yZWxhdGl2ZXRpbWVmb3JtYXQvcG9seWZpbGwuanM/OWM0ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBTyxDQUFDLElBQWlCIiwiZmlsZSI6IjUzMTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL2Rpc3QvcG9seWZpbGwnKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5316\n")},2650:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "InternalSlotToken": function() { return /* reexport */ InternalSlotToken; },\n "SANCTIONED_UNITS": function() { return /* reexport */ SANCTIONED_UNITS; },\n "createResolveLocale": function() { return /* reexport */ createResolveLocale; },\n "defaultNumberOption": function() { return /* reexport */ defaultNumberOption; },\n "getAliasesByLang": function() { return /* reexport */ getAliasesByLang; },\n "getCanonicalLocales": function() { return /* reexport */ getCanonicalLocales; },\n "getInternalSlot": function() { return /* reexport */ getInternalSlot; },\n "getLocaleHierarchy": function() { return /* reexport */ getLocaleHierarchy; },\n "getMultiInternalSlots": function() { return /* reexport */ getMultiInternalSlots; },\n "getNumberOption": function() { return /* reexport */ getNumberOption; },\n "getOption": function() { return /* reexport */ getOption; },\n "getParentLocalesByLang": function() { return /* reexport */ getParentLocalesByLang; },\n "invariant": function() { return /* reexport */ invariant/* invariant */.k; },\n "isLiteralPart": function() { return /* reexport */ isLiteralPart; },\n "isMissingLocaleDataError": function() { return /* reexport */ isMissingLocaleDataError; },\n "isWellFormedCurrencyCode": function() { return /* reexport */ isWellFormedCurrencyCode; },\n "objectIs": function() { return /* reexport */ objectIs; },\n "partitionPattern": function() { return /* reexport */ partitionPattern; },\n "removeUnitNamespace": function() { return /* reexport */ removeUnitNamespace; },\n "selectUnit": function() { return /* reexport */ selectUnit; },\n "setInternalSlot": function() { return /* reexport */ setInternalSlot; },\n "setMultiInternalSlots": function() { return /* reexport */ setMultiInternalSlots; },\n "setNumberFormatDigitOptions": function() { return /* reexport */ setNumberFormatDigitOptions; },\n "supportedLocales": function() { return /* reexport */ supportedLocales; },\n "toObject": function() { return /* reexport */ toObject; },\n "toString": function() { return /* reexport */ polyfill_utils_toString; },\n "unpackData": function() { return /* reexport */ unpackData; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/diff.js\nvar __assign = undefined && undefined.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nvar MS_PER_SECOND = 1e3;\nvar SECS_PER_MIN = 60;\nvar SECS_PER_HOUR = SECS_PER_MIN * 60;\nvar SECS_PER_DAY = SECS_PER_HOUR * 24;\nvar SECS_PER_WEEK = SECS_PER_DAY * 7;\nfunction selectUnit(from, to, thresholds) {\n if (to === void 0) {\n to = Date.now();\n }\n\n if (thresholds === void 0) {\n thresholds = {};\n }\n\n var resolvedThresholds = __assign(__assign({}, DEFAULT_THRESHOLDS), thresholds || {});\n\n var secs = (+from - +to) / MS_PER_SECOND;\n\n if (Math.abs(secs) < resolvedThresholds.second) {\n return {\n value: Math.round(secs),\n unit: \'second\'\n };\n }\n\n var mins = secs / SECS_PER_MIN;\n\n if (Math.abs(mins) < resolvedThresholds.minute) {\n return {\n value: Math.round(mins),\n unit: \'minute\'\n };\n }\n\n var hours = secs / SECS_PER_HOUR;\n\n if (Math.abs(hours) < resolvedThresholds.hour) {\n return {\n value: Math.round(hours),\n unit: \'hour\'\n };\n }\n\n var days = secs / SECS_PER_DAY;\n\n if (Math.abs(days) < resolvedThresholds.day) {\n return {\n value: Math.round(days),\n unit: \'day\'\n };\n }\n\n var fromDate = new Date(from);\n var toDate = new Date(to);\n var years = fromDate.getFullYear() - toDate.getFullYear();\n\n if (Math.round(Math.abs(years)) > 0) {\n return {\n value: Math.round(years),\n unit: \'year\'\n };\n }\n\n var months = years * 12 + fromDate.getMonth() - toDate.getMonth();\n\n if (Math.round(Math.abs(months)) > 0) {\n return {\n value: Math.round(months),\n unit: \'month\'\n };\n }\n\n var weeks = secs / SECS_PER_WEEK;\n return {\n value: Math.round(weeks),\n unit: \'week\'\n };\n}\nvar DEFAULT_THRESHOLDS = {\n second: 45,\n minute: 45,\n hour: 22,\n day: 5\n};\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/aliases.js\n/* @generated */\n// prettier-ignore \n/* harmony default export */ var aliases = ({\n "aa-SAAHO": "ssy",\n "aam": "aas",\n "aar": "aa",\n "abk": "ab",\n "adp": "dz",\n "afr": "af",\n "aju": "jrb",\n "aka": "ak",\n "alb": "sq",\n "als": "sq",\n "amh": "am",\n "ara": "ar",\n "arb": "ar",\n "arg": "an",\n "arm": "hy",\n "art-lojban": "jbo",\n "asd": "snz",\n "asm": "as",\n "aue": "ktz",\n "ava": "av",\n "ave": "ae",\n "aym": "ay",\n "ayr": "ay",\n "ayx": "nun",\n "az-AZ": "az-Latn-AZ",\n "aze": "az",\n "azj": "az",\n "bak": "ba",\n "bam": "bm",\n "baq": "eu",\n "bcc": "bal",\n "bcl": "bik",\n "bel": "be",\n "ben": "bn",\n "bgm": "bcg",\n "bh": "bho",\n "bih": "bho",\n "bis": "bi",\n "bjd": "drl",\n "bod": "bo",\n "bos": "bs",\n "bre": "br",\n "bs-BA": "bs-Latn-BA",\n "bul": "bg",\n "bur": "my",\n "bxk": "luy",\n "bxr": "bua",\n "cat": "ca",\n "ccq": "rki",\n "cel-gaulish": "xtg-x-cel-gaulish",\n "ces": "cs",\n "cha": "ch",\n "che": "ce",\n "chi": "zh",\n "chu": "cu",\n "chv": "cv",\n "cjr": "mom",\n "cka": "cmr",\n "cld": "syr",\n "cmk": "xch",\n "cmn": "zh",\n "cnr": "sr-ME",\n "cor": "kw",\n "cos": "co",\n "coy": "pij",\n "cqu": "quh",\n "cre": "cr",\n "cwd": "cr",\n "cym": "cy",\n "cze": "cs",\n "dan": "da",\n "deu": "de",\n "dgo": "doi",\n "dhd": "mwr",\n "dik": "din",\n "diq": "zza",\n "dit": "dif",\n "div": "dv",\n "drh": "mn",\n "drw": "fa-af",\n "dut": "nl",\n "dzo": "dz",\n "ekk": "et",\n "ell": "el",\n "emk": "man",\n "eng": "en",\n "epo": "eo",\n "esk": "ik",\n "est": "et",\n "eus": "eu",\n "ewe": "ee",\n "fao": "fo",\n "fas": "fa",\n "fat": "ak",\n "fij": "fj",\n "fin": "fi",\n "fra": "fr",\n "fre": "fr",\n "fry": "fy",\n "fuc": "ff",\n "ful": "ff",\n "gav": "dev",\n "gaz": "om",\n "gbo": "grb",\n "geo": "ka",\n "ger": "de",\n "gfx": "vaj",\n "ggn": "gvr",\n "gla": "gd",\n "gle": "ga",\n "glg": "gl",\n "glv": "gv",\n "gno": "gon",\n "gre": "el",\n "grn": "gn",\n "gti": "nyc",\n "gug": "gn",\n "guj": "gu",\n "guv": "duz",\n "gya": "gba",\n "ha-Latn-GH": "ha-GH",\n "ha-Latn-NE": "ha-NE",\n "ha-Latn-NG": "ha-NG",\n "hat": "ht",\n "hau": "ha",\n "hbs": "sr-Latn",\n "hdn": "hai",\n "hea": "hmn",\n "heb": "he",\n "her": "hz",\n "him": "srx",\n "hin": "hi",\n "hmo": "ho",\n "hrr": "jal",\n "hrv": "hr",\n "hun": "hu",\n "hye": "hy",\n "i-ami": "ami",\n "i-bnn": "bnn",\n "i-hak": "hak",\n "i-klingon": "tlh",\n "i-lux": "lb",\n "i-navajo": "nv",\n "i-pwn": "pwn",\n "i-tao": "tao",\n "i-tay": "tay",\n "i-tsu": "tsu",\n "i-default": "en-x-i-default",\n "i-enochian": "und-x-i-enochian",\n "i-mingo": "see-x-i-mingo",\n "ibi": "opa",\n "ibo": "ig",\n "ice": "is",\n "ido": "io",\n "iii": "ii",\n "ike": "iu",\n "iku": "iu",\n "ile": "ie",\n "ilw": "gal",\n "in": "id",\n "ina": "ia",\n "ind": "id",\n "ipk": "ik",\n "isl": "is",\n "ita": "it",\n "iw": "he",\n "jav": "jv",\n "jeg": "oyb",\n "ji": "yi",\n "jpn": "ja",\n "jw": "jv",\n "kal": "kl",\n "kan": "kn",\n "kas": "ks",\n "kat": "ka",\n "kau": "kr",\n "kaz": "kk",\n "kgc": "tdf",\n "kgh": "kml",\n "khk": "mn",\n "khm": "km",\n "kik": "ki",\n "kin": "rw",\n "kir": "ky",\n "kk-Cyrl-KZ": "kk-KZ",\n "kmr": "ku",\n "knc": "kr",\n "kng": "kg",\n "knn": "kok",\n "koj": "kwv",\n "kom": "kv",\n "kon": "kg",\n "kor": "ko",\n "kpv": "kv",\n "krm": "bmf",\n "ks-Arab-IN": "ks-IN",\n "ktr": "dtp",\n "kua": "kj",\n "kur": "ku",\n "kvs": "gdj",\n "kwq": "yam",\n "kxe": "tvd",\n "ky-Cyrl-KG": "ky-KG",\n "kzj": "dtp",\n "kzt": "dtp",\n "lao": "lo",\n "lat": "la",\n "lav": "lv",\n "lbk": "bnc",\n "lii": "raq",\n "lim": "li",\n "lin": "ln",\n "lit": "lt",\n "llo": "ngt",\n "lmm": "rmx",\n "ltz": "lb",\n "lub": "lu",\n "lug": "lg",\n "lvs": "lv",\n "mac": "mk",\n "mah": "mh",\n "mal": "ml",\n "mao": "mi",\n "mar": "mr",\n "may": "ms",\n "meg": "cir",\n "mhr": "chm",\n "mkd": "mk",\n "mlg": "mg",\n "mlt": "mt",\n "mn-Cyrl-MN": "mn-MN",\n "mnk": "man",\n "mo": "ro",\n "mol": "ro",\n "mon": "mn",\n "mri": "mi",\n "ms-Latn-BN": "ms-BN",\n "ms-Latn-MY": "ms-MY",\n "ms-Latn-SG": "ms-SG",\n "msa": "ms",\n "mst": "mry",\n "mup": "raj",\n "mwj": "vaj",\n "mya": "my",\n "myd": "aog",\n "myt": "mry",\n "nad": "xny",\n "nau": "na",\n "nav": "nv",\n "nbl": "nr",\n "ncp": "kdz",\n "nde": "nd",\n "ndo": "ng",\n "nep": "ne",\n "nld": "nl",\n "nno": "nn",\n "nns": "nbr",\n "nnx": "ngv",\n "no": "nb",\n "no-bok": "nb",\n "no-BOKMAL": "nb",\n "no-nyn": "nn",\n "no-NYNORSK": "nn",\n "nob": "nb",\n "nor": "nb",\n "npi": "ne",\n "nts": "pij",\n "nya": "ny",\n "oci": "oc",\n "ojg": "oj",\n "oji": "oj",\n "ori": "or",\n "orm": "om",\n "ory": "or",\n "oss": "os",\n "oun": "vaj",\n "pa-IN": "pa-Guru-IN",\n "pa-PK": "pa-Arab-PK",\n "pan": "pa",\n "pbu": "ps",\n "pcr": "adx",\n "per": "fa",\n "pes": "fa",\n "pli": "pi",\n "plt": "mg",\n "pmc": "huw",\n "pmu": "phr",\n "pnb": "lah",\n "pol": "pl",\n "por": "pt",\n "ppa": "bfy",\n "ppr": "lcq",\n "prs": "fa-AF",\n "pry": "prt",\n "pus": "ps",\n "puz": "pub",\n "que": "qu",\n "quz": "qu",\n "rmy": "rom",\n "roh": "rm",\n "ron": "ro",\n "rum": "ro",\n "run": "rn",\n "rus": "ru",\n "sag": "sg",\n "san": "sa",\n "sca": "hle",\n "scc": "sr",\n "scr": "hr",\n "sgn-BE-FR": "sfb",\n "sgn-BE-NL": "vgt",\n "sgn-CH-DE": "sgg",\n "sh": "sr-Latn",\n "shi-MA": "shi-Tfng-MA",\n "sin": "si",\n "skk": "oyb",\n "slk": "sk",\n "slo": "sk",\n "slv": "sl",\n "sme": "se",\n "smo": "sm",\n "sna": "sn",\n "snd": "sd",\n "som": "so",\n "sot": "st",\n "spa": "es",\n "spy": "kln",\n "sqi": "sq",\n "sr-BA": "sr-Cyrl-BA",\n "sr-ME": "sr-Latn-ME",\n "sr-RS": "sr-Cyrl-RS",\n "sr-XK": "sr-Cyrl-XK",\n "src": "sc",\n "srd": "sc",\n "srp": "sr",\n "ssw": "ss",\n "sun": "su",\n "swa": "sw",\n "swc": "sw-CD",\n "swe": "sv",\n "swh": "sw",\n "tah": "ty",\n "tam": "ta",\n "tat": "tt",\n "tdu": "dtp",\n "tel": "te",\n "tgk": "tg",\n "tgl": "fil",\n "tha": "th",\n "thc": "tpo",\n "thx": "oyb",\n "tib": "bo",\n "tie": "ras",\n "tir": "ti",\n "tkk": "twm",\n "tl": "fil",\n "tlw": "weo",\n "tmp": "tyj",\n "tne": "kak",\n "tnf": "fa-af",\n "ton": "to",\n "tsf": "taj",\n "tsn": "tn",\n "tso": "ts",\n "ttq": "tmh",\n "tuk": "tk",\n "tur": "tr",\n "tw": "ak",\n "twi": "ak",\n "tzm-Latn-MA": "tzm-MA",\n "ug-Arab-CN": "ug-CN",\n "uig": "ug",\n "ukr": "uk",\n "umu": "del",\n "uok": "ema",\n "urd": "ur",\n "uz-AF": "uz-Arab-AF",\n "uz-UZ": "uz-Latn-UZ",\n "uzb": "uz",\n "uzn": "uz",\n "vai-LR": "vai-Vaii-LR",\n "ven": "ve",\n "vie": "vi",\n "vol": "vo",\n "wel": "cy",\n "wln": "wa",\n "wol": "wo",\n "xba": "cax",\n "xho": "xh",\n "xia": "acn",\n "xkh": "waw",\n "xpe": "kpe",\n "xsj": "suj",\n "xsl": "den",\n "ybd": "rki",\n "ydd": "yi",\n "yid": "yi",\n "yma": "lrr",\n "ymt": "mtm",\n "yor": "yo",\n "yos": "zom",\n "yue-CN": "yue-Hans-CN",\n "yue-HK": "yue-Hant-HK",\n "yuu": "yug",\n "zai": "zap",\n "zh-CN": "zh-Hans-CN",\n "zh-guoyu": "zh",\n "zh-hakka": "hak",\n "zh-HK": "zh-Hant-HK",\n "zh-min-nan": "nan",\n "zh-MO": "zh-Hant-MO",\n "zh-SG": "zh-Hans-SG",\n "zh-TW": "zh-Hant-TW",\n "zh-xiang": "hsn",\n "zh-min": "nan-x-zh-min",\n "zha": "za",\n "zho": "zh",\n "zsm": "ms",\n "zul": "zu",\n "zyb": "za"\n});\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/parentLocales.js\n/* @generated */\n// prettier-ignore \n/* harmony default export */ var parentLocales = ({\n "en-150": "en-001",\n "en-AG": "en-001",\n "en-AI": "en-001",\n "en-AU": "en-001",\n "en-BB": "en-001",\n "en-BM": "en-001",\n "en-BS": "en-001",\n "en-BW": "en-001",\n "en-BZ": "en-001",\n "en-CA": "en-001",\n "en-CC": "en-001",\n "en-CK": "en-001",\n "en-CM": "en-001",\n "en-CX": "en-001",\n "en-CY": "en-001",\n "en-DG": "en-001",\n "en-DM": "en-001",\n "en-ER": "en-001",\n "en-FJ": "en-001",\n "en-FK": "en-001",\n "en-FM": "en-001",\n "en-GB": "en-001",\n "en-GD": "en-001",\n "en-GG": "en-001",\n "en-GH": "en-001",\n "en-GI": "en-001",\n "en-GM": "en-001",\n "en-GY": "en-001",\n "en-HK": "en-001",\n "en-IE": "en-001",\n "en-IL": "en-001",\n "en-IM": "en-001",\n "en-IN": "en-001",\n "en-IO": "en-001",\n "en-JE": "en-001",\n "en-JM": "en-001",\n "en-KE": "en-001",\n "en-KI": "en-001",\n "en-KN": "en-001",\n "en-KY": "en-001",\n "en-LC": "en-001",\n "en-LR": "en-001",\n "en-LS": "en-001",\n "en-MG": "en-001",\n "en-MO": "en-001",\n "en-MS": "en-001",\n "en-MT": "en-001",\n "en-MU": "en-001",\n "en-MW": "en-001",\n "en-MY": "en-001",\n "en-NA": "en-001",\n "en-NF": "en-001",\n "en-NG": "en-001",\n "en-NR": "en-001",\n "en-NU": "en-001",\n "en-NZ": "en-001",\n "en-PG": "en-001",\n "en-PH": "en-001",\n "en-PK": "en-001",\n "en-PN": "en-001",\n "en-PW": "en-001",\n "en-RW": "en-001",\n "en-SB": "en-001",\n "en-SC": "en-001",\n "en-SD": "en-001",\n "en-SG": "en-001",\n "en-SH": "en-001",\n "en-SL": "en-001",\n "en-SS": "en-001",\n "en-SX": "en-001",\n "en-SZ": "en-001",\n "en-TC": "en-001",\n "en-TK": "en-001",\n "en-TO": "en-001",\n "en-TT": "en-001",\n "en-TV": "en-001",\n "en-TZ": "en-001",\n "en-UG": "en-001",\n "en-VC": "en-001",\n "en-VG": "en-001",\n "en-VU": "en-001",\n "en-WS": "en-001",\n "en-ZA": "en-001",\n "en-ZM": "en-001",\n "en-ZW": "en-001",\n "en-AT": "en-150",\n "en-BE": "en-150",\n "en-CH": "en-150",\n "en-DE": "en-150",\n "en-DK": "en-150",\n "en-FI": "en-150",\n "en-NL": "en-150",\n "en-SE": "en-150",\n "en-SI": "en-150",\n "es-AR": "es-419",\n "es-BO": "es-419",\n "es-BR": "es-419",\n "es-BZ": "es-419",\n "es-CL": "es-419",\n "es-CO": "es-419",\n "es-CR": "es-419",\n "es-CU": "es-419",\n "es-DO": "es-419",\n "es-EC": "es-419",\n "es-GT": "es-419",\n "es-HN": "es-419",\n "es-MX": "es-419",\n "es-NI": "es-419",\n "es-PA": "es-419",\n "es-PE": "es-419",\n "es-PR": "es-419",\n "es-PY": "es-419",\n "es-SV": "es-419",\n "es-US": "es-419",\n "es-UY": "es-419",\n "es-VE": "es-419",\n "pt-AO": "pt-PT",\n "pt-CH": "pt-PT",\n "pt-CV": "pt-PT",\n "pt-FR": "pt-PT",\n "pt-GQ": "pt-PT",\n "pt-GW": "pt-PT",\n "pt-LU": "pt-PT",\n "pt-MO": "pt-PT",\n "pt-MZ": "pt-PT",\n "pt-ST": "pt-PT",\n "pt-TL": "pt-PT",\n "zh-Hant-MO": "zh-Hant-HK"\n});\n// EXTERNAL MODULE: ./node_modules/@formatjs/intl-utils/lib/invariant.js\nvar invariant = __webpack_require__(5981);\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/polyfill-utils.js\n\n\n\n/**\n * https://tc39.es/ecma262/#sec-toobject\n * @param arg\n */\n\nfunction toObject(arg) {\n if (arg == null) {\n throw new TypeError(\'undefined/null cannot be converted to object\');\n }\n\n return Object(arg);\n}\n/**\n * https://tc39.es/ecma262/#sec-tostring\n */\n\nfunction polyfill_utils_toString(o) {\n // Only symbol is irregular...\n if (typeof o === \'symbol\') {\n throw TypeError(\'Cannot convert a Symbol value to a string\');\n }\n\n return String(o);\n}\n/**\n * https://tc39.es/ecma402/#sec-getoption\n * @param opts\n * @param prop\n * @param type\n * @param values\n * @param fallback\n */\n\nfunction getOption(opts, prop, type, values, fallback) {\n // const descriptor = Object.getOwnPropertyDescriptor(opts, prop);\n var value = opts[prop];\n\n if (value !== undefined) {\n if (type !== \'boolean\' && type !== \'string\') {\n throw new TypeError(\'invalid type\');\n }\n\n if (type === \'boolean\') {\n value = Boolean(value);\n }\n\n if (type === \'string\') {\n value = polyfill_utils_toString(value);\n }\n\n if (values !== undefined && !values.filter(function (val) {\n return val == value;\n }).length) {\n throw new RangeError(value + " is not within " + values.join(\', \'));\n }\n\n return value;\n }\n\n return fallback;\n}\n/**\n * https://tc39.es/ecma402/#sec-defaultnumberoption\n * @param val\n * @param min\n * @param max\n * @param fallback\n */\n\nfunction defaultNumberOption(val, min, max, fallback) {\n if (val !== undefined) {\n val = Number(val);\n\n if (isNaN(val) || val < min || val > max) {\n throw new RangeError(val + " is outside of range [" + min + ", " + max + "]");\n }\n\n return Math.floor(val);\n }\n\n return fallback;\n}\n/**\n * https://tc39.es/ecma402/#sec-getnumberoption\n * @param options\n * @param property\n * @param min\n * @param max\n * @param fallback\n */\n\nfunction getNumberOption(options, property, minimum, maximum, fallback) {\n var val = options[property];\n return defaultNumberOption(val, minimum, maximum, fallback);\n}\nfunction getAliasesByLang(lang) {\n return Object.keys(aliases).reduce(function (all, locale) {\n if (locale.split(\'-\')[0] === lang) {\n all[locale] = aliases[locale];\n }\n\n return all;\n }, {});\n}\nfunction getParentLocalesByLang(lang) {\n return Object.keys(parentLocales).reduce(function (all, locale) {\n if (locale.split(\'-\')[0] === lang) {\n all[locale] = parentLocales[locale];\n }\n\n return all;\n }, {});\n}\nfunction setInternalSlot(map, pl, field, value) {\n if (!map.get(pl)) {\n map.set(pl, Object.create(null));\n }\n\n var slots = map.get(pl);\n slots[field] = value;\n}\nfunction setMultiInternalSlots(map, pl, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var k = _a[_i];\n setInternalSlot(map, pl, k, props[k]);\n }\n}\nfunction getInternalSlot(map, pl, field) {\n return getMultiInternalSlots(map, pl, field)[field];\n}\nfunction getMultiInternalSlots(map, pl) {\n var fields = [];\n\n for (var _i = 2; _i < arguments.length; _i++) {\n fields[_i - 2] = arguments[_i];\n }\n\n var slots = map.get(pl);\n\n if (!slots) {\n throw new TypeError(pl + " InternalSlot has not been initialized");\n }\n\n return fields.reduce(function (all, f) {\n all[f] = slots[f];\n return all;\n }, Object.create(null));\n}\nfunction isLiteralPart(patternPart) {\n return patternPart.type === \'literal\';\n}\nfunction partitionPattern(pattern) {\n var result = [];\n var beginIndex = pattern.indexOf(\'{\');\n var endIndex = 0;\n var nextIndex = 0;\n var length = pattern.length;\n\n while (beginIndex < pattern.length && beginIndex > -1) {\n endIndex = pattern.indexOf(\'}\', beginIndex);\n (0,invariant/* invariant */.k)(endIndex > beginIndex, "Invalid pattern " + pattern);\n\n if (beginIndex > nextIndex) {\n result.push({\n type: \'literal\',\n value: pattern.substring(nextIndex, beginIndex)\n });\n }\n\n result.push({\n type: pattern.substring(beginIndex + 1, endIndex),\n value: undefined\n });\n nextIndex = endIndex + 1;\n beginIndex = pattern.indexOf(\'{\', nextIndex);\n }\n\n if (nextIndex < length) {\n result.push({\n type: \'literal\',\n value: pattern.substring(nextIndex, length)\n });\n }\n\n return result;\n}\n/**\n * https://tc39.es/ecma402/#sec-setnfdigitoptions\n * https://tc39.es/proposal-unified-intl-numberformat/section11/numberformat_diff_out.html#sec-setnfdigitoptions\n * @param intlObj\n * @param opts\n * @param mnfdDefault\n * @param mxfdDefault\n */\n\nfunction setNumberFormatDigitOptions(internalSlotMap, intlObj, opts, mnfdDefault, mxfdDefault) {\n var mnid = getNumberOption(opts, \'minimumIntegerDigits\', 1, 21, 1);\n var mnfd = opts.minimumFractionDigits;\n var mxfd = opts.maximumFractionDigits;\n var mnsd = opts.minimumSignificantDigits;\n var mxsd = opts.maximumSignificantDigits;\n setInternalSlot(internalSlotMap, intlObj, \'minimumIntegerDigits\', mnid);\n\n if (mnsd !== undefined || mxsd !== undefined) {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'significantDigits\');\n mnsd = defaultNumberOption(mnsd, 1, 21, 1);\n mxsd = defaultNumberOption(mxsd, mnsd, 21, 21);\n setInternalSlot(internalSlotMap, intlObj, \'minimumSignificantDigits\', mnsd);\n setInternalSlot(internalSlotMap, intlObj, \'maximumSignificantDigits\', mxsd);\n } else if (mnfd !== undefined || mxfd !== undefined) {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'fractionDigits\');\n mnfd = defaultNumberOption(mnfd, 0, 20, mnfdDefault);\n var mxfdActualDefault = Math.max(mnfd, mxfdDefault);\n mxfd = defaultNumberOption(mxfd, mnfd, 20, mxfdActualDefault);\n setInternalSlot(internalSlotMap, intlObj, \'minimumFractionDigits\', mnfd);\n setInternalSlot(internalSlotMap, intlObj, \'maximumFractionDigits\', mxfd);\n } else if (getInternalSlot(internalSlotMap, intlObj, \'notation\') === \'compact\') {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'compactRounding\');\n } else {\n setInternalSlot(internalSlotMap, intlObj, \'roundingType\', \'fractionDigits\');\n setInternalSlot(internalSlotMap, intlObj, \'minimumFractionDigits\', mnfdDefault);\n setInternalSlot(internalSlotMap, intlObj, \'maximumFractionDigits\', mxfdDefault);\n }\n}\nfunction objectIs(x, y) {\n if (Object.is) {\n return Object.is(x, y);\n } // SameValue algorithm\n\n\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } // Step 6.a: NaN == NaN\n\n\n return x !== x && y !== y;\n}\nvar NOT_A_Z_REGEX = /[^A-Z]/;\n/**\n * This follows https://tc39.es/ecma402/#sec-case-sensitivity-and-case-mapping\n * @param str string to convert\n */\n\nfunction toUpperCase(str) {\n return str.replace(/([a-z])/g, function (_, c) {\n return c.toUpperCase();\n });\n}\n/**\n * https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-iswellformedcurrencycode\n * @param currency\n */\n\n\nfunction isWellFormedCurrencyCode(currency) {\n currency = toUpperCase(currency);\n\n if (currency.length !== 3) {\n return false;\n }\n\n if (NOT_A_Z_REGEX.test(currency)) {\n return false;\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/get-canonical-locales.js\n/**\n * IE11-safe version of getCanonicalLocales since it\'s ES2016\n * @param locales locales\n */\nfunction getCanonicalLocales(locales) {\n // IE11\n var getCanonicalLocales = Intl.getCanonicalLocales;\n\n if (typeof getCanonicalLocales === \'function\') {\n return getCanonicalLocales(locales);\n } // NOTE: we must NOT call `supportedLocalesOf` of a formatjs polyfill, or their implementation\n // will even eventually call this method recursively. Here we use `Intl.DateTimeFormat` since it\n // is not polyfilled by `@formatjs`.\n // TODO: Fix TypeScript type def for this bc undefined is just fine\n\n\n return Intl.DateTimeFormat.supportedLocalesOf(locales);\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/resolve-locale.js\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar resolve_locale_assign = undefined && undefined.__assign || function () {\n resolve_locale_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return resolve_locale_assign.apply(this, arguments);\n};\n\n\n\n\nfunction createResolveLocale(getDefaultLocale) {\n var lookupMatcher = createLookupMatcher(getDefaultLocale);\n var bestFitMatcher = createBestFitMatcher(getDefaultLocale);\n /**\n * https://tc39.es/ecma402/#sec-resolvelocale\n */\n\n return function resolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData) {\n var matcher = options.localeMatcher;\n var r;\n\n if (matcher === \'lookup\') {\n r = lookupMatcher(availableLocales, requestedLocales);\n } else {\n r = bestFitMatcher(availableLocales, requestedLocales);\n }\n\n var foundLocale = r.locale;\n var result = {\n locale: \'\',\n dataLocale: foundLocale\n };\n var supportedExtension = \'-u\';\n\n for (var _i = 0, relevantExtensionKeys_1 = relevantExtensionKeys; _i < relevantExtensionKeys_1.length; _i++) {\n var key = relevantExtensionKeys_1[_i];\n var foundLocaleData = localeData[foundLocale];\n (0,invariant/* invariant */.k)(typeof foundLocaleData === \'object\' && foundLocaleData !== null, "locale data " + key + " must be an object");\n var keyLocaleData = foundLocaleData[key];\n (0,invariant/* invariant */.k)(Array.isArray(keyLocaleData), "keyLocaleData for " + key + " must be an array");\n var value = keyLocaleData[0];\n (0,invariant/* invariant */.k)(typeof value === \'string\' || value === null, \'value must be string or null\');\n var supportedExtensionAddition = \'\';\n\n if (r.extension) {\n var requestedValue = unicodeExtensionValue(r.extension, key);\n\n if (requestedValue !== undefined) {\n if (requestedValue !== \'\') {\n if (~keyLocaleData.indexOf(requestedValue)) {\n value = requestedValue;\n supportedExtensionAddition = "-" + key + "-" + value;\n }\n } else if (~requestedValue.indexOf(\'true\')) {\n value = \'true\';\n supportedExtensionAddition = "-" + key;\n }\n }\n }\n\n if (key in options) {\n var optionsValue = options[key];\n (0,invariant/* invariant */.k)(typeof optionsValue === \'string\' || typeof optionsValue === \'undefined\' || optionsValue === null, \'optionsValue must be String, Undefined or Null\');\n\n if (~keyLocaleData.indexOf(optionsValue)) {\n if (optionsValue !== value) {\n value = optionsValue;\n supportedExtensionAddition = \'\';\n }\n }\n }\n\n result[key] = value;\n supportedExtension += supportedExtensionAddition;\n }\n\n if (supportedExtension.length > 2) {\n var privateIndex = foundLocale.indexOf(\'-x-\');\n\n if (privateIndex === -1) {\n foundLocale = foundLocale + supportedExtension;\n } else {\n var preExtension = foundLocale.slice(0, privateIndex);\n var postExtension = foundLocale.slice(privateIndex, foundLocale.length);\n foundLocale = preExtension + supportedExtension + postExtension;\n }\n\n foundLocale = getCanonicalLocales(foundLocale)[0];\n }\n\n result.locale = foundLocale;\n return result;\n };\n}\n/**\n * https://tc39.es/ecma402/#sec-unicodeextensionvalue\n * @param extension\n * @param key\n */\n\nfunction unicodeExtensionValue(extension, key) {\n (0,invariant/* invariant */.k)(key.length === 2, \'key must have 2 elements\');\n var size = extension.length;\n var searchValue = "-" + key + "-";\n var pos = extension.indexOf(searchValue);\n\n if (pos !== -1) {\n var start = pos + 4;\n var end = start;\n var k = start;\n var done = false;\n\n while (!done) {\n var e = extension.indexOf(\'-\', k);\n var len = void 0;\n\n if (e === -1) {\n len = size - k;\n } else {\n len = e - k;\n }\n\n if (len === 2) {\n done = true;\n } else if (e === -1) {\n end = size;\n done = true;\n } else {\n end = e;\n k = e + 1;\n }\n }\n\n return extension.slice(start, end);\n }\n\n searchValue = "-" + key;\n pos = extension.indexOf(searchValue);\n\n if (pos !== -1 && pos + 3 === size) {\n return \'\';\n }\n\n return undefined;\n}\n\nvar UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\n/**\n * https://tc39.es/ecma402/#sec-bestavailablelocale\n * @param availableLocales\n * @param locale\n */\n\nfunction bestAvailableLocale(availableLocales, locale) {\n var candidate = locale;\n\n while (true) {\n if (~availableLocales.indexOf(candidate)) {\n return candidate;\n }\n\n var pos = candidate.lastIndexOf(\'-\');\n\n if (!~pos) {\n return undefined;\n }\n\n if (pos >= 2 && candidate[pos - 2] === \'-\') {\n pos -= 2;\n }\n\n candidate = candidate.slice(0, pos);\n }\n}\n\nfunction createLookupMatcher(getDefaultLocale) {\n /**\n * https://tc39.es/ecma402/#sec-lookupmatcher\n */\n return function lookupMatcher(availableLocales, requestedLocales) {\n var result = {\n locale: \'\'\n };\n\n for (var _i = 0, requestedLocales_1 = requestedLocales; _i < requestedLocales_1.length; _i++) {\n var locale = requestedLocales_1[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n result.locale = availableLocale;\n\n if (locale !== noExtensionLocale) {\n result.extension = locale.slice(noExtensionLocale.length + 1, locale.length);\n }\n\n return result;\n }\n }\n\n result.locale = getDefaultLocale();\n return result;\n };\n}\n\nfunction createBestFitMatcher(getDefaultLocale) {\n return function bestFitMatcher(availableLocales, requestedLocales) {\n var result = {\n locale: \'\'\n };\n\n for (var _i = 0, requestedLocales_2 = requestedLocales; _i < requestedLocales_2.length; _i++) {\n var locale = requestedLocales_2[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n result.locale = availableLocale;\n\n if (locale !== noExtensionLocale) {\n result.extension = locale.slice(noExtensionLocale.length + 1, locale.length);\n }\n\n return result;\n }\n }\n\n result.locale = getDefaultLocale();\n return result;\n };\n}\n\nfunction getLocaleHierarchy(locale, aliases, parentLocales) {\n var results = [locale];\n\n if (aliases[locale]) {\n locale = aliases[locale];\n results.push(locale);\n }\n\n var parentLocale = parentLocales[locale];\n\n if (parentLocale) {\n results.push(parentLocale);\n }\n\n var localeParts = locale.split(\'-\');\n\n for (var i = localeParts.length; i > 1; i--) {\n results.push(localeParts.slice(0, i - 1).join(\'-\'));\n }\n\n return results;\n}\n\nfunction lookupSupportedLocales(availableLocales, requestedLocales) {\n var subset = [];\n\n for (var _i = 0, requestedLocales_3 = requestedLocales; _i < requestedLocales_3.length; _i++) {\n var locale = requestedLocales_3[_i];\n var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, \'\');\n var availableLocale = bestAvailableLocale(availableLocales, noExtensionLocale);\n\n if (availableLocale) {\n subset.push(availableLocale);\n }\n }\n\n return subset;\n}\n\nfunction supportedLocales(availableLocales, requestedLocales, options) {\n var matcher = \'best fit\';\n\n if (options !== undefined) {\n options = toObject(options);\n matcher = getOption(options, \'localeMatcher\', \'string\', [\'lookup\', \'best fit\'], \'best fit\');\n }\n\n if (matcher === \'best fit\') {\n return lookupSupportedLocales(availableLocales, requestedLocales);\n }\n\n return lookupSupportedLocales(availableLocales, requestedLocales);\n}\n\nvar MissingLocaleDataError =\n/** @class */\nfunction (_super) {\n __extends(MissingLocaleDataError, _super);\n\n function MissingLocaleDataError() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.type = \'MISSING_LOCALE_DATA\';\n return _this;\n }\n\n return MissingLocaleDataError;\n}(Error);\n\nfunction isMissingLocaleDataError(e) {\n return e.type === \'MISSING_LOCALE_DATA\';\n}\nfunction unpackData(locale, localeData,\n/** By default shallow merge the dictionaries. */\nreducer) {\n if (reducer === void 0) {\n reducer = function reducer(all, d) {\n return resolve_locale_assign(resolve_locale_assign({}, all), d);\n };\n }\n\n var localeHierarchy = getLocaleHierarchy(locale, localeData.aliases, localeData.parentLocales);\n var dataToMerge = localeHierarchy.map(function (l) {\n return localeData.data[l];\n }).filter(Boolean);\n\n if (!dataToMerge.length) {\n throw new MissingLocaleDataError("Missing locale data for \\"" + locale + "\\", lookup hierarchy: " + localeHierarchy.join(\', \'));\n }\n\n dataToMerge.reverse();\n return dataToMerge.reduce(reducer, {});\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/units.js\n// https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_diff_out.html#sec-issanctionedsimpleunitidentifier\nvar SANCTIONED_UNITS = [\'angle-degree\', \'area-acre\', \'area-hectare\', \'concentr-percent\', \'digital-bit\', \'digital-byte\', \'digital-gigabit\', \'digital-gigabyte\', \'digital-kilobit\', \'digital-kilobyte\', \'digital-megabit\', \'digital-megabyte\', \'digital-petabyte\', \'digital-terabit\', \'digital-terabyte\', \'duration-day\', \'duration-hour\', \'duration-millisecond\', \'duration-minute\', \'duration-month\', \'duration-second\', \'duration-week\', \'duration-year\', \'length-centimeter\', \'length-foot\', \'length-inch\', \'length-kilometer\', \'length-meter\', \'length-mile-scandinavian\', \'length-mile\', \'length-millimeter\', \'length-yard\', \'mass-gram\', \'mass-kilogram\', \'mass-ounce\', \'mass-pound\', \'mass-stone\', \'temperature-celsius\', \'temperature-fahrenheit\', \'volume-fluid-ounce\', \'volume-gallon\', \'volume-liter\', \'volume-milliliter\']; // In CLDR, the unit name always follows the form `namespace-unit` pattern.\n// For example: `digital-bit` instead of `bit`. This function removes the namespace prefix.\n\nfunction removeUnitNamespace(unit) {\n return unit.replace(/^(.*?)-/, \'\');\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/number-types.js\nvar InternalSlotToken;\n\n(function (InternalSlotToken) {\n // To prevent collision with {0} in CLDR\n InternalSlotToken["compactName"] = "compactName";\n InternalSlotToken["compactSymbol"] = "compactSymbol";\n InternalSlotToken["currencyCode"] = "currencyCode";\n InternalSlotToken["currencyName"] = "currencyName";\n InternalSlotToken["currencyNarrowSymbol"] = "currencyNarrowSymbol";\n InternalSlotToken["currencySymbol"] = "currencySymbol";\n InternalSlotToken["minusSign"] = "minusSign";\n InternalSlotToken["number"] = "number";\n InternalSlotToken["percentSign"] = "percentSign";\n InternalSlotToken["plusSign"] = "plusSign";\n InternalSlotToken["scientificExponent"] = "scientificExponent";\n InternalSlotToken["scientificSeparator"] = "scientificSeparator";\n InternalSlotToken["unitName"] = "unitName";\n InternalSlotToken["unitNarrowSymbol"] = "unitNarrowSymbol";\n InternalSlotToken["unitSymbol"] = "unitSymbol";\n})(InternalSlotToken || (InternalSlotToken = {}));\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl-utils/lib/index.js\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvZGlmZi5qcz83Y2M4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0Bmb3JtYXRqcy9pbnRsLXV0aWxzL2xpYi9hbGlhc2VzLmpzPzU5OTYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3BhcmVudExvY2FsZXMuanM/ZTYzMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvcG9seWZpbGwtdXRpbHMuanM/YzlkMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvZ2V0LWNhbm9uaWNhbC1sb2NhbGVzLmpzP2VmMWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3Jlc29sdmUtbG9jYWxlLmpzPzQyNmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL3VuaXRzLmpzPzEyYTYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2ludGwtdXRpbHMvbGliL251bWJlci10eXBlcy5qcz85M2U0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0Bmb3JtYXRqcy9pbnRsLXV0aWxzL2xpYi9pbmRleC5qcz80MGYyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZUFBZSxTQUFJLElBQUksU0FBSTtBQUMzQjtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLCtDQUErQyx1Q0FBdUM7O0FBRXRGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7QUNuR0E7QUFDQTtBQUNBLDRDQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOztBQ3ZhRDtBQUNBO0FBQ0Esa0RBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOzs7O0FDbkkrQjtBQUNZO0FBQ0o7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTLHVCQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLHVCQUFRO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFTTtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQkFBUSxDQUFDLHFCQUFRLEdBQUc7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QyxDOztBQ3ZXQTtBQUNPLHN5QkFBc3lCO0FBQzd5Qjs7QUFFTztBQUNQO0FBQ0EsQzs7QUNOTzs7QUFFUDtBQUNBLGdDQUFnQyxFQUFFO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOENBQThDLEc7O0FDbkJYO0FBQytSO0FBQ2hNO0FBQzNHO0FBQ087QUFDK0IiLCJmaWxlIjoiMjY1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxudmFyIE1TX1BFUl9TRUNPTkQgPSAxZTM7XG52YXIgU0VDU19QRVJfTUlOID0gNjA7XG52YXIgU0VDU19QRVJfSE9VUiA9IFNFQ1NfUEVSX01JTiAqIDYwO1xudmFyIFNFQ1NfUEVSX0RBWSA9IFNFQ1NfUEVSX0hPVVIgKiAyNDtcbnZhciBTRUNTX1BFUl9XRUVLID0gU0VDU19QRVJfREFZICogNztcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RVbml0KGZyb20sIHRvLCB0aHJlc2hvbGRzKSB7XG4gIGlmICh0byA9PT0gdm9pZCAwKSB7XG4gICAgdG8gPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgaWYgKHRocmVzaG9sZHMgPT09IHZvaWQgMCkge1xuICAgIHRocmVzaG9sZHMgPSB7fTtcbiAgfVxuXG4gIHZhciByZXNvbHZlZFRocmVzaG9sZHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9USFJFU0hPTERTKSwgdGhyZXNob2xkcyB8fCB7fSk7XG5cbiAgdmFyIHNlY3MgPSAoK2Zyb20gLSArdG8pIC8gTVNfUEVSX1NFQ09ORDtcblxuICBpZiAoTWF0aC5hYnMoc2VjcykgPCByZXNvbHZlZFRocmVzaG9sZHMuc2Vjb25kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKHNlY3MpLFxuICAgICAgdW5pdDogJ3NlY29uZCdcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1pbnMgPSBzZWNzIC8gU0VDU19QRVJfTUlOO1xuXG4gIGlmIChNYXRoLmFicyhtaW5zKSA8IHJlc29sdmVkVGhyZXNob2xkcy5taW51dGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IE1hdGgucm91bmQobWlucyksXG4gICAgICB1bml0OiAnbWludXRlJ1xuICAgIH07XG4gIH1cblxuICB2YXIgaG91cnMgPSBzZWNzIC8gU0VDU19QRVJfSE9VUjtcblxuICBpZiAoTWF0aC5hYnMoaG91cnMpIDwgcmVzb2x2ZWRUaHJlc2hvbGRzLmhvdXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IE1hdGgucm91bmQoaG91cnMpLFxuICAgICAgdW5pdDogJ2hvdXInXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkYXlzID0gc2VjcyAvIFNFQ1NfUEVSX0RBWTtcblxuICBpZiAoTWF0aC5hYnMoZGF5cykgPCByZXNvbHZlZFRocmVzaG9sZHMuZGF5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRheXMpLFxuICAgICAgdW5pdDogJ2RheSdcbiAgICB9O1xuICB9XG5cbiAgdmFyIGZyb21EYXRlID0gbmV3IERhdGUoZnJvbSk7XG4gIHZhciB0b0RhdGUgPSBuZXcgRGF0ZSh0byk7XG4gIHZhciB5ZWFycyA9IGZyb21EYXRlLmdldEZ1bGxZZWFyKCkgLSB0b0RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBpZiAoTWF0aC5yb3VuZChNYXRoLmFicyh5ZWFycykpID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogTWF0aC5yb3VuZCh5ZWFycyksXG4gICAgICB1bml0OiAneWVhcidcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1vbnRocyA9IHllYXJzICogMTIgKyBmcm9tRGF0ZS5nZXRNb250aCgpIC0gdG9EYXRlLmdldE1vbnRoKCk7XG5cbiAgaWYgKE1hdGgucm91bmQoTWF0aC5hYnMobW9udGhzKSkgPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKG1vbnRocyksXG4gICAgICB1bml0OiAnbW9udGgnXG4gICAgfTtcbiAgfVxuXG4gIHZhciB3ZWVrcyA9IHNlY3MgLyBTRUNTX1BFUl9XRUVLO1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiBNYXRoLnJvdW5kKHdlZWtzKSxcbiAgICB1bml0OiAnd2VlaydcbiAgfTtcbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9USFJFU0hPTERTID0ge1xuICBzZWNvbmQ6IDQ1LFxuICBtaW51dGU6IDQ1LFxuICBob3VyOiAyMixcbiAgZGF5OiA1XG59OyIsIi8qIEBnZW5lcmF0ZWQgKi9cbi8vIHByZXR0aWVyLWlnbm9yZSAgXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiYWEtU0FBSE9cIjogXCJzc3lcIixcbiAgXCJhYW1cIjogXCJhYXNcIixcbiAgXCJhYXJcIjogXCJhYVwiLFxuICBcImFia1wiOiBcImFiXCIsXG4gIFwiYWRwXCI6IFwiZHpcIixcbiAgXCJhZnJcIjogXCJhZlwiLFxuICBcImFqdVwiOiBcImpyYlwiLFxuICBcImFrYVwiOiBcImFrXCIsXG4gIFwiYWxiXCI6IFwic3FcIixcbiAgXCJhbHNcIjogXCJzcVwiLFxuICBcImFtaFwiOiBcImFtXCIsXG4gIFwiYXJhXCI6IFwiYXJcIixcbiAgXCJhcmJcIjogXCJhclwiLFxuICBcImFyZ1wiOiBcImFuXCIsXG4gIFwiYXJtXCI6IFwiaHlcIixcbiAgXCJhcnQtbG9qYmFuXCI6IFwiamJvXCIsXG4gIFwiYXNkXCI6IFwic256XCIsXG4gIFwiYXNtXCI6IFwiYXNcIixcbiAgXCJhdWVcIjogXCJrdHpcIixcbiAgXCJhdmFcIjogXCJhdlwiLFxuICBcImF2ZVwiOiBcImFlXCIsXG4gIFwiYXltXCI6IFwiYXlcIixcbiAgXCJheXJcIjogXCJheVwiLFxuICBcImF5eFwiOiBcIm51blwiLFxuICBcImF6LUFaXCI6IFwiYXotTGF0bi1BWlwiLFxuICBcImF6ZVwiOiBcImF6XCIsXG4gIFwiYXpqXCI6IFwiYXpcIixcbiAgXCJiYWtcIjogXCJiYVwiLFxuICBcImJhbVwiOiBcImJtXCIsXG4gIFwiYmFxXCI6IFwiZXVcIixcbiAgXCJiY2NcIjogXCJiYWxcIixcbiAgXCJiY2xcIjogXCJiaWtcIixcbiAgXCJiZWxcIjogXCJiZVwiLFxuICBcImJlblwiOiBcImJuXCIsXG4gIFwiYmdtXCI6IFwiYmNnXCIsXG4gIFwiYmhcIjogXCJiaG9cIixcbiAgXCJiaWhcIjogXCJiaG9cIixcbiAgXCJiaXNcIjogXCJiaVwiLFxuICBcImJqZFwiOiBcImRybFwiLFxuICBcImJvZFwiOiBcImJvXCIsXG4gIFwiYm9zXCI6IFwiYnNcIixcbiAgXCJicmVcIjogXCJiclwiLFxuICBcImJzLUJBXCI6IFwiYnMtTGF0bi1CQVwiLFxuICBcImJ1bFwiOiBcImJnXCIsXG4gIFwiYnVyXCI6IFwibXlcIixcbiAgXCJieGtcIjogXCJsdXlcIixcbiAgXCJieHJcIjogXCJidWFcIixcbiAgXCJjYXRcIjogXCJjYVwiLFxuICBcImNjcVwiOiBcInJraVwiLFxuICBcImNlbC1nYXVsaXNoXCI6IFwieHRnLXgtY2VsLWdhdWxpc2hcIixcbiAgXCJjZXNcIjogXCJjc1wiLFxuICBcImNoYVwiOiBcImNoXCIsXG4gIFwiY2hlXCI6IFwiY2VcIixcbiAgXCJjaGlcIjogXCJ6aFwiLFxuICBcImNodVwiOiBcImN1XCIsXG4gIFwiY2h2XCI6IFwiY3ZcIixcbiAgXCJjanJcIjogXCJtb21cIixcbiAgXCJja2FcIjogXCJjbXJcIixcbiAgXCJjbGRcIjogXCJzeXJcIixcbiAgXCJjbWtcIjogXCJ4Y2hcIixcbiAgXCJjbW5cIjogXCJ6aFwiLFxuICBcImNuclwiOiBcInNyLU1FXCIsXG4gIFwiY29yXCI6IFwia3dcIixcbiAgXCJjb3NcIjogXCJjb1wiLFxuICBcImNveVwiOiBcInBpalwiLFxuICBcImNxdVwiOiBcInF1aFwiLFxuICBcImNyZVwiOiBcImNyXCIsXG4gIFwiY3dkXCI6IFwiY3JcIixcbiAgXCJjeW1cIjogXCJjeVwiLFxuICBcImN6ZVwiOiBcImNzXCIsXG4gIFwiZGFuXCI6IFwiZGFcIixcbiAgXCJkZXVcIjogXCJkZVwiLFxuICBcImRnb1wiOiBcImRvaVwiLFxuICBcImRoZFwiOiBcIm13clwiLFxuICBcImRpa1wiOiBcImRpblwiLFxuICBcImRpcVwiOiBcInp6YVwiLFxuICBcImRpdFwiOiBcImRpZlwiLFxuICBcImRpdlwiOiBcImR2XCIsXG4gIFwiZHJoXCI6IFwibW5cIixcbiAgXCJkcndcIjogXCJmYS1hZlwiLFxuICBcImR1dFwiOiBcIm5sXCIsXG4gIFwiZHpvXCI6IFwiZHpcIixcbiAgXCJla2tcIjogXCJldFwiLFxuICBcImVsbFwiOiBcImVsXCIsXG4gIFwiZW1rXCI6IFwibWFuXCIsXG4gIFwiZW5nXCI6IFwiZW5cIixcbiAgXCJlcG9cIjogXCJlb1wiLFxuICBcImVza1wiOiBcImlrXCIsXG4gIFwiZXN0XCI6IFwiZXRcIixcbiAgXCJldXNcIjogXCJldVwiLFxuICBcImV3ZVwiOiBcImVlXCIsXG4gIFwiZmFvXCI6IFwiZm9cIixcbiAgXCJmYXNcIjogXCJmYVwiLFxuICBcImZhdFwiOiBcImFrXCIsXG4gIFwiZmlqXCI6IFwiZmpcIixcbiAgXCJmaW5cIjogXCJmaVwiLFxuICBcImZyYVwiOiBcImZyXCIsXG4gIFwiZnJlXCI6IFwiZnJcIixcbiAgXCJmcnlcIjogXCJmeVwiLFxuICBcImZ1Y1wiOiBcImZmXCIsXG4gIFwiZnVsXCI6IFwiZmZcIixcbiAgXCJnYXZcIjogXCJkZXZcIixcbiAgXCJnYXpcIjogXCJvbVwiLFxuICBcImdib1wiOiBcImdyYlwiLFxuICBcImdlb1wiOiBcImthXCIsXG4gIFwiZ2VyXCI6IFwiZGVcIixcbiAgXCJnZnhcIjogXCJ2YWpcIixcbiAgXCJnZ25cIjogXCJndnJcIixcbiAgXCJnbGFcIjogXCJnZFwiLFxuICBcImdsZVwiOiBcImdhXCIsXG4gIFwiZ2xnXCI6IFwiZ2xcIixcbiAgXCJnbHZcIjogXCJndlwiLFxuICBcImdub1wiOiBcImdvblwiLFxuICBcImdyZVwiOiBcImVsXCIsXG4gIFwiZ3JuXCI6IFwiZ25cIixcbiAgXCJndGlcIjogXCJueWNcIixcbiAgXCJndWdcIjogXCJnblwiLFxuICBcImd1alwiOiBcImd1XCIsXG4gIFwiZ3V2XCI6IFwiZHV6XCIsXG4gIFwiZ3lhXCI6IFwiZ2JhXCIsXG4gIFwiaGEtTGF0bi1HSFwiOiBcImhhLUdIXCIsXG4gIFwiaGEtTGF0bi1ORVwiOiBcImhhLU5FXCIsXG4gIFwiaGEtTGF0bi1OR1wiOiBcImhhLU5HXCIsXG4gIFwiaGF0XCI6IFwiaHRcIixcbiAgXCJoYXVcIjogXCJoYVwiLFxuICBcImhic1wiOiBcInNyLUxhdG5cIixcbiAgXCJoZG5cIjogXCJoYWlcIixcbiAgXCJoZWFcIjogXCJobW5cIixcbiAgXCJoZWJcIjogXCJoZVwiLFxuICBcImhlclwiOiBcImh6XCIsXG4gIFwiaGltXCI6IFwic3J4XCIsXG4gIFwiaGluXCI6IFwiaGlcIixcbiAgXCJobW9cIjogXCJob1wiLFxuICBcImhyclwiOiBcImphbFwiLFxuICBcImhydlwiOiBcImhyXCIsXG4gIFwiaHVuXCI6IFwiaHVcIixcbiAgXCJoeWVcIjogXCJoeVwiLFxuICBcImktYW1pXCI6IFwiYW1pXCIsXG4gIFwiaS1ibm5cIjogXCJibm5cIixcbiAgXCJpLWhha1wiOiBcImhha1wiLFxuICBcImkta2xpbmdvblwiOiBcInRsaFwiLFxuICBcImktbHV4XCI6IFwibGJcIixcbiAgXCJpLW5hdmFqb1wiOiBcIm52XCIsXG4gIFwiaS1wd25cIjogXCJwd25cIixcbiAgXCJpLXRhb1wiOiBcInRhb1wiLFxuICBcImktdGF5XCI6IFwidGF5XCIsXG4gIFwiaS10c3VcIjogXCJ0c3VcIixcbiAgXCJpLWRlZmF1bHRcIjogXCJlbi14LWktZGVmYXVsdFwiLFxuICBcImktZW5vY2hpYW5cIjogXCJ1bmQteC1pLWVub2NoaWFuXCIsXG4gIFwiaS1taW5nb1wiOiBcInNlZS14LWktbWluZ29cIixcbiAgXCJpYmlcIjogXCJvcGFcIixcbiAgXCJpYm9cIjogXCJpZ1wiLFxuICBcImljZVwiOiBcImlzXCIsXG4gIFwiaWRvXCI6IFwiaW9cIixcbiAgXCJpaWlcIjogXCJpaVwiLFxuICBcImlrZVwiOiBcIml1XCIsXG4gIFwiaWt1XCI6IFwiaXVcIixcbiAgXCJpbGVcIjogXCJpZVwiLFxuICBcImlsd1wiOiBcImdhbFwiLFxuICBcImluXCI6IFwiaWRcIixcbiAgXCJpbmFcIjogXCJpYVwiLFxuICBcImluZFwiOiBcImlkXCIsXG4gIFwiaXBrXCI6IFwiaWtcIixcbiAgXCJpc2xcIjogXCJpc1wiLFxuICBcIml0YVwiOiBcIml0XCIsXG4gIFwiaXdcIjogXCJoZVwiLFxuICBcImphdlwiOiBcImp2XCIsXG4gIFwiamVnXCI6IFwib3liXCIsXG4gIFwiamlcIjogXCJ5aVwiLFxuICBcImpwblwiOiBcImphXCIsXG4gIFwiandcIjogXCJqdlwiLFxuICBcImthbFwiOiBcImtsXCIsXG4gIFwia2FuXCI6IFwia25cIixcbiAgXCJrYXNcIjogXCJrc1wiLFxuICBcImthdFwiOiBcImthXCIsXG4gIFwia2F1XCI6IFwia3JcIixcbiAgXCJrYXpcIjogXCJra1wiLFxuICBcImtnY1wiOiBcInRkZlwiLFxuICBcImtnaFwiOiBcImttbFwiLFxuICBcImtoa1wiOiBcIm1uXCIsXG4gIFwia2htXCI6IFwia21cIixcbiAgXCJraWtcIjogXCJraVwiLFxuICBcImtpblwiOiBcInJ3XCIsXG4gIFwia2lyXCI6IFwia3lcIixcbiAgXCJray1DeXJsLUtaXCI6IFwia2stS1pcIixcbiAgXCJrbXJcIjogXCJrdVwiLFxuICBcImtuY1wiOiBcImtyXCIsXG4gIFwia25nXCI6IFwia2dcIixcbiAgXCJrbm5cIjogXCJrb2tcIixcbiAgXCJrb2pcIjogXCJrd3ZcIixcbiAgXCJrb21cIjogXCJrdlwiLFxuICBcImtvblwiOiBcImtnXCIsXG4gIFwia29yXCI6IFwia29cIixcbiAgXCJrcHZcIjogXCJrdlwiLFxuICBcImtybVwiOiBcImJtZlwiLFxuICBcImtzLUFyYWItSU5cIjogXCJrcy1JTlwiLFxuICBcImt0clwiOiBcImR0cFwiLFxuICBcImt1YVwiOiBcImtqXCIsXG4gIFwia3VyXCI6IFwia3VcIixcbiAgXCJrdnNcIjogXCJnZGpcIixcbiAgXCJrd3FcIjogXCJ5YW1cIixcbiAgXCJreGVcIjogXCJ0dmRcIixcbiAgXCJreS1DeXJsLUtHXCI6IFwia3ktS0dcIixcbiAgXCJrempcIjogXCJkdHBcIixcbiAgXCJrenRcIjogXCJkdHBcIixcbiAgXCJsYW9cIjogXCJsb1wiLFxuICBcImxhdFwiOiBcImxhXCIsXG4gIFwibGF2XCI6IFwibHZcIixcbiAgXCJsYmtcIjogXCJibmNcIixcbiAgXCJsaWlcIjogXCJyYXFcIixcbiAgXCJsaW1cIjogXCJsaVwiLFxuICBcImxpblwiOiBcImxuXCIsXG4gIFwibGl0XCI6IFwibHRcIixcbiAgXCJsbG9cIjogXCJuZ3RcIixcbiAgXCJsbW1cIjogXCJybXhcIixcbiAgXCJsdHpcIjogXCJsYlwiLFxuICBcImx1YlwiOiBcImx1XCIsXG4gIFwibHVnXCI6IFwibGdcIixcbiAgXCJsdnNcIjogXCJsdlwiLFxuICBcIm1hY1wiOiBcIm1rXCIsXG4gIFwibWFoXCI6IFwibWhcIixcbiAgXCJtYWxcIjogXCJtbFwiLFxuICBcIm1hb1wiOiBcIm1pXCIsXG4gIFwibWFyXCI6IFwibXJcIixcbiAgXCJtYXlcIjogXCJtc1wiLFxuICBcIm1lZ1wiOiBcImNpclwiLFxuICBcIm1oclwiOiBcImNobVwiLFxuICBcIm1rZFwiOiBcIm1rXCIsXG4gIFwibWxnXCI6IFwibWdcIixcbiAgXCJtbHRcIjogXCJtdFwiLFxuICBcIm1uLUN5cmwtTU5cIjogXCJtbi1NTlwiLFxuICBcIm1ua1wiOiBcIm1hblwiLFxuICBcIm1vXCI6IFwicm9cIixcbiAgXCJtb2xcIjogXCJyb1wiLFxuICBcIm1vblwiOiBcIm1uXCIsXG4gIFwibXJpXCI6IFwibWlcIixcbiAgXCJtcy1MYXRuLUJOXCI6IFwibXMtQk5cIixcbiAgXCJtcy1MYXRuLU1ZXCI6IFwibXMtTVlcIixcbiAgXCJtcy1MYXRuLVNHXCI6IFwibXMtU0dcIixcbiAgXCJtc2FcIjogXCJtc1wiLFxuICBcIm1zdFwiOiBcIm1yeVwiLFxuICBcIm11cFwiOiBcInJhalwiLFxuICBcIm13alwiOiBcInZhalwiLFxuICBcIm15YVwiOiBcIm15XCIsXG4gIFwibXlkXCI6IFwiYW9nXCIsXG4gIFwibXl0XCI6IFwibXJ5XCIsXG4gIFwibmFkXCI6IFwieG55XCIsXG4gIFwibmF1XCI6IFwibmFcIixcbiAgXCJuYXZcIjogXCJudlwiLFxuICBcIm5ibFwiOiBcIm5yXCIsXG4gIFwibmNwXCI6IFwia2R6XCIsXG4gIFwibmRlXCI6IFwibmRcIixcbiAgXCJuZG9cIjogXCJuZ1wiLFxuICBcIm5lcFwiOiBcIm5lXCIsXG4gIFwibmxkXCI6IFwibmxcIixcbiAgXCJubm9cIjogXCJublwiLFxuICBcIm5uc1wiOiBcIm5iclwiLFxuICBcIm5ueFwiOiBcIm5ndlwiLFxuICBcIm5vXCI6IFwibmJcIixcbiAgXCJuby1ib2tcIjogXCJuYlwiLFxuICBcIm5vLUJPS01BTFwiOiBcIm5iXCIsXG4gIFwibm8tbnluXCI6IFwibm5cIixcbiAgXCJuby1OWU5PUlNLXCI6IFwibm5cIixcbiAgXCJub2JcIjogXCJuYlwiLFxuICBcIm5vclwiOiBcIm5iXCIsXG4gIFwibnBpXCI6IFwibmVcIixcbiAgXCJudHNcIjogXCJwaWpcIixcbiAgXCJueWFcIjogXCJueVwiLFxuICBcIm9jaVwiOiBcIm9jXCIsXG4gIFwib2pnXCI6IFwib2pcIixcbiAgXCJvamlcIjogXCJvalwiLFxuICBcIm9yaVwiOiBcIm9yXCIsXG4gIFwib3JtXCI6IFwib21cIixcbiAgXCJvcnlcIjogXCJvclwiLFxuICBcIm9zc1wiOiBcIm9zXCIsXG4gIFwib3VuXCI6IFwidmFqXCIsXG4gIFwicGEtSU5cIjogXCJwYS1HdXJ1LUlOXCIsXG4gIFwicGEtUEtcIjogXCJwYS1BcmFiLVBLXCIsXG4gIFwicGFuXCI6IFwicGFcIixcbiAgXCJwYnVcIjogXCJwc1wiLFxuICBcInBjclwiOiBcImFkeFwiLFxuICBcInBlclwiOiBcImZhXCIsXG4gIFwicGVzXCI6IFwiZmFcIixcbiAgXCJwbGlcIjogXCJwaVwiLFxuICBcInBsdFwiOiBcIm1nXCIsXG4gIFwicG1jXCI6IFwiaHV3XCIsXG4gIFwicG11XCI6IFwicGhyXCIsXG4gIFwicG5iXCI6IFwibGFoXCIsXG4gIFwicG9sXCI6IFwicGxcIixcbiAgXCJwb3JcIjogXCJwdFwiLFxuICBcInBwYVwiOiBcImJmeVwiLFxuICBcInBwclwiOiBcImxjcVwiLFxuICBcInByc1wiOiBcImZhLUFGXCIsXG4gIFwicHJ5XCI6IFwicHJ0XCIsXG4gIFwicHVzXCI6IFwicHNcIixcbiAgXCJwdXpcIjogXCJwdWJcIixcbiAgXCJxdWVcIjogXCJxdVwiLFxuICBcInF1elwiOiBcInF1XCIsXG4gIFwicm15XCI6IFwicm9tXCIsXG4gIFwicm9oXCI6IFwicm1cIixcbiAgXCJyb25cIjogXCJyb1wiLFxuICBcInJ1bVwiOiBcInJvXCIsXG4gIFwicnVuXCI6IFwicm5cIixcbiAgXCJydXNcIjogXCJydVwiLFxuICBcInNhZ1wiOiBcInNnXCIsXG4gIFwic2FuXCI6IFwic2FcIixcbiAgXCJzY2FcIjogXCJobGVcIixcbiAgXCJzY2NcIjogXCJzclwiLFxuICBcInNjclwiOiBcImhyXCIsXG4gIFwic2duLUJFLUZSXCI6IFwic2ZiXCIsXG4gIFwic2duLUJFLU5MXCI6IFwidmd0XCIsXG4gIFwic2duLUNILURFXCI6IFwic2dnXCIsXG4gIFwic2hcIjogXCJzci1MYXRuXCIsXG4gIFwic2hpLU1BXCI6IFwic2hpLVRmbmctTUFcIixcbiAgXCJzaW5cIjogXCJzaVwiLFxuICBcInNra1wiOiBcIm95YlwiLFxuICBcInNsa1wiOiBcInNrXCIsXG4gIFwic2xvXCI6IFwic2tcIixcbiAgXCJzbHZcIjogXCJzbFwiLFxuICBcInNtZVwiOiBcInNlXCIsXG4gIFwic21vXCI6IFwic21cIixcbiAgXCJzbmFcIjogXCJzblwiLFxuICBcInNuZFwiOiBcInNkXCIsXG4gIFwic29tXCI6IFwic29cIixcbiAgXCJzb3RcIjogXCJzdFwiLFxuICBcInNwYVwiOiBcImVzXCIsXG4gIFwic3B5XCI6IFwia2xuXCIsXG4gIFwic3FpXCI6IFwic3FcIixcbiAgXCJzci1CQVwiOiBcInNyLUN5cmwtQkFcIixcbiAgXCJzci1NRVwiOiBcInNyLUxhdG4tTUVcIixcbiAgXCJzci1SU1wiOiBcInNyLUN5cmwtUlNcIixcbiAgXCJzci1YS1wiOiBcInNyLUN5cmwtWEtcIixcbiAgXCJzcmNcIjogXCJzY1wiLFxuICBcInNyZFwiOiBcInNjXCIsXG4gIFwic3JwXCI6IFwic3JcIixcbiAgXCJzc3dcIjogXCJzc1wiLFxuICBcInN1blwiOiBcInN1XCIsXG4gIFwic3dhXCI6IFwic3dcIixcbiAgXCJzd2NcIjogXCJzdy1DRFwiLFxuICBcInN3ZVwiOiBcInN2XCIsXG4gIFwic3doXCI6IFwic3dcIixcbiAgXCJ0YWhcIjogXCJ0eVwiLFxuICBcInRhbVwiOiBcInRhXCIsXG4gIFwidGF0XCI6IFwidHRcIixcbiAgXCJ0ZHVcIjogXCJkdHBcIixcbiAgXCJ0ZWxcIjogXCJ0ZVwiLFxuICBcInRna1wiOiBcInRnXCIsXG4gIFwidGdsXCI6IFwiZmlsXCIsXG4gIFwidGhhXCI6IFwidGhcIixcbiAgXCJ0aGNcIjogXCJ0cG9cIixcbiAgXCJ0aHhcIjogXCJveWJcIixcbiAgXCJ0aWJcIjogXCJib1wiLFxuICBcInRpZVwiOiBcInJhc1wiLFxuICBcInRpclwiOiBcInRpXCIsXG4gIFwidGtrXCI6IFwidHdtXCIsXG4gIFwidGxcIjogXCJmaWxcIixcbiAgXCJ0bHdcIjogXCJ3ZW9cIixcbiAgXCJ0bXBcIjogXCJ0eWpcIixcbiAgXCJ0bmVcIjogXCJrYWtcIixcbiAgXCJ0bmZcIjogXCJmYS1hZlwiLFxuICBcInRvblwiOiBcInRvXCIsXG4gIFwidHNmXCI6IFwidGFqXCIsXG4gIFwidHNuXCI6IFwidG5cIixcbiAgXCJ0c29cIjogXCJ0c1wiLFxuICBcInR0cVwiOiBcInRtaFwiLFxuICBcInR1a1wiOiBcInRrXCIsXG4gIFwidHVyXCI6IFwidHJcIixcbiAgXCJ0d1wiOiBcImFrXCIsXG4gIFwidHdpXCI6IFwiYWtcIixcbiAgXCJ0em0tTGF0bi1NQVwiOiBcInR6bS1NQVwiLFxuICBcInVnLUFyYWItQ05cIjogXCJ1Zy1DTlwiLFxuICBcInVpZ1wiOiBcInVnXCIsXG4gIFwidWtyXCI6IFwidWtcIixcbiAgXCJ1bXVcIjogXCJkZWxcIixcbiAgXCJ1b2tcIjogXCJlbWFcIixcbiAgXCJ1cmRcIjogXCJ1clwiLFxuICBcInV6LUFGXCI6IFwidXotQXJhYi1BRlwiLFxuICBcInV6LVVaXCI6IFwidXotTGF0bi1VWlwiLFxuICBcInV6YlwiOiBcInV6XCIsXG4gIFwidXpuXCI6IFwidXpcIixcbiAgXCJ2YWktTFJcIjogXCJ2YWktVmFpaS1MUlwiLFxuICBcInZlblwiOiBcInZlXCIsXG4gIFwidmllXCI6IFwidmlcIixcbiAgXCJ2b2xcIjogXCJ2b1wiLFxuICBcIndlbFwiOiBcImN5XCIsXG4gIFwid2xuXCI6IFwid2FcIixcbiAgXCJ3b2xcIjogXCJ3b1wiLFxuICBcInhiYVwiOiBcImNheFwiLFxuICBcInhob1wiOiBcInhoXCIsXG4gIFwieGlhXCI6IFwiYWNuXCIsXG4gIFwieGtoXCI6IFwid2F3XCIsXG4gIFwieHBlXCI6IFwia3BlXCIsXG4gIFwieHNqXCI6IFwic3VqXCIsXG4gIFwieHNsXCI6IFwiZGVuXCIsXG4gIFwieWJkXCI6IFwicmtpXCIsXG4gIFwieWRkXCI6IFwieWlcIixcbiAgXCJ5aWRcIjogXCJ5aVwiLFxuICBcInltYVwiOiBcImxyclwiLFxuICBcInltdFwiOiBcIm10bVwiLFxuICBcInlvclwiOiBcInlvXCIsXG4gIFwieW9zXCI6IFwiem9tXCIsXG4gIFwieXVlLUNOXCI6IFwieXVlLUhhbnMtQ05cIixcbiAgXCJ5dWUtSEtcIjogXCJ5dWUtSGFudC1IS1wiLFxuICBcInl1dVwiOiBcInl1Z1wiLFxuICBcInphaVwiOiBcInphcFwiLFxuICBcInpoLUNOXCI6IFwiemgtSGFucy1DTlwiLFxuICBcInpoLWd1b3l1XCI6IFwiemhcIixcbiAgXCJ6aC1oYWtrYVwiOiBcImhha1wiLFxuICBcInpoLUhLXCI6IFwiemgtSGFudC1IS1wiLFxuICBcInpoLW1pbi1uYW5cIjogXCJuYW5cIixcbiAgXCJ6aC1NT1wiOiBcInpoLUhhbnQtTU9cIixcbiAgXCJ6aC1TR1wiOiBcInpoLUhhbnMtU0dcIixcbiAgXCJ6aC1UV1wiOiBcInpoLUhhbnQtVFdcIixcbiAgXCJ6aC14aWFuZ1wiOiBcImhzblwiLFxuICBcInpoLW1pblwiOiBcIm5hbi14LXpoLW1pblwiLFxuICBcInpoYVwiOiBcInphXCIsXG4gIFwiemhvXCI6IFwiemhcIixcbiAgXCJ6c21cIjogXCJtc1wiLFxuICBcInp1bFwiOiBcInp1XCIsXG4gIFwienliXCI6IFwiemFcIlxufTsiLCIvKiBAZ2VuZXJhdGVkICovXG4vLyBwcmV0dGllci1pZ25vcmUgIFxuZXhwb3J0IGRlZmF1bHQge1xuICBcImVuLTE1MFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUFHXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQUlcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1BVVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUJCXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1CU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUJXXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQlpcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1DQVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUNDXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQ0tcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1DTVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUNYXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tQ1lcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1ER1wiOiBcImVuLTAwMVwiLFxuICBcImVuLURNXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tRVJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1GSlwiOiBcImVuLTAwMVwiLFxuICBcImVuLUZLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tRk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HQlwiOiBcImVuLTAwMVwiLFxuICBcImVuLUdEXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tR0dcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUdJXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tR01cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1HWVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUhLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSUVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1JTFwiOiBcImVuLTAwMVwiLFxuICBcImVuLUlNXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSU5cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1JT1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUpFXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tSk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1LRVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUtJXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tS05cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1LWVwiOiBcImVuLTAwMVwiLFxuICBcImVuLUxDXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTFJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1MU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1HXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTU9cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1NU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1UXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTVVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1NV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLU1ZXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTkFcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1ORlwiOiBcImVuLTAwMVwiLFxuICBcImVuLU5HXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tTlJcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1OVVwiOiBcImVuLTAwMVwiLFxuICBcImVuLU5aXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tUEdcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1QSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVBLXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tUE5cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1QV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVJXXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU0JcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TQ1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVNEXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU0dcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TSFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVNMXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tU1NcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1TWFwiOiBcImVuLTAwMVwiLFxuICBcImVuLVNaXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVENcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1US1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVRPXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVFRcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1UVlwiOiBcImVuLTAwMVwiLFxuICBcImVuLVRaXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVUdcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1WQ1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVZHXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tVlVcIjogXCJlbi0wMDFcIixcbiAgXCJlbi1XU1wiOiBcImVuLTAwMVwiLFxuICBcImVuLVpBXCI6IFwiZW4tMDAxXCIsXG4gIFwiZW4tWk1cIjogXCJlbi0wMDFcIixcbiAgXCJlbi1aV1wiOiBcImVuLTAwMVwiLFxuICBcImVuLUFUXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tQkVcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1DSFwiOiBcImVuLTE1MFwiLFxuICBcImVuLURFXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tREtcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1GSVwiOiBcImVuLTE1MFwiLFxuICBcImVuLU5MXCI6IFwiZW4tMTUwXCIsXG4gIFwiZW4tU0VcIjogXCJlbi0xNTBcIixcbiAgXCJlbi1TSVwiOiBcImVuLTE1MFwiLFxuICBcImVzLUFSXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQk9cIjogXCJlcy00MTlcIixcbiAgXCJlcy1CUlwiOiBcImVzLTQxOVwiLFxuICBcImVzLUJaXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQ0xcIjogXCJlcy00MTlcIixcbiAgXCJlcy1DT1wiOiBcImVzLTQxOVwiLFxuICBcImVzLUNSXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtQ1VcIjogXCJlcy00MTlcIixcbiAgXCJlcy1ET1wiOiBcImVzLTQxOVwiLFxuICBcImVzLUVDXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtR1RcIjogXCJlcy00MTlcIixcbiAgXCJlcy1ITlwiOiBcImVzLTQxOVwiLFxuICBcImVzLU1YXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtTklcIjogXCJlcy00MTlcIixcbiAgXCJlcy1QQVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVBFXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtUFJcIjogXCJlcy00MTlcIixcbiAgXCJlcy1QWVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVNWXCI6IFwiZXMtNDE5XCIsXG4gIFwiZXMtVVNcIjogXCJlcy00MTlcIixcbiAgXCJlcy1VWVwiOiBcImVzLTQxOVwiLFxuICBcImVzLVZFXCI6IFwiZXMtNDE5XCIsXG4gIFwicHQtQU9cIjogXCJwdC1QVFwiLFxuICBcInB0LUNIXCI6IFwicHQtUFRcIixcbiAgXCJwdC1DVlwiOiBcInB0LVBUXCIsXG4gIFwicHQtRlJcIjogXCJwdC1QVFwiLFxuICBcInB0LUdRXCI6IFwicHQtUFRcIixcbiAgXCJwdC1HV1wiOiBcInB0LVBUXCIsXG4gIFwicHQtTFVcIjogXCJwdC1QVFwiLFxuICBcInB0LU1PXCI6IFwicHQtUFRcIixcbiAgXCJwdC1NWlwiOiBcInB0LVBUXCIsXG4gIFwicHQtU1RcIjogXCJwdC1QVFwiLFxuICBcInB0LVRMXCI6IFwicHQtUFRcIixcbiAgXCJ6aC1IYW50LU1PXCI6IFwiemgtSGFudC1IS1wiXG59OyIsImltcG9ydCBhbGlhc2VzIGZyb20gJy4vYWxpYXNlcyc7XG5pbXBvcnQgcGFyZW50TG9jYWxlcyBmcm9tICcuL3BhcmVudExvY2FsZXMnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnLi9pbnZhcmlhbnQnO1xuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG4gKiBAcGFyYW0gYXJnXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvT2JqZWN0KGFyZykge1xuICBpZiAoYXJnID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmRlZmluZWQvbnVsbCBjYW5ub3QgYmUgY29udmVydGVkIHRvIG9iamVjdCcpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdChhcmcpO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvc3RyaW5nXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKG8pIHtcbiAgLy8gT25seSBzeW1ib2wgaXMgaXJyZWd1bGFyLi4uXG4gIGlmICh0eXBlb2YgbyA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKG8pO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTQwMi8jc2VjLWdldG9wdGlvblxuICogQHBhcmFtIG9wdHNcbiAqIEBwYXJhbSBwcm9wXG4gKiBAcGFyYW0gdHlwZVxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIGZhbGxiYWNrXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wdGlvbihvcHRzLCBwcm9wLCB0eXBlLCB2YWx1ZXMsIGZhbGxiYWNrKSB7XG4gIC8vIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9wdHMsIHByb3ApO1xuICB2YXIgdmFsdWUgPSBvcHRzW3Byb3BdO1xuXG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgdmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMgIT09IHVuZGVmaW5lZCAmJiAhdmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsID09IHZhbHVlO1xuICAgIH0pLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IodmFsdWUgKyBcIiBpcyBub3Qgd2l0aGluIFwiICsgdmFsdWVzLmpvaW4oJywgJykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFjaztcbn1cbi8qKlxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy1kZWZhdWx0bnVtYmVyb3B0aW9uXG4gKiBAcGFyYW0gdmFsXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKiBAcGFyYW0gZmFsbGJhY2tcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE51bWJlck9wdGlvbih2YWwsIG1pbiwgbWF4LCBmYWxsYmFjaykge1xuICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBOdW1iZXIodmFsKTtcblxuICAgIGlmIChpc05hTih2YWwpIHx8IHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHZhbCArIFwiIGlzIG91dHNpZGUgb2YgcmFuZ2UgW1wiICsgbWluICsgXCIsIFwiICsgbWF4ICsgXCJdXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKHZhbCk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2s7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtZ2V0bnVtYmVyb3B0aW9uXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHByb3BlcnR5XG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKiBAcGFyYW0gZmFsbGJhY2tcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyT3B0aW9uKG9wdGlvbnMsIHByb3BlcnR5LCBtaW5pbXVtLCBtYXhpbXVtLCBmYWxsYmFjaykge1xuICB2YXIgdmFsID0gb3B0aW9uc1twcm9wZXJ0eV07XG4gIHJldHVybiBkZWZhdWx0TnVtYmVyT3B0aW9uKHZhbCwgbWluaW11bSwgbWF4aW11bSwgZmFsbGJhY2spO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsaWFzZXNCeUxhbmcobGFuZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoYWxpYXNlcykucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGxvY2FsZSkge1xuICAgIGlmIChsb2NhbGUuc3BsaXQoJy0nKVswXSA9PT0gbGFuZykge1xuICAgICAgYWxsW2xvY2FsZV0gPSBhbGlhc2VzW2xvY2FsZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbDtcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudExvY2FsZXNCeUxhbmcobGFuZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFyZW50TG9jYWxlcykucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGxvY2FsZSkge1xuICAgIGlmIChsb2NhbGUuc3BsaXQoJy0nKVswXSA9PT0gbGFuZykge1xuICAgICAgYWxsW2xvY2FsZV0gPSBwYXJlbnRMb2NhbGVzW2xvY2FsZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbDtcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKCFtYXAuZ2V0KHBsKSkge1xuICAgIG1hcC5zZXQocGwsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgdmFyIHNsb3RzID0gbWFwLmdldChwbCk7XG4gIHNsb3RzW2ZpZWxkXSA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrID0gX2FbX2ldO1xuICAgIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBrLCBwcm9wc1trXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNsb3QobWFwLCBwbCwgZmllbGQpIHtcbiAgcmV0dXJuIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBmaWVsZClbZmllbGRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsKSB7XG4gIHZhciBmaWVsZHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGZpZWxkc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBzbG90cyA9IG1hcC5nZXQocGwpO1xuXG4gIGlmICghc2xvdHMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHBsICsgXCIgSW50ZXJuYWxTbG90IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGYpIHtcbiAgICBhbGxbZl0gPSBzbG90c1tmXTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSB7XG4gIHJldHVybiBwYXR0ZXJuUGFydC50eXBlID09PSAnbGl0ZXJhbCc7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUGF0dGVybihwYXR0ZXJuKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGJlZ2luSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snKTtcbiAgdmFyIGVuZEluZGV4ID0gMDtcbiAgdmFyIG5leHRJbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDtcblxuICB3aGlsZSAoYmVnaW5JbmRleCA8IHBhdHRlcm4ubGVuZ3RoICYmIGJlZ2luSW5kZXggPiAtMSkge1xuICAgIGVuZEluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd9JywgYmVnaW5JbmRleCk7XG4gICAgaW52YXJpYW50KGVuZEluZGV4ID4gYmVnaW5JbmRleCwgXCJJbnZhbGlkIHBhdHRlcm4gXCIgKyBwYXR0ZXJuKTtcblxuICAgIGlmIChiZWdpbkluZGV4ID4gbmV4dEluZGV4KSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgICAgdmFsdWU6IHBhdHRlcm4uc3Vic3RyaW5nKG5leHRJbmRleCwgYmVnaW5JbmRleClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIHR5cGU6IHBhdHRlcm4uc3Vic3RyaW5nKGJlZ2luSW5kZXggKyAxLCBlbmRJbmRleCksXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gICAgbmV4dEluZGV4ID0gZW5kSW5kZXggKyAxO1xuICAgIGJlZ2luSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snLCBuZXh0SW5kZXgpO1xuICB9XG5cbiAgaWYgKG5leHRJbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIHR5cGU6ICdsaXRlcmFsJyxcbiAgICAgIHZhbHVlOiBwYXR0ZXJuLnN1YnN0cmluZyhuZXh0SW5kZXgsIGxlbmd0aClcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtc2V0bmZkaWdpdG9wdGlvbnNcbiAqIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC11bmlmaWVkLWludGwtbnVtYmVyZm9ybWF0L3NlY3Rpb24xMS9udW1iZXJmb3JtYXRfZGlmZl9vdXQuaHRtbCNzZWMtc2V0bmZkaWdpdG9wdGlvbnNcbiAqIEBwYXJhbSBpbnRsT2JqXG4gKiBAcGFyYW0gb3B0c1xuICogQHBhcmFtIG1uZmREZWZhdWx0XG4gKiBAcGFyYW0gbXhmZERlZmF1bHRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TnVtYmVyRm9ybWF0RGlnaXRPcHRpb25zKGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgb3B0cywgbW5mZERlZmF1bHQsIG14ZmREZWZhdWx0KSB7XG4gIHZhciBtbmlkID0gZ2V0TnVtYmVyT3B0aW9uKG9wdHMsICdtaW5pbXVtSW50ZWdlckRpZ2l0cycsIDEsIDIxLCAxKTtcbiAgdmFyIG1uZmQgPSBvcHRzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgdmFyIG14ZmQgPSBvcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cztcbiAgdmFyIG1uc2QgPSBvcHRzLm1pbmltdW1TaWduaWZpY2FudERpZ2l0cztcbiAgdmFyIG14c2QgPSBvcHRzLm1heGltdW1TaWduaWZpY2FudERpZ2l0cztcbiAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1JbnRlZ2VyRGlnaXRzJywgbW5pZCk7XG5cbiAgaWYgKG1uc2QgIT09IHVuZGVmaW5lZCB8fCBteHNkICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAncm91bmRpbmdUeXBlJywgJ3NpZ25pZmljYW50RGlnaXRzJyk7XG4gICAgbW5zZCA9IGRlZmF1bHROdW1iZXJPcHRpb24obW5zZCwgMSwgMjEsIDEpO1xuICAgIG14c2QgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG14c2QsIG1uc2QsIDIxLCAyMSk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1TaWduaWZpY2FudERpZ2l0cycsIG1uc2QpO1xuICAgIHNldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIGludGxPYmosICdtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMnLCBteHNkKTtcbiAgfSBlbHNlIGlmIChtbmZkICE9PSB1bmRlZmluZWQgfHwgbXhmZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ3JvdW5kaW5nVHlwZScsICdmcmFjdGlvbkRpZ2l0cycpO1xuICAgIG1uZmQgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG1uZmQsIDAsIDIwLCBtbmZkRGVmYXVsdCk7XG4gICAgdmFyIG14ZmRBY3R1YWxEZWZhdWx0ID0gTWF0aC5tYXgobW5mZCwgbXhmZERlZmF1bHQpO1xuICAgIG14ZmQgPSBkZWZhdWx0TnVtYmVyT3B0aW9uKG14ZmQsIG1uZmQsIDIwLCBteGZkQWN0dWFsRGVmYXVsdCk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1GcmFjdGlvbkRpZ2l0cycsIG1uZmQpO1xuICAgIHNldEludGVybmFsU2xvdChpbnRlcm5hbFNsb3RNYXAsIGludGxPYmosICdtYXhpbXVtRnJhY3Rpb25EaWdpdHMnLCBteGZkKTtcbiAgfSBlbHNlIGlmIChnZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAnbm90YXRpb24nKSA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ3JvdW5kaW5nVHlwZScsICdjb21wYWN0Um91bmRpbmcnKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAncm91bmRpbmdUeXBlJywgJ2ZyYWN0aW9uRGlnaXRzJyk7XG4gICAgc2V0SW50ZXJuYWxTbG90KGludGVybmFsU2xvdE1hcCwgaW50bE9iaiwgJ21pbmltdW1GcmFjdGlvbkRpZ2l0cycsIG1uZmREZWZhdWx0KTtcbiAgICBzZXRJbnRlcm5hbFNsb3QoaW50ZXJuYWxTbG90TWFwLCBpbnRsT2JqLCAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJywgbXhmZERlZmF1bHQpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0SXMoeCwgeSkge1xuICBpZiAoT2JqZWN0LmlzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5pcyh4LCB5KTtcbiAgfSAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG5cblxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG5cblxuICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xufVxudmFyIE5PVF9BX1pfUkVHRVggPSAvW15BLVpdLztcbi8qKlxuICogVGhpcyBmb2xsb3dzIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtY2FzZS1zZW5zaXRpdml0eS1hbmQtY2FzZS1tYXBwaW5nXG4gKiBAcGFyYW0gc3RyIHN0cmluZyB0byBjb252ZXJ0XG4gKi9cblxuZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXpdKS9nLCBmdW5jdGlvbiAoXywgYykge1xuICAgIHJldHVybiBjLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuLyoqXG4gKiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtdW5pZmllZC1pbnRsLW51bWJlcmZvcm1hdC9zZWN0aW9uNi9sb2NhbGVzLWN1cnJlbmNpZXMtdHpfcHJvcG9zZWRfb3V0Lmh0bWwjc2VjLWlzd2VsbGZvcm1lZGN1cnJlbmN5Y29kZVxuICogQHBhcmFtIGN1cnJlbmN5XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWxsRm9ybWVkQ3VycmVuY3lDb2RlKGN1cnJlbmN5KSB7XG4gIGN1cnJlbmN5ID0gdG9VcHBlckNhc2UoY3VycmVuY3kpO1xuXG4gIGlmIChjdXJyZW5jeS5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoTk9UX0FfWl9SRUdFWC50ZXN0KGN1cnJlbmN5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsIi8qKlxuICogSUUxMS1zYWZlIHZlcnNpb24gb2YgZ2V0Q2Fub25pY2FsTG9jYWxlcyBzaW5jZSBpdCdzIEVTMjAxNlxuICogQHBhcmFtIGxvY2FsZXMgbG9jYWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsTG9jYWxlcyhsb2NhbGVzKSB7XG4gIC8vIElFMTFcbiAgdmFyIGdldENhbm9uaWNhbExvY2FsZXMgPSBJbnRsLmdldENhbm9uaWNhbExvY2FsZXM7XG5cbiAgaWYgKHR5cGVvZiBnZXRDYW5vbmljYWxMb2NhbGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdldENhbm9uaWNhbExvY2FsZXMobG9jYWxlcyk7XG4gIH0gLy8gTk9URTogd2UgbXVzdCBOT1QgY2FsbCBgc3VwcG9ydGVkTG9jYWxlc09mYCBvZiBhIGZvcm1hdGpzIHBvbHlmaWxsLCBvciB0aGVpciBpbXBsZW1lbnRhdGlvblxuICAvLyB3aWxsIGV2ZW4gZXZlbnR1YWxseSBjYWxsIHRoaXMgbWV0aG9kIHJlY3Vyc2l2ZWx5LiBIZXJlIHdlIHVzZSBgSW50bC5EYXRlVGltZUZvcm1hdGAgc2luY2UgaXRcbiAgLy8gaXMgbm90IHBvbHlmaWxsZWQgYnkgYEBmb3JtYXRqc2AuXG4gIC8vIFRPRE86IEZpeCBUeXBlU2NyaXB0IHR5cGUgZGVmIGZvciB0aGlzIGJjIHVuZGVmaW5lZCBpcyBqdXN0IGZpbmVcblxuXG4gIHJldHVybiBJbnRsLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihsb2NhbGVzKTtcbn0iLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBnZXRDYW5vbmljYWxMb2NhbGVzIH0gZnJvbSAnLi9nZXQtY2Fub25pY2FsLWxvY2FsZXMnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnLi9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgdG9PYmplY3QsIGdldE9wdGlvbiB9IGZyb20gJy4vcG9seWZpbGwtdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVMb2NhbGUoZ2V0RGVmYXVsdExvY2FsZSkge1xuICB2YXIgbG9va3VwTWF0Y2hlciA9IGNyZWF0ZUxvb2t1cE1hdGNoZXIoZ2V0RGVmYXVsdExvY2FsZSk7XG4gIHZhciBiZXN0Rml0TWF0Y2hlciA9IGNyZWF0ZUJlc3RGaXRNYXRjaGVyKGdldERlZmF1bHRMb2NhbGUpO1xuICAvKipcbiAgICogaHR0cHM6Ly90YzM5LmVzL2VjbWE0MDIvI3NlYy1yZXNvbHZlbG9jYWxlXG4gICAqL1xuXG4gIHJldHVybiBmdW5jdGlvbiByZXNvbHZlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMsIG9wdGlvbnMsIHJlbGV2YW50RXh0ZW5zaW9uS2V5cywgbG9jYWxlRGF0YSkge1xuICAgIHZhciBtYXRjaGVyID0gb3B0aW9ucy5sb2NhbGVNYXRjaGVyO1xuICAgIHZhciByO1xuXG4gICAgaWYgKG1hdGNoZXIgPT09ICdsb29rdXAnKSB7XG4gICAgICByID0gbG9va3VwTWF0Y2hlcihhdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgciA9IGJlc3RGaXRNYXRjaGVyKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMpO1xuICAgIH1cblxuICAgIHZhciBmb3VuZExvY2FsZSA9IHIubG9jYWxlO1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnLFxuICAgICAgZGF0YUxvY2FsZTogZm91bmRMb2NhbGVcbiAgICB9O1xuICAgIHZhciBzdXBwb3J0ZWRFeHRlbnNpb24gPSAnLXUnO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCByZWxldmFudEV4dGVuc2lvbktleXNfMSA9IHJlbGV2YW50RXh0ZW5zaW9uS2V5czsgX2kgPCByZWxldmFudEV4dGVuc2lvbktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrZXkgPSByZWxldmFudEV4dGVuc2lvbktleXNfMVtfaV07XG4gICAgICB2YXIgZm91bmRMb2NhbGVEYXRhID0gbG9jYWxlRGF0YVtmb3VuZExvY2FsZV07XG4gICAgICBpbnZhcmlhbnQodHlwZW9mIGZvdW5kTG9jYWxlRGF0YSA9PT0gJ29iamVjdCcgJiYgZm91bmRMb2NhbGVEYXRhICE9PSBudWxsLCBcImxvY2FsZSBkYXRhIFwiICsga2V5ICsgXCIgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgICB2YXIga2V5TG9jYWxlRGF0YSA9IGZvdW5kTG9jYWxlRGF0YVtrZXldO1xuICAgICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkoa2V5TG9jYWxlRGF0YSksIFwia2V5TG9jYWxlRGF0YSBmb3IgXCIgKyBrZXkgKyBcIiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgdmFyIHZhbHVlID0ga2V5TG9jYWxlRGF0YVswXTtcbiAgICAgIGludmFyaWFudCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSBudWxsLCAndmFsdWUgbXVzdCBiZSBzdHJpbmcgb3IgbnVsbCcpO1xuICAgICAgdmFyIHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uID0gJyc7XG5cbiAgICAgIGlmIChyLmV4dGVuc2lvbikge1xuICAgICAgICB2YXIgcmVxdWVzdGVkVmFsdWUgPSB1bmljb2RlRXh0ZW5zaW9uVmFsdWUoci5leHRlbnNpb24sIGtleSk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdGVkVmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgICBpZiAofmtleUxvY2FsZURhdGEuaW5kZXhPZihyZXF1ZXN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uQWRkaXRpb24gPSBcIi1cIiArIGtleSArIFwiLVwiICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh+cmVxdWVzdGVkVmFsdWUuaW5kZXhPZigndHJ1ZScpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uID0gXCItXCIgKyBrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICB2YXIgb3B0aW9uc1ZhbHVlID0gb3B0aW9uc1trZXldO1xuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIG9wdGlvbnNWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbnNWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9uc1ZhbHVlID09PSBudWxsLCAnb3B0aW9uc1ZhbHVlIG11c3QgYmUgU3RyaW5nLCBVbmRlZmluZWQgb3IgTnVsbCcpO1xuXG4gICAgICAgIGlmICh+a2V5TG9jYWxlRGF0YS5pbmRleE9mKG9wdGlvbnNWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAob3B0aW9uc1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zVmFsdWU7XG4gICAgICAgICAgICBzdXBwb3J0ZWRFeHRlbnNpb25BZGRpdGlvbiA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uICs9IHN1cHBvcnRlZEV4dGVuc2lvbkFkZGl0aW9uO1xuICAgIH1cblxuICAgIGlmIChzdXBwb3J0ZWRFeHRlbnNpb24ubGVuZ3RoID4gMikge1xuICAgICAgdmFyIHByaXZhdGVJbmRleCA9IGZvdW5kTG9jYWxlLmluZGV4T2YoJy14LScpO1xuXG4gICAgICBpZiAocHJpdmF0ZUluZGV4ID09PSAtMSkge1xuICAgICAgICBmb3VuZExvY2FsZSA9IGZvdW5kTG9jYWxlICsgc3VwcG9ydGVkRXh0ZW5zaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHByZUV4dGVuc2lvbiA9IGZvdW5kTG9jYWxlLnNsaWNlKDAsIHByaXZhdGVJbmRleCk7XG4gICAgICAgIHZhciBwb3N0RXh0ZW5zaW9uID0gZm91bmRMb2NhbGUuc2xpY2UocHJpdmF0ZUluZGV4LCBmb3VuZExvY2FsZS5sZW5ndGgpO1xuICAgICAgICBmb3VuZExvY2FsZSA9IHByZUV4dGVuc2lvbiArIHN1cHBvcnRlZEV4dGVuc2lvbiArIHBvc3RFeHRlbnNpb247XG4gICAgICB9XG5cbiAgICAgIGZvdW5kTG9jYWxlID0gZ2V0Q2Fub25pY2FsTG9jYWxlcyhmb3VuZExvY2FsZSlbMF07XG4gICAgfVxuXG4gICAgcmVzdWx0LmxvY2FsZSA9IGZvdW5kTG9jYWxlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtdW5pY29kZWV4dGVuc2lvbnZhbHVlXG4gKiBAcGFyYW0gZXh0ZW5zaW9uXG4gKiBAcGFyYW0ga2V5XG4gKi9cblxuZnVuY3Rpb24gdW5pY29kZUV4dGVuc2lvblZhbHVlKGV4dGVuc2lvbiwga2V5KSB7XG4gIGludmFyaWFudChrZXkubGVuZ3RoID09PSAyLCAna2V5IG11c3QgaGF2ZSAyIGVsZW1lbnRzJyk7XG4gIHZhciBzaXplID0gZXh0ZW5zaW9uLmxlbmd0aDtcbiAgdmFyIHNlYXJjaFZhbHVlID0gXCItXCIgKyBrZXkgKyBcIi1cIjtcbiAgdmFyIHBvcyA9IGV4dGVuc2lvbi5pbmRleE9mKHNlYXJjaFZhbHVlKTtcblxuICBpZiAocG9zICE9PSAtMSkge1xuICAgIHZhciBzdGFydCA9IHBvcyArIDQ7XG4gICAgdmFyIGVuZCA9IHN0YXJ0O1xuICAgIHZhciBrID0gc3RhcnQ7XG4gICAgdmFyIGRvbmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgdmFyIGUgPSBleHRlbnNpb24uaW5kZXhPZignLScsIGspO1xuICAgICAgdmFyIGxlbiA9IHZvaWQgMDtcblxuICAgICAgaWYgKGUgPT09IC0xKSB7XG4gICAgICAgIGxlbiA9IHNpemUgLSBrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gZSAtIGs7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGUgPT09IC0xKSB7XG4gICAgICAgIGVuZCA9IHNpemU7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gZTtcbiAgICAgICAgayA9IGUgKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHRlbnNpb24uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBzZWFyY2hWYWx1ZSA9IFwiLVwiICsga2V5O1xuICBwb3MgPSBleHRlbnNpb24uaW5kZXhPZihzZWFyY2hWYWx1ZSk7XG5cbiAgaWYgKHBvcyAhPT0gLTEgJiYgcG9zICsgMyA9PT0gc2l6ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnZhciBVTklDT0RFX0VYVEVOU0lPTl9TRVFVRU5DRV9SRUdFWCA9IC8tdSg/Oi1bMC05YS16XXsyLDh9KSsvZ2k7XG4vKipcbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtYmVzdGF2YWlsYWJsZWxvY2FsZVxuICogQHBhcmFtIGF2YWlsYWJsZUxvY2FsZXNcbiAqIEBwYXJhbSBsb2NhbGVcbiAqL1xuXG5mdW5jdGlvbiBiZXN0QXZhaWxhYmxlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIGxvY2FsZSkge1xuICB2YXIgY2FuZGlkYXRlID0gbG9jYWxlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKH5hdmFpbGFibGVMb2NhbGVzLmluZGV4T2YoY2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgcG9zID0gY2FuZGlkYXRlLmxhc3RJbmRleE9mKCctJyk7XG5cbiAgICBpZiAoIX5wb3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSAyICYmIGNhbmRpZGF0ZVtwb3MgLSAyXSA9PT0gJy0nKSB7XG4gICAgICBwb3MgLT0gMjtcbiAgICB9XG5cbiAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUuc2xpY2UoMCwgcG9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMb29rdXBNYXRjaGVyKGdldERlZmF1bHRMb2NhbGUpIHtcbiAgLyoqXG4gICAqIGh0dHBzOi8vdGMzOS5lcy9lY21hNDAyLyNzZWMtbG9va3VwbWF0Y2hlclxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uIGxvb2t1cE1hdGNoZXIoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnXG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgcmVxdWVzdGVkTG9jYWxlc18xID0gcmVxdWVzdGVkTG9jYWxlczsgX2kgPCByZXF1ZXN0ZWRMb2NhbGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18xW19pXTtcbiAgICAgIHZhciBub0V4dGVuc2lvbkxvY2FsZSA9IGxvY2FsZS5yZXBsYWNlKFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYLCAnJyk7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlID0gYmVzdEF2YWlsYWJsZUxvY2FsZShhdmFpbGFibGVMb2NhbGVzLCBub0V4dGVuc2lvbkxvY2FsZSk7XG5cbiAgICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgICAgcmVzdWx0LmxvY2FsZSA9IGF2YWlsYWJsZUxvY2FsZTtcblxuICAgICAgICBpZiAobG9jYWxlICE9PSBub0V4dGVuc2lvbkxvY2FsZSkge1xuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb24gPSBsb2NhbGUuc2xpY2Uobm9FeHRlbnNpb25Mb2NhbGUubGVuZ3RoICsgMSwgbG9jYWxlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5sb2NhbGUgPSBnZXREZWZhdWx0TG9jYWxlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQmVzdEZpdE1hdGNoZXIoZ2V0RGVmYXVsdExvY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gYmVzdEZpdE1hdGNoZXIoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBsb2NhbGU6ICcnXG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgcmVxdWVzdGVkTG9jYWxlc18yID0gcmVxdWVzdGVkTG9jYWxlczsgX2kgPCByZXF1ZXN0ZWRMb2NhbGVzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18yW19pXTtcbiAgICAgIHZhciBub0V4dGVuc2lvbkxvY2FsZSA9IGxvY2FsZS5yZXBsYWNlKFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYLCAnJyk7XG4gICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlID0gYmVzdEF2YWlsYWJsZUxvY2FsZShhdmFpbGFibGVMb2NhbGVzLCBub0V4dGVuc2lvbkxvY2FsZSk7XG5cbiAgICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgICAgcmVzdWx0LmxvY2FsZSA9IGF2YWlsYWJsZUxvY2FsZTtcblxuICAgICAgICBpZiAobG9jYWxlICE9PSBub0V4dGVuc2lvbkxvY2FsZSkge1xuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb24gPSBsb2NhbGUuc2xpY2Uobm9FeHRlbnNpb25Mb2NhbGUubGVuZ3RoICsgMSwgbG9jYWxlLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5sb2NhbGUgPSBnZXREZWZhdWx0TG9jYWxlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUhpZXJhcmNoeShsb2NhbGUsIGFsaWFzZXMsIHBhcmVudExvY2FsZXMpIHtcbiAgdmFyIHJlc3VsdHMgPSBbbG9jYWxlXTtcblxuICBpZiAoYWxpYXNlc1tsb2NhbGVdKSB7XG4gICAgbG9jYWxlID0gYWxpYXNlc1tsb2NhbGVdO1xuICAgIHJlc3VsdHMucHVzaChsb2NhbGUpO1xuICB9XG5cbiAgdmFyIHBhcmVudExvY2FsZSA9IHBhcmVudExvY2FsZXNbbG9jYWxlXTtcblxuICBpZiAocGFyZW50TG9jYWxlKSB7XG4gICAgcmVzdWx0cy5wdXNoKHBhcmVudExvY2FsZSk7XG4gIH1cblxuICB2YXIgbG9jYWxlUGFydHMgPSBsb2NhbGUuc3BsaXQoJy0nKTtcblxuICBmb3IgKHZhciBpID0gbG9jYWxlUGFydHMubGVuZ3RoOyBpID4gMTsgaS0tKSB7XG4gICAgcmVzdWx0cy5wdXNoKGxvY2FsZVBhcnRzLnNsaWNlKDAsIGkgLSAxKS5qb2luKCctJykpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFN1cHBvcnRlZExvY2FsZXMoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcykge1xuICB2YXIgc3Vic2V0ID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwLCByZXF1ZXN0ZWRMb2NhbGVzXzMgPSByZXF1ZXN0ZWRMb2NhbGVzOyBfaSA8IHJlcXVlc3RlZExvY2FsZXNfMy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgbG9jYWxlID0gcmVxdWVzdGVkTG9jYWxlc18zW19pXTtcbiAgICB2YXIgbm9FeHRlbnNpb25Mb2NhbGUgPSBsb2NhbGUucmVwbGFjZShVTklDT0RFX0VYVEVOU0lPTl9TRVFVRU5DRV9SRUdFWCwgJycpO1xuICAgIHZhciBhdmFpbGFibGVMb2NhbGUgPSBiZXN0QXZhaWxhYmxlTG9jYWxlKGF2YWlsYWJsZUxvY2FsZXMsIG5vRXh0ZW5zaW9uTG9jYWxlKTtcblxuICAgIGlmIChhdmFpbGFibGVMb2NhbGUpIHtcbiAgICAgIHN1YnNldC5wdXNoKGF2YWlsYWJsZUxvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRlZExvY2FsZXMoYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcywgb3B0aW9ucykge1xuICB2YXIgbWF0Y2hlciA9ICdiZXN0IGZpdCc7XG5cbiAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB0b09iamVjdChvcHRpb25zKTtcbiAgICBtYXRjaGVyID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdsb2NhbGVNYXRjaGVyJywgJ3N0cmluZycsIFsnbG9va3VwJywgJ2Jlc3QgZml0J10sICdiZXN0IGZpdCcpO1xuICB9XG5cbiAgaWYgKG1hdGNoZXIgPT09ICdiZXN0IGZpdCcpIHtcbiAgICByZXR1cm4gbG9va3VwU3VwcG9ydGVkTG9jYWxlcyhhdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzKTtcbiAgfVxuXG4gIHJldHVybiBsb29rdXBTdXBwb3J0ZWRMb2NhbGVzKGF2YWlsYWJsZUxvY2FsZXMsIHJlcXVlc3RlZExvY2FsZXMpO1xufVxuXG52YXIgTWlzc2luZ0xvY2FsZURhdGFFcnJvciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhNaXNzaW5nTG9jYWxlRGF0YUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIE1pc3NpbmdMb2NhbGVEYXRhRXJyb3IoKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy50eXBlID0gJ01JU1NJTkdfTE9DQUxFX0RBVEEnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBNaXNzaW5nTG9jYWxlRGF0YUVycm9yO1xufShFcnJvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IoZSkge1xuICByZXR1cm4gZS50eXBlID09PSAnTUlTU0lOR19MT0NBTEVfREFUQSc7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrRGF0YShsb2NhbGUsIGxvY2FsZURhdGEsXG4vKiogQnkgZGVmYXVsdCBzaGFsbG93IG1lcmdlIHRoZSBkaWN0aW9uYXJpZXMuICovXG5yZWR1Y2VyKSB7XG4gIGlmIChyZWR1Y2VyID09PSB2b2lkIDApIHtcbiAgICByZWR1Y2VyID0gZnVuY3Rpb24gcmVkdWNlcihhbGwsIGQpIHtcbiAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYWxsKSwgZCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBsb2NhbGVIaWVyYXJjaHkgPSBnZXRMb2NhbGVIaWVyYXJjaHkobG9jYWxlLCBsb2NhbGVEYXRhLmFsaWFzZXMsIGxvY2FsZURhdGEucGFyZW50TG9jYWxlcyk7XG4gIHZhciBkYXRhVG9NZXJnZSA9IGxvY2FsZUhpZXJhcmNoeS5tYXAoZnVuY3Rpb24gKGwpIHtcbiAgICByZXR1cm4gbG9jYWxlRGF0YS5kYXRhW2xdO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKCFkYXRhVG9NZXJnZS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ0xvY2FsZURhdGFFcnJvcihcIk1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIFxcXCJcIiArIGxvY2FsZSArIFwiXFxcIiwgbG9va3VwIGhpZXJhcmNoeTogXCIgKyBsb2NhbGVIaWVyYXJjaHkuam9pbignLCAnKSk7XG4gIH1cblxuICBkYXRhVG9NZXJnZS5yZXZlcnNlKCk7XG4gIHJldHVybiBkYXRhVG9NZXJnZS5yZWR1Y2UocmVkdWNlciwge30pO1xufSIsIi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC11bmlmaWVkLWludGwtbnVtYmVyZm9ybWF0L3NlY3Rpb242L2xvY2FsZXMtY3VycmVuY2llcy10el9kaWZmX291dC5odG1sI3NlYy1pc3NhbmN0aW9uZWRzaW1wbGV1bml0aWRlbnRpZmllclxuZXhwb3J0IHZhciBTQU5DVElPTkVEX1VOSVRTID0gWydhbmdsZS1kZWdyZWUnLCAnYXJlYS1hY3JlJywgJ2FyZWEtaGVjdGFyZScsICdjb25jZW50ci1wZXJjZW50JywgJ2RpZ2l0YWwtYml0JywgJ2RpZ2l0YWwtYnl0ZScsICdkaWdpdGFsLWdpZ2FiaXQnLCAnZGlnaXRhbC1naWdhYnl0ZScsICdkaWdpdGFsLWtpbG9iaXQnLCAnZGlnaXRhbC1raWxvYnl0ZScsICdkaWdpdGFsLW1lZ2FiaXQnLCAnZGlnaXRhbC1tZWdhYnl0ZScsICdkaWdpdGFsLXBldGFieXRlJywgJ2RpZ2l0YWwtdGVyYWJpdCcsICdkaWdpdGFsLXRlcmFieXRlJywgJ2R1cmF0aW9uLWRheScsICdkdXJhdGlvbi1ob3VyJywgJ2R1cmF0aW9uLW1pbGxpc2Vjb25kJywgJ2R1cmF0aW9uLW1pbnV0ZScsICdkdXJhdGlvbi1tb250aCcsICdkdXJhdGlvbi1zZWNvbmQnLCAnZHVyYXRpb24td2VlaycsICdkdXJhdGlvbi15ZWFyJywgJ2xlbmd0aC1jZW50aW1ldGVyJywgJ2xlbmd0aC1mb290JywgJ2xlbmd0aC1pbmNoJywgJ2xlbmd0aC1raWxvbWV0ZXInLCAnbGVuZ3RoLW1ldGVyJywgJ2xlbmd0aC1taWxlLXNjYW5kaW5hdmlhbicsICdsZW5ndGgtbWlsZScsICdsZW5ndGgtbWlsbGltZXRlcicsICdsZW5ndGgteWFyZCcsICdtYXNzLWdyYW0nLCAnbWFzcy1raWxvZ3JhbScsICdtYXNzLW91bmNlJywgJ21hc3MtcG91bmQnLCAnbWFzcy1zdG9uZScsICd0ZW1wZXJhdHVyZS1jZWxzaXVzJywgJ3RlbXBlcmF0dXJlLWZhaHJlbmhlaXQnLCAndm9sdW1lLWZsdWlkLW91bmNlJywgJ3ZvbHVtZS1nYWxsb24nLCAndm9sdW1lLWxpdGVyJywgJ3ZvbHVtZS1taWxsaWxpdGVyJ107IC8vIEluIENMRFIsIHRoZSB1bml0IG5hbWUgYWx3YXlzIGZvbGxvd3MgdGhlIGZvcm0gYG5hbWVzcGFjZS11bml0YCBwYXR0ZXJuLlxuLy8gRm9yIGV4YW1wbGU6IGBkaWdpdGFsLWJpdGAgaW5zdGVhZCBvZiBgYml0YC4gVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBuYW1lc3BhY2UgcHJlZml4LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5pdE5hbWVzcGFjZSh1bml0KSB7XG4gIHJldHVybiB1bml0LnJlcGxhY2UoL14oLio/KS0vLCAnJyk7XG59IiwiZXhwb3J0IHZhciBJbnRlcm5hbFNsb3RUb2tlbjtcblxuKGZ1bmN0aW9uIChJbnRlcm5hbFNsb3RUb2tlbikge1xuICAvLyBUbyBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIHswfSBpbiBDTERSXG4gIEludGVybmFsU2xvdFRva2VuW1wiY29tcGFjdE5hbWVcIl0gPSBcImNvbXBhY3ROYW1lXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wiY29tcGFjdFN5bWJvbFwiXSA9IFwiY29tcGFjdFN5bWJvbFwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcImN1cnJlbmN5Q29kZVwiXSA9IFwiY3VycmVuY3lDb2RlXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wiY3VycmVuY3lOYW1lXCJdID0gXCJjdXJyZW5jeU5hbWVcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJjdXJyZW5jeU5hcnJvd1N5bWJvbFwiXSA9IFwiY3VycmVuY3lOYXJyb3dTeW1ib2xcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJjdXJyZW5jeVN5bWJvbFwiXSA9IFwiY3VycmVuY3lTeW1ib2xcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJtaW51c1NpZ25cIl0gPSBcIm1pbnVzU2lnblwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wicGVyY2VudFNpZ25cIl0gPSBcInBlcmNlbnRTaWduXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wicGx1c1NpZ25cIl0gPSBcInBsdXNTaWduXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1wic2NpZW50aWZpY0V4cG9uZW50XCJdID0gXCJzY2llbnRpZmljRXhwb25lbnRcIjtcbiAgSW50ZXJuYWxTbG90VG9rZW5bXCJzY2llbnRpZmljU2VwYXJhdG9yXCJdID0gXCJzY2llbnRpZmljU2VwYXJhdG9yXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1widW5pdE5hbWVcIl0gPSBcInVuaXROYW1lXCI7XG4gIEludGVybmFsU2xvdFRva2VuW1widW5pdE5hcnJvd1N5bWJvbFwiXSA9IFwidW5pdE5hcnJvd1N5bWJvbFwiO1xuICBJbnRlcm5hbFNsb3RUb2tlbltcInVuaXRTeW1ib2xcIl0gPSBcInVuaXRTeW1ib2xcIjtcbn0pKEludGVybmFsU2xvdFRva2VuIHx8IChJbnRlcm5hbFNsb3RUb2tlbiA9IHt9KSk7IiwiZXhwb3J0IHsgc2VsZWN0VW5pdCB9IGZyb20gJy4vZGlmZic7XG5leHBvcnQgeyBkZWZhdWx0TnVtYmVyT3B0aW9uLCBnZXRBbGlhc2VzQnlMYW5nLCBnZXRJbnRlcm5hbFNsb3QsIGdldE11bHRpSW50ZXJuYWxTbG90cywgZ2V0TnVtYmVyT3B0aW9uLCBnZXRPcHRpb24sIGdldFBhcmVudExvY2FsZXNCeUxhbmcsIGlzTGl0ZXJhbFBhcnQsIHBhcnRpdGlvblBhdHRlcm4sIHNldEludGVybmFsU2xvdCwgc2V0TXVsdGlJbnRlcm5hbFNsb3RzLCBzZXROdW1iZXJGb3JtYXREaWdpdE9wdGlvbnMsIHRvT2JqZWN0LCBvYmplY3RJcywgaXNXZWxsRm9ybWVkQ3VycmVuY3lDb2RlLCB0b1N0cmluZyB9IGZyb20gJy4vcG9seWZpbGwtdXRpbHMnO1xuZXhwb3J0IHsgY3JlYXRlUmVzb2x2ZUxvY2FsZSwgZ2V0TG9jYWxlSGllcmFyY2h5LCBzdXBwb3J0ZWRMb2NhbGVzLCB1bnBhY2tEYXRhLCBpc01pc3NpbmdMb2NhbGVEYXRhRXJyb3IgfSBmcm9tICcuL3Jlc29sdmUtbG9jYWxlJztcbmV4cG9ydCAqIGZyb20gJy4vdW5pdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9udW1iZXItdHlwZXMnO1xuZXhwb3J0IHsgZ2V0Q2Fub25pY2FsTG9jYWxlcyB9IGZyb20gJy4vZ2V0LWNhbm9uaWNhbC1sb2NhbGVzJztcbmV4cG9ydCB7IGludmFyaWFudCB9IGZyb20gJy4vaW52YXJpYW50JzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2650\n')},5981:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "k": function() { return /* binding */ invariant; }\n/* harmony export */ });\nfunction invariant(condition, message, Err) {\n if (Err === void 0) {\n Err = Error;\n }\n\n if (!condition) {\n throw new Err(message);\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC11dGlscy9saWIvaW52YXJpYW50LmpzPzQ5NWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTk4MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlLCBFcnIpIHtcbiAgaWYgKEVyciA9PT0gdm9pZCAwKSB7XG4gICAgRXJyID0gRXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnIobWVzc2FnZSk7XG4gIH1cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5981\n')},2393:function(__unused_webpack_module,exports){"use strict";eval('var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = true;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || "initial"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: "POP"\n });\n };\n\n source.addEventListener("popstate", popstateListener);\n return function () {\n source.removeEventListener("popstate", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === "number") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + ""\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? "replace" : "assign"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: "PUSH"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";\n var searchIndex = initialPath.indexOf("?");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : ""\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split("?"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? "" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? "?" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split("?"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? "" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexports.V5 = globalHistory;\n__webpack_unused_export__ = navigate;\n__webpack_unused_export__ = createHistory;\n__webpack_unused_export__ = createMemorySource;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi9oaXN0b3J5LmpzPzZiMDgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFhOztBQUViLHlCQUFrQjs7QUFFbEI7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCwyQkFBMkI7QUFDM0I7QUFDQSxTQUFTLEVBQUU7O0FBRVg7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCw0REFBNEQ7QUFDNUQsa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDOztBQUV0QyxVQUFxQjtBQUNyQix5QkFBZ0I7QUFDaEIseUJBQXFCO0FBQ3JCLHlCQUEwQiIsImZpbGUiOiIyMzkzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRMb2NhdGlvbihzb3VyY2UpIHtcbiAgdmFyIF9zb3VyY2UkbG9jYXRpb24gPSBzb3VyY2UubG9jYXRpb24sXG4gICAgICBzZWFyY2ggPSBfc291cmNlJGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIGhhc2ggPSBfc291cmNlJGxvY2F0aW9uLmhhc2gsXG4gICAgICBocmVmID0gX3NvdXJjZSRsb2NhdGlvbi5ocmVmLFxuICAgICAgb3JpZ2luID0gX3NvdXJjZSRsb2NhdGlvbi5vcmlnaW4sXG4gICAgICBwcm90b2NvbCA9IF9zb3VyY2UkbG9jYXRpb24ucHJvdG9jb2wsXG4gICAgICBob3N0ID0gX3NvdXJjZSRsb2NhdGlvbi5ob3N0LFxuICAgICAgaG9zdG5hbWUgPSBfc291cmNlJGxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgcG9ydCA9IF9zb3VyY2UkbG9jYXRpb24ucG9ydDtcbiAgdmFyIHBhdGhuYW1lID0gc291cmNlLmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gIGlmICghcGF0aG5hbWUgJiYgaHJlZiAmJiBjYW5Vc2VET00pIHtcbiAgICB2YXIgdXJsID0gbmV3IFVSTChocmVmKTtcbiAgICBwYXRobmFtZSA9IHVybC5wYXRobmFtZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGVuY29kZVVSSShkZWNvZGVVUkkocGF0aG5hbWUpKSxcbiAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoLFxuICAgIGhyZWY6IGhyZWYsXG4gICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgIGhvc3Q6IGhvc3QsXG4gICAgaG9zdG5hbWU6IGhvc3RuYW1lLFxuICAgIHBvcnQ6IHBvcnQsXG4gICAgc3RhdGU6IHNvdXJjZS5oaXN0b3J5LnN0YXRlLFxuICAgIGtleTogc291cmNlLmhpc3Rvcnkuc3RhdGUgJiYgc291cmNlLmhpc3Rvcnkuc3RhdGUua2V5IHx8IFwiaW5pdGlhbFwiXG4gIH07XG59O1xuXG52YXIgY3JlYXRlSGlzdG9yeSA9IGZ1bmN0aW9uIGNyZWF0ZUhpc3Rvcnkoc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgdmFyIHRyYW5zaXRpb25pbmcgPSBmYWxzZTtcblxuICB2YXIgcmVzb2x2ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvbigpIHt9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgIH0sXG5cbiAgICBnZXQgdHJhbnNpdGlvbmluZygpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uaW5nO1xuICAgIH0sXG5cbiAgICBfb25UcmFuc2l0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIF9vblRyYW5zaXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIHRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHJlc29sdmVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgICB2YXIgcG9wc3RhdGVMaXN0ZW5lciA9IGZ1bmN0aW9uIHBvcHN0YXRlTGlzdGVuZXIoKSB7XG4gICAgICAgIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oc291cmNlKTtcbiAgICAgICAgbGlzdGVuZXIoe1xuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBhY3Rpb246IFwiUE9QXCJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBwb3BzdGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICByZXR1cm4gZm4gIT09IGxpc3RlbmVyO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBuYXZpZ2F0ZTogZnVuY3Rpb24gbmF2aWdhdGUodG8pIHtcbiAgICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICAgICAgX3JlZiRyZXBsYWNlID0gX3JlZi5yZXBsYWNlLFxuICAgICAgICAgIHJlcGxhY2UgPSBfcmVmJHJlcGxhY2UgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiRyZXBsYWNlO1xuXG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHNvdXJjZS5oaXN0b3J5LmdvKHRvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlID0gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAga2V5OiBEYXRlLm5vdygpICsgXCJcIlxuICAgICAgICB9KTsgLy8gdHJ5Li4uY2F0Y2ggaU9TIFNhZmFyaSBsaW1pdHMgdG8gMTAwIHB1c2hTdGF0ZSBjYWxsc1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb25pbmcgfHwgcmVwbGFjZSkge1xuICAgICAgICAgICAgc291cmNlLmhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCB0byk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZS5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdG8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHNvdXJjZS5sb2NhdGlvbltyZXBsYWNlID8gXCJyZXBsYWNlXCIgOiBcImFzc2lnblwiXSh0byk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgdHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVUcmFuc2l0aW9uID0gcmVzO1xuICAgICAgfSk7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyKHtcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgYWN0aW9uOiBcIlBVU0hcIlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb247XG4gICAgfVxuICB9O1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFN0b3JlcyBoaXN0b3J5IGVudHJpZXMgaW4gbWVtb3J5IGZvciB0ZXN0aW5nIG9yIG90aGVyIHBsYXRmb3JtcyBsaWtlIE5hdGl2ZVxuXG5cbnZhciBjcmVhdGVNZW1vcnlTb3VyY2UgPSBmdW5jdGlvbiBjcmVhdGVNZW1vcnlTb3VyY2UoKSB7XG4gIHZhciBpbml0aWFsUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogXCIvXCI7XG4gIHZhciBzZWFyY2hJbmRleCA9IGluaXRpYWxQYXRoLmluZGV4T2YoXCI/XCIpO1xuICB2YXIgaW5pdGlhbExvY2F0aW9uID0ge1xuICAgIHBhdGhuYW1lOiBzZWFyY2hJbmRleCA+IC0xID8gaW5pdGlhbFBhdGguc3Vic3RyKDAsIHNlYXJjaEluZGV4KSA6IGluaXRpYWxQYXRoLFxuICAgIHNlYXJjaDogc2VhcmNoSW5kZXggPiAtMSA/IGluaXRpYWxQYXRoLnN1YnN0cihzZWFyY2hJbmRleCkgOiBcIlwiXG4gIH07XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtpbml0aWFsTG9jYXRpb25dO1xuICB2YXIgc3RhdGVzID0gW251bGxdO1xuICByZXR1cm4ge1xuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGFja1tpbmRleF07XG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHt9LFxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHt9LFxuICAgIGhpc3Rvcnk6IHtcbiAgICAgIGdldCBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICB9LFxuXG4gICAgICBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlc1tpbmRleF07XG4gICAgICB9LFxuXG4gICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIHB1c2hTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0ID0gdXJpLnNwbGl0KFwiP1wiKSxcbiAgICAgICAgICAgIHBhdGhuYW1lID0gX3VyaSRzcGxpdFswXSxcbiAgICAgICAgICAgIF91cmkkc3BsaXQkID0gX3VyaSRzcGxpdFsxXSxcbiAgICAgICAgICAgIHNlYXJjaCA9IF91cmkkc3BsaXQkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3VyaSRzcGxpdCQ7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogc2VhcmNoLmxlbmd0aCA/IFwiP1wiICsgc2VhcmNoIDogc2VhcmNoXG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgICB9LFxuICAgICAgcmVwbGFjZVN0YXRlOiBmdW5jdGlvbiByZXBsYWNlU3RhdGUoc3RhdGUsIF8sIHVyaSkge1xuICAgICAgICB2YXIgX3VyaSRzcGxpdDIgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgICAgICAgcGF0aG5hbWUgPSBfdXJpJHNwbGl0MlswXSxcbiAgICAgICAgICAgIF91cmkkc3BsaXQyJCA9IF91cmkkc3BsaXQyWzFdLFxuICAgICAgICAgICAgc2VhcmNoID0gX3VyaSRzcGxpdDIkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3VyaSRzcGxpdDIkO1xuXG4gICAgICAgIHN0YWNrW2luZGV4XSA9IHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBzZWFyY2hcbiAgICAgICAgfTtcbiAgICAgICAgc3RhdGVzW2luZGV4XSA9IHN0YXRlO1xuICAgICAgfSxcbiAgICAgIGdvOiBmdW5jdGlvbiBnbyh0bykge1xuICAgICAgICB2YXIgbmV3SW5kZXggPSBpbmRleCArIHRvO1xuXG4gICAgICAgIGlmIChuZXdJbmRleCA8IDAgfHwgbmV3SW5kZXggPiBzdGF0ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gbmV3SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGdsb2JhbCBoaXN0b3J5IC0gdXNlcyB3aW5kb3cuaGlzdG9yeSBhcyB0aGUgc291cmNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGFcbi8vIG1lbW9yeSBoaXN0b3J5XG5cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxudmFyIGdldFNvdXJjZSA9IGZ1bmN0aW9uIGdldFNvdXJjZSgpIHtcbiAgcmV0dXJuIGNhblVzZURPTSA/IHdpbmRvdyA6IGNyZWF0ZU1lbW9yeVNvdXJjZSgpO1xufTtcblxudmFyIGdsb2JhbEhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5KGdldFNvdXJjZSgpKTtcbnZhciBuYXZpZ2F0ZSA9IGdsb2JhbEhpc3RvcnkubmF2aWdhdGU7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydHMuZ2xvYmFsSGlzdG9yeSA9IGdsb2JhbEhpc3Rvcnk7XG5leHBvcnRzLm5hdmlnYXRlID0gbmF2aWdhdGU7XG5leHBvcnRzLmNyZWF0ZUhpc3RvcnkgPSBjcmVhdGVIaXN0b3J5O1xuZXhwb3J0cy5jcmVhdGVNZW1vcnlTb3VyY2UgPSBjcmVhdGVNZW1vcnlTb3VyY2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2393\n')},2098:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = __webpack_require__(1143);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don\'t have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split("?"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === "";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || "*";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join("/");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? false ? 0 : (0, _invariant2.default)(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don\'t match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: "/" + uriSegments.slice(0, index).join("/")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be "in a directory"\n// you can be "at a file", too. For example\n//\n// browserSpecResolve(\'foo\', \'/bar/\') => /bar/foo\n// browserSpecResolve(\'foo\', \'/bar\') => /foo\n//\n// But on the command line of a file system, it\'s not as complicated, you can\'t\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, "/")) {\n return to;\n }\n\n var _to$split = to.split("?"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split("?"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === "") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], ".")) {\n var pathname = baseSegments.concat(toSegments).join("/");\n return addQuery((basePathname === "/" ? "" : "/") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === "..") segments.pop();else if (segment !== ".") segments.push(segment);\n }\n\n return addQuery("/" + segments.join("/"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split("?"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? "" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = "/" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join("/");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? "" : _params$location$sear;\n var searchSplit = search.split("?")[1] || "";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join("/");\n var toString = segmentize(to).filter(filter).sort().join("/");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === "";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === "*";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, "").split("/");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? "?" + query.join("&") : "");\n};\n\nvar reservedNames = ["uri", "path"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi91dGlscy5qcz9hNDIyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQjtBQUNsQixzQkFBc0IsR0FBRyx3QkFBd0IsR0FBRyxvQkFBb0IsR0FBRyxlQUFlLEdBQUcsYUFBYSxHQUFHLFlBQVksR0FBRyxrQkFBa0I7O0FBRTlJLGlCQUFpQixtQkFBTyxDQUFDLElBQVc7O0FBRXBDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLE9BQU87QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxhQUFhO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLE1BQXFDLEdBQUcsQ0FBdUs7QUFDN087QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLEVBQUUsVUFBVSxRQUFRO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSx5Q0FBeUMsT0FBTztBQUNoRDtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFELHFEQUFxRCxtRUFBbUU7QUFDN0s7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFGQUFxRixhQUFhO0FBQ2xHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Ysa0JBQWtCO0FBQ2xCLFlBQVk7QUFDWixhQUFhO0FBQ2IsZUFBZTtBQUNmLG9CQUFvQjtBQUNwQix3QkFBd0I7QUFDeEIsc0JBQXNCIiwiZmlsZSI6IjIwOTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuc2hhbGxvd0NvbXBhcmUgPSBleHBvcnRzLnZhbGlkYXRlUmVkaXJlY3QgPSBleHBvcnRzLmluc2VydFBhcmFtcyA9IGV4cG9ydHMucmVzb2x2ZSA9IGV4cG9ydHMubWF0Y2ggPSBleHBvcnRzLnBpY2sgPSBleHBvcnRzLnN0YXJ0c1dpdGggPSB1bmRlZmluZWQ7XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZShcImludmFyaWFudFwiKTtcblxudmFyIF9pbnZhcmlhbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW52YXJpYW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBkZWZhdWx0OiBvYmpcbiAgfTtcbn0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIC0gQ2hlY2sgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHNlYXJjaGBcblxuXG52YXIgc3RhcnRzV2l0aCA9IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIHtcbiAgcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBwaWNrKHJvdXRlcywgdXJpKVxuLy9cbi8vIFJhbmtzIGFuZCBwaWNrcyB0aGUgYmVzdCByb3V0ZSB0byBtYXRjaC4gRWFjaCBzZWdtZW50IGdldHMgdGhlIGhpZ2hlc3Rcbi8vIGFtb3VudCBvZiBwb2ludHMsIHRoZW4gdGhlIHR5cGUgb2Ygc2VnbWVudCBnZXRzIGFuIGFkZGl0aW9uYWwgYW1vdW50IG9mXG4vLyBwb2ludHMgd2hlcmVcbi8vXG4vLyAgICAgc3RhdGljID4gZHluYW1pYyA+IHNwbGF0ID4gcm9vdFxuLy9cbi8vIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG9yZGVyIG9mIG91ciByb3V0ZXMsIGxldCB0aGVcbi8vIGNvbXB1dGVycyBkbyBpdC5cbi8vXG4vLyBBIHJvdXRlIGxvb2tzIGxpa2UgdGhpc1xuLy9cbi8vICAgICB7IHBhdGgsIGRlZmF1bHQsIHZhbHVlIH1cbi8vXG4vLyBBbmQgYSByZXR1cm5lZCBtYXRjaCBsb29rcyBsaWtlOlxuLy9cbi8vICAgICB7IHJvdXRlLCBwYXJhbXMsIHVyaSB9XG4vL1xuLy8gSSBrbm93LCBJIHNob3VsZCB1c2UgVHlwZVNjcmlwdCBub3QgY29tbWVudHMgZm9yIHRoZXNlIHR5cGVzLlxuXG5cbnZhciBwaWNrID0gZnVuY3Rpb24gcGljayhyb3V0ZXMsIHVyaSkge1xuICB2YXIgbWF0Y2ggPSB2b2lkIDA7XG4gIHZhciBkZWZhdWx0XyA9IHZvaWQgMDtcblxuICB2YXIgX3VyaSRzcGxpdCA9IHVyaS5zcGxpdChcIj9cIiksXG4gICAgICB1cmlQYXRobmFtZSA9IF91cmkkc3BsaXRbMF07XG5cbiAgdmFyIHVyaVNlZ21lbnRzID0gc2VnbWVudGl6ZSh1cmlQYXRobmFtZSk7XG4gIHZhciBpc1Jvb3RVcmkgPSB1cmlTZWdtZW50c1swXSA9PT0gXCJcIjtcbiAgdmFyIHJhbmtlZCA9IHJhbmtSb3V0ZXMocm91dGVzKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHJhbmtlZC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgbWlzc2VkID0gZmFsc2U7XG4gICAgdmFyIHJvdXRlID0gcmFua2VkW2ldLnJvdXRlO1xuXG4gICAgaWYgKHJvdXRlLmRlZmF1bHQpIHtcbiAgICAgIGRlZmF1bHRfID0ge1xuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIHBhcmFtczoge30sXG4gICAgICAgIHVyaTogdXJpXG4gICAgICB9O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHJvdXRlU2VnbWVudHMgPSBzZWdtZW50aXplKHJvdXRlLnBhdGgpO1xuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgodXJpU2VnbWVudHMubGVuZ3RoLCByb3V0ZVNlZ21lbnRzLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcblxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgdmFyIHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaW5kZXhdO1xuICAgICAgdmFyIHVyaVNlZ21lbnQgPSB1cmlTZWdtZW50c1tpbmRleF07XG5cbiAgICAgIGlmIChpc1NwbGF0KHJvdXRlU2VnbWVudCkpIHtcbiAgICAgICAgLy8gSGl0IGEgc3BsYXQsIGp1c3QgZ3JhYiB0aGUgcmVzdCwgYW5kIHJldHVybiBhIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvZmlsZXMvZG9jdW1lbnRzL3dvcmtcbiAgICAgICAgLy8gcm91dGU6IC9maWxlcy8qXG4gICAgICAgIHZhciBwYXJhbSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSB8fCBcIipcIjtcbiAgICAgICAgcGFyYW1zW3BhcmFtXSA9IHVyaVNlZ21lbnRzLnNsaWNlKGluZGV4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cmlTZWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVVJJIGlzIHNob3J0ZXIgdGhhbiB0aGUgcm91dGUsIG5vIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvdXNlcnNcbiAgICAgICAgLy8gcm91dGU6IC91c2Vycy86dXNlcklkXG4gICAgICAgIG1pc3NlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHluYW1pY01hdGNoID0gcGFyYW1SZS5leGVjKHJvdXRlU2VnbWVudCk7XG5cbiAgICAgIGlmIChkeW5hbWljTWF0Y2ggJiYgIWlzUm9vdFVyaSkge1xuICAgICAgICB2YXIgbWF0Y2hJc05vdFJlc2VydmVkID0gcmVzZXJ2ZWROYW1lcy5pbmRleE9mKGR5bmFtaWNNYXRjaFsxXSkgPT09IC0xO1xuICAgICAgICAhbWF0Y2hJc05vdFJlc2VydmVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gKDAsIF9pbnZhcmlhbnQyLmRlZmF1bHQpKGZhbHNlLCBcIjxSb3V0ZXI+IGR5bmFtaWMgc2VnbWVudCBcXFwiXCIgKyBkeW5hbWljTWF0Y2hbMV0gKyBcIlxcXCIgaXMgYSByZXNlcnZlZCBuYW1lLiBQbGVhc2UgdXNlIGEgZGlmZmVyZW50IG5hbWUgaW4gcGF0aCBcXFwiXCIgKyByb3V0ZS5wYXRoICsgXCJcXFwiLlwiKSA6ICgwLCBfaW52YXJpYW50Mi5kZWZhdWx0KShmYWxzZSkgOiB2b2lkIDA7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmlTZWdtZW50KTtcbiAgICAgICAgcGFyYW1zW2R5bmFtaWNNYXRjaFsxXV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAocm91dGVTZWdtZW50ICE9PSB1cmlTZWdtZW50KSB7XG4gICAgICAgIC8vIEN1cnJlbnQgc2VnbWVudHMgZG9uJ3QgbWF0Y2gsIG5vdCBkeW5hbWljLCBub3Qgc3BsYXQsIHNvIG5vIG1hdGNoXG4gICAgICAgIC8vIHVyaTogICAvdXNlcnMvMTIzL3NldHRpbmdzXG4gICAgICAgIC8vIHJvdXRlOiAvdXNlcnMvOmlkL3Byb2ZpbGVcbiAgICAgICAgbWlzc2VkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtaXNzZWQpIHtcbiAgICAgIG1hdGNoID0ge1xuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB1cmk6IFwiL1wiICsgdXJpU2VnbWVudHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoIHx8IGRlZmF1bHRfIHx8IG51bGw7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gbWF0Y2gocGF0aCwgdXJpKSAtIE1hdGNoZXMganVzdCBvbmUgcGF0aCB0byBhIHVyaSwgYWxzbyBsb2xcblxuXG52YXIgbWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChwYXRoLCB1cmkpIHtcbiAgcmV0dXJuIHBpY2soW3tcbiAgICBwYXRoOiBwYXRoXG4gIH1dLCB1cmkpO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHJlc29sdmUodG8sIGJhc2VwYXRoKVxuLy9cbi8vIFJlc29sdmVzIFVSSXMgYXMgdGhvdWdoIGV2ZXJ5IHBhdGggaXMgYSBkaXJlY3RvcnksIG5vIGZpbGVzLiAgUmVsYXRpdmUgVVJJc1xuLy8gaW4gdGhlIGJyb3dzZXIgY2FuIGZlZWwgYXdrd2FyZCBiZWNhdXNlIG5vdCBvbmx5IGNhbiB5b3UgYmUgXCJpbiBhIGRpcmVjdG9yeVwiXG4vLyB5b3UgY2FuIGJlIFwiYXQgYSBmaWxlXCIsIHRvby4gRm9yIGV4YW1wbGVcbi8vXG4vLyAgICAgYnJvd3NlclNwZWNSZXNvbHZlKCdmb28nLCAnL2Jhci8nKSA9PiAvYmFyL2Zvb1xuLy8gICAgIGJyb3dzZXJTcGVjUmVzb2x2ZSgnZm9vJywgJy9iYXInKSA9PiAvZm9vXG4vL1xuLy8gQnV0IG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgYSBmaWxlIHN5c3RlbSwgaXQncyBub3QgYXMgY29tcGxpY2F0ZWQsIHlvdSBjYW4ndFxuLy8gYGNkYCBmcm9tIGEgZmlsZSwgb25seSBkaXJlY3Rvcmllcy4gIFRoaXMgd2F5LCBsaW5rcyBoYXZlIHRvIGtub3cgbGVzcyBhYm91dFxuLy8gdGhlaXIgY3VycmVudCBwYXRoLiBUbyBnbyBkZWVwZXIgeW91IGNhbiBkbyB0aGlzOlxuLy9cbi8vICAgICA8TGluayB0bz1cImRlZXBlclwiLz5cbi8vICAgICAvLyBpbnN0ZWFkIG9mXG4vLyAgICAgPExpbmsgdG89YHske3Byb3BzLnVyaX0vZGVlcGVyfWAvPlxuLy9cbi8vIEp1c3QgbGlrZSBgY2RgLCBpZiB5b3Ugd2FudCB0byBnbyBkZWVwZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgZG8gdGhpczpcbi8vXG4vLyAgICAgY2QgZGVlcGVyXG4vLyAgICAgIyBub3Rcbi8vICAgICBjZCAkKHB3ZCkvZGVlcGVyXG4vL1xuLy8gQnkgdHJlYXRpbmcgZXZlcnkgcGF0aCBhcyBhIGRpcmVjdG9yeSwgbGlua2luZyB0byByZWxhdGl2ZSBwYXRocyBzaG91bGRcbi8vIHJlcXVpcmUgbGVzcyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGFuZCAoZmluZ2VycyBjcm9zc2VkKSBiZSBtb3JlIGludHVpdGl2ZS5cblxuXG52YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUodG8sIGJhc2UpIHtcbiAgLy8gL2Zvby9iYXIsIC9iYXovcXV4ID0+IC9mb28vYmFyXG4gIGlmIChzdGFydHNXaXRoKHRvLCBcIi9cIikpIHtcbiAgICByZXR1cm4gdG87XG4gIH1cblxuICB2YXIgX3RvJHNwbGl0ID0gdG8uc3BsaXQoXCI/XCIpLFxuICAgICAgdG9QYXRobmFtZSA9IF90byRzcGxpdFswXSxcbiAgICAgIHRvUXVlcnkgPSBfdG8kc3BsaXRbMV07XG5cbiAgdmFyIF9iYXNlJHNwbGl0ID0gYmFzZS5zcGxpdChcIj9cIiksXG4gICAgICBiYXNlUGF0aG5hbWUgPSBfYmFzZSRzcGxpdFswXTtcblxuICB2YXIgdG9TZWdtZW50cyA9IHNlZ21lbnRpemUodG9QYXRobmFtZSk7XG4gIHZhciBiYXNlU2VnbWVudHMgPSBzZWdtZW50aXplKGJhc2VQYXRobmFtZSk7IC8vID9hPWIsIC91c2Vycz9iPWMgPT4gL3VzZXJzP2E9YlxuXG4gIGlmICh0b1NlZ21lbnRzWzBdID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGFkZFF1ZXJ5KGJhc2VQYXRobmFtZSwgdG9RdWVyeSk7XG4gIH0gLy8gcHJvZmlsZSwgL3VzZXJzLzc4OSA9PiAvdXNlcnMvNzg5L3Byb2ZpbGVcblxuXG4gIGlmICghc3RhcnRzV2l0aCh0b1NlZ21lbnRzWzBdLCBcIi5cIikpIHtcbiAgICB2YXIgcGF0aG5hbWUgPSBiYXNlU2VnbWVudHMuY29uY2F0KHRvU2VnbWVudHMpLmpvaW4oXCIvXCIpO1xuICAgIHJldHVybiBhZGRRdWVyeSgoYmFzZVBhdGhuYW1lID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIikgKyBwYXRobmFtZSwgdG9RdWVyeSk7XG4gIH0gLy8gLi8gICAgICAgICAvdXNlcnMvMTIzICA9PiAgL3VzZXJzLzEyM1xuICAvLyAuLi8gICAgICAgIC91c2Vycy8xMjMgID0+ICAvdXNlcnNcbiAgLy8gLi4vLi4gICAgICAvdXNlcnMvMTIzICA9PiAgL1xuICAvLyAuLi8uLi9vbmUgIC9hL2IvYy9kICAgID0+ICAvYS9iL29uZVxuICAvLyAuLi8uL29uZSAgIC9hL2IvYy9kICAgID0+ICAvYS9iL2Mvb25lXG5cblxuICB2YXIgYWxsU2VnbWVudHMgPSBiYXNlU2VnbWVudHMuY29uY2F0KHRvU2VnbWVudHMpO1xuICB2YXIgc2VnbWVudHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFsbFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBzZWdtZW50ID0gYWxsU2VnbWVudHNbaV07XG4gICAgaWYgKHNlZ21lbnQgPT09IFwiLi5cIikgc2VnbWVudHMucG9wKCk7ZWxzZSBpZiAoc2VnbWVudCAhPT0gXCIuXCIpIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gIH1cblxuICByZXR1cm4gYWRkUXVlcnkoXCIvXCIgKyBzZWdtZW50cy5qb2luKFwiL1wiKSwgdG9RdWVyeSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gaW5zZXJ0UGFyYW1zKHBhdGgsIHBhcmFtcylcblxuXG52YXIgaW5zZXJ0UGFyYW1zID0gZnVuY3Rpb24gaW5zZXJ0UGFyYW1zKHBhdGgsIHBhcmFtcykge1xuICB2YXIgX3BhdGgkc3BsaXQgPSBwYXRoLnNwbGl0KFwiP1wiKSxcbiAgICAgIHBhdGhCYXNlID0gX3BhdGgkc3BsaXRbMF0sXG4gICAgICBfcGF0aCRzcGxpdCQgPSBfcGF0aCRzcGxpdFsxXSxcbiAgICAgIHF1ZXJ5ID0gX3BhdGgkc3BsaXQkID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3BhdGgkc3BsaXQkO1xuXG4gIHZhciBzZWdtZW50cyA9IHNlZ21lbnRpemUocGF0aEJhc2UpO1xuICB2YXIgY29uc3RydWN0ZWRQYXRoID0gXCIvXCIgKyBzZWdtZW50cy5tYXAoZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgICB2YXIgbWF0Y2ggPSBwYXJhbVJlLmV4ZWMoc2VnbWVudCk7XG4gICAgcmV0dXJuIG1hdGNoID8gcGFyYW1zW21hdGNoWzFdXSA6IHNlZ21lbnQ7XG4gIH0pLmpvaW4oXCIvXCIpO1xuICB2YXIgX3BhcmFtcyRsb2NhdGlvbiA9IHBhcmFtcy5sb2NhdGlvbjtcbiAgX3BhcmFtcyRsb2NhdGlvbiA9IF9wYXJhbXMkbG9jYXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogX3BhcmFtcyRsb2NhdGlvbjtcbiAgdmFyIF9wYXJhbXMkbG9jYXRpb24kc2VhciA9IF9wYXJhbXMkbG9jYXRpb24uc2VhcmNoLFxuICAgICAgc2VhcmNoID0gX3BhcmFtcyRsb2NhdGlvbiRzZWFyID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3BhcmFtcyRsb2NhdGlvbiRzZWFyO1xuICB2YXIgc2VhcmNoU3BsaXQgPSBzZWFyY2guc3BsaXQoXCI/XCIpWzFdIHx8IFwiXCI7XG4gIGNvbnN0cnVjdGVkUGF0aCA9IGFkZFF1ZXJ5KGNvbnN0cnVjdGVkUGF0aCwgcXVlcnksIHNlYXJjaFNwbGl0KTtcbiAgcmV0dXJuIGNvbnN0cnVjdGVkUGF0aDtcbn07XG5cbnZhciB2YWxpZGF0ZVJlZGlyZWN0ID0gZnVuY3Rpb24gdmFsaWRhdGVSZWRpcmVjdChmcm9tLCB0bykge1xuICB2YXIgZmlsdGVyID0gZnVuY3Rpb24gZmlsdGVyKHNlZ21lbnQpIHtcbiAgICByZXR1cm4gaXNEeW5hbWljKHNlZ21lbnQpO1xuICB9O1xuXG4gIHZhciBmcm9tU3RyaW5nID0gc2VnbWVudGl6ZShmcm9tKS5maWx0ZXIoZmlsdGVyKS5zb3J0KCkuam9pbihcIi9cIik7XG4gIHZhciB0b1N0cmluZyA9IHNlZ21lbnRpemUodG8pLmZpbHRlcihmaWx0ZXIpLnNvcnQoKS5qb2luKFwiL1wiKTtcbiAgcmV0dXJuIGZyb21TdHJpbmcgPT09IHRvU3RyaW5nO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEp1bmtcblxuXG52YXIgcGFyYW1SZSA9IC9eOiguKykvO1xudmFyIFNFR01FTlRfUE9JTlRTID0gNDtcbnZhciBTVEFUSUNfUE9JTlRTID0gMztcbnZhciBEWU5BTUlDX1BPSU5UUyA9IDI7XG52YXIgU1BMQVRfUEVOQUxUWSA9IDE7XG52YXIgUk9PVF9QT0lOVFMgPSAxO1xuXG52YXIgaXNSb290U2VnbWVudCA9IGZ1bmN0aW9uIGlzUm9vdFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudCA9PT0gXCJcIjtcbn07XG5cbnZhciBpc0R5bmFtaWMgPSBmdW5jdGlvbiBpc0R5bmFtaWMoc2VnbWVudCkge1xuICByZXR1cm4gcGFyYW1SZS50ZXN0KHNlZ21lbnQpO1xufTtcblxudmFyIGlzU3BsYXQgPSBmdW5jdGlvbiBpc1NwbGF0KHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgJiYgc2VnbWVudFswXSA9PT0gXCIqXCI7XG59O1xuXG52YXIgcmFua1JvdXRlID0gZnVuY3Rpb24gcmFua1JvdXRlKHJvdXRlLCBpbmRleCkge1xuICB2YXIgc2NvcmUgPSByb3V0ZS5kZWZhdWx0ID8gMCA6IHNlZ21lbnRpemUocm91dGUucGF0aCkucmVkdWNlKGZ1bmN0aW9uIChzY29yZSwgc2VnbWVudCkge1xuICAgIHNjb3JlICs9IFNFR01FTlRfUE9JTlRTO1xuICAgIGlmIChpc1Jvb3RTZWdtZW50KHNlZ21lbnQpKSBzY29yZSArPSBST09UX1BPSU5UUztlbHNlIGlmIChpc0R5bmFtaWMoc2VnbWVudCkpIHNjb3JlICs9IERZTkFNSUNfUE9JTlRTO2Vsc2UgaWYgKGlzU3BsYXQoc2VnbWVudCkpIHNjb3JlIC09IFNFR01FTlRfUE9JTlRTICsgU1BMQVRfUEVOQUxUWTtlbHNlIHNjb3JlICs9IFNUQVRJQ19QT0lOVFM7XG4gICAgcmV0dXJuIHNjb3JlO1xuICB9LCAwKTtcbiAgcmV0dXJuIHtcbiAgICByb3V0ZTogcm91dGUsXG4gICAgc2NvcmU6IHNjb3JlLFxuICAgIGluZGV4OiBpbmRleFxuICB9O1xufTtcblxudmFyIHJhbmtSb3V0ZXMgPSBmdW5jdGlvbiByYW5rUm91dGVzKHJvdXRlcykge1xuICByZXR1cm4gcm91dGVzLm1hcChyYW5rUm91dGUpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYS5zY29yZSA8IGIuc2NvcmUgPyAxIDogYS5zY29yZSA+IGIuc2NvcmUgPyAtMSA6IGEuaW5kZXggLSBiLmluZGV4O1xuICB9KTtcbn07XG5cbnZhciBzZWdtZW50aXplID0gZnVuY3Rpb24gc2VnbWVudGl6ZSh1cmkpIHtcbiAgcmV0dXJuIHVyaSAvLyBzdHJpcCBzdGFydGluZy9lbmRpbmcgc2xhc2hlc1xuICAucmVwbGFjZSgvKF5cXC8rfFxcLyskKS9nLCBcIlwiKS5zcGxpdChcIi9cIik7XG59O1xuXG52YXIgYWRkUXVlcnkgPSBmdW5jdGlvbiBhZGRRdWVyeShwYXRobmFtZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcnkgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcXVlcnlbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcXVlcnkgPSBxdWVyeS5maWx0ZXIoZnVuY3Rpb24gKHEpIHtcbiAgICByZXR1cm4gcSAmJiBxLmxlbmd0aCA+IDA7XG4gIH0pO1xuICByZXR1cm4gcGF0aG5hbWUgKyAocXVlcnkgJiYgcXVlcnkubGVuZ3RoID4gMCA/IFwiP1wiICsgcXVlcnkuam9pbihcIiZcIikgOiBcIlwiKTtcbn07XG5cbnZhciByZXNlcnZlZE5hbWVzID0gW1widXJpXCIsIFwicGF0aFwiXTtcbi8qKlxuICogU2hhbGxvdyBjb21wYXJlcyB0d28gb2JqZWN0cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKi9cblxudmFyIHNoYWxsb3dDb21wYXJlID0gZnVuY3Rpb24gc2hhbGxvd0NvbXBhcmUob2JqMSwgb2JqMikge1xuICB2YXIgb2JqMUtleXMgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgcmV0dXJuIG9iajFLZXlzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoICYmIG9iajFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gb2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9iajFba2V5XSA9PT0gb2JqMltrZXldO1xuICB9KTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuZXhwb3J0cy5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbmV4cG9ydHMucGljayA9IHBpY2s7XG5leHBvcnRzLm1hdGNoID0gbWF0Y2g7XG5leHBvcnRzLnJlc29sdmUgPSByZXNvbHZlO1xuZXhwb3J0cy5pbnNlcnRQYXJhbXMgPSBpbnNlcnRQYXJhbXM7XG5leHBvcnRzLnZhbGlkYXRlUmVkaXJlY3QgPSB2YWxpZGF0ZVJlZGlyZWN0O1xuZXhwb3J0cy5zaGFsbG93Q29tcGFyZSA9IHNoYWxsb3dDb21wYXJlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2098\n')},3210:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Xb\": function() { return /* binding */ Hub; },\n \"Gd\": function() { return /* binding */ getCurrentHub; },\n \"vi\": function() { return /* binding */ getHubFromCarrier; },\n \"cu\": function() { return /* binding */ getMainCarrier; },\n \"pj\": function() { return /* binding */ makeMain; }\n});\n\n// UNUSED EXPORTS: API_VERSION, getActiveDomain, setHubOnCarrier\n\n// EXTERNAL MODULE: ./node_modules/@sentry/hub/node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(4645);\n// EXTERNAL MODULE: ./node_modules/@sentry/types/esm/session.js\nvar esm_session = __webpack_require__(2355);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/misc.js\nvar misc = __webpack_require__(2861);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/time.js\nvar time = __webpack_require__(5153);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js\nvar esm_logger = __webpack_require__(245);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/node.js\nvar node = __webpack_require__(7864);\n// EXTERNAL MODULE: ./node_modules/@sentry/hub/esm/scope.js\nvar esm_scope = __webpack_require__(7659);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/object.js + 1 modules\nvar object = __webpack_require__(150);\n;// CONCATENATED MODULE: ./node_modules/@sentry/hub/esm/session.js\n\n\n/**\n * @inheritdoc\n */\n\nvar Session =\n/** @class */\nfunction () {\n function Session(context) {\n this.errors = 0;\n this.sid = (0,misc/* uuid4 */.DM)();\n this.duration = 0;\n this.status = esm_session/* SessionStatus.Ok */.$.Ok;\n this.init = true;\n this.ignoreDuration = false; // Both timestamp and started are in seconds since the UNIX epoch.\n\n var startingTime = (0,time/* timestampInSeconds */.ph)();\n this.timestamp = startingTime;\n this.started = startingTime;\n\n if (context) {\n this.update(context);\n }\n }\n /** JSDoc */\n // eslint-disable-next-line complexity\n\n\n Session.prototype.update = function (context) {\n if (context === void 0) {\n context = {};\n }\n\n if (context.user) {\n if (!this.ipAddress && context.user.ip_address) {\n this.ipAddress = context.user.ip_address;\n }\n\n if (!this.did && !context.did) {\n this.did = context.user.id || context.user.email || context.user.username;\n }\n }\n\n this.timestamp = context.timestamp || (0,time/* timestampInSeconds */.ph)();\n\n if (context.ignoreDuration) {\n this.ignoreDuration = context.ignoreDuration;\n }\n\n if (context.sid) {\n // Good enough uuid validation. — Kamil\n this.sid = context.sid.length === 32 ? context.sid : (0,misc/* uuid4 */.DM)();\n }\n\n if (context.init !== undefined) {\n this.init = context.init;\n }\n\n if (!this.did && context.did) {\n this.did = \"\" + context.did;\n }\n\n if (typeof context.started === 'number') {\n this.started = context.started;\n }\n\n if (this.ignoreDuration) {\n this.duration = undefined;\n } else if (typeof context.duration === 'number') {\n this.duration = context.duration;\n } else {\n var duration = this.timestamp - this.started;\n this.duration = duration >= 0 ? duration : 0;\n }\n\n if (context.release) {\n this.release = context.release;\n }\n\n if (context.environment) {\n this.environment = context.environment;\n }\n\n if (!this.ipAddress && context.ipAddress) {\n this.ipAddress = context.ipAddress;\n }\n\n if (!this.userAgent && context.userAgent) {\n this.userAgent = context.userAgent;\n }\n\n if (typeof context.errors === 'number') {\n this.errors = context.errors;\n }\n\n if (context.status) {\n this.status = context.status;\n }\n };\n /** JSDoc */\n\n\n Session.prototype.close = function (status) {\n if (status) {\n this.update({\n status: status\n });\n } else if (this.status === esm_session/* SessionStatus.Ok */.$.Ok) {\n this.update({\n status: esm_session/* SessionStatus.Exited */.$.Exited\n });\n } else {\n this.update();\n }\n };\n /** JSDoc */\n\n\n Session.prototype.toJSON = function () {\n return (0,object/* dropUndefinedKeys */.Jr)({\n sid: \"\" + this.sid,\n init: this.init,\n // Make sure that sec is converted to ms for date constructor\n started: new Date(this.started * 1000).toISOString(),\n timestamp: new Date(this.timestamp * 1000).toISOString(),\n status: this.status,\n errors: this.errors,\n did: typeof this.did === 'number' || typeof this.did === 'string' ? \"\" + this.did : undefined,\n duration: this.duration,\n attrs: (0,object/* dropUndefinedKeys */.Jr)({\n release: this.release,\n environment: this.environment,\n ip_address: this.ipAddress,\n user_agent: this.userAgent\n })\n });\n };\n\n return Session;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/hub/esm/hub.js\n\n/* eslint-disable max-lines */\n\n\n\n\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\n\nvar API_VERSION = 4;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\n\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\n\nvar Hub =\n/** @class */\nfunction () {\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n */\n function Hub(client, scope, _version) {\n if (scope === void 0) {\n scope = new esm_scope/* Scope */.s();\n }\n\n if (_version === void 0) {\n _version = API_VERSION;\n }\n\n this._version = _version;\n /** Is a {@link Layer}[] containing the client and scope */\n\n this._stack = [{}];\n this.getStackTop().scope = scope;\n\n if (client) {\n this.bindClient(client);\n }\n }\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.isOlderThan = function (version) {\n return this._version < version;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.bindClient = function (client) {\n var top = this.getStackTop();\n top.client = client;\n\n if (client && client.setupIntegrations) {\n client.setupIntegrations();\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.pushScope = function () {\n // We want to clone the content of prev scope\n var scope = esm_scope/* Scope.clone */.s.clone(this.getScope());\n this.getStack().push({\n client: this.getClient(),\n scope: scope\n });\n return scope;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.popScope = function () {\n if (this.getStack().length <= 1) return false;\n return !!this.getStack().pop();\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.withScope = function (callback) {\n var scope = this.pushScope();\n\n try {\n callback(scope);\n } finally {\n this.popScope();\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.getClient = function () {\n return this.getStackTop().client;\n };\n /** Returns the scope of the top stack. */\n\n\n Hub.prototype.getScope = function () {\n return this.getStackTop().scope;\n };\n /** Returns the scope stack for domains or the process. */\n\n\n Hub.prototype.getStack = function () {\n return this._stack;\n };\n /** Returns the topmost scope layer in the order domain > local > process. */\n\n\n Hub.prototype.getStackTop = function () {\n return this._stack[this._stack.length - 1];\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n Hub.prototype.captureException = function (exception, hint) {\n var eventId = this._lastEventId = (0,misc/* uuid4 */.DM)();\n var finalHint = hint; // If there's no explicit hint provided, mimic the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n\n if (!hint) {\n var syntheticException = void 0;\n\n try {\n throw new Error('Sentry syntheticException');\n } catch (exception) {\n syntheticException = exception;\n }\n\n finalHint = {\n originalException: exception,\n syntheticException: syntheticException\n };\n }\n\n this._invokeClient('captureException', exception, (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, finalHint), {\n event_id: eventId\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.captureMessage = function (message, level, hint) {\n var eventId = this._lastEventId = (0,misc/* uuid4 */.DM)();\n var finalHint = hint; // If there's no explicit hint provided, mimic the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n\n if (!hint) {\n var syntheticException = void 0;\n\n try {\n throw new Error(message);\n } catch (exception) {\n syntheticException = exception;\n }\n\n finalHint = {\n originalException: message,\n syntheticException: syntheticException\n };\n }\n\n this._invokeClient('captureMessage', message, level, (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, finalHint), {\n event_id: eventId\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.captureEvent = function (event, hint) {\n var eventId = (0,misc/* uuid4 */.DM)();\n\n if (event.type !== 'transaction') {\n this._lastEventId = eventId;\n }\n\n this._invokeClient('captureEvent', event, (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, hint), {\n event_id: eventId\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.lastEventId = function () {\n return this._lastEventId;\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n var _a = this.getStackTop(),\n scope = _a.scope,\n client = _a.client;\n\n if (!scope || !client) return; // eslint-disable-next-line @typescript-eslint/unbound-method\n\n var _b = client.getOptions && client.getOptions() || {},\n _c = _b.beforeBreadcrumb,\n beforeBreadcrumb = _c === void 0 ? null : _c,\n _d = _b.maxBreadcrumbs,\n maxBreadcrumbs = _d === void 0 ? DEFAULT_BREADCRUMBS : _d;\n\n if (maxBreadcrumbs <= 0) return;\n var timestamp = (0,time/* dateTimestampInSeconds */.yW)();\n\n var mergedBreadcrumb = (0,tslib_es6/* __assign */.pi)({\n timestamp: timestamp\n }, breadcrumb);\n\n var finalBreadcrumb = beforeBreadcrumb ? (0,misc/* consoleSandbox */.Cf)(function () {\n return beforeBreadcrumb(mergedBreadcrumb, hint);\n }) : mergedBreadcrumb;\n if (finalBreadcrumb === null) return;\n scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.setUser = function (user) {\n var scope = this.getScope();\n if (scope) scope.setUser(user);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.setTags = function (tags) {\n var scope = this.getScope();\n if (scope) scope.setTags(tags);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.setExtras = function (extras) {\n var scope = this.getScope();\n if (scope) scope.setExtras(extras);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.setTag = function (key, value) {\n var scope = this.getScope();\n if (scope) scope.setTag(key, value);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.setExtra = function (key, extra) {\n var scope = this.getScope();\n if (scope) scope.setExtra(key, extra);\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Hub.prototype.setContext = function (name, context) {\n var scope = this.getScope();\n if (scope) scope.setContext(name, context);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.configureScope = function (callback) {\n var _a = this.getStackTop(),\n scope = _a.scope,\n client = _a.client;\n\n if (scope && client) {\n callback(scope);\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.run = function (callback) {\n var oldHub = makeMain(this);\n\n try {\n callback(this);\n } finally {\n makeMain(oldHub);\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.getIntegration = function (integration) {\n var client = this.getClient();\n if (!client) return null;\n\n try {\n return client.getIntegration(integration);\n } catch (_oO) {\n esm_logger/* logger.warn */.k.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.startSpan = function (context) {\n return this._callExtensionMethod('startSpan', context);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.startTransaction = function (context, customSamplingContext) {\n return this._callExtensionMethod('startTransaction', context, customSamplingContext);\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.traceHeaders = function () {\n return this._callExtensionMethod('traceHeaders');\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.captureSession = function (endSession) {\n if (endSession === void 0) {\n endSession = false;\n } // both send the update and pull the session from the scope\n\n\n if (endSession) {\n return this.endSession();\n } // only send the update\n\n\n this._sendSessionUpdate();\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.endSession = function () {\n var _a, _b, _c, _d, _e;\n\n (_c = (_b = (_a = this.getStackTop()) === null || _a === void 0 ? void 0 : _a.scope) === null || _b === void 0 ? void 0 : _b.getSession()) === null || _c === void 0 ? void 0 : _c.close();\n\n this._sendSessionUpdate(); // the session is over; take it off of the scope\n\n\n (_e = (_d = this.getStackTop()) === null || _d === void 0 ? void 0 : _d.scope) === null || _e === void 0 ? void 0 : _e.setSession();\n };\n /**\n * @inheritDoc\n */\n\n\n Hub.prototype.startSession = function (context) {\n var _a = this.getStackTop(),\n scope = _a.scope,\n client = _a.client;\n\n var _b = client && client.getOptions() || {},\n release = _b.release,\n environment = _b.environment; // Will fetch userAgent if called from browser sdk\n\n\n var global = (0,misc/* getGlobalObject */.Rf)();\n var userAgent = (global.navigator || {}).userAgent;\n var session = new Session((0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({\n release: release,\n environment: environment\n }, scope && {\n user: scope.getUser()\n }), userAgent && {\n userAgent: userAgent\n }), context));\n\n if (scope) {\n // End existing session if there's one\n var currentSession = scope.getSession && scope.getSession();\n\n if (currentSession && currentSession.status === esm_session/* SessionStatus.Ok */.$.Ok) {\n currentSession.update({\n status: esm_session/* SessionStatus.Exited */.$.Exited\n });\n }\n\n this.endSession(); // Afterwards we set the new session on the scope\n\n scope.setSession(session);\n }\n\n return session;\n };\n /**\n * Sends the current Session on the scope\n */\n\n\n Hub.prototype._sendSessionUpdate = function () {\n var _a = this.getStackTop(),\n scope = _a.scope,\n client = _a.client;\n\n if (!scope) return;\n var session = scope.getSession && scope.getSession();\n\n if (session) {\n if (client && client.captureSession) {\n client.captureSession(session);\n }\n }\n };\n /**\n * Internal helper function to call a method on the top client if it exists.\n *\n * @param method The method to call on the client.\n * @param args Arguments to pass to the client function.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Hub.prototype._invokeClient = function (method) {\n var _a;\n\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n var _b = this.getStackTop(),\n scope = _b.scope,\n client = _b.client;\n\n if (client && client[method]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (_a = client)[method].apply(_a, (0,tslib_es6/* __spread */.fl)(args, [scope]));\n }\n };\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Hub.prototype._callExtensionMethod = function (method) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n var carrier = getMainCarrier();\n var sentry = carrier.__SENTRY__;\n\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n\n esm_logger/* logger.warn */.k.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n };\n\n return Hub;\n}();\n\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\n\nfunction getMainCarrier() {\n var carrier = (0,misc/* getGlobalObject */.Rf)();\n carrier.__SENTRY__ = carrier.__SENTRY__ || {\n extensions: {},\n hub: undefined\n };\n return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\n\nfunction makeMain(hub) {\n var registry = getMainCarrier();\n var oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\n\nfunction getCurrentHub() {\n // Get main carrier (global for every environment)\n var registry = getMainCarrier(); // If there's no hub, or its an old API, assign a new one\n\n if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n setHubOnCarrier(registry, new Hub());\n } // Prefer domains over global if they are there (applicable only to Node environment)\n\n\n if ((0,node/* isNodeEnv */.KV)()) {\n return getHubFromActiveDomain(registry);\n } // Return hub that lives on a global object\n\n\n return getHubFromCarrier(registry);\n}\n/**\n * Returns the active domain, if one exists\n * @deprecated No longer used; remove in v7\n * @returns The domain, or undefined if there is no active domain\n */\n// eslint-disable-next-line deprecation/deprecation\n\nfunction getActiveDomain() {\n logger.warn('Function `getActiveDomain` is deprecated and will be removed in a future version.');\n\n var sentry = getMainCarrier().__SENTRY__;\n\n return sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n}\n/**\n * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\n\nfunction getHubFromActiveDomain(registry) {\n var _a, _b, _c;\n\n try {\n var activeDomain = (_c = (_b = (_a = getMainCarrier().__SENTRY__) === null || _a === void 0 ? void 0 : _a.extensions) === null || _b === void 0 ? void 0 : _b.domain) === null || _c === void 0 ? void 0 : _c.active; // If there's no active domain, just return global hub\n\n if (!activeDomain) {\n return getHubFromCarrier(registry);\n } // If there's no hub on current domain, or it's an old API, assign a new one\n\n\n if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, esm_scope/* Scope.clone */.s.clone(registryHubTopStack.scope)));\n } // Return hub that lives on a domain\n\n\n return getHubFromCarrier(activeDomain);\n } catch (_Oo) {\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\n\n\nfunction hasHubOnCarrier(carrier) {\n return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\n\n\nfunction getHubFromCarrier(carrier) {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) return carrier.__SENTRY__.hub;\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = new Hub();\n return carrier.__SENTRY__.hub;\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\n\nfunction setHubOnCarrier(carrier, hub) {\n if (!carrier) return false;\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = hub;\n return true;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vc2Vzc2lvbi5qcz9lZGE3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL2VzbS9odWIuanM/YTk3ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUE4QztBQUMrQjtBQUM3RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0JBQUs7QUFDcEI7QUFDQSxrQkFBa0Isc0NBQWdCO0FBQ2xDO0FBQ0EsZ0NBQWdDOztBQUVoQyx1QkFBdUIsbUNBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsbUNBQWtCOztBQUU1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRCxzQkFBSztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssMEJBQTBCLHNDQUFnQjtBQUMvQztBQUNBLGdCQUFnQiw4Q0FBb0I7QUFDcEMsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxXQUFXLG9DQUFpQjtBQUM1QjtBQUNBO0FBQ0E7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dGVudCI6WyJpbXBvcnQgeyBTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgdGltZXN0YW1wSW5TZWNvbmRzLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLyoqXG4gKiBAaW5oZXJpdGRvY1xuICovXG5cbnZhciBTZXNzaW9uID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2Vzc2lvbihjb250ZXh0KSB7XG4gICAgdGhpcy5lcnJvcnMgPSAwO1xuICAgIHRoaXMuc2lkID0gdXVpZDQoKTtcbiAgICB0aGlzLmR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnN0YXR1cyA9IFNlc3Npb25TdGF0dXMuT2s7XG4gICAgdGhpcy5pbml0ID0gdHJ1ZTtcbiAgICB0aGlzLmlnbm9yZUR1cmF0aW9uID0gZmFsc2U7IC8vIEJvdGggdGltZXN0YW1wIGFuZCBzdGFydGVkIGFyZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLlxuXG4gICAgdmFyIHN0YXJ0aW5nVGltZSA9IHRpbWVzdGFtcEluU2Vjb25kcygpO1xuICAgIHRoaXMudGltZXN0YW1wID0gc3RhcnRpbmdUaW1lO1xuICAgIHRoaXMuc3RhcnRlZCA9IHN0YXJ0aW5nVGltZTtcblxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZShjb250ZXh0KTtcbiAgICB9XG4gIH1cbiAgLyoqIEpTRG9jICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxuICBTZXNzaW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRleHQgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC51c2VyKSB7XG4gICAgICBpZiAoIXRoaXMuaXBBZGRyZXNzICYmIGNvbnRleHQudXNlci5pcF9hZGRyZXNzKSB7XG4gICAgICAgIHRoaXMuaXBBZGRyZXNzID0gY29udGV4dC51c2VyLmlwX2FkZHJlc3M7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kaWQgJiYgIWNvbnRleHQuZGlkKSB7XG4gICAgICAgIHRoaXMuZGlkID0gY29udGV4dC51c2VyLmlkIHx8IGNvbnRleHQudXNlci5lbWFpbCB8fCBjb250ZXh0LnVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50aW1lc3RhbXAgPSBjb250ZXh0LnRpbWVzdGFtcCB8fCB0aW1lc3RhbXBJblNlY29uZHMoKTtcblxuICAgIGlmIChjb250ZXh0Lmlnbm9yZUR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmlnbm9yZUR1cmF0aW9uID0gY29udGV4dC5pZ25vcmVEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC5zaWQpIHtcbiAgICAgIC8vIEdvb2QgZW5vdWdoIHV1aWQgdmFsaWRhdGlvbi4g4oCUIEthbWlsXG4gICAgICB0aGlzLnNpZCA9IGNvbnRleHQuc2lkLmxlbmd0aCA9PT0gMzIgPyBjb250ZXh0LnNpZCA6IHV1aWQ0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQuaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmluaXQgPSBjb250ZXh0LmluaXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRpZCAmJiBjb250ZXh0LmRpZCkge1xuICAgICAgdGhpcy5kaWQgPSBcIlwiICsgY29udGV4dC5kaWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0LnN0YXJ0ZWQgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnN0YXJ0ZWQgPSBjb250ZXh0LnN0YXJ0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWdub3JlRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dC5kdXJhdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBjb250ZXh0LmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLnRpbWVzdGFtcCAtIHRoaXMuc3RhcnRlZDtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbiA+PSAwID8gZHVyYXRpb24gOiAwO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnJlbGVhc2UpIHtcbiAgICAgIHRoaXMucmVsZWFzZSA9IGNvbnRleHQucmVsZWFzZTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC5lbnZpcm9ubWVudCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGNvbnRleHQuZW52aXJvbm1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlwQWRkcmVzcyAmJiBjb250ZXh0LmlwQWRkcmVzcykge1xuICAgICAgdGhpcy5pcEFkZHJlc3MgPSBjb250ZXh0LmlwQWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlckFnZW50ICYmIGNvbnRleHQudXNlckFnZW50KSB7XG4gICAgICB0aGlzLnVzZXJBZ2VudCA9IGNvbnRleHQudXNlckFnZW50O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29udGV4dC5lcnJvcnMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGNvbnRleHQuZXJyb3JzO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnN0YXR1cykge1xuICAgICAgdGhpcy5zdGF0dXMgPSBjb250ZXh0LnN0YXR1cztcbiAgICB9XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU2Vzc2lvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICBzdGF0dXM6IHN0YXR1c1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gU2Vzc2lvblN0YXR1cy5Paykge1xuICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICBzdGF0dXM6IFNlc3Npb25TdGF0dXMuRXhpdGVkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU2Vzc2lvbi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICBzaWQ6IFwiXCIgKyB0aGlzLnNpZCxcbiAgICAgIGluaXQ6IHRoaXMuaW5pdCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlYyBpcyBjb252ZXJ0ZWQgdG8gbXMgZm9yIGRhdGUgY29uc3RydWN0b3JcbiAgICAgIHN0YXJ0ZWQ6IG5ldyBEYXRlKHRoaXMuc3RhcnRlZCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHRoaXMudGltZXN0YW1wICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLFxuICAgICAgZGlkOiB0eXBlb2YgdGhpcy5kaWQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aGlzLmRpZCA9PT0gJ3N0cmluZycgPyBcIlwiICsgdGhpcy5kaWQgOiB1bmRlZmluZWQsXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIGF0dHJzOiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICAgIHJlbGVhc2U6IHRoaXMucmVsZWFzZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICAgIGlwX2FkZHJlc3M6IHRoaXMuaXBBZGRyZXNzLFxuICAgICAgICB1c2VyX2FnZW50OiB0aGlzLnVzZXJBZ2VudFxuICAgICAgfSlcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gU2Vzc2lvbjtcbn0oKTtcblxuZXhwb3J0IHsgU2Vzc2lvbiB9OyIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cblxuaW1wb3J0IHsgU2Vzc2lvblN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgY29uc29sZVNhbmRib3gsIGRhdGVUaW1lc3RhbXBJblNlY29uZHMsIGdldEdsb2JhbE9iamVjdCwgaXNOb2RlRW52LCBsb2dnZXIsIHV1aWQ0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG4vKipcbiAqIEFQSSBjb21wYXRpYmlsaXR5IHZlcnNpb24gb2YgdGhpcyBodWIuXG4gKlxuICogV0FSTklORzogVGhpcyBudW1iZXIgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHdoZW4gdGhlIGdsb2JhbCBpbnRlcmZhY2VcbiAqIGNoYW5nZXMgYW5kIG5ldyBtZXRob2RzIGFyZSBpbnRyb2R1Y2VkLlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuXG5leHBvcnQgdmFyIEFQSV9WRVJTSU9OID0gNDtcbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBicmVhZGNydW1icyBhZGRlZCB0byBhbiBldmVudC4gQ2FuIGJlIG92ZXJ3cml0dGVuXG4gKiB3aXRoIHtAbGluayBPcHRpb25zLm1heEJyZWFkY3J1bWJzfS5cbiAqL1xuXG52YXIgREVGQVVMVF9CUkVBRENSVU1CUyA9IDEwMDtcbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xuXG52YXIgSHViID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGh1Yiwgd2lsbCBwdXNoIG9uZSB7QGxpbmsgTGF5ZXJ9IGludG8gdGhlXG4gICAqIGludGVybmFsIHN0YWNrIG9uIGNyZWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50IGJvdW5kIHRvIHRoZSBodWIuXG4gICAqIEBwYXJhbSBzY29wZSBib3VuZCB0byB0aGUgaHViLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBudW1iZXIsIGhpZ2hlciBudW1iZXIgbWVhbnMgaGlnaGVyIHByaW9yaXR5LlxuICAgKi9cbiAgZnVuY3Rpb24gSHViKGNsaWVudCwgc2NvcGUsIF92ZXJzaW9uKSB7XG4gICAgaWYgKHNjb3BlID09PSB2b2lkIDApIHtcbiAgICAgIHNjb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgfVxuXG4gICAgaWYgKF92ZXJzaW9uID09PSB2b2lkIDApIHtcbiAgICAgIF92ZXJzaW9uID0gQVBJX1ZFUlNJT047XG4gICAgfVxuXG4gICAgdGhpcy5fdmVyc2lvbiA9IF92ZXJzaW9uO1xuICAgIC8qKiBJcyBhIHtAbGluayBMYXllcn1bXSBjb250YWluaW5nIHRoZSBjbGllbnQgYW5kIHNjb3BlICovXG5cbiAgICB0aGlzLl9zdGFjayA9IFt7fV07XG4gICAgdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlID0gc2NvcGU7XG5cbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICB0aGlzLmJpbmRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5pc09sZGVyVGhhbiA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPCB2ZXJzaW9uO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLmJpbmRDbGllbnQgPSBmdW5jdGlvbiAoY2xpZW50KSB7XG4gICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICB0b3AuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKGNsaWVudCAmJiBjbGllbnQuc2V0dXBJbnRlZ3JhdGlvbnMpIHtcbiAgICAgIGNsaWVudC5zZXR1cEludGVncmF0aW9ucygpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5wdXNoU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2Ugd2FudCB0byBjbG9uZSB0aGUgY29udGVudCBvZiBwcmV2IHNjb3BlXG4gICAgdmFyIHNjb3BlID0gU2NvcGUuY2xvbmUodGhpcy5nZXRTY29wZSgpKTtcbiAgICB0aGlzLmdldFN0YWNrKCkucHVzaCh7XG4gICAgICBjbGllbnQ6IHRoaXMuZ2V0Q2xpZW50KCksXG4gICAgICBzY29wZTogc2NvcGVcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUucG9wU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZ2V0U3RhY2soKS5sZW5ndGggPD0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXRoaXMuZ2V0U3RhY2soKS5wb3AoKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS53aXRoU2NvcGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLnB1c2hTY29wZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKHNjb3BlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wb3BTY29wZSgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5nZXRDbGllbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5jbGllbnQ7XG4gIH07XG4gIC8qKiBSZXR1cm5zIHRoZSBzY29wZSBvZiB0aGUgdG9wIHN0YWNrLiAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5nZXRTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlO1xuICB9O1xuICAvKiogUmV0dXJucyB0aGUgc2NvcGUgc3RhY2sgZm9yIGRvbWFpbnMgb3IgdGhlIHByb2Nlc3MuICovXG5cblxuICBIdWIucHJvdG90eXBlLmdldFN0YWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFjaztcbiAgfTtcbiAgLyoqIFJldHVybnMgdGhlIHRvcG1vc3Qgc2NvcGUgbGF5ZXIgaW4gdGhlIG9yZGVyIGRvbWFpbiA+IGxvY2FsID4gcHJvY2Vzcy4gKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuZ2V0U3RhY2tUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aCAtIDFdO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5cblxuICBIdWIucHJvdG90eXBlLmNhcHR1cmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50KSB7XG4gICAgdmFyIGV2ZW50SWQgPSB0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCk7XG4gICAgdmFyIGZpbmFsSGludCA9IGhpbnQ7IC8vIElmIHRoZXJlJ3Mgbm8gZXhwbGljaXQgaGludCBwcm92aWRlZCwgbWltaWMgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjbGllbnQsIGFzIGl0J3MgdGhlIGxvd2VzdCBsZXZlbCBBUEksIGFuZCBkb2luZyB0aGlzLFxuICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG5cbiAgICBpZiAoIWhpbnQpIHtcbiAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSB2b2lkIDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgZmluYWxIaW50ID0ge1xuICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXhjZXB0aW9uLFxuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIF9fYXNzaWduKF9fYXNzaWduKHt9LCBmaW5hbEhpbnQpLCB7XG4gICAgICBldmVudF9pZDogZXZlbnRJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiBldmVudElkO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLmNhcHR1cmVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsLCBoaW50KSB7XG4gICAgdmFyIGV2ZW50SWQgPSB0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCk7XG4gICAgdmFyIGZpbmFsSGludCA9IGhpbnQ7IC8vIElmIHRoZXJlJ3Mgbm8gZXhwbGljaXQgaGludCBwcm92aWRlZCwgbWltaWMgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjbGllbnQsIGFzIGl0J3MgdGhlIGxvd2VzdCBsZXZlbCBBUEksIGFuZCBkb2luZyB0aGlzLFxuICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG5cbiAgICBpZiAoIWhpbnQpIHtcbiAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSB2b2lkIDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IG1lc3NhZ2UsXG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2ludm9rZUNsaWVudCgnY2FwdHVyZU1lc3NhZ2UnLCBtZXNzYWdlLCBsZXZlbCwgX19hc3NpZ24oX19hc3NpZ24oe30sIGZpbmFsSGludCksIHtcbiAgICAgIGV2ZW50X2lkOiBldmVudElkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuY2FwdHVyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50KSB7XG4gICAgdmFyIGV2ZW50SWQgPSB1dWlkNCgpO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICd0cmFuc2FjdGlvbicpIHtcbiAgICAgIHRoaXMuX2xhc3RFdmVudElkID0gZXZlbnRJZDtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFdmVudCcsIGV2ZW50LCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaGludCksIHtcbiAgICAgIGV2ZW50X2lkOiBldmVudElkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUubGFzdEV2ZW50SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFdmVudElkO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLmFkZEJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoYnJlYWRjcnVtYiwgaGludCkge1xuICAgIHZhciBfYSA9IHRoaXMuZ2V0U3RhY2tUb3AoKSxcbiAgICAgICAgc2NvcGUgPSBfYS5zY29wZSxcbiAgICAgICAgY2xpZW50ID0gX2EuY2xpZW50O1xuXG4gICAgaWYgKCFzY29wZSB8fCAhY2xpZW50KSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcblxuICAgIHZhciBfYiA9IGNsaWVudC5nZXRPcHRpb25zICYmIGNsaWVudC5nZXRPcHRpb25zKCkgfHwge30sXG4gICAgICAgIF9jID0gX2IuYmVmb3JlQnJlYWRjcnVtYixcbiAgICAgICAgYmVmb3JlQnJlYWRjcnVtYiA9IF9jID09PSB2b2lkIDAgPyBudWxsIDogX2MsXG4gICAgICAgIF9kID0gX2IubWF4QnJlYWRjcnVtYnMsXG4gICAgICAgIG1heEJyZWFkY3J1bWJzID0gX2QgPT09IHZvaWQgMCA/IERFRkFVTFRfQlJFQURDUlVNQlMgOiBfZDtcblxuICAgIGlmIChtYXhCcmVhZGNydW1icyA8PSAwKSByZXR1cm47XG4gICAgdmFyIHRpbWVzdGFtcCA9IGRhdGVUaW1lc3RhbXBJblNlY29uZHMoKTtcblxuICAgIHZhciBtZXJnZWRCcmVhZGNydW1iID0gX19hc3NpZ24oe1xuICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXBcbiAgICB9LCBicmVhZGNydW1iKTtcblxuICAgIHZhciBmaW5hbEJyZWFkY3J1bWIgPSBiZWZvcmVCcmVhZGNydW1iID8gY29uc29sZVNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJlZm9yZUJyZWFkY3J1bWIobWVyZ2VkQnJlYWRjcnVtYiwgaGludCk7XG4gICAgfSkgOiBtZXJnZWRCcmVhZGNydW1iO1xuICAgIGlmIChmaW5hbEJyZWFkY3J1bWIgPT09IG51bGwpIHJldHVybjtcbiAgICBzY29wZS5hZGRCcmVhZGNydW1iKGZpbmFsQnJlYWRjcnVtYiwgbWF4QnJlYWRjcnVtYnMpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLnNldFVzZXIgPSBmdW5jdGlvbiAodXNlcikge1xuICAgIHZhciBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldFVzZXIodXNlcik7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuc2V0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0VGFncyh0YWdzKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5zZXRFeHRyYXMgPSBmdW5jdGlvbiAoZXh0cmFzKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0RXh0cmFzKGV4dHJhcyk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuc2V0VGFnID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuc2V0RXh0cmEgPSBmdW5jdGlvbiAoa2V5LCBleHRyYSkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldEV4dHJhKGtleSwgZXh0cmEpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cblxuICBIdWIucHJvdG90eXBlLnNldENvbnRleHQgPSBmdW5jdGlvbiAobmFtZSwgY29udGV4dCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldENvbnRleHQobmFtZSwgY29udGV4dCk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuY29uZmlndXJlU2NvcGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgX2EgPSB0aGlzLmdldFN0YWNrVG9wKCksXG4gICAgICAgIHNjb3BlID0gX2Euc2NvcGUsXG4gICAgICAgIGNsaWVudCA9IF9hLmNsaWVudDtcblxuICAgIGlmIChzY29wZSAmJiBjbGllbnQpIHtcbiAgICAgIGNhbGxiYWNrKHNjb3BlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIG9sZEh1YiA9IG1ha2VNYWluKHRoaXMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtYWtlTWFpbihvbGRIdWIpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5nZXRJbnRlZ3JhdGlvbiA9IGZ1bmN0aW9uIChpbnRlZ3JhdGlvbikge1xuICAgIHZhciBjbGllbnQgPSB0aGlzLmdldENsaWVudCgpO1xuICAgIGlmICghY2xpZW50KSByZXR1cm4gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xpZW50LmdldEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiQ2Fubm90IHJldHJpZXZlIGludGVncmF0aW9uIFwiICsgaW50ZWdyYXRpb24uaWQgKyBcIiBmcm9tIHRoZSBjdXJyZW50IEh1YlwiKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFNwYW4nLCBjb250ZXh0KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5zdGFydFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGN1c3RvbVNhbXBsaW5nQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFRyYW5zYWN0aW9uJywgY29udGV4dCwgY3VzdG9tU2FtcGxpbmdDb250ZXh0KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS50cmFjZUhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2QoJ3RyYWNlSGVhZGVycycpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLmNhcHR1cmVTZXNzaW9uID0gZnVuY3Rpb24gKGVuZFNlc3Npb24pIHtcbiAgICBpZiAoZW5kU2Vzc2lvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBlbmRTZXNzaW9uID0gZmFsc2U7XG4gICAgfSAvLyBib3RoIHNlbmQgdGhlIHVwZGF0ZSBhbmQgcHVsbCB0aGUgc2Vzc2lvbiBmcm9tIHRoZSBzY29wZVxuXG5cbiAgICBpZiAoZW5kU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZW5kU2Vzc2lvbigpO1xuICAgIH0gLy8gb25seSBzZW5kIHRoZSB1cGRhdGVcblxuXG4gICAgdGhpcy5fc2VuZFNlc3Npb25VcGRhdGUoKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSHViLnByb3RvdHlwZS5lbmRTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG5cbiAgICAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLmdldFN0YWNrVG9wKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY29wZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdldFNlc3Npb24oKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNsb3NlKCk7XG5cbiAgICB0aGlzLl9zZW5kU2Vzc2lvblVwZGF0ZSgpOyAvLyB0aGUgc2Vzc2lvbiBpcyBvdmVyOyB0YWtlIGl0IG9mZiBvZiB0aGUgc2NvcGVcblxuXG4gICAgKF9lID0gKF9kID0gdGhpcy5nZXRTdGFja1RvcCgpKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Quc2NvcGUpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5zZXRTZXNzaW9uKCk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEh1Yi5wcm90b3R5cGUuc3RhcnRTZXNzaW9uID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgX2EgPSB0aGlzLmdldFN0YWNrVG9wKCksXG4gICAgICAgIHNjb3BlID0gX2Euc2NvcGUsXG4gICAgICAgIGNsaWVudCA9IF9hLmNsaWVudDtcblxuICAgIHZhciBfYiA9IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpIHx8IHt9LFxuICAgICAgICByZWxlYXNlID0gX2IucmVsZWFzZSxcbiAgICAgICAgZW52aXJvbm1lbnQgPSBfYi5lbnZpcm9ubWVudDsgLy8gV2lsbCBmZXRjaCB1c2VyQWdlbnQgaWYgY2FsbGVkIGZyb20gYnJvd3NlciBzZGtcblxuXG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIHZhciB1c2VyQWdlbnQgPSAoZ2xvYmFsLm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50O1xuICAgIHZhciBzZXNzaW9uID0gbmV3IFNlc3Npb24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe1xuICAgICAgcmVsZWFzZTogcmVsZWFzZSxcbiAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudFxuICAgIH0sIHNjb3BlICYmIHtcbiAgICAgIHVzZXI6IHNjb3BlLmdldFVzZXIoKVxuICAgIH0pLCB1c2VyQWdlbnQgJiYge1xuICAgICAgdXNlckFnZW50OiB1c2VyQWdlbnRcbiAgICB9KSwgY29udGV4dCkpO1xuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICAvLyBFbmQgZXhpc3Rpbmcgc2Vzc2lvbiBpZiB0aGVyZSdzIG9uZVxuICAgICAgdmFyIGN1cnJlbnRTZXNzaW9uID0gc2NvcGUuZ2V0U2Vzc2lvbiAmJiBzY29wZS5nZXRTZXNzaW9uKCk7XG5cbiAgICAgIGlmIChjdXJyZW50U2Vzc2lvbiAmJiBjdXJyZW50U2Vzc2lvbi5zdGF0dXMgPT09IFNlc3Npb25TdGF0dXMuT2spIHtcbiAgICAgICAgY3VycmVudFNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgICBzdGF0dXM6IFNlc3Npb25TdGF0dXMuRXhpdGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVuZFNlc3Npb24oKTsgLy8gQWZ0ZXJ3YXJkcyB3ZSBzZXQgdGhlIG5ldyBzZXNzaW9uIG9uIHRoZSBzY29wZVxuXG4gICAgICBzY29wZS5zZXRTZXNzaW9uKHNlc3Npb24pO1xuICAgIH1cblxuICAgIHJldHVybiBzZXNzaW9uO1xuICB9O1xuICAvKipcbiAgICogU2VuZHMgdGhlIGN1cnJlbnQgU2Vzc2lvbiBvbiB0aGUgc2NvcGVcbiAgICovXG5cblxuICBIdWIucHJvdG90eXBlLl9zZW5kU2Vzc2lvblVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLmdldFN0YWNrVG9wKCksXG4gICAgICAgIHNjb3BlID0gX2Euc2NvcGUsXG4gICAgICAgIGNsaWVudCA9IF9hLmNsaWVudDtcblxuICAgIGlmICghc2NvcGUpIHJldHVybjtcbiAgICB2YXIgc2Vzc2lvbiA9IHNjb3BlLmdldFNlc3Npb24gJiYgc2NvcGUuZ2V0U2Vzc2lvbigpO1xuXG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGlmIChjbGllbnQgJiYgY2xpZW50LmNhcHR1cmVTZXNzaW9uKSB7XG4gICAgICAgIGNsaWVudC5jYXB0dXJlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBhIG1ldGhvZCBvbiB0aGUgdG9wIGNsaWVudCBpZiBpdCBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQgZnVuY3Rpb24uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5cbiAgSHViLnByb3RvdHlwZS5faW52b2tlQ2xpZW50ID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgX2IgPSB0aGlzLmdldFN0YWNrVG9wKCksXG4gICAgICAgIHNjb3BlID0gX2Iuc2NvcGUsXG4gICAgICAgIGNsaWVudCA9IF9iLmNsaWVudDtcblxuICAgIGlmIChjbGllbnQgJiYgY2xpZW50W21ldGhvZF0pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChfYSA9IGNsaWVudClbbWV0aG9kXS5hcHBseShfYSwgX19zcHJlYWQoYXJncywgW3Njb3BlXSkpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIENhbGxzIGdsb2JhbCBleHRlbnNpb24gbWV0aG9kIGFuZCBiaW5kaW5nIGN1cnJlbnQgaW5zdGFuY2UgdG8gdGhlIGZ1bmN0aW9uIGNhbGxcbiAgICovXG4gIC8vIEB0cy1pZ25vcmUgRnVuY3Rpb24gbGFja3MgZW5kaW5nIHJldHVybiBzdGF0ZW1lbnQgYW5kIHJldHVybiB0eXBlIGRvZXMgbm90IGluY2x1ZGUgJ3VuZGVmaW5lZCcuIHRzKDIzNjYpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cblxuICBIdWIucHJvdG90eXBlLl9jYWxsRXh0ZW5zaW9uTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gICAgdmFyIHNlbnRyeSA9IGNhcnJpZXIuX19TRU5UUllfXztcblxuICAgIGlmIChzZW50cnkgJiYgc2VudHJ5LmV4dGVuc2lvbnMgJiYgdHlwZW9mIHNlbnRyeS5leHRlbnNpb25zW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzZW50cnkuZXh0ZW5zaW9uc1ttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKFwiRXh0ZW5zaW9uIG1ldGhvZCBcIiArIG1ldGhvZCArIFwiIGNvdWxkbid0IGJlIGZvdW5kLCBkb2luZyBub3RoaW5nLlwiKTtcbiAgfTtcblxuICByZXR1cm4gSHViO1xufSgpO1xuXG5leHBvcnQgeyBIdWIgfTtcbi8qKlxuICogUmV0dXJucyB0aGUgZ2xvYmFsIHNoaW0gcmVnaXN0cnkuXG4gKlxuICogRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgZGVzcGl0ZSBhbHdheXMgcmV0dXJuaW5nIGEgdmFsaWQgQ2FycmllcixcbiAqIGl0IGhhcyBhbiBvcHRpb25hbCBgX19TRU5UUllfX2AgcHJvcGVydHksIHdoaWNoIHRoZW4gaW4gdHVybiByZXF1aXJlcyB1cyB0byBhbHdheXMgcGVyZm9ybSBhbiB1bm5lY2Vzc2FyeSBjaGVja1xuICogYXQgdGhlIGNhbGwtc2l0ZS4gV2UgYWx3YXlzIGFjY2VzcyB0aGUgY2FycmllciB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBgX19TRU5UUllfX2AgaXMgdGhlcmUuXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWluQ2FycmllcigpIHtcbiAgdmFyIGNhcnJpZXIgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHtcbiAgICBleHRlbnNpb25zOiB7fSxcbiAgICBodWI6IHVuZGVmaW5lZFxuICB9O1xuICByZXR1cm4gY2Fycmllcjtcbn1cbi8qKlxuICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgbWFpbiBodWIgd2l0aCB0aGUgcGFzc2VkIG9uZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBvbGQgcmVwbGFjZWQgaHViXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VNYWluKGh1Yikge1xuICB2YXIgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuICB2YXIgb2xkSHViID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xuICBzZXRIdWJPbkNhcnJpZXIocmVnaXN0cnksIGh1Yik7XG4gIHJldHVybiBvbGRIdWI7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgaHViIGluc3RhbmNlLlxuICpcbiAqIElmIGEgaHViIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGUgZ2xvYmFsIGNhcnJpZXIgYnV0IHRoaXMgbW9kdWxlXG4gKiBjb250YWlucyBhIG1vcmUgcmVjZW50IHZlcnNpb24sIGl0IHJlcGxhY2VzIHRoZSByZWdpc3RlcmVkIHZlcnNpb24uXG4gKiBPdGhlcndpc2UsIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBodWIgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEh1YigpIHtcbiAgLy8gR2V0IG1haW4gY2FycmllciAoZ2xvYmFsIGZvciBldmVyeSBlbnZpcm9ubWVudClcbiAgdmFyIHJlZ2lzdHJ5ID0gZ2V0TWFpbkNhcnJpZXIoKTsgLy8gSWYgdGhlcmUncyBubyBodWIsIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG5cbiAgaWYgKCFoYXNIdWJPbkNhcnJpZXIocmVnaXN0cnkpIHx8IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICBzZXRIdWJPbkNhcnJpZXIocmVnaXN0cnksIG5ldyBIdWIoKSk7XG4gIH0gLy8gUHJlZmVyIGRvbWFpbnMgb3ZlciBnbG9iYWwgaWYgdGhleSBhcmUgdGhlcmUgKGFwcGxpY2FibGUgb25seSB0byBOb2RlIGVudmlyb25tZW50KVxuXG5cbiAgaWYgKGlzTm9kZUVudigpKSB7XG4gICAgcmV0dXJuIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnkpO1xuICB9IC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcblxuXG4gIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGl2ZSBkb21haW4sIGlmIG9uZSBleGlzdHNcbiAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkOyByZW1vdmUgaW4gdjdcbiAqIEByZXR1cm5zIFRoZSBkb21haW4sIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBhY3RpdmUgZG9tYWluXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRG9tYWluKCkge1xuICBsb2dnZXIud2FybignRnVuY3Rpb24gYGdldEFjdGl2ZURvbWFpbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uJyk7XG5cbiAgdmFyIHNlbnRyeSA9IGdldE1haW5DYXJyaWVyKCkuX19TRU5UUllfXztcblxuICByZXR1cm4gc2VudHJ5ICYmIHNlbnRyeS5leHRlbnNpb25zICYmIHNlbnRyeS5leHRlbnNpb25zLmRvbWFpbiAmJiBzZW50cnkuZXh0ZW5zaW9ucy5kb21haW4uYWN0aXZlO1xufVxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aGUgaHViIGZyb20gYW4gYWN0aXZlIGRvbWFpbiwgYW5kIGZhbGxiYWNrIHRvIHRoZSByZWdpc3RyeSBpZiBvbmUgZG9lc24ndCBleGlzdFxuICogQHJldHVybnMgZGlzY292ZXJlZCBodWJcbiAqL1xuXG5mdW5jdGlvbiBnZXRIdWJGcm9tQWN0aXZlRG9tYWluKHJlZ2lzdHJ5KSB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIHRyeSB7XG4gICAgdmFyIGFjdGl2ZURvbWFpbiA9IChfYyA9IChfYiA9IChfYSA9IGdldE1haW5DYXJyaWVyKCkuX19TRU5UUllfXykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmV4dGVuc2lvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kb21haW4pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hY3RpdmU7IC8vIElmIHRoZXJlJ3Mgbm8gYWN0aXZlIGRvbWFpbiwganVzdCByZXR1cm4gZ2xvYmFsIGh1YlxuXG4gICAgaWYgKCFhY3RpdmVEb21haW4pIHtcbiAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgfSAvLyBJZiB0aGVyZSdzIG5vIGh1YiBvbiBjdXJyZW50IGRvbWFpbiwgb3IgaXQncyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG5cblxuICAgIGlmICghaGFzSHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbikgfHwgZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICAgIHZhciByZWdpc3RyeUh1YlRvcFN0YWNrID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpLmdldFN0YWNrVG9wKCk7XG4gICAgICBzZXRIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluLCBuZXcgSHViKHJlZ2lzdHJ5SHViVG9wU3RhY2suY2xpZW50LCBTY29wZS5jbG9uZShyZWdpc3RyeUh1YlRvcFN0YWNrLnNjb3BlKSkpO1xuICAgIH0gLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZG9tYWluXG5cblxuICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihhY3RpdmVEb21haW4pO1xuICB9IGNhdGNoIChfT28pIHtcbiAgICAvLyBSZXR1cm4gaHViIHRoYXQgbGl2ZXMgb24gYSBnbG9iYWwgb2JqZWN0XG4gICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHdpbGwgdGVsbCB3aGV0aGVyIGEgY2FycmllciBoYXMgYSBodWIgb24gaXQgb3Igbm90XG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc0h1Yk9uQ2FycmllcihjYXJyaWVyKSB7XG4gIHJldHVybiAhIShjYXJyaWVyICYmIGNhcnJpZXIuX19TRU5UUllfXyAmJiBjYXJyaWVyLl9fU0VOVFJZX18uaHViKTtcbn1cbi8qKlxuICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgSHVifSBhbmQgYWRkIHRvIHRoZSBwYXNzZWQgb2JqZWN0IG9uXG4gKiBfX1NFTlRSWV9fLmh1Yi5cbiAqIEBwYXJhbSBjYXJyaWVyIG9iamVjdFxuICogQGhpZGRlblxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEh1YkZyb21DYXJyaWVyKGNhcnJpZXIpIHtcbiAgaWYgKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xuICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBuZXcgSHViKCk7XG4gIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgc2V0IHBhc3NlZCB7QGxpbmsgSHVifSBvbiB0aGUgcGFzc2VkIG9iamVjdCdzIF9fU0VOVFJZX18uaHViIGF0dHJpYnV0ZVxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAcGFyYW0gaHViIEh1YlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEh1Yk9uQ2FycmllcihjYXJyaWVyLCBodWIpIHtcbiAgaWYgKCFjYXJyaWVyKSByZXR1cm4gZmFsc2U7XG4gIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgY2Fycmllci5fX1NFTlRSWV9fLmh1YiA9IGh1YjtcbiAgcmV0dXJuIHRydWU7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3210\n")},7659:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"s\": function() { return /* binding */ Scope; },\n/* harmony export */ \"c\": function() { return /* binding */ addGlobalEventProcessor; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4645);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2684);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5153);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5370);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2861);\n\n\n/**\n * Absolute maximum number of breadcrumbs added to an event.\n * The `maxBreadcrumbs` option cannot be higher than this value.\n */\n\nvar MAX_BREADCRUMBS = 100;\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\n\nvar Scope =\n/** @class */\nfunction () {\n function Scope() {\n /** Flag if notifying is happening. */\n this._notifyingListeners = false;\n /** Callback for client to receive scope changes. */\n\n this._scopeListeners = [];\n /** Callback list that will be called after {@link applyToEvent}. */\n\n this._eventProcessors = [];\n /** Array of breadcrumbs. */\n\n this._breadcrumbs = [];\n /** User */\n\n this._user = {};\n /** Tags */\n\n this._tags = {};\n /** Extra */\n\n this._extra = {};\n /** Contexts */\n\n this._contexts = {};\n }\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n\n\n Scope.clone = function (scope) {\n var newScope = new Scope();\n\n if (scope) {\n newScope._breadcrumbs = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__spread */ .fl)(scope._breadcrumbs);\n newScope._tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, scope._tags);\n newScope._extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, scope._extra);\n newScope._contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, scope._contexts);\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._session = scope._session;\n newScope._transactionName = scope._transactionName;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__spread */ .fl)(scope._eventProcessors);\n newScope._requestSession = scope._requestSession;\n }\n\n return newScope;\n };\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n\n\n Scope.prototype.addScopeListener = function (callback) {\n this._scopeListeners.push(callback);\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.addEventProcessor = function (callback) {\n this._eventProcessors.push(callback);\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setUser = function (user) {\n this._user = user || {};\n\n if (this._session) {\n this._session.update({\n user: user\n });\n }\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.getUser = function () {\n return this._user;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.getRequestSession = function () {\n return this._requestSession;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setRequestSession = function (requestSession) {\n this._requestSession = requestSession;\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setTags = function (tags) {\n this._tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._tags), tags);\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setTag = function (key, value) {\n var _a;\n\n this._tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._tags), (_a = {}, _a[key] = value, _a));\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setExtras = function (extras) {\n this._extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._extra), extras);\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setExtra = function (key, extra) {\n var _a;\n\n this._extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._extra), (_a = {}, _a[key] = extra, _a));\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setFingerprint = function (fingerprint) {\n this._fingerprint = fingerprint;\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setLevel = function (level) {\n this._level = level;\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setTransactionName = function (name) {\n this._transactionName = name;\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * Can be removed in major version.\n * @deprecated in favor of {@link this.setTransactionName}\n */\n\n\n Scope.prototype.setTransaction = function (name) {\n return this.setTransactionName(name);\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setContext = function (key, context) {\n var _a;\n\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._contexts), (_a = {}, _a[key] = context, _a));\n }\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setSpan = function (span) {\n this._span = span;\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.getSpan = function () {\n return this._span;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.getTransaction = function () {\n var _a, _b, _c, _d; // often, this span will be a transaction, but it's not guaranteed to be\n\n\n var span = this.getSpan(); // try it the new way first\n\n if ((_a = span) === null || _a === void 0 ? void 0 : _a.transaction) {\n return (_b = span) === null || _b === void 0 ? void 0 : _b.transaction;\n } // fallback to the old way (known bug: this only finds transactions with sampled = true)\n\n\n if ((_d = (_c = span) === null || _c === void 0 ? void 0 : _c.spanRecorder) === null || _d === void 0 ? void 0 : _d.spans[0]) {\n return span.spanRecorder.spans[0];\n } // neither way found a transaction\n\n\n return undefined;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.setSession = function (session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.getSession = function () {\n return this._session;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.update = function (captureContext) {\n if (!captureContext) {\n return this;\n }\n\n if (typeof captureContext === 'function') {\n var updatedScope = captureContext(this);\n return updatedScope instanceof Scope ? updatedScope : this;\n }\n\n if (captureContext instanceof Scope) {\n this._tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._tags), captureContext._tags);\n this._extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._extra), captureContext._extra);\n this._contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._contexts), captureContext._contexts);\n\n if (captureContext._user && Object.keys(captureContext._user).length) {\n this._user = captureContext._user;\n }\n\n if (captureContext._level) {\n this._level = captureContext._level;\n }\n\n if (captureContext._fingerprint) {\n this._fingerprint = captureContext._fingerprint;\n }\n\n if (captureContext._requestSession) {\n this._requestSession = captureContext._requestSession;\n }\n } else if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .isPlainObject */ .PO)(captureContext)) {\n // eslint-disable-next-line no-param-reassign\n captureContext = captureContext;\n this._tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._tags), captureContext.tags);\n this._extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._extra), captureContext.extra);\n this._contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._contexts), captureContext.contexts);\n\n if (captureContext.user) {\n this._user = captureContext.user;\n }\n\n if (captureContext.level) {\n this._level = captureContext.level;\n }\n\n if (captureContext.fingerprint) {\n this._fingerprint = captureContext.fingerprint;\n }\n\n if (captureContext.requestSession) {\n this._requestSession = captureContext.requestSession;\n }\n }\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.clear = function () {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._requestSession = undefined;\n this._span = undefined;\n this._session = undefined;\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n var maxCrumbs = typeof maxBreadcrumbs === 'number' ? Math.min(maxBreadcrumbs, MAX_BREADCRUMBS) : MAX_BREADCRUMBS; // No data has been changed, so don't notify scope listeners\n\n if (maxCrumbs <= 0) {\n return this;\n }\n\n var mergedBreadcrumb = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({\n timestamp: (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .dateTimestampInSeconds */ .yW)()\n }, breadcrumb);\n\n this._breadcrumbs = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__spread */ .fl)(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxCrumbs);\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Scope.prototype.clearBreadcrumbs = function () {\n this._breadcrumbs = [];\n\n this._notifyScopeListeners();\n\n return this;\n };\n /**\n * Applies the current context and fingerprint to the event.\n * Note that breadcrumbs will be added by the client.\n * Also if the event has already breadcrumbs on it, we do not merge them.\n * @param event Event\n * @param hint May contain additional information about the original exception.\n * @hidden\n */\n\n\n Scope.prototype.applyToEvent = function (event, hint) {\n var _a;\n\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._extra), event.extra);\n }\n\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._tags), event.tags);\n }\n\n if (this._user && Object.keys(this._user).length) {\n event.user = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._user), event.user);\n }\n\n if (this._contexts && Object.keys(this._contexts).length) {\n event.contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, this._contexts), event.contexts);\n }\n\n if (this._level) {\n event.level = this._level;\n }\n\n if (this._transactionName) {\n event.transaction = this._transactionName;\n } // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n\n\n if (this._span) {\n event.contexts = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({\n trace: this._span.getTraceContext()\n }, event.contexts);\n var transactionName = (_a = this._span.transaction) === null || _a === void 0 ? void 0 : _a.name;\n\n if (transactionName) {\n event.tags = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({\n transaction: transactionName\n }, event.tags);\n }\n }\n\n this._applyFingerprint(event);\n\n event.breadcrumbs = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__spread */ .fl)(event.breadcrumbs || [], this._breadcrumbs);\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n return this._notifyEventProcessors((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__spread */ .fl)(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n };\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n\n\n Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n var _this = this;\n\n if (index === void 0) {\n index = 0;\n }\n\n return new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .SyncPromise */ .c(function (resolve, reject) {\n var processor = processors[index];\n\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n var result = processor((0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__assign */ .pi)({}, event), hint);\n\n if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .isThenable */ .J8)(result)) {\n void result.then(function (final) {\n return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve);\n }).then(null, reject);\n } else {\n void _this._notifyEventProcessors(processors, result, hint, index + 1).then(resolve).then(null, reject);\n }\n }\n });\n };\n /**\n * This will be called on every set call.\n */\n\n\n Scope.prototype._notifyScopeListeners = function () {\n var _this = this; // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n\n\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n\n this._scopeListeners.forEach(function (callback) {\n callback(_this);\n });\n\n this._notifyingListeners = false;\n }\n };\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n\n\n Scope.prototype._applyFingerprint = function (event) {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint ? Array.isArray(event.fingerprint) ? event.fingerprint : [event.fingerprint] : []; // If we have something on the scope, then merge it with event\n\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n } // If we have no data at all, remove empty array default\n\n\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n };\n\n return Scope;\n}();\n\n\n/**\n * Returns the global event processors.\n */\n\nfunction getGlobalEventProcessors() {\n /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n var global = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .getGlobalObject */ .Rf)();\n global.__SENTRY__ = global.__SENTRY__ || {};\n global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n return global.__SENTRY__.globalEventProcessors;\n /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\n\n\nfunction addGlobalEventProcessor(callback) {\n getGlobalEventProcessors().push(callback);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vc2NvcGUuanM/NmMzNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBbUQ7QUFDNkQ7QUFDaEg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3Qyx5QkFBeUI7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRCxtQkFBbUI7O0FBRXBFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIseURBQVE7QUFDdEMsdUJBQXVCLHlEQUFRLEdBQUc7QUFDbEMsd0JBQXdCLHlEQUFRLEdBQUc7QUFDbkMsMkJBQTJCLHlEQUFRLEdBQUc7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHlEQUFRO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLGlCQUFpQix5REFBUSxDQUFDLHlEQUFRLEdBQUc7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsaUJBQWlCLHlEQUFR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dUJBQXVCLHlEQUFRO0FBQy9CO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EscUJBQXFCLHlEQUFRO0FBQzdCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUEsd0JBQXdCLHlEQUFRO0FBQ2hDO0FBQ0EsdUNBQXVDLHlEQUFRO0FBQy9DO0FBQ0E7QUFDQSxnQ0FBZ0MsbUJBQW1CO0FBQ25EOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLCtEQUFXO0FBQzFCOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsK0JBQStCLHlEQUFRLEdBQUc7O0FBRTFDLFlBQVksbUVBQVU7QUFDdEI7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsNEhBQTRIOztBQUU1SDtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVnQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsd0VBQWU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHTztBQUNQO0FBQ0EiLCJmaWxlIjoiNzY1OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBnZXRHbG9iYWxPYmplY3QsIGlzUGxhaW5PYmplY3QsIGlzVGhlbmFibGUsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKipcbiAqIEFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIGFkZGVkIHRvIGFuIGV2ZW50LlxuICogVGhlIGBtYXhCcmVhZGNydW1ic2Agb3B0aW9uIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiB0aGlzIHZhbHVlLlxuICovXG5cbnZhciBNQVhfQlJFQURDUlVNQlMgPSAxMDA7XG4vKipcbiAqIEhvbGRzIGFkZGl0aW9uYWwgZXZlbnQgaW5mb3JtYXRpb24uIHtAbGluayBTY29wZS5hcHBseVRvRXZlbnR9IHdpbGwgYmVcbiAqIGNhbGxlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBhbiBldmVudCB3aWxsIGJlIHNlbnQuXG4gKi9cblxudmFyIFNjb3BlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2NvcGUoKSB7XG4gICAgLyoqIEZsYWcgaWYgbm90aWZ5aW5nIGlzIGhhcHBlbmluZy4gKi9cbiAgICB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICAvKiogQ2FsbGJhY2sgZm9yIGNsaWVudCB0byByZWNlaXZlIHNjb3BlIGNoYW5nZXMuICovXG5cbiAgICB0aGlzLl9zY29wZUxpc3RlbmVycyA9IFtdO1xuICAgIC8qKiBDYWxsYmFjayBsaXN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0uICovXG5cbiAgICB0aGlzLl9ldmVudFByb2Nlc3NvcnMgPSBbXTtcbiAgICAvKiogQXJyYXkgb2YgYnJlYWRjcnVtYnMuICovXG5cbiAgICB0aGlzLl9icmVhZGNydW1icyA9IFtdO1xuICAgIC8qKiBVc2VyICovXG5cbiAgICB0aGlzLl91c2VyID0ge307XG4gICAgLyoqIFRhZ3MgKi9cblxuICAgIHRoaXMuX3RhZ3MgPSB7fTtcbiAgICAvKiogRXh0cmEgKi9cblxuICAgIHRoaXMuX2V4dHJhID0ge307XG4gICAgLyoqIENvbnRleHRzICovXG5cbiAgICB0aGlzLl9jb250ZXh0cyA9IHt9O1xuICB9XG4gIC8qKlxuICAgKiBJbmhlcml0IHZhbHVlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAqIEBwYXJhbSBzY29wZSB0byBjbG9uZS5cbiAgICovXG5cblxuICBTY29wZS5jbG9uZSA9IGZ1bmN0aW9uIChzY29wZSkge1xuICAgIHZhciBuZXdTY29wZSA9IG5ldyBTY29wZSgpO1xuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBuZXdTY29wZS5fYnJlYWRjcnVtYnMgPSBfX3NwcmVhZChzY29wZS5fYnJlYWRjcnVtYnMpO1xuICAgICAgbmV3U2NvcGUuX3RhZ3MgPSBfX2Fzc2lnbih7fSwgc2NvcGUuX3RhZ3MpO1xuICAgICAgbmV3U2NvcGUuX2V4dHJhID0gX19hc3NpZ24oe30sIHNjb3BlLl9leHRyYSk7XG4gICAgICBuZXdTY29wZS5fY29udGV4dHMgPSBfX2Fzc2lnbih7fSwgc2NvcGUuX2NvbnRleHRzKTtcbiAgICAgIG5ld1Njb3BlLl91c2VyID0gc2NvcGUuX3VzZXI7XG4gICAgICBuZXdTY29wZS5fbGV2ZWwgPSBzY29wZS5fbGV2ZWw7XG4gICAgICBuZXdTY29wZS5fc3BhbiA9IHNjb3BlLl9zcGFuO1xuICAgICAgbmV3U2NvcGUuX3Nlc3Npb24gPSBzY29wZS5fc2Vzc2lvbjtcbiAgICAgIG5ld1Njb3BlLl90cmFuc2FjdGlvbk5hbWUgPSBzY29wZS5fdHJhbnNhY3Rpb25OYW1lO1xuICAgICAgbmV3U2NvcGUuX2ZpbmdlcnByaW50ID0gc2NvcGUuX2ZpbmdlcnByaW50O1xuICAgICAgbmV3U2NvcGUuX2V2ZW50UHJvY2Vzc29ycyA9IF9fc3ByZWFkKHNjb3BlLl9ldmVudFByb2Nlc3NvcnMpO1xuICAgICAgbmV3U2NvcGUuX3JlcXVlc3RTZXNzaW9uID0gc2NvcGUuX3JlcXVlc3RTZXNzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdTY29wZTtcbiAgfTtcbiAgLyoqXG4gICAqIEFkZCBpbnRlcm5hbCBvbiBjaGFuZ2UgbGlzdGVuZXIuIFVzZWQgZm9yIHN1YiBTREtzIHRoYXQgbmVlZCB0byBzdG9yZSB0aGUgc2NvcGUuXG4gICAqIEBoaWRkZW5cbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuYWRkU2NvcGVMaXN0ZW5lciA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuYWRkRXZlbnRQcm9jZXNzb3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9ldmVudFByb2Nlc3NvcnMucHVzaChjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLnNldFVzZXIgPSBmdW5jdGlvbiAodXNlcikge1xuICAgIHRoaXMuX3VzZXIgPSB1c2VyIHx8IHt9O1xuXG4gICAgaWYgKHRoaXMuX3Nlc3Npb24pIHtcbiAgICAgIHRoaXMuX3Nlc3Npb24udXBkYXRlKHtcbiAgICAgICAgdXNlcjogdXNlclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuZ2V0VXNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLmdldFJlcXVlc3RTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0U2Vzc2lvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLnNldFJlcXVlc3RTZXNzaW9uID0gZnVuY3Rpb24gKHJlcXVlc3RTZXNzaW9uKSB7XG4gICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSByZXF1ZXN0U2Vzc2lvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLnNldFRhZ3MgPSBmdW5jdGlvbiAodGFncykge1xuICAgIHRoaXMuX3RhZ3MgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fdGFncyksIHRhZ3MpO1xuXG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuc2V0VGFnID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB0aGlzLl90YWdzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MpLCAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSkpO1xuXG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuc2V0RXh0cmFzID0gZnVuY3Rpb24gKGV4dHJhcykge1xuICAgIHRoaXMuX2V4dHJhID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX2V4dHJhKSwgZXh0cmFzKTtcblxuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLnNldEV4dHJhID0gZnVuY3Rpb24gKGtleSwgZXh0cmEpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB0aGlzLl9leHRyYSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSksIChfYSA9IHt9LCBfYVtrZXldID0gZXh0cmEsIF9hKSk7XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5zZXRGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChmaW5nZXJwcmludCkge1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5zZXRUcmFuc2FjdGlvbk5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBDYW4gYmUgcmVtb3ZlZCBpbiBtYWpvciB2ZXJzaW9uLlxuICAgKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB7QGxpbmsgdGhpcy5zZXRUcmFuc2FjdGlvbk5hbWV9XG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLnNldFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRUcmFuc2FjdGlvbk5hbWUobmFtZSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKGtleSwgY29udGV4dCkge1xuICAgIHZhciBfYTtcblxuICAgIGlmIChjb250ZXh0ID09PSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgdGhpcy5fY29udGV4dHNba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29udGV4dHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMpLCAoX2EgPSB7fSwgX2Fba2V5XSA9IGNvbnRleHQsIF9hKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuc2V0U3BhbiA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgdGhpcy5fc3BhbiA9IHNwYW47XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5nZXRTcGFuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zcGFuO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kOyAvLyBvZnRlbiwgdGhpcyBzcGFuIHdpbGwgYmUgYSB0cmFuc2FjdGlvbiwgYnV0IGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gYmVcblxuXG4gICAgdmFyIHNwYW4gPSB0aGlzLmdldFNwYW4oKTsgLy8gdHJ5IGl0IHRoZSBuZXcgd2F5IGZpcnN0XG5cbiAgICBpZiAoKF9hID0gc3BhbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gKF9iID0gc3BhbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRyYW5zYWN0aW9uO1xuICAgIH0gLy8gZmFsbGJhY2sgdG8gdGhlIG9sZCB3YXkgKGtub3duIGJ1ZzogdGhpcyBvbmx5IGZpbmRzIHRyYW5zYWN0aW9ucyB3aXRoIHNhbXBsZWQgPSB0cnVlKVxuXG5cbiAgICBpZiAoKF9kID0gKF9jID0gc3BhbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNwYW5SZWNvcmRlcikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnNwYW5zWzBdKSB7XG4gICAgICByZXR1cm4gc3Bhbi5zcGFuUmVjb3JkZXIuc3BhbnNbMF07XG4gICAgfSAvLyBuZWl0aGVyIHdheSBmb3VuZCBhIHRyYW5zYWN0aW9uXG5cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5zZXRTZXNzaW9uID0gZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zZXNzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB9XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5nZXRTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGNhcHR1cmVDb250ZXh0KSB7XG4gICAgaWYgKCFjYXB0dXJlQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHVwZGF0ZWRTY29wZSA9IGNhcHR1cmVDb250ZXh0KHRoaXMpO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRTY29wZSBpbnN0YW5jZW9mIFNjb3BlID8gdXBkYXRlZFNjb3BlIDogdGhpcztcbiAgICB9XG5cbiAgICBpZiAoY2FwdHVyZUNvbnRleHQgaW5zdGFuY2VvZiBTY29wZSkge1xuICAgICAgdGhpcy5fdGFncyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl90YWdzKSwgY2FwdHVyZUNvbnRleHQuX3RhZ3MpO1xuICAgICAgdGhpcy5fZXh0cmEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fZXh0cmEpLCBjYXB0dXJlQ29udGV4dC5fZXh0cmEpO1xuICAgICAgdGhpcy5fY29udGV4dHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMpLCBjYXB0dXJlQ29udGV4dC5fY29udGV4dHMpO1xuXG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3VzZXIgJiYgT2JqZWN0LmtleXMoY2FwdHVyZUNvbnRleHQuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQuX3VzZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fbGV2ZWwpIHtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSBjYXB0dXJlQ29udGV4dC5fbGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQpIHtcbiAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSBjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGNhcHR1cmVDb250ZXh0KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBjYXB0dXJlQ29udGV4dCA9IGNhcHR1cmVDb250ZXh0O1xuICAgICAgdGhpcy5fdGFncyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl90YWdzKSwgY2FwdHVyZUNvbnRleHQudGFncyk7XG4gICAgICB0aGlzLl9leHRyYSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSksIGNhcHR1cmVDb250ZXh0LmV4dHJhKTtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX2NvbnRleHRzKSwgY2FwdHVyZUNvbnRleHQuY29udGV4dHMpO1xuXG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQudXNlcikge1xuICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQudXNlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LmxldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQubGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5maW5nZXJwcmludCkge1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGNhcHR1cmVDb250ZXh0LmZpbmdlcnByaW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQucmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSBjYXB0dXJlQ29udGV4dC5yZXF1ZXN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgdGhpcy5fdGFncyA9IHt9O1xuICAgIHRoaXMuX2V4dHJhID0ge307XG4gICAgdGhpcy5fdXNlciA9IHt9O1xuICAgIHRoaXMuX2NvbnRleHRzID0ge307XG4gICAgdGhpcy5fbGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3JlcXVlc3RTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NwYW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2Vzc2lvbiA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLmFkZEJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoYnJlYWRjcnVtYiwgbWF4QnJlYWRjcnVtYnMpIHtcbiAgICB2YXIgbWF4Q3J1bWJzID0gdHlwZW9mIG1heEJyZWFkY3J1bWJzID09PSAnbnVtYmVyJyA/IE1hdGgubWluKG1heEJyZWFkY3J1bWJzLCBNQVhfQlJFQURDUlVNQlMpIDogTUFYX0JSRUFEQ1JVTUJTOyAvLyBObyBkYXRhIGhhcyBiZWVuIGNoYW5nZWQsIHNvIGRvbid0IG5vdGlmeSBzY29wZSBsaXN0ZW5lcnNcblxuICAgIGlmIChtYXhDcnVtYnMgPD0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlZEJyZWFkY3J1bWIgPSBfX2Fzc2lnbih7XG4gICAgICB0aW1lc3RhbXA6IGRhdGVUaW1lc3RhbXBJblNlY29uZHMoKVxuICAgIH0sIGJyZWFkY3J1bWIpO1xuXG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBfX3NwcmVhZCh0aGlzLl9icmVhZGNydW1icywgW21lcmdlZEJyZWFkY3J1bWJdKS5zbGljZSgtbWF4Q3J1bWJzKTtcblxuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLmNsZWFyQnJlYWRjcnVtYnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcblxuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZmluZ2VycHJpbnQgdG8gdGhlIGV2ZW50LlxuICAgKiBOb3RlIHRoYXQgYnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCBieSB0aGUgY2xpZW50LlxuICAgKiBBbHNvIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBicmVhZGNydW1icyBvbiBpdCwgd2UgZG8gbm90IG1lcmdlIHRoZW0uXG4gICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG5cblxuICBTY29wZS5wcm90b3R5cGUuYXBwbHlUb0V2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50KSB7XG4gICAgdmFyIF9hO1xuXG4gICAgaWYgKHRoaXMuX2V4dHJhICYmIE9iamVjdC5rZXlzKHRoaXMuX2V4dHJhKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmV4dHJhID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX2V4dHJhKSwgZXZlbnQuZXh0cmEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl90YWdzICYmIE9iamVjdC5rZXlzKHRoaXMuX3RhZ3MpLmxlbmd0aCkge1xuICAgICAgZXZlbnQudGFncyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl90YWdzKSwgZXZlbnQudGFncyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXIgJiYgT2JqZWN0LmtleXModGhpcy5fdXNlcikubGVuZ3RoKSB7XG4gICAgICBldmVudC51c2VyID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX3VzZXIpLCBldmVudC51c2VyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dHMgJiYgT2JqZWN0LmtleXModGhpcy5fY29udGV4dHMpLmxlbmd0aCkge1xuICAgICAgZXZlbnQuY29udGV4dHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMpLCBldmVudC5jb250ZXh0cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xldmVsKSB7XG4gICAgICBldmVudC5sZXZlbCA9IHRoaXMuX2xldmVsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb25OYW1lO1xuICAgIH0gLy8gV2Ugd2FudCB0byBzZXQgdGhlIHRyYWNlIGNvbnRleHQgZm9yIG5vcm1hbCBldmVudHMgb25seSBpZiB0aGVyZSBpc24ndCBhbHJlYWR5XG4gICAgLy8gYSB0cmFjZSBjb250ZXh0IG9uIHRoZSBldmVudC4gVGhlcmUgaXMgYSBwcm9kdWN0IGZlYXR1cmUgaW4gcGxhY2Ugd2hlcmUgd2UgbGlua1xuICAgIC8vIGVycm9ycyB3aXRoIHRyYW5zYWN0aW9uIGFuZCBpdCByZWxpZXMgb24gdGhhdC5cblxuXG4gICAgaWYgKHRoaXMuX3NwYW4pIHtcbiAgICAgIGV2ZW50LmNvbnRleHRzID0gX19hc3NpZ24oe1xuICAgICAgICB0cmFjZTogdGhpcy5fc3Bhbi5nZXRUcmFjZUNvbnRleHQoKVxuICAgICAgfSwgZXZlbnQuY29udGV4dHMpO1xuICAgICAgdmFyIHRyYW5zYWN0aW9uTmFtZSA9IChfYSA9IHRoaXMuX3NwYW4udHJhbnNhY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lO1xuXG4gICAgICBpZiAodHJhbnNhY3Rpb25OYW1lKSB7XG4gICAgICAgIGV2ZW50LnRhZ3MgPSBfX2Fzc2lnbih7XG4gICAgICAgICAgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uTmFtZVxuICAgICAgICB9LCBldmVudC50YWdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hcHBseUZpbmdlcnByaW50KGV2ZW50KTtcblxuICAgIGV2ZW50LmJyZWFkY3J1bWJzID0gX19zcHJlYWQoZXZlbnQuYnJlYWRjcnVtYnMgfHwgW10sIHRoaXMuX2JyZWFkY3J1bWJzKTtcbiAgICBldmVudC5icmVhZGNydW1icyA9IGV2ZW50LmJyZWFkY3J1bWJzLmxlbmd0aCA+IDAgPyBldmVudC5icmVhZGNydW1icyA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKF9fc3ByZWFkKGdldEdsb2JhbEV2ZW50UHJvY2Vzc29ycygpLCB0aGlzLl9ldmVudFByb2Nlc3NvcnMpLCBldmVudCwgaGludCk7XG4gIH07XG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHtAbGluayBhcHBseVRvRXZlbnR9IGlzIGZpbmlzaGVkLlxuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzID0gZnVuY3Rpb24gKHByb2Nlc3NvcnMsIGV2ZW50LCBoaW50LCBpbmRleCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHByb2Nlc3NvciA9IHByb2Nlc3NvcnNbaW5kZXhdO1xuXG4gICAgICBpZiAoZXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIHByb2Nlc3NvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBwcm9jZXNzb3IoX19hc3NpZ24oe30sIGV2ZW50KSwgaGludCk7XG5cbiAgICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgIHZvaWQgcmVzdWx0LnRoZW4oZnVuY3Rpb24gKGZpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCBmaW5hbCwgaGludCwgaW5kZXggKyAxKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgIH0pLnRoZW4obnVsbCwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2lkIF90aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnMocHJvY2Vzc29ycywgcmVzdWx0LCBoaW50LCBpbmRleCArIDEpLnRoZW4ocmVzb2x2ZSkudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IHNldCBjYWxsLlxuICAgKi9cblxuXG4gIFNjb3BlLnByb3RvdHlwZS5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8gV2UgbmVlZCB0aGlzIGNoZWNrIGZvciB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgdG8gYmUgYWJsZSB0byB3b3JrIG9uIHNjb3BlIGR1cmluZyB1cGRhdGVzXG4gICAgLy8gSWYgdGhpcyBjaGVjayBpcyBub3QgaGVyZSB3ZSdsbCBwcm9kdWNlIGVuZGxlc3MgcmVjdXJzaW9uIHdoZW4gc29tZXRoaW5nIGlzIGRvbmUgd2l0aCB0aGUgc2NvcGVcbiAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrLlxuXG5cbiAgICBpZiAoIXRoaXMuX25vdGlmeWluZ0xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soX3RoaXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEFwcGxpZXMgZmluZ2VycHJpbnQgZnJvbSB0aGUgc2NvcGUgdG8gdGhlIGV2ZW50IGlmIHRoZXJlJ3Mgb25lLFxuICAgKiB1c2VzIG1lc3NhZ2UgaWYgdGhlcmUncyBvbmUgaW5zdGVhZCBvciBnZXQgcmlkIG9mIGVtcHR5IGZpbmdlcnByaW50XG4gICAqL1xuXG5cbiAgU2NvcGUucHJvdG90eXBlLl9hcHBseUZpbmdlcnByaW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gTWFrZSBzdXJlIGl0J3MgYW4gYXJyYXkgZmlyc3QgYW5kIHdlIGFjdHVhbGx5IGhhdmUgc29tZXRoaW5nIGluIHBsYWNlXG4gICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludCA/IEFycmF5LmlzQXJyYXkoZXZlbnQuZmluZ2VycHJpbnQpID8gZXZlbnQuZmluZ2VycHJpbnQgOiBbZXZlbnQuZmluZ2VycHJpbnRdIDogW107IC8vIElmIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSBzY29wZSwgdGhlbiBtZXJnZSBpdCB3aXRoIGV2ZW50XG5cbiAgICBpZiAodGhpcy5fZmluZ2VycHJpbnQpIHtcbiAgICAgIGV2ZW50LmZpbmdlcnByaW50ID0gZXZlbnQuZmluZ2VycHJpbnQuY29uY2F0KHRoaXMuX2ZpbmdlcnByaW50KTtcbiAgICB9IC8vIElmIHdlIGhhdmUgbm8gZGF0YSBhdCBhbGwsIHJlbW92ZSBlbXB0eSBhcnJheSBkZWZhdWx0XG5cblxuICAgIGlmIChldmVudC5maW5nZXJwcmludCAmJiAhZXZlbnQuZmluZ2VycHJpbnQubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgZXZlbnQuZmluZ2VycHJpbnQ7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTY29wZTtcbn0oKTtcblxuZXhwb3J0IHsgU2NvcGUgfTtcbi8qKlxuICogUmV0dXJucyB0aGUgZ2xvYmFsIGV2ZW50IHByb2Nlc3NvcnMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgICovXG4gIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18gPSBnbG9iYWwuX19TRU5UUllfXyB8fCB7fTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzID0gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzIHx8IFtdO1xuICByZXR1cm4gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xufVxuLyoqXG4gKiBBZGQgYSBFdmVudFByb2Nlc3NvciB0byBiZSBrZXB0IGdsb2JhbGx5LlxuICogQHBhcmFtIGNhbGxiYWNrIEV2ZW50UHJvY2Vzc29yIHRvIGFkZFxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGNhbGxiYWNrKSB7XG4gIGdldEdsb2JhbEV2ZW50UHJvY2Vzc29ycygpLnB1c2goY2FsbGJhY2spO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7659\n")},4645:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "pi": function() { return /* binding */ _assign; },\n/* harmony export */ "fl": function() { return /* binding */ __spread; }\n/* harmony export */ });\n/* unused harmony exports __extends, __rest, __decorate, __param, __metadata, __awaiter, __generator, __createBinding, __exportStar, __values, __read, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault, __classPrivateFieldGet, __classPrivateFieldSet */\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return _assign.apply(this, arguments);\n};\n\n\nfunction __rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction __createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction __exportStar(m, exports) {\n for (var p in m) {\n if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to get private field on non-instance");\n }\n\n return privateMap.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to set private field on non-instance");\n }\n\n privateMap.set(receiver, value);\n return value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzP2M4YzEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFK0I7QUFDeEI7QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkhBQTJILGNBQWM7QUFDekk7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlJQUFpSSx3Q0FBd0MsUUFBUTtBQUNqTDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDTztBQUNQLDBCQUEwQixzQkFBc0I7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ087QUFDUCwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBOztBQUVBLHNDQUFzQyxRQUFRO0FBQzlDLG9EQUFvRCxRQUFRO0FBQzVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSx5R0FBeUc7QUFDekc7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjQ2NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xudmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICBfX3Byb3RvX186IFtdXG4gIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGQuX19wcm90b19fID0gYjtcbiAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cblxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbnZhciBfYXNzaWduID0gZnVuY3Rpb24gX19hc3NpZ24oKSB7XG4gIF9hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IHsgX2Fzc2lnbiBhcyBfX2Fzc2lnbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYyxcbiAgICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIH1cbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7XG4gICAgbGFiZWw6IDAsXG4gICAgc2VudDogZnVuY3Rpb24gc2VudCgpIHtcbiAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgIHJldHVybiB0WzFdO1xuICAgIH0sXG4gICAgdHJ5czogW10sXG4gICAgb3BzOiBbXVxuICB9LFxuICAgICAgZixcbiAgICAgIHksXG4gICAgICB0LFxuICAgICAgZztcbiAgcmV0dXJuIGcgPSB7XG4gICAgbmV4dDogdmVyYigwKSxcbiAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGc7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gc3RlcChbbiwgdl0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuXG4gICAgd2hpbGUgKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuXG4gICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG5cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvcCA9IFs2LCBlXTtcbiAgICAgICAgeSA9IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NyZWF0ZUJpbmRpbmcobywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XG4gIGZvciAodmFyIHAgaW4gbSkge1xuICAgIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIG0gPSBzICYmIG9bc10sXG4gICAgICBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBvICYmIG9baSsrXSxcbiAgICAgICAgZG9uZTogIW9cbiAgICAgIH07XG4gICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSxcbiAgICAgIHIsXG4gICAgICBhciA9IFtdLFxuICAgICAgZTtcblxuICB0cnkge1xuICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSB7XG4gICAgICBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlID0ge1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn1cbjtcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksXG4gICAgICBpLFxuICAgICAgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUobiwgdikge1xuICAgIHRyeSB7XG4gICAgICBzdGVwKGdbbl0odikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldHRsZShxWzBdWzNdLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkge1xuICAgIHJlc3VtZShcInRocm93XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkge1xuICAgIHRocm93IGU7XG4gIH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7XG4gICAgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIChwID0gIXApID8ge1xuICAgICAgICB2YWx1ZTogX19hd2FpdChvW25dKHYpKSxcbiAgICAgICAgZG9uZTogbiA9PT0gXCJyZXR1cm5cIlxuICAgICAgfSA6IGYgPyBmKHYpIDogdjtcbiAgICB9IDogZjtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLFxuICAgICAgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbiAodikge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBkb25lOiBkXG4gICAgICB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHtcbiAgICAgIHZhbHVlOiByYXdcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb29rZWQucmF3ID0gcmF3O1xuICB9XG5cbiAgcmV0dXJuIGNvb2tlZDtcbn1cbjtcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkge1xuICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gIH1cbiAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gbW9kICYmIG1vZC5fX2VzTW9kdWxlID8gbW9kIDoge1xuICAgIGRlZmF1bHQ6IG1vZFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcbiAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcbiAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4645\n')},7066:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"BrowserClient\": function() { return /* reexport */ BrowserClient; },\n \"ErrorBoundary\": function() { return /* reexport */ ErrorBoundary; },\n \"Hub\": function() { return /* reexport */ esm_hub/* Hub */.Xb; },\n \"Integrations\": function() { return /* reexport */ INTEGRATIONS; },\n \"Profiler\": function() { return /* reexport */ Profiler; },\n \"SDK_NAME\": function() { return /* reexport */ SDK_NAME; },\n \"SDK_VERSION\": function() { return /* reexport */ SDK_VERSION; },\n \"Scope\": function() { return /* reexport */ esm_scope/* Scope */.s; },\n \"Severity\": function() { return /* reexport */ Severity; },\n \"Status\": function() { return /* reexport */ Status; },\n \"Transports\": function() { return /* reexport */ transports_namespaceObject; },\n \"addBreadcrumb\": function() { return /* reexport */ addBreadcrumb; },\n \"addGlobalEventProcessor\": function() { return /* reexport */ esm_scope/* addGlobalEventProcessor */.c; },\n \"captureEvent\": function() { return /* reexport */ captureEvent; },\n \"captureException\": function() { return /* reexport */ captureException; },\n \"captureMessage\": function() { return /* reexport */ captureMessage; },\n \"close\": function() { return /* reexport */ sdk_close; },\n \"configureScope\": function() { return /* reexport */ configureScope; },\n \"createReduxEnhancer\": function() { return /* reexport */ createReduxEnhancer; },\n \"defaultIntegrations\": function() { return /* reexport */ defaultIntegrations; },\n \"eventFromException\": function() { return /* reexport */ eventFromException; },\n \"eventFromMessage\": function() { return /* reexport */ eventFromMessage; },\n \"flush\": function() { return /* reexport */ flush; },\n \"forceLoad\": function() { return /* reexport */ forceLoad; },\n \"getCurrentHub\": function() { return /* reexport */ esm_hub/* getCurrentHub */.Gd; },\n \"getHubFromCarrier\": function() { return /* reexport */ esm_hub/* getHubFromCarrier */.vi; },\n \"init\": function() { return /* reexport */ sdk_init; },\n \"injectReportDialog\": function() { return /* reexport */ injectReportDialog; },\n \"lastEventId\": function() { return /* reexport */ lastEventId; },\n \"makeMain\": function() { return /* reexport */ esm_hub/* makeMain */.pj; },\n \"onLoad\": function() { return /* reexport */ onLoad; },\n \"reactRouterV3Instrumentation\": function() { return /* reexport */ reactRouterV3Instrumentation; },\n \"reactRouterV4Instrumentation\": function() { return /* reexport */ reactRouterV4Instrumentation; },\n \"reactRouterV5Instrumentation\": function() { return /* reexport */ reactRouterV5Instrumentation; },\n \"setContext\": function() { return /* reexport */ setContext; },\n \"setExtra\": function() { return /* reexport */ setExtra; },\n \"setExtras\": function() { return /* reexport */ setExtras; },\n \"setTag\": function() { return /* reexport */ setTag; },\n \"setTags\": function() { return /* reexport */ setTags; },\n \"setUser\": function() { return /* reexport */ setUser; },\n \"showReportDialog\": function() { return /* reexport */ showReportDialog; },\n \"startTransaction\": function() { return /* reexport */ startTransaction; },\n \"useProfiler\": function() { return /* reexport */ useProfiler; },\n \"withErrorBoundary\": function() { return /* reexport */ withErrorBoundary; },\n \"withProfiler\": function() { return /* reexport */ withProfiler; },\n \"withScope\": function() { return /* reexport */ withScope; },\n \"withSentryRouting\": function() { return /* reexport */ withSentryRouting; },\n \"wrap\": function() { return /* reexport */ sdk_wrap; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/@sentry/core/esm/integrations/index.js\nvar integrations_namespaceObject = {};\n__webpack_require__.r(integrations_namespaceObject);\n__webpack_require__.d(integrations_namespaceObject, {\n \"FunctionToString\": function() { return FunctionToString; },\n \"InboundFilters\": function() { return InboundFilters; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/@sentry/browser/esm/integrations/index.js\nvar esm_integrations_namespaceObject = {};\n__webpack_require__.r(esm_integrations_namespaceObject);\n__webpack_require__.d(esm_integrations_namespaceObject, {\n \"Breadcrumbs\": function() { return Breadcrumbs; },\n \"Dedupe\": function() { return Dedupe; },\n \"GlobalHandlers\": function() { return GlobalHandlers; },\n \"LinkedErrors\": function() { return LinkedErrors; },\n \"TryCatch\": function() { return TryCatch; },\n \"UserAgent\": function() { return UserAgent; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/@sentry/browser/esm/transports/index.js\nvar transports_namespaceObject = {};\n__webpack_require__.r(transports_namespaceObject);\n__webpack_require__.d(transports_namespaceObject, {\n \"BaseTransport\": function() { return BaseTransport; },\n \"FetchTransport\": function() { return FetchTransport; },\n \"XHRTransport\": function() { return XHRTransport; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return _assign.apply(this, arguments);\n};\n\n\nfunction __rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n \"throw\": verb(1),\n \"return\": verb(2)\n }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction __createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction __exportStar(m, exports) {\n for (var p in m) {\n if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction tslib_es6_spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume(\"next\", value);\n }\n\n function reject(value) {\n resume(\"throw\", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === \"return\"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n return privateMap.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n privateMap.set(receiver, value);\n return value;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/severity.js\n/** JSDoc */\n// eslint-disable-next-line import/export\nvar Severity;\n\n(function (Severity) {\n /** JSDoc */\n Severity[\"Fatal\"] = \"fatal\";\n /** JSDoc */\n\n Severity[\"Error\"] = \"error\";\n /** JSDoc */\n\n Severity[\"Warning\"] = \"warning\";\n /** JSDoc */\n\n Severity[\"Log\"] = \"log\";\n /** JSDoc */\n\n Severity[\"Info\"] = \"info\";\n /** JSDoc */\n\n Severity[\"Debug\"] = \"debug\";\n /** JSDoc */\n\n Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {})); // eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n\n\n(function (Severity) {\n /**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\n function fromString(level) {\n switch (level) {\n case 'debug':\n return Severity.Debug;\n\n case 'info':\n return Severity.Info;\n\n case 'warn':\n case 'warning':\n return Severity.Warning;\n\n case 'error':\n return Severity.Error;\n\n case 'fatal':\n return Severity.Fatal;\n\n case 'critical':\n return Severity.Critical;\n\n case 'log':\n default:\n return Severity.Log;\n }\n }\n\n Severity.fromString = fromString;\n})(Severity || (Severity = {}));\n;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/status.js\n/** The status of an event. */\n// eslint-disable-next-line import/export\nvar Status;\n\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent to Sentry successfully. */\n\n Status[\"Success\"] = \"success\";\n /** The client is currently rate limited and will try again later. */\n\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The event could not be processed. */\n\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error occurred during submission. */\n\n Status[\"Failed\"] = \"failed\";\n})(Status || (Status = {})); // eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n\n\n(function (Status) {\n /**\n * Converts a HTTP status code into a {@link Status}.\n *\n * @param code The HTTP response status code.\n * @returns The send status or {@link Status.Unknown}.\n */\n function fromHttpCode(code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n\n if (code === 429) {\n return Status.RateLimit;\n }\n\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n\n if (code >= 500) {\n return Status.Failed;\n }\n\n return Status.Unknown;\n }\n\n Status.fromHttpCode = fromHttpCode;\n})(Status || (Status = {}));\n// EXTERNAL MODULE: ./node_modules/@sentry/hub/esm/scope.js\nvar esm_scope = __webpack_require__(7659);\n;// CONCATENATED MODULE: ./node_modules/@sentry/minimal/node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar tslib_es6_extendStatics = function extendStatics(d, b) {\n tslib_es6_extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return tslib_es6_extendStatics(d, b);\n};\n\nfunction tslib_es6_extends(d, b) {\n tslib_es6_extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar tslib_es6_assign = function __assign() {\n tslib_es6_assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return tslib_es6_assign.apply(this, arguments);\n};\n\n\nfunction tslib_es6_rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction tslib_es6_decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction tslib_es6_param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction tslib_es6_metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction tslib_es6_awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction tslib_es6_generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n \"throw\": verb(1),\n \"return\": verb(2)\n }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction tslib_es6_createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction tslib_es6_exportStar(m, exports) {\n for (var p in m) {\n if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction tslib_es6_values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction tslib_es6_read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction tslib_tslib_es6_spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(tslib_es6_read(arguments[i]));\n }\n\n return ar;\n}\nfunction tslib_es6_spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction tslib_es6_await(v) {\n return this instanceof tslib_es6_await ? (this.v = v, this) : new tslib_es6_await(v);\n}\nfunction tslib_es6_asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof tslib_es6_await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume(\"next\", value);\n }\n\n function reject(value) {\n resume(\"throw\", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction tslib_es6_asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: tslib_es6_await(o[n](v)),\n done: n === \"return\"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction tslib_es6_asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof tslib_es6_values === \"function\" ? tslib_es6_values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction tslib_es6_makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction tslib_es6_importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction tslib_es6_importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction tslib_es6_classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n return privateMap.get(receiver);\n}\nfunction tslib_es6_classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n privateMap.set(receiver, value);\n return value;\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/hub/esm/hub.js + 1 modules\nvar esm_hub = __webpack_require__(3210);\n;// CONCATENATED MODULE: ./node_modules/@sentry/minimal/esm/index.js\n\n\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nfunction callOnHub(method) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n var hub = (0,esm_hub/* getCurrentHub */.Gd)();\n\n if (hub && hub[method]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return hub[method].apply(hub, tslib_tslib_es6_spread(args));\n }\n\n throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\nfunction captureException(exception, captureContext) {\n var syntheticException;\n\n try {\n throw new Error('Sentry syntheticException');\n } catch (exception) {\n syntheticException = exception;\n }\n\n return callOnHub('captureException', exception, {\n captureContext: captureContext,\n originalException: exception,\n syntheticException: syntheticException\n });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\n\nfunction captureMessage(message, captureContext) {\n var syntheticException;\n\n try {\n throw new Error(message);\n } catch (exception) {\n syntheticException = exception;\n } // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n\n\n var level = typeof captureContext === 'string' ? captureContext : undefined;\n var context = typeof captureContext !== 'string' ? {\n captureContext: captureContext\n } : undefined;\n return callOnHub('captureMessage', message, level, tslib_es6_assign({\n originalException: message,\n syntheticException: syntheticException\n }, context));\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\n\nfunction captureEvent(event) {\n return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\n\nfunction configureScope(callback) {\n callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\n\nfunction addBreadcrumb(breadcrumb) {\n callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nfunction setContext(name, context) {\n callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\n\nfunction setExtras(extras) {\n callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\n\nfunction setTags(tags) {\n callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\n\nfunction setExtra(key, extra) {\n callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\n\nfunction setTag(key, value) {\n callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\n\nfunction setUser(user) {\n callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\n\nfunction withScope(callback) {\n callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nfunction _callOnClient(method) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n callOnHub.apply(void 0, __spread(['_invokeClient', method], args));\n}\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\n\nfunction startTransaction(context, customSamplingContext) {\n return callOnHub('startTransaction', tslib_es6_assign({}, context), customSamplingContext);\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/version.js\nvar SDK_VERSION = '6.13.2';\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar tslib_tslib_es6_extendStatics = function extendStatics(d, b) {\n tslib_tslib_es6_extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return tslib_tslib_es6_extendStatics(d, b);\n};\n\nfunction tslib_tslib_es6_extends(d, b) {\n tslib_tslib_es6_extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar tslib_tslib_es6_assign = function __assign() {\n tslib_tslib_es6_assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return tslib_tslib_es6_assign.apply(this, arguments);\n};\n\n\nfunction tslib_tslib_es6_rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction tslib_tslib_es6_decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction tslib_tslib_es6_param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction tslib_tslib_es6_metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction tslib_tslib_es6_awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction tslib_tslib_es6_generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n \"throw\": verb(1),\n \"return\": verb(2)\n }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction tslib_tslib_es6_createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction tslib_tslib_es6_exportStar(m, exports) {\n for (var p in m) {\n if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction tslib_tslib_es6_values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction tslib_tslib_es6_read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction node_modules_tslib_tslib_es6_spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(tslib_tslib_es6_read(arguments[i]));\n }\n\n return ar;\n}\nfunction tslib_tslib_es6_spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction tslib_tslib_es6_await(v) {\n return this instanceof tslib_tslib_es6_await ? (this.v = v, this) : new tslib_tslib_es6_await(v);\n}\nfunction tslib_tslib_es6_asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof tslib_tslib_es6_await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume(\"next\", value);\n }\n\n function reject(value) {\n resume(\"throw\", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction tslib_tslib_es6_asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: tslib_tslib_es6_await(o[n](v)),\n done: n === \"return\"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction tslib_tslib_es6_asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof tslib_tslib_es6_values === \"function\" ? tslib_tslib_es6_values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction tslib_tslib_es6_makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction tslib_tslib_es6_importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction tslib_tslib_es6_importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction tslib_tslib_es6_classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n return privateMap.get(receiver);\n}\nfunction tslib_tslib_es6_classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n privateMap.set(receiver, value);\n return value;\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/types/esm/session.js\nvar esm_session = __webpack_require__(2355);\n// EXTERNAL MODULE: ./node_modules/@sentry/types/esm/transport.js\nvar esm_transport = __webpack_require__(2649);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(4850);\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/polyfill.js\nvar setPrototypeOf = Object.setPrototypeOf || ({\n __proto__: []\n} instanceof Array ? setProtoOf : mixinProperties);\n/**\n * setPrototypeOf polyfill using __proto__\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\n\nfunction setProtoOf(obj, proto) {\n // @ts-ignore __proto__ does not exist on obj\n obj.__proto__ = proto;\n return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\n\n\nfunction mixinProperties(obj, proto) {\n for (var prop in proto) {\n // eslint-disable-next-line no-prototype-builtins\n if (!obj.hasOwnProperty(prop)) {\n // @ts-ignore typescript complains about indexing so we remove\n obj[prop] = proto[prop];\n }\n }\n\n return obj;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/error.js\n\n\n/** An error emitted by Sentry SDKs and related utilities. */\n\nvar SentryError =\n/** @class */\nfunction (_super) {\n (0,tslib_es6/* __extends */.ZT)(SentryError, _super);\n\n function SentryError(message) {\n var _newTarget = this.constructor;\n\n var _this = _super.call(this, message) || this;\n\n _this.message = message;\n _this.name = _newTarget.prototype.constructor.name;\n setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n\n return SentryError;\n}(Error);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/dsn.js\n\n\n/** Regular expression used to parse a Dsn. */\n\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n/** Error message */\n\nvar ERROR_MESSAGE = 'Invalid Dsn';\n/** The Sentry Dsn, identifying a Sentry instance and project. */\n\nvar Dsn =\n/** @class */\nfunction () {\n /** Creates a new Dsn component */\n function Dsn(from) {\n if (typeof from === 'string') {\n this._fromString(from);\n } else {\n this._fromComponents(from);\n }\n\n this._validate();\n }\n /**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\n\n\n Dsn.prototype.toString = function (withPassword) {\n if (withPassword === void 0) {\n withPassword = false;\n }\n\n var _a = this,\n host = _a.host,\n path = _a.path,\n pass = _a.pass,\n port = _a.port,\n projectId = _a.projectId,\n protocol = _a.protocol,\n publicKey = _a.publicKey;\n\n return protocol + \"://\" + publicKey + (withPassword && pass ? \":\" + pass : '') + (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId);\n };\n /** Parses a string into this Dsn. */\n\n\n Dsn.prototype._fromString = function (str) {\n var match = DSN_REGEX.exec(str);\n\n if (!match) {\n throw new SentryError(ERROR_MESSAGE);\n }\n\n var _a = (0,tslib_es6/* __read */.CR)(match.slice(1), 6),\n protocol = _a[0],\n publicKey = _a[1],\n _b = _a[2],\n pass = _b === void 0 ? '' : _b,\n host = _a[3],\n _c = _a[4],\n port = _c === void 0 ? '' : _c,\n lastPath = _a[5];\n\n var path = '';\n var projectId = lastPath;\n var split = projectId.split('/');\n\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop();\n }\n\n if (projectId) {\n var projectMatch = projectId.match(/^\\d+/);\n\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n\n this._fromComponents({\n host: host,\n pass: pass,\n path: path,\n projectId: projectId,\n port: port,\n protocol: protocol,\n publicKey: publicKey\n });\n };\n /** Maps Dsn components into this instance. */\n\n\n Dsn.prototype._fromComponents = function (components) {\n // TODO this is for backwards compatibility, and can be removed in a future version\n if ('user' in components && !('publicKey' in components)) {\n components.publicKey = components.user;\n }\n\n this.user = components.publicKey || '';\n this.protocol = components.protocol;\n this.publicKey = components.publicKey || '';\n this.pass = components.pass || '';\n this.host = components.host;\n this.port = components.port || '';\n this.path = components.path || '';\n this.projectId = components.projectId;\n };\n /** Validates this Dsn and throws on error. */\n\n\n Dsn.prototype._validate = function () {\n var _this = this;\n\n ['protocol', 'publicKey', 'host', 'projectId'].forEach(function (component) {\n if (!_this[component]) {\n throw new SentryError(ERROR_MESSAGE + \": \" + component + \" missing\");\n }\n });\n\n if (!this.projectId.match(/^\\d+$/)) {\n throw new SentryError(ERROR_MESSAGE + \": Invalid projectId \" + this.projectId);\n }\n\n if (this.protocol !== 'http' && this.protocol !== 'https') {\n throw new SentryError(ERROR_MESSAGE + \": Invalid protocol \" + this.protocol);\n }\n\n if (this.port && isNaN(parseInt(this.port, 10))) {\n throw new SentryError(ERROR_MESSAGE + \": Invalid port \" + this.port);\n }\n };\n\n return Dsn;\n}();\n\n\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/is.js\nvar is = __webpack_require__(2684);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js\nvar logger = __webpack_require__(245);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/syncpromise.js\nvar syncpromise = __webpack_require__(5370);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/misc.js\nvar misc = __webpack_require__(2861);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/time.js\nvar time = __webpack_require__(5153);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/object.js + 1 modules\nvar object = __webpack_require__(150);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/string.js\nvar string = __webpack_require__(7940);\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integration.js\n\n\n\nvar installedIntegrations = [];\n/**\n * @private\n */\n\nfunction filterDuplicates(integrations) {\n return integrations.reduce(function (acc, integrations) {\n if (acc.every(function (accIntegration) {\n return integrations.name !== accIntegration.name;\n })) {\n acc.push(integrations);\n }\n\n return acc;\n }, []);\n}\n/** Gets integration to install */\n\n\nfunction getIntegrationsToSetup(options) {\n var defaultIntegrations = options.defaultIntegrations && node_modules_tslib_tslib_es6_spread(options.defaultIntegrations) || [];\n var userIntegrations = options.integrations;\n\n var integrations = node_modules_tslib_tslib_es6_spread(filterDuplicates(defaultIntegrations));\n\n if (Array.isArray(userIntegrations)) {\n // Filter out integrations that are also included in user options\n integrations = node_modules_tslib_tslib_es6_spread(integrations.filter(function (integrations) {\n return userIntegrations.every(function (userIntegration) {\n return userIntegration.name !== integrations.name;\n });\n }), filterDuplicates(userIntegrations));\n } else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(integrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n } // Make sure that if present, `Debug` integration will always run last\n\n\n var integrationsNames = integrations.map(function (i) {\n return i.name;\n });\n var alwaysLastToRun = 'Debug';\n\n if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n integrations.push.apply(integrations, node_modules_tslib_tslib_es6_spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n }\n\n return integrations;\n}\n/** Setup given integration */\n\nfunction setupIntegration(integration) {\n if (installedIntegrations.indexOf(integration.name) !== -1) {\n return;\n }\n\n integration.setupOnce(esm_scope/* addGlobalEventProcessor */.c, esm_hub/* getCurrentHub */.Gd);\n installedIntegrations.push(integration.name);\n logger/* logger.log */.k.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\n\nfunction setupIntegrations(options) {\n var integrations = {};\n getIntegrationsToSetup(options).forEach(function (integration) {\n integrations[integration.name] = integration;\n setupIntegration(integration);\n }); // set the `initialized` flag so we don't run through the process again unecessarily; use `Object.defineProperty`\n // because by default it creates a property which is nonenumerable, which we want since `initialized` shouldn't be\n // considered a member of the index the way the actual integrations are\n\n Object.defineProperty(integrations, 'initialized', {\n value: true\n });\n return integrations;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/baseclient.js\n\n/* eslint-disable max-lines */\n\n\n\n\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\n\nvar BaseClient =\n/** @class */\nfunction () {\n /**\n * Initializes this client instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the client.\n */\n function BaseClient(backendClass, options) {\n /** Array of used integrations. */\n this._integrations = {};\n /** Number of calls being processed */\n\n this._numProcessing = 0;\n this._backend = new backendClass(options);\n this._options = options;\n\n if (options.dsn) {\n this._dsn = new Dsn(options.dsn);\n }\n }\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n BaseClient.prototype.captureException = function (exception, hint, scope) {\n var _this = this;\n\n var eventId = hint && hint.event_id;\n\n this._process(this._getBackend().eventFromException(exception, hint).then(function (event) {\n return _this._captureEvent(event, hint, scope);\n }).then(function (result) {\n eventId = result;\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n var _this = this;\n\n var eventId = hint && hint.event_id;\n var promisedEvent = (0,is/* isPrimitive */.pt)(message) ? this._getBackend().eventFromMessage(String(message), level, hint) : this._getBackend().eventFromException(message, hint);\n\n this._process(promisedEvent.then(function (event) {\n return _this._captureEvent(event, hint, scope);\n }).then(function (result) {\n eventId = result;\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.captureEvent = function (event, hint, scope) {\n var eventId = hint && hint.event_id;\n\n this._process(this._captureEvent(event, hint, scope).then(function (result) {\n eventId = result;\n }));\n\n return eventId;\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.captureSession = function (session) {\n if (!this._isEnabled()) {\n logger/* logger.warn */.k.warn('SDK not enabled, will not capture session.');\n return;\n }\n\n if (!(typeof session.release === 'string')) {\n logger/* logger.warn */.k.warn('Discarded session because of missing or non-string release');\n } else {\n this._sendSession(session); // After sending, we set init false to indicate it's not the first occurrence\n\n\n session.update({\n init: false\n });\n }\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.getDsn = function () {\n return this._dsn;\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.getOptions = function () {\n return this._options;\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.getTransport = function () {\n return this._getBackend().getTransport();\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.flush = function (timeout) {\n var _this = this;\n\n return this._isClientDoneProcessing(timeout).then(function (clientFinished) {\n return _this.getTransport().close(timeout).then(function (transportFlushed) {\n return clientFinished && transportFlushed;\n });\n });\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.close = function (timeout) {\n var _this = this;\n\n return this.flush(timeout).then(function (result) {\n _this.getOptions().enabled = false;\n return result;\n });\n };\n /**\n * Sets up the integrations\n */\n\n\n BaseClient.prototype.setupIntegrations = function () {\n if (this._isEnabled() && !this._integrations.initialized) {\n this._integrations = setupIntegrations(this._options);\n }\n };\n /**\n * @inheritDoc\n */\n\n\n BaseClient.prototype.getIntegration = function (integration) {\n try {\n return this._integrations[integration.id] || null;\n } catch (_oO) {\n logger/* logger.warn */.k.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n return null;\n }\n };\n /** Updates existing session based on the provided event */\n\n\n BaseClient.prototype._updateSessionFromEvent = function (session, event) {\n var e_1, _a;\n\n var crashed = false;\n var errored = false;\n var exceptions = event.exception && event.exception.values;\n\n if (exceptions) {\n errored = true;\n\n try {\n for (var exceptions_1 = tslib_tslib_es6_values(exceptions), exceptions_1_1 = exceptions_1.next(); !exceptions_1_1.done; exceptions_1_1 = exceptions_1.next()) {\n var ex = exceptions_1_1.value;\n var mechanism = ex.mechanism;\n\n if (mechanism && mechanism.handled === false) {\n crashed = true;\n break;\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (exceptions_1_1 && !exceptions_1_1.done && (_a = exceptions_1.return)) _a.call(exceptions_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n } // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n\n\n var sessionNonTerminal = session.status === esm_session/* SessionStatus.Ok */.$.Ok;\n var shouldUpdateAndSend = sessionNonTerminal && session.errors === 0 || sessionNonTerminal && crashed;\n\n if (shouldUpdateAndSend) {\n session.update(tslib_tslib_es6_assign(tslib_tslib_es6_assign({}, crashed && {\n status: esm_session/* SessionStatus.Crashed */.$.Crashed\n }), {\n errors: session.errors || Number(errored || crashed)\n }));\n this.captureSession(session);\n }\n };\n /** Deliver captured session to Sentry */\n\n\n BaseClient.prototype._sendSession = function (session) {\n this._getBackend().sendSession(session);\n };\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n\n\n BaseClient.prototype._isClientDoneProcessing = function (timeout) {\n var _this = this;\n\n return new syncpromise/* SyncPromise */.c(function (resolve) {\n var ticked = 0;\n var tick = 1;\n var interval = setInterval(function () {\n if (_this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\n };\n /** Returns the current backend. */\n\n\n BaseClient.prototype._getBackend = function () {\n return this._backend;\n };\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n\n\n BaseClient.prototype._isEnabled = function () {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n };\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n\n\n BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n var _this = this;\n\n var _a = this.getOptions().normalizeDepth,\n normalizeDepth = _a === void 0 ? 3 : _a;\n\n var prepared = tslib_tslib_es6_assign(tslib_tslib_es6_assign({}, event), {\n event_id: event.event_id || (hint && hint.event_id ? hint.event_id : (0,misc/* uuid4 */.DM)()),\n timestamp: event.timestamp || (0,time/* dateTimestampInSeconds */.yW)()\n });\n\n this._applyClientOptions(prepared);\n\n this._applyIntegrationsMetadata(prepared); // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n\n\n var finalScope = scope;\n\n if (hint && hint.captureContext) {\n finalScope = esm_scope/* Scope.clone */.s.clone(finalScope).update(hint.captureContext);\n } // We prepare the result here with a resolved Event.\n\n\n var result = syncpromise/* SyncPromise.resolve */.c.resolve(prepared); // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n\n if (finalScope) {\n // In case we have a hub we reassign it.\n result = finalScope.applyToEvent(prepared, hint);\n }\n\n return result.then(function (evt) {\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return _this._normalizeEvent(evt, normalizeDepth);\n }\n\n return evt;\n });\n };\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n\n\n BaseClient.prototype._normalizeEvent = function (event, depth) {\n if (!event) {\n return null;\n }\n\n var normalized = tslib_tslib_es6_assign(tslib_tslib_es6_assign(tslib_tslib_es6_assign(tslib_tslib_es6_assign(tslib_tslib_es6_assign({}, event), event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(function (b) {\n return tslib_tslib_es6_assign(tslib_tslib_es6_assign({}, b), b.data && {\n data: (0,object/* normalize */.Fv)(b.data, depth)\n });\n })\n }), event.user && {\n user: (0,object/* normalize */.Fv)(event.user, depth)\n }), event.contexts && {\n contexts: (0,object/* normalize */.Fv)(event.contexts, depth)\n }), event.extra && {\n extra: (0,object/* normalize */.Fv)(event.extra, depth)\n }); // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n\n\n if (event.contexts && event.contexts.trace) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n normalized.contexts.trace = event.contexts.trace;\n }\n\n var _a = this.getOptions()._experiments,\n _experiments = _a === void 0 ? {} : _a;\n\n if (_experiments.ensureNoCircularStructures) {\n return (0,object/* normalize */.Fv)(normalized);\n }\n\n return normalized;\n };\n /**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\n\n\n BaseClient.prototype._applyClientOptions = function (event) {\n var options = this.getOptions();\n var environment = options.environment,\n release = options.release,\n dist = options.dist,\n _a = options.maxValueLength,\n maxValueLength = _a === void 0 ? 250 : _a;\n\n if (!('environment' in event)) {\n event.environment = 'environment' in options ? environment : 'production';\n }\n\n if (event.release === undefined && release !== undefined) {\n event.release = release;\n }\n\n if (event.dist === undefined && dist !== undefined) {\n event.dist = dist;\n }\n\n if (event.message) {\n event.message = (0,string/* truncate */.$G)(event.message, maxValueLength);\n }\n\n var exception = event.exception && event.exception.values && event.exception.values[0];\n\n if (exception && exception.value) {\n exception.value = (0,string/* truncate */.$G)(exception.value, maxValueLength);\n }\n\n var request = event.request;\n\n if (request && request.url) {\n request.url = (0,string/* truncate */.$G)(request.url, maxValueLength);\n }\n };\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\n\n\n BaseClient.prototype._applyIntegrationsMetadata = function (event) {\n var integrationsArray = Object.keys(this._integrations);\n\n if (integrationsArray.length > 0) {\n event.sdk = event.sdk || {};\n event.sdk.integrations = node_modules_tslib_tslib_es6_spread(event.sdk.integrations || [], integrationsArray);\n }\n };\n /**\n * Tells the backend to send this event\n * @param event The Sentry event to send\n */\n\n\n BaseClient.prototype._sendEvent = function (event) {\n this._getBackend().sendEvent(event);\n };\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n\n\n BaseClient.prototype._captureEvent = function (event, hint, scope) {\n return this._processEvent(event, hint, scope).then(function (finalEvent) {\n return finalEvent.event_id;\n }, function (reason) {\n logger/* logger.error */.k.error(reason);\n return undefined;\n });\n };\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n\n\n BaseClient.prototype._processEvent = function (event, hint, scope) {\n var _this = this;\n\n var _a, _b; // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n var _c = this.getOptions(),\n beforeSend = _c.beforeSend,\n sampleRate = _c.sampleRate;\n\n var transport = this.getTransport();\n\n if (!this._isEnabled()) {\n return syncpromise/* SyncPromise.reject */.c.reject(new SentryError('SDK not enabled, will not capture event.'));\n }\n\n var isTransaction = event.type === 'transaction'; // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n\n if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n (_b = (_a = transport).recordLostEvent) === null || _b === void 0 ? void 0 : _b.call(_a, esm_transport/* Outcome.SampleRate */.k.SampleRate, 'event');\n return syncpromise/* SyncPromise.reject */.c.reject(new SentryError(\"Discarding event because it's not included in the random sample (sampling rate = \" + sampleRate + \")\"));\n }\n\n return this._prepareEvent(event, scope, hint).then(function (prepared) {\n var _a, _b;\n\n if (prepared === null) {\n (_b = (_a = transport).recordLostEvent) === null || _b === void 0 ? void 0 : _b.call(_a, esm_transport/* Outcome.EventProcessor */.k.EventProcessor, event.type || 'event');\n throw new SentryError('An event processor returned null, will not send event.');\n }\n\n var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n\n if (isInternalException || isTransaction || !beforeSend) {\n return prepared;\n }\n\n var beforeSendResult = beforeSend(prepared, hint);\n return _this._ensureBeforeSendRv(beforeSendResult);\n }).then(function (processedEvent) {\n var _a, _b;\n\n if (processedEvent === null) {\n (_b = (_a = transport).recordLostEvent) === null || _b === void 0 ? void 0 : _b.call(_a, esm_transport/* Outcome.BeforeSend */.k.BeforeSend, event.type || 'event');\n throw new SentryError('`beforeSend` returned `null`, will not send event.');\n }\n\n var session = scope && scope.getSession && scope.getSession();\n\n if (!isTransaction && session) {\n _this._updateSessionFromEvent(session, processedEvent);\n }\n\n _this._sendEvent(processedEvent);\n\n return processedEvent;\n }).then(null, function (reason) {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n _this.captureException(reason, {\n data: {\n __sentry__: true\n },\n originalException: reason\n });\n\n throw new SentryError(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n });\n };\n /**\n * Occupies the client with processing and event\n */\n\n\n BaseClient.prototype._process = function (promise) {\n var _this = this;\n\n this._numProcessing += 1;\n void promise.then(function (value) {\n _this._numProcessing -= 1;\n return value;\n }, function (reason) {\n _this._numProcessing -= 1;\n return reason;\n });\n };\n /**\n * Verifies that return value of configured `beforeSend` is of expected type.\n */\n\n\n BaseClient.prototype._ensureBeforeSendRv = function (rv) {\n var nullErr = '`beforeSend` method has to return `null` or a valid event.';\n\n if ((0,is/* isThenable */.J8)(rv)) {\n return rv.then(function (event) {\n if (!((0,is/* isPlainObject */.PO)(event) || event === null)) {\n throw new SentryError(nullErr);\n }\n\n return event;\n }, function (e) {\n throw new SentryError(\"beforeSend rejected with \" + e);\n });\n } else if (!((0,is/* isPlainObject */.PO)(rv) || rv === null)) {\n throw new SentryError(nullErr);\n }\n\n return rv;\n };\n\n return BaseClient;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/transports/noop.js\n\n\n/** Noop transport */\n\nvar NoopTransport =\n/** @class */\nfunction () {\n function NoopTransport() {}\n /**\n * @inheritDoc\n */\n\n\n NoopTransport.prototype.sendEvent = function (_) {\n return syncpromise/* SyncPromise.resolve */.c.resolve({\n reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n status: Status.Skipped\n });\n };\n /**\n * @inheritDoc\n */\n\n\n NoopTransport.prototype.close = function (_) {\n return syncpromise/* SyncPromise.resolve */.c.resolve(true);\n };\n\n return NoopTransport;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/basebackend.js\n\n\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\n\nvar BaseBackend =\n/** @class */\nfunction () {\n /** Creates a new backend instance. */\n function BaseBackend(options) {\n this._options = options;\n\n if (!this._options.dsn) {\n logger/* logger.warn */.k.warn('No DSN provided, backend will not do anything.');\n }\n\n this._transport = this._setupTransport();\n }\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n throw new SentryError('Backend has to implement `eventFromException` method');\n };\n /**\n * @inheritDoc\n */\n\n\n BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n throw new SentryError('Backend has to implement `eventFromMessage` method');\n };\n /**\n * @inheritDoc\n */\n\n\n BaseBackend.prototype.sendEvent = function (event) {\n void this._transport.sendEvent(event).then(null, function (reason) {\n logger/* logger.error */.k.error(\"Error while sending event: \" + reason);\n });\n };\n /**\n * @inheritDoc\n */\n\n\n BaseBackend.prototype.sendSession = function (session) {\n if (!this._transport.sendSession) {\n logger/* logger.warn */.k.warn(\"Dropping session because custom transport doesn't implement sendSession\");\n return;\n }\n\n void this._transport.sendSession(session).then(null, function (reason) {\n logger/* logger.error */.k.error(\"Error while sending session: \" + reason);\n });\n };\n /**\n * @inheritDoc\n */\n\n\n BaseBackend.prototype.getTransport = function () {\n return this._transport;\n };\n /**\n * Sets up the transport so it can be used later to send requests.\n */\n\n\n BaseBackend.prototype._setupTransport = function () {\n return new NoopTransport();\n };\n\n return BaseBackend;\n}();\n\n\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/supports.js\nvar supports = __webpack_require__(4712);\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/tracekit.js\n/**\n * This was originally forked from https://github.com/occ/TraceKit, but has since been\n * largely modified and is now maintained as part of Sentry JS SDK.\n */\n // global reference to slice\n\nvar UNKNOWN_FUNCTION = '?'; // Chromium based browsers: Chrome, Brave, new Opera, new Edge\n\nvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i; // gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\n\nvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/; // Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\n\nvar reactMinifiedRegexp = /Minified React error #\\d+;/i;\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\nfunction computeStackTrace(ex) {\n var stack = null;\n var popSize = 0;\n\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n popSize = ex.framesToPop;\n } else if (reactMinifiedRegexp.test(ex.message)) {\n popSize = 1;\n }\n }\n\n try {\n // This must be tried first because Opera 10 *destroys*\n // its stacktrace property if you try to access the stack\n // property first!!\n stack = computeStackTraceFromStacktraceProp(ex);\n\n if (stack) {\n return popFrames(stack, popSize);\n }\n } catch (e) {// no-empty\n }\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n\n if (stack) {\n return popFrames(stack, popSize);\n }\n } catch (e) {// no-empty\n }\n\n return {\n message: extractMessage(ex),\n name: ex && ex.name,\n stack: [],\n failed: true\n };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity\n\nfunction computeStackTraceFromStackProp(ex) {\n var _a, _b;\n\n if (!ex || !ex.stack) {\n return null;\n }\n\n var stack = [];\n var lines = ex.stack.split('\\n');\n var isEval;\n var submatch;\n var parts;\n var element;\n\n for (var i = 0; i < lines.length; ++i) {\n if (parts = chrome.exec(lines[i])) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n\n parts[3] = submatch[2]; // line\n\n parts[4] = submatch[3]; // column\n } // Arpad: Working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n // prefix here seems like the quickest solution for now.\n\n\n var url = parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2]; // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n\n var func = parts[1] || UNKNOWN_FUNCTION;\n _a = __read(extractSafariExtensionDetails(func, url), 2), func = _a[0], url = _a[1];\n element = {\n url: url,\n func: func,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if (parts = winjs.exec(lines[i])) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if (parts = gecko.exec(lines[i])) {\n isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || \"eval\";\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = ''; // no column when eval\n } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n\n var url = parts[3];\n var func = parts[1] || UNKNOWN_FUNCTION;\n _b = __read(extractSafariExtensionDetails(func, url), 2), func = _b[0], url = _b[1];\n element = {\n url: url,\n func: func,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack\n };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\nfunction computeStackTraceFromStacktraceProp(ex) {\n if (!ex || !ex.stacktrace) {\n return null;\n } // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n\n\n var stacktrace = ex.stacktrace;\n var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^)]+))\\((.*)\\))? in (.*):\\s*$/i;\n var lines = stacktrace.split('\\n');\n var stack = [];\n var parts;\n\n for (var line = 0; line < lines.length; line += 2) {\n var element = null;\n\n if (parts = opera10Regex.exec(lines[line])) {\n element = {\n url: parts[2],\n func: parts[3],\n args: [],\n line: +parts[1],\n column: null\n };\n } else if (parts = opera11Regex.exec(lines[line])) {\n element = {\n url: parts[6],\n func: parts[3] || parts[4],\n args: parts[5] ? parts[5].split(',') : [],\n line: +parts[1],\n column: +parts[2]\n };\n }\n\n if (element) {\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack\n };\n}\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunatelly \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\n\n\nvar extractSafariExtensionDetails = function extractSafariExtensionDetails(func, url) {\n var isSafariExtension = func.indexOf('safari-extension') !== -1;\n var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n return isSafariExtension || isSafariWebExtension ? [func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION, isSafariExtension ? \"safari-extension:\" + url : \"safari-web-extension:\" + url] : [func, url];\n};\n/** Remove N number of frames from the stack */\n\n\nfunction popFrames(stacktrace, popSize) {\n try {\n return _assign(_assign({}, stacktrace), {\n stack: stacktrace.stack.slice(popSize)\n });\n } catch (e) {\n return stacktrace;\n }\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\nfunction extractMessage(ex) {\n var message = ex && ex.message;\n\n if (!message) {\n return 'No error message';\n }\n\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n\n return message;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/parsers.js\n\n\nvar STACKTRACE_LIMIT = 50;\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\n\nfunction exceptionFromStacktrace(stacktrace) {\n var frames = prepareFramesForEvent(stacktrace.stack);\n var exception = {\n type: stacktrace.name,\n value: stacktrace.message\n };\n\n if (frames && frames.length) {\n exception.stacktrace = {\n frames: frames\n };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n/**\n * @hidden\n */\n\nfunction eventFromPlainObject(exception, syntheticException, rejection) {\n var event = {\n exception: {\n values: [{\n type: (0,is/* isEvent */.cO)(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + (0,object/* extractExceptionKeysForMessage */.zf)(exception)\n }]\n },\n extra: {\n __serialized__: (0,object/* normalizeToSize */.Qy)(exception)\n }\n };\n\n if (syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1\n };\n }\n\n return event;\n}\n/**\n * @hidden\n */\n\nfunction eventFromStacktrace(stacktrace) {\n var exception = exceptionFromStacktrace(stacktrace);\n return {\n exception: {\n values: [exception]\n }\n };\n}\n/**\n * @hidden\n */\n\nfunction prepareFramesForEvent(stack) {\n if (!stack || !stack.length) {\n return [];\n }\n\n var localStack = stack;\n var firstFrameFunction = localStack[0].func || '';\n var lastFrameFunction = localStack[localStack.length - 1].func || ''; // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n } // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n\n\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n } // The frame where the crash happened, should be the last entry in the array\n\n\n return localStack.slice(0, STACKTRACE_LIMIT).map(function (frame) {\n return {\n colno: frame.column === null ? undefined : frame.column,\n filename: frame.url || localStack[0].url,\n function: frame.func || '?',\n in_app: true,\n lineno: frame.line === null ? undefined : frame.line\n };\n }).reverse();\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/eventbuilder.js\n\n\n\n\n\n/**\n * Builds and Event from a Exception\n * @hidden\n */\n\nfunction eventFromException(options, exception, hint) {\n var syntheticException = hint && hint.syntheticException || undefined;\n var event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: options.attachStacktrace\n });\n (0,misc/* addExceptionMechanism */.EG)(event, {\n handled: true,\n type: 'generic'\n });\n event.level = Severity.Error;\n\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n\n return syncpromise/* SyncPromise.resolve */.c.resolve(event);\n}\n/**\n * Builds and Event from a Message\n * @hidden\n */\n\nfunction eventFromMessage(options, message, level, hint) {\n if (level === void 0) {\n level = Severity.Info;\n }\n\n var syntheticException = hint && hint.syntheticException || undefined;\n var event = eventFromString(message, syntheticException, {\n attachStacktrace: options.attachStacktrace\n });\n event.level = level;\n\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n\n return syncpromise/* SyncPromise.resolve */.c.resolve(event);\n}\n/**\n * @hidden\n */\n\nfunction eventFromUnknownInput(exception, syntheticException, options) {\n if (options === void 0) {\n options = {};\n }\n\n var event;\n\n if ((0,is/* isErrorEvent */.VW)(exception) && exception.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n var errorEvent = exception; // eslint-disable-next-line no-param-reassign\n\n exception = errorEvent.error;\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n\n if ((0,is/* isDOMError */.TX)(exception) || (0,is/* isDOMException */.fm)(exception)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name, code, and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var domException = exception;\n var name_1 = domException.name || ((0,is/* isDOMError */.TX)(domException) ? 'DOMError' : 'DOMException');\n var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n event = eventFromString(message, syntheticException, options);\n (0,misc/* addExceptionTypeValue */.Db)(event, message);\n\n if ('code' in domException) {\n event.tags = _assign(_assign({}, event.tags), {\n 'DOMException.code': \"\" + domException.code\n });\n }\n\n return event;\n }\n\n if ((0,is/* isError */.VZ)(exception)) {\n // we have a real Error object, do nothing\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n\n if ((0,is/* isPlainObject */.PO)(exception) || (0,is/* isEvent */.cO)(exception)) {\n // If it is plain Object or Event, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n var objectException = exception;\n event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n (0,misc/* addExceptionMechanism */.EG)(event, {\n synthetic: true\n });\n return event;\n } // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n\n\n event = eventFromString(exception, syntheticException, options);\n (0,misc/* addExceptionTypeValue */.Db)(event, \"\" + exception, undefined);\n (0,misc/* addExceptionMechanism */.EG)(event, {\n synthetic: true\n });\n return event;\n}\n/**\n * @hidden\n */\n\nfunction eventFromString(input, syntheticException, options) {\n if (options === void 0) {\n options = {};\n }\n\n var event = {\n message: input\n };\n\n if (options.attachStacktrace && syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1\n };\n }\n\n return event;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/request.js\n\n/** Extract sdk info from from the API metadata */\n\nfunction getSdkMetadataForEnvelopeHeader(api) {\n if (!api.metadata || !api.metadata.sdk) {\n return;\n }\n\n var _a = api.metadata.sdk,\n name = _a.name,\n version = _a.version;\n return {\n name: name,\n version: version\n };\n}\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\n\n\nfunction enhanceEventWithSdkInfo(event, sdkInfo) {\n if (!sdkInfo) {\n return event;\n }\n\n event.sdk = event.sdk || {};\n event.sdk.name = event.sdk.name || sdkInfo.name;\n event.sdk.version = event.sdk.version || sdkInfo.version;\n event.sdk.integrations = node_modules_tslib_tslib_es6_spread(event.sdk.integrations || [], sdkInfo.integrations || []);\n event.sdk.packages = node_modules_tslib_tslib_es6_spread(event.sdk.packages || [], sdkInfo.packages || []);\n return event;\n}\n/** Creates a SentryRequest from a Session. */\n\n\nfunction sessionToSentryRequest(session, api) {\n var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n var envelopeHeaders = JSON.stringify(tslib_tslib_es6_assign(tslib_tslib_es6_assign({\n sent_at: new Date().toISOString()\n }, sdkInfo && {\n sdk: sdkInfo\n }), api.forceEnvelope() && {\n dsn: api.getDsn().toString()\n })); // I know this is hacky but we don't want to add `session` to request type since it's never rate limited\n\n var type = 'aggregates' in session ? 'sessions' : 'session';\n var itemHeaders = JSON.stringify({\n type: type\n });\n return {\n body: envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + JSON.stringify(session),\n type: type,\n url: api.getEnvelopeEndpointWithUrlEncodedAuth()\n };\n}\n/** Creates a SentryRequest from an event. */\n\nfunction eventToSentryRequest(event, api) {\n var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n var eventType = event.type || 'event';\n var useEnvelope = eventType === 'transaction' || api.forceEnvelope();\n\n var _a = event.debug_meta || {},\n transactionSampling = _a.transactionSampling,\n metadata = tslib_tslib_es6_rest(_a, [\"transactionSampling\"]);\n\n var _b = transactionSampling || {},\n samplingMethod = _b.method,\n sampleRate = _b.rate;\n\n if (Object.keys(metadata).length === 0) {\n delete event.debug_meta;\n } else {\n event.debug_meta = metadata;\n }\n\n var req = {\n body: JSON.stringify(sdkInfo ? enhanceEventWithSdkInfo(event, api.metadata.sdk) : event),\n type: eventType,\n url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth()\n }; // https://develop.sentry.dev/sdk/envelopes/\n // Since we don't need to manipulate envelopes nor store them, there is no\n // exported concept of an Envelope with operations including serialization and\n // deserialization. Instead, we only implement a minimal subset of the spec to\n // serialize events inline here.\n\n if (useEnvelope) {\n var envelopeHeaders = JSON.stringify(tslib_tslib_es6_assign(tslib_tslib_es6_assign({\n event_id: event.event_id,\n sent_at: new Date().toISOString()\n }, sdkInfo && {\n sdk: sdkInfo\n }), api.forceEnvelope() && {\n dsn: api.getDsn().toString()\n }));\n var itemHeaders = JSON.stringify({\n type: eventType,\n // TODO: Right now, sampleRate may or may not be defined (it won't be in the cases of inheritance and\n // explicitly-set sampling decisions). Are we good with that?\n sample_rates: [{\n id: samplingMethod,\n rate: sampleRate\n }]\n }); // The trailing newline is optional. We intentionally don't send it to avoid\n // sending unnecessary bytes.\n //\n // const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}\\n`;\n\n var envelope = envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + req.body;\n req.body = envelope;\n }\n\n return req;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/api.js\n\nvar SENTRY_API_VERSION = '7';\n/**\n * Helper class to provide urls, headers and metadata that can be used to form\n * different types of requests to Sentry endpoints.\n * Supports both envelopes and regular event requests.\n **/\n\nvar API =\n/** @class */\nfunction () {\n /** Create a new instance of API */\n function API(dsn, metadata, tunnel) {\n if (metadata === void 0) {\n metadata = {};\n }\n\n this.dsn = dsn;\n this._dsnObject = new Dsn(dsn);\n this.metadata = metadata;\n this._tunnel = tunnel;\n }\n /** Returns the Dsn object. */\n\n\n API.prototype.getDsn = function () {\n return this._dsnObject;\n };\n /** Does this transport force envelopes? */\n\n\n API.prototype.forceEnvelope = function () {\n return !!this._tunnel;\n };\n /** Returns the prefix to construct Sentry ingestion API endpoints. */\n\n\n API.prototype.getBaseApiEndpoint = function () {\n var dsn = this.getDsn();\n var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n var port = dsn.port ? \":\" + dsn.port : '';\n return protocol + \"//\" + dsn.host + port + (dsn.path ? \"/\" + dsn.path : '') + \"/api/\";\n };\n /** Returns the store endpoint URL. */\n\n\n API.prototype.getStoreEndpoint = function () {\n return this._getIngestEndpoint('store');\n };\n /**\n * Returns the store endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\n\n\n API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n return this.getStoreEndpoint() + \"?\" + this._encodedAuth();\n };\n /**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\n\n\n API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {\n if (this.forceEnvelope()) {\n return this._tunnel;\n }\n\n return this._getEnvelopeEndpoint() + \"?\" + this._encodedAuth();\n };\n /** Returns only the path component for the store endpoint. */\n\n\n API.prototype.getStoreEndpointPath = function () {\n var dsn = this.getDsn();\n return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n };\n /**\n * Returns an object that can be used in request headers.\n * This is needed for node and the old /store endpoint in sentry\n */\n\n\n API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n // CHANGE THIS to use metadata but keep clientName and clientVersion compatible\n var dsn = this.getDsn();\n var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n header.push(\"sentry_key=\" + dsn.publicKey);\n\n if (dsn.pass) {\n header.push(\"sentry_secret=\" + dsn.pass);\n }\n\n return {\n 'Content-Type': 'application/json',\n 'X-Sentry-Auth': header.join(', ')\n };\n };\n /** Returns the url to the report dialog endpoint. */\n\n\n API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n if (dialogOptions === void 0) {\n dialogOptions = {};\n }\n\n var dsn = this.getDsn();\n var endpoint = this.getBaseApiEndpoint() + \"embed/error-page/\";\n var encodedOptions = [];\n encodedOptions.push(\"dsn=\" + dsn.toString());\n\n for (var key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'user') {\n if (!dialogOptions.user) {\n continue;\n }\n\n if (dialogOptions.user.name) {\n encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n }\n\n if (dialogOptions.user.email) {\n encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n }\n } else {\n encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n }\n }\n\n if (encodedOptions.length) {\n return endpoint + \"?\" + encodedOptions.join('&');\n }\n\n return endpoint;\n };\n /** Returns the envelope endpoint URL. */\n\n\n API.prototype._getEnvelopeEndpoint = function () {\n return this._getIngestEndpoint('envelope');\n };\n /** Returns the ingest API endpoint for target. */\n\n\n API.prototype._getIngestEndpoint = function (target) {\n if (this._tunnel) {\n return this._tunnel;\n }\n\n var base = this.getBaseApiEndpoint();\n var dsn = this.getDsn();\n return \"\" + base + dsn.projectId + \"/\" + target + \"/\";\n };\n /** Returns a URL-encoded string with auth config suitable for a query string. */\n\n\n API.prototype._encodedAuth = function () {\n var dsn = this.getDsn();\n var auth = {\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.publicKey,\n sentry_version: SENTRY_API_VERSION\n };\n return (0,object/* urlEncode */._j)(auth);\n };\n\n return API;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/promisebuffer.js\n\n\n/** A simple queue that holds promises. */\n\nvar PromiseBuffer =\n/** @class */\nfunction () {\n function PromiseBuffer(_limit) {\n this._limit = _limit;\n /** Internal set of queued Promises */\n\n this._buffer = [];\n }\n /**\n * Says if the buffer is ready to take more requests\n */\n\n\n PromiseBuffer.prototype.isReady = function () {\n return this._limit === undefined || this.length() < this._limit;\n };\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike; In previous versions this used to be `task:\n * PromiseLike`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n\n\n PromiseBuffer.prototype.add = function (taskProducer) {\n var _this = this;\n\n if (!this.isReady()) {\n return syncpromise/* SyncPromise.reject */.c.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n } // start the task and add its promise to the queue\n\n\n var task = taskProducer();\n\n if (this._buffer.indexOf(task) === -1) {\n this._buffer.push(task);\n }\n\n void task.then(function () {\n return _this.remove(task);\n }) // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, function () {\n return _this.remove(task).then(null, function () {// We have to add another catch here because `this.remove()` starts a new promise chain.\n });\n });\n return task;\n };\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n\n\n PromiseBuffer.prototype.remove = function (task) {\n var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n\n return removedTask;\n };\n /**\n * This function returns the number of unresolved promises in the queue.\n */\n\n\n PromiseBuffer.prototype.length = function () {\n return this._buffer.length;\n };\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n\n\n PromiseBuffer.prototype.drain = function (timeout) {\n var _this = this;\n\n return new syncpromise/* SyncPromise */.c(function (resolve) {\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n var capturedSetTimeout = setTimeout(function () {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout); // if all promises resolve in time, cancel the timer and resolve to `true`\n\n void syncpromise/* SyncPromise.all */.c.all(_this._buffer).then(function () {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }).then(null, function () {\n resolve(true);\n });\n });\n };\n\n return PromiseBuffer;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/base.js\n\n\n\n\nvar CATEGORY_MAPPING = {\n event: 'error',\n transaction: 'transaction',\n session: 'session',\n attachment: 'attachment'\n};\nvar global = (0,misc/* getGlobalObject */.Rf)();\n/** Base Transport class implementation */\n\nvar BaseTransport =\n/** @class */\nfunction () {\n function BaseTransport(options) {\n var _this = this;\n\n this.options = options;\n /** A simple buffer holding all requests. */\n\n this._buffer = new PromiseBuffer(30);\n /** Locks transport after receiving rate limits in a response */\n\n this._rateLimits = {};\n this._outcomes = {};\n this._api = new API(options.dsn, options._metadata, options.tunnel); // eslint-disable-next-line deprecation/deprecation\n\n this.url = this._api.getStoreEndpointWithUrlEncodedAuth();\n\n if (this.options.sendClientReports && global.document) {\n global.document.addEventListener('visibilitychange', function () {\n if (global.document.visibilityState === 'hidden') {\n _this._flushOutcomes();\n }\n });\n }\n }\n /**\n * @inheritDoc\n */\n\n\n BaseTransport.prototype.sendEvent = function (_) {\n throw new SentryError('Transport Class has to implement `sendEvent` method');\n };\n /**\n * @inheritDoc\n */\n\n\n BaseTransport.prototype.close = function (timeout) {\n return this._buffer.drain(timeout);\n };\n /**\n * @inheritDoc\n */\n\n\n BaseTransport.prototype.recordLostEvent = function (reason, category) {\n var _a;\n\n if (!this.options.sendClientReports) {\n return;\n } // We want to track each category (event, transaction, session) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial>>>`\n\n\n var key = CATEGORY_MAPPING[category] + \":\" + reason;\n logger/* logger.log */.k.log(\"Adding outcome: \" + key);\n this._outcomes[key] = (_a = this._outcomes[key], _a !== null && _a !== void 0 ? _a : 0) + 1;\n };\n /**\n * Send outcomes as an envelope\n */\n\n\n BaseTransport.prototype._flushOutcomes = function () {\n if (!this.options.sendClientReports) {\n return;\n }\n\n if (!global.navigator || typeof global.navigator.sendBeacon !== 'function') {\n logger/* logger.warn */.k.warn('Beacon API not available, skipping sending outcomes.');\n return;\n }\n\n var outcomes = this._outcomes;\n this._outcomes = {}; // Nothing to send\n\n if (!Object.keys(outcomes).length) {\n logger/* logger.log */.k.log('No outcomes to flush');\n return;\n }\n\n logger/* logger.log */.k.log(\"Flushing outcomes:\\n\" + JSON.stringify(outcomes, null, 2));\n\n var url = this._api.getEnvelopeEndpointWithUrlEncodedAuth(); // Envelope header is required to be at least an empty object\n\n\n var envelopeHeader = JSON.stringify({});\n var itemHeaders = JSON.stringify({\n type: 'client_report'\n });\n var item = JSON.stringify({\n timestamp: (0,time/* dateTimestampInSeconds */.yW)(),\n discarded_events: Object.keys(outcomes).map(function (key) {\n var _a = __read(key.split(':'), 2),\n category = _a[0],\n reason = _a[1];\n\n return {\n reason: reason,\n category: category,\n quantity: outcomes[key]\n };\n })\n });\n var envelope = envelopeHeader + \"\\n\" + itemHeaders + \"\\n\" + item;\n global.navigator.sendBeacon(url, envelope);\n };\n /**\n * Handle Sentry repsonse for promise-based transports.\n */\n\n\n BaseTransport.prototype._handleResponse = function (_a) {\n var requestType = _a.requestType,\n response = _a.response,\n headers = _a.headers,\n resolve = _a.resolve,\n reject = _a.reject;\n var status = Status.fromHttpCode(response.status);\n /**\n * \"The name is case-insensitive.\"\n * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n */\n\n var limited = this._handleRateLimit(headers);\n\n if (limited) logger/* logger.warn */.k.warn(\"Too many \" + requestType + \" requests, backing off until: \" + this._disabledUntil(requestType));\n\n if (status === Status.Success) {\n resolve({\n status: status\n });\n return;\n }\n\n reject(response);\n };\n /**\n * Gets the time that given category is disabled until for rate limiting\n */\n\n\n BaseTransport.prototype._disabledUntil = function (requestType) {\n var category = CATEGORY_MAPPING[requestType];\n return this._rateLimits[category] || this._rateLimits.all;\n };\n /**\n * Checks if a category is rate limited\n */\n\n\n BaseTransport.prototype._isRateLimited = function (requestType) {\n return this._disabledUntil(requestType) > new Date(Date.now());\n };\n /**\n * Sets internal _rateLimits from incoming headers. Returns true if headers contains a non-empty rate limiting header.\n */\n\n\n BaseTransport.prototype._handleRateLimit = function (headers) {\n var e_1, _a, e_2, _b;\n\n var now = Date.now();\n var rlHeader = headers['x-sentry-rate-limits'];\n var raHeader = headers['retry-after'];\n\n if (rlHeader) {\n try {\n // rate limit headers are of the form\n //
,
,..\n // where each
is of the form\n // : : : \n // where\n // is a delay in ms\n // is the event type(s) (error, transaction, etc) being rate limited and is of the form\n // ;;...\n // is what's being limited (org, project, or key) - ignored by SDK\n // is an arbitrary string like \"org_quota\" - ignored by SDK\n for (var _c = __values(rlHeader.trim().split(',')), _d = _c.next(); !_d.done; _d = _c.next()) {\n var limit = _d.value;\n var parameters = limit.split(':', 2);\n var headerDelay = parseInt(parameters[0], 10);\n var delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n\n try {\n for (var _e = (e_2 = void 0, __values(parameters[1].split(';'))), _f = _e.next(); !_f.done; _f = _e.next()) {\n var category = _f.value;\n this._rateLimits[category || 'all'] = new Date(now + delay);\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return true;\n } else if (raHeader) {\n this._rateLimits.all = new Date(now + (0,misc/* parseRetryAfterHeader */.JY)(now, raHeader));\n return true;\n }\n\n return false;\n };\n\n return BaseTransport;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/fetch.js\n\n\n\n\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\n\nfunction getNativeFetchImplementation() {\n /* eslint-disable @typescript-eslint/unbound-method */\n var _a, _b; // Fast path to avoid DOM I/O\n\n\n var global = (0,misc/* getGlobalObject */.Rf)();\n\n if ((0,supports/* isNativeFetch */.Du)(global.fetch)) {\n return global.fetch.bind(global);\n }\n\n var document = global.document;\n var fetchImpl = global.fetch; // eslint-disable-next-line deprecation/deprecation\n\n if (typeof ((_a = document) === null || _a === void 0 ? void 0 : _a.createElement) === \"function\") {\n try {\n var sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n\n if ((_b = sandbox.contentWindow) === null || _b === void 0 ? void 0 : _b.fetch) {\n fetchImpl = sandbox.contentWindow.fetch;\n }\n\n document.head.removeChild(sandbox);\n } catch (e) {\n logger/* logger.warn */.k.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return fetchImpl.bind(global);\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n/** `fetch` based transport */\n\n\nvar FetchTransport =\n/** @class */\nfunction (_super) {\n __extends(FetchTransport, _super);\n\n function FetchTransport(options, fetchImpl) {\n if (fetchImpl === void 0) {\n fetchImpl = getNativeFetchImplementation();\n }\n\n var _this = _super.call(this, options) || this;\n\n _this._fetch = fetchImpl;\n return _this;\n }\n /**\n * @inheritDoc\n */\n\n\n FetchTransport.prototype.sendEvent = function (event) {\n return this._sendRequest(eventToSentryRequest(event, this._api), event);\n };\n /**\n * @inheritDoc\n */\n\n\n FetchTransport.prototype.sendSession = function (session) {\n return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n };\n /**\n * @param sentryRequest Prepared SentryRequest to be delivered\n * @param originalPayload Original payload used to create SentryRequest\n */\n\n\n FetchTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n var _this = this;\n\n if (this._isRateLimited(sentryRequest.type)) {\n this.recordLostEvent(esm_transport/* Outcome.RateLimitBackoff */.k.RateLimitBackoff, sentryRequest.type);\n return Promise.reject({\n event: originalPayload,\n type: sentryRequest.type,\n reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n status: 429\n });\n }\n\n var options = {\n body: sentryRequest.body,\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: (0,supports/* supportsReferrerPolicy */.hv)() ? 'origin' : ''\n };\n\n if (this.options.fetchParameters !== undefined) {\n Object.assign(options, this.options.fetchParameters);\n }\n\n if (this.options.headers !== undefined) {\n options.headers = this.options.headers;\n }\n\n return this._buffer.add(function () {\n return new syncpromise/* SyncPromise */.c(function (resolve, reject) {\n void _this._fetch(sentryRequest.url, options).then(function (response) {\n var headers = {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After')\n };\n\n _this._handleResponse({\n requestType: sentryRequest.type,\n response: response,\n headers: headers,\n resolve: resolve,\n reject: reject\n });\n }).catch(reject);\n });\n }).then(undefined, function (reason) {\n // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n if (reason instanceof SentryError) {\n _this.recordLostEvent(esm_transport/* Outcome.QueueOverflow */.k.QueueOverflow, sentryRequest.type);\n } else {\n _this.recordLostEvent(esm_transport/* Outcome.NetworkError */.k.NetworkError, sentryRequest.type);\n }\n\n throw reason;\n });\n };\n\n return FetchTransport;\n}(BaseTransport);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/xhr.js\n\n\n\n\n\n/** `XHR` based transport */\n\nvar XHRTransport =\n/** @class */\nfunction (_super) {\n __extends(XHRTransport, _super);\n\n function XHRTransport() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * @inheritDoc\n */\n\n\n XHRTransport.prototype.sendEvent = function (event) {\n return this._sendRequest(eventToSentryRequest(event, this._api), event);\n };\n /**\n * @inheritDoc\n */\n\n\n XHRTransport.prototype.sendSession = function (session) {\n return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n };\n /**\n * @param sentryRequest Prepared SentryRequest to be delivered\n * @param originalPayload Original payload used to create SentryRequest\n */\n\n\n XHRTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n var _this = this;\n\n if (this._isRateLimited(sentryRequest.type)) {\n this.recordLostEvent(esm_transport/* Outcome.RateLimitBackoff */.k.RateLimitBackoff, sentryRequest.type);\n return Promise.reject({\n event: originalPayload,\n type: sentryRequest.type,\n reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n status: 429\n });\n }\n\n return this._buffer.add(function () {\n return new syncpromise/* SyncPromise */.c(function (resolve, reject) {\n var request = new XMLHttpRequest();\n\n request.onreadystatechange = function () {\n if (request.readyState === 4) {\n var headers = {\n 'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': request.getResponseHeader('Retry-After')\n };\n\n _this._handleResponse({\n requestType: sentryRequest.type,\n response: request,\n headers: headers,\n resolve: resolve,\n reject: reject\n });\n }\n };\n\n request.open('POST', sentryRequest.url);\n\n for (var header in _this.options.headers) {\n if (_this.options.headers.hasOwnProperty(header)) {\n request.setRequestHeader(header, _this.options.headers[header]);\n }\n }\n\n request.send(sentryRequest.body);\n });\n }).then(undefined, function (reason) {\n // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n if (reason instanceof SentryError) {\n _this.recordLostEvent(esm_transport/* Outcome.QueueOverflow */.k.QueueOverflow, sentryRequest.type);\n } else {\n _this.recordLostEvent(esm_transport/* Outcome.NetworkError */.k.NetworkError, sentryRequest.type);\n }\n\n throw reason;\n });\n };\n\n return XHRTransport;\n}(BaseTransport);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/backend.js\n\n\n\n\n\n\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\n\nvar BrowserBackend =\n/** @class */\nfunction (_super) {\n __extends(BrowserBackend, _super);\n\n function BrowserBackend() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * @inheritDoc\n */\n\n\n BrowserBackend.prototype.eventFromException = function (exception, hint) {\n return eventFromException(this._options, exception, hint);\n };\n /**\n * @inheritDoc\n */\n\n\n BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n if (level === void 0) {\n level = Severity.Info;\n }\n\n return eventFromMessage(this._options, message, level, hint);\n };\n /**\n * @inheritDoc\n */\n\n\n BrowserBackend.prototype._setupTransport = function () {\n if (!this._options.dsn) {\n // We return the noop transport here in case there is no Dsn.\n return _super.prototype._setupTransport.call(this);\n }\n\n var transportOptions = _assign(_assign({}, this._options.transportOptions), {\n dsn: this._options.dsn,\n tunnel: this._options.tunnel,\n sendClientReports: this._options.sendClientReports,\n _metadata: this._options._metadata\n });\n\n if (this._options.transport) {\n return new this._options.transport(transportOptions);\n }\n\n if ((0,supports/* supportsFetch */.Ak)()) {\n return new FetchTransport(transportOptions);\n }\n\n return new XHRTransport(transportOptions);\n };\n\n return BrowserBackend;\n}(BaseBackend);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/helpers.js\n\n\n\nvar helpers_global = (0,misc/* getGlobalObject */.Rf)();\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\n\nfunction shouldIgnoreOnError() {\n return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\n\nfunction ignoreNextOnError() {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(function () {\n ignoreOnError -= 1;\n });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\n\nfunction wrap(fn, options, before) {\n if (options === void 0) {\n options = {};\n }\n\n if (typeof fn !== 'function') {\n return fn;\n }\n\n try {\n // We don't wanna wrap it twice\n if (fn.__sentry__) {\n return fn;\n } // If this has already been wrapped in the past, return that wrapped function\n\n\n if (fn.__sentry_wrapped__) {\n return fn.__sentry_wrapped__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n /* eslint-disable prefer-rest-params */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n var sentryWrapped = function sentryWrapped() {\n var args = Array.prototype.slice.call(arguments);\n\n try {\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n } // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\n\n var wrappedArguments = args.map(function (arg) {\n return wrap(arg, options);\n });\n\n if (fn.handleEvent) {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return fn.handleEvent.apply(this, wrappedArguments);\n } // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n\n\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n withScope(function (scope) {\n scope.addEventProcessor(function (event) {\n var processedEvent = _assign({}, event);\n\n if (options.mechanism) {\n (0,misc/* addExceptionTypeValue */.Db)(processedEvent, undefined, undefined);\n (0,misc/* addExceptionMechanism */.EG)(processedEvent, options.mechanism);\n }\n\n processedEvent.extra = _assign(_assign({}, processedEvent.extra), {\n arguments: args\n });\n return processedEvent;\n });\n captureException(ex);\n });\n throw ex;\n }\n };\n /* eslint-enable prefer-rest-params */\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n\n\n try {\n for (var property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n } catch (_oO) {} // eslint-disable-line no-empty\n\n\n fn.prototype = fn.prototype || {};\n sentryWrapped.prototype = fn.prototype;\n Object.defineProperty(fn, '__sentry_wrapped__', {\n enumerable: false,\n value: sentryWrapped\n }); // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n\n Object.defineProperties(sentryWrapped, {\n __sentry__: {\n enumerable: false,\n value: true\n },\n __sentry_original__: {\n enumerable: false,\n value: fn\n }\n }); // Restore original function name (not all browsers allow that)\n\n try {\n var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get: function get() {\n return fn.name;\n }\n });\n } // eslint-disable-next-line no-empty\n\n } catch (_oO) {}\n\n return sentryWrapped;\n}\n/**\n * Injects the Report Dialog script\n * @hidden\n */\n\nfunction injectReportDialog(options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!helpers_global.document) {\n return;\n }\n\n if (!options.eventId) {\n logger/* logger.error */.k.error(\"Missing eventId option in showReportDialog call\");\n return;\n }\n\n if (!options.dsn) {\n logger/* logger.error */.k.error(\"Missing dsn option in showReportDialog call\");\n return;\n }\n\n var script = helpers_global.document.createElement('script');\n script.async = true;\n script.src = new API(options.dsn).getReportDialogEndpoint(options);\n\n if (options.onLoad) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n script.onload = options.onLoad;\n }\n\n var injectionPoint = helpers_global.document.head || helpers_global.document.body;\n\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n }\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/instrument.js\nvar instrument = __webpack_require__(6710);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/browser.js\nvar browser = __webpack_require__(595);\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/* eslint-disable max-lines */\n\n\n\n\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\n\nvar Breadcrumbs =\n/** @class */\nfunction () {\n /**\n * @inheritDoc\n */\n function Breadcrumbs(options) {\n /**\n * @inheritDoc\n */\n this.name = Breadcrumbs.id;\n this._options = _assign({\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true\n }, options);\n }\n /**\n * Create a breadcrumb of `sentry` from the events themselves\n */\n\n\n Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {\n if (!this._options.sentry) {\n return;\n }\n\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: \"sentry.\" + (event.type === 'transaction' ? 'transaction' : 'event'),\n event_id: event.event_id,\n level: event.level,\n message: (0,misc/* getEventDescription */.jH)(event)\n }, {\n event: event\n });\n };\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n\n\n Breadcrumbs.prototype.setupOnce = function () {\n var _this = this;\n\n if (this._options.console) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n _this._consoleBreadcrumb.apply(_this, tslib_es6_spread(args));\n },\n type: 'console'\n });\n }\n\n if (this._options.dom) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n _this._domBreadcrumb.apply(_this, tslib_es6_spread(args));\n },\n type: 'dom'\n });\n }\n\n if (this._options.xhr) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n _this._xhrBreadcrumb.apply(_this, tslib_es6_spread(args));\n },\n type: 'xhr'\n });\n }\n\n if (this._options.fetch) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n _this._fetchBreadcrumb.apply(_this, tslib_es6_spread(args));\n },\n type: 'fetch'\n });\n }\n\n if (this._options.history) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n _this._historyBreadcrumb.apply(_this, tslib_es6_spread(args));\n },\n type: 'history'\n });\n }\n };\n /**\n * Creates breadcrumbs from console API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n var breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console'\n },\n level: Severity.fromString(handlerData.level),\n message: (0,string/* safeJoin */.nK)(handlerData.args, ' ')\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = \"Assertion failed: \" + ((0,string/* safeJoin */.nK)(handlerData.args.slice(1), ' ') || 'console.assert');\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level\n });\n };\n /**\n * Creates breadcrumbs from DOM API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n var target;\n var keyAttrs = typeof this._options.dom === 'object' ? this._options.dom.serializeAttribute : undefined;\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n } // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n\n\n try {\n target = handlerData.event.target ? (0,browser/* htmlTreeAsString */.R)(handlerData.event.target, keyAttrs) : (0,browser/* htmlTreeAsString */.R)(handlerData.event, keyAttrs);\n } catch (e) {\n target = '';\n }\n\n if (target.length === 0) {\n return;\n }\n\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: \"ui.\" + handlerData.name,\n message: target\n }, {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global\n });\n };\n /**\n * Creates breadcrumbs from XHR API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n\n var _a = handlerData.xhr.__sentry_xhr__ || {},\n method = _a.method,\n url = _a.url,\n status_code = _a.status_code,\n body = _a.body;\n\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: 'xhr',\n data: {\n method: method,\n url: url,\n status_code: status_code\n },\n type: 'http'\n }, {\n xhr: handlerData.xhr,\n input: body\n });\n return;\n }\n };\n /**\n * Creates breadcrumbs from fetch API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: 'fetch',\n data: handlerData.fetchData,\n level: Severity.Error,\n type: 'http'\n }, {\n data: handlerData.error,\n input: handlerData.args\n });\n } else {\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: 'fetch',\n data: _assign(_assign({}, handlerData.fetchData), {\n status_code: handlerData.response.status\n }),\n type: 'http'\n }, {\n input: handlerData.args,\n response: handlerData.response\n });\n }\n };\n /**\n * Creates breadcrumbs from history API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n var global = (0,misc/* getGlobalObject */.Rf)();\n var from = handlerData.from;\n var to = handlerData.to;\n var parsedLoc = (0,misc/* parseUrl */.en)(global.location.href);\n var parsedFrom = (0,misc/* parseUrl */.en)(from);\n var parsedTo = (0,misc/* parseUrl */.en)(to); // Initial pushState doesn't provide `from` information\n\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n } // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n\n\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({\n category: 'navigation',\n data: {\n from: from,\n to: to\n }\n });\n };\n /**\n * @inheritDoc\n */\n\n\n Breadcrumbs.id = 'Breadcrumbs';\n return Breadcrumbs;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/client.js\n\n\n\n\n\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\n\nvar BrowserClient =\n/** @class */\nfunction (_super) {\n __extends(BrowserClient, _super);\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n\n\n function BrowserClient(options) {\n if (options === void 0) {\n options = {};\n }\n\n var _this = this;\n\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.browser',\n packages: [{\n name: 'npm:@sentry/browser',\n version: SDK_VERSION\n }],\n version: SDK_VERSION\n };\n _this = _super.call(this, BrowserBackend, options) || this;\n return _this;\n }\n /**\n * Show a report dialog to the user to send feedback to a specific event.\n *\n * @param options Set individual options for the dialog\n */\n\n\n BrowserClient.prototype.showReportDialog = function (options) {\n if (options === void 0) {\n options = {};\n } // doesn't work without a document (React Native)\n\n\n var document = (0,misc/* getGlobalObject */.Rf)().document;\n\n if (!document) {\n return;\n }\n\n if (!this._isEnabled()) {\n logger/* logger.error */.k.error('Trying to call showReportDialog with Sentry Client disabled');\n return;\n }\n\n injectReportDialog(_assign(_assign({}, options), {\n dsn: options.dsn || this.getDsn()\n }));\n };\n /**\n * @inheritDoc\n */\n\n\n BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n event.platform = event.platform || 'javascript';\n return _super.prototype._prepareEvent.call(this, event, scope, hint);\n };\n /**\n * @inheritDoc\n */\n\n\n BrowserClient.prototype._sendEvent = function (event) {\n var integration = this.getIntegration(Breadcrumbs);\n\n if (integration) {\n integration.addSentryBreadcrumb(event);\n }\n\n _super.prototype._sendEvent.call(this, event);\n };\n\n return BrowserClient;\n}(BaseClient);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/sdk.js\n\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\n\nfunction initAndBind(clientClass, options) {\n var _a;\n\n if (options.debug === true) {\n logger/* logger.enable */.k.enable();\n }\n\n var hub = (0,esm_hub/* getCurrentHub */.Gd)();\n (_a = hub.getScope()) === null || _a === void 0 ? void 0 : _a.update(options.initialScope);\n var client = new clientClass(options);\n hub.bindClient(client);\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/inboundfilters.js\n\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\n\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\n\nvar InboundFilters =\n/** @class */\nfunction () {\n function InboundFilters(_options) {\n if (_options === void 0) {\n _options = {};\n }\n\n this._options = _options;\n /**\n * @inheritDoc\n */\n\n this.name = InboundFilters.id;\n }\n /**\n * @inheritDoc\n */\n\n\n InboundFilters.prototype.setupOnce = function () {\n (0,esm_scope/* addGlobalEventProcessor */.c)(function (event) {\n var hub = (0,esm_hub/* getCurrentHub */.Gd)();\n\n if (!hub) {\n return event;\n }\n\n var self = hub.getIntegration(InboundFilters);\n\n if (self) {\n var client = hub.getClient();\n var clientOptions = client ? client.getOptions() : {}; // This checks prevents most of the occurrences of the bug linked below:\n // https://github.com/getsentry/sentry-javascript/issues/2622\n // The bug is caused by multiple SDK instances, where one is minified and one is using non-mangled code.\n // Unfortunatelly we cannot fix it reliably (thus reserved property in rollup's terser config),\n // as we cannot force people using multiple instances in their apps to sync SDK versions.\n\n var options = typeof self._mergeOptions === 'function' ? self._mergeOptions(clientOptions) : {};\n\n if (typeof self._shouldDropEvent !== 'function') {\n return event;\n }\n\n return self._shouldDropEvent(event, options) ? null : event;\n }\n\n return event;\n });\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._shouldDropEvent = function (event, options) {\n if (this._isSentryError(event, options)) {\n logger/* logger.warn */.k.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + (0,misc/* getEventDescription */.jH)(event));\n return true;\n }\n\n if (this._isIgnoredError(event, options)) {\n logger/* logger.warn */.k.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + (0,misc/* getEventDescription */.jH)(event));\n return true;\n }\n\n if (this._isDeniedUrl(event, options)) {\n logger/* logger.warn */.k.warn(\"Event dropped due to being matched by `denyUrls` option.\\nEvent: \" + (0,misc/* getEventDescription */.jH)(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n\n if (!this._isAllowedUrl(event, options)) {\n logger/* logger.warn */.k.warn(\"Event dropped due to not being matched by `allowUrls` option.\\nEvent: \" + (0,misc/* getEventDescription */.jH)(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n\n return false;\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._isSentryError = function (event, options) {\n if (!options.ignoreInternal) {\n return false;\n }\n\n try {\n return event && event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].type === 'SentryError' || false;\n } catch (_oO) {\n return false;\n }\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._isIgnoredError = function (event, options) {\n if (!options.ignoreErrors || !options.ignoreErrors.length) {\n return false;\n }\n\n return this._getPossibleEventMessages(event).some(function (message) {\n // Not sure why TypeScript complains here...\n return options.ignoreErrors.some(function (pattern) {\n return (0,string/* isMatchingPattern */.zC)(message, pattern);\n });\n });\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._isDeniedUrl = function (event, options) {\n // TODO: Use Glob instead?\n if (!options.denyUrls || !options.denyUrls.length) {\n return false;\n }\n\n var url = this._getEventFilterUrl(event);\n\n return !url ? false : options.denyUrls.some(function (pattern) {\n return (0,string/* isMatchingPattern */.zC)(url, pattern);\n });\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._isAllowedUrl = function (event, options) {\n // TODO: Use Glob instead?\n if (!options.allowUrls || !options.allowUrls.length) {\n return true;\n }\n\n var url = this._getEventFilterUrl(event);\n\n return !url ? true : options.allowUrls.some(function (pattern) {\n return (0,string/* isMatchingPattern */.zC)(url, pattern);\n });\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._mergeOptions = function (clientOptions) {\n if (clientOptions === void 0) {\n clientOptions = {};\n }\n\n return {\n allowUrls: node_modules_tslib_tslib_es6_spread(this._options.whitelistUrls || [], this._options.allowUrls || [], clientOptions.whitelistUrls || [], clientOptions.allowUrls || []),\n denyUrls: node_modules_tslib_tslib_es6_spread(this._options.blacklistUrls || [], this._options.denyUrls || [], clientOptions.blacklistUrls || [], clientOptions.denyUrls || []),\n ignoreErrors: node_modules_tslib_tslib_es6_spread(this._options.ignoreErrors || [], clientOptions.ignoreErrors || [], DEFAULT_IGNORE_ERRORS),\n ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true\n };\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._getPossibleEventMessages = function (event) {\n if (event.message) {\n return [event.message];\n }\n\n if (event.exception) {\n try {\n var _a = event.exception.values && event.exception.values[0] || {},\n _b = _a.type,\n type = _b === void 0 ? '' : _b,\n _c = _a.value,\n value = _c === void 0 ? '' : _c;\n\n return [\"\" + value, type + \": \" + value];\n } catch (oO) {\n logger/* logger.error */.k.error(\"Cannot extract message for event \" + (0,misc/* getEventDescription */.jH)(event));\n return [];\n }\n }\n\n return [];\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._getLastValidUrl = function (frames) {\n if (frames === void 0) {\n frames = [];\n }\n\n var _a, _b;\n\n for (var i = frames.length - 1; i >= 0; i--) {\n var frame = frames[i];\n\n if (((_a = frame) === null || _a === void 0 ? void 0 : _a.filename) !== '' && ((_b = frame) === null || _b === void 0 ? void 0 : _b.filename) !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n };\n /** JSDoc */\n\n\n InboundFilters.prototype._getEventFilterUrl = function (event) {\n try {\n if (event.stacktrace) {\n var frames_1 = event.stacktrace.frames;\n return this._getLastValidUrl(frames_1);\n }\n\n if (event.exception) {\n var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n return this._getLastValidUrl(frames_2);\n }\n\n return null;\n } catch (oO) {\n logger/* logger.error */.k.error(\"Cannot extract url for event \" + (0,misc/* getEventDescription */.jH)(event));\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n\n\n InboundFilters.id = 'InboundFilters';\n return InboundFilters;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/functiontostring.js\nvar originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\n\nvar FunctionToString =\n/** @class */\nfunction () {\n function FunctionToString() {\n /**\n * @inheritDoc\n */\n this.name = FunctionToString.id;\n }\n /**\n * @inheritDoc\n */\n\n\n FunctionToString.prototype.setupOnce = function () {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString; // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n Function.prototype.toString = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var context = this.__sentry_original__ || this;\n return originalFunctionToString.apply(context, args);\n };\n };\n /**\n * @inheritDoc\n */\n\n\n FunctionToString.id = 'FunctionToString';\n return FunctionToString;\n}();\n\n\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/stacktrace.js\nvar stacktrace = __webpack_require__(1313);\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/trycatch.js\n\n\n\nvar DEFAULT_EVENT_TARGET = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'];\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\n\nvar TryCatch =\n/** @class */\nfunction () {\n /**\n * @inheritDoc\n */\n function TryCatch(options) {\n /**\n * @inheritDoc\n */\n this.name = TryCatch.id;\n this._options = _assign({\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true\n }, options);\n }\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n\n\n TryCatch.prototype.setupOnce = function () {\n var global = (0,misc/* getGlobalObject */.Rf)();\n\n if (this._options.setTimeout) {\n (0,object/* fill */.hl)(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n }\n\n if (this._options.setInterval) {\n (0,object/* fill */.hl)(global, 'setInterval', this._wrapTimeFunction.bind(this));\n }\n\n if (this._options.requestAnimationFrame) {\n (0,object/* fill */.hl)(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n }\n\n if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n (0,object/* fill */.hl)(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n }\n\n if (this._options.eventTarget) {\n var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(this._wrapEventTarget.bind(this));\n }\n };\n /** JSDoc */\n\n\n TryCatch.prototype._wrapTimeFunction = function (original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: {\n function: (0,stacktrace/* getFunctionName */.$)(original)\n },\n handled: true,\n type: 'instrument'\n }\n });\n return original.apply(this, args);\n };\n };\n /** JSDoc */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n TryCatch.prototype._wrapRAF = function (original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (callback) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.call(this, wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: (0,stacktrace/* getFunctionName */.$)(original)\n },\n handled: true,\n type: 'instrument'\n }\n }));\n };\n };\n /** JSDoc */\n\n\n TryCatch.prototype._wrapEventTarget = function (target) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var global = (0,misc/* getGlobalObject */.Rf)(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n var proto = global[target] && global[target].prototype; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n (0,object/* fill */.hl)(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n try {\n if (typeof fn.handleEvent === 'function') {\n fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: (0,stacktrace/* getFunctionName */.$)(fn),\n target: target\n },\n handled: true,\n type: 'instrument'\n }\n });\n }\n } catch (err) {// can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.call(this, eventName, // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: (0,stacktrace/* getFunctionName */.$)(fn),\n target: target\n },\n handled: true,\n type: 'instrument'\n }\n }), options);\n };\n });\n (0,object/* fill */.hl)(proto, 'removeEventListener', function (originalRemoveEventListener) {\n return function (eventName, fn, options) {\n var _a;\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n\n\n var wrappedEventHandler = fn;\n\n try {\n var originalEventHandler = (_a = wrappedEventHandler) === null || _a === void 0 ? void 0 : _a.__sentry_wrapped__;\n\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n\n return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n };\n });\n };\n /** JSDoc */\n\n\n TryCatch.prototype._wrapXHR = function (originalSend) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n } // eslint-disable-next-line @typescript-eslint/no-this-alias\n\n\n var xhr = this;\n var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n xmlHttpRequestProps.forEach(function (prop) {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (0,object/* fill */.hl)(xhr, prop, function (original) {\n var wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: (0,stacktrace/* getFunctionName */.$)(original)\n },\n handled: true,\n type: 'instrument'\n }\n }; // If Instrument integration has been called before TryCatch, get the name of original function\n\n if (original.__sentry_original__) {\n wrapOptions.mechanism.data.handler = (0,stacktrace/* getFunctionName */.$)(original.__sentry_original__);\n } // Otherwise wrap directly\n\n\n return wrap(original, wrapOptions);\n });\n }\n });\n return originalSend.apply(this, args);\n };\n };\n /**\n * @inheritDoc\n */\n\n\n TryCatch.id = 'TryCatch';\n return TryCatch;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n\n\n\n\n\n/** Global handlers */\n\nvar GlobalHandlers =\n/** @class */\nfunction () {\n /** JSDoc */\n function GlobalHandlers(options) {\n /**\n * @inheritDoc\n */\n this.name = GlobalHandlers.id;\n /** JSDoc */\n\n this._onErrorHandlerInstalled = false;\n /** JSDoc */\n\n this._onUnhandledRejectionHandlerInstalled = false;\n this._options = _assign({\n onerror: true,\n onunhandledrejection: true\n }, options);\n }\n /**\n * @inheritDoc\n */\n\n\n GlobalHandlers.prototype.setupOnce = function () {\n Error.stackTraceLimit = 50;\n\n if (this._options.onerror) {\n logger/* logger.log */.k.log('Global Handler attached: onerror');\n\n this._installGlobalOnErrorHandler();\n }\n\n if (this._options.onunhandledrejection) {\n logger/* logger.log */.k.log('Global Handler attached: onunhandledrejection');\n\n this._installGlobalOnUnhandledRejectionHandler();\n }\n };\n /** JSDoc */\n\n\n GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n var _this = this;\n\n if (this._onErrorHandlerInstalled) {\n return;\n }\n\n (0,instrument/* addInstrumentationHandler */.o)({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: function callback(data) {\n var error = data.error;\n var currentHub = (0,esm_hub/* getCurrentHub */.Gd)();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return;\n }\n\n var client = currentHub.getClient();\n var event = error === undefined && (0,is/* isString */.HD)(data.msg) ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column) : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error || data.msg, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: false\n }), data.url, data.line, data.column);\n (0,misc/* addExceptionMechanism */.EG)(event, {\n handled: false,\n type: 'onerror'\n });\n currentHub.captureEvent(event, {\n originalException: error\n });\n },\n type: 'error'\n });\n this._onErrorHandlerInstalled = true;\n };\n /** JSDoc */\n\n\n GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n var _this = this;\n\n if (this._onUnhandledRejectionHandlerInstalled) {\n return;\n }\n\n (0,instrument/* addInstrumentationHandler */.o)({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: function callback(e) {\n var error = e; // dig the object of the rejection out of known event types\n\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n } // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n } catch (_oO) {// no-empty\n }\n\n var currentHub = (0,esm_hub/* getCurrentHub */.Gd)();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return true;\n }\n\n var client = currentHub.getClient();\n var event = (0,is/* isPrimitive */.pt)(error) ? _this._eventFromRejectionWithPrimitive(error) : eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: true\n });\n event.level = Severity.Error;\n (0,misc/* addExceptionMechanism */.EG)(event, {\n handled: false,\n type: 'onunhandledrejection'\n });\n currentHub.captureEvent(event, {\n originalException: error\n });\n return;\n },\n type: 'unhandledrejection'\n });\n this._onUnhandledRejectionHandlerInstalled = true;\n };\n /**\n * This function creates a stack from an old, error-less onerror handler.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; // If 'message' is ErrorEvent, get real message from inside\n\n var message = (0,is/* isErrorEvent */.VW)(msg) ? msg.message : msg;\n var name;\n var groups = message.match(ERROR_TYPES_RE);\n\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n\n var event = {\n exception: {\n values: [{\n type: name || 'Error',\n value: message\n }]\n }\n };\n return this._enhanceEventWithInitialFrame(event, url, line, column);\n };\n /**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\n\n\n GlobalHandlers.prototype._eventFromRejectionWithPrimitive = function (reason) {\n return {\n exception: {\n values: [{\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: \"Non-Error promise rejection captured with value: \" + String(reason)\n }]\n }\n };\n };\n /** JSDoc */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n var filename = (0,is/* isString */.HD)(url) && url.length > 0 ? url : (0,misc/* getLocationHref */.l4)();\n\n if (event.exception.values[0].stacktrace.frames.length === 0) {\n event.exception.values[0].stacktrace.frames.push({\n colno: colno,\n filename: filename,\n function: '?',\n in_app: true,\n lineno: lineno\n });\n }\n\n return event;\n };\n /**\n * @inheritDoc\n */\n\n\n GlobalHandlers.id = 'GlobalHandlers';\n return GlobalHandlers;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/linkederrors.js\n\n\n\n\n\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\n\nvar LinkedErrors =\n/** @class */\nfunction () {\n /**\n * @inheritDoc\n */\n function LinkedErrors(options) {\n if (options === void 0) {\n options = {};\n }\n /**\n * @inheritDoc\n */\n\n\n this.name = LinkedErrors.id;\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n /**\n * @inheritDoc\n */\n\n\n LinkedErrors.prototype.setupOnce = function () {\n (0,esm_scope/* addGlobalEventProcessor */.c)(function (event, hint) {\n var self = (0,esm_hub/* getCurrentHub */.Gd)().getIntegration(LinkedErrors);\n\n if (self) {\n var handler = self._handler && self._handler.bind(self);\n\n return typeof handler === 'function' ? handler(event, hint) : event;\n }\n\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n\n\n LinkedErrors.prototype._handler = function (event, hint) {\n if (!event.exception || !event.exception.values || !hint || !(0,is/* isInstanceOf */.V9)(hint.originalException, Error)) {\n return event;\n }\n\n var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n\n event.exception.values = tslib_es6_spread(linkedErrors, event.exception.values);\n return event;\n };\n /**\n * @inheritDoc\n */\n\n\n LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n if (stack === void 0) {\n stack = [];\n }\n\n if (!(0,is/* isInstanceOf */.V9)(error[key], Error) || stack.length + 1 >= this._limit) {\n return stack;\n }\n\n var stacktrace = computeStackTrace(error[key]);\n var exception = exceptionFromStacktrace(stacktrace);\n return this._walkErrorTree(error[key], key, tslib_es6_spread([exception], stack));\n };\n /**\n * @inheritDoc\n */\n\n\n LinkedErrors.id = 'LinkedErrors';\n return LinkedErrors;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/dedupe.js\n\n/** Deduplication filter */\n\nvar Dedupe =\n/** @class */\nfunction () {\n function Dedupe() {\n /**\n * @inheritDoc\n */\n this.name = Dedupe.id;\n }\n /**\n * @inheritDoc\n */\n\n\n Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n addGlobalEventProcessor(function (currentEvent) {\n var self = getCurrentHub().getIntegration(Dedupe);\n\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (self._shouldDropEvent(currentEvent, self._previousEvent)) {\n logger/* logger.warn */.k.warn(\"Event dropped due to being a duplicate of previously captured event.\");\n return null;\n }\n } catch (_oO) {\n return self._previousEvent = currentEvent;\n }\n\n return self._previousEvent = currentEvent;\n }\n\n return currentEvent;\n });\n };\n /** JSDoc */\n\n\n Dedupe.prototype._shouldDropEvent = function (currentEvent, previousEvent) {\n if (!previousEvent) {\n return false;\n }\n\n if (this._isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (this._isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n };\n /** JSDoc */\n\n\n Dedupe.prototype._isSameMessageEvent = function (currentEvent, previousEvent) {\n var currentMessage = currentEvent.message;\n var previousMessage = previousEvent.message; // If neither event has a message property, they were both exceptions, so bail out\n\n if (!currentMessage && !previousMessage) {\n return false;\n } // If only one event has a stacktrace, but not the other one, they are not the same\n\n\n if (currentMessage && !previousMessage || !currentMessage && previousMessage) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!this._isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!this._isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n };\n /** JSDoc */\n\n\n Dedupe.prototype._getFramesFromEvent = function (event) {\n var exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n } else if (event.stacktrace) {\n return event.stacktrace.frames;\n }\n\n return undefined;\n };\n /** JSDoc */\n\n\n Dedupe.prototype._isSameStacktrace = function (currentEvent, previousEvent) {\n var currentFrames = this._getFramesFromEvent(currentEvent);\n\n var previousFrames = this._getFramesFromEvent(previousEvent); // If neither event has a stacktrace, they are assumed to be the same\n\n\n if (!currentFrames && !previousFrames) {\n return true;\n } // If only one event has a stacktrace, but not the other one, they are not the same\n\n\n if (currentFrames && !previousFrames || !currentFrames && previousFrames) {\n return false;\n }\n\n currentFrames = currentFrames;\n previousFrames = previousFrames; // If number of frames differ, they are not the same\n\n if (previousFrames.length !== currentFrames.length) {\n return false;\n } // Otherwise, compare the two\n\n\n for (var i = 0; i < previousFrames.length; i++) {\n var frameA = previousFrames[i];\n var frameB = currentFrames[i];\n\n if (frameA.filename !== frameB.filename || frameA.lineno !== frameB.lineno || frameA.colno !== frameB.colno || frameA.function !== frameB.function) {\n return false;\n }\n }\n\n return true;\n };\n /** JSDoc */\n\n\n Dedupe.prototype._getExceptionFromEvent = function (event) {\n return event.exception && event.exception.values && event.exception.values[0];\n };\n /** JSDoc */\n\n\n Dedupe.prototype._isSameExceptionEvent = function (currentEvent, previousEvent) {\n var previousException = this._getExceptionFromEvent(previousEvent);\n\n var currentException = this._getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!this._isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!this._isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n };\n /** JSDoc */\n\n\n Dedupe.prototype._isSameFingerprint = function (currentEvent, previousEvent) {\n var currentFingerprint = currentEvent.fingerprint;\n var previousFingerprint = previousEvent.fingerprint; // If neither event has a fingerprint, they are assumed to be the same\n\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n } // If only one event has a fingerprint, but not the other one, they are not the same\n\n\n if (currentFingerprint && !previousFingerprint || !currentFingerprint && previousFingerprint) {\n return false;\n }\n\n currentFingerprint = currentFingerprint;\n previousFingerprint = previousFingerprint; // Otherwise, compare the two\n\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n };\n /**\n * @inheritDoc\n */\n\n\n Dedupe.id = 'Dedupe';\n return Dedupe;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/useragent.js\n\n\n\nvar useragent_global = (0,misc/* getGlobalObject */.Rf)();\n/** UserAgent */\n\nvar UserAgent =\n/** @class */\nfunction () {\n function UserAgent() {\n /**\n * @inheritDoc\n */\n this.name = UserAgent.id;\n }\n /**\n * @inheritDoc\n */\n\n\n UserAgent.prototype.setupOnce = function () {\n (0,esm_scope/* addGlobalEventProcessor */.c)(function (event) {\n var _a, _b, _c;\n\n if ((0,esm_hub/* getCurrentHub */.Gd)().getIntegration(UserAgent)) {\n // if none of the information we want exists, don't bother\n if (!useragent_global.navigator && !useragent_global.location && !useragent_global.document) {\n return event;\n } // grab as much info as exists and add it to the event\n\n\n var url = ((_a = event.request) === null || _a === void 0 ? void 0 : _a.url) || ((_b = useragent_global.location) === null || _b === void 0 ? void 0 : _b.href);\n var referrer = (useragent_global.document || {}).referrer;\n var userAgent = (useragent_global.navigator || {}).userAgent;\n\n var headers = _assign(_assign(_assign({}, (_c = event.request) === null || _c === void 0 ? void 0 : _c.headers), referrer && {\n Referer: referrer\n }), userAgent && {\n 'User-Agent': userAgent\n });\n\n var request = _assign(_assign({}, url && {\n url: url\n }), {\n headers: headers\n });\n\n return _assign(_assign({}, event), {\n request: request\n });\n }\n\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n\n\n UserAgent.id = 'UserAgent';\n return UserAgent;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/sdk.js\n\n\n\n\n\n\nvar defaultIntegrations = [new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new Dedupe(), new UserAgent()];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\n\nfunction init(options) {\n if (options === void 0) {\n options = {};\n }\n\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n\n if (options.release === undefined) {\n var window_1 = (0,misc/* getGlobalObject */.Rf)(); // This supports the variable that sentry-webpack-plugin injects\n\n if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n options.release = window_1.SENTRY_RELEASE.id;\n }\n }\n\n if (options.autoSessionTracking === undefined) {\n options.autoSessionTracking = true;\n }\n\n if (options.sendClientReports === undefined) {\n options.sendClientReports = true;\n }\n\n initAndBind(BrowserClient, options);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\n\nfunction showReportDialog(options) {\n if (options === void 0) {\n options = {};\n }\n\n var hub = (0,esm_hub/* getCurrentHub */.Gd)();\n var scope = hub.getScope();\n\n if (scope) {\n options.user = _assign(_assign({}, scope.getUser()), options.user);\n }\n\n if (!options.eventId) {\n options.eventId = hub.lastEventId();\n }\n\n var client = hub.getClient();\n\n if (client) {\n client.showReportDialog(options);\n }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\n\nfunction lastEventId() {\n return (0,esm_hub/* getCurrentHub */.Gd)().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\n\nfunction forceLoad() {// Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\n\nfunction onLoad(callback) {\n callback();\n}\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\n\nfunction flush(timeout) {\n var client = (0,esm_hub/* getCurrentHub */.Gd)().getClient();\n\n if (client) {\n return client.flush(timeout);\n }\n\n logger/* logger.warn */.k.warn('Cannot flush events. No client defined.');\n return syncpromise/* SyncPromise.resolve */.c.resolve(false);\n}\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\n\nfunction sdk_close(timeout) {\n var client = (0,esm_hub/* getCurrentHub */.Gd)().getClient();\n\n if (client) {\n return client.close(timeout);\n }\n\n logger/* logger.warn */.k.warn('Cannot flush events and disable SDK. No client defined.');\n return syncpromise/* SyncPromise.resolve */.c.resolve(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nfunction sdk_wrap(fn) {\n return wrap(fn)();\n}\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\n\nfunction startSessionTracking() {\n var window = (0,misc/* getGlobalObject */.Rf)();\n var document = window.document;\n\n if (typeof document === 'undefined') {\n logger/* logger.warn */.k.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n var hub = (0,esm_hub/* getCurrentHub */.Gd)(); // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n // pinned at the same version in package.json, but there are edge cases where it's possible. See\n // https://github.com/getsentry/sentry-javascript/issues/3207 and\n // https://github.com/getsentry/sentry-javascript/issues/3234 and\n // https://github.com/getsentry/sentry-javascript/issues/3278.\n\n if (typeof hub.startSession !== 'function' || typeof hub.captureSession !== 'function') {\n return;\n } // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n\n\n hub.startSession({\n ignoreDuration: true\n });\n hub.captureSession(); // We want to create a session for every navigation as well\n\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback(_a) {\n var from = _a.from,\n to = _a.to; // Don't create an additional session for the initial route or if the location did not change\n\n if (from === undefined || from === to) {\n return;\n }\n\n hub.startSession({\n ignoreDuration: true\n });\n hub.captureSession();\n },\n type: 'history'\n });\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/version.js\n// TODO: Remove in the next major release and rely only on @sentry/core SDK_VERSION and SdkInfo metadata\nvar SDK_NAME = 'sentry.javascript.browser';\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/exports.js\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/index.js\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/index.js\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/index.js\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/index.js\n\n\n\n\n\n\nvar windowIntegrations = {}; // This block is needed to add compatibility with the integrations packages when used with a CDN\n\nvar _window = (0,misc/* getGlobalObject */.Rf)();\n\nif (_window.Sentry && _window.Sentry.Integrations) {\n windowIntegrations = _window.Sentry.Integrations;\n}\n\nvar INTEGRATIONS = _assign(_assign(_assign({}, windowIntegrations), integrations_namespaceObject), esm_integrations_namespaceObject);\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/sdk.js\n\n/**\n * Inits the React SDK\n */\n\nfunction sdk_init(options) {\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.react',\n packages: [{\n name: 'npm:@sentry/react',\n version: SDK_VERSION\n }],\n version: SDK_VERSION\n };\n init(options);\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar node_modules_tslib_tslib_es6_extendStatics = function extendStatics(d, b) {\n node_modules_tslib_tslib_es6_extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return node_modules_tslib_tslib_es6_extendStatics(d, b);\n};\n\nfunction node_modules_tslib_tslib_es6_extends(d, b) {\n node_modules_tslib_tslib_es6_extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar node_modules_tslib_tslib_es6_assign = function __assign() {\n node_modules_tslib_tslib_es6_assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return node_modules_tslib_tslib_es6_assign.apply(this, arguments);\n};\n\n\nfunction node_modules_tslib_tslib_es6_rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction node_modules_tslib_tslib_es6_decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction node_modules_tslib_tslib_es6_param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction node_modules_tslib_tslib_es6_metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction node_modules_tslib_tslib_es6_awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction node_modules_tslib_tslib_es6_generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n \"throw\": verb(1),\n \"return\": verb(2)\n }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction node_modules_tslib_tslib_es6_createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction node_modules_tslib_tslib_es6_exportStar(m, exports) {\n for (var p in m) {\n if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction node_modules_tslib_tslib_es6_values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction node_modules_tslib_tslib_es6_read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction react_node_modules_tslib_tslib_es6_spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(node_modules_tslib_tslib_es6_read(arguments[i]));\n }\n\n return ar;\n}\nfunction node_modules_tslib_tslib_es6_spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction node_modules_tslib_tslib_es6_await(v) {\n return this instanceof node_modules_tslib_tslib_es6_await ? (this.v = v, this) : new node_modules_tslib_tslib_es6_await(v);\n}\nfunction node_modules_tslib_tslib_es6_asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof node_modules_tslib_tslib_es6_await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume(\"next\", value);\n }\n\n function reject(value) {\n resume(\"throw\", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction node_modules_tslib_tslib_es6_asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: node_modules_tslib_tslib_es6_await(o[n](v)),\n done: n === \"return\"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction node_modules_tslib_tslib_es6_asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof node_modules_tslib_tslib_es6_values === \"function\" ? node_modules_tslib_tslib_es6_values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction node_modules_tslib_tslib_es6_makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction node_modules_tslib_tslib_es6_importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction node_modules_tslib_tslib_es6_importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction node_modules_tslib_tslib_es6_classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n return privateMap.get(receiver);\n}\nfunction node_modules_tslib_tslib_es6_classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n privateMap.set(receiver, value);\n return value;\n}\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(5706);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/profiler.js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\n\n\n\nvar UNKNOWN_COMPONENT = 'unknown';\nvar TRACING_GETTER = {\n id: 'Tracing'\n};\nvar globalTracingIntegration = null;\n/** @deprecated remove when @sentry/apm no longer used */\n\nvar getTracingIntegration = function getTracingIntegration() {\n if (globalTracingIntegration) {\n return globalTracingIntegration;\n }\n\n globalTracingIntegration = (0,esm_hub/* getCurrentHub */.Gd)().getIntegration(TRACING_GETTER);\n return globalTracingIntegration;\n};\n/**\n * pushActivity creates an new react activity.\n * Is a no-op if Tracing integration is not valid\n * @param name displayName of component that started activity\n * @deprecated remove when @sentry/apm no longer used\n */\n\n\nfunction pushActivity(name, op) {\n if (globalTracingIntegration === null) {\n return null;\n }\n\n return globalTracingIntegration.constructor.pushActivity(name, {\n description: \"<\" + name + \">\",\n op: \"react.\" + op\n });\n}\n/**\n * popActivity removes a React activity.\n * Is a no-op if Tracing integration is not valid.\n * @param activity id of activity that is being popped\n * @deprecated remove when @sentry/apm no longer used\n */\n\n\nfunction popActivity(activity) {\n if (activity === null || globalTracingIntegration === null) {\n return;\n }\n\n globalTracingIntegration.constructor.popActivity(activity);\n}\n/**\n * Obtain a span given an activity id.\n * Is a no-op if Tracing integration is not valid.\n * @param activity activity id associated with obtained span\n * @deprecated remove when @sentry/apm no longer used\n */\n\n\nfunction getActivitySpan(activity) {\n if (activity === null || globalTracingIntegration === null) {\n return undefined;\n }\n\n return globalTracingIntegration.constructor.getActivitySpan(activity);\n}\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\n\n\nvar Profiler =\n/** @class */\nfunction (_super) {\n node_modules_tslib_tslib_es6_extends(Profiler, _super);\n\n function Profiler(props) {\n var _this = _super.call(this, props) || this;\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n\n\n _this._mountSpan = undefined; // The activity representing how long it takes to mount a component.\n\n _this._mountActivity = null;\n var _a = _this.props,\n name = _a.name,\n _b = _a.disabled,\n disabled = _b === void 0 ? false : _b;\n\n if (disabled) {\n return _this;\n } // If they are using @sentry/apm, we need to push/pop activities\n // eslint-disable-next-line deprecation/deprecation\n\n\n if (getTracingIntegration()) {\n // eslint-disable-next-line deprecation/deprecation\n _this._mountActivity = pushActivity(name, 'mount');\n } else {\n var activeTransaction = getActiveTransaction();\n\n if (activeTransaction) {\n _this._mountSpan = activeTransaction.startChild({\n description: \"<\" + name + \">\",\n op: 'react.mount'\n });\n }\n }\n\n return _this;\n } // If a component mounted, we can finish the mount activity.\n\n\n Profiler.prototype.componentDidMount = function () {\n if (this._mountSpan) {\n this._mountSpan.finish();\n } else {\n // eslint-disable-next-line deprecation/deprecation\n this._mountSpan = getActivitySpan(this._mountActivity); // eslint-disable-next-line deprecation/deprecation\n\n popActivity(this._mountActivity);\n this._mountActivity = null;\n }\n };\n\n Profiler.prototype.componentDidUpdate = function (_a) {\n var _this = this;\n\n var updateProps = _a.updateProps,\n _b = _a.includeUpdates,\n includeUpdates = _b === void 0 ? true : _b; // Only generate an update span if hasUpdateSpan is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n var changedProps = Object.keys(updateProps).filter(function (k) {\n return updateProps[k] !== _this.props.updateProps[k];\n });\n\n if (changedProps.length > 0) {\n // The update span is a point in time span with 0 duration, just signifying that the component\n // has been updated.\n var now = (0,time/* timestampWithMs */._I)();\n\n this._mountSpan.startChild({\n data: {\n changedProps: changedProps\n },\n description: \"<\" + this.props.name + \">\",\n endTimestamp: now,\n op: \"react.update\",\n startTimestamp: now\n });\n }\n }\n }; // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n\n\n Profiler.prototype.componentWillUnmount = function () {\n var _a = this.props,\n name = _a.name,\n _b = _a.includeRender,\n includeRender = _b === void 0 ? true : _b;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: \"<\" + name + \">\",\n endTimestamp: (0,time/* timestampWithMs */._I)(),\n op: \"react.render\",\n startTimestamp: this._mountSpan.endTimestamp\n });\n }\n };\n\n Profiler.prototype.render = function () {\n return this.props.children;\n }; // eslint-disable-next-line @typescript-eslint/member-ordering\n\n\n Profiler.defaultProps = {\n disabled: false,\n includeRender: true,\n includeUpdates: true\n };\n return Profiler;\n}(react.Component);\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\n\n\nfunction withProfiler(WrappedComponent, // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\noptions) {\n var componentDisplayName = options && options.name || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n var Wrapped = function Wrapped(props) {\n return react.createElement(Profiler, node_modules_tslib_tslib_es6_assign({}, options, {\n name: componentDisplayName,\n updateProps: props\n }), react.createElement(WrappedComponent, node_modules_tslib_tslib_es6_assign({}, props)));\n };\n\n Wrapped.displayName = \"profiler(\" + componentDisplayName + \")\"; // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n\n hoist_non_react_statics_cjs_default()(Wrapped, WrappedComponent);\n return Wrapped;\n}\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\n\n\nfunction useProfiler(name, options) {\n if (options === void 0) {\n options = {\n disabled: false,\n hasRenderSpan: true\n };\n }\n\n var _a = node_modules_tslib_tslib_es6_read(react.useState(function () {\n if (options && options.disabled) {\n return undefined;\n }\n\n var activeTransaction = getActiveTransaction();\n\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: \"<\" + name + \">\",\n op: 'react.mount'\n });\n }\n\n return undefined;\n }), 1),\n mountSpan = _a[0];\n\n react.useEffect(function () {\n if (mountSpan) {\n mountSpan.finish();\n }\n\n return function () {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: \"<\" + name + \">\",\n endTimestamp: (0,time/* timestampWithMs */._I)(),\n op: \"react.render\",\n startTimestamp: mountSpan.endTimestamp\n });\n }\n }; // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\n\n/** Grabs active transaction off scope */\n\nfunction getActiveTransaction(hub) {\n if (hub === void 0) {\n hub = (0,esm_hub/* getCurrentHub */.Gd)();\n }\n\n if (hub) {\n var scope = hub.getScope();\n\n if (scope) {\n return scope.getTransaction();\n }\n }\n\n return undefined;\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/errorboundary.js\n\n\n\n\n\nvar reactVersion = (0,misc/* parseSemver */.J4)(react.version);\nvar errorboundary_UNKNOWN_COMPONENT = 'unknown';\nvar INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null\n};\n/**\n * Logs react error boundary errors to Sentry. If on React version >= 17, creates stack trace\n * from componentStack param, otherwise relies on error param for stacktrace.\n *\n * @param error An error captured by React Error Boundary\n * @param componentStack The component stacktrace\n */\n\nfunction captureReactErrorBoundaryError(error, componentStack) {\n var errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = \"React ErrorBoundary \" + errorBoundaryError.name;\n errorBoundaryError.stack = componentStack;\n var errorBoundaryEvent = {};\n void eventFromException({}, errorBoundaryError).then(function (e) {\n errorBoundaryEvent = e;\n });\n\n if (errorBoundaryEvent.exception && Array.isArray(errorBoundaryEvent.exception.values) && reactVersion.major && reactVersion.major >= 17) {\n var originalEvent_1 = {};\n void eventFromException({}, error).then(function (e) {\n originalEvent_1 = e;\n });\n\n if (originalEvent_1.exception && Array.isArray(originalEvent_1.exception.values)) {\n originalEvent_1.exception.values = react_node_modules_tslib_tslib_es6_spread(errorBoundaryEvent.exception.values, originalEvent_1.exception.values);\n }\n\n return captureEvent(originalEvent_1);\n }\n\n return captureException(error, {\n contexts: {\n react: {\n componentStack: componentStack\n }\n }\n });\n}\n/**\n * A ErrorBoundary component that logs errors to Sentry. Requires React >= 16.\n * NOTE: If you are a Sentry user, and you are seeing this stack frame, it means the\n * Sentry React SDK ErrorBoundary caught an error invoking your application code. This\n * is expected behavior and NOT indicative of a bug with the Sentry React SDK.\n */\n\n\nvar ErrorBoundary =\n/** @class */\nfunction (_super) {\n node_modules_tslib_tslib_es6_extends(ErrorBoundary, _super);\n\n function ErrorBoundary() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.state = INITIAL_STATE;\n\n _this.resetErrorBoundary = function () {\n var onReset = _this.props.onReset;\n var _a = _this.state,\n error = _a.error,\n componentStack = _a.componentStack,\n eventId = _a.eventId;\n\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n\n _this.setState(INITIAL_STATE);\n };\n\n return _this;\n }\n\n ErrorBoundary.prototype.componentDidCatch = function (error, _a) {\n var _this = this;\n\n var componentStack = _a.componentStack;\n var _b = this.props,\n beforeCapture = _b.beforeCapture,\n onError = _b.onError,\n showDialog = _b.showDialog,\n dialogOptions = _b.dialogOptions;\n withScope(function (scope) {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n var eventId = captureReactErrorBoundaryError(error, componentStack);\n\n if (onError) {\n onError(error, componentStack, eventId);\n }\n\n if (showDialog) {\n showReportDialog(node_modules_tslib_tslib_es6_assign(node_modules_tslib_tslib_es6_assign({}, dialogOptions), {\n eventId: eventId\n }));\n } // componentDidCatch is used over getDerivedStateFromError\n // so that componentStack is accessible through state.\n\n\n _this.setState({\n error: error,\n componentStack: componentStack,\n eventId: eventId\n });\n });\n };\n\n ErrorBoundary.prototype.componentDidMount = function () {\n var onMount = this.props.onMount;\n\n if (onMount) {\n onMount();\n }\n };\n\n ErrorBoundary.prototype.componentWillUnmount = function () {\n var _a = this.state,\n error = _a.error,\n componentStack = _a.componentStack,\n eventId = _a.eventId;\n var onUnmount = this.props.onUnmount;\n\n if (onUnmount) {\n onUnmount(error, componentStack, eventId);\n }\n };\n\n ErrorBoundary.prototype.render = function () {\n var _a = this.props,\n fallback = _a.fallback,\n children = _a.children;\n var _b = this.state,\n error = _b.error,\n componentStack = _b.componentStack,\n eventId = _b.eventId;\n\n if (error) {\n var element = undefined;\n\n if (typeof fallback === 'function') {\n element = fallback({\n error: error,\n componentStack: componentStack,\n resetError: this.resetErrorBoundary,\n eventId: eventId\n });\n } else {\n element = fallback;\n }\n\n if (react.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n logger/* logger.warn */.k.warn('fallback did not produce a valid ReactElement');\n } // Fail gracefully if no fallback provided or is not valid\n\n\n return null;\n }\n\n if (typeof children === 'function') {\n return children();\n }\n\n return children;\n };\n\n return ErrorBoundary;\n}(react.Component); // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\nfunction withErrorBoundary(WrappedComponent, errorBoundaryOptions) {\n var componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || errorboundary_UNKNOWN_COMPONENT;\n\n var Wrapped = function Wrapped(props) {\n return react.createElement(ErrorBoundary, node_modules_tslib_tslib_es6_assign({}, errorBoundaryOptions), react.createElement(WrappedComponent, node_modules_tslib_tslib_es6_assign({}, props)));\n };\n\n Wrapped.displayName = \"errorBoundary(\" + componentDisplayName + \")\"; // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n\n hoist_non_react_statics_cjs_default()(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/redux.js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nvar ACTION_BREADCRUMB_CATEGORY = 'redux.action';\nvar ACTION_BREADCRUMB_TYPE = 'info';\nvar STATE_CONTEXT_KEY = 'redux.state';\nvar defaultOptions = {\n actionTransformer: function actionTransformer(action) {\n return action;\n },\n stateTransformer: function stateTransformer(state) {\n return state || null;\n }\n};\n/**\n * Creates an enhancer that would be passed to Redux's createStore to log actions and the latest state to Sentry.\n *\n * @param enhancerOptions Options to pass to the enhancer\n */\n\nfunction createReduxEnhancer(enhancerOptions) {\n // Note: We return an any type as to not have type conflicts.\n var options = node_modules_tslib_tslib_es6_assign(node_modules_tslib_tslib_es6_assign({}, defaultOptions), enhancerOptions);\n\n return function (next) {\n return function (reducer, initialState) {\n var sentryReducer = function sentryReducer(state, action) {\n var newState = reducer(state, action);\n configureScope(function (scope) {\n /* Action breadcrumbs */\n var transformedAction = options.actionTransformer(action);\n\n if (typeof transformedAction !== 'undefined' && transformedAction !== null) {\n scope.addBreadcrumb({\n category: ACTION_BREADCRUMB_CATEGORY,\n data: transformedAction,\n type: ACTION_BREADCRUMB_TYPE\n });\n }\n /* Set latest state to scope */\n\n\n var transformedState = options.stateTransformer(newState);\n\n if (typeof transformedState !== 'undefined' && transformedState !== null) {\n scope.setContext(STATE_CONTEXT_KEY, transformedState);\n } else {\n scope.setContext(STATE_CONTEXT_KEY, null);\n }\n /* Allow user to configure scope with latest state */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n var configureScopeWithState = options.configureScopeWithState;\n\n if (typeof configureScopeWithState === 'function') {\n configureScopeWithState(scope, newState);\n }\n });\n return newState;\n };\n\n return next(sentryReducer, initialState);\n };\n };\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/reactrouterv3.js\n\nvar reactrouterv3_global = (0,misc/* getGlobalObject */.Rf)();\n/**\n * Creates routing instrumentation for React Router v3\n * Works for React Router >= 3.2.0 and < 4.0.0\n *\n * @param history object from the `history` library\n * @param routes a list of all routes, should be\n * @param match `Router.match` utility\n */\n\nfunction reactRouterV3Instrumentation(history, routes, match) {\n return function (startTransaction, startTransactionOnPageLoad, startTransactionOnLocationChange) {\n if (startTransactionOnPageLoad === void 0) {\n startTransactionOnPageLoad = true;\n }\n\n if (startTransactionOnLocationChange === void 0) {\n startTransactionOnLocationChange = true;\n }\n\n var activeTransaction;\n var prevName; // Have to use global.location because history.location might not be defined.\n\n if (startTransactionOnPageLoad && reactrouterv3_global && reactrouterv3_global.location) {\n normalizeTransactionName(routes, reactrouterv3_global.location, match, function (localName) {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'pageload',\n tags: {\n 'routing.instrumentation': 'react-router-v3'\n }\n });\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(function (location) {\n if (location.action === 'PUSH' || location.action === 'POP') {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n var tags_1 = {\n 'routing.instrumentation': 'react-router-v3'\n };\n\n if (prevName) {\n tags_1.from = prevName;\n }\n\n normalizeTransactionName(routes, location, match, function (localName) {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'navigation',\n tags: tags_1\n });\n });\n }\n });\n }\n };\n}\n/**\n * Normalize transaction names using `Router.match`\n */\n\nfunction normalizeTransactionName(appRoutes, location, match, callback) {\n var name = location.pathname;\n match({\n location: location,\n routes: appRoutes\n }, function (error, _redirectLocation, renderProps) {\n if (error || !renderProps) {\n return callback(name);\n }\n\n var routePath = getRouteStringFromRoutes(renderProps.routes || []);\n\n if (routePath.length === 0 || routePath === '/*') {\n return callback(name);\n }\n\n name = routePath;\n return callback(name);\n });\n}\n/**\n * Generate route name from array of routes\n */\n\n\nfunction getRouteStringFromRoutes(routes) {\n if (!Array.isArray(routes) || routes.length === 0) {\n return '';\n }\n\n var routesWithPaths = routes.filter(function (route) {\n return !!route.path;\n });\n var index = -1;\n\n for (var x = routesWithPaths.length - 1; x >= 0; x--) {\n var route = routesWithPaths[x];\n\n if (route.path && route.path.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths.slice(index).filter(function (_a) {\n var path = _a.path;\n return !!path;\n }).map(function (_a) {\n var path = _a.path;\n return path;\n }).join('');\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/reactrouter.js\n\n\n\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nvar reactrouter_global = (0,misc/* getGlobalObject */.Rf)();\nvar activeTransaction;\nfunction reactRouterV4Instrumentation(history, routes, matchPath) {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\nfunction reactRouterV5Instrumentation(history, routes, matchPath) {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(history, name, allRoutes, matchPath) {\n if (allRoutes === void 0) {\n allRoutes = [];\n }\n\n function getInitPathName() {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (reactrouter_global && reactrouter_global.location) {\n return reactrouter_global.location.pathname;\n }\n\n return undefined;\n }\n\n function getTransactionName(pathname) {\n if (allRoutes.length === 0 || !matchPath) {\n return pathname;\n }\n\n var branches = matchRoutes(allRoutes, pathname, matchPath); // eslint-disable-next-line @typescript-eslint/prefer-for-of\n\n for (var x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return branches[x].match.path;\n }\n }\n\n return pathname;\n }\n\n return function (customStartTransaction, startTransactionOnPageLoad, startTransactionOnLocationChange) {\n if (startTransactionOnPageLoad === void 0) {\n startTransactionOnPageLoad = true;\n }\n\n if (startTransactionOnLocationChange === void 0) {\n startTransactionOnLocationChange = true;\n }\n\n var initPathName = getInitPathName();\n\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: getTransactionName(initPathName),\n op: 'pageload',\n tags: {\n 'routing.instrumentation': name\n }\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(function (location, action) {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n var tags = {\n 'routing.instrumentation': name\n };\n activeTransaction = customStartTransaction({\n name: getTransactionName(location.pathname),\n op: 'navigation',\n tags: tags\n });\n }\n });\n }\n };\n}\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\n\n\nfunction matchRoutes(routes, pathname, matchPath, branch) {\n if (branch === void 0) {\n branch = [];\n }\n\n routes.some(function (route) {\n var match = route.path ? matchPath(pathname, route) : branch.length ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({\n route: route,\n match: match\n });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n return branch;\n}\n\nfunction computeRootMatch(pathname) {\n return {\n path: '/',\n url: '/',\n params: {},\n isExact: pathname === '/'\n };\n}\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nfunction withSentryRouting(Route) {\n var componentDisplayName = Route.displayName || Route.name;\n\n var WrappedRoute = function WrappedRoute(props) {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path);\n } // @ts-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n\n\n return react.createElement(Route, node_modules_tslib_tslib_es6_assign({}, props));\n };\n\n WrappedRoute.displayName = \"sentryRoute(\" + componentDisplayName + \")\";\n hoist_non_react_statics_cjs_default()(WrappedRoute, Route); // @ts-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/index.js\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcz9hYTE3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvZXNtL3NldmVyaXR5LmpzP2IyMTciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vc3RhdHVzLmpzPzk3OTEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/NmIyNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L21pbmltYWwvZXNtL2luZGV4LmpzPzE2MzQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS92ZXJzaW9uLmpzPzM0OGYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/MTk0YiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9wb2x5ZmlsbC5qcz84M2JjIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2Vycm9yLmpzP2E4ODIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vZHNuLmpzP2E4YzIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9pbnRlZ3JhdGlvbi5qcz84YmM4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vYmFzZWNsaWVudC5qcz8zYTFiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vdHJhbnNwb3J0cy9ub29wLmpzPzM3NDkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlYmFja2VuZC5qcz9iMDVmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhY2VraXQuanM/MjY2MCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3BhcnNlcnMuanM/Yzc1NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2V2ZW50YnVpbGRlci5qcz9hODIwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vcmVxdWVzdC5qcz9iZGZkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vYXBpLmpzPzM2YjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcHJvbWlzZWJ1ZmZlci5qcz8yMmQ2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9iYXNlLmpzPzc1MmIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS90cmFuc3BvcnRzL2ZldGNoLmpzP2Q0Y2MiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS90cmFuc3BvcnRzL3hoci5qcz8yY2M0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vYmFja2VuZC5qcz9lNjZkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaGVscGVycy5qcz9kMjRhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL2JyZWFkY3J1bWJzLmpzPzdkYjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9jbGllbnQuanM/MTQ5MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL3Nkay5qcz84ODg4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vaW50ZWdyYXRpb25zL2luYm91bmRmaWx0ZXJzLmpzP2E1MWIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9pbnRlZ3JhdGlvbnMvZnVuY3Rpb250b3N0cmluZy5qcz8zMjQwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL3RyeWNhdGNoLmpzPzhiMmUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9pbnRlZ3JhdGlvbnMvZ2xvYmFsaGFuZGxlcnMuanM/ZjUwOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMuanM/MjUyYSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9kZWR1cGUuanM/NTFkYSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy91c2VyYWdlbnQuanM/MzZlYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3Nkay5qcz9lZDI3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdmVyc2lvbi5qcz8xOTUxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vZXhwb3J0cy5qcz9lNDY3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vaW50ZWdyYXRpb25zL2luZGV4LmpzPzE5ZjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9pbnRlZ3JhdGlvbnMvaW5kZXguanM/YTRmMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3RyYW5zcG9ydHMvaW5kZXguanM/N2E4MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2luZGV4LmpzP2VkMzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9yZWFjdC9lc20vc2RrLmpzPzNiN2QiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9yZWFjdC9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzPzZhM2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9yZWFjdC9lc20vcHJvZmlsZXIuanM/ZGNjNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3JlYWN0L2VzbS9lcnJvcmJvdW5kYXJ5LmpzPzg5ZDUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9yZWFjdC9lc20vcmVkdXguanM/NjM3ZiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3JlYWN0L2VzbS9yZWFjdHJvdXRlcnYzLmpzP2NlYmIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9yZWFjdC9lc20vcmVhY3Ryb3V0ZXIuanM/ZDQ2NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3JlYWN0L2VzbS9pbmRleC5qcz85M2M1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFD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QUFhLGtCQUFNO0FBQ25COztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0RBQStEOztBQUUvRCxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBLFdBQVcsbUJBQW1CLFFBQVEsbUNBQVEsR0FBRztBQUNqRDs7QUFFQTtBQUNBLEVBQUUscUNBQW9CLHNCQUFzQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxzRDs7QUN4SmdDO0FBQ0g7QUFDb0M7QUFDRTtBQUNyQjtBQUNpQiIsImZpbGUiOiI3MDY2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cbnZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgX19wcm90b19fOiBbXVxuICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBkLl9fcHJvdG9fXyA9IGI7XG4gIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICB9XG5cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG52YXIgX2Fzc2lnbiA9IGZ1bmN0aW9uIF9fYXNzaWduKCkge1xuICBfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydCB7IF9hc3NpZ24gYXMgX19hc3NpZ24gfTtcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsXG4gICAgICBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO2Vsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICB9XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0ge1xuICAgIGxhYmVsOiAwLFxuICAgIHNlbnQ6IGZ1bmN0aW9uIHNlbnQoKSB7XG4gICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICByZXR1cm4gdFsxXTtcbiAgICB9LFxuICAgIHRyeXM6IFtdLFxuICAgIG9wczogW11cbiAgfSxcbiAgICAgIGYsXG4gICAgICB5LFxuICAgICAgdCxcbiAgICAgIGc7XG4gIHJldHVybiBnID0ge1xuICAgIG5leHQ6IHZlcmIoMCksXG4gICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcblxuICAgIHdoaWxlIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcblxuICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgIG9wID0gWzBdO1xuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuXG4gICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb3AgPSBbNiwgZV07XG4gICAgICAgIHkgPSAwO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgIGRvbmU6IHRydWVcbiAgICB9O1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVCaW5kaW5nKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xuICBmb3IgKHZhciBwIGluIG0pIHtcbiAgICBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsXG4gICAgICBtID0gcyAmJiBvW3NdLFxuICAgICAgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgIGRvbmU6ICFvXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICByLFxuICAgICAgYXIgPSBbXSxcbiAgICAgIGU7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkge1xuICAgICAgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIH1cblxuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspIHtcbiAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKykge1xuICAgICAgcltrXSA9IGFbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHI7XG59XG47XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLFxuICAgICAgaSxcbiAgICAgIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHtcbiAgICB0cnkge1xuICAgICAgc3RlcChnW25dKHYpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXR0bGUocVswXVszXSwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RlcChyKSB7XG4gICAgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7XG4gIH1cblxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHtcbiAgICByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikge1xuICAgIGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICB0aHJvdyBlO1xuICB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobiwgZikge1xuICAgIGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiAocCA9ICFwKSA/IHtcbiAgICAgICAgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksXG4gICAgICAgIGRvbmU6IG4gPT09IFwicmV0dXJuXCJcbiAgICAgIH0gOiBmID8gZih2KSA6IHY7XG4gICAgfSA6IGY7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSxcbiAgICAgIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGkpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgZG9uZTogZFxuICAgICAgfSk7XG4gICAgfSwgcmVqZWN0KTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7XG4gICAgICB2YWx1ZTogcmF3XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29va2VkLnJhdyA9IHJhdztcbiAgfVxuXG4gIHJldHVybiBjb29rZWQ7XG59XG47XG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICB9XG4gIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHtcbiAgICBkZWZhdWx0OiBtb2RcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59IiwiLyoqIEpTRG9jICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IHZhciBTZXZlcml0eTtcblxuKGZ1bmN0aW9uIChTZXZlcml0eSkge1xuICAvKiogSlNEb2MgKi9cbiAgU2V2ZXJpdHlbXCJGYXRhbFwiXSA9IFwiZmF0YWxcIjtcbiAgLyoqIEpTRG9jICovXG5cbiAgU2V2ZXJpdHlbXCJFcnJvclwiXSA9IFwiZXJyb3JcIjtcbiAgLyoqIEpTRG9jICovXG5cbiAgU2V2ZXJpdHlbXCJXYXJuaW5nXCJdID0gXCJ3YXJuaW5nXCI7XG4gIC8qKiBKU0RvYyAqL1xuXG4gIFNldmVyaXR5W1wiTG9nXCJdID0gXCJsb2dcIjtcbiAgLyoqIEpTRG9jICovXG5cbiAgU2V2ZXJpdHlbXCJJbmZvXCJdID0gXCJpbmZvXCI7XG4gIC8qKiBKU0RvYyAqL1xuXG4gIFNldmVyaXR5W1wiRGVidWdcIl0gPSBcImRlYnVnXCI7XG4gIC8qKiBKU0RvYyAqL1xuXG4gIFNldmVyaXR5W1wiQ3JpdGljYWxcIl0gPSBcImNyaXRpY2FsXCI7XG59KShTZXZlcml0eSB8fCAoU2V2ZXJpdHkgPSB7fSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSwgaW1wb3J0L2V4cG9ydFxuXG5cbihmdW5jdGlvbiAoU2V2ZXJpdHkpIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgc3RyaW5nLWJhc2VkIGxldmVsIGludG8gYSB7QGxpbmsgU2V2ZXJpdHl9LlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFNldmVyaXR5XG4gICAqIEByZXR1cm5zIFNldmVyaXR5XG4gICAqL1xuICBmdW5jdGlvbiBmcm9tU3RyaW5nKGxldmVsKSB7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZGVidWcnOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRGVidWc7XG5cbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuSW5mbztcblxuICAgICAgY2FzZSAnd2Fybic6XG4gICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5Lldhcm5pbmc7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5LkVycm9yO1xuXG4gICAgICBjYXNlICdmYXRhbCc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5GYXRhbDtcblxuICAgICAgY2FzZSAnY3JpdGljYWwnOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuQ3JpdGljYWw7XG5cbiAgICAgIGNhc2UgJ2xvZyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuTG9nO1xuICAgIH1cbiAgfVxuXG4gIFNldmVyaXR5LmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xufSkoU2V2ZXJpdHkgfHwgKFNldmVyaXR5ID0ge30pKTsiLCIvKiogVGhlIHN0YXR1cyBvZiBhbiBldmVudC4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvZXhwb3J0XG5leHBvcnQgdmFyIFN0YXR1cztcblxuKGZ1bmN0aW9uIChTdGF0dXMpIHtcbiAgLyoqIFRoZSBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICovXG4gIFN0YXR1c1tcIlVua25vd25cIl0gPSBcInVua25vd25cIjtcbiAgLyoqIFRoZSBldmVudCB3YXMgc2tpcHBlZCBkdWUgdG8gY29uZmlndXJhdGlvbiBvciBjYWxsYmFja3MuICovXG5cbiAgU3RhdHVzW1wiU2tpcHBlZFwiXSA9IFwic2tpcHBlZFwiO1xuICAvKiogVGhlIGV2ZW50IHdhcyBzZW50IHRvIFNlbnRyeSBzdWNjZXNzZnVsbHkuICovXG5cbiAgU3RhdHVzW1wiU3VjY2Vzc1wiXSA9IFwic3VjY2Vzc1wiO1xuICAvKiogVGhlIGNsaWVudCBpcyBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkIGFuZCB3aWxsIHRyeSBhZ2FpbiBsYXRlci4gKi9cblxuICBTdGF0dXNbXCJSYXRlTGltaXRcIl0gPSBcInJhdGVfbGltaXRcIjtcbiAgLyoqIFRoZSBldmVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiAqL1xuXG4gIFN0YXR1c1tcIkludmFsaWRcIl0gPSBcImludmFsaWRcIjtcbiAgLyoqIEEgc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN1Ym1pc3Npb24uICovXG5cbiAgU3RhdHVzW1wiRmFpbGVkXCJdID0gXCJmYWlsZWRcIjtcbn0pKFN0YXR1cyB8fCAoU3RhdHVzID0ge30pKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UsIGltcG9ydC9leHBvcnRcblxuXG4oZnVuY3Rpb24gKFN0YXR1cykge1xuICAvKipcbiAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYSB7QGxpbmsgU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzZW5kIHN0YXR1cyBvciB7QGxpbmsgU3RhdHVzLlVua25vd259LlxuICAgKi9cbiAgZnVuY3Rpb24gZnJvbUh0dHBDb2RlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCkge1xuICAgICAgcmV0dXJuIFN0YXR1cy5TdWNjZXNzO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0MjkpIHtcbiAgICAgIHJldHVybiBTdGF0dXMuUmF0ZUxpbWl0O1xuICAgIH1cblxuICAgIGlmIChjb2RlID49IDQwMCAmJiBjb2RlIDwgNTAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLkludmFsaWQ7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLkZhaWxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RhdHVzLlVua25vd247XG4gIH1cblxuICBTdGF0dXMuZnJvbUh0dHBDb2RlID0gZnJvbUh0dHBDb2RlO1xufSkoU3RhdHVzIHx8IChTdGF0dXMgPSB7fSkpOyIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXG52YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgIF9fcHJvdG9fXzogW11cbiAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZC5fX3Byb3RvX18gPSBiO1xuICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgfVxuXG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxudmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgeyBfYXNzaWduIGFzIF9fYXNzaWduIH07XG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLFxuICAgICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgfVxuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHtcbiAgICBsYWJlbDogMCxcbiAgICBzZW50OiBmdW5jdGlvbiBzZW50KCkge1xuICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgcmV0dXJuIHRbMV07XG4gICAgfSxcbiAgICB0cnlzOiBbXSxcbiAgICBvcHM6IFtdXG4gIH0sXG4gICAgICBmLFxuICAgICAgeSxcbiAgICAgIHQsXG4gICAgICBnO1xuICByZXR1cm4gZyA9IHtcbiAgICBuZXh0OiB2ZXJiKDApLFxuICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZztcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBzdGVwKFtuLCB2XSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG5cbiAgICB3aGlsZSAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG5cbiAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICBvcCA9IFswXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcblxuICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgICB5ID0gMDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGYgPSB0ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICBkb25lOiB0cnVlXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59XG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcbiAgZm9yICh2YXIgcCBpbiBtKSB7XG4gICAgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgbSA9IHMgJiYgb1tzXSxcbiAgICAgIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG8gJiYgb1tpKytdLFxuICAgICAgICBkb25lOiAhb1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHtcbiAgICAgIHJba10gPSBhW2pdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSxcbiAgICAgIGksXG4gICAgICBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAocikge1xuICAgIHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJlc3VtZShcIm5leHRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHtcbiAgICBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgdGhyb3cgZTtcbiAgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHtcbiAgICBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gKHAgPSAhcCkgPyB7XG4gICAgICAgIHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLFxuICAgICAgICBkb25lOiBuID09PSBcInJldHVyblwiXG4gICAgICB9IDogZiA/IGYodikgOiB2O1xuICAgIH0gOiBmO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sXG4gICAgICBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpKTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikge1xuICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIGRvbmU6IGRcbiAgICAgIH0pO1xuICAgIH0sIHJlamVjdCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwge1xuICAgICAgdmFsdWU6IHJhd1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvb2tlZC5yYXcgPSByYXc7XG4gIH1cblxuICByZXR1cm4gY29va2VkO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgfVxuICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuLyoqXG4gKiBUaGlzIGNhbGxzIGEgZnVuY3Rpb24gb24gdGhlIGN1cnJlbnQgaHViLlxuICogQHBhcmFtIG1ldGhvZCBmdW5jdGlvbiB0byBjYWxsIG9uIGh1Yi5cbiAqIEBwYXJhbSBhcmdzIHRvIHBhc3MgdG8gZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbmZ1bmN0aW9uIGNhbGxPbkh1YihtZXRob2QpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICB2YXIgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gIGlmIChodWIgJiYgaHViW21ldGhvZF0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiBodWJbbWV0aG9kXS5hcHBseShodWIsIF9fc3ByZWFkKGFyZ3MpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIk5vIGh1YiBkZWZpbmVkIG9yIFwiICsgbWV0aG9kICsgXCIgd2FzIG5vdCBmb3VuZCBvbiB0aGUgaHViLCBwbGVhc2Ugb3BlbiBhIGJ1ZyByZXBvcnQuXCIpO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhbiBleGNlcHRpb24gZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZXhjZXB0aW9uIEFuIGV4Y2VwdGlvbi1saWtlIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgZXZlbnRJZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcblxuXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb24sIGNhcHR1cmVDb250ZXh0KSB7XG4gIHZhciBzeW50aGV0aWNFeGNlcHRpb247XG5cbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICB9XG5cbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV4Y2VwdGlvbicsIGV4Y2VwdGlvbiwge1xuICAgIGNhcHR1cmVDb250ZXh0OiBjYXB0dXJlQ29udGV4dCxcbiAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXhjZXB0aW9uLFxuICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uXG4gIH0pO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhIG1lc3NhZ2UgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIFNlbnRyeS5cbiAqIEBwYXJhbSBsZXZlbCBEZWZpbmUgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlTWVzc2FnZShtZXNzYWdlLCBjYXB0dXJlQ29udGV4dCkge1xuICB2YXIgc3ludGhldGljRXhjZXB0aW9uO1xuXG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gIH0gLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJvdmlkZSBleHBsaWNpdCBzY29wZXMgdXBncmFkZSwgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JpZ2luYWxcbiAgLy8gYXJpdHkgb2YgdGhlIGBjYXB0dXJlTWVzc2FnZShtZXNzYWdlLCBsZXZlbClgIG1ldGhvZC5cblxuXG4gIHZhciBsZXZlbCA9IHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ3N0cmluZycgPyBjYXB0dXJlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvbnRleHQgPSB0eXBlb2YgY2FwdHVyZUNvbnRleHQgIT09ICdzdHJpbmcnID8ge1xuICAgIGNhcHR1cmVDb250ZXh0OiBjYXB0dXJlQ29udGV4dFxuICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gY2FsbE9uSHViKCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCBfX2Fzc2lnbih7XG4gICAgb3JpZ2luYWxFeGNlcHRpb246IG1lc3NhZ2UsXG4gICAgc3ludGhldGljRXhjZXB0aW9uOiBzeW50aGV0aWNFeGNlcHRpb25cbiAgfSwgY29udGV4dCkpO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhIG1hbnVhbGx5IGNyZWF0ZWQgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQgdG8gU2VudHJ5LlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV2ZW50JywgZXZlbnQpO1xufVxuLyoqXG4gKiBDYWxsYmFjayB0byBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvbnRvIHRoZSBzY29wZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIFNjb3BlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTY29wZShjYWxsYmFjaykge1xuICBjYWxsT25IdWIoJ2NvbmZpZ3VyZVNjb3BlJywgY2FsbGJhY2spO1xufVxuLyoqXG4gKiBSZWNvcmRzIGEgbmV3IGJyZWFkY3J1bWIgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEJyZWFkY3J1bWJzIHdpbGwgYmUgYWRkZWQgdG8gc3Vic2VxdWVudCBldmVudHMgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQgb25cbiAqIHVzZXIncyBhY3Rpb25zIHByaW9yIHRvIGFuIGVycm9yIG9yIGNyYXNoLlxuICpcbiAqIEBwYXJhbSBicmVhZGNydW1iIFRoZSBicmVhZGNydW1iIHRvIHJlY29yZC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQnJlYWRjcnVtYihicmVhZGNydW1iKSB7XG4gIGNhbGxPbkh1YignYWRkQnJlYWRjcnVtYicsIGJyZWFkY3J1bWIpO1xufVxuLyoqXG4gKiBTZXRzIGNvbnRleHQgZGF0YSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICogQHBhcmFtIG5hbWUgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBjb250ZXh0IEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZXh0KG5hbWUsIGNvbnRleHQpIHtcbiAgY2FsbE9uSHViKCdzZXRDb250ZXh0JywgbmFtZSwgY29udGV4dCk7XG59XG4vKipcbiAqIFNldCBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gZXh0cmFzIEV4dHJhcyBvYmplY3QgdG8gbWVyZ2UgaW50byBjdXJyZW50IGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEV4dHJhcyhleHRyYXMpIHtcbiAgY2FsbE9uSHViKCdzZXRFeHRyYXMnLCBleHRyYXMpO1xufVxuLyoqXG4gKiBTZXQgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBtZXJnZWQgc2VudCBhcyB0YWdzIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gdGFncyBUYWdzIGNvbnRleHQgb2JqZWN0IHRvIG1lcmdlIGludG8gY3VycmVudCBjb250ZXh0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWdzKHRhZ3MpIHtcbiAgY2FsbE9uSHViKCdzZXRUYWdzJywgdGFncyk7XG59XG4vKipcbiAqIFNldCBrZXk6dmFsdWUgdGhhdCB3aWxsIGJlIHNlbnQgYXMgZXh0cmEgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBrZXkgU3RyaW5nIG9mIGV4dHJhXG4gKiBAcGFyYW0gZXh0cmEgQW55IGtpbmQgb2YgZGF0YS4gVGhpcyBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0cmEoa2V5LCBleHRyYSkge1xuICBjYWxsT25IdWIoJ3NldEV4dHJhJywga2V5LCBleHRyYSk7XG59XG4vKipcbiAqIFNldCBrZXk6dmFsdWUgdGhhdCB3aWxsIGJlIHNlbnQgYXMgdGFncyBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICpcbiAqIENhbiBhbHNvIGJlIHVzZWQgdG8gdW5zZXQgYSB0YWcsIGJ5IHBhc3NpbmcgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIGtleSBTdHJpbmcga2V5IG9mIHRhZ1xuICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRhZ1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWcoa2V5LCB2YWx1ZSkge1xuICBjYWxsT25IdWIoJ3NldFRhZycsIGtleSwgdmFsdWUpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHVzZXIgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0gdXNlciBVc2VyIGNvbnRleHQgb2JqZWN0IHRvIGJlIHNldCBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBQYXNzIGBudWxsYCB0byB1bnNldCB0aGUgdXNlci5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlcih1c2VyKSB7XG4gIGNhbGxPbkh1Yignc2V0VXNlcicsIHVzZXIpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNjb3BlIHdpdGggYW5kIGV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gd2l0aGluLlxuICogVGhlIHNjb3BlIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoZSBvcGVyYXRpb25cbiAqIGZpbmlzaGVzIG9yIHRocm93cy5cbiAqXG4gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yOlxuICpcbiAqICAgICBwdXNoU2NvcGUoKTtcbiAqICAgICBjYWxsYmFjaygpO1xuICogICAgIHBvcFNjb3BlKCk7XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBlbmNsb3NlZCBpbnRvIHB1c2gvcG9wU2NvcGUuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTY29wZShjYWxsYmFjaykge1xuICBjYWxsT25IdWIoJ3dpdGhTY29wZScsIGNhbGxiYWNrKTtcbn1cbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgbGF0ZXN0IGNsaWVudC4gVXNlIHRoaXMgd2l0aCBjYXV0aW9uLCBpdCdzIG1lYW50IGFzXG4gKiBpbiBcImludGVybmFsXCIgaGVscGVyIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwb3NlIGV2ZXJ5IHBvc3NpYmxlIGZ1bmN0aW9uIGluXG4gKiB0aGUgc2hpbS4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGFjdHVhbGx5IGltcGxlbWVudHMgdGhlXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgY2xpZW50L2NsaWVudC5cbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQvZm9udGVuZC5cbiAqIEBoaWRkZW5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuZXhwb3J0IGZ1bmN0aW9uIF9jYWxsT25DbGllbnQobWV0aG9kKSB7XG4gIHZhciBhcmdzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG5cbiAgY2FsbE9uSHViLmFwcGx5KHZvaWQgMCwgX19zcHJlYWQoWydfaW52b2tlQ2xpZW50JywgbWV0aG9kXSwgYXJncykpO1xufVxuLyoqXG4gKiBTdGFydHMgYSBuZXcgYFRyYW5zYWN0aW9uYCBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8gbWFudWFsIHRyYWNpbmcgaW5zdHJ1bWVudGF0aW9uLlxuICpcbiAqIEEgdHJlZSBzdHJ1Y3R1cmUgY2FuIGJlIGJ1aWx0IGJ5IGFkZGluZyBjaGlsZCBzcGFucyB0byB0aGUgdHJhbnNhY3Rpb24sIGFuZCBjaGlsZCBzcGFucyB0byBvdGhlciBzcGFucy4gVG8gc3RhcnQgYVxuICogbmV3IGNoaWxkIHNwYW4gd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBvciBhbnkgc3BhbiwgY2FsbCB0aGUgcmVzcGVjdGl2ZSBgLnN0YXJ0Q2hpbGQoKWAgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IGNoaWxkIHNwYW4gbXVzdCBiZSBmaW5pc2hlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLCBvdGhlcndpc2UgdGhlIHVuZmluaXNoZWQgc3BhbnMgYXJlIGRpc2NhcmRlZC5cbiAqXG4gKiBUaGUgdHJhbnNhY3Rpb24gbXVzdCBiZSBmaW5pc2hlZCB3aXRoIGEgY2FsbCB0byBpdHMgYC5maW5pc2goKWAgbWV0aG9kLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNhY3Rpb24gd2l0aCBhbGwgaXRzXG4gKiBmaW5pc2hlZCBjaGlsZCBzcGFucyB3aWxsIGJlIHNlbnQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IFByb3BlcnRpZXMgb2YgdGhlIG5ldyBgVHJhbnNhY3Rpb25gLlxuICogQHBhcmFtIGN1c3RvbVNhbXBsaW5nQ29udGV4dCBJbmZvcm1hdGlvbiBnaXZlbiB0byB0aGUgdHJhbnNhY3Rpb24gc2FtcGxpbmcgZnVuY3Rpb24gKGFsb25nIHdpdGggY29udGV4dC1kZXBlbmRlbnRcbiAqIGRlZmF1bHQgdmFsdWVzKS4gU2VlIHtAbGluayBPcHRpb25zLnRyYWNlc1NhbXBsZXJ9LlxuICpcbiAqIEByZXR1cm5zIFRoZSB0cmFuc2FjdGlvbiB3aGljaCB3YXMganVzdCBzdGFydGVkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oY29udGV4dCwgY3VzdG9tU2FtcGxpbmdDb250ZXh0KSB7XG4gIHJldHVybiBjYWxsT25IdWIoJ3N0YXJ0VHJhbnNhY3Rpb24nLCBfX2Fzc2lnbih7fSwgY29udGV4dCksIGN1c3RvbVNhbXBsaW5nQ29udGV4dCk7XG59IiwiZXhwb3J0IHZhciBTREtfVkVSU0lPTiA9ICc2LjEzLjInOyIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXG52YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgIF9fcHJvdG9fXzogW11cbiAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZC5fX3Byb3RvX18gPSBiO1xuICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgfVxuXG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxudmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgeyBfYXNzaWduIGFzIF9fYXNzaWduIH07XG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLFxuICAgICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgfVxuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHtcbiAgICBsYWJlbDogMCxcbiAgICBzZW50OiBmdW5jdGlvbiBzZW50KCkge1xuICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgcmV0dXJuIHRbMV07XG4gICAgfSxcbiAgICB0cnlzOiBbXSxcbiAgICBvcHM6IFtdXG4gIH0sXG4gICAgICBmLFxuICAgICAgeSxcbiAgICAgIHQsXG4gICAgICBnO1xuICByZXR1cm4gZyA9IHtcbiAgICBuZXh0OiB2ZXJiKDApLFxuICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZztcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBzdGVwKFtuLCB2XSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG5cbiAgICB3aGlsZSAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG5cbiAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICBvcCA9IFswXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcblxuICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgICB5ID0gMDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGYgPSB0ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICBkb25lOiB0cnVlXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59XG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcbiAgZm9yICh2YXIgcCBpbiBtKSB7XG4gICAgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgbSA9IHMgJiYgb1tzXSxcbiAgICAgIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG8gJiYgb1tpKytdLFxuICAgICAgICBkb25lOiAhb1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHtcbiAgICAgIHJba10gPSBhW2pdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSxcbiAgICAgIGksXG4gICAgICBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAocikge1xuICAgIHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJlc3VtZShcIm5leHRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHtcbiAgICBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgdGhyb3cgZTtcbiAgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHtcbiAgICBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gKHAgPSAhcCkgPyB7XG4gICAgICAgIHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLFxuICAgICAgICBkb25lOiBuID09PSBcInJldHVyblwiXG4gICAgICB9IDogZiA/IGYodikgOiB2O1xuICAgIH0gOiBmO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sXG4gICAgICBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpKTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikge1xuICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIGRvbmU6IGRcbiAgICAgIH0pO1xuICAgIH0sIHJlamVjdCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwge1xuICAgICAgdmFsdWU6IHJhd1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvb2tlZC5yYXcgPSByYXc7XG4gIH1cblxuICByZXR1cm4gY29va2VkO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgfVxuICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsImV4cG9ydCB2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKHtcbiAgX19wcm90b19fOiBbXVxufSBpbnN0YW5jZW9mIEFycmF5ID8gc2V0UHJvdG9PZiA6IG1peGluUHJvcGVydGllcyk7XG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIF9fcHJvdG9fX1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuXG5mdW5jdGlvbiBzZXRQcm90b09mKG9iaiwgcHJvdG8pIHtcbiAgLy8gQHRzLWlnbm9yZSBfX3Byb3RvX18gZG9lcyBub3QgZXhpc3Qgb24gb2JqXG4gIG9iai5fX3Byb3RvX18gPSBwcm90bztcbiAgcmV0dXJuIG9iajtcbn1cbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgbWl4aW5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcblxuXG5mdW5jdGlvbiBtaXhpblByb3BlcnRpZXMob2JqLCBwcm90bykge1xuICBmb3IgKHZhciBwcm9wIGluIHByb3RvKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIHR5cGVzY3JpcHQgY29tcGxhaW5zIGFib3V0IGluZGV4aW5nIHNvIHdlIHJlbW92ZVxuICAgICAgb2JqW3Byb3BdID0gcHJvdG9bcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn0iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHNldFByb3RvdHlwZU9mIH0gZnJvbSAnLi9wb2x5ZmlsbCc7XG4vKiogQW4gZXJyb3IgZW1pdHRlZCBieSBTZW50cnkgU0RLcyBhbmQgcmVsYXRlZCB1dGlsaXRpZXMuICovXG5cbnZhciBTZW50cnlFcnJvciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTZW50cnlFcnJvciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTZW50cnlFcnJvcihtZXNzYWdlKSB7XG4gICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcblxuICAgIF90aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIF90aGlzLm5hbWUgPSBfbmV3VGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFNlbnRyeUVycm9yO1xufShFcnJvcik7XG5cbmV4cG9ydCB7IFNlbnRyeUVycm9yIH07IiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTZW50cnlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHBhcnNlIGEgRHNuLiAqL1xuXG52YXIgRFNOX1JFR0VYID0gL14oPzooXFx3Kyk6KVxcL1xcLyg/OihcXHcrKSg/OjooXFx3KykpP0ApKFtcXHcuLV0rKSg/OjooXFxkKykpP1xcLyguKykvO1xuLyoqIEVycm9yIG1lc3NhZ2UgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnSW52YWxpZCBEc24nO1xuLyoqIFRoZSBTZW50cnkgRHNuLCBpZGVudGlmeWluZyBhIFNlbnRyeSBpbnN0YW5jZSBhbmQgcHJvamVjdC4gKi9cblxudmFyIERzbiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKiBDcmVhdGVzIGEgbmV3IERzbiBjb21wb25lbnQgKi9cbiAgZnVuY3Rpb24gRHNuKGZyb20pIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9mcm9tU3RyaW5nKGZyb20pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyhmcm9tKTtcbiAgICB9XG5cbiAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEc24uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCByZW5kZXIgdGhlIHB1YmxpYyByZXByZXNlbnRhdGlvbiB3aXRob3V0IHRoZSBwYXNzd29yZFxuICAgKiBjb21wb25lbnQuIFRvIGdldCB0aGUgZGVwcmVjYXRlZCBwcml2YXRlIHJlcHJlc2VudGF0aW9uLCBzZXQgYHdpdGhQYXNzd29yZGBcbiAgICogdG8gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIHdpdGhQYXNzd29yZCBXaGVuIHNldCB0byB0cnVlLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICovXG5cblxuICBEc24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKHdpdGhQYXNzd29yZCkge1xuICAgIGlmICh3aXRoUGFzc3dvcmQgPT09IHZvaWQgMCkge1xuICAgICAgd2l0aFBhc3N3b3JkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgaG9zdCA9IF9hLmhvc3QsXG4gICAgICAgIHBhdGggPSBfYS5wYXRoLFxuICAgICAgICBwYXNzID0gX2EucGFzcyxcbiAgICAgICAgcG9ydCA9IF9hLnBvcnQsXG4gICAgICAgIHByb2plY3RJZCA9IF9hLnByb2plY3RJZCxcbiAgICAgICAgcHJvdG9jb2wgPSBfYS5wcm90b2NvbCxcbiAgICAgICAgcHVibGljS2V5ID0gX2EucHVibGljS2V5O1xuXG4gICAgcmV0dXJuIHByb3RvY29sICsgXCI6Ly9cIiArIHB1YmxpY0tleSArICh3aXRoUGFzc3dvcmQgJiYgcGFzcyA/IFwiOlwiICsgcGFzcyA6ICcnKSArIChcIkBcIiArIGhvc3QgKyAocG9ydCA/IFwiOlwiICsgcG9ydCA6ICcnKSArIFwiL1wiICsgKHBhdGggPyBwYXRoICsgXCIvXCIgOiBwYXRoKSArIHByb2plY3RJZCk7XG4gIH07XG4gIC8qKiBQYXJzZXMgYSBzdHJpbmcgaW50byB0aGlzIERzbi4gKi9cblxuXG4gIERzbi5wcm90b3R5cGUuX2Zyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIG1hdGNoID0gRFNOX1JFR0VYLmV4ZWMoc3RyKTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFKTtcbiAgICB9XG5cbiAgICB2YXIgX2EgPSBfX3JlYWQobWF0Y2guc2xpY2UoMSksIDYpLFxuICAgICAgICBwcm90b2NvbCA9IF9hWzBdLFxuICAgICAgICBwdWJsaWNLZXkgPSBfYVsxXSxcbiAgICAgICAgX2IgPSBfYVsyXSxcbiAgICAgICAgcGFzcyA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLFxuICAgICAgICBob3N0ID0gX2FbM10sXG4gICAgICAgIF9jID0gX2FbNF0sXG4gICAgICAgIHBvcnQgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYyxcbiAgICAgICAgbGFzdFBhdGggPSBfYVs1XTtcblxuICAgIHZhciBwYXRoID0gJyc7XG4gICAgdmFyIHByb2plY3RJZCA9IGxhc3RQYXRoO1xuICAgIHZhciBzcGxpdCA9IHByb2plY3RJZC5zcGxpdCgnLycpO1xuXG4gICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHBhdGggPSBzcGxpdC5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgcHJvamVjdElkID0gc3BsaXQucG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2plY3RJZCkge1xuICAgICAgdmFyIHByb2plY3RNYXRjaCA9IHByb2plY3RJZC5tYXRjaCgvXlxcZCsvKTtcblxuICAgICAgaWYgKHByb2plY3RNYXRjaCkge1xuICAgICAgICBwcm9qZWN0SWQgPSBwcm9qZWN0TWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZnJvbUNvbXBvbmVudHMoe1xuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIHBhc3M6IHBhc3MsXG4gICAgICBwYXRoOiBwYXRoLFxuICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWQsXG4gICAgICBwb3J0OiBwb3J0LFxuICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgcHVibGljS2V5OiBwdWJsaWNLZXlcbiAgICB9KTtcbiAgfTtcbiAgLyoqIE1hcHMgRHNuIGNvbXBvbmVudHMgaW50byB0aGlzIGluc3RhbmNlLiAqL1xuXG5cbiAgRHNuLnByb3RvdHlwZS5fZnJvbUNvbXBvbmVudHMgPSBmdW5jdGlvbiAoY29tcG9uZW50cykge1xuICAgIC8vIFRPRE8gdGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFuZCBjYW4gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXG4gICAgaWYgKCd1c2VyJyBpbiBjb21wb25lbnRzICYmICEoJ3B1YmxpY0tleScgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIGNvbXBvbmVudHMucHVibGljS2V5ID0gY29tcG9uZW50cy51c2VyO1xuICAgIH1cblxuICAgIHRoaXMudXNlciA9IGNvbXBvbmVudHMucHVibGljS2V5IHx8ICcnO1xuICAgIHRoaXMucHJvdG9jb2wgPSBjb21wb25lbnRzLnByb3RvY29sO1xuICAgIHRoaXMucHVibGljS2V5ID0gY29tcG9uZW50cy5wdWJsaWNLZXkgfHwgJyc7XG4gICAgdGhpcy5wYXNzID0gY29tcG9uZW50cy5wYXNzIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGNvbXBvbmVudHMuaG9zdDtcbiAgICB0aGlzLnBvcnQgPSBjb21wb25lbnRzLnBvcnQgfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gY29tcG9uZW50cy5wYXRoIHx8ICcnO1xuICAgIHRoaXMucHJvamVjdElkID0gY29tcG9uZW50cy5wcm9qZWN0SWQ7XG4gIH07XG4gIC8qKiBWYWxpZGF0ZXMgdGhpcyBEc24gYW5kIHRocm93cyBvbiBlcnJvci4gKi9cblxuXG4gIERzbi5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBbJ3Byb3RvY29sJywgJ3B1YmxpY0tleScsICdob3N0JywgJ3Byb2plY3RJZCddLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgaWYgKCFfdGhpc1tjb21wb25lbnRdKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFICsgXCI6IFwiICsgY29tcG9uZW50ICsgXCIgbWlzc2luZ1wiKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5wcm9qZWN0SWQubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSArIFwiOiBJbnZhbGlkIHByb2plY3RJZCBcIiArIHRoaXMucHJvamVjdElkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm90b2NvbCAhPT0gJ2h0dHAnICYmIHRoaXMucHJvdG9jb2wgIT09ICdodHRwcycpIHtcbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFICsgXCI6IEludmFsaWQgcHJvdG9jb2wgXCIgKyB0aGlzLnByb3RvY29sKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3J0ICYmIGlzTmFOKHBhcnNlSW50KHRoaXMucG9ydCwgMTApKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKEVSUk9SX01FU1NBR0UgKyBcIjogSW52YWxpZCBwb3J0IFwiICsgdGhpcy5wb3J0KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIERzbjtcbn0oKTtcblxuZXhwb3J0IHsgRHNuIH07IiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmV4cG9ydCB2YXIgaW5zdGFsbGVkSW50ZWdyYXRpb25zID0gW107XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZmlsdGVyRHVwbGljYXRlcyhpbnRlZ3JhdGlvbnMpIHtcbiAgcmV0dXJuIGludGVncmF0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgaW50ZWdyYXRpb25zKSB7XG4gICAgaWYgKGFjYy5ldmVyeShmdW5jdGlvbiAoYWNjSW50ZWdyYXRpb24pIHtcbiAgICAgIHJldHVybiBpbnRlZ3JhdGlvbnMubmFtZSAhPT0gYWNjSW50ZWdyYXRpb24ubmFtZTtcbiAgICB9KSkge1xuICAgICAgYWNjLnB1c2goaW50ZWdyYXRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG4vKiogR2V0cyBpbnRlZ3JhdGlvbiB0byBpbnN0YWxsICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVncmF0aW9uc1RvU2V0dXAob3B0aW9ucykge1xuICB2YXIgZGVmYXVsdEludGVncmF0aW9ucyA9IG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyAmJiBfX3NwcmVhZChvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMpIHx8IFtdO1xuICB2YXIgdXNlckludGVncmF0aW9ucyA9IG9wdGlvbnMuaW50ZWdyYXRpb25zO1xuXG4gIHZhciBpbnRlZ3JhdGlvbnMgPSBfX3NwcmVhZChmaWx0ZXJEdXBsaWNhdGVzKGRlZmF1bHRJbnRlZ3JhdGlvbnMpKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh1c2VySW50ZWdyYXRpb25zKSkge1xuICAgIC8vIEZpbHRlciBvdXQgaW50ZWdyYXRpb25zIHRoYXQgYXJlIGFsc28gaW5jbHVkZWQgaW4gdXNlciBvcHRpb25zXG4gICAgaW50ZWdyYXRpb25zID0gX19zcHJlYWQoaW50ZWdyYXRpb25zLmZpbHRlcihmdW5jdGlvbiAoaW50ZWdyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdXNlckludGVncmF0aW9ucy5ldmVyeShmdW5jdGlvbiAodXNlckludGVncmF0aW9uKSB7XG4gICAgICAgIHJldHVybiB1c2VySW50ZWdyYXRpb24ubmFtZSAhPT0gaW50ZWdyYXRpb25zLm5hbWU7XG4gICAgICB9KTtcbiAgICB9KSwgZmlsdGVyRHVwbGljYXRlcyh1c2VySW50ZWdyYXRpb25zKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHVzZXJJbnRlZ3JhdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnRlZ3JhdGlvbnMgPSB1c2VySW50ZWdyYXRpb25zKGludGVncmF0aW9ucyk7XG4gICAgaW50ZWdyYXRpb25zID0gQXJyYXkuaXNBcnJheShpbnRlZ3JhdGlvbnMpID8gaW50ZWdyYXRpb25zIDogW2ludGVncmF0aW9uc107XG4gIH0gLy8gTWFrZSBzdXJlIHRoYXQgaWYgcHJlc2VudCwgYERlYnVnYCBpbnRlZ3JhdGlvbiB3aWxsIGFsd2F5cyBydW4gbGFzdFxuXG5cbiAgdmFyIGludGVncmF0aW9uc05hbWVzID0gaW50ZWdyYXRpb25zLm1hcChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpLm5hbWU7XG4gIH0pO1xuICB2YXIgYWx3YXlzTGFzdFRvUnVuID0gJ0RlYnVnJztcblxuICBpZiAoaW50ZWdyYXRpb25zTmFtZXMuaW5kZXhPZihhbHdheXNMYXN0VG9SdW4pICE9PSAtMSkge1xuICAgIGludGVncmF0aW9ucy5wdXNoLmFwcGx5KGludGVncmF0aW9ucywgX19zcHJlYWQoaW50ZWdyYXRpb25zLnNwbGljZShpbnRlZ3JhdGlvbnNOYW1lcy5pbmRleE9mKGFsd2F5c0xhc3RUb1J1biksIDEpKSk7XG4gIH1cblxuICByZXR1cm4gaW50ZWdyYXRpb25zO1xufVxuLyoqIFNldHVwIGdpdmVuIGludGVncmF0aW9uICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEludGVncmF0aW9uKGludGVncmF0aW9uKSB7XG4gIGlmIChpbnN0YWxsZWRJbnRlZ3JhdGlvbnMuaW5kZXhPZihpbnRlZ3JhdGlvbi5uYW1lKSAhPT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbnRlZ3JhdGlvbi5zZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIpO1xuICBpbnN0YWxsZWRJbnRlZ3JhdGlvbnMucHVzaChpbnRlZ3JhdGlvbi5uYW1lKTtcbiAgbG9nZ2VyLmxvZyhcIkludGVncmF0aW9uIGluc3RhbGxlZDogXCIgKyBpbnRlZ3JhdGlvbi5uYW1lKTtcbn1cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGludGVncmF0aW9uIGluc3RhbmNlcyB0aGlzIGluc3RhbGxzIHRoZW0gYWxsLiBXaGVuIGB3aXRoRGVmYXVsdHNgIGlzIHNldCB0byBgdHJ1ZWAgdGhlbiBhbGwgZGVmYXVsdFxuICogaW50ZWdyYXRpb25zIGFyZSBhZGRlZCB1bmxlc3MgdGhleSB3ZXJlIGFscmVhZHkgcHJvdmlkZWQgYmVmb3JlLlxuICogQHBhcmFtIGludGVncmF0aW9ucyBhcnJheSBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXNcbiAqIEBwYXJhbSB3aXRoRGVmYXVsdCBzaG91bGQgZW5hYmxlIGRlZmF1bHQgaW50ZWdyYXRpb25zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW50ZWdyYXRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIGludGVncmF0aW9ucyA9IHt9O1xuICBnZXRJbnRlZ3JhdGlvbnNUb1NldHVwKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGludGVncmF0aW9uKSB7XG4gICAgaW50ZWdyYXRpb25zW2ludGVncmF0aW9uLm5hbWVdID0gaW50ZWdyYXRpb247XG4gICAgc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbik7XG4gIH0pOyAvLyBzZXQgdGhlIGBpbml0aWFsaXplZGAgZmxhZyBzbyB3ZSBkb24ndCBydW4gdGhyb3VnaCB0aGUgcHJvY2VzcyBhZ2FpbiB1bmVjZXNzYXJpbHk7IHVzZSBgT2JqZWN0LmRlZmluZVByb3BlcnR5YFxuICAvLyBiZWNhdXNlIGJ5IGRlZmF1bHQgaXQgY3JlYXRlcyBhIHByb3BlcnR5IHdoaWNoIGlzIG5vbmVudW1lcmFibGUsIHdoaWNoIHdlIHdhbnQgc2luY2UgYGluaXRpYWxpemVkYCBzaG91bGRuJ3QgYmVcbiAgLy8gY29uc2lkZXJlZCBhIG1lbWJlciBvZiB0aGUgaW5kZXggdGhlIHdheSB0aGUgYWN0dWFsIGludGVncmF0aW9ucyBhcmVcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW50ZWdyYXRpb25zLCAnaW5pdGlhbGl6ZWQnLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIHJldHVybiBpbnRlZ3JhdGlvbnM7XG59IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVhZCwgX19zcHJlYWQsIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cblxuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBPdXRjb21lLCBTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBEc24sIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlLCBpc1RoZW5hYmxlLCBsb2dnZXIsIG5vcm1hbGl6ZSwgU2VudHJ5RXJyb3IsIFN5bmNQcm9taXNlLCB0cnVuY2F0ZSwgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IHNldHVwSW50ZWdyYXRpb25zIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbic7XG4vKipcbiAqIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBKYXZhU2NyaXB0IFNESyBjbGllbnRzLlxuICpcbiAqIENhbGwgdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYmFja2VuZCBjb25zdHJ1Y3RvciBhbmQgb3B0aW9uc1xuICogc3BlY2lmaWMgdG8gdGhlIGNsaWVudCBzdWJjbGFzcy4gVG8gYWNjZXNzIHRoZXNlIG9wdGlvbnMgbGF0ZXIsIHVzZVxuICoge0BsaW5rIENsaWVudC5nZXRPcHRpb25zfS4gQWxzbywgdGhlIEJhY2tlbmQgaW5zdGFuY2UgaXMgYXZhaWxhYmxlIHZpYVxuICoge0BsaW5rIENsaWVudC5nZXRCYWNrZW5kfS5cbiAqXG4gKiBJZiBhIERzbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMsIGl0IHdpbGwgYmUgcGFyc2VkIGFuZCBzdG9yZWQuIFVzZVxuICoge0BsaW5rIENsaWVudC5nZXREc259IHRvIHJldHJpZXZlIHRoZSBEc24gYXQgYW55IG1vbWVudC4gSW4gY2FzZSB0aGUgRHNuIGlzXG4gKiBpbnZhbGlkLCB0aGUgY29uc3RydWN0b3Igd2lsbCB0aHJvdyBhIHtAbGluayBTZW50cnlFeGNlcHRpb259LiBOb3RlIHRoYXRcbiAqIHdpdGhvdXQgYSB2YWxpZCBEc24sIHRoZSBTREsgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzIHRvIFNlbnRyeS5cbiAqXG4gKiBCZWZvcmUgc2VuZGluZyBhbiBldmVudCB2aWEgdGhlIGJhY2tlbmQsIGl0IGlzIHBhc3NlZCB0aHJvdWdoXG4gKiB7QGxpbmsgQmFzZUNsaWVudC5fcHJlcGFyZUV2ZW50fSB0byBhZGQgU0RLIGluZm9ybWF0aW9uIGFuZCBzY29wZSBkYXRhXG4gKiAoYnJlYWRjcnVtYnMgYW5kIGNvbnRleHQpLiBUbyBhZGQgbW9yZSBjdXN0b20gaW5mb3JtYXRpb24sIG92ZXJyaWRlIHRoaXNcbiAqIG1ldGhvZCBhbmQgZXh0ZW5kIHRoZSByZXN1bHRpbmcgcHJlcGFyZWQgZXZlbnQuXG4gKlxuICogVG8gaXNzdWUgYXV0b21hdGljYWxseSBjcmVhdGVkIGV2ZW50cyAoZS5nLiB2aWEgaW5zdHJ1bWVudGF0aW9uKSwgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmNhcHR1cmVFdmVudH0uIEl0IHdpbGwgcHJlcGFyZSB0aGUgZXZlbnQgYW5kIHBhc3MgaXQgdGhyb3VnaFxuICogdGhlIGNhbGxiYWNrIGxpZmVjeWNsZS4gVG8gaXNzdWUgYXV0by1icmVhZGNydW1icywgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmFkZEJyZWFkY3J1bWJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBOb2RlQ2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudDxOb2RlQmFja2VuZCwgTm9kZU9wdGlvbnM+IHtcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5vZGVPcHRpb25zKSB7XG4gKiAgICAgc3VwZXIoTm9kZUJhY2tlbmQsIG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICAvLyAuLi5cbiAqIH1cbiAqL1xuXG52YXIgQmFzZUNsaWVudCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGlzIGNsaWVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGJhY2tlbmRDbGFzcyBBIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYmFja2VuZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNsaWVudC5cbiAgICovXG4gIGZ1bmN0aW9uIEJhc2VDbGllbnQoYmFja2VuZENsYXNzLCBvcHRpb25zKSB7XG4gICAgLyoqIEFycmF5IG9mIHVzZWQgaW50ZWdyYXRpb25zLiAqL1xuICAgIHRoaXMuX2ludGVncmF0aW9ucyA9IHt9O1xuICAgIC8qKiBOdW1iZXIgb2YgY2FsbHMgYmVpbmcgcHJvY2Vzc2VkICovXG5cbiAgICB0aGlzLl9udW1Qcm9jZXNzaW5nID0gMDtcbiAgICB0aGlzLl9iYWNrZW5kID0gbmV3IGJhY2tlbmRDbGFzcyhvcHRpb25zKTtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLmRzbikge1xuICAgICAgdGhpcy5fZHNuID0gbmV3IERzbihvcHRpb25zLmRzbik7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLmNhcHR1cmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50LCBzY29wZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIHRoaXMuX3Byb2Nlc3ModGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbUV4Y2VwdGlvbihleGNlcHRpb24sIGhpbnQpLnRoZW4oZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gX3RoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgbGV2ZWwsIGhpbnQsIHNjb3BlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBldmVudElkID0gaGludCAmJiBoaW50LmV2ZW50X2lkO1xuICAgIHZhciBwcm9taXNlZEV2ZW50ID0gaXNQcmltaXRpdmUobWVzc2FnZSkgPyB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tTWVzc2FnZShTdHJpbmcobWVzc2FnZSksIGxldmVsLCBoaW50KSA6IHRoaXMuX2dldEJhY2tlbmQoKS5ldmVudEZyb21FeGNlcHRpb24obWVzc2FnZSwgaGludCk7XG5cbiAgICB0aGlzLl9wcm9jZXNzKHByb21pc2VkRXZlbnQudGhlbihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBfdGhpcy5fY2FwdHVyZUV2ZW50KGV2ZW50LCBoaW50LCBzY29wZSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBldmVudElkID0gcmVzdWx0O1xuICAgIH0pKTtcblxuICAgIHJldHVybiBldmVudElkO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5jYXB0dXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQsIHNjb3BlKSB7XG4gICAgdmFyIGV2ZW50SWQgPSBoaW50ICYmIGhpbnQuZXZlbnRfaWQ7XG5cbiAgICB0aGlzLl9wcm9jZXNzKHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZVNlc3Npb24gPSBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdTREsgbm90IGVuYWJsZWQsIHdpbGwgbm90IGNhcHR1cmUgc2Vzc2lvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2Ygc2Vzc2lvbi5yZWxlYXNlID09PSAnc3RyaW5nJykpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdEaXNjYXJkZWQgc2Vzc2lvbiBiZWNhdXNlIG9mIG1pc3Npbmcgb3Igbm9uLXN0cmluZyByZWxlYXNlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbmRTZXNzaW9uKHNlc3Npb24pOyAvLyBBZnRlciBzZW5kaW5nLCB3ZSBzZXQgaW5pdCBmYWxzZSB0byBpbmRpY2F0ZSBpdCdzIG5vdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZVxuXG5cbiAgICAgIHNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgaW5pdDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuZ2V0RHNuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9kc247XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QmFja2VuZCgpLmdldFRyYW5zcG9ydCgpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLl9pc0NsaWVudERvbmVQcm9jZXNzaW5nKHRpbWVvdXQpLnRoZW4oZnVuY3Rpb24gKGNsaWVudEZpbmlzaGVkKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0VHJhbnNwb3J0KCkuY2xvc2UodGltZW91dCkudGhlbihmdW5jdGlvbiAodHJhbnNwb3J0Rmx1c2hlZCkge1xuICAgICAgICByZXR1cm4gY2xpZW50RmluaXNoZWQgJiYgdHJhbnNwb3J0Rmx1c2hlZDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLmZsdXNoKHRpbWVvdXQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgX3RoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBpbnRlZ3JhdGlvbnNcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5zZXR1cEludGVncmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5faXNFbmFibGVkKCkgJiYgIXRoaXMuX2ludGVncmF0aW9ucy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5faW50ZWdyYXRpb25zID0gc2V0dXBJbnRlZ3JhdGlvbnModGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5nZXRJbnRlZ3JhdGlvbiA9IGZ1bmN0aW9uIChpbnRlZ3JhdGlvbikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5faW50ZWdyYXRpb25zW2ludGVncmF0aW9uLmlkXSB8fCBudWxsO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJDYW5ub3QgcmV0cmlldmUgaW50ZWdyYXRpb24gXCIgKyBpbnRlZ3JhdGlvbi5pZCArIFwiIGZyb20gdGhlIGN1cnJlbnQgQ2xpZW50XCIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICAvKiogVXBkYXRlcyBleGlzdGluZyBzZXNzaW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBldmVudCAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuX3VwZGF0ZVNlc3Npb25Gcm9tRXZlbnQgPSBmdW5jdGlvbiAoc2Vzc2lvbiwgZXZlbnQpIHtcbiAgICB2YXIgZV8xLCBfYTtcblxuICAgIHZhciBjcmFzaGVkID0gZmFsc2U7XG4gICAgdmFyIGVycm9yZWQgPSBmYWxzZTtcbiAgICB2YXIgZXhjZXB0aW9ucyA9IGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzO1xuXG4gICAgaWYgKGV4Y2VwdGlvbnMpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBleGNlcHRpb25zXzEgPSBfX3ZhbHVlcyhleGNlcHRpb25zKSwgZXhjZXB0aW9uc18xXzEgPSBleGNlcHRpb25zXzEubmV4dCgpOyAhZXhjZXB0aW9uc18xXzEuZG9uZTsgZXhjZXB0aW9uc18xXzEgPSBleGNlcHRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGV4ID0gZXhjZXB0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgdmFyIG1lY2hhbmlzbSA9IGV4Lm1lY2hhbmlzbTtcblxuICAgICAgICAgIGlmIChtZWNoYW5pc20gJiYgbWVjaGFuaXNtLmhhbmRsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgZV8xID0ge1xuICAgICAgICAgIGVycm9yOiBlXzFfMVxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoZXhjZXB0aW9uc18xXzEgJiYgIWV4Y2VwdGlvbnNfMV8xLmRvbmUgJiYgKF9hID0gZXhjZXB0aW9uc18xLnJldHVybikpIF9hLmNhbGwoZXhjZXB0aW9uc18xKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEEgc2Vzc2lvbiBpcyB1cGRhdGVkIGFuZCB0aGF0IHNlc3Npb24gdXBkYXRlIGlzIHNlbnQgaW4gb25seSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmcgc2NlbmFyaW9zOlxuICAgIC8vIDEuIFNlc3Npb24gd2l0aCBub24gdGVybWluYWwgc3RhdHVzIGFuZCAwIGVycm9ycyArIGFuIGVycm9yIG9jY3VycmVkIC0+IFdpbGwgc2V0IGVycm9yIGNvdW50IHRvIDEgYW5kIHNlbmQgdXBkYXRlXG4gICAgLy8gMi4gU2Vzc2lvbiB3aXRoIG5vbiB0ZXJtaW5hbCBzdGF0dXMgYW5kIDEgZXJyb3IgKyBhIGNyYXNoIG9jY3VycmVkIC0+IFdpbGwgc2V0IHN0YXR1cyBjcmFzaGVkIGFuZCBzZW5kIHVwZGF0ZVxuXG5cbiAgICB2YXIgc2Vzc2lvbk5vblRlcm1pbmFsID0gc2Vzc2lvbi5zdGF0dXMgPT09IFNlc3Npb25TdGF0dXMuT2s7XG4gICAgdmFyIHNob3VsZFVwZGF0ZUFuZFNlbmQgPSBzZXNzaW9uTm9uVGVybWluYWwgJiYgc2Vzc2lvbi5lcnJvcnMgPT09IDAgfHwgc2Vzc2lvbk5vblRlcm1pbmFsICYmIGNyYXNoZWQ7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlQW5kU2VuZCkge1xuICAgICAgc2Vzc2lvbi51cGRhdGUoX19hc3NpZ24oX19hc3NpZ24oe30sIGNyYXNoZWQgJiYge1xuICAgICAgICBzdGF0dXM6IFNlc3Npb25TdGF0dXMuQ3Jhc2hlZFxuICAgICAgfSksIHtcbiAgICAgICAgZXJyb3JzOiBzZXNzaW9uLmVycm9ycyB8fCBOdW1iZXIoZXJyb3JlZCB8fCBjcmFzaGVkKVxuICAgICAgfSkpO1xuICAgICAgdGhpcy5jYXB0dXJlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9XG4gIH07XG4gIC8qKiBEZWxpdmVyIGNhcHR1cmVkIHNlc3Npb24gdG8gU2VudHJ5ICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fc2VuZFNlc3Npb24gPSBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgIHRoaXMuX2dldEJhY2tlbmQoKS5zZW5kU2Vzc2lvbihzZXNzaW9uKTtcbiAgfTtcbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgY2xpZW50IGlzIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFJldHVybnMgYSBwcm9taXNlIGJlY2F1c2UgaXQgd2lsbCB3YWl0IGB0aW1lb3V0YCBtcyBiZWZvcmUgc2F5aW5nXG4gICAqIFwibm9cIiAocmVzb2x2aW5nIHRvIGBmYWxzZWApIGluIG9yZGVyIHRvIGdpdmUgdGhlIGNsaWVudCBhIGNoYW5jZSB0byBwb3RlbnRpYWxseSBmaW5pc2ggZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lLCBpbiBtcywgYWZ0ZXIgd2hpY2ggdG8gcmVzb2x2ZSB0byBgZmFsc2VgIGlmIHRoZSBjbGllbnQgaXMgc3RpbGwgYnVzeS4gUGFzc2luZyBgMGAgKG9yIG5vdFxuICAgKiBwYXNzaW5nIGFueXRoaW5nKSB3aWxsIG1ha2UgdGhlIHByb21pc2Ugd2FpdCBhcyBsb25nIGFzIGl0IHRha2VzIGZvciBwcm9jZXNzaW5nIHRvIGZpbmlzaCBiZWZvcmUgcmVzb2x2aW5nIHRvXG4gICAqIGB0cnVlYC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB0byBgdHJ1ZWAgaWYgcHJvY2Vzc2luZyBpcyBhbHJlYWR5IGRvbmUgb3IgZmluaXNoZXMgYmVmb3JlIHRoZSB0aW1lb3V0LCBhbmRcbiAgICogYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5faXNDbGllbnREb25lUHJvY2Vzc2luZyA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHZhciB0aWNrZWQgPSAwO1xuICAgICAgdmFyIHRpY2sgPSAxO1xuICAgICAgdmFyIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuX251bVByb2Nlc3NpbmcgPT0gMCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlja2VkICs9IHRpY2s7XG5cbiAgICAgICAgICBpZiAodGltZW91dCAmJiB0aWNrZWQgPj0gdGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRpY2spO1xuICAgIH0pO1xuICB9O1xuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBiYWNrZW5kLiAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2dldEJhY2tlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tlbmQ7XG4gIH07XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBTREsgaXMgZW5hYmxlZCBhbmQgYSB2YWxpZCBEc24gaXMgcHJlc2VudC4gKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLl9pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgIT09IGZhbHNlICYmIHRoaXMuX2RzbiAhPT0gdW5kZWZpbmVkO1xuICB9O1xuICAvKipcbiAgICogQWRkcyBjb21tb24gaW5mb3JtYXRpb24gdG8gZXZlbnRzLlxuICAgKlxuICAgKiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgcmVsZWFzZSBhbmQgZW52aXJvbm1lbnQgZnJvbSBgb3B0aW9uc2AsXG4gICAqIGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0IChleHRyYSwgdGFncyBhbmQgdXNlcikgZnJvbSB0aGUgc2NvcGUuXG4gICAqXG4gICAqIEluZm9ybWF0aW9uIHRoYXQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBldmVudCBpcyBuZXZlciBvdmVyd3JpdHRlbi4gRm9yXG4gICAqIG5lc3RlZCBvYmplY3RzLCBzdWNoIGFzIHRoZSBjb250ZXh0LCBrZXlzIGFyZSBtZXJnZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQuXG4gICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi5cbiAgICogQHBhcmFtIHNjb3BlIEEgc2NvcGUgY29udGFpbmluZyBldmVudCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMgQSBuZXcgZXZlbnQgd2l0aCBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLl9wcmVwYXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIHNjb3BlLCBoaW50KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfYSA9IHRoaXMuZ2V0T3B0aW9ucygpLm5vcm1hbGl6ZURlcHRoLFxuICAgICAgICBub3JtYWxpemVEZXB0aCA9IF9hID09PSB2b2lkIDAgPyAzIDogX2E7XG5cbiAgICB2YXIgcHJlcGFyZWQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZXZlbnQpLCB7XG4gICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQgfHwgKGhpbnQgJiYgaGludC5ldmVudF9pZCA/IGhpbnQuZXZlbnRfaWQgOiB1dWlkNCgpKSxcbiAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wIHx8IGRhdGVUaW1lc3RhbXBJblNlY29uZHMoKVxuICAgIH0pO1xuXG4gICAgdGhpcy5fYXBwbHlDbGllbnRPcHRpb25zKHByZXBhcmVkKTtcblxuICAgIHRoaXMuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEocHJlcGFyZWQpOyAvLyBJZiB3ZSBoYXZlIHNjb3BlIGdpdmVuIHRvIHVzLCB1c2UgaXQgYXMgdGhlIGJhc2UgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy5cbiAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBpZiBgY2FwdHVyZUNvbnRleHRgIGlzIG5vdCBwcm92aWRlZC5cblxuXG4gICAgdmFyIGZpbmFsU2NvcGUgPSBzY29wZTtcblxuICAgIGlmIChoaW50ICYmIGhpbnQuY2FwdHVyZUNvbnRleHQpIHtcbiAgICAgIGZpbmFsU2NvcGUgPSBTY29wZS5jbG9uZShmaW5hbFNjb3BlKS51cGRhdGUoaGludC5jYXB0dXJlQ29udGV4dCk7XG4gICAgfSAvLyBXZSBwcmVwYXJlIHRoZSByZXN1bHQgaGVyZSB3aXRoIGEgcmVzb2x2ZWQgRXZlbnQuXG5cblxuICAgIHZhciByZXN1bHQgPSBTeW5jUHJvbWlzZS5yZXNvbHZlKHByZXBhcmVkKTsgLy8gVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgY2FsbGVkLCBzaW5jZSB3ZSB3YW50IHRoYXRcbiAgICAvLyB7QGxpbmsgSHViLmFkZEV2ZW50UHJvY2Vzc29yfSBnZXRzIHRoZSBmaW5pc2hlZCBwcmVwYXJlZCBldmVudC5cblxuICAgIGlmIChmaW5hbFNjb3BlKSB7XG4gICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBodWIgd2UgcmVhc3NpZ24gaXQuXG4gICAgICByZXN1bHQgPSBmaW5hbFNjb3BlLmFwcGx5VG9FdmVudChwcmVwYXJlZCwgaGludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC50aGVuKGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplRGVwdGggPT09ICdudW1iZXInICYmIG5vcm1hbGl6ZURlcHRoID4gMCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX25vcm1hbGl6ZUV2ZW50KGV2dCwgbm9ybWFsaXplRGVwdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQXBwbGllcyBgbm9ybWFsaXplYCBmdW5jdGlvbiBvbiBuZWNlc3NhcnkgYEV2ZW50YCBhdHRyaWJ1dGVzIHRvIG1ha2UgdGhlbSBzYWZlIGZvciBzZXJpYWxpemF0aW9uLlxuICAgKiBOb3JtYWxpemVkIGtleXM6XG4gICAqIC0gYGJyZWFkY3J1bWJzLmRhdGFgXG4gICAqIC0gYHVzZXJgXG4gICAqIC0gYGNvbnRleHRzYFxuICAgKiAtIGBleHRyYWBcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50XG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgZXZlbnRcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fbm9ybWFsaXplRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRlcHRoKSB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZXZlbnQpLCBldmVudC5icmVhZGNydW1icyAmJiB7XG4gICAgICBicmVhZGNydW1iczogZXZlbnQuYnJlYWRjcnVtYnMubWFwKGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYiksIGIuZGF0YSAmJiB7XG4gICAgICAgICAgZGF0YTogbm9ybWFsaXplKGIuZGF0YSwgZGVwdGgpXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICB9KSwgZXZlbnQudXNlciAmJiB7XG4gICAgICB1c2VyOiBub3JtYWxpemUoZXZlbnQudXNlciwgZGVwdGgpXG4gICAgfSksIGV2ZW50LmNvbnRleHRzICYmIHtcbiAgICAgIGNvbnRleHRzOiBub3JtYWxpemUoZXZlbnQuY29udGV4dHMsIGRlcHRoKVxuICAgIH0pLCBldmVudC5leHRyYSAmJiB7XG4gICAgICBleHRyYTogbm9ybWFsaXplKGV2ZW50LmV4dHJhLCBkZXB0aClcbiAgICB9KTsgLy8gZXZlbnQuY29udGV4dHMudHJhY2Ugc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgVHJhbnNhY3Rpb24uIFNpbWlsYXJseSxcbiAgICAvLyBldmVudC5zcGFuc1tdIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjaGlsZCBTcGFucy4gR2l2ZW4gdGhhdCBhXG4gICAgLy8gVHJhbnNhY3Rpb24gaXMgY29uY2VwdHVhbGx5IGEgU3Bhbiwgbm9ybWFsaXphdGlvbiBzaG91bGQgYXBwbHkgdG8gYm90aFxuICAgIC8vIFRyYW5zYWN0aW9ucyBhbmQgU3BhbnMgY29uc2lzdGVudGx5LlxuICAgIC8vIEZvciBub3cgdGhlIGRlY2lzaW9uIGlzIHRvIHNraXAgbm9ybWFsaXphdGlvbiBvZiBUcmFuc2FjdGlvbnMgYW5kIFNwYW5zLFxuICAgIC8vIHNvIHRoaXMgYmxvY2sgb3ZlcndyaXRlcyB0aGUgbm9ybWFsaXplZCBldmVudCB0byBhZGQgYmFjayB0aGUgb3JpZ2luYWxcbiAgICAvLyBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBwcmlvciB0byBub3JtYWxpemF0aW9uLlxuXG5cbiAgICBpZiAoZXZlbnQuY29udGV4dHMgJiYgZXZlbnQuY29udGV4dHMudHJhY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIG5vcm1hbGl6ZWQuY29udGV4dHMudHJhY2UgPSBldmVudC5jb250ZXh0cy50cmFjZTtcbiAgICB9XG5cbiAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKS5fZXhwZXJpbWVudHMsXG4gICAgICAgIF9leHBlcmltZW50cyA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuXG4gICAgaWYgKF9leHBlcmltZW50cy5lbnN1cmVOb0NpcmN1bGFyU3RydWN0dXJlcykge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZShub3JtYWxpemVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcbiAgLyoqXG4gICAqICBFbmhhbmNlcyBldmVudCB1c2luZyB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqICBJdCB0YWtlcyBjYXJlIG9mIGFsbCBcInN0YXRpY1wiIHZhbHVlcyBsaWtlIGVudmlyb25tZW50LCByZWxlYXNlIGFuZCBgZGlzdGAsXG4gICAqICBhcyB3ZWxsIGFzIHRydW5jYXRpbmcgb3Zlcmx5IGxvbmcgdmFsdWVzLlxuICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgaW5zdGFuY2UgdG8gYmUgZW5oYW5jZWRcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fYXBwbHlDbGllbnRPcHRpb25zID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICB2YXIgZW52aXJvbm1lbnQgPSBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgICByZWxlYXNlID0gb3B0aW9ucy5yZWxlYXNlLFxuICAgICAgICBkaXN0ID0gb3B0aW9ucy5kaXN0LFxuICAgICAgICBfYSA9IG9wdGlvbnMubWF4VmFsdWVMZW5ndGgsXG4gICAgICAgIG1heFZhbHVlTGVuZ3RoID0gX2EgPT09IHZvaWQgMCA/IDI1MCA6IF9hO1xuXG4gICAgaWYgKCEoJ2Vudmlyb25tZW50JyBpbiBldmVudCkpIHtcbiAgICAgIGV2ZW50LmVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyBpbiBvcHRpb25zID8gZW52aXJvbm1lbnQgOiAncHJvZHVjdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnJlbGVhc2UgPT09IHVuZGVmaW5lZCAmJiByZWxlYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50LnJlbGVhc2UgPSByZWxlYXNlO1xuICAgIH1cblxuICAgIGlmIChldmVudC5kaXN0ID09PSB1bmRlZmluZWQgJiYgZGlzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudC5kaXN0ID0gZGlzdDtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgZXZlbnQubWVzc2FnZSA9IHRydW5jYXRlKGV2ZW50Lm1lc3NhZ2UsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcblxuICAgIGlmIChleGNlcHRpb24gJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICBleGNlcHRpb24udmFsdWUgPSB0cnVuY2F0ZShleGNlcHRpb24udmFsdWUsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG5cbiAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnVybCkge1xuICAgICAgcmVxdWVzdC51cmwgPSB0cnVuY2F0ZShyZXF1ZXN0LnVybCwgbWF4VmFsdWVMZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbGwgdXNlZCBpbnRlZ3JhdGlvbnMgdG8gdGhlIFNESyBpbmZvIGluIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggYWxsIGludGVncmF0aW9ucy5cbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fYXBwbHlJbnRlZ3JhdGlvbnNNZXRhZGF0YSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBpbnRlZ3JhdGlvbnNBcnJheSA9IE9iamVjdC5rZXlzKHRoaXMuX2ludGVncmF0aW9ucyk7XG5cbiAgICBpZiAoaW50ZWdyYXRpb25zQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnQuc2RrID0gZXZlbnQuc2RrIHx8IHt9O1xuICAgICAgZXZlbnQuc2RrLmludGVncmF0aW9ucyA9IF9fc3ByZWFkKGV2ZW50LnNkay5pbnRlZ3JhdGlvbnMgfHwgW10sIGludGVncmF0aW9uc0FycmF5KTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBUZWxscyB0aGUgYmFja2VuZCB0byBzZW5kIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBTZW50cnkgZXZlbnQgdG8gc2VuZFxuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLl9zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB0aGlzLl9nZXRCYWNrZW5kKCkuc2VuZEV2ZW50KGV2ZW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIFByb2Nlc3NlcyB0aGUgZXZlbnQgYW5kIGxvZ3MgYW4gZXJyb3IgaW4gY2FzZSBvZiByZWplY3Rpb25cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBoaW50XG4gICAqIEBwYXJhbSBzY29wZVxuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLl9jYXB0dXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQsIHNjb3BlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NFdmVudChldmVudCwgaGludCwgc2NvcGUpLnRoZW4oZnVuY3Rpb24gKGZpbmFsRXZlbnQpIHtcbiAgICAgIHJldHVybiBmaW5hbEV2ZW50LmV2ZW50X2lkO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGxvZ2dlci5lcnJvcihyZWFzb24pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhbiBldmVudCAoZWl0aGVyIGVycm9yIG9yIG1lc3NhZ2UpIGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gICAqXG4gICAqIFRoaXMgYWxzbyBhZGRzIGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0IGluZm9ybWF0aW9uIHRvIHRoZSBldmVudC4gSG93ZXZlcixcbiAgICogcGxhdGZvcm0gc3BlY2lmaWMgbWV0YSBkYXRhIChzdWNoIGFzIHRoZSBVc2VyJ3MgSVAgYWRkcmVzcykgbXVzdCBiZSBhZGRlZFxuICAgKiBieSB0aGUgU0RLIGltcGxlbWVudG9yLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQgdG8gU2VudHJ5LlxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBwYXJhbSBzY29wZSBBIHNjb3BlIGNvbnRhaW5pbmcgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIEEgU3luY1Byb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBldmVudCBvciByZWplY3RzIGluIGNhc2UgZXZlbnQgd2FzL3dpbGwgbm90IGJlIHNlbmQuXG4gICAqL1xuXG5cbiAgQmFzZUNsaWVudC5wcm90b3R5cGUuX3Byb2Nlc3NFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgaGludCwgc2NvcGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hLCBfYjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuXG5cbiAgICB2YXIgX2MgPSB0aGlzLmdldE9wdGlvbnMoKSxcbiAgICAgICAgYmVmb3JlU2VuZCA9IF9jLmJlZm9yZVNlbmQsXG4gICAgICAgIHNhbXBsZVJhdGUgPSBfYy5zYW1wbGVSYXRlO1xuXG4gICAgdmFyIHRyYW5zcG9ydCA9IHRoaXMuZ2V0VHJhbnNwb3J0KCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KG5ldyBTZW50cnlFcnJvcignU0RLIG5vdCBlbmFibGVkLCB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50LicpKTtcbiAgICB9XG5cbiAgICB2YXIgaXNUcmFuc2FjdGlvbiA9IGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbic7IC8vIDEuMCA9PT0gMTAwJSBldmVudHMgYXJlIHNlbnRcbiAgICAvLyAwLjAgPT09IDAlIGV2ZW50cyBhcmUgc2VudFxuICAgIC8vIFNhbXBsaW5nIGZvciB0cmFuc2FjdGlvbiBoYXBwZW5zIHNvbWV3aGVyZSBlbHNlXG5cbiAgICBpZiAoIWlzVHJhbnNhY3Rpb24gJiYgdHlwZW9mIHNhbXBsZVJhdGUgPT09ICdudW1iZXInICYmIE1hdGgucmFuZG9tKCkgPiBzYW1wbGVSYXRlKSB7XG4gICAgICAoX2IgPSAoX2EgPSB0cmFuc3BvcnQpLnJlY29yZExvc3RFdmVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIE91dGNvbWUuU2FtcGxlUmF0ZSwgJ2V2ZW50Jyk7XG4gICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KG5ldyBTZW50cnlFcnJvcihcIkRpc2NhcmRpbmcgZXZlbnQgYmVjYXVzZSBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZG9tIHNhbXBsZSAoc2FtcGxpbmcgcmF0ZSA9IFwiICsgc2FtcGxlUmF0ZSArIFwiKVwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVFdmVudChldmVudCwgc2NvcGUsIGhpbnQpLnRoZW4oZnVuY3Rpb24gKHByZXBhcmVkKSB7XG4gICAgICB2YXIgX2EsIF9iO1xuXG4gICAgICBpZiAocHJlcGFyZWQgPT09IG51bGwpIHtcbiAgICAgICAgKF9iID0gKF9hID0gdHJhbnNwb3J0KS5yZWNvcmRMb3N0RXZlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBPdXRjb21lLkV2ZW50UHJvY2Vzc29yLCBldmVudC50eXBlIHx8ICdldmVudCcpO1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ0FuIGV2ZW50IHByb2Nlc3NvciByZXR1cm5lZCBudWxsLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNJbnRlcm5hbEV4Y2VwdGlvbiA9IGhpbnQgJiYgaGludC5kYXRhICYmIGhpbnQuZGF0YS5fX3NlbnRyeV9fID09PSB0cnVlO1xuXG4gICAgICBpZiAoaXNJbnRlcm5hbEV4Y2VwdGlvbiB8fCBpc1RyYW5zYWN0aW9uIHx8ICFiZWZvcmVTZW5kKSB7XG4gICAgICAgIHJldHVybiBwcmVwYXJlZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGJlZm9yZVNlbmRSZXN1bHQgPSBiZWZvcmVTZW5kKHByZXBhcmVkLCBoaW50KTtcbiAgICAgIHJldHVybiBfdGhpcy5fZW5zdXJlQmVmb3JlU2VuZFJ2KGJlZm9yZVNlbmRSZXN1bHQpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHByb2Nlc3NlZEV2ZW50KSB7XG4gICAgICB2YXIgX2EsIF9iO1xuXG4gICAgICBpZiAocHJvY2Vzc2VkRXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgKF9iID0gKF9hID0gdHJhbnNwb3J0KS5yZWNvcmRMb3N0RXZlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBPdXRjb21lLkJlZm9yZVNlbmQsIGV2ZW50LnR5cGUgfHwgJ2V2ZW50Jyk7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignYGJlZm9yZVNlbmRgIHJldHVybmVkIGBudWxsYCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNlc3Npb24gPSBzY29wZSAmJiBzY29wZS5nZXRTZXNzaW9uICYmIHNjb3BlLmdldFNlc3Npb24oKTtcblxuICAgICAgaWYgKCFpc1RyYW5zYWN0aW9uICYmIHNlc3Npb24pIHtcbiAgICAgICAgX3RoaXMuX3VwZGF0ZVNlc3Npb25Gcm9tRXZlbnQoc2Vzc2lvbiwgcHJvY2Vzc2VkRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2VuZEV2ZW50KHByb2Nlc3NlZEV2ZW50KTtcblxuICAgICAgcmV0dXJuIHByb2Nlc3NlZEV2ZW50O1xuICAgIH0pLnRoZW4obnVsbCwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFNlbnRyeUVycm9yKSB7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuY2FwdHVyZUV4Y2VwdGlvbihyZWFzb24sIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIF9fc2VudHJ5X186IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IHJlYXNvblxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihcIkV2ZW50IHByb2Nlc3NpbmcgcGlwZWxpbmUgdGhyZXcgYW4gZXJyb3IsIG9yaWdpbmFsIGV2ZW50IHdpbGwgbm90IGJlIHNlbnQuIERldGFpbHMgaGF2ZSBiZWVuIHNlbnQgYXMgYSBuZXcgZXZlbnQuXFxuUmVhc29uOiBcIiArIHJlYXNvbik7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBPY2N1cGllcyB0aGUgY2xpZW50IHdpdGggcHJvY2Vzc2luZyBhbmQgZXZlbnRcbiAgICovXG5cblxuICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fcHJvY2VzcyA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuX251bVByb2Nlc3NpbmcgKz0gMTtcbiAgICB2b2lkIHByb21pc2UudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIF90aGlzLl9udW1Qcm9jZXNzaW5nIC09IDE7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgX3RoaXMuX251bVByb2Nlc3NpbmcgLT0gMTtcbiAgICAgIHJldHVybiByZWFzb247XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHJldHVybiB2YWx1ZSBvZiBjb25maWd1cmVkIGBiZWZvcmVTZW5kYCBpcyBvZiBleHBlY3RlZCB0eXBlLlxuICAgKi9cblxuXG4gIEJhc2VDbGllbnQucHJvdG90eXBlLl9lbnN1cmVCZWZvcmVTZW5kUnYgPSBmdW5jdGlvbiAocnYpIHtcbiAgICB2YXIgbnVsbEVyciA9ICdgYmVmb3JlU2VuZGAgbWV0aG9kIGhhcyB0byByZXR1cm4gYG51bGxgIG9yIGEgdmFsaWQgZXZlbnQuJztcblxuICAgIGlmIChpc1RoZW5hYmxlKHJ2KSkge1xuICAgICAgcmV0dXJuIHJ2LnRoZW4oZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghKGlzUGxhaW5PYmplY3QoZXZlbnQpIHx8IGV2ZW50ID09PSBudWxsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihudWxsRXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihcImJlZm9yZVNlbmQgcmVqZWN0ZWQgd2l0aCBcIiArIGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghKGlzUGxhaW5PYmplY3QocnYpIHx8IHJ2ID09PSBudWxsKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKG51bGxFcnIpO1xuICAgIH1cblxuICAgIHJldHVybiBydjtcbiAgfTtcblxuICByZXR1cm4gQmFzZUNsaWVudDtcbn0oKTtcblxuZXhwb3J0IHsgQmFzZUNsaWVudCB9OyIsImltcG9ydCB7IFN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBOb29wIHRyYW5zcG9ydCAqL1xuXG52YXIgTm9vcFRyYW5zcG9ydCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vb3BUcmFuc3BvcnQoKSB7fVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBOb29wVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoXykge1xuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIHJlYXNvbjogXCJOb29wVHJhbnNwb3J0OiBFdmVudCBoYXMgYmVlbiBza2lwcGVkIGJlY2F1c2Ugbm8gRHNuIGlzIGNvbmZpZ3VyZWQuXCIsXG4gICAgICBzdGF0dXM6IFN0YXR1cy5Ta2lwcGVkXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIE5vb3BUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKF8pIHtcbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfTtcblxuICByZXR1cm4gTm9vcFRyYW5zcG9ydDtcbn0oKTtcblxuZXhwb3J0IHsgTm9vcFRyYW5zcG9ydCB9OyIsImltcG9ydCB7IGxvZ2dlciwgU2VudHJ5RXJyb3IgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG4vKipcbiAqIFRoaXMgaXMgdGhlIGJhc2UgaW1wbGVtZW50aW9uIG9mIGEgQmFja2VuZC5cbiAqIEBoaWRkZW5cbiAqL1xuXG52YXIgQmFzZUJhY2tlbmQgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICAvKiogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGluc3RhbmNlLiAqL1xuICBmdW5jdGlvbiBCYXNlQmFja2VuZChvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gRFNOIHByb3ZpZGVkLCBiYWNrZW5kIHdpbGwgbm90IGRvIGFueXRoaW5nLicpO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRoaXMuX3NldHVwVHJhbnNwb3J0KCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuXG5cbiAgQmFzZUJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChfZXhjZXB0aW9uLCBfaGludCkge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21FeGNlcHRpb25gIG1ldGhvZCcpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlQmFja2VuZC5wcm90b3R5cGUuZXZlbnRGcm9tTWVzc2FnZSA9IGZ1bmN0aW9uIChfbWVzc2FnZSwgX2xldmVsLCBfaGludCkge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21NZXNzYWdlYCBtZXRob2QnKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZUJhY2tlbmQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZvaWQgdGhpcy5fdHJhbnNwb3J0LnNlbmRFdmVudChldmVudCkudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciB3aGlsZSBzZW5kaW5nIGV2ZW50OiBcIiArIHJlYXNvbik7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5zZW5kU2Vzc2lvbiA9IGZ1bmN0aW9uIChzZXNzaW9uKSB7XG4gICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRHJvcHBpbmcgc2Vzc2lvbiBiZWNhdXNlIGN1c3RvbSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgc2VuZFNlc3Npb25cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdm9pZCB0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24oc2Vzc2lvbikudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciB3aGlsZSBzZW5kaW5nIHNlc3Npb246IFwiICsgcmVhc29uKTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZUJhY2tlbmQucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0O1xuICB9O1xuICAvKipcbiAgICogU2V0cyB1cCB0aGUgdHJhbnNwb3J0IHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIHNlbmQgcmVxdWVzdHMuXG4gICAqL1xuXG5cbiAgQmFzZUJhY2tlbmQucHJvdG90eXBlLl9zZXR1cFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IE5vb3BUcmFuc3BvcnQoKTtcbiAgfTtcblxuICByZXR1cm4gQmFzZUJhY2tlbmQ7XG59KCk7XG5cbmV4cG9ydCB7IEJhc2VCYWNrZW5kIH07IiwiLyoqXG4gKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2MvVHJhY2VLaXQsIGJ1dCBoYXMgc2luY2UgYmVlblxuICogbGFyZ2VseSBtb2RpZmllZCBhbmQgaXMgbm93IG1haW50YWluZWQgYXMgcGFydCBvZiBTZW50cnkgSlMgU0RLLlxuICovXG5pbXBvcnQgeyBfX2Fzc2lnbiwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7IC8vIGdsb2JhbCByZWZlcmVuY2UgdG8gc2xpY2VcblxudmFyIFVOS05PV05fRlVOQ1RJT04gPSAnPyc7IC8vIENocm9taXVtIGJhc2VkIGJyb3dzZXJzOiBDaHJvbWUsIEJyYXZlLCBuZXcgT3BlcmEsIG5ldyBFZGdlXG5cbnZhciBjaHJvbWUgPSAvXlxccyphdCAoPzooLio/KSA/XFwoKT8oKD86ZmlsZXxodHRwcz98YmxvYnxjaHJvbWUtZXh0ZW5zaW9ufGFkZHJlc3N8bmF0aXZlfGV2YWx8d2VicGFja3w8YW5vbnltb3VzPnxbLWEtel0rOnwuKmJ1bmRsZXxcXC8pLio/KSg/OjooXFxkKykpPyg/OjooXFxkKykpP1xcKT9cXHMqJC9pOyAvLyBnZWNrbyByZWdleDogYCg/OmJ1bmRsZXxcXGQrXFwuanMpYDogYGJ1bmRsZWAgaXMgZm9yIHJlYWN0IG5hdGl2ZSwgYFxcZCtcXC5qc2AgYWxzbyBidXQgc3BlY2lmaWNhbGx5IGZvciByYW0gYnVuZGxlcyBiZWNhdXNlIGl0XG4vLyBnZW5lcmF0ZXMgZmlsZW5hbWVzIHdpdGhvdXQgYSBwcmVmaXggbGlrZSBgZmlsZTovL2AgdGhlIGZpbGVuYW1lcyBpbiB0aGUgc3RhY2t0cmFjZSBhcmUganVzdCA0Mi5qc1xuLy8gV2UgbmVlZCB0aGlzIHNwZWNpZmljIGNhc2UgZm9yIG5vdyBiZWNhdXNlIHdlIHdhbnQgbm8gb3RoZXIgcmVnZXggdG8gbWF0Y2guXG5cbnZhciBnZWNrbyA9IC9eXFxzKiguKj8pKD86XFwoKC4qPylcXCkpPyg/Ol58QCk/KCg/OmZpbGV8aHR0cHM/fGJsb2J8Y2hyb21lfHdlYnBhY2t8cmVzb3VyY2V8bW96LWV4dGVuc2lvbnxjYXBhY2l0b3IpLio/OlxcLy4qP3xcXFtuYXRpdmUgY29kZVxcXXxbXkBdKig/OmJ1bmRsZXxcXGQrXFwuanMpfFxcL1tcXHdcXC0uIC89XSspKD86OihcXGQrKSk/KD86OihcXGQrKSk/XFxzKiQvaTtcbnZhciB3aW5qcyA9IC9eXFxzKmF0ICg/OigoPzpcXFtvYmplY3Qgb2JqZWN0XFxdKT8uKykgKT9cXCg/KCg/OmZpbGV8bXMtYXBweHxodHRwcz98d2VicGFja3xibG9iKTouKj8pOihcXGQrKSg/OjooXFxkKykpP1xcKT9cXHMqJC9pO1xudmFyIGdlY2tvRXZhbCA9IC8oXFxTKykgbGluZSAoXFxkKykoPzogPiBldmFsIGxpbmUgXFxkKykqID4gZXZhbC9pO1xudmFyIGNocm9tZUV2YWwgPSAvXFwoKFxcUyopKD86OihcXGQrKSkoPzo6KFxcZCspKVxcKS87IC8vIEJhc2VkIG9uIG91ciBvd24gbWFwcGluZyBwYXR0ZXJuIC0gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnkvYmxvYi85ZjA4MzA1ZTA5ODY2YzhiZDZkMGMyNGY1YjBhYWJkZDdkZDZjNTljL3NyYy9zZW50cnkvbGFuZy9qYXZhc2NyaXB0L2Vycm9ybWFwcGluZy5weSNMODMtTDEwOFxuXG52YXIgcmVhY3RNaW5pZmllZFJlZ2V4cCA9IC9NaW5pZmllZCBSZWFjdCBlcnJvciAjXFxkKzsvaTtcbi8qKiBKU0RvYyAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGFja1RyYWNlKGV4KSB7XG4gIHZhciBzdGFjayA9IG51bGw7XG4gIHZhciBwb3BTaXplID0gMDtcblxuICBpZiAoZXgpIHtcbiAgICBpZiAodHlwZW9mIGV4LmZyYW1lc1RvUG9wID09PSAnbnVtYmVyJykge1xuICAgICAgcG9wU2l6ZSA9IGV4LmZyYW1lc1RvUG9wO1xuICAgIH0gZWxzZSBpZiAocmVhY3RNaW5pZmllZFJlZ2V4cC50ZXN0KGV4Lm1lc3NhZ2UpKSB7XG4gICAgICBwb3BTaXplID0gMTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgbXVzdCBiZSB0cmllZCBmaXJzdCBiZWNhdXNlIE9wZXJhIDEwICpkZXN0cm95cypcbiAgICAvLyBpdHMgc3RhY2t0cmFjZSBwcm9wZXJ0eSBpZiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgc3RhY2tcbiAgICAvLyBwcm9wZXJ0eSBmaXJzdCEhXG4gICAgc3RhY2sgPSBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja3RyYWNlUHJvcChleCk7XG5cbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIHJldHVybiBwb3BGcmFtZXMoc3RhY2ssIHBvcFNpemUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgey8vIG5vLWVtcHR5XG4gIH1cblxuICB0cnkge1xuICAgIHN0YWNrID0gY29tcHV0ZVN0YWNrVHJhY2VGcm9tU3RhY2tQcm9wKGV4KTtcblxuICAgIGlmIChzdGFjaykge1xuICAgICAgcmV0dXJuIHBvcEZyYW1lcyhzdGFjaywgcG9wU2l6ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7Ly8gbm8tZW1wdHlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogZXh0cmFjdE1lc3NhZ2UoZXgpLFxuICAgIG5hbWU6IGV4ICYmIGV4Lm5hbWUsXG4gICAgc3RhY2s6IFtdLFxuICAgIGZhaWxlZDogdHJ1ZVxuICB9O1xufVxuLyoqIEpTRG9jICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgY29tcGxleGl0eVxuXG5mdW5jdGlvbiBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja1Byb3AoZXgpIHtcbiAgdmFyIF9hLCBfYjtcblxuICBpZiAoIWV4IHx8ICFleC5zdGFjaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBsaW5lcyA9IGV4LnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgdmFyIGlzRXZhbDtcbiAgdmFyIHN1Ym1hdGNoO1xuICB2YXIgcGFydHM7XG4gIHZhciBlbGVtZW50O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAocGFydHMgPSBjaHJvbWUuZXhlYyhsaW5lc1tpXSkpIHtcbiAgICAgIHZhciBpc05hdGl2ZSA9IHBhcnRzWzJdICYmIHBhcnRzWzJdLmluZGV4T2YoJ25hdGl2ZScpID09PSAwOyAvLyBzdGFydCBvZiBsaW5lXG5cbiAgICAgIGlzRXZhbCA9IHBhcnRzWzJdICYmIHBhcnRzWzJdLmluZGV4T2YoJ2V2YWwnKSA9PT0gMDsgLy8gc3RhcnQgb2YgbGluZVxuXG4gICAgICBpZiAoaXNFdmFsICYmIChzdWJtYXRjaCA9IGNocm9tZUV2YWwuZXhlYyhwYXJ0c1syXSkpKSB7XG4gICAgICAgIC8vIHRocm93IG91dCBldmFsIGxpbmUvY29sdW1uIGFuZCB1c2UgdG9wLW1vc3QgbGluZS9jb2x1bW4gbnVtYmVyXG4gICAgICAgIHBhcnRzWzJdID0gc3VibWF0Y2hbMV07IC8vIHVybFxuXG4gICAgICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMl07IC8vIGxpbmVcblxuICAgICAgICBwYXJ0c1s0XSA9IHN1Ym1hdGNoWzNdOyAvLyBjb2x1bW5cbiAgICAgIH0gLy8gQXJwYWQ6IFdvcmtpbmcgd2l0aCB0aGUgcmVnZXhwIGFib3ZlIGlzIHN1cGVyIHBhaW5mdWwuIGl0IGlzIHF1aXRlIGEgaGFjaywgYnV0IGp1c3Qgc3RyaXBwaW5nIHRoZSBgYWRkcmVzcyBhdCBgXG4gICAgICAvLyBwcmVmaXggaGVyZSBzZWVtcyBsaWtlIHRoZSBxdWlja2VzdCBzb2x1dGlvbiBmb3Igbm93LlxuXG5cbiAgICAgIHZhciB1cmwgPSBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCdhZGRyZXNzIGF0ICcpID09PSAwID8gcGFydHNbMl0uc3Vic3RyKCdhZGRyZXNzIGF0ICcubGVuZ3RoKSA6IHBhcnRzWzJdOyAvLyBLYW1pbDogT25lIG1vcmUgaGFjayB3b24ndCBodXJ0IHVzIHJpZ2h0PyBVbmRlcnN0YW5kaW5nIGFuZCBhZGRpbmcgbW9yZSBydWxlcyBvbiB0b3Agb2YgdGhlc2UgcmVnZXhwcyByaWdodCBub3dcbiAgICAgIC8vIHdvdWxkIGJlIHdheSB0b28gdGltZSBjb25zdW1pbmcuIChUT0RPOiBSZXdyaXRlIHdob2xlIFJlZ0V4cCB0byBiZSBtb3JlIHJlYWRhYmxlKVxuXG4gICAgICB2YXIgZnVuYyA9IHBhcnRzWzFdIHx8IFVOS05PV05fRlVOQ1RJT047XG4gICAgICBfYSA9IF9fcmVhZChleHRyYWN0U2FmYXJpRXh0ZW5zaW9uRGV0YWlscyhmdW5jLCB1cmwpLCAyKSwgZnVuYyA9IF9hWzBdLCB1cmwgPSBfYVsxXTtcbiAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICBhcmdzOiBpc05hdGl2ZSA/IFtwYXJ0c1syXV0gOiBbXSxcbiAgICAgICAgbGluZTogcGFydHNbM10gPyArcGFydHNbM10gOiBudWxsLFxuICAgICAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcnRzID0gd2luanMuZXhlYyhsaW5lc1tpXSkpIHtcbiAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgIHVybDogcGFydHNbMl0sXG4gICAgICAgIGZ1bmM6IHBhcnRzWzFdIHx8IFVOS05PV05fRlVOQ1RJT04sXG4gICAgICAgIGFyZ3M6IFtdLFxuICAgICAgICBsaW5lOiArcGFydHNbM10sXG4gICAgICAgIGNvbHVtbjogcGFydHNbNF0gPyArcGFydHNbNF0gOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAocGFydHMgPSBnZWNrby5leGVjKGxpbmVzW2ldKSkge1xuICAgICAgaXNFdmFsID0gcGFydHNbM10gJiYgcGFydHNbM10uaW5kZXhPZignID4gZXZhbCcpID4gLTE7XG5cbiAgICAgIGlmIChpc0V2YWwgJiYgKHN1Ym1hdGNoID0gZ2Vja29FdmFsLmV4ZWMocGFydHNbM10pKSkge1xuICAgICAgICAvLyB0aHJvdyBvdXQgZXZhbCBsaW5lL2NvbHVtbiBhbmQgdXNlIHRvcC1tb3N0IGxpbmUgbnVtYmVyXG4gICAgICAgIHBhcnRzWzFdID0gcGFydHNbMV0gfHwgXCJldmFsXCI7XG4gICAgICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMV07XG4gICAgICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbMl07XG4gICAgICAgIHBhcnRzWzVdID0gJyc7IC8vIG5vIGNvbHVtbiB3aGVuIGV2YWxcbiAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCAmJiAhcGFydHNbNV0gJiYgZXguY29sdW1uTnVtYmVyICE9PSB2b2lkIDApIHtcbiAgICAgICAgLy8gRmlyZUZveCB1c2VzIHRoaXMgYXdlc29tZSBjb2x1bW5OdW1iZXIgcHJvcGVydHkgZm9yIGl0cyB0b3AgZnJhbWVcbiAgICAgICAgLy8gQWxzbyBub3RlLCBGaXJlZm94J3MgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkIGFuZCBldmVyeXRoaW5nIGVsc2UgZXhwZWN0cyAxLWJhc2VkLFxuICAgICAgICAvLyBzbyBhZGRpbmcgMVxuICAgICAgICAvLyBOT1RFOiB0aGlzIGhhY2sgZG9lc24ndCB3b3JrIGlmIHRvcC1tb3N0IGZyYW1lIGlzIGV2YWxcbiAgICAgICAgc3RhY2tbMF0uY29sdW1uID0gZXguY29sdW1uTnVtYmVyICsgMTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVybCA9IHBhcnRzWzNdO1xuICAgICAgdmFyIGZ1bmMgPSBwYXJ0c1sxXSB8fCBVTktOT1dOX0ZVTkNUSU9OO1xuICAgICAgX2IgPSBfX3JlYWQoZXh0cmFjdFNhZmFyaUV4dGVuc2lvbkRldGFpbHMoZnVuYywgdXJsKSwgMiksIGZ1bmMgPSBfYlswXSwgdXJsID0gX2JbMV07XG4gICAgICBlbGVtZW50ID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgYXJnczogcGFydHNbMl0gPyBwYXJ0c1syXS5zcGxpdCgnLCcpIDogW10sXG4gICAgICAgIGxpbmU6IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbCxcbiAgICAgICAgY29sdW1uOiBwYXJ0c1s1XSA/ICtwYXJ0c1s1XSA6IG51bGxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5mdW5jICYmIGVsZW1lbnQubGluZSkge1xuICAgICAgZWxlbWVudC5mdW5jID0gVU5LTk9XTl9GVU5DVElPTjtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKGVsZW1lbnQpO1xuICB9XG5cbiAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogZXh0cmFjdE1lc3NhZ2UoZXgpLFxuICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgc3RhY2s6IHN0YWNrXG4gIH07XG59XG4vKiogSlNEb2MgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cblxuZnVuY3Rpb24gY29tcHV0ZVN0YWNrVHJhY2VGcm9tU3RhY2t0cmFjZVByb3AoZXgpIHtcbiAgaWYgKCFleCB8fCAhZXguc3RhY2t0cmFjZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIEFjY2VzcyBhbmQgc3RvcmUgdGhlIHN0YWNrdHJhY2UgcHJvcGVydHkgYmVmb3JlIGRvaW5nIEFOWVRISU5HXG4gIC8vIGVsc2UgdG8gaXQgYmVjYXVzZSBPcGVyYSBpcyBub3QgdmVyeSBnb29kIGF0IHByb3ZpZGluZyBpdFxuICAvLyByZWxpYWJseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLlxuXG5cbiAgdmFyIHN0YWNrdHJhY2UgPSBleC5zdGFja3RyYWNlO1xuICB2YXIgb3BlcmExMFJlZ2V4ID0gLyBsaW5lIChcXGQrKS4qc2NyaXB0ICg/OmluICk/KFxcUyspKD86OiBpbiBmdW5jdGlvbiAoXFxTKykpPyQvaTtcbiAgdmFyIG9wZXJhMTFSZWdleCA9IC8gbGluZSAoXFxkKyksIGNvbHVtbiAoXFxkKylcXHMqKD86aW4gKD86PGFub255bW91cyBmdW5jdGlvbjogKFtePl0rKT58KFteKV0rKSlcXCgoLiopXFwpKT8gaW4gKC4qKTpcXHMqJC9pO1xuICB2YXIgbGluZXMgPSBzdGFja3RyYWNlLnNwbGl0KCdcXG4nKTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBwYXJ0cztcblxuICBmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IGxpbmVzLmxlbmd0aDsgbGluZSArPSAyKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuXG4gICAgaWYgKHBhcnRzID0gb3BlcmExMFJlZ2V4LmV4ZWMobGluZXNbbGluZV0pKSB7XG4gICAgICBlbGVtZW50ID0ge1xuICAgICAgICB1cmw6IHBhcnRzWzJdLFxuICAgICAgICBmdW5jOiBwYXJ0c1szXSxcbiAgICAgICAgYXJnczogW10sXG4gICAgICAgIGxpbmU6ICtwYXJ0c1sxXSxcbiAgICAgICAgY29sdW1uOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAocGFydHMgPSBvcGVyYTExUmVnZXguZXhlYyhsaW5lc1tsaW5lXSkpIHtcbiAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgIHVybDogcGFydHNbNl0sXG4gICAgICAgIGZ1bmM6IHBhcnRzWzNdIHx8IHBhcnRzWzRdLFxuICAgICAgICBhcmdzOiBwYXJ0c1s1XSA/IHBhcnRzWzVdLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgbGluZTogK3BhcnRzWzFdLFxuICAgICAgICBjb2x1bW46ICtwYXJ0c1syXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgaWYgKCFlbGVtZW50LmZ1bmMgJiYgZWxlbWVudC5saW5lKSB7XG4gICAgICAgIGVsZW1lbnQuZnVuYyA9IFVOS05PV05fRlVOQ1RJT047XG4gICAgICB9XG5cbiAgICAgIHN0YWNrLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogZXh0cmFjdE1lc3NhZ2UoZXgpLFxuICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgc3RhY2s6IHN0YWNrXG4gIH07XG59XG4vKipcbiAqIFNhZmFyaSB3ZWIgZXh0ZW5zaW9ucywgc3RhcnRpbmcgdmVyc2lvbiB1bmtub3duLCBjYW4gcHJvZHVjZSBcImZyYW1lcy1vbmx5XCIgc3RhY2t0cmFjZXMuXG4gKiBXaGF0IGl0IG1lYW5zLCBpcyB0aGF0IGluc3RlYWQgb2YgZm9ybWF0IGxpa2U6XG4gKlxuICogRXJyb3I6IHdhdFxuICogICBhdCBmdW5jdGlvbkB1cmw6cm93OmNvbFxuICogICBhdCBmdW5jdGlvbkB1cmw6cm93OmNvbFxuICogICBhdCBmdW5jdGlvbkB1cmw6cm93OmNvbFxuICpcbiAqIGl0IHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlOlxuICpcbiAqICAgZnVuY3Rpb25AdXJsOnJvdzpjb2xcbiAqICAgZnVuY3Rpb25AdXJsOnJvdzpjb2xcbiAqICAgZnVuY3Rpb25AdXJsOnJvdzpjb2xcbiAqXG4gKiBCZWNhdXNlIG9mIHRoYXQsIGl0IHdvbid0IGJlIGNhcHR1cmVkIGJ5IGBjaHJvbWVgIFJlZ0V4cCBhbmQgd2lsbCBmYWxsIGludG8gYEdlY2tvYCBicmFuY2guXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGV4dHJhY3RlZCBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgaW4gYm90aCBwbGFjZXMgd2l0aG91dCBkdXBsaWNhdGluZyB0aGUgbG9naWMuXG4gKiBVbmZvcnR1bmF0ZWxseSBcImp1c3RcIiBjaGFuZ2luZyBSZWdFeHAgaXMgdG9vIGNvbXBsaWNhdGVkIG5vdyBhbmQgbWFraW5nIGl0IHBhc3MgYWxsIHRlc3RzXG4gKiBhbmQgZml4IHRoaXMgY2FzZSBzZWVtcyBsaWtlIGFuIGltcG9zc2libGUsIG9yIGF0IGxlYXN0IHdheSB0b28gdGltZS1jb25zdW1pbmcgdGFzay5cbiAqL1xuXG5cbnZhciBleHRyYWN0U2FmYXJpRXh0ZW5zaW9uRGV0YWlscyA9IGZ1bmN0aW9uIGV4dHJhY3RTYWZhcmlFeHRlbnNpb25EZXRhaWxzKGZ1bmMsIHVybCkge1xuICB2YXIgaXNTYWZhcmlFeHRlbnNpb24gPSBmdW5jLmluZGV4T2YoJ3NhZmFyaS1leHRlbnNpb24nKSAhPT0gLTE7XG4gIHZhciBpc1NhZmFyaVdlYkV4dGVuc2lvbiA9IGZ1bmMuaW5kZXhPZignc2FmYXJpLXdlYi1leHRlbnNpb24nKSAhPT0gLTE7XG4gIHJldHVybiBpc1NhZmFyaUV4dGVuc2lvbiB8fCBpc1NhZmFyaVdlYkV4dGVuc2lvbiA/IFtmdW5jLmluZGV4T2YoJ0AnKSAhPT0gLTEgPyBmdW5jLnNwbGl0KCdAJylbMF0gOiBVTktOT1dOX0ZVTkNUSU9OLCBpc1NhZmFyaUV4dGVuc2lvbiA/IFwic2FmYXJpLWV4dGVuc2lvbjpcIiArIHVybCA6IFwic2FmYXJpLXdlYi1leHRlbnNpb246XCIgKyB1cmxdIDogW2Z1bmMsIHVybF07XG59O1xuLyoqIFJlbW92ZSBOIG51bWJlciBvZiBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgKi9cblxuXG5mdW5jdGlvbiBwb3BGcmFtZXMoc3RhY2t0cmFjZSwgcG9wU2l6ZSkge1xuICB0cnkge1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3RhY2t0cmFjZSksIHtcbiAgICAgIHN0YWNrOiBzdGFja3RyYWNlLnN0YWNrLnNsaWNlKHBvcFNpemUpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RhY2t0cmFjZTtcbiAgfVxufVxuLyoqXG4gKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgc3RhY2t0cmFjZS5tZXNzYWdlIGlzIGFuIEV2ZW50IG9iamVjdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMTk0OVxuICogSW4gdGhpcyBzcGVjaWZpYyBjYXNlIHdlIHRyeSB0byBleHRyYWN0IHN0YWNrdHJhY2UubWVzc2FnZS5lcnJvci5tZXNzYWdlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cblxuZnVuY3Rpb24gZXh0cmFjdE1lc3NhZ2UoZXgpIHtcbiAgdmFyIG1lc3NhZ2UgPSBleCAmJiBleC5tZXNzYWdlO1xuXG4gIGlmICghbWVzc2FnZSkge1xuICAgIHJldHVybiAnTm8gZXJyb3IgbWVzc2FnZSc7XG4gIH1cblxuICBpZiAobWVzc2FnZS5lcnJvciAmJiB0eXBlb2YgbWVzc2FnZS5lcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtZXNzYWdlLmVycm9yLm1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gbWVzc2FnZTtcbn0iLCJpbXBvcnQgeyBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UsIGlzRXZlbnQsIG5vcm1hbGl6ZVRvU2l6ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0YWNrVHJhY2UgfSBmcm9tICcuL3RyYWNla2l0JztcbnZhciBTVEFDS1RSQUNFX0xJTUlUID0gNTA7XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBUcmFjZUtpdFN0YWNrVHJhY2VcbiAqIEBwYXJhbSBzdGFja3RyYWNlIFRyYWNlS2l0U3RhY2tUcmFjZSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvblxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGNlcHRpb25Gcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKSB7XG4gIHZhciBmcmFtZXMgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gIHZhciBleGNlcHRpb24gPSB7XG4gICAgdHlwZTogc3RhY2t0cmFjZS5uYW1lLFxuICAgIHZhbHVlOiBzdGFja3RyYWNlLm1lc3NhZ2VcbiAgfTtcblxuICBpZiAoZnJhbWVzICYmIGZyYW1lcy5sZW5ndGgpIHtcbiAgICBleGNlcHRpb24uc3RhY2t0cmFjZSA9IHtcbiAgICAgIGZyYW1lczogZnJhbWVzXG4gICAgfTtcbiAgfVxuXG4gIGlmIChleGNlcHRpb24udHlwZSA9PT0gdW5kZWZpbmVkICYmIGV4Y2VwdGlvbi52YWx1ZSA9PT0gJycpIHtcbiAgICBleGNlcHRpb24udmFsdWUgPSAnVW5yZWNvdmVyYWJsZSBlcnJvciBjYXVnaHQnO1xuICB9XG5cbiAgcmV0dXJuIGV4Y2VwdGlvbjtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21QbGFpbk9iamVjdChleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwgcmVqZWN0aW9uKSB7XG4gIHZhciBldmVudCA9IHtcbiAgICBleGNlcHRpb246IHtcbiAgICAgIHZhbHVlczogW3tcbiAgICAgICAgdHlwZTogaXNFdmVudChleGNlcHRpb24pID8gZXhjZXB0aW9uLmNvbnN0cnVjdG9yLm5hbWUgOiByZWplY3Rpb24gPyAnVW5oYW5kbGVkUmVqZWN0aW9uJyA6ICdFcnJvcicsXG4gICAgICAgIHZhbHVlOiBcIk5vbi1FcnJvciBcIiArIChyZWplY3Rpb24gPyAncHJvbWlzZSByZWplY3Rpb24nIDogJ2V4Y2VwdGlvbicpICsgXCIgY2FwdHVyZWQgd2l0aCBrZXlzOiBcIiArIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZShleGNlcHRpb24pXG4gICAgICB9XVxuICAgIH0sXG4gICAgZXh0cmE6IHtcbiAgICAgIF9fc2VyaWFsaXplZF9fOiBub3JtYWxpemVUb1NpemUoZXhjZXB0aW9uKVxuICAgIH1cbiAgfTtcblxuICBpZiAoc3ludGhldGljRXhjZXB0aW9uKSB7XG4gICAgdmFyIHN0YWNrdHJhY2UgPSBjb21wdXRlU3RhY2tUcmFjZShzeW50aGV0aWNFeGNlcHRpb24pO1xuICAgIHZhciBmcmFtZXNfMSA9IHByZXBhcmVGcmFtZXNGb3JFdmVudChzdGFja3RyYWNlLnN0YWNrKTtcbiAgICBldmVudC5zdGFja3RyYWNlID0ge1xuICAgICAgZnJhbWVzOiBmcmFtZXNfMVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZXZlbnQ7XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRGcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKSB7XG4gIHZhciBleGNlcHRpb24gPSBleGNlcHRpb25Gcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKTtcbiAgcmV0dXJuIHtcbiAgICBleGNlcHRpb246IHtcbiAgICAgIHZhbHVlczogW2V4Y2VwdGlvbl1cbiAgICB9XG4gIH07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrKSB7XG4gIGlmICghc3RhY2sgfHwgIXN0YWNrLmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsb2NhbFN0YWNrID0gc3RhY2s7XG4gIHZhciBmaXJzdEZyYW1lRnVuY3Rpb24gPSBsb2NhbFN0YWNrWzBdLmZ1bmMgfHwgJyc7XG4gIHZhciBsYXN0RnJhbWVGdW5jdGlvbiA9IGxvY2FsU3RhY2tbbG9jYWxTdGFjay5sZW5ndGggLSAxXS5mdW5jIHx8ICcnOyAvLyBJZiBzdGFjayBzdGFydHMgd2l0aCBvbmUgb2Ygb3VyIEFQSSBjYWxscywgcmVtb3ZlIGl0IChzdGFydHMsIG1lYW5pbmcgaXQncyB0aGUgdG9wIG9mIHRoZSBzdGFjayAtIGFrYSBsYXN0IGNhbGwpXG5cbiAgaWYgKGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlTWVzc2FnZScpICE9PSAtMSB8fCBmaXJzdEZyYW1lRnVuY3Rpb24uaW5kZXhPZignY2FwdHVyZUV4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIGxvY2FsU3RhY2sgPSBsb2NhbFN0YWNrLnNsaWNlKDEpO1xuICB9IC8vIElmIHN0YWNrIGVuZHMgd2l0aCBvbmUgb2Ygb3VyIGludGVybmFsIEFQSSBjYWxscywgcmVtb3ZlIGl0IChlbmRzLCBtZWFuaW5nIGl0J3MgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgLSBha2EgdG9wLW1vc3QgY2FsbClcblxuXG4gIGlmIChsYXN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdzZW50cnlXcmFwcGVkJykgIT09IC0xKSB7XG4gICAgbG9jYWxTdGFjayA9IGxvY2FsU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9IC8vIFRoZSBmcmFtZSB3aGVyZSB0aGUgY3Jhc2ggaGFwcGVuZWQsIHNob3VsZCBiZSB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgYXJyYXlcblxuXG4gIHJldHVybiBsb2NhbFN0YWNrLnNsaWNlKDAsIFNUQUNLVFJBQ0VfTElNSVQpLm1hcChmdW5jdGlvbiAoZnJhbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sbm86IGZyYW1lLmNvbHVtbiA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZyYW1lLmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiBmcmFtZS51cmwgfHwgbG9jYWxTdGFja1swXS51cmwsXG4gICAgICBmdW5jdGlvbjogZnJhbWUuZnVuYyB8fCAnPycsXG4gICAgICBpbl9hcHA6IHRydWUsXG4gICAgICBsaW5lbm86IGZyYW1lLmxpbmUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBmcmFtZS5saW5lXG4gICAgfTtcbiAgfSkucmV2ZXJzZSgpO1xufSIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBhZGRFeGNlcHRpb25UeXBlVmFsdWUsIGlzRE9NRXJyb3IsIGlzRE9NRXhjZXB0aW9uLCBpc0Vycm9yLCBpc0Vycm9yRXZlbnQsIGlzRXZlbnQsIGlzUGxhaW5PYmplY3QsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBldmVudEZyb21QbGFpbk9iamVjdCwgZXZlbnRGcm9tU3RhY2t0cmFjZSwgcHJlcGFyZUZyYW1lc0ZvckV2ZW50IH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi90cmFjZWtpdCc7XG4vKipcbiAqIEJ1aWxkcyBhbmQgRXZlbnQgZnJvbSBhIEV4Y2VwdGlvblxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21FeGNlcHRpb24ob3B0aW9ucywgZXhjZXB0aW9uLCBoaW50KSB7XG4gIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSBoaW50ICYmIGhpbnQuc3ludGhldGljRXhjZXB0aW9uIHx8IHVuZGVmaW5lZDtcbiAgdmFyIGV2ZW50ID0gZXZlbnRGcm9tVW5rbm93bklucHV0KGV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCB7XG4gICAgYXR0YWNoU3RhY2t0cmFjZTogb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlXG4gIH0pO1xuICBhZGRFeGNlcHRpb25NZWNoYW5pc20oZXZlbnQsIHtcbiAgICBoYW5kbGVkOiB0cnVlLFxuICAgIHR5cGU6ICdnZW5lcmljJ1xuICB9KTtcbiAgZXZlbnQubGV2ZWwgPSBTZXZlcml0eS5FcnJvcjtcblxuICBpZiAoaGludCAmJiBoaW50LmV2ZW50X2lkKSB7XG4gICAgZXZlbnQuZXZlbnRfaWQgPSBoaW50LmV2ZW50X2lkO1xuICB9XG5cbiAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZXZlbnQpO1xufVxuLyoqXG4gKiBCdWlsZHMgYW5kIEV2ZW50IGZyb20gYSBNZXNzYWdlXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbU1lc3NhZ2Uob3B0aW9ucywgbWVzc2FnZSwgbGV2ZWwsIGhpbnQpIHtcbiAgaWYgKGxldmVsID09PSB2b2lkIDApIHtcbiAgICBsZXZlbCA9IFNldmVyaXR5LkluZm87XG4gIH1cblxuICB2YXIgc3ludGhldGljRXhjZXB0aW9uID0gaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbiB8fCB1bmRlZmluZWQ7XG4gIHZhciBldmVudCA9IGV2ZW50RnJvbVN0cmluZyhtZXNzYWdlLCBzeW50aGV0aWNFeGNlcHRpb24sIHtcbiAgICBhdHRhY2hTdGFja3RyYWNlOiBvcHRpb25zLmF0dGFjaFN0YWNrdHJhY2VcbiAgfSk7XG4gIGV2ZW50LmxldmVsID0gbGV2ZWw7XG5cbiAgaWYgKGhpbnQgJiYgaGludC5ldmVudF9pZCkge1xuICAgIGV2ZW50LmV2ZW50X2lkID0gaGludC5ldmVudF9pZDtcbiAgfVxuXG4gIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGV2ZW50KTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21Vbmtub3duSW5wdXQoZXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBldmVudDtcblxuICBpZiAoaXNFcnJvckV2ZW50KGV4Y2VwdGlvbikgJiYgZXhjZXB0aW9uLmVycm9yKSB7XG4gICAgLy8gSWYgaXQgaXMgYW4gRXJyb3JFdmVudCB3aXRoIGBlcnJvcmAgcHJvcGVydHksIGV4dHJhY3QgaXQgdG8gZ2V0IGFjdHVhbCBFcnJvclxuICAgIHZhciBlcnJvckV2ZW50ID0gZXhjZXB0aW9uOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblxuICAgIGV4Y2VwdGlvbiA9IGVycm9yRXZlbnQuZXJyb3I7XG4gICAgZXZlbnQgPSBldmVudEZyb21TdGFja3RyYWNlKGNvbXB1dGVTdGFja1RyYWNlKGV4Y2VwdGlvbikpO1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIGlmIChpc0RPTUVycm9yKGV4Y2VwdGlvbikgfHwgaXNET01FeGNlcHRpb24oZXhjZXB0aW9uKSkge1xuICAgIC8vIElmIGl0IGlzIGEgRE9NRXJyb3Igb3IgRE9NRXhjZXB0aW9uICh3aGljaCBhcmUgbGVnYWN5IEFQSXMsIGJ1dCBzdGlsbCBzdXBwb3J0ZWQgaW4gc29tZSBicm93c2VycylcbiAgICAvLyB0aGVuIHdlIGp1c3QgZXh0cmFjdCB0aGUgbmFtZSwgY29kZSwgYW5kIG1lc3NhZ2UsIGFzIHRoZXkgZG9uJ3QgcHJvdmlkZSBhbnl0aGluZyBlbHNlXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUVycm9yXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUV4Y2VwdGlvblxuICAgIHZhciBkb21FeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgdmFyIG5hbWVfMSA9IGRvbUV4Y2VwdGlvbi5uYW1lIHx8IChpc0RPTUVycm9yKGRvbUV4Y2VwdGlvbikgPyAnRE9NRXJyb3InIDogJ0RPTUV4Y2VwdGlvbicpO1xuICAgIHZhciBtZXNzYWdlID0gZG9tRXhjZXB0aW9uLm1lc3NhZ2UgPyBuYW1lXzEgKyBcIjogXCIgKyBkb21FeGNlcHRpb24ubWVzc2FnZSA6IG5hbWVfMTtcbiAgICBldmVudCA9IGV2ZW50RnJvbVN0cmluZyhtZXNzYWdlLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMpO1xuICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShldmVudCwgbWVzc2FnZSk7XG5cbiAgICBpZiAoJ2NvZGUnIGluIGRvbUV4Y2VwdGlvbikge1xuICAgICAgZXZlbnQudGFncyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBldmVudC50YWdzKSwge1xuICAgICAgICAnRE9NRXhjZXB0aW9uLmNvZGUnOiBcIlwiICsgZG9tRXhjZXB0aW9uLmNvZGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIGlmIChpc0Vycm9yKGV4Y2VwdGlvbikpIHtcbiAgICAvLyB3ZSBoYXZlIGEgcmVhbCBFcnJvciBvYmplY3QsIGRvIG5vdGhpbmdcbiAgICBldmVudCA9IGV2ZW50RnJvbVN0YWNrdHJhY2UoY29tcHV0ZVN0YWNrVHJhY2UoZXhjZXB0aW9uKSk7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoZXhjZXB0aW9uKSB8fCBpc0V2ZW50KGV4Y2VwdGlvbikpIHtcbiAgICAvLyBJZiBpdCBpcyBwbGFpbiBPYmplY3Qgb3IgRXZlbnQsIHNlcmlhbGl6ZSBpdCBtYW51YWxseSBhbmQgZXh0cmFjdCBvcHRpb25zXG4gICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIGV2ZW50cyBiYXNlZCBvbiB0b3AtbGV2ZWwga2V5c1xuICAgIC8vIHdoaWNoIGlzIG11Y2ggYmV0dGVyIHRoYW4gY3JlYXRpbmcgbmV3IGdyb3VwIHdoZW4gYW55IGtleS92YWx1ZSBjaGFuZ2VcbiAgICB2YXIgb2JqZWN0RXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICAgIGV2ZW50ID0gZXZlbnRGcm9tUGxhaW5PYmplY3Qob2JqZWN0RXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMucmVqZWN0aW9uKTtcbiAgICBhZGRFeGNlcHRpb25NZWNoYW5pc20oZXZlbnQsIHtcbiAgICAgIHN5bnRoZXRpYzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBldmVudDtcbiAgfSAvLyBJZiBub25lIG9mIHByZXZpb3VzIGNoZWNrcyB3ZXJlIHZhbGlkLCB0aGVuIGl0IG1lYW5zIHRoYXQgaXQncyBub3Q6XG4gIC8vIC0gYW4gaW5zdGFuY2Ugb2YgRE9NRXJyb3JcbiAgLy8gLSBhbiBpbnN0YW5jZSBvZiBET01FeGNlcHRpb25cbiAgLy8gLSBhbiBpbnN0YW5jZSBvZiBFdmVudFxuICAvLyAtIGFuIGluc3RhbmNlIG9mIEVycm9yXG4gIC8vIC0gYSB2YWxpZCBFcnJvckV2ZW50IChvbmUgd2l0aCBhbiBlcnJvciBwcm9wZXJ0eSlcbiAgLy8gLSBhIHBsYWluIE9iamVjdFxuICAvL1xuICAvLyBTbyBiYWlsIG91dCBhbmQgY2FwdHVyZSBpdCBhcyBhIHNpbXBsZSBtZXNzYWdlOlxuXG5cbiAgZXZlbnQgPSBldmVudEZyb21TdHJpbmcoZXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMpO1xuICBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIFwiXCIgKyBleGNlcHRpb24sIHVuZGVmaW5lZCk7XG4gIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgIHN5bnRoZXRpYzogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVN0cmluZyhpbnB1dCwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZXZlbnQgPSB7XG4gICAgbWVzc2FnZTogaW5wdXRcbiAgfTtcblxuICBpZiAob3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlICYmIHN5bnRoZXRpY0V4Y2VwdGlvbikge1xuICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2Uoc3ludGhldGljRXhjZXB0aW9uKTtcbiAgICB2YXIgZnJhbWVzXzEgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gICAgZXZlbnQuc3RhY2t0cmFjZSA9IHtcbiAgICAgIGZyYW1lczogZnJhbWVzXzFcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGV2ZW50O1xufSIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQsIF9fcmVzdCwgX19zcHJlYWQgfSBmcm9tIFwidHNsaWJcIjtcbi8qKiBFeHRyYWN0IHNkayBpbmZvIGZyb20gZnJvbSB0aGUgQVBJIG1ldGFkYXRhICovXG5cbmZ1bmN0aW9uIGdldFNka01ldGFkYXRhRm9yRW52ZWxvcGVIZWFkZXIoYXBpKSB7XG4gIGlmICghYXBpLm1ldGFkYXRhIHx8ICFhcGkubWV0YWRhdGEuc2RrKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9hID0gYXBpLm1ldGFkYXRhLnNkayxcbiAgICAgIG5hbWUgPSBfYS5uYW1lLFxuICAgICAgdmVyc2lvbiA9IF9hLnZlcnNpb247XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZSxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uXG4gIH07XG59XG4vKipcbiAqIEFwcGx5IFNka0luZm8gKG5hbWUsIHZlcnNpb24sIHBhY2thZ2VzLCBpbnRlZ3JhdGlvbnMpIHRvIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGtleS5cbiAqIE1lcmdlIHdpdGggZXhpc3RpbmcgZGF0YSBpZiBhbnkuXG4gKiovXG5cblxuZnVuY3Rpb24gZW5oYW5jZUV2ZW50V2l0aFNka0luZm8oZXZlbnQsIHNka0luZm8pIHtcbiAgaWYgKCFzZGtJbmZvKSB7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgZXZlbnQuc2RrID0gZXZlbnQuc2RrIHx8IHt9O1xuICBldmVudC5zZGsubmFtZSA9IGV2ZW50LnNkay5uYW1lIHx8IHNka0luZm8ubmFtZTtcbiAgZXZlbnQuc2RrLnZlcnNpb24gPSBldmVudC5zZGsudmVyc2lvbiB8fCBzZGtJbmZvLnZlcnNpb247XG4gIGV2ZW50LnNkay5pbnRlZ3JhdGlvbnMgPSBfX3NwcmVhZChldmVudC5zZGsuaW50ZWdyYXRpb25zIHx8IFtdLCBzZGtJbmZvLmludGVncmF0aW9ucyB8fCBbXSk7XG4gIGV2ZW50LnNkay5wYWNrYWdlcyA9IF9fc3ByZWFkKGV2ZW50LnNkay5wYWNrYWdlcyB8fCBbXSwgc2RrSW5mby5wYWNrYWdlcyB8fCBbXSk7XG4gIHJldHVybiBldmVudDtcbn1cbi8qKiBDcmVhdGVzIGEgU2VudHJ5UmVxdWVzdCBmcm9tIGEgU2Vzc2lvbi4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uLCBhcGkpIHtcbiAgdmFyIHNka0luZm8gPSBnZXRTZGtNZXRhZGF0YUZvckVudmVsb3BlSGVhZGVyKGFwaSk7XG4gIHZhciBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeShfX2Fzc2lnbihfX2Fzc2lnbih7XG4gICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH0sIHNka0luZm8gJiYge1xuICAgIHNkazogc2RrSW5mb1xuICB9KSwgYXBpLmZvcmNlRW52ZWxvcGUoKSAmJiB7XG4gICAgZHNuOiBhcGkuZ2V0RHNuKCkudG9TdHJpbmcoKVxuICB9KSk7IC8vIEkga25vdyB0aGlzIGlzIGhhY2t5IGJ1dCB3ZSBkb24ndCB3YW50IHRvIGFkZCBgc2Vzc2lvbmAgdG8gcmVxdWVzdCB0eXBlIHNpbmNlIGl0J3MgbmV2ZXIgcmF0ZSBsaW1pdGVkXG5cbiAgdmFyIHR5cGUgPSAnYWdncmVnYXRlcycgaW4gc2Vzc2lvbiA/ICdzZXNzaW9ucycgOiAnc2Vzc2lvbic7XG4gIHZhciBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICB0eXBlOiB0eXBlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGJvZHk6IGVudmVsb3BlSGVhZGVycyArIFwiXFxuXCIgKyBpdGVtSGVhZGVycyArIFwiXFxuXCIgKyBKU09OLnN0cmluZ2lmeShzZXNzaW9uKSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIHVybDogYXBpLmdldEVudmVsb3BlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKVxuICB9O1xufVxuLyoqIENyZWF0ZXMgYSBTZW50cnlSZXF1ZXN0IGZyb20gYW4gZXZlbnQuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgYXBpKSB7XG4gIHZhciBzZGtJbmZvID0gZ2V0U2RrTWV0YWRhdGFGb3JFbnZlbG9wZUhlYWRlcihhcGkpO1xuICB2YXIgZXZlbnRUeXBlID0gZXZlbnQudHlwZSB8fCAnZXZlbnQnO1xuICB2YXIgdXNlRW52ZWxvcGUgPSBldmVudFR5cGUgPT09ICd0cmFuc2FjdGlvbicgfHwgYXBpLmZvcmNlRW52ZWxvcGUoKTtcblxuICB2YXIgX2EgPSBldmVudC5kZWJ1Z19tZXRhIHx8IHt9LFxuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZyA9IF9hLnRyYW5zYWN0aW9uU2FtcGxpbmcsXG4gICAgICBtZXRhZGF0YSA9IF9fcmVzdChfYSwgW1widHJhbnNhY3Rpb25TYW1wbGluZ1wiXSk7XG5cbiAgdmFyIF9iID0gdHJhbnNhY3Rpb25TYW1wbGluZyB8fCB7fSxcbiAgICAgIHNhbXBsaW5nTWV0aG9kID0gX2IubWV0aG9kLFxuICAgICAgc2FtcGxlUmF0ZSA9IF9iLnJhdGU7XG5cbiAgaWYgKE9iamVjdC5rZXlzKG1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgZXZlbnQuZGVidWdfbWV0YTtcbiAgfSBlbHNlIHtcbiAgICBldmVudC5kZWJ1Z19tZXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICB2YXIgcmVxID0ge1xuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHNka0luZm8gPyBlbmhhbmNlRXZlbnRXaXRoU2RrSW5mbyhldmVudCwgYXBpLm1ldGFkYXRhLnNkaykgOiBldmVudCksXG4gICAgdHlwZTogZXZlbnRUeXBlLFxuICAgIHVybDogdXNlRW52ZWxvcGUgPyBhcGkuZ2V0RW52ZWxvcGVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpIDogYXBpLmdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKVxuICB9OyAvLyBodHRwczovL2RldmVsb3Auc2VudHJ5LmRldi9zZGsvZW52ZWxvcGVzL1xuICAvLyBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIG1hbmlwdWxhdGUgZW52ZWxvcGVzIG5vciBzdG9yZSB0aGVtLCB0aGVyZSBpcyBub1xuICAvLyBleHBvcnRlZCBjb25jZXB0IG9mIGFuIEVudmVsb3BlIHdpdGggb3BlcmF0aW9ucyBpbmNsdWRpbmcgc2VyaWFsaXphdGlvbiBhbmRcbiAgLy8gZGVzZXJpYWxpemF0aW9uLiBJbnN0ZWFkLCB3ZSBvbmx5IGltcGxlbWVudCBhIG1pbmltYWwgc3Vic2V0IG9mIHRoZSBzcGVjIHRvXG4gIC8vIHNlcmlhbGl6ZSBldmVudHMgaW5saW5lIGhlcmUuXG5cbiAgaWYgKHVzZUVudmVsb3BlKSB7XG4gICAgdmFyIGVudmVsb3BlSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KF9fYXNzaWduKF9fYXNzaWduKHtcbiAgICAgIGV2ZW50X2lkOiBldmVudC5ldmVudF9pZCxcbiAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIH0sIHNka0luZm8gJiYge1xuICAgICAgc2RrOiBzZGtJbmZvXG4gICAgfSksIGFwaS5mb3JjZUVudmVsb3BlKCkgJiYge1xuICAgICAgZHNuOiBhcGkuZ2V0RHNuKCkudG9TdHJpbmcoKVxuICAgIH0pKTtcbiAgICB2YXIgaXRlbUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0eXBlOiBldmVudFR5cGUsXG4gICAgICAvLyBUT0RPOiBSaWdodCBub3csIHNhbXBsZVJhdGUgbWF5IG9yIG1heSBub3QgYmUgZGVmaW5lZCAoaXQgd29uJ3QgYmUgaW4gdGhlIGNhc2VzIG9mIGluaGVyaXRhbmNlIGFuZFxuICAgICAgLy8gZXhwbGljaXRseS1zZXQgc2FtcGxpbmcgZGVjaXNpb25zKS4gQXJlIHdlIGdvb2Qgd2l0aCB0aGF0P1xuICAgICAgc2FtcGxlX3JhdGVzOiBbe1xuICAgICAgICBpZDogc2FtcGxpbmdNZXRob2QsXG4gICAgICAgIHJhdGU6IHNhbXBsZVJhdGVcbiAgICAgIH1dXG4gICAgfSk7IC8vIFRoZSB0cmFpbGluZyBuZXdsaW5lIGlzIG9wdGlvbmFsLiBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHNlbmQgaXQgdG8gYXZvaWRcbiAgICAvLyBzZW5kaW5nIHVubmVjZXNzYXJ5IGJ5dGVzLlxuICAgIC8vXG4gICAgLy8gY29uc3QgZW52ZWxvcGUgPSBgJHtlbnZlbG9wZUhlYWRlcnN9XFxuJHtpdGVtSGVhZGVyc31cXG4ke3JlcS5ib2R5fVxcbmA7XG5cbiAgICB2YXIgZW52ZWxvcGUgPSBlbnZlbG9wZUhlYWRlcnMgKyBcIlxcblwiICsgaXRlbUhlYWRlcnMgKyBcIlxcblwiICsgcmVxLmJvZHk7XG4gICAgcmVxLmJvZHkgPSBlbnZlbG9wZTtcbiAgfVxuXG4gIHJldHVybiByZXE7XG59IiwiaW1wb3J0IHsgRHNuLCB1cmxFbmNvZGUgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbnZhciBTRU5UUllfQVBJX1ZFUlNJT04gPSAnNyc7XG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHVybHMsIGhlYWRlcnMgYW5kIG1ldGFkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybVxuICogZGlmZmVyZW50IHR5cGVzIG9mIHJlcXVlc3RzIHRvIFNlbnRyeSBlbmRwb2ludHMuXG4gKiBTdXBwb3J0cyBib3RoIGVudmVsb3BlcyBhbmQgcmVndWxhciBldmVudCByZXF1ZXN0cy5cbiAqKi9cblxudmFyIEFQSSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQVBJICovXG4gIGZ1bmN0aW9uIEFQSShkc24sIG1ldGFkYXRhLCB0dW5uZWwpIHtcbiAgICBpZiAobWV0YWRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YWRhdGEgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLmRzbiA9IGRzbjtcbiAgICB0aGlzLl9kc25PYmplY3QgPSBuZXcgRHNuKGRzbik7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgIHRoaXMuX3R1bm5lbCA9IHR1bm5lbDtcbiAgfVxuICAvKiogUmV0dXJucyB0aGUgRHNuIG9iamVjdC4gKi9cblxuXG4gIEFQSS5wcm90b3R5cGUuZ2V0RHNuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9kc25PYmplY3Q7XG4gIH07XG4gIC8qKiBEb2VzIHRoaXMgdHJhbnNwb3J0IGZvcmNlIGVudmVsb3Blcz8gKi9cblxuXG4gIEFQSS5wcm90b3R5cGUuZm9yY2VFbnZlbG9wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISF0aGlzLl90dW5uZWw7XG4gIH07XG4gIC8qKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gY29uc3RydWN0IFNlbnRyeSBpbmdlc3Rpb24gQVBJIGVuZHBvaW50cy4gKi9cblxuXG4gIEFQSS5wcm90b3R5cGUuZ2V0QmFzZUFwaUVuZHBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIHZhciBwcm90b2NvbCA9IGRzbi5wcm90b2NvbCA/IGRzbi5wcm90b2NvbCArIFwiOlwiIDogJyc7XG4gICAgdmFyIHBvcnQgPSBkc24ucG9ydCA/IFwiOlwiICsgZHNuLnBvcnQgOiAnJztcbiAgICByZXR1cm4gcHJvdG9jb2wgKyBcIi8vXCIgKyBkc24uaG9zdCArIHBvcnQgKyAoZHNuLnBhdGggPyBcIi9cIiArIGRzbi5wYXRoIDogJycpICsgXCIvYXBpL1wiO1xuICB9O1xuICAvKiogUmV0dXJucyB0aGUgc3RvcmUgZW5kcG9pbnQgVVJMLiAqL1xuXG5cbiAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnc3RvcmUnKTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0b3JlIGVuZHBvaW50IFVSTCB3aXRoIGF1dGggaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgKi9cblxuXG4gIEFQSS5wcm90b3R5cGUuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdG9yZUVuZHBvaW50KCkgKyBcIj9cIiArIHRoaXMuX2VuY29kZWRBdXRoKCk7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbnZlbG9wZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAqXG4gICAqIFNlbmRpbmcgYXV0aCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcgYW5kIG5vdCBhcyBjdXN0b20gSFRUUCBoZWFkZXJzIGF2b2lkcyBDT1JTIHByZWZsaWdodCByZXF1ZXN0cy5cbiAgICovXG5cblxuICBBUEkucHJvdG90eXBlLmdldEVudmVsb3BlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZm9yY2VFbnZlbG9wZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHVubmVsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nZXRFbnZlbG9wZUVuZHBvaW50KCkgKyBcIj9cIiArIHRoaXMuX2VuY29kZWRBdXRoKCk7XG4gIH07XG4gIC8qKiBSZXR1cm5zIG9ubHkgdGhlIHBhdGggY29tcG9uZW50IGZvciB0aGUgc3RvcmUgZW5kcG9pbnQuICovXG5cblxuICBBUEkucHJvdG90eXBlLmdldFN0b3JlRW5kcG9pbnRQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIHJldHVybiAoZHNuLnBhdGggPyBcIi9cIiArIGRzbi5wYXRoIDogJycpICsgXCIvYXBpL1wiICsgZHNuLnByb2plY3RJZCArIFwiL3N0b3JlL1wiO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiByZXF1ZXN0IGhlYWRlcnMuXG4gICAqIFRoaXMgaXMgbmVlZGVkIGZvciBub2RlIGFuZCB0aGUgb2xkIC9zdG9yZSBlbmRwb2ludCBpbiBzZW50cnlcbiAgICovXG5cblxuICBBUEkucHJvdG90eXBlLmdldFJlcXVlc3RIZWFkZXJzID0gZnVuY3Rpb24gKGNsaWVudE5hbWUsIGNsaWVudFZlcnNpb24pIHtcbiAgICAvLyBDSEFOR0UgVEhJUyB0byB1c2UgbWV0YWRhdGEgYnV0IGtlZXAgY2xpZW50TmFtZSBhbmQgY2xpZW50VmVyc2lvbiBjb21wYXRpYmxlXG4gICAgdmFyIGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgdmFyIGhlYWRlciA9IFtcIlNlbnRyeSBzZW50cnlfdmVyc2lvbj1cIiArIFNFTlRSWV9BUElfVkVSU0lPTl07XG4gICAgaGVhZGVyLnB1c2goXCJzZW50cnlfY2xpZW50PVwiICsgY2xpZW50TmFtZSArIFwiL1wiICsgY2xpZW50VmVyc2lvbik7XG4gICAgaGVhZGVyLnB1c2goXCJzZW50cnlfa2V5PVwiICsgZHNuLnB1YmxpY0tleSk7XG5cbiAgICBpZiAoZHNuLnBhc3MpIHtcbiAgICAgIGhlYWRlci5wdXNoKFwic2VudHJ5X3NlY3JldD1cIiArIGRzbi5wYXNzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdYLVNlbnRyeS1BdXRoJzogaGVhZGVyLmpvaW4oJywgJylcbiAgICB9O1xuICB9O1xuICAvKiogUmV0dXJucyB0aGUgdXJsIHRvIHRoZSByZXBvcnQgZGlhbG9nIGVuZHBvaW50LiAqL1xuXG5cbiAgQVBJLnByb3RvdHlwZS5nZXRSZXBvcnREaWFsb2dFbmRwb2ludCA9IGZ1bmN0aW9uIChkaWFsb2dPcHRpb25zKSB7XG4gICAgaWYgKGRpYWxvZ09wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgZGlhbG9nT3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIHZhciBlbmRwb2ludCA9IHRoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCkgKyBcImVtYmVkL2Vycm9yLXBhZ2UvXCI7XG4gICAgdmFyIGVuY29kZWRPcHRpb25zID0gW107XG4gICAgZW5jb2RlZE9wdGlvbnMucHVzaChcImRzbj1cIiArIGRzbi50b1N0cmluZygpKTtcblxuICAgIGZvciAodmFyIGtleSBpbiBkaWFsb2dPcHRpb25zKSB7XG4gICAgICBpZiAoa2V5ID09PSAnZHNuJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmICghZGlhbG9nT3B0aW9ucy51c2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlhbG9nT3B0aW9ucy51c2VyLm5hbWUpIHtcbiAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwibmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCkge1xuICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goXCJlbWFpbD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIuZW1haWwpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnNba2V5XSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmNvZGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBlbmRwb2ludCArIFwiP1wiICsgZW5jb2RlZE9wdGlvbnMuam9pbignJicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfTtcbiAgLyoqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTC4gKi9cblxuXG4gIEFQSS5wcm90b3R5cGUuX2dldEVudmVsb3BlRW5kcG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEluZ2VzdEVuZHBvaW50KCdlbnZlbG9wZScpO1xuICB9O1xuICAvKiogUmV0dXJucyB0aGUgaW5nZXN0IEFQSSBlbmRwb2ludCBmb3IgdGFyZ2V0LiAqL1xuXG5cbiAgQVBJLnByb3RvdHlwZS5fZ2V0SW5nZXN0RW5kcG9pbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX3R1bm5lbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3R1bm5lbDtcbiAgICB9XG5cbiAgICB2YXIgYmFzZSA9IHRoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCk7XG4gICAgdmFyIGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgcmV0dXJuIFwiXCIgKyBiYXNlICsgZHNuLnByb2plY3RJZCArIFwiL1wiICsgdGFyZ2V0ICsgXCIvXCI7XG4gIH07XG4gIC8qKiBSZXR1cm5zIGEgVVJMLWVuY29kZWQgc3RyaW5nIHdpdGggYXV0aCBjb25maWcgc3VpdGFibGUgZm9yIGEgcXVlcnkgc3RyaW5nLiAqL1xuXG5cbiAgQVBJLnByb3RvdHlwZS5fZW5jb2RlZEF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgdmFyIGF1dGggPSB7XG4gICAgICAvLyBXZSBzZW5kIG9ubHkgdGhlIG1pbmltdW0gc2V0IG9mIHJlcXVpcmVkIGluZm9ybWF0aW9uLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI1NzIuXG4gICAgICBzZW50cnlfa2V5OiBkc24ucHVibGljS2V5LFxuICAgICAgc2VudHJ5X3ZlcnNpb246IFNFTlRSWV9BUElfVkVSU0lPTlxuICAgIH07XG4gICAgcmV0dXJuIHVybEVuY29kZShhdXRoKTtcbiAgfTtcblxuICByZXR1cm4gQVBJO1xufSgpO1xuXG5leHBvcnQgeyBBUEkgfTsiLCJpbXBvcnQgeyBTZW50cnlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICcuL3N5bmNwcm9taXNlJztcbi8qKiBBIHNpbXBsZSBxdWV1ZSB0aGF0IGhvbGRzIHByb21pc2VzLiAqL1xuXG52YXIgUHJvbWlzZUJ1ZmZlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByb21pc2VCdWZmZXIoX2xpbWl0KSB7XG4gICAgdGhpcy5fbGltaXQgPSBfbGltaXQ7XG4gICAgLyoqIEludGVybmFsIHNldCBvZiBxdWV1ZWQgUHJvbWlzZXMgKi9cblxuICAgIHRoaXMuX2J1ZmZlciA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBTYXlzIGlmIHRoZSBidWZmZXIgaXMgcmVhZHkgdG8gdGFrZSBtb3JlIHJlcXVlc3RzXG4gICAqL1xuXG5cbiAgUHJvbWlzZUJ1ZmZlci5wcm90b3R5cGUuaXNSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGltaXQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxlbmd0aCgpIDwgdGhpcy5fbGltaXQ7XG4gIH07XG4gIC8qKlxuICAgKiBBZGQgYSBwcm9taXNlIChyZXByZXNlbnRpbmcgYW4gaW4tZmxpZ2h0IGFjdGlvbikgdG8gdGhlIHF1ZXVlLCBhbmQgc2V0IGl0IHRvIHJlbW92ZSBpdHNlbGYgb24gZnVsZmlsbG1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrUHJvZHVjZXIgQSBmdW5jdGlvbiBwcm9kdWNpbmcgYW55IFByb21pc2VMaWtlPFQ+OyBJbiBwcmV2aW91cyB2ZXJzaW9ucyB0aGlzIHVzZWQgdG8gYmUgYHRhc2s6XG4gICAqICAgICAgICBQcm9taXNlTGlrZTxUPmAsIGJ1dCB1bmRlciB0aGF0IG1vZGVsLCBQcm9taXNlcyB3ZXJlIGluc3RhbnRseSBjcmVhdGVkIG9uIHRoZSBjYWxsLXNpdGUgYW5kIHRoZWlyIGV4ZWN1dG9yXG4gICAqICAgICAgICBmdW5jdGlvbnMgdGhlcmVmb3JlIHJhbiBpbW1lZGlhdGVseS4gVGh1cywgZXZlbiBpZiB0aGUgYnVmZmVyIHdhcyBmdWxsLCB0aGUgYWN0aW9uIHN0aWxsIGhhcHBlbmVkLiBCeVxuICAgKiAgICAgICAgcmVxdWlyaW5nIHRoZSBwcm9taXNlIHRvIGJlIHdyYXBwZWQgaW4gYSBmdW5jdGlvbiwgd2UgY2FuIGRlZmVyIHByb21pc2UgY3JlYXRpb24gdW50aWwgYWZ0ZXIgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgbGltaXQgY2hlY2suXG4gICAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICAgKi9cblxuXG4gIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0YXNrUHJvZHVjZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdChuZXcgU2VudHJ5RXJyb3IoJ05vdCBhZGRpbmcgUHJvbWlzZSBkdWUgdG8gYnVmZmVyIGxpbWl0IHJlYWNoZWQuJykpO1xuICAgIH0gLy8gc3RhcnQgdGhlIHRhc2sgYW5kIGFkZCBpdHMgcHJvbWlzZSB0byB0aGUgcXVldWVcblxuXG4gICAgdmFyIHRhc2sgPSB0YXNrUHJvZHVjZXIoKTtcblxuICAgIGlmICh0aGlzLl9idWZmZXIuaW5kZXhPZih0YXNrKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2J1ZmZlci5wdXNoKHRhc2spO1xuICAgIH1cblxuICAgIHZvaWQgdGFzay50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5yZW1vdmUodGFzayk7XG4gICAgfSkgLy8gVXNlIGB0aGVuKG51bGwsIHJlamVjdGlvbkhhbmRsZXIpYCByYXRoZXIgdGhhbiBgY2F0Y2gocmVqZWN0aW9uSGFuZGxlcilgIHNvIHRoYXQgd2UgY2FuIHVzZSBgUHJvbWlzZUxpa2VgXG4gICAgLy8gcmF0aGVyIHRoYW4gYFByb21pc2VgLiBgUHJvbWlzZUxpa2VgIGRvZXNuJ3QgaGF2ZSBhIGAuY2F0Y2hgIG1ldGhvZCwgbWFraW5nIGl0cyBwb2x5ZmlsbCBzbWFsbGVyLiAoRVM1IGRpZG4ndFxuICAgIC8vIGhhdmUgcHJvbWlzZXMsIHNvIFRTIGhhcyB0byBwb2x5ZmlsbCB3aGVuIGRvd24tY29tcGlsaW5nLilcbiAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucmVtb3ZlKHRhc2spLnRoZW4obnVsbCwgZnVuY3Rpb24gKCkgey8vIFdlIGhhdmUgdG8gYWRkIGFub3RoZXIgY2F0Y2ggaGVyZSBiZWNhdXNlIGB0aGlzLnJlbW92ZSgpYCBzdGFydHMgYSBuZXcgcHJvbWlzZSBjaGFpbi5cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXNrO1xuICB9O1xuICAvKipcbiAgICogUmVtb3ZlIGEgcHJvbWlzZSBmcm9tIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgKiBAcmV0dXJucyBSZW1vdmVkIHByb21pc2UuXG4gICAqL1xuXG5cbiAgUHJvbWlzZUJ1ZmZlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICB2YXIgcmVtb3ZlZFRhc2sgPSB0aGlzLl9idWZmZXIuc3BsaWNlKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spLCAxKVswXTtcblxuICAgIHJldHVybiByZW1vdmVkVGFzaztcbiAgfTtcbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVucmVzb2x2ZWQgcHJvbWlzZXMgaW4gdGhlIHF1ZXVlLlxuICAgKi9cblxuXG4gIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aDtcbiAgfTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIGFsbCBwcm9taXNlcyBpbiB0aGUgcXVldWUgdG8gcmVzb2x2ZSBvciBmb3IgdGltZW91dCB0byBleHBpcmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUsIGluIG1zLCBhZnRlciB3aGljaCB0byByZXNvbHZlIHRvIGBmYWxzZWAgaWYgdGhlIHF1ZXVlIGlzIHN0aWxsIG5vbi1lbXB0eS4gUGFzc2luZyBgMGAgKG9yXG4gICAqIG5vdCBwYXNzaW5nIGFueXRoaW5nKSB3aWxsIG1ha2UgdGhlIHByb21pc2Ugd2FpdCBhcyBsb25nIGFzIGl0IHRha2VzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4gYmVmb3JlIHJlc29sdmluZyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgdG8gYHRydWVgIGlmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5IG9yIGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIGFuZFxuICAgKiBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cblxuXG4gIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKHRpbWVvdXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgLy8gd2FpdCBmb3IgYHRpbWVvdXRgIG1zIGFuZCB0aGVuIHJlc29sdmUgdG8gYGZhbHNlYCAoaWYgbm90IGNhbmNlbGxlZCBmaXJzdClcbiAgICAgIHZhciBjYXB0dXJlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCA+IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7IC8vIGlmIGFsbCBwcm9taXNlcyByZXNvbHZlIGluIHRpbWUsIGNhbmNlbCB0aGUgdGltZXIgYW5kIHJlc29sdmUgdG8gYHRydWVgXG5cbiAgICAgIHZvaWQgU3luY1Byb21pc2UuYWxsKF90aGlzLl9idWZmZXIpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY2FwdHVyZWRTZXRUaW1lb3V0KTtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pLnRoZW4obnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2VCdWZmZXI7XG59KCk7XG5cbmV4cG9ydCB7IFByb21pc2VCdWZmZXIgfTsiLCJpbXBvcnQgeyBfX3JlYWQsIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBUEkgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciwgcGFyc2VSZXRyeUFmdGVySGVhZGVyLCBQcm9taXNlQnVmZmVyLCBTZW50cnlFcnJvciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIENBVEVHT1JZX01BUFBJTkcgPSB7XG4gIGV2ZW50OiAnZXJyb3InLFxuICB0cmFuc2FjdGlvbjogJ3RyYW5zYWN0aW9uJyxcbiAgc2Vzc2lvbjogJ3Nlc3Npb24nLFxuICBhdHRhY2htZW50OiAnYXR0YWNobWVudCdcbn07XG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4vKiogQmFzZSBUcmFuc3BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24gKi9cblxudmFyIEJhc2VUcmFuc3BvcnQgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCYXNlVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvKiogQSBzaW1wbGUgYnVmZmVyIGhvbGRpbmcgYWxsIHJlcXVlc3RzLiAqL1xuXG4gICAgdGhpcy5fYnVmZmVyID0gbmV3IFByb21pc2VCdWZmZXIoMzApO1xuICAgIC8qKiBMb2NrcyB0cmFuc3BvcnQgYWZ0ZXIgcmVjZWl2aW5nIHJhdGUgbGltaXRzIGluIGEgcmVzcG9uc2UgKi9cblxuICAgIHRoaXMuX3JhdGVMaW1pdHMgPSB7fTtcbiAgICB0aGlzLl9vdXRjb21lcyA9IHt9O1xuICAgIHRoaXMuX2FwaSA9IG5ldyBBUEkob3B0aW9ucy5kc24sIG9wdGlvbnMuX21ldGFkYXRhLCBvcHRpb25zLnR1bm5lbCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gICAgdGhpcy51cmwgPSB0aGlzLl9hcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZW5kQ2xpZW50UmVwb3J0cyAmJiBnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICAgIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZ2xvYmFsLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICBfdGhpcy5fZmx1c2hPdXRjb21lcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZVRyYW5zcG9ydC5wcm90b3R5cGUuc2VuZEV2ZW50ID0gZnVuY3Rpb24gKF8pIHtcbiAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ1RyYW5zcG9ydCBDbGFzcyBoYXMgdG8gaW1wbGVtZW50IGBzZW5kRXZlbnRgIG1ldGhvZCcpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5kcmFpbih0aW1lb3V0KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQmFzZVRyYW5zcG9ydC5wcm90b3R5cGUucmVjb3JkTG9zdEV2ZW50ID0gZnVuY3Rpb24gKHJlYXNvbiwgY2F0ZWdvcnkpIHtcbiAgICB2YXIgX2E7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zZW5kQ2xpZW50UmVwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugd2FudCB0byB0cmFjayBlYWNoIGNhdGVnb3J5IChldmVudCwgdHJhbnNhY3Rpb24sIHNlc3Npb24pIHNlcGFyYXRlbHlcbiAgICAvLyBidXQgc3RpbGwga2VlcCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBkaWZmZXJlbnQgdHlwZSBvZiBvdXRjb21lcy5cbiAgICAvLyBXZSBjb3VsZCB1c2UgbmVzdGVkIG1hcHMsIGJ1dCBpdCdzIG11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHR5cGUgdGhpcyB3YXkuXG4gICAgLy8gQSBjb3JyZWN0IHR5cGUgZm9yIG1hcC1iYXNlZCBpbXBsZW1lbnRhdGlvbiBpZiB3ZSB3YW50IHRvIGdvIHRoYXQgcm91dGVcbiAgICAvLyB3b3VsZCBiZSBgUGFydGlhbDxSZWNvcmQ8U2VudHJ5UmVxdWVzdFR5cGUsIFBhcnRpYWw8UmVjb3JkPE91dGNvbWUsIG51bWJlcj4+Pj5gXG5cblxuICAgIHZhciBrZXkgPSBDQVRFR09SWV9NQVBQSU5HW2NhdGVnb3J5XSArIFwiOlwiICsgcmVhc29uO1xuICAgIGxvZ2dlci5sb2coXCJBZGRpbmcgb3V0Y29tZTogXCIgKyBrZXkpO1xuICAgIHRoaXMuX291dGNvbWVzW2tleV0gPSAoX2EgPSB0aGlzLl9vdXRjb21lc1trZXldLCBfYSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSArIDE7XG4gIH07XG4gIC8qKlxuICAgKiBTZW5kIG91dGNvbWVzIGFzIGFuIGVudmVsb3BlXG4gICAqL1xuXG5cbiAgQmFzZVRyYW5zcG9ydC5wcm90b3R5cGUuX2ZsdXNoT3V0Y29tZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VuZENsaWVudFJlcG9ydHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbC5uYXZpZ2F0b3IgfHwgdHlwZW9mIGdsb2JhbC5uYXZpZ2F0b3Iuc2VuZEJlYWNvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ0JlYWNvbiBBUEkgbm90IGF2YWlsYWJsZSwgc2tpcHBpbmcgc2VuZGluZyBvdXRjb21lcy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3V0Y29tZXMgPSB0aGlzLl9vdXRjb21lcztcbiAgICB0aGlzLl9vdXRjb21lcyA9IHt9OyAvLyBOb3RoaW5nIHRvIHNlbmRcblxuICAgIGlmICghT2JqZWN0LmtleXMob3V0Y29tZXMpLmxlbmd0aCkge1xuICAgICAgbG9nZ2VyLmxvZygnTm8gb3V0Y29tZXMgdG8gZmx1c2gnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKFwiRmx1c2hpbmcgb3V0Y29tZXM6XFxuXCIgKyBKU09OLnN0cmluZ2lmeShvdXRjb21lcywgbnVsbCwgMikpO1xuXG4gICAgdmFyIHVybCA9IHRoaXMuX2FwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCk7IC8vIEVudmVsb3BlIGhlYWRlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCBhbiBlbXB0eSBvYmplY3RcblxuXG4gICAgdmFyIGVudmVsb3BlSGVhZGVyID0gSlNPTi5zdHJpbmdpZnkoe30pO1xuICAgIHZhciBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHR5cGU6ICdjbGllbnRfcmVwb3J0J1xuICAgIH0pO1xuICAgIHZhciBpdGVtID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdGltZXN0YW1wOiBkYXRlVGltZXN0YW1wSW5TZWNvbmRzKCksXG4gICAgICBkaXNjYXJkZWRfZXZlbnRzOiBPYmplY3Qua2V5cyhvdXRjb21lcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hID0gX19yZWFkKGtleS5zcGxpdCgnOicpLCAyKSxcbiAgICAgICAgICAgIGNhdGVnb3J5ID0gX2FbMF0sXG4gICAgICAgICAgICByZWFzb24gPSBfYVsxXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgICAgIGNhdGVnb3J5OiBjYXRlZ29yeSxcbiAgICAgICAgICBxdWFudGl0eTogb3V0Y29tZXNba2V5XVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9KTtcbiAgICB2YXIgZW52ZWxvcGUgPSBlbnZlbG9wZUhlYWRlciArIFwiXFxuXCIgKyBpdGVtSGVhZGVycyArIFwiXFxuXCIgKyBpdGVtO1xuICAgIGdsb2JhbC5uYXZpZ2F0b3Iuc2VuZEJlYWNvbih1cmwsIGVudmVsb3BlKTtcbiAgfTtcbiAgLyoqXG4gICAqIEhhbmRsZSBTZW50cnkgcmVwc29uc2UgZm9yIHByb21pc2UtYmFzZWQgdHJhbnNwb3J0cy5cbiAgICovXG5cblxuICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5faGFuZGxlUmVzcG9uc2UgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgcmVxdWVzdFR5cGUgPSBfYS5yZXF1ZXN0VHlwZSxcbiAgICAgICAgcmVzcG9uc2UgPSBfYS5yZXNwb25zZSxcbiAgICAgICAgaGVhZGVycyA9IF9hLmhlYWRlcnMsXG4gICAgICAgIHJlc29sdmUgPSBfYS5yZXNvbHZlLFxuICAgICAgICByZWplY3QgPSBfYS5yZWplY3Q7XG4gICAgdmFyIHN0YXR1cyA9IFN0YXR1cy5mcm9tSHR0cENvZGUocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAvKipcbiAgICAgKiBcIlRoZSBuYW1lIGlzIGNhc2UtaW5zZW5zaXRpdmUuXCJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGVhZGVycy9nZXRcbiAgICAgKi9cblxuICAgIHZhciBsaW1pdGVkID0gdGhpcy5faGFuZGxlUmF0ZUxpbWl0KGhlYWRlcnMpO1xuXG4gICAgaWYgKGxpbWl0ZWQpIGxvZ2dlci53YXJuKFwiVG9vIG1hbnkgXCIgKyByZXF1ZXN0VHlwZSArIFwiIHJlcXVlc3RzLCBiYWNraW5nIG9mZiB1bnRpbDogXCIgKyB0aGlzLl9kaXNhYmxlZFVudGlsKHJlcXVlc3RUeXBlKSk7XG5cbiAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuU3VjY2Vzcykge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIHN0YXR1czogc3RhdHVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZWplY3QocmVzcG9uc2UpO1xuICB9O1xuICAvKipcbiAgICogR2V0cyB0aGUgdGltZSB0aGF0IGdpdmVuIGNhdGVnb3J5IGlzIGRpc2FibGVkIHVudGlsIGZvciByYXRlIGxpbWl0aW5nXG4gICAqL1xuXG5cbiAgQmFzZVRyYW5zcG9ydC5wcm90b3R5cGUuX2Rpc2FibGVkVW50aWwgPSBmdW5jdGlvbiAocmVxdWVzdFR5cGUpIHtcbiAgICB2YXIgY2F0ZWdvcnkgPSBDQVRFR09SWV9NQVBQSU5HW3JlcXVlc3RUeXBlXTtcbiAgICByZXR1cm4gdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeV0gfHwgdGhpcy5fcmF0ZUxpbWl0cy5hbGw7XG4gIH07XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBjYXRlZ29yeSBpcyByYXRlIGxpbWl0ZWRcbiAgICovXG5cblxuICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5faXNSYXRlTGltaXRlZCA9IGZ1bmN0aW9uIChyZXF1ZXN0VHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZFVudGlsKHJlcXVlc3RUeXBlKSA+IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICB9O1xuICAvKipcbiAgICogU2V0cyBpbnRlcm5hbCBfcmF0ZUxpbWl0cyBmcm9tIGluY29taW5nIGhlYWRlcnMuIFJldHVybnMgdHJ1ZSBpZiBoZWFkZXJzIGNvbnRhaW5zIGEgbm9uLWVtcHR5IHJhdGUgbGltaXRpbmcgaGVhZGVyLlxuICAgKi9cblxuXG4gIEJhc2VUcmFuc3BvcnQucHJvdG90eXBlLl9oYW5kbGVSYXRlTGltaXQgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuXG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgdmFyIHJsSGVhZGVyID0gaGVhZGVyc1sneC1zZW50cnktcmF0ZS1saW1pdHMnXTtcbiAgICB2YXIgcmFIZWFkZXIgPSBoZWFkZXJzWydyZXRyeS1hZnRlciddO1xuXG4gICAgaWYgKHJsSGVhZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyByYXRlIGxpbWl0IGhlYWRlcnMgYXJlIG9mIHRoZSBmb3JtXG4gICAgICAgIC8vICAgICA8aGVhZGVyPiw8aGVhZGVyPiwuLlxuICAgICAgICAvLyB3aGVyZSBlYWNoIDxoZWFkZXI+IGlzIG9mIHRoZSBmb3JtXG4gICAgICAgIC8vICAgICA8cmV0cnlfYWZ0ZXI+OiA8Y2F0ZWdvcmllcz46IDxzY29wZT46IDxyZWFzb25fY29kZT5cbiAgICAgICAgLy8gd2hlcmVcbiAgICAgICAgLy8gICAgIDxyZXRyeV9hZnRlcj4gaXMgYSBkZWxheSBpbiBtc1xuICAgICAgICAvLyAgICAgPGNhdGVnb3JpZXM+IGlzIHRoZSBldmVudCB0eXBlKHMpIChlcnJvciwgdHJhbnNhY3Rpb24sIGV0YykgYmVpbmcgcmF0ZSBsaW1pdGVkIGFuZCBpcyBvZiB0aGUgZm9ybVxuICAgICAgICAvLyAgICAgICAgIDxjYXRlZ29yeT47PGNhdGVnb3J5PjsuLi5cbiAgICAgICAgLy8gICAgIDxzY29wZT4gaXMgd2hhdCdzIGJlaW5nIGxpbWl0ZWQgKG9yZywgcHJvamVjdCwgb3Iga2V5KSAtIGlnbm9yZWQgYnkgU0RLXG4gICAgICAgIC8vICAgICA8cmVhc29uX2NvZGU+IGlzIGFuIGFyYml0cmFyeSBzdHJpbmcgbGlrZSBcIm9yZ19xdW90YVwiIC0gaWdub3JlZCBieSBTREtcbiAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyhybEhlYWRlci50cmltKCkuc3BsaXQoJywnKSksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgbGltaXQgPSBfZC52YWx1ZTtcbiAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IGxpbWl0LnNwbGl0KCc6JywgMik7XG4gICAgICAgICAgdmFyIGhlYWRlckRlbGF5ID0gcGFyc2VJbnQocGFyYW1ldGVyc1swXSwgMTApO1xuICAgICAgICAgIHZhciBkZWxheSA9ICghaXNOYU4oaGVhZGVyRGVsYXkpID8gaGVhZGVyRGVsYXkgOiA2MCkgKiAxMDAwOyAvLyA2MHNlYyBkZWZhdWx0XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2UgPSAoZV8yID0gdm9pZCAwLCBfX3ZhbHVlcyhwYXJhbWV0ZXJzWzFdLnNwbGl0KCc7JykpKSwgX2YgPSBfZS5uZXh0KCk7ICFfZi5kb25lOyBfZiA9IF9lLm5leHQoKSkge1xuICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeSB8fCAnYWxsJ10gPSBuZXcgRGF0ZShub3cgKyBkZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgICAgICAgIGVfMiA9IHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVfMl8xXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoX2YgJiYgIV9mLmRvbmUgJiYgKF9iID0gX2UucmV0dXJuKSkgX2IuY2FsbChfZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgICBlXzEgPSB7XG4gICAgICAgICAgZXJyb3I6IGVfMV8xXG4gICAgICAgIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2EgPSBfYy5yZXR1cm4pKSBfYS5jYWxsKF9jKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChyYUhlYWRlcikge1xuICAgICAgdGhpcy5fcmF0ZUxpbWl0cy5hbGwgPSBuZXcgRGF0ZShub3cgKyBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIobm93LCByYUhlYWRlcikpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiBCYXNlVHJhbnNwb3J0O1xufSgpO1xuXG5leHBvcnQgeyBCYXNlVHJhbnNwb3J0IH07IiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBldmVudFRvU2VudHJ5UmVxdWVzdCwgc2Vzc2lvblRvU2VudHJ5UmVxdWVzdCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBPdXRjb21lIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGlzTmF0aXZlRmV0Y2gsIGxvZ2dlciwgU2VudHJ5RXJyb3IsIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3ksIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbi8qKlxuICogQSBzcGVjaWFsIHVzZWNhc2UgZm9yIGluY29ycmVjdGx5IHdyYXBwZWQgRmV0Y2ggQVBJcyBpbiBjb25qdW5jdGlvbiB3aXRoIGFkLWJsb2NrZXJzLlxuICogV2hlbmV2ZXIgc29tZW9uZSB3cmFwcyB0aGUgRmV0Y2ggQVBJIGFuZCByZXR1cm5zIHRoZSB3cm9uZyBwcm9taXNlIGNoYWluLFxuICogdGhpcyBjaGFpbiBiZWNvbWVzIG9ycGhhbmVkIGFuZCB0aGVyZSBpcyBubyBwb3NzaWJsZSB3YXkgdG8gY2FwdHVyZSBpdCdzIHJlamVjdGlvbnNcbiAqIG90aGVyIHRoYW4gYWxsb3dpbmcgaXQgYnViYmxlIHVwIHRvIHRoaXMgdmVyeSBoYW5kbGVyLiBlZy5cbiAqXG4gKiBjb25zdCBmID0gd2luZG93LmZldGNoO1xuICogd2luZG93LmZldGNoID0gZnVuY3Rpb24gKCkge1xuICogICBjb25zdCBwID0gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICpcbiAqICAgcC50aGVuKGZ1bmN0aW9uKCkge1xuICogICAgIGNvbnNvbGUubG9nKCdoaS4nKTtcbiAqICAgfSk7XG4gKlxuICogICByZXR1cm4gcDtcbiAqIH1cbiAqXG4gKiBgcC50aGVuKGZ1bmN0aW9uICgpIHsgLi4uIH0pYCBpcyBwcm9kdWNpbmcgYSBjb21wbGV0ZWx5IHNlcGFyYXRlIHByb21pc2UgY2hhaW4sXG4gKiBob3dldmVyLCB3aGF0J3MgcmV0dXJuZWQgaXMgYHBgIC0gdGhlIHJlc3VsdCBvZiBvcmlnaW5hbCBgZmV0Y2hgIGNhbGwuXG4gKlxuICogVGhpcyBtZWFuLCB0aGF0IHdoZW5ldmVyIHdlIHVzZSB0aGUgRmV0Y2ggQVBJIHRvIHNlbmQgb3VyIG93biByZXF1ZXN0cywgX2FuZF9cbiAqIHNvbWUgYWQtYmxvY2tlciBibG9ja3MgaXQsIHRoaXMgb3JwaGFuZWQgY2hhaW4gd2lsbCBfYWx3YXlzXyByZWplY3QsXG4gKiBlZmZlY3RpdmVseSBjYXVzaW5nIGFub3RoZXIgZXZlbnQgdG8gYmUgY2FwdHVyZWQuXG4gKiBUaGlzIG1ha2VzIGEgd2hvbGUgcHJvY2VzcyBiZWNvbWUgYW4gaW5maW5pdGUgbG9vcCwgd2hpY2ggd2UgbmVlZCB0byBzb21laG93XG4gKiBkZWFsIHdpdGgsIGFuZCBicmVhayBpdCBpbiBvbmUgd2F5IG9yIGFub3RoZXIuXG4gKlxuICogVG8gZGVhbCB3aXRoIHRoaXMgaXNzdWUsIHdlIGFyZSBtYWtpbmcgc3VyZSB0aGF0IHdlIF9hbHdheXNfIHVzZSB0aGUgcmVhbFxuICogYnJvd3NlciBGZXRjaCBBUEksIGluc3RlYWQgb2YgcmVseWluZyBvbiB3aGF0IGB3aW5kb3cuZmV0Y2hgIGV4cG9zZXMuXG4gKiBUaGUgb25seSBkb3duc2lkZSB0byB0aGlzIHdvdWxkIGJlIG1pc3Npbmcgb3VyIG93biByZXF1ZXN0cyBhcyBicmVhZGNydW1icyxcbiAqIGJ1dCBiZWNhdXNlIHdlIGFyZSBhbHJlYWR5IG5vdCBkb2luZyB0aGlzLCBpdCBzaG91bGQgYmUganVzdCBmaW5lLlxuICpcbiAqIFBvc3NpYmxlIGZhaWxlZCBmZXRjaCBlcnJvciBtZXNzYWdlcyBwZXItYnJvd3NlcjpcbiAqXG4gKiBDaHJvbWU6ICBGYWlsZWQgdG8gZmV0Y2hcbiAqIEVkZ2U6ICAgIEZhaWxlZCB0byBGZXRjaFxuICogRmlyZWZveDogTmV0d29ya0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZVxuICogU2FmYXJpOiAgcmVzb3VyY2UgYmxvY2tlZCBieSBjb250ZW50IGJsb2NrZXJcbiAqL1xuXG5mdW5jdGlvbiBnZXROYXRpdmVGZXRjaEltcGxlbWVudGF0aW9uKCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QgKi9cbiAgdmFyIF9hLCBfYjsgLy8gRmFzdCBwYXRoIHRvIGF2b2lkIERPTSBJL09cblxuXG4gIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcblxuICBpZiAoaXNOYXRpdmVGZXRjaChnbG9iYWwuZmV0Y2gpKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5mZXRjaC5iaW5kKGdsb2JhbCk7XG4gIH1cblxuICB2YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gIHZhciBmZXRjaEltcGwgPSBnbG9iYWwuZmV0Y2g7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIGlmICh0eXBlb2YgKChfYSA9IGRvY3VtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlRWxlbWVudCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgc2FuZGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgc2FuZGJveC5oaWRkZW4gPSB0cnVlO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzYW5kYm94KTtcblxuICAgICAgaWYgKChfYiA9IHNhbmRib3guY29udGVudFdpbmRvdykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZldGNoKSB7XG4gICAgICAgIGZldGNoSW1wbCA9IHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzYW5kYm94KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGNyZWF0ZSBzYW5kYm94IGlmcmFtZSBmb3IgcHVyZSBmZXRjaCBjaGVjaywgYmFpbGluZyB0byB3aW5kb3cuZmV0Y2g6ICcsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmZXRjaEltcGwuYmluZChnbG9iYWwpO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAqL1xufVxuLyoqIGBmZXRjaGAgYmFzZWQgdHJhbnNwb3J0ICovXG5cblxudmFyIEZldGNoVHJhbnNwb3J0ID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEZldGNoVHJhbnNwb3J0LCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEZldGNoVHJhbnNwb3J0KG9wdGlvbnMsIGZldGNoSW1wbCkge1xuICAgIGlmIChmZXRjaEltcGwgPT09IHZvaWQgMCkge1xuICAgICAgZmV0Y2hJbXBsID0gZ2V0TmF0aXZlRmV0Y2hJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5fZmV0Y2ggPSBmZXRjaEltcGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEZldGNoVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoZXZlbnRUb1NlbnRyeVJlcXVlc3QoZXZlbnQsIHRoaXMuX2FwaSksIGV2ZW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgRmV0Y2hUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRTZXNzaW9uID0gZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3Qoc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uLCB0aGlzLl9hcGkpLCBzZXNzaW9uKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSBzZW50cnlSZXF1ZXN0IFByZXBhcmVkIFNlbnRyeVJlcXVlc3QgdG8gYmUgZGVsaXZlcmVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbFBheWxvYWQgT3JpZ2luYWwgcGF5bG9hZCB1c2VkIHRvIGNyZWF0ZSBTZW50cnlSZXF1ZXN0XG4gICAqL1xuXG5cbiAgRmV0Y2hUcmFuc3BvcnQucHJvdG90eXBlLl9zZW5kUmVxdWVzdCA9IGZ1bmN0aW9uIChzZW50cnlSZXF1ZXN0LCBvcmlnaW5hbFBheWxvYWQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX2lzUmF0ZUxpbWl0ZWQoc2VudHJ5UmVxdWVzdC50eXBlKSkge1xuICAgICAgdGhpcy5yZWNvcmRMb3N0RXZlbnQoT3V0Y29tZS5SYXRlTGltaXRCYWNrb2ZmLCBzZW50cnlSZXF1ZXN0LnR5cGUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgZXZlbnQ6IG9yaWdpbmFsUGF5bG9hZCxcbiAgICAgICAgdHlwZTogc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICByZWFzb246IFwiVHJhbnNwb3J0IGZvciBcIiArIHNlbnRyeVJlcXVlc3QudHlwZSArIFwiIHJlcXVlc3RzIGxvY2tlZCB0aWxsIFwiICsgdGhpcy5fZGlzYWJsZWRVbnRpbChzZW50cnlSZXF1ZXN0LnR5cGUpICsgXCIgZHVlIHRvIHRvbyBtYW55IHJlcXVlc3RzLlwiLFxuICAgICAgICBzdGF0dXM6IDQyOVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBib2R5OiBzZW50cnlSZXF1ZXN0LmJvZHksXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAgICAgLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8jZmVhdD1yZWZlcnJlci1wb2xpY3lcbiAgICAgIC8vIEl0IGRvZXNuJ3QuIEFuZCBpdCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZCBvZiBpZ25vcmluZyB0aGlzIHBhcmFtZXRlci4uLlxuICAgICAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG4gICAgICByZWZlcnJlclBvbGljeTogc3VwcG9ydHNSZWZlcnJlclBvbGljeSgpID8gJ29yaWdpbicgOiAnJ1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZldGNoUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy5mZXRjaFBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm9wdGlvbnMuaGVhZGVycztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmFkZChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdm9pZCBfdGhpcy5fZmV0Y2goc2VudHJ5UmVxdWVzdC51cmwsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAneC1zZW50cnktcmF0ZS1saW1pdHMnOiByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1TZW50cnktUmF0ZS1MaW1pdHMnKSxcbiAgICAgICAgICAgICdyZXRyeS1hZnRlcic6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIF90aGlzLl9oYW5kbGVSZXNwb25zZSh7XG4gICAgICAgICAgICByZXF1ZXN0VHlwZTogc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8vIEl0J3MgZWl0aGVyIGJ1ZmZlciByZWplY3Rpb24gb3IgYW55IG90aGVyIHhoci9mZXRjaCBlcnJvciwgd2hpY2ggYXJlIHRyZWF0ZWQgYXMgTmV0d29ya0Vycm9yLlxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFNlbnRyeUVycm9yKSB7XG4gICAgICAgIF90aGlzLnJlY29yZExvc3RFdmVudChPdXRjb21lLlF1ZXVlT3ZlcmZsb3csIHNlbnRyeVJlcXVlc3QudHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5yZWNvcmRMb3N0RXZlbnQoT3V0Y29tZS5OZXR3b3JrRXJyb3IsIHNlbnRyeVJlcXVlc3QudHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmV0Y2hUcmFuc3BvcnQ7XG59KEJhc2VUcmFuc3BvcnQpO1xuXG5leHBvcnQgeyBGZXRjaFRyYW5zcG9ydCB9OyIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QsIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgT3V0Y29tZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgU2VudHJ5RXJyb3IsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbi8qKiBgWEhSYCBiYXNlZCB0cmFuc3BvcnQgKi9cblxudmFyIFhIUlRyYW5zcG9ydCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhYSFJUcmFuc3BvcnQsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gWEhSVHJhbnNwb3J0KCkge1xuICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBYSFJUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kUmVxdWVzdChldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKSwgZXZlbnQpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBYSFJUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRTZXNzaW9uID0gZnVuY3Rpb24gKHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3Qoc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uLCB0aGlzLl9hcGkpLCBzZXNzaW9uKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSBzZW50cnlSZXF1ZXN0IFByZXBhcmVkIFNlbnRyeVJlcXVlc3QgdG8gYmUgZGVsaXZlcmVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbFBheWxvYWQgT3JpZ2luYWwgcGF5bG9hZCB1c2VkIHRvIGNyZWF0ZSBTZW50cnlSZXF1ZXN0XG4gICAqL1xuXG5cbiAgWEhSVHJhbnNwb3J0LnByb3RvdHlwZS5fc2VuZFJlcXVlc3QgPSBmdW5jdGlvbiAoc2VudHJ5UmVxdWVzdCwgb3JpZ2luYWxQYXlsb2FkKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0aGlzLl9pc1JhdGVMaW1pdGVkKHNlbnRyeVJlcXVlc3QudHlwZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkTG9zdEV2ZW50KE91dGNvbWUuUmF0ZUxpbWl0QmFja29mZiwgc2VudHJ5UmVxdWVzdC50eXBlKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgIGV2ZW50OiBvcmlnaW5hbFBheWxvYWQsXG4gICAgICAgIHR5cGU6IHNlbnRyeVJlcXVlc3QudHlwZSxcbiAgICAgICAgcmVhc29uOiBcIlRyYW5zcG9ydCBmb3IgXCIgKyBzZW50cnlSZXF1ZXN0LnR5cGUgKyBcIiByZXF1ZXN0cyBsb2NrZWQgdGlsbCBcIiArIHRoaXMuX2Rpc2FibGVkVW50aWwoc2VudHJ5UmVxdWVzdC50eXBlKSArIFwiIGR1ZSB0byB0b28gbWFueSByZXF1ZXN0cy5cIixcbiAgICAgICAgc3RhdHVzOiA0MjlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9idWZmZXIuYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgIHZhciBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAneC1zZW50cnktcmF0ZS1saW1pdHMnOiByZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyKCdYLVNlbnRyeS1SYXRlLUxpbWl0cycpLFxuICAgICAgICAgICAgICAncmV0cnktYWZ0ZXInOiByZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyKCdSZXRyeS1BZnRlcicpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICByZXF1ZXN0VHlwZTogc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICAgICAgICByZXNwb25zZTogcmVxdWVzdCxcbiAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgICAgcmVqZWN0OiByZWplY3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCBzZW50cnlSZXF1ZXN0LnVybCk7XG5cbiAgICAgICAgZm9yICh2YXIgaGVhZGVyIGluIF90aGlzLm9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgX3RoaXMub3B0aW9ucy5oZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3Quc2VuZChzZW50cnlSZXF1ZXN0LmJvZHkpO1xuICAgICAgfSk7XG4gICAgfSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8vIEl0J3MgZWl0aGVyIGJ1ZmZlciByZWplY3Rpb24gb3IgYW55IG90aGVyIHhoci9mZXRjaCBlcnJvciwgd2hpY2ggYXJlIHRyZWF0ZWQgYXMgTmV0d29ya0Vycm9yLlxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFNlbnRyeUVycm9yKSB7XG4gICAgICAgIF90aGlzLnJlY29yZExvc3RFdmVudChPdXRjb21lLlF1ZXVlT3ZlcmZsb3csIHNlbnRyeVJlcXVlc3QudHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5yZWNvcmRMb3N0RXZlbnQoT3V0Y29tZS5OZXR3b3JrRXJyb3IsIHNlbnRyeVJlcXVlc3QudHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gWEhSVHJhbnNwb3J0O1xufShCYXNlVHJhbnNwb3J0KTtcblxuZXhwb3J0IHsgWEhSVHJhbnNwb3J0IH07IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQmFzZUJhY2tlbmQgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IHN1cHBvcnRzRmV0Y2ggfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV2ZW50RnJvbUV4Y2VwdGlvbiwgZXZlbnRGcm9tTWVzc2FnZSB9IGZyb20gJy4vZXZlbnRidWlsZGVyJztcbmltcG9ydCB7IEZldGNoVHJhbnNwb3J0LCBYSFJUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMnO1xuLyoqXG4gKiBUaGUgU2VudHJ5IEJyb3dzZXIgU0RLIEJhY2tlbmQuXG4gKiBAaGlkZGVuXG4gKi9cblxudmFyIEJyb3dzZXJCYWNrZW5kID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEJyb3dzZXJCYWNrZW5kLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEJyb3dzZXJCYWNrZW5kKCkge1xuICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBCcm93c2VyQmFja2VuZC5wcm90b3R5cGUuZXZlbnRGcm9tRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgaGludCkge1xuICAgIHJldHVybiBldmVudEZyb21FeGNlcHRpb24odGhpcy5fb3B0aW9ucywgZXhjZXB0aW9uLCBoaW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgbGV2ZWwsIGhpbnQpIHtcbiAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkge1xuICAgICAgbGV2ZWwgPSBTZXZlcml0eS5JbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudEZyb21NZXNzYWdlKHRoaXMuX29wdGlvbnMsIG1lc3NhZ2UsIGxldmVsLCBoaW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLl9zZXR1cFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICAvLyBXZSByZXR1cm4gdGhlIG5vb3AgdHJhbnNwb3J0IGhlcmUgaW4gY2FzZSB0aGVyZSBpcyBubyBEc24uXG4gICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fc2V0dXBUcmFuc3BvcnQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhbnNwb3J0T3B0aW9ucyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl9vcHRpb25zLnRyYW5zcG9ydE9wdGlvbnMpLCB7XG4gICAgICBkc246IHRoaXMuX29wdGlvbnMuZHNuLFxuICAgICAgdHVubmVsOiB0aGlzLl9vcHRpb25zLnR1bm5lbCxcbiAgICAgIHNlbmRDbGllbnRSZXBvcnRzOiB0aGlzLl9vcHRpb25zLnNlbmRDbGllbnRSZXBvcnRzLFxuICAgICAgX21ldGFkYXRhOiB0aGlzLl9vcHRpb25zLl9tZXRhZGF0YVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgIHJldHVybiBuZXcgRmV0Y2hUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBYSFJUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIEJyb3dzZXJCYWNrZW5kO1xufShCYXNlQmFja2VuZCk7XG5cbmV4cG9ydCB7IEJyb3dzZXJCYWNrZW5kIH07IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFQSSwgY2FwdHVyZUV4Y2VwdGlvbiwgd2l0aFNjb3BlIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGFkZEV4Y2VwdGlvbk1lY2hhbmlzbSwgYWRkRXhjZXB0aW9uVHlwZVZhbHVlLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xudmFyIGlnbm9yZU9uRXJyb3IgPSAwO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZElnbm9yZU9uRXJyb3IoKSB7XG4gIHJldHVybiBpZ25vcmVPbkVycm9yID4gMDtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVOZXh0T25FcnJvcigpIHtcbiAgLy8gb25lcnJvciBzaG91bGQgdHJpZ2dlciBiZWZvcmUgc2V0VGltZW91dFxuICBpZ25vcmVPbkVycm9yICs9IDE7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlnbm9yZU9uRXJyb3IgLT0gMTtcbiAgfSk7XG59XG4vKipcbiAqIEluc3RydW1lbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhbmQgc2VuZHMgYW4gZXZlbnQgdG8gU2VudHJ5IGV2ZXJ5IHRpbWUgdGhlXG4gKiBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwYXJhbSBmbiBBIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJucyBUaGUgd3JhcHBlZCBmdW5jdGlvbi5cbiAqIEBoaWRkZW5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcChmbiwgb3B0aW9ucywgYmVmb3JlKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBXZSBkb24ndCB3YW5uYSB3cmFwIGl0IHR3aWNlXG4gICAgaWYgKGZuLl9fc2VudHJ5X18pIHtcbiAgICAgIHJldHVybiBmbjtcbiAgICB9IC8vIElmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiB3cmFwcGVkIGluIHRoZSBwYXN0LCByZXR1cm4gdGhhdCB3cmFwcGVkIGZ1bmN0aW9uXG5cblxuICAgIGlmIChmbi5fX3NlbnRyeV93cmFwcGVkX18pIHtcbiAgICAgIHJldHVybiBmbi5fX3NlbnRyeV93cmFwcGVkX187XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSnVzdCBhY2Nlc3NpbmcgY3VzdG9tIHByb3BzIGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgLy8gY2FuIGNhdXNlIGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGV4Y2VwdGlvbiAoc2VlIHJhdmVuLWpzIzQ5NSkuXG4gICAgLy8gQmFpbCBvbiB3cmFwcGluZyBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiBhcy1pcyAoZGVmZXJzIHRvIHdpbmRvdy5vbmVycm9yKS5cbiAgICByZXR1cm4gZm47XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cblxuICB2YXIgc2VudHJ5V3JhcHBlZCA9IGZ1bmN0aW9uIHNlbnRyeVdyYXBwZWQoKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChiZWZvcmUgJiYgdHlwZW9mIGJlZm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBiZWZvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuXG5cbiAgICAgIHZhciB3cmFwcGVkQXJndW1lbnRzID0gYXJncy5tYXAoZnVuY3Rpb24gKGFyZykge1xuICAgICAgICByZXR1cm4gd3JhcChhcmcsIG9wdGlvbnMpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChmbi5oYW5kbGVFdmVudCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGludm9rZSB1c2VyLWxhbmQgZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogSWYgeW91IGFyZSBhIFNlbnRyeSB1c2VyLCBhbmQgeW91IGFyZSBzZWVpbmcgdGhpcyBzdGFjayBmcmFtZSwgaXRcbiAgICAgICAgLy8gICAgICAgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLiBUaGlzXG4gICAgICAgIC8vICAgICAgIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHNlbnRyeS5qYXZhc2NyaXB0LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIHJldHVybiBmbi5oYW5kbGVFdmVudC5hcHBseSh0aGlzLCB3cmFwcGVkQXJndW1lbnRzKTtcbiAgICAgIH0gLy8gQXR0ZW1wdCB0byBpbnZva2UgdXNlci1sYW5kIGZ1bmN0aW9uXG4gICAgICAvLyBOT1RFOiBJZiB5b3UgYXJlIGEgU2VudHJ5IHVzZXIsIGFuZCB5b3UgYXJlIHNlZWluZyB0aGlzIHN0YWNrIGZyYW1lLCBpdFxuICAgICAgLy8gICAgICAgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLiBUaGlzXG4gICAgICAvLyAgICAgICBpcyBleHBlY3RlZCBiZWhhdmlvciBhbmQgTk9UIGluZGljYXRpdmUgb2YgYSBidWcgd2l0aCBzZW50cnkuamF2YXNjcmlwdC5cblxuXG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgd3JhcHBlZEFyZ3VtZW50cyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlnbm9yZU5leHRPbkVycm9yKCk7XG4gICAgICB3aXRoU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHNjb3BlLmFkZEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHZhciBwcm9jZXNzZWRFdmVudCA9IF9fYXNzaWduKHt9LCBldmVudCk7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5tZWNoYW5pc20pIHtcbiAgICAgICAgICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShwcm9jZXNzZWRFdmVudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKHByb2Nlc3NlZEV2ZW50LCBvcHRpb25zLm1lY2hhbmlzbSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzc2VkRXZlbnQuZXh0cmEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvY2Vzc2VkRXZlbnQuZXh0cmEpLCB7XG4gICAgICAgICAgICBhcmd1bWVudHM6IGFyZ3NcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBjYXB0dXJlRXhjZXB0aW9uKGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xuICAvLyBBY2Nlc3Npbmcgc29tZSBvYmplY3RzIG1heSB0aHJvd1xuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzExNjhcblxuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZm4pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm4sIHByb3BlcnR5KSkge1xuICAgICAgICBzZW50cnlXcmFwcGVkW3Byb3BlcnR5XSA9IGZuW3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKF9vTykge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG5cbiAgZm4ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlIHx8IHt9O1xuICBzZW50cnlXcmFwcGVkLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnX19zZW50cnlfd3JhcHBlZF9fJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBzZW50cnlXcmFwcGVkXG4gIH0pOyAvLyBTaWduYWwgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyYXBwZWQvZmlsbGVkIGFscmVhZHlcbiAgLy8gZm9yIGJvdGggZGVidWdnaW5nIGFuZCB0byBwcmV2ZW50IGl0IHRvIGJlaW5nIHdyYXBwZWQvZmlsbGVkIHR3aWNlXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2VudHJ5V3JhcHBlZCwge1xuICAgIF9fc2VudHJ5X186IHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHRydWVcbiAgICB9LFxuICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IGZuXG4gICAgfVxuICB9KTsgLy8gUmVzdG9yZSBvcmlnaW5hbCBmdW5jdGlvbiBuYW1lIChub3QgYWxsIGJyb3dzZXJzIGFsbG93IHRoYXQpXG5cbiAgdHJ5IHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VudHJ5V3JhcHBlZCwgJ25hbWUnKTtcblxuICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbnRyeVdyYXBwZWQsICduYW1lJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gZm4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcblxuICB9IGNhdGNoIChfb08pIHt9XG5cbiAgcmV0dXJuIHNlbnRyeVdyYXBwZWQ7XG59XG4vKipcbiAqIEluamVjdHMgdGhlIFJlcG9ydCBEaWFsb2cgc2NyaXB0XG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJlcG9ydERpYWxvZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIWdsb2JhbC5kb2N1bWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5ldmVudElkKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwiTWlzc2luZyBldmVudElkIG9wdGlvbiBpbiBzaG93UmVwb3J0RGlhbG9nIGNhbGxcIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmRzbikge1xuICAgIGxvZ2dlci5lcnJvcihcIk1pc3NpbmcgZHNuIG9wdGlvbiBpbiBzaG93UmVwb3J0RGlhbG9nIGNhbGxcIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNjcmlwdCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgc2NyaXB0LnNyYyA9IG5ldyBBUEkob3B0aW9ucy5kc24pLmdldFJlcG9ydERpYWxvZ0VuZHBvaW50KG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zLm9uTG9hZCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICBzY3JpcHQub25sb2FkID0gb3B0aW9ucy5vbkxvYWQ7XG4gIH1cblxuICB2YXIgaW5qZWN0aW9uUG9pbnQgPSBnbG9iYWwuZG9jdW1lbnQuaGVhZCB8fCBnbG9iYWwuZG9jdW1lbnQuYm9keTtcblxuICBpZiAoaW5qZWN0aW9uUG9pbnQpIHtcbiAgICBpbmplY3Rpb25Qb2ludC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9XG59IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVhZCwgX19zcHJlYWQgfSBmcm9tIFwidHNsaWJcIjtcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cblxuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgZ2V0RXZlbnREZXNjcmlwdGlvbiwgZ2V0R2xvYmFsT2JqZWN0LCBodG1sVHJlZUFzU3RyaW5nLCBwYXJzZVVybCwgc2FmZUpvaW4gfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKlxuICogRGVmYXVsdCBCcmVhZGNydW1icyBpbnN0cnVtZW50YXRpb25zXG4gKiBUT0RPOiBEZXByZWNhdGVkIC0gd2l0aCB2NiwgdGhpcyB3aWxsIGJlIHJlbmFtZWQgdG8gYEluc3RydW1lbnRgXG4gKi9cblxudmFyIEJyZWFkY3J1bWJzID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBmdW5jdGlvbiBCcmVhZGNydW1icyhvcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBCcmVhZGNydW1icy5pZDtcbiAgICB0aGlzLl9vcHRpb25zID0gX19hc3NpZ24oe1xuICAgICAgY29uc29sZTogdHJ1ZSxcbiAgICAgIGRvbTogdHJ1ZSxcbiAgICAgIGZldGNoOiB0cnVlLFxuICAgICAgaGlzdG9yeTogdHJ1ZSxcbiAgICAgIHNlbnRyeTogdHJ1ZSxcbiAgICAgIHhocjogdHJ1ZVxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBicmVhZGNydW1iIG9mIGBzZW50cnlgIGZyb20gdGhlIGV2ZW50cyB0aGVtc2VsdmVzXG4gICAqL1xuXG5cbiAgQnJlYWRjcnVtYnMucHJvdG90eXBlLmFkZFNlbnRyeUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuc2VudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgY2F0ZWdvcnk6IFwic2VudHJ5LlwiICsgKGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbicgPyAndHJhbnNhY3Rpb24nIDogJ2V2ZW50JyksXG4gICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICBsZXZlbDogZXZlbnQubGV2ZWwsXG4gICAgICBtZXNzYWdlOiBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KVxuICAgIH0sIHtcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogSW5zdHJ1bWVudCBicm93c2VyIGJ1aWx0LWlucyB3LyBicmVhZGNydW1iIGNhcHR1cmluZ1xuICAgKiAgLSBDb25zb2xlIEFQSVxuICAgKiAgLSBET00gQVBJIChjbGljay90eXBpbmcpXG4gICAqICAtIFhNTEh0dHBSZXF1ZXN0IEFQSVxuICAgKiAgLSBGZXRjaCBBUElcbiAgICogIC0gSGlzdG9yeSBBUElcbiAgICovXG5cblxuICBCcmVhZGNydW1icy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25zb2xlKSB7XG4gICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl9jb25zb2xlQnJlYWRjcnVtYi5hcHBseShfdGhpcywgX19zcHJlYWQoYXJncykpO1xuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAnY29uc29sZSdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vcHRpb25zLmRvbSkge1xuICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fZG9tQnJlYWRjcnVtYi5hcHBseShfdGhpcywgX19zcHJlYWQoYXJncykpO1xuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAnZG9tJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMueGhyKSB7XG4gICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl94aHJCcmVhZGNydW1iLmFwcGx5KF90aGlzLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICd4aHInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5mZXRjaCkge1xuICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fZmV0Y2hCcmVhZGNydW1iLmFwcGx5KF90aGlzLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdmZXRjaCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vcHRpb25zLmhpc3RvcnkpIHtcbiAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuX2hpc3RvcnlCcmVhZGNydW1iLmFwcGx5KF90aGlzLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdoaXN0b3J5J1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGNvbnNvbGUgQVBJIGNhbGxzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5cbiAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9jb25zb2xlQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgIHZhciBicmVhZGNydW1iID0ge1xuICAgICAgY2F0ZWdvcnk6ICdjb25zb2xlJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYXJndW1lbnRzOiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICBsb2dnZXI6ICdjb25zb2xlJ1xuICAgICAgfSxcbiAgICAgIGxldmVsOiBTZXZlcml0eS5mcm9tU3RyaW5nKGhhbmRsZXJEYXRhLmxldmVsKSxcbiAgICAgIG1lc3NhZ2U6IHNhZmVKb2luKGhhbmRsZXJEYXRhLmFyZ3MsICcgJylcbiAgICB9O1xuXG4gICAgaWYgKGhhbmRsZXJEYXRhLmxldmVsID09PSAnYXNzZXJ0Jykge1xuICAgICAgaWYgKGhhbmRsZXJEYXRhLmFyZ3NbMF0gPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFkY3J1bWIubWVzc2FnZSA9IFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIgKyAoc2FmZUpvaW4oaGFuZGxlckRhdGEuYXJncy5zbGljZSgxKSwgJyAnKSB8fCAnY29uc29sZS5hc3NlcnQnKTtcbiAgICAgICAgYnJlYWRjcnVtYi5kYXRhLmFyZ3VtZW50cyA9IGhhbmRsZXJEYXRhLmFyZ3Muc2xpY2UoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCBjYXB0dXJlIGEgYnJlYWRjcnVtYiBmb3IgcGFzc2VkIGFzc2VydGlvbnNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKGJyZWFkY3J1bWIsIHtcbiAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgbGV2ZWw6IGhhbmRsZXJEYXRhLmxldmVsXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gRE9NIEFQSSBjYWxsc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5fZG9tQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgIHZhciB0YXJnZXQ7XG4gICAgdmFyIGtleUF0dHJzID0gdHlwZW9mIHRoaXMuX29wdGlvbnMuZG9tID09PSAnb2JqZWN0JyA/IHRoaXMuX29wdGlvbnMuZG9tLnNlcmlhbGl6ZUF0dHJpYnV0ZSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2Yga2V5QXR0cnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXlBdHRycyA9IFtrZXlBdHRyc107XG4gICAgfSAvLyBBY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IGNhbiB0aHJvdyAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG5cblxuICAgIHRyeSB7XG4gICAgICB0YXJnZXQgPSBoYW5kbGVyRGF0YS5ldmVudC50YXJnZXQgPyBodG1sVHJlZUFzU3RyaW5nKGhhbmRsZXJEYXRhLmV2ZW50LnRhcmdldCwga2V5QXR0cnMpIDogaHRtbFRyZWVBc1N0cmluZyhoYW5kbGVyRGF0YS5ldmVudCwga2V5QXR0cnMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRhcmdldCA9ICc8dW5rbm93bj4nO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgY2F0ZWdvcnk6IFwidWkuXCIgKyBoYW5kbGVyRGF0YS5uYW1lLFxuICAgICAgbWVzc2FnZTogdGFyZ2V0XG4gICAgfSwge1xuICAgICAgZXZlbnQ6IGhhbmRsZXJEYXRhLmV2ZW50LFxuICAgICAgbmFtZTogaGFuZGxlckRhdGEubmFtZSxcbiAgICAgIGdsb2JhbDogaGFuZGxlckRhdGEuZ2xvYmFsXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gWEhSIEFQSSBjYWxsc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5feGhyQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgIGlmIChoYW5kbGVyRGF0YS5lbmRUaW1lc3RhbXApIHtcbiAgICAgIC8vIFdlIG9ubHkgY2FwdHVyZSBjb21wbGV0ZSwgbm9uLXNlbnRyeSByZXF1ZXN0c1xuICAgICAgaWYgKGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV9vd25fcmVxdWVzdF9fKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIF9hID0gaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9fIHx8IHt9LFxuICAgICAgICAgIG1ldGhvZCA9IF9hLm1ldGhvZCxcbiAgICAgICAgICB1cmwgPSBfYS51cmwsXG4gICAgICAgICAgc3RhdHVzX2NvZGUgPSBfYS5zdGF0dXNfY29kZSxcbiAgICAgICAgICBib2R5ID0gX2EuYm9keTtcblxuICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICBjYXRlZ29yeTogJ3hocicsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICBzdGF0dXNfY29kZTogc3RhdHVzX2NvZGVcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogJ2h0dHAnXG4gICAgICB9LCB7XG4gICAgICAgIHhocjogaGFuZGxlckRhdGEueGhyLFxuICAgICAgICBpbnB1dDogYm9keVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGZldGNoIEFQSSBjYWxsc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5fZmV0Y2hCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgLy8gV2Ugb25seSBjYXB0dXJlIGNvbXBsZXRlIGZldGNoIHJlcXVlc3RzXG4gICAgaWYgKCFoYW5kbGVyRGF0YS5lbmRUaW1lc3RhbXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlckRhdGEuZmV0Y2hEYXRhLnVybC5tYXRjaCgvc2VudHJ5X2tleS8pICYmIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5tZXRob2QgPT09ICdQT1NUJykge1xuICAgICAgLy8gV2Ugd2lsbCBub3QgY3JlYXRlIGJyZWFkY3J1bWJzIGZvciBmZXRjaCByZXF1ZXN0cyB0aGF0IGNvbnRhaW4gYHNlbnRyeV9rZXlgIChpbnRlcm5hbCBzZW50cnkgcmVxdWVzdHMpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXJEYXRhLmVycm9yKSB7XG4gICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgIGNhdGVnb3J5OiAnZmV0Y2gnLFxuICAgICAgICBkYXRhOiBoYW5kbGVyRGF0YS5mZXRjaERhdGEsXG4gICAgICAgIGxldmVsOiBTZXZlcml0eS5FcnJvcixcbiAgICAgICAgdHlwZTogJ2h0dHAnXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IGhhbmRsZXJEYXRhLmVycm9yLFxuICAgICAgICBpbnB1dDogaGFuZGxlckRhdGEuYXJnc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdmZXRjaCcsXG4gICAgICAgIGRhdGE6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBoYW5kbGVyRGF0YS5mZXRjaERhdGEpLCB7XG4gICAgICAgICAgc3RhdHVzX2NvZGU6IGhhbmRsZXJEYXRhLnJlc3BvbnNlLnN0YXR1c1xuICAgICAgICB9KSxcbiAgICAgICAgdHlwZTogJ2h0dHAnXG4gICAgICB9LCB7XG4gICAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICByZXNwb25zZTogaGFuZGxlckRhdGEucmVzcG9uc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYnJlYWRjcnVtYnMgZnJvbSBoaXN0b3J5IEFQSSBjYWxsc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5faGlzdG9yeUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgdmFyIGZyb20gPSBoYW5kbGVyRGF0YS5mcm9tO1xuICAgIHZhciB0byA9IGhhbmRsZXJEYXRhLnRvO1xuICAgIHZhciBwYXJzZWRMb2MgPSBwYXJzZVVybChnbG9iYWwubG9jYXRpb24uaHJlZik7XG4gICAgdmFyIHBhcnNlZEZyb20gPSBwYXJzZVVybChmcm9tKTtcbiAgICB2YXIgcGFyc2VkVG8gPSBwYXJzZVVybCh0byk7IC8vIEluaXRpYWwgcHVzaFN0YXRlIGRvZXNuJ3QgcHJvdmlkZSBgZnJvbWAgaW5mb3JtYXRpb25cblxuICAgIGlmICghcGFyc2VkRnJvbS5wYXRoKSB7XG4gICAgICBwYXJzZWRGcm9tID0gcGFyc2VkTG9jO1xuICAgIH0gLy8gVXNlIG9ubHkgdGhlIHBhdGggY29tcG9uZW50IG9mIHRoZSBVUkwgaWYgdGhlIFVSTCBtYXRjaGVzIHRoZSBjdXJyZW50XG4gICAgLy8gZG9jdW1lbnQgKGFsbW9zdCBhbGwgdGhlIHRpbWUgd2hlbiB1c2luZyBwdXNoU3RhdGUpXG5cblxuICAgIGlmIChwYXJzZWRMb2MucHJvdG9jb2wgPT09IHBhcnNlZFRvLnByb3RvY29sICYmIHBhcnNlZExvYy5ob3N0ID09PSBwYXJzZWRUby5ob3N0KSB7XG4gICAgICB0byA9IHBhcnNlZFRvLnJlbGF0aXZlO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRMb2MucHJvdG9jb2wgPT09IHBhcnNlZEZyb20ucHJvdG9jb2wgJiYgcGFyc2VkTG9jLmhvc3QgPT09IHBhcnNlZEZyb20uaG9zdCkge1xuICAgICAgZnJvbSA9IHBhcnNlZEZyb20ucmVsYXRpdmU7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgY2F0ZWdvcnk6ICduYXZpZ2F0aW9uJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgdG86IHRvXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEJyZWFkY3J1bWJzLmlkID0gJ0JyZWFkY3J1bWJzJztcbiAgcmV0dXJuIEJyZWFkY3J1bWJzO1xufSgpO1xuXG5leHBvcnQgeyBCcmVhZGNydW1icyB9OyIsImltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEJhc2VDbGllbnQsIFNES19WRVJTSU9OIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCcm93c2VyQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZCc7XG5pbXBvcnQgeyBpbmplY3RSZXBvcnREaWFsb2cgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG4vKipcbiAqIFRoZSBTZW50cnkgQnJvd3NlciBTREsgQ2xpZW50LlxuICpcbiAqIEBzZWUgQnJvd3Nlck9wdGlvbnMgZm9yIGRvY3VtZW50YXRpb24gb24gY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICogQHNlZSBTZW50cnlDbGllbnQgZm9yIHVzYWdlIGRvY3VtZW50YXRpb24uXG4gKi9cblxudmFyIEJyb3dzZXJDbGllbnQgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQnJvd3NlckNsaWVudCwgX3N1cGVyKTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQnJvd3NlciBTREsgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhpcyBTREsuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gQnJvd3NlckNsaWVudChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBvcHRpb25zLl9tZXRhZGF0YSA9IG9wdGlvbnMuX21ldGFkYXRhIHx8IHt9O1xuICAgIG9wdGlvbnMuX21ldGFkYXRhLnNkayA9IG9wdGlvbnMuX21ldGFkYXRhLnNkayB8fCB7XG4gICAgICBuYW1lOiAnc2VudHJ5LmphdmFzY3JpcHQuYnJvd3NlcicsXG4gICAgICBwYWNrYWdlczogW3tcbiAgICAgICAgbmFtZTogJ25wbTpAc2VudHJ5L2Jyb3dzZXInLFxuICAgICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTlxuICAgICAgfV0sXG4gICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTlxuICAgIH07XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBCcm93c2VyQmFja2VuZCwgb3B0aW9ucykgfHwgdGhpcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgYSByZXBvcnQgZGlhbG9nIHRvIHRoZSB1c2VyIHRvIHNlbmQgZmVlZGJhY2sgdG8gYSBzcGVjaWZpYyBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgU2V0IGluZGl2aWR1YWwgb3B0aW9ucyBmb3IgdGhlIGRpYWxvZ1xuICAgKi9cblxuXG4gIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLnNob3dSZXBvcnREaWFsb2cgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IC8vIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgZG9jdW1lbnQgKFJlYWN0IE5hdGl2ZSlcblxuXG4gICAgdmFyIGRvY3VtZW50ID0gZ2V0R2xvYmFsT2JqZWN0KCkuZG9jdW1lbnQ7XG5cbiAgICBpZiAoIWRvY3VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdUcnlpbmcgdG8gY2FsbCBzaG93UmVwb3J0RGlhbG9nIHdpdGggU2VudHJ5IENsaWVudCBkaXNhYmxlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluamVjdFJlcG9ydERpYWxvZyhfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICAgIGRzbjogb3B0aW9ucy5kc24gfHwgdGhpcy5nZXREc24oKVxuICAgIH0pKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQnJvd3NlckNsaWVudC5wcm90b3R5cGUuX3ByZXBhcmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgc2NvcGUsIGhpbnQpIHtcbiAgICBldmVudC5wbGF0Zm9ybSA9IGV2ZW50LnBsYXRmb3JtIHx8ICdqYXZhc2NyaXB0JztcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fcHJlcGFyZUV2ZW50LmNhbGwodGhpcywgZXZlbnQsIHNjb3BlLCBoaW50KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQnJvd3NlckNsaWVudC5wcm90b3R5cGUuX3NlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBpbnRlZ3JhdGlvbiA9IHRoaXMuZ2V0SW50ZWdyYXRpb24oQnJlYWRjcnVtYnMpO1xuXG4gICAgaWYgKGludGVncmF0aW9uKSB7XG4gICAgICBpbnRlZ3JhdGlvbi5hZGRTZW50cnlCcmVhZGNydW1iKGV2ZW50KTtcbiAgICB9XG5cbiAgICBfc3VwZXIucHJvdG90eXBlLl9zZW5kRXZlbnQuY2FsbCh0aGlzLCBldmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIEJyb3dzZXJDbGllbnQ7XG59KEJhc2VDbGllbnQpO1xuXG5leHBvcnQgeyBCcm93c2VyQ2xpZW50IH07IiwiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLyoqXG4gKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU0RLIGNsaWVudCBpbnN0YW5jZS4gVGhlIGNsaWVudCBpc1xuICogaW5zdGFsbGVkIGFuZCB0aGVuIGJvdW5kIHRvIHRoZSBjdXJyZW50IHNjb3BlLlxuICpcbiAqIEBwYXJhbSBjbGllbnRDbGFzcyBUaGUgY2xpZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjbGllbnQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRCaW5kKGNsaWVudENsYXNzLCBvcHRpb25zKSB7XG4gIHZhciBfYTtcblxuICBpZiAob3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgIGxvZ2dlci5lbmFibGUoKTtcbiAgfVxuXG4gIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gIChfYSA9IGh1Yi5nZXRTY29wZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudXBkYXRlKG9wdGlvbnMuaW5pdGlhbFNjb3BlKTtcbiAgdmFyIGNsaWVudCA9IG5ldyBjbGllbnRDbGFzcyhvcHRpb25zKTtcbiAgaHViLmJpbmRDbGllbnQoY2xpZW50KTtcbn0iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IGdldEV2ZW50RGVzY3JpcHRpb24sIGlzTWF0Y2hpbmdQYXR0ZXJuLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJzsgLy8gXCJTY3JpcHQgZXJyb3IuXCIgaXMgaGFyZCBjb2RlZCBpbnRvIGJyb3dzZXJzIGZvciBlcnJvcnMgdGhhdCBpdCBjYW4ndCByZWFkLlxuLy8gdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgc2NyaXB0IGJlaW5nIHB1bGxlZCBpbiBmcm9tIGFuIGV4dGVybmFsIGRvbWFpbiBhbmQgQ09SUy5cblxudmFyIERFRkFVTFRfSUdOT1JFX0VSUk9SUyA9IFsvXlNjcmlwdCBlcnJvclxcLj8kLywgL15KYXZhc2NyaXB0IGVycm9yOiBTY3JpcHQgZXJyb3JcXC4/IG9uIGxpbmUgMCQvXTtcbi8qKiBJbmJvdW5kIGZpbHRlcnMgY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyICovXG5cbnZhciBJbmJvdW5kRmlsdGVycyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEluYm91bmRGaWx0ZXJzKF9vcHRpb25zKSB7XG4gICAgaWYgKF9vcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIF9vcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG5cbiAgICB0aGlzLm5hbWUgPSBJbmJvdW5kRmlsdGVycy5pZDtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcblxuICAgICAgaWYgKCFodWIpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZiA9IGh1Yi5nZXRJbnRlZ3JhdGlvbihJbmJvdW5kRmlsdGVycyk7XG5cbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIHZhciBjbGllbnQgPSBodWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgIHZhciBjbGllbnRPcHRpb25zID0gY2xpZW50ID8gY2xpZW50LmdldE9wdGlvbnMoKSA6IHt9OyAvLyBUaGlzIGNoZWNrcyBwcmV2ZW50cyBtb3N0IG9mIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgYnVnIGxpbmtlZCBiZWxvdzpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjYyMlxuICAgICAgICAvLyBUaGUgYnVnIGlzIGNhdXNlZCBieSBtdWx0aXBsZSBTREsgaW5zdGFuY2VzLCB3aGVyZSBvbmUgaXMgbWluaWZpZWQgYW5kIG9uZSBpcyB1c2luZyBub24tbWFuZ2xlZCBjb2RlLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWxseSB3ZSBjYW5ub3QgZml4IGl0IHJlbGlhYmx5ICh0aHVzIHJlc2VydmVkIHByb3BlcnR5IGluIHJvbGx1cCdzIHRlcnNlciBjb25maWcpLFxuICAgICAgICAvLyBhcyB3ZSBjYW5ub3QgZm9yY2UgcGVvcGxlIHVzaW5nIG11bHRpcGxlIGluc3RhbmNlcyBpbiB0aGVpciBhcHBzIHRvIHN5bmMgU0RLIHZlcnNpb25zLlxuXG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNlbGYuX21lcmdlT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IHNlbGYuX21lcmdlT3B0aW9ucyhjbGllbnRPcHRpb25zKSA6IHt9O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5fc2hvdWxkRHJvcEV2ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3VsZERyb3BFdmVudChldmVudCwgb3B0aW9ucykgPyBudWxsIDogZXZlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX3Nob3VsZERyb3BFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc1NlbnRyeUVycm9yKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBiZWluZyBpbnRlcm5hbCBTZW50cnkgRXJyb3IuXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzSWdub3JlZEVycm9yKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBiZWluZyBtYXRjaGVkIGJ5IGBpZ25vcmVFcnJvcnNgIG9wdGlvbi5cXG5FdmVudDogXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNEZW5pZWRVcmwoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihcIkV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgYGRlbnlVcmxzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkgKyBcIi5cXG5Vcmw6IFwiICsgdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNBbGxvd2VkVXJsKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBub3QgYmVpbmcgbWF0Y2hlZCBieSBgYWxsb3dVcmxzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkgKyBcIi5cXG5Vcmw6IFwiICsgdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2lzU2VudHJ5RXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGV2ZW50ICYmIGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID09PSAnU2VudHJ5RXJyb3InIHx8IGZhbHNlO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2lzSWdub3JlZEVycm9yID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUVycm9ycyB8fCAhb3B0aW9ucy5pZ25vcmVFcnJvcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldFBvc3NpYmxlRXZlbnRNZXNzYWdlcyhldmVudCkuc29tZShmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgLy8gTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgY29tcGxhaW5zIGhlcmUuLi5cbiAgICAgIHJldHVybiBvcHRpb25zLmlnbm9yZUVycm9ycy5zb21lKGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBpc01hdGNoaW5nUGF0dGVybihtZXNzYWdlLCBwYXR0ZXJuKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5faXNEZW5pZWRVcmwgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAvLyBUT0RPOiBVc2UgR2xvYiBpbnN0ZWFkP1xuICAgIGlmICghb3B0aW9ucy5kZW55VXJscyB8fCAhb3B0aW9ucy5kZW55VXJscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdXJsID0gdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpO1xuXG4gICAgcmV0dXJuICF1cmwgPyBmYWxzZSA6IG9wdGlvbnMuZGVueVVybHMuc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybik7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc0FsbG93ZWRVcmwgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAvLyBUT0RPOiBVc2UgR2xvYiBpbnN0ZWFkP1xuICAgIGlmICghb3B0aW9ucy5hbGxvd1VybHMgfHwgIW9wdGlvbnMuYWxsb3dVcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KTtcblxuICAgIHJldHVybiAhdXJsID8gdHJ1ZSA6IG9wdGlvbnMuYWxsb3dVcmxzLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiBpc01hdGNoaW5nUGF0dGVybih1cmwsIHBhdHRlcm4pO1xuICAgIH0pO1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fbWVyZ2VPcHRpb25zID0gZnVuY3Rpb24gKGNsaWVudE9wdGlvbnMpIHtcbiAgICBpZiAoY2xpZW50T3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBjbGllbnRPcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93VXJsczogX19zcHJlYWQodGhpcy5fb3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdLCB0aGlzLl9vcHRpb25zLmFsbG93VXJscyB8fCBbXSwgY2xpZW50T3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdLCBjbGllbnRPcHRpb25zLmFsbG93VXJscyB8fCBbXSksXG4gICAgICBkZW55VXJsczogX19zcHJlYWQodGhpcy5fb3B0aW9ucy5ibGFja2xpc3RVcmxzIHx8IFtdLCB0aGlzLl9vcHRpb25zLmRlbnlVcmxzIHx8IFtdLCBjbGllbnRPcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgW10sIGNsaWVudE9wdGlvbnMuZGVueVVybHMgfHwgW10pLFxuICAgICAgaWdub3JlRXJyb3JzOiBfX3NwcmVhZCh0aGlzLl9vcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSwgY2xpZW50T3B0aW9ucy5pZ25vcmVFcnJvcnMgfHwgW10sIERFRkFVTFRfSUdOT1JFX0VSUk9SUyksXG4gICAgICBpZ25vcmVJbnRlcm5hbDogdHlwZW9mIHRoaXMuX29wdGlvbnMuaWdub3JlSW50ZXJuYWwgIT09ICd1bmRlZmluZWQnID8gdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCA6IHRydWVcbiAgICB9O1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBbZXZlbnQubWVzc2FnZV07XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmV4Y2VwdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9hID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdIHx8IHt9LFxuICAgICAgICAgICAgX2IgPSBfYS50eXBlLFxuICAgICAgICAgICAgdHlwZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLFxuICAgICAgICAgICAgX2MgPSBfYS52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlID0gX2MgPT09IHZvaWQgMCA/ICcnIDogX2M7XG5cbiAgICAgICAgcmV0dXJuIFtcIlwiICsgdmFsdWUsIHR5cGUgKyBcIjogXCIgKyB2YWx1ZV07XG4gICAgICB9IGNhdGNoIChvTykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJDYW5ub3QgZXh0cmFjdCBtZXNzYWdlIGZvciBldmVudCBcIiArIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2dldExhc3RWYWxpZFVybCA9IGZ1bmN0aW9uIChmcmFtZXMpIHtcbiAgICBpZiAoZnJhbWVzID09PSB2b2lkIDApIHtcbiAgICAgIGZyYW1lcyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBfYSwgX2I7XG5cbiAgICBmb3IgKHZhciBpID0gZnJhbWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZnJhbWUgPSBmcmFtZXNbaV07XG5cbiAgICAgIGlmICgoKF9hID0gZnJhbWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maWxlbmFtZSkgIT09ICc8YW5vbnltb3VzPicgJiYgKChfYiA9IGZyYW1lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmlsZW5hbWUpICE9PSAnW25hdGl2ZSBjb2RlXScpIHtcbiAgICAgICAgcmV0dXJuIGZyYW1lLmZpbGVuYW1lIHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9nZXRFdmVudEZpbHRlclVybCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXZlbnQuc3RhY2t0cmFjZSkge1xuICAgICAgICB2YXIgZnJhbWVzXzEgPSBldmVudC5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhc3RWYWxpZFVybChmcmFtZXNfMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5leGNlcHRpb24pIHtcbiAgICAgICAgdmFyIGZyYW1lc18yID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhc3RWYWxpZFVybChmcmFtZXNfMik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKG9PKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJDYW5ub3QgZXh0cmFjdCB1cmwgZm9yIGV2ZW50IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBJbmJvdW5kRmlsdGVycy5pZCA9ICdJbmJvdW5kRmlsdGVycyc7XG4gIHJldHVybiBJbmJvdW5kRmlsdGVycztcbn0oKTtcblxuZXhwb3J0IHsgSW5ib3VuZEZpbHRlcnMgfTsiLCJ2YXIgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nO1xuLyoqIFBhdGNoIHRvU3RyaW5nIGNhbGxzIHRvIHJldHVybiBwcm9wZXIgbmFtZSBmb3Igd3JhcHBlZCBmdW5jdGlvbnMgKi9cblxudmFyIEZ1bmN0aW9uVG9TdHJpbmcgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGdW5jdGlvblRvU3RyaW5nKCkge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gRnVuY3Rpb25Ub1N0cmluZy5pZDtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBGdW5jdGlvblRvU3RyaW5nLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9fc2VudHJ5X29yaWdpbmFsX18gfHwgdGhpcztcbiAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgRnVuY3Rpb25Ub1N0cmluZy5pZCA9ICdGdW5jdGlvblRvU3RyaW5nJztcbiAgcmV0dXJuIEZ1bmN0aW9uVG9TdHJpbmc7XG59KCk7XG5cbmV4cG9ydCB7IEZ1bmN0aW9uVG9TdHJpbmcgfTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZmlsbCwgZ2V0RnVuY3Rpb25OYW1lLCBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IHdyYXAgfSBmcm9tICcuLi9oZWxwZXJzJztcbnZhciBERUZBVUxUX0VWRU5UX1RBUkdFVCA9IFsnRXZlbnRUYXJnZXQnLCAnV2luZG93JywgJ05vZGUnLCAnQXBwbGljYXRpb25DYWNoZScsICdBdWRpb1RyYWNrTGlzdCcsICdDaGFubmVsTWVyZ2VyTm9kZScsICdDcnlwdG9PcGVyYXRpb24nLCAnRXZlbnRTb3VyY2UnLCAnRmlsZVJlYWRlcicsICdIVE1MVW5rbm93bkVsZW1lbnQnLCAnSURCRGF0YWJhc2UnLCAnSURCUmVxdWVzdCcsICdJREJUcmFuc2FjdGlvbicsICdLZXlPcGVyYXRpb24nLCAnTWVkaWFDb250cm9sbGVyJywgJ01lc3NhZ2VQb3J0JywgJ01vZGFsV2luZG93JywgJ05vdGlmaWNhdGlvbicsICdTVkdFbGVtZW50SW5zdGFuY2UnLCAnU2NyZWVuJywgJ1RleHRUcmFjaycsICdUZXh0VHJhY2tDdWUnLCAnVGV4dFRyYWNrTGlzdCcsICdXZWJTb2NrZXQnLCAnV2ViU29ja2V0V29ya2VyJywgJ1dvcmtlcicsICdYTUxIdHRwUmVxdWVzdCcsICdYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0JywgJ1hNTEh0dHBSZXF1ZXN0VXBsb2FkJ107XG4vKiogV3JhcCB0aW1lciBmdW5jdGlvbnMgYW5kIGV2ZW50IHRhcmdldHMgdG8gY2F0Y2ggZXJyb3JzIGFuZCBwcm92aWRlIGJldHRlciBtZXRhIGRhdGEgKi9cblxudmFyIFRyeUNhdGNoID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBmdW5jdGlvbiBUcnlDYXRjaChvcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBUcnlDYXRjaC5pZDtcbiAgICB0aGlzLl9vcHRpb25zID0gX19hc3NpZ24oe1xuICAgICAgWE1MSHR0cFJlcXVlc3Q6IHRydWUsXG4gICAgICBldmVudFRhcmdldDogdHJ1ZSxcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZTogdHJ1ZSxcbiAgICAgIHNldEludGVydmFsOiB0cnVlLFxuICAgICAgc2V0VGltZW91dDogdHJ1ZVxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG4gIC8qKlxuICAgKiBXcmFwIHRpbWVyIGZ1bmN0aW9ucyBhbmQgZXZlbnQgdGFyZ2V0cyB0byBjYXRjaCBlcnJvcnNcbiAgICogYW5kIHByb3ZpZGUgYmV0dGVyIG1ldGFkYXRhLlxuICAgKi9cblxuXG4gIFRyeUNhdGNoLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuc2V0VGltZW91dCkge1xuICAgICAgZmlsbChnbG9iYWwsICdzZXRUaW1lb3V0JywgdGhpcy5fd3JhcFRpbWVGdW5jdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXRJbnRlcnZhbCkge1xuICAgICAgZmlsbChnbG9iYWwsICdzZXRJbnRlcnZhbCcsIHRoaXMuX3dyYXBUaW1lRnVuY3Rpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBmaWxsKGdsb2JhbCwgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIHRoaXMuX3dyYXBSQUYuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuWE1MSHR0cFJlcXVlc3QgJiYgJ1hNTEh0dHBSZXF1ZXN0JyBpbiBnbG9iYWwpIHtcbiAgICAgIGZpbGwoWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCAnc2VuZCcsIHRoaXMuX3dyYXBYSFIuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuZXZlbnRUYXJnZXQpIHtcbiAgICAgIHZhciBldmVudFRhcmdldCA9IEFycmF5LmlzQXJyYXkodGhpcy5fb3B0aW9ucy5ldmVudFRhcmdldCkgPyB0aGlzLl9vcHRpb25zLmV2ZW50VGFyZ2V0IDogREVGQVVMVF9FVkVOVF9UQVJHRVQ7XG4gICAgICBldmVudFRhcmdldC5mb3JFYWNoKHRoaXMuX3dyYXBFdmVudFRhcmdldC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgVHJ5Q2F0Y2gucHJvdG90eXBlLl93cmFwVGltZUZ1bmN0aW9uID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICBhcmdzWzBdID0gd3JhcChvcmlnaW5hbENhbGxiYWNrLCB7XG4gICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50J1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuICAvKiogSlNEb2MgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIFRyeUNhdGNoLnByb3RvdHlwZS5fd3JhcFJBRiA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgd3JhcChjYWxsYmFjaywge1xuICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmdW5jdGlvbjogJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsXG4gICAgICAgICAgICBoYW5kbGVyOiBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50J1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBFdmVudFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuXG4gICAgdmFyIHByb3RvID0gZ2xvYmFsW3RhcmdldF0gJiYgZ2xvYmFsW3RhcmdldF0ucHJvdG90eXBlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG5cbiAgICBpZiAoIXByb3RvIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkoJ2FkZEV2ZW50TGlzdGVuZXInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbGwocHJvdG8sICdhZGRFdmVudExpc3RlbmVyJywgZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGZuLmhhbmRsZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBmbi5oYW5kbGVFdmVudCA9IHdyYXAoZm4uaGFuZGxlRXZlbnQuYmluZChmbiksIHtcbiAgICAgICAgICAgICAgbWVjaGFuaXNtOiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246ICdoYW5kbGVFdmVudCcsXG4gICAgICAgICAgICAgICAgICBoYW5kbGVyOiBnZXRGdW5jdGlvbk5hbWUoZm4pLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7Ly8gY2FuIHNvbWV0aW1lcyBnZXQgJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGFjY2VzcyBwcm9wZXJ0eSBcImhhbmRsZSBFdmVudCdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd3JhcChmbiwge1xuICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBmdW5jdGlvbjogJ2FkZEV2ZW50TGlzdGVuZXInLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBnZXRGdW5jdGlvbk5hbWUoZm4pLFxuICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCdcbiAgICAgICAgICB9XG4gICAgICAgIH0pLCBvcHRpb25zKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZmlsbChwcm90bywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlcmUgYXJlIDIgcG9zc2libGUgc2NlbmFyaW9zIGhlcmU6XG4gICAgICAgICAqXG4gICAgICAgICAqIDEuIFNvbWVvbmUgcGFzc2VzIGEgY2FsbGJhY2ssIHdoaWNoIHdhcyBhdHRhY2hlZCBwcmlvciB0byBTZW50cnkgaW5pdGlhbGl6YXRpb24sIG9yIGJ5IHVzaW5nIHVubW9kaWZpZWRcbiAgICAgICAgICogbWV0aG9kLCBlZy4gYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIuY2FsbChlbCwgbmFtZSwgaGFuZGxlcikuIEluIHRoaXMgY2FzZSwgd2UgdHJlYXQgdGhpcyBmdW5jdGlvblxuICAgICAgICAgKiBhcyBhIHBhc3MtdGhyb3VnaCwgYW5kIGNhbGwgb3JpZ2luYWwgYHJlbW92ZUV2ZW50TGlzdGVuZXJgIHdpdGggaXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIDIuIFNvbWVvbmUgcGFzc2VzIGEgY2FsbGJhY2ssIHdoaWNoIHdhcyBhdHRhY2hlZCBhZnRlciBTZW50cnkgd2FzIGluaXRpYWxpemVkLCB3aGljaCBtZWFucyB0aGF0IGl0IHdhcyB1c2luZ1xuICAgICAgICAgKiBvdXIgd3JhcHBlZCB2ZXJzaW9uIG9mIGBhZGRFdmVudExpc3RlbmVyYCwgd2hpY2ggaW50ZXJuYWxseSBjYWxscyBgd3JhcGAgaGVscGVyLlxuICAgICAgICAgKiBUaGlzIGhlbHBlciBcIndyYXBzXCIgd2hvbGUgY2FsbGJhY2sgaW5zaWRlIGEgdHJ5L2NhdGNoIHN0YXRlbWVudCwgYW5kIGF0dGFjaGVkIGFwcHJvcHJpYXRlIG1ldGFkYXRhIHRvIGl0LFxuICAgICAgICAgKiBpbiBvcmRlciBmb3IgdXMgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gd3JhcHBlZC9ub24td3JhcHBlZCBmdW5jdGlvbnMgcG9zc2libGUuXG4gICAgICAgICAqIElmIGEgZnVuY3Rpb24gd2FzIHdyYXBwZWQsIGl0IGhhcyBhZGRpdGlvbmFsIHByb3BlcnR5IG9mIGBfX3NlbnRyeV93cmFwcGVkX19gLCBob2xkaW5nIHRoZSBoYW5kbGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaGVuIHNvbWVvbmUgYWRkcyBhIGhhbmRsZXIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb24sIGFuZCB0aGVuIGRvIGl0IGFnYWluLCBidXQgYWZ0ZXIsXG4gICAgICAgICAqIHRoZW4gd2UgaGF2ZSB0byBkZXRhY2ggYm90aCBvZiB0aGVtLiBPdGhlcndpc2UsIGlmIHdlJ2QgZGV0YWNoIG9ubHkgd3JhcHBlZCBvbmUsIGl0J2QgYmUgaW1wb3NzaWJsZVxuICAgICAgICAgKiB0byBnZXQgcmlkIG9mIHRoZSBpbml0aWFsIGhhbmRsZXIgYW5kIGl0J2Qgc3RpY2sgdGhlcmUgZm9yZXZlci5cbiAgICAgICAgICovXG5cblxuICAgICAgICB2YXIgd3JhcHBlZEV2ZW50SGFuZGxlciA9IGZuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsRXZlbnRIYW5kbGVyID0gKF9hID0gd3JhcHBlZEV2ZW50SGFuZGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fc2VudHJ5X3dyYXBwZWRfXztcblxuICAgICAgICAgIGlmIChvcmlnaW5hbEV2ZW50SGFuZGxlcikge1xuICAgICAgICAgICAgb3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGhpcywgZXZlbnROYW1lLCBvcmlnaW5hbEV2ZW50SGFuZGxlciwgb3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7Ly8gaWdub3JlLCBhY2Nlc3NpbmcgX19zZW50cnlfd3JhcHBlZF9fIHdpbGwgdGhyb3cgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudE5hbWUsIHdyYXBwZWRFdmVudEhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBYSFIgPSBmdW5jdGlvbiAob3JpZ2luYWxTZW5kKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblxuXG4gICAgICB2YXIgeGhyID0gdGhpcztcbiAgICAgIHZhciB4bWxIdHRwUmVxdWVzdFByb3BzID0gWydvbmxvYWQnLCAnb25lcnJvcicsICdvbnByb2dyZXNzJywgJ29ucmVhZHlzdGF0ZWNoYW5nZSddO1xuICAgICAgeG1sSHR0cFJlcXVlc3RQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgIGlmIChwcm9wIGluIHhociAmJiB0eXBlb2YgeGhyW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBmaWxsKHhociwgcHJvcCwgZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICB2YXIgd3JhcE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTsgLy8gSWYgSW5zdHJ1bWVudCBpbnRlZ3JhdGlvbiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIFRyeUNhdGNoLCBnZXQgdGhlIG5hbWUgb2Ygb3JpZ2luYWwgZnVuY3Rpb25cblxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsLl9fc2VudHJ5X29yaWdpbmFsX18pIHtcbiAgICAgICAgICAgICAgd3JhcE9wdGlvbnMubWVjaGFuaXNtLmRhdGEuaGFuZGxlciA9IGdldEZ1bmN0aW9uTmFtZShvcmlnaW5hbC5fX3NlbnRyeV9vcmlnaW5hbF9fKTtcbiAgICAgICAgICAgIH0gLy8gT3RoZXJ3aXNlIHdyYXAgZGlyZWN0bHlcblxuXG4gICAgICAgICAgICByZXR1cm4gd3JhcChvcmlnaW5hbCwgd3JhcE9wdGlvbnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbFNlbmQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgVHJ5Q2F0Y2guaWQgPSAnVHJ5Q2F0Y2gnO1xuICByZXR1cm4gVHJ5Q2F0Y2g7XG59KCk7XG5cbmV4cG9ydCB7IFRyeUNhdGNoIH07IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG5pbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGdldExvY2F0aW9uSHJlZiwgaXNFcnJvckV2ZW50LCBpc1ByaW1pdGl2ZSwgaXNTdHJpbmcsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgZXZlbnRGcm9tVW5rbm93bklucHV0IH0gZnJvbSAnLi4vZXZlbnRidWlsZGVyJztcbmltcG9ydCB7IHNob3VsZElnbm9yZU9uRXJyb3IgfSBmcm9tICcuLi9oZWxwZXJzJztcbi8qKiBHbG9iYWwgaGFuZGxlcnMgKi9cblxudmFyIEdsb2JhbEhhbmRsZXJzID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqIEpTRG9jICovXG4gIGZ1bmN0aW9uIEdsb2JhbEhhbmRsZXJzKG9wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IEdsb2JhbEhhbmRsZXJzLmlkO1xuICAgIC8qKiBKU0RvYyAqL1xuXG4gICAgdGhpcy5fb25FcnJvckhhbmRsZXJJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAvKiogSlNEb2MgKi9cblxuICAgIHRoaXMuX29uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlckluc3RhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX29wdGlvbnMgPSBfX2Fzc2lnbih7XG4gICAgICBvbmVycm9yOiB0cnVlLFxuICAgICAgb251bmhhbmRsZWRyZWplY3Rpb246IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDUwO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMub25lcnJvcikge1xuICAgICAgbG9nZ2VyLmxvZygnR2xvYmFsIEhhbmRsZXIgYXR0YWNoZWQ6IG9uZXJyb3InKTtcblxuICAgICAgdGhpcy5faW5zdGFsbEdsb2JhbE9uRXJyb3JIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgIGxvZ2dlci5sb2coJ0dsb2JhbCBIYW5kbGVyIGF0dGFjaGVkOiBvbnVuaGFuZGxlZHJlamVjdGlvbicpO1xuXG4gICAgICB0aGlzLl9pbnN0YWxsR2xvYmFsT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyKCk7XG4gICAgfVxuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5faW5zdGFsbEdsb2JhbE9uRXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5fb25FcnJvckhhbmRsZXJJbnN0YWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soZGF0YSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBkYXRhLmVycm9yO1xuICAgICAgICB2YXIgY3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgdmFyIGhhc0ludGVncmF0aW9uID0gY3VycmVudEh1Yi5nZXRJbnRlZ3JhdGlvbihHbG9iYWxIYW5kbGVycyk7XG4gICAgICAgIHZhciBpc0ZhaWxlZE93bkRlbGl2ZXJ5ID0gZXJyb3IgJiYgZXJyb3IuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9PT0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWhhc0ludGVncmF0aW9uIHx8IHNob3VsZElnbm9yZU9uRXJyb3IoKSB8fCBpc0ZhaWxlZE93bkRlbGl2ZXJ5KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgIHZhciBldmVudCA9IGVycm9yID09PSB1bmRlZmluZWQgJiYgaXNTdHJpbmcoZGF0YS5tc2cpID8gX3RoaXMuX2V2ZW50RnJvbUluY29tcGxldGVPbkVycm9yKGRhdGEubXNnLCBkYXRhLnVybCwgZGF0YS5saW5lLCBkYXRhLmNvbHVtbikgOiBfdGhpcy5fZW5oYW5jZUV2ZW50V2l0aEluaXRpYWxGcmFtZShldmVudEZyb21Vbmtub3duSW5wdXQoZXJyb3IgfHwgZGF0YS5tc2csIHVuZGVmaW5lZCwge1xuICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgICAgcmVqZWN0aW9uOiBmYWxzZVxuICAgICAgICB9KSwgZGF0YS51cmwsIGRhdGEubGluZSwgZGF0YS5jb2x1bW4pO1xuICAgICAgICBhZGRFeGNlcHRpb25NZWNoYW5pc20oZXZlbnQsIHtcbiAgICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiAnb25lcnJvcidcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICdlcnJvcidcbiAgICB9KTtcbiAgICB0aGlzLl9vbkVycm9ySGFuZGxlckluc3RhbGxlZCA9IHRydWU7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9pbnN0YWxsR2xvYmFsT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5fb25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVySW5zdGFsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKGUpIHtcbiAgICAgICAgdmFyIGVycm9yID0gZTsgLy8gZGlnIHRoZSBvYmplY3Qgb2YgdGhlIHJlamVjdGlvbiBvdXQgb2Yga25vd24gZXZlbnQgdHlwZXNcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFByb21pc2VSZWplY3Rpb25FdmVudHMgc3RvcmUgdGhlIG9iamVjdCBvZiB0aGUgcmVqZWN0aW9uIHVuZGVyICdyZWFzb24nXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qcm9taXNlUmVqZWN0aW9uRXZlbnRcbiAgICAgICAgICBpZiAoJ3JlYXNvbicgaW4gZSkge1xuICAgICAgICAgICAgZXJyb3IgPSBlLnJlYXNvbjtcbiAgICAgICAgICB9IC8vIHNvbWV0aGluZywgc29tZXdoZXJlLCAobGlrZWx5IGEgYnJvd3NlciBleHRlbnNpb24pIGVmZmVjdGl2ZWx5IGNhc3RzIFByb21pc2VSZWplY3Rpb25FdmVudHNcbiAgICAgICAgICAvLyB0byBDdXN0b21FdmVudHMsIG1vdmluZyB0aGUgYHByb21pc2VgIGFuZCBgcmVhc29uYCBhdHRyaWJ1dGVzIG9mIHRoZSBQUkUgaW50b1xuICAgICAgICAgIC8vIHRoZSBDdXN0b21FdmVudCdzIGBkZXRhaWxgIGF0dHJpYnV0ZSwgc2luY2UgdGhleSdyZSBub3QgcGFydCBvZiBDdXN0b21FdmVudCdzIHNwZWNcbiAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50IGFuZFxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIzODBcbiAgICAgICAgICBlbHNlIGlmICgnZGV0YWlsJyBpbiBlICYmICdyZWFzb24nIGluIGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAgIGVycm9yID0gZS5kZXRhaWwucmVhc29uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfb08pIHsvLyBuby1lbXB0eVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgICAgIHZhciBoYXNJbnRlZ3JhdGlvbiA9IGN1cnJlbnRIdWIuZ2V0SW50ZWdyYXRpb24oR2xvYmFsSGFuZGxlcnMpO1xuICAgICAgICB2YXIgaXNGYWlsZWRPd25EZWxpdmVyeSA9IGVycm9yICYmIGVycm9yLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPT09IHRydWU7XG5cbiAgICAgICAgaWYgKCFoYXNJbnRlZ3JhdGlvbiB8fCBzaG91bGRJZ25vcmVPbkVycm9yKCkgfHwgaXNGYWlsZWRPd25EZWxpdmVyeSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgIHZhciBldmVudCA9IGlzUHJpbWl0aXZlKGVycm9yKSA/IF90aGlzLl9ldmVudEZyb21SZWplY3Rpb25XaXRoUHJpbWl0aXZlKGVycm9yKSA6IGV2ZW50RnJvbVVua25vd25JbnB1dChlcnJvciwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCkuYXR0YWNoU3RhY2t0cmFjZSxcbiAgICAgICAgICByZWplY3Rpb246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50LmxldmVsID0gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6ICdvbnVuaGFuZGxlZHJlamVjdGlvbidcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9LFxuICAgICAgdHlwZTogJ3VuaGFuZGxlZHJlamVjdGlvbidcbiAgICB9KTtcbiAgICB0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQgPSB0cnVlO1xuICB9O1xuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3RhY2sgZnJvbSBhbiBvbGQsIGVycm9yLWxlc3Mgb25lcnJvciBoYW5kbGVyLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG4gIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5fZXZlbnRGcm9tSW5jb21wbGV0ZU9uRXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgIHZhciBFUlJPUl9UWVBFU19SRSA9IC9eKD86W1V1XW5jYXVnaHQgKD86ZXhjZXB0aW9uOiApPyk/KD86KCg/OkV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSXwpRXJyb3IpOiApPyguKikkL2k7IC8vIElmICdtZXNzYWdlJyBpcyBFcnJvckV2ZW50LCBnZXQgcmVhbCBtZXNzYWdlIGZyb20gaW5zaWRlXG5cbiAgICB2YXIgbWVzc2FnZSA9IGlzRXJyb3JFdmVudChtc2cpID8gbXNnLm1lc3NhZ2UgOiBtc2c7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIGdyb3VwcyA9IG1lc3NhZ2UubWF0Y2goRVJST1JfVFlQRVNfUkUpO1xuXG4gICAgaWYgKGdyb3Vwcykge1xuICAgICAgbmFtZSA9IGdyb3Vwc1sxXTtcbiAgICAgIG1lc3NhZ2UgPSBncm91cHNbMl07XG4gICAgfVxuXG4gICAgdmFyIGV2ZW50ID0ge1xuICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgIHZhbHVlczogW3tcbiAgICAgICAgICB0eXBlOiBuYW1lIHx8ICdFcnJvcicsXG4gICAgICAgICAgdmFsdWU6IG1lc3NhZ2VcbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9lbmhhbmNlRXZlbnRXaXRoSW5pdGlhbEZyYW1lKGV2ZW50LCB1cmwsIGxpbmUsIGNvbHVtbik7XG4gIH07XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXZlbnQgZnJvbSBhIHByb21pc2UgcmVqZWN0aW9uIHdoZXJlIHRoZSBgcmVhc29uYCBpcyBhIHByaW1pdGl2ZS5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbjogVGhlIGByZWFzb25gIHByb3BlcnR5IG9mIHRoZSBwcm9taXNlIHJlamVjdGlvblxuICAgKiBAcmV0dXJucyBBbiBFdmVudCBvYmplY3Qgd2l0aCBhbiBhcHByb3ByaWF0ZSBgZXhjZXB0aW9uYCB2YWx1ZVxuICAgKi9cblxuXG4gIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5fZXZlbnRGcm9tUmVqZWN0aW9uV2l0aFByaW1pdGl2ZSA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgIHZhbHVlczogW3tcbiAgICAgICAgICB0eXBlOiAnVW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgICAgICAvLyBTdHJpbmcoKSBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgUHJpbWl0aXZlIHR5cGUgaW5jbHVkZXMgc3ltYm9scyAod2hpY2ggY2FuJ3QgYmUgYXV0b21hdGljYWxseSBzdHJpbmdpZmllZClcbiAgICAgICAgICB2YWx1ZTogXCJOb24tRXJyb3IgcHJvbWlzZSByZWplY3Rpb24gY2FwdHVyZWQgd2l0aCB2YWx1ZTogXCIgKyBTdHJpbmcocmVhc29uKVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH07XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5cbiAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9lbmhhbmNlRXZlbnRXaXRoSW5pdGlhbEZyYW1lID0gZnVuY3Rpb24gKGV2ZW50LCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgIGV2ZW50LmV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiB8fCB7fTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCBbXTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgfHwge307XG4gICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMgfHwgW107XG4gICAgdmFyIGNvbG5vID0gaXNOYU4ocGFyc2VJbnQoY29sdW1uLCAxMCkpID8gdW5kZWZpbmVkIDogY29sdW1uO1xuICAgIHZhciBsaW5lbm8gPSBpc05hTihwYXJzZUludChsaW5lLCAxMCkpID8gdW5kZWZpbmVkIDogbGluZTtcbiAgICB2YXIgZmlsZW5hbWUgPSBpc1N0cmluZyh1cmwpICYmIHVybC5sZW5ndGggPiAwID8gdXJsIDogZ2V0TG9jYXRpb25IcmVmKCk7XG5cbiAgICBpZiAoZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMucHVzaCh7XG4gICAgICAgIGNvbG5vOiBjb2xubyxcbiAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICBmdW5jdGlvbjogJz8nLFxuICAgICAgICBpbl9hcHA6IHRydWUsXG4gICAgICAgIGxpbmVubzogbGluZW5vXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEdsb2JhbEhhbmRsZXJzLmlkID0gJ0dsb2JhbEhhbmRsZXJzJztcbiAgcmV0dXJuIEdsb2JhbEhhbmRsZXJzO1xufSgpO1xuXG5leHBvcnQgeyBHbG9iYWxIYW5kbGVycyB9OyIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgZXhjZXB0aW9uRnJvbVN0YWNrdHJhY2UgfSBmcm9tICcuLi9wYXJzZXJzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi4vdHJhY2VraXQnO1xudmFyIERFRkFVTFRfS0VZID0gJ2NhdXNlJztcbnZhciBERUZBVUxUX0xJTUlUID0gNTtcbi8qKiBBZGRzIFNESyBpbmZvIHRvIGFuIGV2ZW50LiAqL1xuXG52YXIgTGlua2VkRXJyb3JzID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBmdW5jdGlvbiBMaW5rZWRFcnJvcnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cblxuXG4gICAgdGhpcy5uYW1lID0gTGlua2VkRXJyb3JzLmlkO1xuICAgIHRoaXMuX2tleSA9IG9wdGlvbnMua2V5IHx8IERFRkFVTFRfS0VZO1xuICAgIHRoaXMuX2xpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCBERUZBVUxUX0xJTUlUO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIExpbmtlZEVycm9ycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCwgaGludCkge1xuICAgICAgdmFyIHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oTGlua2VkRXJyb3JzKTtcblxuICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBzZWxmLl9oYW5kbGVyICYmIHNlbGYuX2hhbmRsZXIuYmluZChzZWxmKTtcblxuICAgICAgICByZXR1cm4gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyBoYW5kbGVyKGV2ZW50LCBoaW50KSA6IGV2ZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX2hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICBpZiAoIWV2ZW50LmV4Y2VwdGlvbiB8fCAhZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCAhaGludCB8fCAhaXNJbnN0YW5jZU9mKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIEVycm9yKSkge1xuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cblxuICAgIHZhciBsaW5rZWRFcnJvcnMgPSB0aGlzLl93YWxrRXJyb3JUcmVlKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIHRoaXMuX2tleSk7XG5cbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gX19zcHJlYWQobGlua2VkRXJyb3JzLCBldmVudC5leGNlcHRpb24udmFsdWVzKTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX3dhbGtFcnJvclRyZWUgPSBmdW5jdGlvbiAoZXJyb3IsIGtleSwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5zdGFuY2VPZihlcnJvcltrZXldLCBFcnJvcikgfHwgc3RhY2subGVuZ3RoICsgMSA+PSB0aGlzLl9saW1pdCkge1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cblxuICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2UoZXJyb3Jba2V5XSk7XG4gICAgdmFyIGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpO1xuICAgIHJldHVybiB0aGlzLl93YWxrRXJyb3JUcmVlKGVycm9yW2tleV0sIGtleSwgX19zcHJlYWQoW2V4Y2VwdGlvbl0sIHN0YWNrKSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIExpbmtlZEVycm9ycy5pZCA9ICdMaW5rZWRFcnJvcnMnO1xuICByZXR1cm4gTGlua2VkRXJyb3JzO1xufSgpO1xuXG5leHBvcnQgeyBMaW5rZWRFcnJvcnMgfTsiLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBEZWR1cGxpY2F0aW9uIGZpbHRlciAqL1xuXG52YXIgRGVkdXBlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRGVkdXBlKCkge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gRGVkdXBlLmlkO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIERlZHVwZS5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViKSB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoZnVuY3Rpb24gKGN1cnJlbnRFdmVudCkge1xuICAgICAgdmFyIHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oRGVkdXBlKTtcblxuICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgLy8gSnV1dXN0IGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmdcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoc2VsZi5fc2hvdWxkRHJvcEV2ZW50KGN1cnJlbnRFdmVudCwgc2VsZi5fcHJldmlvdXNFdmVudCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgYSBkdXBsaWNhdGUgb2YgcHJldmlvdXNseSBjYXB0dXJlZCBldmVudC5cIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c0V2ZW50ID0gY3VycmVudEV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXZpb3VzRXZlbnQgPSBjdXJyZW50RXZlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50RXZlbnQ7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgRGVkdXBlLnByb3RvdHlwZS5fc2hvdWxkRHJvcEV2ZW50ID0gZnVuY3Rpb24gKGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkge1xuICAgIGlmICghcHJldmlvdXNFdmVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NhbWVNZXNzYWdlRXZlbnQoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2FtZUV4Y2VwdGlvbkV2ZW50KGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBEZWR1cGUucHJvdG90eXBlLl9pc1NhbWVNZXNzYWdlRXZlbnQgPSBmdW5jdGlvbiAoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSB7XG4gICAgdmFyIGN1cnJlbnRNZXNzYWdlID0gY3VycmVudEV2ZW50Lm1lc3NhZ2U7XG4gICAgdmFyIHByZXZpb3VzTWVzc2FnZSA9IHByZXZpb3VzRXZlbnQubWVzc2FnZTsgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBtZXNzYWdlIHByb3BlcnR5LCB0aGV5IHdlcmUgYm90aCBleGNlcHRpb25zLCBzbyBiYWlsIG91dFxuXG4gICAgaWYgKCFjdXJyZW50TWVzc2FnZSAmJiAhcHJldmlvdXNNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBJZiBvbmx5IG9uZSBldmVudCBoYXMgYSBzdGFja3RyYWNlLCBidXQgbm90IHRoZSBvdGhlciBvbmUsIHRoZXkgYXJlIG5vdCB0aGUgc2FtZVxuXG5cbiAgICBpZiAoY3VycmVudE1lc3NhZ2UgJiYgIXByZXZpb3VzTWVzc2FnZSB8fCAhY3VycmVudE1lc3NhZ2UgJiYgcHJldmlvdXNNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRNZXNzYWdlICE9PSBwcmV2aW91c01lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2lzU2FtZUZpbmdlcnByaW50KGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2lzU2FtZVN0YWNrdHJhY2UoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIERlZHVwZS5wcm90b3R5cGUuX2dldEZyYW1lc0Zyb21FdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb247XG5cbiAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIE9iamVjdCBjb3VsZCBiZSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LnN0YWNrdHJhY2UpIHtcbiAgICAgIHJldHVybiBldmVudC5zdGFja3RyYWNlLmZyYW1lcztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIERlZHVwZS5wcm90b3R5cGUuX2lzU2FtZVN0YWNrdHJhY2UgPSBmdW5jdGlvbiAoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSB7XG4gICAgdmFyIGN1cnJlbnRGcmFtZXMgPSB0aGlzLl9nZXRGcmFtZXNGcm9tRXZlbnQoY3VycmVudEV2ZW50KTtcblxuICAgIHZhciBwcmV2aW91c0ZyYW1lcyA9IHRoaXMuX2dldEZyYW1lc0Zyb21FdmVudChwcmV2aW91c0V2ZW50KTsgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBzdGFja3RyYWNlLCB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lXG5cblxuICAgIGlmICghY3VycmVudEZyYW1lcyAmJiAhcHJldmlvdXNGcmFtZXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gSWYgb25seSBvbmUgZXZlbnQgaGFzIGEgc3RhY2t0cmFjZSwgYnV0IG5vdCB0aGUgb3RoZXIgb25lLCB0aGV5IGFyZSBub3QgdGhlIHNhbWVcblxuXG4gICAgaWYgKGN1cnJlbnRGcmFtZXMgJiYgIXByZXZpb3VzRnJhbWVzIHx8ICFjdXJyZW50RnJhbWVzICYmIHByZXZpb3VzRnJhbWVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3VycmVudEZyYW1lcyA9IGN1cnJlbnRGcmFtZXM7XG4gICAgcHJldmlvdXNGcmFtZXMgPSBwcmV2aW91c0ZyYW1lczsgLy8gSWYgbnVtYmVyIG9mIGZyYW1lcyBkaWZmZXIsIHRoZXkgYXJlIG5vdCB0aGUgc2FtZVxuXG4gICAgaWYgKHByZXZpb3VzRnJhbWVzLmxlbmd0aCAhPT0gY3VycmVudEZyYW1lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIE90aGVyd2lzZSwgY29tcGFyZSB0aGUgdHdvXG5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldmlvdXNGcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmcmFtZUEgPSBwcmV2aW91c0ZyYW1lc1tpXTtcbiAgICAgIHZhciBmcmFtZUIgPSBjdXJyZW50RnJhbWVzW2ldO1xuXG4gICAgICBpZiAoZnJhbWVBLmZpbGVuYW1lICE9PSBmcmFtZUIuZmlsZW5hbWUgfHwgZnJhbWVBLmxpbmVubyAhPT0gZnJhbWVCLmxpbmVubyB8fCBmcmFtZUEuY29sbm8gIT09IGZyYW1lQi5jb2xubyB8fCBmcmFtZUEuZnVuY3Rpb24gIT09IGZyYW1lQi5mdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgRGVkdXBlLnByb3RvdHlwZS5fZ2V0RXhjZXB0aW9uRnJvbUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgRGVkdXBlLnByb3RvdHlwZS5faXNTYW1lRXhjZXB0aW9uRXZlbnQgPSBmdW5jdGlvbiAoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSB7XG4gICAgdmFyIHByZXZpb3VzRXhjZXB0aW9uID0gdGhpcy5fZ2V0RXhjZXB0aW9uRnJvbUV2ZW50KHByZXZpb3VzRXZlbnQpO1xuXG4gICAgdmFyIGN1cnJlbnRFeGNlcHRpb24gPSB0aGlzLl9nZXRFeGNlcHRpb25Gcm9tRXZlbnQoY3VycmVudEV2ZW50KTtcblxuICAgIGlmICghcHJldmlvdXNFeGNlcHRpb24gfHwgIWN1cnJlbnRFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJldmlvdXNFeGNlcHRpb24udHlwZSAhPT0gY3VycmVudEV4Y2VwdGlvbi50eXBlIHx8IHByZXZpb3VzRXhjZXB0aW9uLnZhbHVlICE9PSBjdXJyZW50RXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVGaW5nZXJwcmludChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVTdGFja3RyYWNlKGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBEZWR1cGUucHJvdG90eXBlLl9pc1NhbWVGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpIHtcbiAgICB2YXIgY3VycmVudEZpbmdlcnByaW50ID0gY3VycmVudEV2ZW50LmZpbmdlcnByaW50O1xuICAgIHZhciBwcmV2aW91c0ZpbmdlcnByaW50ID0gcHJldmlvdXNFdmVudC5maW5nZXJwcmludDsgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBmaW5nZXJwcmludCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB0aGUgc2FtZVxuXG4gICAgaWYgKCFjdXJyZW50RmluZ2VycHJpbnQgJiYgIXByZXZpb3VzRmluZ2VycHJpbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gSWYgb25seSBvbmUgZXZlbnQgaGFzIGEgZmluZ2VycHJpbnQsIGJ1dCBub3QgdGhlIG90aGVyIG9uZSwgdGhleSBhcmUgbm90IHRoZSBzYW1lXG5cblxuICAgIGlmIChjdXJyZW50RmluZ2VycHJpbnQgJiYgIXByZXZpb3VzRmluZ2VycHJpbnQgfHwgIWN1cnJlbnRGaW5nZXJwcmludCAmJiBwcmV2aW91c0ZpbmdlcnByaW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3VycmVudEZpbmdlcnByaW50ID0gY3VycmVudEZpbmdlcnByaW50O1xuICAgIHByZXZpb3VzRmluZ2VycHJpbnQgPSBwcmV2aW91c0ZpbmdlcnByaW50OyAvLyBPdGhlcndpc2UsIGNvbXBhcmUgdGhlIHR3b1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIShjdXJyZW50RmluZ2VycHJpbnQuam9pbignJykgPT09IHByZXZpb3VzRmluZ2VycHJpbnQuam9pbignJykpO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgRGVkdXBlLmlkID0gJ0RlZHVwZSc7XG4gIHJldHVybiBEZWR1cGU7XG59KCk7XG5cbmV4cG9ydCB7IERlZHVwZSB9OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKiBVc2VyQWdlbnQgKi9cblxudmFyIFVzZXJBZ2VudCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVzZXJBZ2VudCgpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFVzZXJBZ2VudC5pZDtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBVc2VyQWdlbnQucHJvdG90eXBlLnNldHVwT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBfYSwgX2IsIF9jO1xuXG4gICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFVzZXJBZ2VudCkpIHtcbiAgICAgICAgLy8gaWYgbm9uZSBvZiB0aGUgaW5mb3JtYXRpb24gd2Ugd2FudCBleGlzdHMsIGRvbid0IGJvdGhlclxuICAgICAgICBpZiAoIWdsb2JhbC5uYXZpZ2F0b3IgJiYgIWdsb2JhbC5sb2NhdGlvbiAmJiAhZ2xvYmFsLmRvY3VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9IC8vIGdyYWIgYXMgbXVjaCBpbmZvIGFzIGV4aXN0cyBhbmQgYWRkIGl0IHRvIHRoZSBldmVudFxuXG5cbiAgICAgICAgdmFyIHVybCA9ICgoX2EgPSBldmVudC5yZXF1ZXN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudXJsKSB8fCAoKF9iID0gZ2xvYmFsLmxvY2F0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaHJlZik7XG4gICAgICAgIHZhciByZWZlcnJlciA9IChnbG9iYWwuZG9jdW1lbnQgfHwge30pLnJlZmVycmVyO1xuICAgICAgICB2YXIgdXNlckFnZW50ID0gKGdsb2JhbC5uYXZpZ2F0b3IgfHwge30pLnVzZXJBZ2VudDtcblxuICAgICAgICB2YXIgaGVhZGVycyA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCAoX2MgPSBldmVudC5yZXF1ZXN0KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaGVhZGVycyksIHJlZmVycmVyICYmIHtcbiAgICAgICAgICBSZWZlcmVyOiByZWZlcnJlclxuICAgICAgICB9KSwgdXNlckFnZW50ICYmIHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IHVzZXJBZ2VudFxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgcmVxdWVzdCA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB1cmwgJiYge1xuICAgICAgICAgIHVybDogdXJsXG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGV2ZW50KSwge1xuICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgVXNlckFnZW50LmlkID0gJ1VzZXJBZ2VudCc7XG4gIHJldHVybiBVc2VyQWdlbnQ7XG59KCk7XG5cbmV4cG9ydCB7IFVzZXJBZ2VudCB9OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50SHViLCBpbml0QW5kQmluZCwgSW50ZWdyYXRpb25zIGFzIENvcmVJbnRlZ3JhdGlvbnMgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCcm93c2VyQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgd3JhcCBhcyBpbnRlcm5hbFdyYXAgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMsIERlZHVwZSwgR2xvYmFsSGFuZGxlcnMsIExpbmtlZEVycm9ycywgVHJ5Q2F0Y2gsIFVzZXJBZ2VudCB9IGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmV4cG9ydCB2YXIgZGVmYXVsdEludGVncmF0aW9ucyA9IFtuZXcgQ29yZUludGVncmF0aW9ucy5JbmJvdW5kRmlsdGVycygpLCBuZXcgQ29yZUludGVncmF0aW9ucy5GdW5jdGlvblRvU3RyaW5nKCksIG5ldyBUcnlDYXRjaCgpLCBuZXcgQnJlYWRjcnVtYnMoKSwgbmV3IEdsb2JhbEhhbmRsZXJzKCksIG5ldyBMaW5rZWRFcnJvcnMoKSwgbmV3IERlZHVwZSgpLCBuZXcgVXNlckFnZW50KCldO1xuLyoqXG4gKiBUaGUgU2VudHJ5IEJyb3dzZXIgU0RLIENsaWVudC5cbiAqXG4gKiBUbyB1c2UgdGhpcyBTREssIGNhbGwgdGhlIHtAbGluayBpbml0fSBmdW5jdGlvbiBhcyBlYXJseSBhcyBwb3NzaWJsZSB3aGVuXG4gKiBsb2FkaW5nIHRoZSB3ZWIgcGFnZS4gVG8gc2V0IGNvbnRleHQgaW5mb3JtYXRpb24gb3Igc2VuZCBtYW51YWwgZXZlbnRzLCB1c2VcbiAqIHRoZSBwcm92aWRlZCBtZXRob2RzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKlxuICogaW1wb3J0IHsgaW5pdCB9IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4gKlxuICogaW5pdCh7XG4gKiAgIGRzbjogJ19fRFNOX18nLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGltcG9ydCB7IGNvbmZpZ3VyZVNjb3BlIH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbiAqIGNvbmZpZ3VyZVNjb3BlKChzY29wZTogU2NvcGUpID0+IHtcbiAqICAgc2NvcGUuc2V0RXh0cmEoeyBiYXR0ZXJ5OiAwLjcgfSk7XG4gKiAgIHNjb3BlLnNldFRhZyh7IHVzZXJfbW9kZTogJ2FkbWluJyB9KTtcbiAqICAgc2NvcGUuc2V0VXNlcih7IGlkOiAnNDcxMScgfSk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBpbXBvcnQgeyBhZGRCcmVhZGNydW1iIH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbiAqIGFkZEJyZWFkY3J1bWIoe1xuICogICBtZXNzYWdlOiAnTXkgQnJlYWRjcnVtYicsXG4gKiAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYFxuICpcbiAqIGltcG9ydCAqIGFzIFNlbnRyeSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICogU2VudHJ5LmNhcHR1cmVNZXNzYWdlKCdIZWxsbywgd29ybGQhJyk7XG4gKiBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoJ0dvb2QgYnllJykpO1xuICogU2VudHJ5LmNhcHR1cmVFdmVudCh7XG4gKiAgIG1lc3NhZ2U6ICdNYW51YWwnLFxuICogICBzdGFja3RyYWNlOiBbXG4gKiAgICAgLy8gLi4uXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIEJyb3dzZXJPcHRpb25zfSBmb3IgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zID0gZGVmYXVsdEludGVncmF0aW9ucztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnJlbGVhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciB3aW5kb3dfMSA9IGdldEdsb2JhbE9iamVjdCgpOyAvLyBUaGlzIHN1cHBvcnRzIHRoZSB2YXJpYWJsZSB0aGF0IHNlbnRyeS13ZWJwYWNrLXBsdWdpbiBpbmplY3RzXG5cbiAgICBpZiAod2luZG93XzEuU0VOVFJZX1JFTEVBU0UgJiYgd2luZG93XzEuU0VOVFJZX1JFTEVBU0UuaWQpIHtcbiAgICAgIG9wdGlvbnMucmVsZWFzZSA9IHdpbmRvd18xLlNFTlRSWV9SRUxFQVNFLmlkO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZW5kQ2xpZW50UmVwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucy5zZW5kQ2xpZW50UmVwb3J0cyA9IHRydWU7XG4gIH1cblxuICBpbml0QW5kQmluZChCcm93c2VyQ2xpZW50LCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nKSB7XG4gICAgc3RhcnRTZXNzaW9uVHJhY2tpbmcoKTtcbiAgfVxufVxuLyoqXG4gKiBQcmVzZW50IHRoZSB1c2VyIHdpdGggYSByZXBvcnQgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwsIHdlIHRyeSB0byBmZXRjaCBhbGwgaW5mbyBuZWVkIGZyb20gdGhlIGdsb2JhbCBzY29wZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvd1JlcG9ydERpYWxvZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICB2YXIgc2NvcGUgPSBodWIuZ2V0U2NvcGUoKTtcblxuICBpZiAoc2NvcGUpIHtcbiAgICBvcHRpb25zLnVzZXIgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc2NvcGUuZ2V0VXNlcigpKSwgb3B0aW9ucy51c2VyKTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5ldmVudElkKSB7XG4gICAgb3B0aW9ucy5ldmVudElkID0gaHViLmxhc3RFdmVudElkKCk7XG4gIH1cblxuICB2YXIgY2xpZW50ID0gaHViLmdldENsaWVudCgpO1xuXG4gIGlmIChjbGllbnQpIHtcbiAgICBjbGllbnQuc2hvd1JlcG9ydERpYWxvZyhvcHRpb25zKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBnZXR0ZXIgZm9yIGxhc3RFdmVudElkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsYXN0IGV2ZW50IGlkIG9mIGEgY2FwdHVyZWQgZXZlbnQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RFdmVudElkKCkge1xuICByZXR1cm4gZ2V0Q3VycmVudEh1YigpLmxhc3RFdmVudElkKCk7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBiZSBBUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBsb2FkZXIuXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlTG9hZCgpIHsvLyBOb29wXG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBiZSBBUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBsb2FkZXIuXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9uTG9hZChjYWxsYmFjaykge1xuICBjYWxsYmFjaygpO1xufVxuLyoqXG4gKiBDYWxsIGBmbHVzaCgpYCBvbiB0aGUgY3VycmVudCBjbGllbnQsIGlmIHRoZXJlIGlzIG9uZS4gU2VlIHtAbGluayBDbGllbnQuZmx1c2h9LlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgY2xpZW50IHNob3VsZCB3YWl0IHRvIGZsdXNoIGl0cyBldmVudCBxdWV1ZS4gT21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIgd2lsbCBjYXVzZVxuICogdGhlIGNsaWVudCB0byB3YWl0IHVudGlsIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBgdHJ1ZWAgaWYgdGhlIHF1ZXVlIHN1Y2Nlc3NmdWxseSBkcmFpbnMgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIGl0XG4gKiBkb2Vzbid0IChvciBpZiB0aGVyZSdzIG5vIGNsaWVudCBkZWZpbmVkKS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmx1c2godGltZW91dCkge1xuICB2YXIgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudCgpO1xuXG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmZsdXNoKHRpbWVvdXQpO1xuICB9XG5cbiAgbG9nZ2VyLndhcm4oJ0Nhbm5vdCBmbHVzaCBldmVudHMuIE5vIGNsaWVudCBkZWZpbmVkLicpO1xuICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG4vKipcbiAqIENhbGwgYGNsb3NlKClgIG9uIHRoZSBjdXJyZW50IGNsaWVudCwgaWYgdGhlcmUgaXMgb25lLiBTZWUge0BsaW5rIENsaWVudC5jbG9zZX0uXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgdG8gZmx1c2ggaXRzIGV2ZW50IHF1ZXVlIGJlZm9yZSBzaHV0dGluZyBkb3duLiBPbWl0dGluZyB0aGlzXG4gKiBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0aGUgY2xpZW50IHRvIHdhaXQgdW50aWwgYWxsIGV2ZW50cyBhcmUgc2VudCBiZWZvcmUgZGlzYWJsaW5nIGl0c2VsZi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBgdHJ1ZWAgaWYgdGhlIHF1ZXVlIHN1Y2Nlc3NmdWxseSBkcmFpbnMgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIGl0XG4gKiBkb2Vzbid0IChvciBpZiB0aGVyZSdzIG5vIGNsaWVudCBkZWZpbmVkKS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2UodGltZW91dCkge1xuICB2YXIgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudCgpO1xuXG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmNsb3NlKHRpbWVvdXQpO1xuICB9XG5cbiAgbG9nZ2VyLndhcm4oJ0Nhbm5vdCBmbHVzaCBldmVudHMgYW5kIGRpc2FibGUgU0RLLiBObyBjbGllbnQgZGVmaW5lZC4nKTtcbiAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuLyoqXG4gKiBXcmFwIGNvZGUgd2l0aGluIGEgdHJ5L2NhdGNoIGJsb2NrIHNvIHRoZSBTREsgaXMgYWJsZSB0byBjYXB0dXJlIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0gZm4gQSBmdW5jdGlvbiB0byB3cmFwLlxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2Ygd3JhcHBlZCBmdW5jdGlvbiBjYWxsLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcChmbikge1xuICByZXR1cm4gaW50ZXJuYWxXcmFwKGZuKSgpO1xufVxuLyoqXG4gKiBFbmFibGUgYXV0b21hdGljIFNlc3Npb24gVHJhY2tpbmcgZm9yIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAqL1xuXG5mdW5jdGlvbiBzdGFydFNlc3Npb25UcmFja2luZygpIHtcbiAgdmFyIHdpbmRvdyA9IGdldEdsb2JhbE9iamVjdCgpO1xuICB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBsb2dnZXIud2FybignU2Vzc2lvbiB0cmFja2luZyBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudCB3aXRoIEBzZW50cnkvYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7IC8vIFRoZSBvbmx5IHdheSBmb3IgdGhpcyB0byBiZSBmYWxzZSBpcyBmb3IgdGhlcmUgdG8gYmUgYSB2ZXJzaW9uIG1pc21hdGNoIGJldHdlZW4gQHNlbnRyeS9icm93c2VyICg+PSA2LjAuMCkgYW5kXG4gIC8vIEBzZW50cnkvaHViICg8IDUuMjcuMCkuIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlcmUgd29uJ3QgZXZlciBiZSBzdWNoIGEgbWlzbWF0Y2gsIGJlY2F1c2UgdGhlIHR3byBwYWNrYWdlcyBhcmVcbiAgLy8gcGlubmVkIGF0IHRoZSBzYW1lIHZlcnNpb24gaW4gcGFja2FnZS5qc29uLCBidXQgdGhlcmUgYXJlIGVkZ2UgY2FzZXMgd2hlcmUgaXQncyBwb3NzaWJsZS4gU2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMyMDcgYW5kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMyMzQgYW5kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMyNzguXG5cbiAgaWYgKHR5cGVvZiBodWIuc3RhcnRTZXNzaW9uICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBodWIuY2FwdHVyZVNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHNlc3Npb24gZHVyYXRpb24gZm9yIGJyb3dzZXIgc2Vzc2lvbnMgZG9lcyBub3QgdHJhY2sgYSBtZWFuaW5nZnVsXG4gIC8vIGNvbmNlcHQgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIG1ldHJpYy5cbiAgLy8gQXV0b21hdGljYWxseSBjYXB0dXJlZCBzZXNzaW9ucyBhcmUgYWtpbiB0byBwYWdlIHZpZXdzLCBhbmQgdGh1cyB3ZVxuICAvLyBkaXNjYXJkIHRoZWlyIGR1cmF0aW9uLlxuXG5cbiAgaHViLnN0YXJ0U2Vzc2lvbih7XG4gICAgaWdub3JlRHVyYXRpb246IHRydWVcbiAgfSk7XG4gIGh1Yi5jYXB0dXJlU2Vzc2lvbigpOyAvLyBXZSB3YW50IHRvIGNyZWF0ZSBhIHNlc3Npb24gZm9yIGV2ZXJ5IG5hdmlnYXRpb24gYXMgd2VsbFxuXG4gIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhfYSkge1xuICAgICAgdmFyIGZyb20gPSBfYS5mcm9tLFxuICAgICAgICAgIHRvID0gX2EudG87IC8vIERvbid0IGNyZWF0ZSBhbiBhZGRpdGlvbmFsIHNlc3Npb24gZm9yIHRoZSBpbml0aWFsIHJvdXRlIG9yIGlmIHRoZSBsb2NhdGlvbiBkaWQgbm90IGNoYW5nZVxuXG4gICAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkIHx8IGZyb20gPT09IHRvKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaHViLnN0YXJ0U2Vzc2lvbih7XG4gICAgICAgIGlnbm9yZUR1cmF0aW9uOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGh1Yi5jYXB0dXJlU2Vzc2lvbigpO1xuICAgIH0sXG4gICAgdHlwZTogJ2hpc3RvcnknXG4gIH0pO1xufSIsIi8vIFRPRE86IFJlbW92ZSBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlIGFuZCByZWx5IG9ubHkgb24gQHNlbnRyeS9jb3JlIFNES19WRVJTSU9OIGFuZCBTZGtJbmZvIG1ldGFkYXRhXG5leHBvcnQgdmFyIFNES19OQU1FID0gJ3NlbnRyeS5qYXZhc2NyaXB0LmJyb3dzZXInOyIsImV4cG9ydCB7IFNldmVyaXR5LCBTdGF0dXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBhZGRCcmVhZGNydW1iLCBjYXB0dXJlRXhjZXB0aW9uLCBjYXB0dXJlRXZlbnQsIGNhcHR1cmVNZXNzYWdlLCBjb25maWd1cmVTY29wZSwgZ2V0SHViRnJvbUNhcnJpZXIsIGdldEN1cnJlbnRIdWIsIEh1YiwgbWFrZU1haW4sIFNjb3BlLCBzdGFydFRyYW5zYWN0aW9uLCBTREtfVkVSU0lPTiwgc2V0Q29udGV4dCwgc2V0RXh0cmEsIHNldEV4dHJhcywgc2V0VGFnLCBzZXRUYWdzLCBzZXRVc2VyLCB3aXRoU2NvcGUgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuZXhwb3J0IHsgQnJvd3NlckNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IGluamVjdFJlcG9ydERpYWxvZyB9IGZyb20gJy4vaGVscGVycyc7XG5leHBvcnQgeyBldmVudEZyb21FeGNlcHRpb24sIGV2ZW50RnJvbU1lc3NhZ2UgfSBmcm9tICcuL2V2ZW50YnVpbGRlcic7XG5leHBvcnQgeyBkZWZhdWx0SW50ZWdyYXRpb25zLCBmb3JjZUxvYWQsIGluaXQsIGxhc3RFdmVudElkLCBvbkxvYWQsIHNob3dSZXBvcnREaWFsb2csIGZsdXNoLCBjbG9zZSwgd3JhcCB9IGZyb20gJy4vc2RrJztcbmV4cG9ydCB7IFNES19OQU1FIH0gZnJvbSAnLi92ZXJzaW9uJzsiLCJleHBvcnQgeyBGdW5jdGlvblRvU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbnRvc3RyaW5nJztcbmV4cG9ydCB7IEluYm91bmRGaWx0ZXJzIH0gZnJvbSAnLi9pbmJvdW5kZmlsdGVycyc7IiwiZXhwb3J0IHsgR2xvYmFsSGFuZGxlcnMgfSBmcm9tICcuL2dsb2JhbGhhbmRsZXJzJztcbmV4cG9ydCB7IFRyeUNhdGNoIH0gZnJvbSAnLi90cnljYXRjaCc7XG5leHBvcnQgeyBCcmVhZGNydW1icyB9IGZyb20gJy4vYnJlYWRjcnVtYnMnO1xuZXhwb3J0IHsgTGlua2VkRXJyb3JzIH0gZnJvbSAnLi9saW5rZWRlcnJvcnMnO1xuZXhwb3J0IHsgVXNlckFnZW50IH0gZnJvbSAnLi91c2VyYWdlbnQnO1xuZXhwb3J0IHsgRGVkdXBlIH0gZnJvbSAnLi9kZWR1cGUnOyIsImV4cG9ydCB7IEJhc2VUcmFuc3BvcnQgfSBmcm9tICcuL2Jhc2UnO1xuZXhwb3J0IHsgRmV0Y2hUcmFuc3BvcnQgfSBmcm9tICcuL2ZldGNoJztcbmV4cG9ydCB7IFhIUlRyYW5zcG9ydCB9IGZyb20gJy4veGhyJzsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZXhwb3J0ICogZnJvbSAnLi9leHBvcnRzJztcbmltcG9ydCB7IEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgQnJvd3NlckludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBUcmFuc3BvcnRzIGZyb20gJy4vdHJhbnNwb3J0cyc7XG52YXIgd2luZG93SW50ZWdyYXRpb25zID0ge307IC8vIFRoaXMgYmxvY2sgaXMgbmVlZGVkIHRvIGFkZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGludGVncmF0aW9ucyBwYWNrYWdlcyB3aGVuIHVzZWQgd2l0aCBhIENETlxuXG52YXIgX3dpbmRvdyA9IGdldEdsb2JhbE9iamVjdCgpO1xuXG5pZiAoX3dpbmRvdy5TZW50cnkgJiYgX3dpbmRvdy5TZW50cnkuSW50ZWdyYXRpb25zKSB7XG4gIHdpbmRvd0ludGVncmF0aW9ucyA9IF93aW5kb3cuU2VudHJ5LkludGVncmF0aW9ucztcbn1cblxudmFyIElOVEVHUkFUSU9OUyA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB3aW5kb3dJbnRlZ3JhdGlvbnMpLCBDb3JlSW50ZWdyYXRpb25zKSwgQnJvd3NlckludGVncmF0aW9ucyk7XG5cbmV4cG9ydCB7IElOVEVHUkFUSU9OUyBhcyBJbnRlZ3JhdGlvbnMsIFRyYW5zcG9ydHMgfTsiLCJpbXBvcnQgeyBpbml0IGFzIGJyb3dzZXJJbml0LCBTREtfVkVSU0lPTiB9IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4vKipcbiAqIEluaXRzIHRoZSBSZWFjdCBTREtcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChvcHRpb25zKSB7XG4gIG9wdGlvbnMuX21ldGFkYXRhID0gb3B0aW9ucy5fbWV0YWRhdGEgfHwge307XG4gIG9wdGlvbnMuX21ldGFkYXRhLnNkayA9IG9wdGlvbnMuX21ldGFkYXRhLnNkayB8fCB7XG4gICAgbmFtZTogJ3NlbnRyeS5qYXZhc2NyaXB0LnJlYWN0JyxcbiAgICBwYWNrYWdlczogW3tcbiAgICAgIG5hbWU6ICducG06QHNlbnRyeS9yZWFjdCcsXG4gICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTlxuICAgIH1dLFxuICAgIHZlcnNpb246IFNES19WRVJTSU9OXG4gIH07XG4gIGJyb3dzZXJJbml0KG9wdGlvbnMpO1xufSIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXG52YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgIF9fcHJvdG9fXzogW11cbiAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZC5fX3Byb3RvX18gPSBiO1xuICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgfVxuXG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxudmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgeyBfYXNzaWduIGFzIF9fYXNzaWduIH07XG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLFxuICAgICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgfVxuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHtcbiAgICBsYWJlbDogMCxcbiAgICBzZW50OiBmdW5jdGlvbiBzZW50KCkge1xuICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgcmV0dXJuIHRbMV07XG4gICAgfSxcbiAgICB0cnlzOiBbXSxcbiAgICBvcHM6IFtdXG4gIH0sXG4gICAgICBmLFxuICAgICAgeSxcbiAgICAgIHQsXG4gICAgICBnO1xuICByZXR1cm4gZyA9IHtcbiAgICBuZXh0OiB2ZXJiKDApLFxuICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZztcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBzdGVwKFtuLCB2XSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG5cbiAgICB3aGlsZSAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG5cbiAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICBvcCA9IFswXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcblxuICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgICB5ID0gMDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGYgPSB0ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICBkb25lOiB0cnVlXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59XG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcbiAgZm9yICh2YXIgcCBpbiBtKSB7XG4gICAgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgbSA9IHMgJiYgb1tzXSxcbiAgICAgIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG8gJiYgb1tpKytdLFxuICAgICAgICBkb25lOiAhb1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHtcbiAgICAgIHJba10gPSBhW2pdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSxcbiAgICAgIGksXG4gICAgICBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAocikge1xuICAgIHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJlc3VtZShcIm5leHRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHtcbiAgICBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgdGhyb3cgZTtcbiAgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHtcbiAgICBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gKHAgPSAhcCkgPyB7XG4gICAgICAgIHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLFxuICAgICAgICBkb25lOiBuID09PSBcInJldHVyblwiXG4gICAgICB9IDogZiA/IGYodikgOiB2O1xuICAgIH0gOiBmO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sXG4gICAgICBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpKTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikge1xuICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIGRvbmU6IGRcbiAgICAgIH0pO1xuICAgIH0sIHJlamVjdCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwge1xuICAgICAgdmFsdWU6IHJhd1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvb2tlZC5yYXcgPSByYXc7XG4gIH1cblxuICByZXR1cm4gY29va2VkO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgfVxuICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsImltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMsIF9fcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbmltcG9ydCB7IHRpbWVzdGFtcFdpdGhNcyB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgVU5LTk9XTl9DT01QT05FTlQgPSAndW5rbm93bic7XG52YXIgVFJBQ0lOR19HRVRURVIgPSB7XG4gIGlkOiAnVHJhY2luZydcbn07XG52YXIgZ2xvYmFsVHJhY2luZ0ludGVncmF0aW9uID0gbnVsbDtcbi8qKiBAZGVwcmVjYXRlZCByZW1vdmUgd2hlbiBAc2VudHJ5L2FwbSBubyBsb25nZXIgdXNlZCAqL1xuXG52YXIgZ2V0VHJhY2luZ0ludGVncmF0aW9uID0gZnVuY3Rpb24gZ2V0VHJhY2luZ0ludGVncmF0aW9uKCkge1xuICBpZiAoZ2xvYmFsVHJhY2luZ0ludGVncmF0aW9uKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRyYWNpbmdJbnRlZ3JhdGlvbjtcbiAgfVxuXG4gIGdsb2JhbFRyYWNpbmdJbnRlZ3JhdGlvbiA9IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihUUkFDSU5HX0dFVFRFUik7XG4gIHJldHVybiBnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb247XG59O1xuLyoqXG4gKiBwdXNoQWN0aXZpdHkgY3JlYXRlcyBhbiBuZXcgcmVhY3QgYWN0aXZpdHkuXG4gKiBJcyBhIG5vLW9wIGlmIFRyYWNpbmcgaW50ZWdyYXRpb24gaXMgbm90IHZhbGlkXG4gKiBAcGFyYW0gbmFtZSBkaXNwbGF5TmFtZSBvZiBjb21wb25lbnQgdGhhdCBzdGFydGVkIGFjdGl2aXR5XG4gKiBAZGVwcmVjYXRlZCByZW1vdmUgd2hlbiBAc2VudHJ5L2FwbSBubyBsb25nZXIgdXNlZFxuICovXG5cblxuZnVuY3Rpb24gcHVzaEFjdGl2aXR5KG5hbWUsIG9wKSB7XG4gIGlmIChnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb24uY29uc3RydWN0b3IucHVzaEFjdGl2aXR5KG5hbWUsIHtcbiAgICBkZXNjcmlwdGlvbjogXCI8XCIgKyBuYW1lICsgXCI+XCIsXG4gICAgb3A6IFwicmVhY3QuXCIgKyBvcFxuICB9KTtcbn1cbi8qKlxuICogcG9wQWN0aXZpdHkgcmVtb3ZlcyBhIFJlYWN0IGFjdGl2aXR5LlxuICogSXMgYSBuby1vcCBpZiBUcmFjaW5nIGludGVncmF0aW9uIGlzIG5vdCB2YWxpZC5cbiAqIEBwYXJhbSBhY3Rpdml0eSBpZCBvZiBhY3Rpdml0eSB0aGF0IGlzIGJlaW5nIHBvcHBlZFxuICogQGRlcHJlY2F0ZWQgcmVtb3ZlIHdoZW4gQHNlbnRyeS9hcG0gbm8gbG9uZ2VyIHVzZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIHBvcEFjdGl2aXR5KGFjdGl2aXR5KSB7XG4gIGlmIChhY3Rpdml0eSA9PT0gbnVsbCB8fCBnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb24uY29uc3RydWN0b3IucG9wQWN0aXZpdHkoYWN0aXZpdHkpO1xufVxuLyoqXG4gKiBPYnRhaW4gYSBzcGFuIGdpdmVuIGFuIGFjdGl2aXR5IGlkLlxuICogSXMgYSBuby1vcCBpZiBUcmFjaW5nIGludGVncmF0aW9uIGlzIG5vdCB2YWxpZC5cbiAqIEBwYXJhbSBhY3Rpdml0eSBhY3Rpdml0eSBpZCBhc3NvY2lhdGVkIHdpdGggb2J0YWluZWQgc3BhblxuICogQGRlcHJlY2F0ZWQgcmVtb3ZlIHdoZW4gQHNlbnRyeS9hcG0gbm8gbG9uZ2VyIHVzZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEFjdGl2aXR5U3BhbihhY3Rpdml0eSkge1xuICBpZiAoYWN0aXZpdHkgPT09IG51bGwgfHwgZ2xvYmFsVHJhY2luZ0ludGVncmF0aW9uID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBnbG9iYWxUcmFjaW5nSW50ZWdyYXRpb24uY29uc3RydWN0b3IuZ2V0QWN0aXZpdHlTcGFuKGFjdGl2aXR5KTtcbn1cbi8qKlxuICogVGhlIFByb2ZpbGVyIGNvbXBvbmVudCBsZXZlcmFnZXMgU2VudHJ5J3MgVHJhY2luZyBpbnRlZ3JhdGlvbiB0byBnZW5lcmF0ZVxuICogc3BhbnMgYmFzZWQgb24gY29tcG9uZW50IGxpZmVjeWNsZXMuXG4gKi9cblxuXG52YXIgUHJvZmlsZXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoUHJvZmlsZXIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gUHJvZmlsZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BhbiBvZiB0aGUgbW91bnQgYWN0aXZpdHlcbiAgICAgKiBNYWRlIHByb3RlY3RlZCBmb3IgdGhlIFJlYWN0IE5hdGl2ZSBTREsgdG8gYWNjZXNzXG4gICAgICovXG5cblxuICAgIF90aGlzLl9tb3VudFNwYW4gPSB1bmRlZmluZWQ7IC8vIFRoZSBhY3Rpdml0eSByZXByZXNlbnRpbmcgaG93IGxvbmcgaXQgdGFrZXMgdG8gbW91bnQgYSBjb21wb25lbnQuXG5cbiAgICBfdGhpcy5fbW91bnRBY3Rpdml0eSA9IG51bGw7XG4gICAgdmFyIF9hID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG5hbWUgPSBfYS5uYW1lLFxuICAgICAgICBfYiA9IF9hLmRpc2FibGVkLFxuICAgICAgICBkaXNhYmxlZCA9IF9iID09PSB2b2lkIDAgPyBmYWxzZSA6IF9iO1xuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfSAvLyBJZiB0aGV5IGFyZSB1c2luZyBAc2VudHJ5L2FwbSwgd2UgbmVlZCB0byBwdXNoL3BvcCBhY3Rpdml0aWVzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cblxuICAgIGlmIChnZXRUcmFjaW5nSW50ZWdyYXRpb24oKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICBfdGhpcy5fbW91bnRBY3Rpdml0eSA9IHB1c2hBY3Rpdml0eShuYW1lLCAnbW91bnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKTtcblxuICAgICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICAgIF90aGlzLl9tb3VudFNwYW4gPSBhY3RpdmVUcmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCI8XCIgKyBuYW1lICsgXCI+XCIsXG4gICAgICAgICAgb3A6ICdyZWFjdC5tb3VudCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIElmIGEgY29tcG9uZW50IG1vdW50ZWQsIHdlIGNhbiBmaW5pc2ggdGhlIG1vdW50IGFjdGl2aXR5LlxuXG5cbiAgUHJvZmlsZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tb3VudFNwYW4pIHtcbiAgICAgIHRoaXMuX21vdW50U3Bhbi5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICB0aGlzLl9tb3VudFNwYW4gPSBnZXRBY3Rpdml0eVNwYW4odGhpcy5fbW91bnRBY3Rpdml0eSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gICAgICBwb3BBY3Rpdml0eSh0aGlzLl9tb3VudEFjdGl2aXR5KTtcbiAgICAgIHRoaXMuX21vdW50QWN0aXZpdHkgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBQcm9maWxlci5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciB1cGRhdGVQcm9wcyA9IF9hLnVwZGF0ZVByb3BzLFxuICAgICAgICBfYiA9IF9hLmluY2x1ZGVVcGRhdGVzLFxuICAgICAgICBpbmNsdWRlVXBkYXRlcyA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2I7IC8vIE9ubHkgZ2VuZXJhdGUgYW4gdXBkYXRlIHNwYW4gaWYgaGFzVXBkYXRlU3BhbiBpcyB0cnVlLCBpZiB0aGVyZSBpcyBhIHZhbGlkIG1vdW50U3BhbixcbiAgICAvLyBhbmQgaWYgdGhlIHVwZGF0ZVByb3BzIGhhdmUgY2hhbmdlZC4gSXQgaXMgb2sgdG8gbm90IGRvIGEgZGVlcCBlcXVhbGl0eSBjaGVjayBoZXJlIGFzIGl0IGlzIGV4cGVuc2l2ZS5cbiAgICAvLyBXZSBhcmUganVzdCB0cnlpbmcgdG8gZ2l2ZSBiYXNlbGluZSBjbHVlcyBmb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLlxuXG4gICAgaWYgKGluY2x1ZGVVcGRhdGVzICYmIHRoaXMuX21vdW50U3BhbiAmJiB1cGRhdGVQcm9wcyAhPT0gdGhpcy5wcm9wcy51cGRhdGVQcm9wcykge1xuICAgICAgLy8gU2VlIHdoYXQgcHJvcHMgaGF2ZWQgY2hhbmdlZCBiZXR3ZWVuIHRoZSBwcmV2aW91cyBwcm9wcywgYW5kIHRoZSBjdXJyZW50IHByb3BzLiBUaGlzIGlzXG4gICAgICAvLyBzZXQgYXMgZGF0YSBvbiB0aGUgc3Bhbi4gV2UganVzdCBzdG9yZSB0aGUgcHJvcCBrZXlzIGFzIHRoZSB2YWx1ZXMgY291bGQgYmUgcG90ZW5pYWxseSB2ZXJ5IGxhcmdlLlxuICAgICAgdmFyIGNoYW5nZWRQcm9wcyA9IE9iamVjdC5rZXlzKHVwZGF0ZVByb3BzKS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVByb3BzW2tdICE9PSBfdGhpcy5wcm9wcy51cGRhdGVQcm9wc1trXTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2hhbmdlZFByb3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVGhlIHVwZGF0ZSBzcGFuIGlzIGEgcG9pbnQgaW4gdGltZSBzcGFuIHdpdGggMCBkdXJhdGlvbiwganVzdCBzaWduaWZ5aW5nIHRoYXQgdGhlIGNvbXBvbmVudFxuICAgICAgICAvLyBoYXMgYmVlbiB1cGRhdGVkLlxuICAgICAgICB2YXIgbm93ID0gdGltZXN0YW1wV2l0aE1zKCk7XG5cbiAgICAgICAgdGhpcy5fbW91bnRTcGFuLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNoYW5nZWRQcm9wczogY2hhbmdlZFByb3BzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCI8XCIgKyB0aGlzLnByb3BzLm5hbWUgKyBcIj5cIixcbiAgICAgICAgICBlbmRUaW1lc3RhbXA6IG5vdyxcbiAgICAgICAgICBvcDogXCJyZWFjdC51cGRhdGVcIixcbiAgICAgICAgICBzdGFydFRpbWVzdGFtcDogbm93XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gSWYgYSBjb21wb25lbnQgaXMgdW5tb3VudGVkLCB3ZSBjYW4gc2F5IGl0IGlzIG5vIGxvbmdlciBvbiB0aGUgc2NyZWVuLlxuICAvLyBUaGlzIG1lYW5zIHdlIGNhbiBmaW5pc2ggdGhlIHNwYW4gcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQgcmVuZGVyLlxuXG5cbiAgUHJvZmlsZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgIG5hbWUgPSBfYS5uYW1lLFxuICAgICAgICBfYiA9IF9hLmluY2x1ZGVSZW5kZXIsXG4gICAgICAgIGluY2x1ZGVSZW5kZXIgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iO1xuXG4gICAgaWYgKHRoaXMuX21vdW50U3BhbiAmJiBpbmNsdWRlUmVuZGVyKSB7XG4gICAgICAvLyBJZiB3ZSB3ZXJlIGFibGUgdG8gb2J0YWluIHRoZSBzcGFuSWQgb2YgdGhlIG1vdW50IGFjdGl2aXR5LCB3ZSBzaG91bGQgc2V0IHRoZVxuICAgICAgLy8gbmV4dCBhY3Rpdml0eSBhcyBhIGNoaWxkIHRvIHRoZSBjb21wb25lbnQgbW91bnQgYWN0aXZpdHkuXG4gICAgICB0aGlzLl9tb3VudFNwYW4uc3RhcnRDaGlsZCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIjxcIiArIG5hbWUgKyBcIj5cIixcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0aW1lc3RhbXBXaXRoTXMoKSxcbiAgICAgICAgb3A6IFwicmVhY3QucmVuZGVyXCIsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiB0aGlzLl9tb3VudFNwYW4uZW5kVGltZXN0YW1wXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgUHJvZmlsZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcblxuXG4gIFByb2ZpbGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgaW5jbHVkZVJlbmRlcjogdHJ1ZSxcbiAgICBpbmNsdWRlVXBkYXRlczogdHJ1ZVxuICB9O1xuICByZXR1cm4gUHJvZmlsZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG4vKipcbiAqIHdpdGhQcm9maWxlciBpcyBhIGhpZ2hlciBvcmRlciBjb21wb25lbnQgdGhhdCB3cmFwcyBhXG4gKiBjb21wb25lbnQgaW4gYSB7QGxpbmsgUHJvZmlsZXJ9IGNvbXBvbmVudC4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdFxuICogdGhlIGhpZ2hlciBvcmRlciBjb21wb25lbnQgYmUgdXNlZCBvdmVyIHRoZSByZWd1bGFyIHtAbGluayBQcm9maWxlcn0gY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSBXcmFwcGVkQ29tcG9uZW50IGNvbXBvbmVudCB0aGF0IGlzIHdyYXBwZWQgYnkgUHJvZmlsZXJcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSB7QGxpbmsgUHJvZmlsZXJQcm9wc30geW91IGNhbiBwYXNzIGludG8gdGhlIFByb2ZpbGVyXG4gKi9cblxuXG5mdW5jdGlvbiB3aXRoUHJvZmlsZXIoV3JhcHBlZENvbXBvbmVudCwgLy8gV2UgZG8gbm90IHdhbnQgdG8gaGF2ZSBgdXBkYXRlUHJvcHNgIGdpdmVuIGluIG9wdGlvbnMsIGl0IGlzIGluc3RlYWQgZmlsbGVkIHRocm91Z2ggdGhlIEhPQy5cbm9wdGlvbnMpIHtcbiAgdmFyIGNvbXBvbmVudERpc3BsYXlOYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLm5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgVU5LTk9XTl9DT01QT05FTlQ7XG5cbiAgdmFyIFdyYXBwZWQgPSBmdW5jdGlvbiBXcmFwcGVkKHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvZmlsZXIsIF9fYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICBuYW1lOiBjb21wb25lbnREaXNwbGF5TmFtZSxcbiAgICAgIHVwZGF0ZVByb3BzOiBwcm9wc1xuICAgIH0pLCBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9fYXNzaWduKHt9LCBwcm9wcykpKTtcbiAgfTtcblxuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gXCJwcm9maWxlcihcIiArIGNvbXBvbmVudERpc3BsYXlOYW1lICsgXCIpXCI7IC8vIENvcHkgb3ZlciBzdGF0aWMgbWV0aG9kcyBmcm9tIFdyYXBwZWQgY29tcG9uZW50IHRvIFByb2ZpbGVyIEhPQ1xuICAvLyBTZWU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9oaWdoZXItb3JkZXItY29tcG9uZW50cy5odG1sI3N0YXRpYy1tZXRob2RzLW11c3QtYmUtY29waWVkLW92ZXJcblxuICBob2lzdE5vblJlYWN0U3RhdGljcyhXcmFwcGVkLCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgcmV0dXJuIFdyYXBwZWQ7XG59XG4vKipcbiAqXG4gKiBgdXNlUHJvZmlsZXJgIGlzIGEgUmVhY3QgaG9vayB0aGF0IHByb2ZpbGVzIGEgUmVhY3QgY29tcG9uZW50LlxuICpcbiAqIFJlcXVpcmVzIFJlYWN0IDE2Ljggb3IgYWJvdmUuXG4gKiBAcGFyYW0gbmFtZSBkaXNwbGF5TmFtZSBvZiBjb21wb25lbnQgYmVpbmcgcHJvZmlsZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIHVzZVByb2ZpbGVyKG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBoYXNSZW5kZXJTcGFuOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHZhciBfYSA9IF9fcmVhZChSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuXG4gICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIjxcIiArIG5hbWUgKyBcIj5cIixcbiAgICAgICAgb3A6ICdyZWFjdC5tb3VudCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0pLCAxKSxcbiAgICAgIG1vdW50U3BhbiA9IF9hWzBdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vdW50U3Bhbikge1xuICAgICAgbW91bnRTcGFuLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobW91bnRTcGFuICYmIG9wdGlvbnMuaGFzUmVuZGVyU3Bhbikge1xuICAgICAgICBtb3VudFNwYW4uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiPFwiICsgbmFtZSArIFwiPlwiLFxuICAgICAgICAgIGVuZFRpbWVzdGFtcDogdGltZXN0YW1wV2l0aE1zKCksXG4gICAgICAgICAgb3A6IFwicmVhY3QucmVuZGVyXCIsXG4gICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IG1vdW50U3Bhbi5lbmRUaW1lc3RhbXBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTsgLy8gV2Ugb25seSB3YW50IHRoaXMgdG8gcnVuIG9uY2UuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCB7IHdpdGhQcm9maWxlciwgUHJvZmlsZXIsIHVzZVByb2ZpbGVyIH07XG4vKiogR3JhYnMgYWN0aXZlIHRyYW5zYWN0aW9uIG9mZiBzY29wZSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oaHViKSB7XG4gIGlmIChodWIgPT09IHZvaWQgMCkge1xuICAgIGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgfVxuXG4gIGlmIChodWIpIHtcbiAgICB2YXIgc2NvcGUgPSBodWIuZ2V0U2NvcGUoKTtcblxuICAgIGlmIChzY29wZSkge1xuICAgICAgcmV0dXJuIHNjb3BlLmdldFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzLCBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjYXB0dXJlRXZlbnQsIGNhcHR1cmVFeGNlcHRpb24sIGV2ZW50RnJvbUV4Y2VwdGlvbiwgc2hvd1JlcG9ydERpYWxvZywgd2l0aFNjb3BlIH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbmltcG9ydCB7IGxvZ2dlciwgcGFyc2VTZW12ZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgcmVhY3RWZXJzaW9uID0gcGFyc2VTZW12ZXIoUmVhY3QudmVyc2lvbik7XG5leHBvcnQgdmFyIFVOS05PV05fQ09NUE9ORU5UID0gJ3Vua25vd24nO1xudmFyIElOSVRJQUxfU1RBVEUgPSB7XG4gIGNvbXBvbmVudFN0YWNrOiBudWxsLFxuICBlcnJvcjogbnVsbCxcbiAgZXZlbnRJZDogbnVsbFxufTtcbi8qKlxuICogTG9ncyByZWFjdCBlcnJvciBib3VuZGFyeSBlcnJvcnMgdG8gU2VudHJ5LiBJZiBvbiBSZWFjdCB2ZXJzaW9uID49IDE3LCBjcmVhdGVzIHN0YWNrIHRyYWNlXG4gKiBmcm9tIGNvbXBvbmVudFN0YWNrIHBhcmFtLCBvdGhlcndpc2UgcmVsaWVzIG9uIGVycm9yIHBhcmFtIGZvciBzdGFja3RyYWNlLlxuICpcbiAqIEBwYXJhbSBlcnJvciBBbiBlcnJvciBjYXB0dXJlZCBieSBSZWFjdCBFcnJvciBCb3VuZGFyeVxuICogQHBhcmFtIGNvbXBvbmVudFN0YWNrIFRoZSBjb21wb25lbnQgc3RhY2t0cmFjZVxuICovXG5cbmZ1bmN0aW9uIGNhcHR1cmVSZWFjdEVycm9yQm91bmRhcnlFcnJvcihlcnJvciwgY29tcG9uZW50U3RhY2spIHtcbiAgdmFyIGVycm9yQm91bmRhcnlFcnJvciA9IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgZXJyb3JCb3VuZGFyeUVycm9yLm5hbWUgPSBcIlJlYWN0IEVycm9yQm91bmRhcnkgXCIgKyBlcnJvckJvdW5kYXJ5RXJyb3IubmFtZTtcbiAgZXJyb3JCb3VuZGFyeUVycm9yLnN0YWNrID0gY29tcG9uZW50U3RhY2s7XG4gIHZhciBlcnJvckJvdW5kYXJ5RXZlbnQgPSB7fTtcbiAgdm9pZCBldmVudEZyb21FeGNlcHRpb24oe30sIGVycm9yQm91bmRhcnlFcnJvcikudGhlbihmdW5jdGlvbiAoZSkge1xuICAgIGVycm9yQm91bmRhcnlFdmVudCA9IGU7XG4gIH0pO1xuXG4gIGlmIChlcnJvckJvdW5kYXJ5RXZlbnQuZXhjZXB0aW9uICYmIEFycmF5LmlzQXJyYXkoZXJyb3JCb3VuZGFyeUV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMpICYmIHJlYWN0VmVyc2lvbi5tYWpvciAmJiByZWFjdFZlcnNpb24ubWFqb3IgPj0gMTcpIHtcbiAgICB2YXIgb3JpZ2luYWxFdmVudF8xID0ge307XG4gICAgdm9pZCBldmVudEZyb21FeGNlcHRpb24oe30sIGVycm9yKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICBvcmlnaW5hbEV2ZW50XzEgPSBlO1xuICAgIH0pO1xuXG4gICAgaWYgKG9yaWdpbmFsRXZlbnRfMS5leGNlcHRpb24gJiYgQXJyYXkuaXNBcnJheShvcmlnaW5hbEV2ZW50XzEuZXhjZXB0aW9uLnZhbHVlcykpIHtcbiAgICAgIG9yaWdpbmFsRXZlbnRfMS5leGNlcHRpb24udmFsdWVzID0gX19zcHJlYWQoZXJyb3JCb3VuZGFyeUV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMsIG9yaWdpbmFsRXZlbnRfMS5leGNlcHRpb24udmFsdWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FwdHVyZUV2ZW50KG9yaWdpbmFsRXZlbnRfMSk7XG4gIH1cblxuICByZXR1cm4gY2FwdHVyZUV4Y2VwdGlvbihlcnJvciwge1xuICAgIGNvbnRleHRzOiB7XG4gICAgICByZWFjdDoge1xuICAgICAgICBjb21wb25lbnRTdGFjazogY29tcG9uZW50U3RhY2tcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBBIEVycm9yQm91bmRhcnkgY29tcG9uZW50IHRoYXQgbG9ncyBlcnJvcnMgdG8gU2VudHJ5LiBSZXF1aXJlcyBSZWFjdCA+PSAxNi5cbiAqIE5PVEU6IElmIHlvdSBhcmUgYSBTZW50cnkgdXNlciwgYW5kIHlvdSBhcmUgc2VlaW5nIHRoaXMgc3RhY2sgZnJhbWUsIGl0IG1lYW5zIHRoZVxuICogU2VudHJ5IFJlYWN0IFNESyBFcnJvckJvdW5kYXJ5IGNhdWdodCBhbiBlcnJvciBpbnZva2luZyB5b3VyIGFwcGxpY2F0aW9uIGNvZGUuIFRoaXNcbiAqIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHRoZSBTZW50cnkgUmVhY3QgU0RLLlxuICovXG5cblxudmFyIEVycm9yQm91bmRhcnkgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoRXJyb3JCb3VuZGFyeSwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBFcnJvckJvdW5kYXJ5KCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuc3RhdGUgPSBJTklUSUFMX1NUQVRFO1xuXG4gICAgX3RoaXMucmVzZXRFcnJvckJvdW5kYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uUmVzZXQgPSBfdGhpcy5wcm9wcy5vblJlc2V0O1xuICAgICAgdmFyIF9hID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgZXJyb3IgPSBfYS5lcnJvcixcbiAgICAgICAgICBjb21wb25lbnRTdGFjayA9IF9hLmNvbXBvbmVudFN0YWNrLFxuICAgICAgICAgIGV2ZW50SWQgPSBfYS5ldmVudElkO1xuXG4gICAgICBpZiAob25SZXNldCkge1xuICAgICAgICBvblJlc2V0KGVycm9yLCBjb21wb25lbnRTdGFjaywgZXZlbnRJZCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKElOSVRJQUxfU1RBVEUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5jb21wb25lbnREaWRDYXRjaCA9IGZ1bmN0aW9uIChlcnJvciwgX2EpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNvbXBvbmVudFN0YWNrID0gX2EuY29tcG9uZW50U3RhY2s7XG4gICAgdmFyIF9iID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYmVmb3JlQ2FwdHVyZSA9IF9iLmJlZm9yZUNhcHR1cmUsXG4gICAgICAgIG9uRXJyb3IgPSBfYi5vbkVycm9yLFxuICAgICAgICBzaG93RGlhbG9nID0gX2Iuc2hvd0RpYWxvZyxcbiAgICAgICAgZGlhbG9nT3B0aW9ucyA9IF9iLmRpYWxvZ09wdGlvbnM7XG4gICAgd2l0aFNjb3BlKGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgaWYgKGJlZm9yZUNhcHR1cmUpIHtcbiAgICAgICAgYmVmb3JlQ2FwdHVyZShzY29wZSwgZXJyb3IsIGNvbXBvbmVudFN0YWNrKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2ZW50SWQgPSBjYXB0dXJlUmVhY3RFcnJvckJvdW5kYXJ5RXJyb3IoZXJyb3IsIGNvbXBvbmVudFN0YWNrKTtcblxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvciwgY29tcG9uZW50U3RhY2ssIGV2ZW50SWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvd0RpYWxvZykge1xuICAgICAgICBzaG93UmVwb3J0RGlhbG9nKF9fYXNzaWduKF9fYXNzaWduKHt9LCBkaWFsb2dPcHRpb25zKSwge1xuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50SWRcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBjb21wb25lbnREaWRDYXRjaCBpcyB1c2VkIG92ZXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yXG4gICAgICAvLyBzbyB0aGF0IGNvbXBvbmVudFN0YWNrIGlzIGFjY2Vzc2libGUgdGhyb3VnaCBzdGF0ZS5cblxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBldmVudElkOiBldmVudElkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25Nb3VudCA9IHRoaXMucHJvcHMub25Nb3VudDtcblxuICAgIGlmIChvbk1vdW50KSB7XG4gICAgICBvbk1vdW50KCk7XG4gICAgfVxuICB9O1xuXG4gIEVycm9yQm91bmRhcnkucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGVycm9yID0gX2EuZXJyb3IsXG4gICAgICAgIGNvbXBvbmVudFN0YWNrID0gX2EuY29tcG9uZW50U3RhY2ssXG4gICAgICAgIGV2ZW50SWQgPSBfYS5ldmVudElkO1xuICAgIHZhciBvblVubW91bnQgPSB0aGlzLnByb3BzLm9uVW5tb3VudDtcblxuICAgIGlmIChvblVubW91bnQpIHtcbiAgICAgIG9uVW5tb3VudChlcnJvciwgY29tcG9uZW50U3RhY2ssIGV2ZW50SWQpO1xuICAgIH1cbiAgfTtcblxuICBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZmFsbGJhY2sgPSBfYS5mYWxsYmFjayxcbiAgICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLFxuICAgICAgICBlcnJvciA9IF9iLmVycm9yLFxuICAgICAgICBjb21wb25lbnRTdGFjayA9IF9iLmNvbXBvbmVudFN0YWNrLFxuICAgICAgICBldmVudElkID0gX2IuZXZlbnRJZDtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgdmFyIGVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZWxlbWVudCA9IGZhbGxiYWNrKHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvckJvdW5kYXJ5LFxuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50SWRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZmFsbGJhY2s7XG4gICAgICB9XG5cbiAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdmYWxsYmFjayBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCBSZWFjdEVsZW1lbnQnKTtcbiAgICAgIH0gLy8gRmFpbCBncmFjZWZ1bGx5IGlmIG5vIGZhbGxiYWNrIHByb3ZpZGVkIG9yIGlzIG5vdCB2YWxpZFxuXG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlbigpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfTtcblxuICByZXR1cm4gRXJyb3JCb3VuZGFyeTtcbn0oUmVhY3QuQ29tcG9uZW50KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuXG5mdW5jdGlvbiB3aXRoRXJyb3JCb3VuZGFyeShXcmFwcGVkQ29tcG9uZW50LCBlcnJvckJvdW5kYXJ5T3B0aW9ucykge1xuICB2YXIgY29tcG9uZW50RGlzcGxheU5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCBVTktOT1dOX0NPTVBPTkVOVDtcblxuICB2YXIgV3JhcHBlZCA9IGZ1bmN0aW9uIFdyYXBwZWQocHJvcHMpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChFcnJvckJvdW5kYXJ5LCBfX2Fzc2lnbih7fSwgZXJyb3JCb3VuZGFyeU9wdGlvbnMpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9fYXNzaWduKHt9LCBwcm9wcykpKTtcbiAgfTtcblxuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gXCJlcnJvckJvdW5kYXJ5KFwiICsgY29tcG9uZW50RGlzcGxheU5hbWUgKyBcIilcIjsgLy8gQ29weSBvdmVyIHN0YXRpYyBtZXRob2RzIGZyb20gV3JhcHBlZCBjb21wb25lbnQgdG8gUHJvZmlsZXIgSE9DXG4gIC8vIFNlZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2hpZ2hlci1vcmRlci1jb21wb25lbnRzLmh0bWwjc3RhdGljLW1ldGhvZHMtbXVzdC1iZS1jb3BpZWQtb3ZlclxuXG4gIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKFdyYXBwZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICByZXR1cm4gV3JhcHBlZDtcbn1cblxuZXhwb3J0IHsgRXJyb3JCb3VuZGFyeSwgd2l0aEVycm9yQm91bmRhcnkgfTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBjb25maWd1cmVTY29wZSB9IGZyb20gJ0BzZW50cnkvbWluaW1hbCc7XG52YXIgQUNUSU9OX0JSRUFEQ1JVTUJfQ0FURUdPUlkgPSAncmVkdXguYWN0aW9uJztcbnZhciBBQ1RJT05fQlJFQURDUlVNQl9UWVBFID0gJ2luZm8nO1xudmFyIFNUQVRFX0NPTlRFWFRfS0VZID0gJ3JlZHV4LnN0YXRlJztcbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgYWN0aW9uVHJhbnNmb3JtZXI6IGZ1bmN0aW9uIGFjdGlvblRyYW5zZm9ybWVyKGFjdGlvbikge1xuICAgIHJldHVybiBhY3Rpb247XG4gIH0sXG4gIHN0YXRlVHJhbnNmb3JtZXI6IGZ1bmN0aW9uIHN0YXRlVHJhbnNmb3JtZXIoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUgfHwgbnVsbDtcbiAgfVxufTtcbi8qKlxuICogQ3JlYXRlcyBhbiBlbmhhbmNlciB0aGF0IHdvdWxkIGJlIHBhc3NlZCB0byBSZWR1eCdzIGNyZWF0ZVN0b3JlIHRvIGxvZyBhY3Rpb25zIGFuZCB0aGUgbGF0ZXN0IHN0YXRlIHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZW5oYW5jZXJPcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgZW5oYW5jZXJcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSZWR1eEVuaGFuY2VyKGVuaGFuY2VyT3B0aW9ucykge1xuICAvLyBOb3RlOiBXZSByZXR1cm4gYW4gYW55IHR5cGUgYXMgdG8gbm90IGhhdmUgdHlwZSBjb25mbGljdHMuXG4gIHZhciBvcHRpb25zID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zKSwgZW5oYW5jZXJPcHRpb25zKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKG5leHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSkge1xuICAgICAgdmFyIHNlbnRyeVJlZHVjZXIgPSBmdW5jdGlvbiBzZW50cnlSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgY29uZmlndXJlU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgICAgLyogQWN0aW9uIGJyZWFkY3J1bWJzICovXG4gICAgICAgICAgdmFyIHRyYW5zZm9ybWVkQWN0aW9uID0gb3B0aW9ucy5hY3Rpb25UcmFuc2Zvcm1lcihhY3Rpb24pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm1lZEFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHJhbnNmb3JtZWRBY3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNjb3BlLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogQUNUSU9OX0JSRUFEQ1JVTUJfQ0FURUdPUlksXG4gICAgICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkQWN0aW9uLFxuICAgICAgICAgICAgICB0eXBlOiBBQ1RJT05fQlJFQURDUlVNQl9UWVBFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogU2V0IGxhdGVzdCBzdGF0ZSB0byBzY29wZSAqL1xuXG5cbiAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRTdGF0ZSA9IG9wdGlvbnMuc3RhdGVUcmFuc2Zvcm1lcihuZXdTdGF0ZSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkU3RhdGUgIT09ICd1bmRlZmluZWQnICYmIHRyYW5zZm9ybWVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNjb3BlLnNldENvbnRleHQoU1RBVEVfQ09OVEVYVF9LRVksIHRyYW5zZm9ybWVkU3RhdGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY29wZS5zZXRDb250ZXh0KFNUQVRFX0NPTlRFWFRfS0VZLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQWxsb3cgdXNlciB0byBjb25maWd1cmUgc2NvcGUgd2l0aCBsYXRlc3Qgc3RhdGUgKi9cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG5cblxuICAgICAgICAgIHZhciBjb25maWd1cmVTY29wZVdpdGhTdGF0ZSA9IG9wdGlvbnMuY29uZmlndXJlU2NvcGVXaXRoU3RhdGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ3VyZVNjb3BlV2l0aFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25maWd1cmVTY29wZVdpdGhTdGF0ZShzY29wZSwgbmV3U3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBuZXh0KHNlbnRyeVJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlUmVkdXhFbmhhbmNlciB9OyIsImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqXG4gKiBDcmVhdGVzIHJvdXRpbmcgaW5zdHJ1bWVudGF0aW9uIGZvciBSZWFjdCBSb3V0ZXIgdjNcbiAqIFdvcmtzIGZvciBSZWFjdCBSb3V0ZXIgPj0gMy4yLjAgYW5kIDwgNC4wLjBcbiAqXG4gKiBAcGFyYW0gaGlzdG9yeSBvYmplY3QgZnJvbSB0aGUgYGhpc3RvcnlgIGxpYnJhcnlcbiAqIEBwYXJhbSByb3V0ZXMgYSBsaXN0IG9mIGFsbCByb3V0ZXMsIHNob3VsZCBiZVxuICogQHBhcmFtIG1hdGNoIGBSb3V0ZXIubWF0Y2hgIHV0aWxpdHlcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhY3RSb3V0ZXJWM0luc3RydW1lbnRhdGlvbihoaXN0b3J5LCByb3V0ZXMsIG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RhcnRUcmFuc2FjdGlvbiwgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQsIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlKSB7XG4gICAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UgPT09IHZvaWQgMCkge1xuICAgICAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBhY3RpdmVUcmFuc2FjdGlvbjtcbiAgICB2YXIgcHJldk5hbWU7IC8vIEhhdmUgdG8gdXNlIGdsb2JhbC5sb2NhdGlvbiBiZWNhdXNlIGhpc3RvcnkubG9jYXRpb24gbWlnaHQgbm90IGJlIGRlZmluZWQuXG5cbiAgICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQgJiYgZ2xvYmFsICYmIGdsb2JhbC5sb2NhdGlvbikge1xuICAgICAgbm9ybWFsaXplVHJhbnNhY3Rpb25OYW1lKHJvdXRlcywgZ2xvYmFsLmxvY2F0aW9uLCBtYXRjaCwgZnVuY3Rpb24gKGxvY2FsTmFtZSkge1xuICAgICAgICBwcmV2TmFtZSA9IGxvY2FsTmFtZTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24gPSBzdGFydFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICBuYW1lOiBwcmV2TmFtZSxcbiAgICAgICAgICBvcDogJ3BhZ2Vsb2FkJyxcbiAgICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgICAncm91dGluZy5pbnN0cnVtZW50YXRpb24nOiAncmVhY3Qtcm91dGVyLXYzJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UgJiYgaGlzdG9yeS5saXN0ZW4pIHtcbiAgICAgIGhpc3RvcnkubGlzdGVuKGZ1bmN0aW9uIChsb2NhdGlvbikge1xuICAgICAgICBpZiAobG9jYXRpb24uYWN0aW9uID09PSAnUFVTSCcgfHwgbG9jYXRpb24uYWN0aW9uID09PSAnUE9QJykge1xuICAgICAgICAgIGlmIChhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHRhZ3NfMSA9IHtcbiAgICAgICAgICAgICdyb3V0aW5nLmluc3RydW1lbnRhdGlvbic6ICdyZWFjdC1yb3V0ZXItdjMnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChwcmV2TmFtZSkge1xuICAgICAgICAgICAgdGFnc18xLmZyb20gPSBwcmV2TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub3JtYWxpemVUcmFuc2FjdGlvbk5hbWUocm91dGVzLCBsb2NhdGlvbiwgbWF0Y2gsIGZ1bmN0aW9uIChsb2NhbE5hbWUpIHtcbiAgICAgICAgICAgIHByZXZOYW1lID0gbG9jYWxOYW1lO1xuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24gPSBzdGFydFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgbmFtZTogcHJldk5hbWUsXG4gICAgICAgICAgICAgIG9wOiAnbmF2aWdhdGlvbicsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3NfMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbi8qKlxuICogTm9ybWFsaXplIHRyYW5zYWN0aW9uIG5hbWVzIHVzaW5nIGBSb3V0ZXIubWF0Y2hgXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplVHJhbnNhY3Rpb25OYW1lKGFwcFJvdXRlcywgbG9jYXRpb24sIG1hdGNoLCBjYWxsYmFjaykge1xuICB2YXIgbmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICBtYXRjaCh7XG4gICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgIHJvdXRlczogYXBwUm91dGVzXG4gIH0sIGZ1bmN0aW9uIChlcnJvciwgX3JlZGlyZWN0TG9jYXRpb24sIHJlbmRlclByb3BzKSB7XG4gICAgaWYgKGVycm9yIHx8ICFyZW5kZXJQcm9wcykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5hbWUpO1xuICAgIH1cblxuICAgIHZhciByb3V0ZVBhdGggPSBnZXRSb3V0ZVN0cmluZ0Zyb21Sb3V0ZXMocmVuZGVyUHJvcHMucm91dGVzIHx8IFtdKTtcblxuICAgIGlmIChyb3V0ZVBhdGgubGVuZ3RoID09PSAwIHx8IHJvdXRlUGF0aCA9PT0gJy8qJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5hbWUpO1xuICAgIH1cblxuICAgIG5hbWUgPSByb3V0ZVBhdGg7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG5hbWUpO1xuICB9KTtcbn1cbi8qKlxuICogR2VuZXJhdGUgcm91dGUgbmFtZSBmcm9tIGFycmF5IG9mIHJvdXRlc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0Um91dGVTdHJpbmdGcm9tUm91dGVzKHJvdXRlcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocm91dGVzKSB8fCByb3V0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdmFyIHJvdXRlc1dpdGhQYXRocyA9IHJvdXRlcy5maWx0ZXIoZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgcmV0dXJuICEhcm91dGUucGF0aDtcbiAgfSk7XG4gIHZhciBpbmRleCA9IC0xO1xuXG4gIGZvciAodmFyIHggPSByb3V0ZXNXaXRoUGF0aHMubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHtcbiAgICB2YXIgcm91dGUgPSByb3V0ZXNXaXRoUGF0aHNbeF07XG5cbiAgICBpZiAocm91dGUucGF0aCAmJiByb3V0ZS5wYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgaW5kZXggPSB4O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvdXRlc1dpdGhQYXRocy5zbGljZShpbmRleCkuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBwYXRoID0gX2EucGF0aDtcbiAgICByZXR1cm4gISFwYXRoO1xuICB9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHBhdGggPSBfYS5wYXRoO1xuICAgIHJldHVybiBwYXRoO1xuICB9KS5qb2luKCcnKTtcbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbnZhciBhY3RpdmVUcmFuc2FjdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiByZWFjdFJvdXRlclY0SW5zdHJ1bWVudGF0aW9uKGhpc3RvcnksIHJvdXRlcywgbWF0Y2hQYXRoKSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdFJvdXRlckluc3RydW1lbnRhdGlvbihoaXN0b3J5LCAncmVhY3Qtcm91dGVyLXY0Jywgcm91dGVzLCBtYXRjaFBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWN0Um91dGVyVjVJbnN0cnVtZW50YXRpb24oaGlzdG9yeSwgcm91dGVzLCBtYXRjaFBhdGgpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0Um91dGVySW5zdHJ1bWVudGF0aW9uKGhpc3RvcnksICdyZWFjdC1yb3V0ZXItdjUnLCByb3V0ZXMsIG1hdGNoUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWN0Um91dGVySW5zdHJ1bWVudGF0aW9uKGhpc3RvcnksIG5hbWUsIGFsbFJvdXRlcywgbWF0Y2hQYXRoKSB7XG4gIGlmIChhbGxSb3V0ZXMgPT09IHZvaWQgMCkge1xuICAgIGFsbFJvdXRlcyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5pdFBhdGhOYW1lKCkge1xuICAgIGlmIChoaXN0b3J5ICYmIGhpc3RvcnkubG9jYXRpb24pIHtcbiAgICAgIHJldHVybiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cblxuICAgIGlmIChnbG9iYWwgJiYgZ2xvYmFsLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbk5hbWUocGF0aG5hbWUpIHtcbiAgICBpZiAoYWxsUm91dGVzLmxlbmd0aCA9PT0gMCB8fCAhbWF0Y2hQYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aG5hbWU7XG4gICAgfVxuXG4gICAgdmFyIGJyYW5jaGVzID0gbWF0Y2hSb3V0ZXMoYWxsUm91dGVzLCBwYXRobmFtZSwgbWF0Y2hQYXRoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGJyYW5jaGVzLmxlbmd0aDsgeCsrKSB7XG4gICAgICBpZiAoYnJhbmNoZXNbeF0ubWF0Y2guaXNFeGFjdCkge1xuICAgICAgICByZXR1cm4gYnJhbmNoZXNbeF0ubWF0Y2gucGF0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aG5hbWU7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24sIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkLCBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSkge1xuICAgIGlmIChzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaW5pdFBhdGhOYW1lID0gZ2V0SW5pdFBhdGhOYW1lKCk7XG5cbiAgICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQgJiYgaW5pdFBhdGhOYW1lKSB7XG4gICAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oe1xuICAgICAgICBuYW1lOiBnZXRUcmFuc2FjdGlvbk5hbWUoaW5pdFBhdGhOYW1lKSxcbiAgICAgICAgb3A6ICdwYWdlbG9hZCcsXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICAncm91dGluZy5pbnN0cnVtZW50YXRpb24nOiBuYW1lXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSAmJiBoaXN0b3J5Lmxpc3Rlbikge1xuICAgICAgaGlzdG9yeS5saXN0ZW4oZnVuY3Rpb24gKGxvY2F0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKGFjdGlvbiAmJiAoYWN0aW9uID09PSAnUFVTSCcgfHwgYWN0aW9uID09PSAnUE9QJykpIHtcbiAgICAgICAgICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLmZpbmlzaCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB0YWdzID0ge1xuICAgICAgICAgICAgJ3JvdXRpbmcuaW5zdHJ1bWVudGF0aW9uJzogbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24gPSBjdXN0b21TdGFydFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIG5hbWU6IGdldFRyYW5zYWN0aW9uTmFtZShsb2NhdGlvbi5wYXRobmFtZSksXG4gICAgICAgICAgICBvcDogJ25hdmlnYXRpb24nLFxuICAgICAgICAgICAgdGFnczogdGFnc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4vKipcbiAqIE1hdGNoZXMgYSBzZXQgb2Ygcm91dGVzIHRvIGEgcGF0aG5hbWVcbiAqIEJhc2VkIG9uIGltcGxlbWVudGF0aW9uIGZyb21cbiAqL1xuXG5cbmZ1bmN0aW9uIG1hdGNoUm91dGVzKHJvdXRlcywgcGF0aG5hbWUsIG1hdGNoUGF0aCwgYnJhbmNoKSB7XG4gIGlmIChicmFuY2ggPT09IHZvaWQgMCkge1xuICAgIGJyYW5jaCA9IFtdO1xuICB9XG5cbiAgcm91dGVzLnNvbWUoZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgdmFyIG1hdGNoID0gcm91dGUucGF0aCA/IG1hdGNoUGF0aChwYXRobmFtZSwgcm91dGUpIDogYnJhbmNoLmxlbmd0aCA/IGJyYW5jaFticmFuY2gubGVuZ3RoIC0gMV0ubWF0Y2ggLy8gdXNlIHBhcmVudCBtYXRjaFxuICAgIDogY29tcHV0ZVJvb3RNYXRjaChwYXRobmFtZSk7IC8vIHVzZSBkZWZhdWx0IFwicm9vdFwiIG1hdGNoXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGJyYW5jaC5wdXNoKHtcbiAgICAgICAgcm91dGU6IHJvdXRlLFxuICAgICAgICBtYXRjaDogbWF0Y2hcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocm91dGUucm91dGVzKSB7XG4gICAgICAgIG1hdGNoUm91dGVzKHJvdXRlLnJvdXRlcywgcGF0aG5hbWUsIG1hdGNoUGF0aCwgYnJhbmNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gISFtYXRjaDtcbiAgfSk7XG4gIHJldHVybiBicmFuY2g7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSb290TWF0Y2gocGF0aG5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiAnLycsXG4gICAgdXJsOiAnLycsXG4gICAgcGFyYW1zOiB7fSxcbiAgICBpc0V4YWN0OiBwYXRobmFtZSA9PT0gJy8nXG4gIH07XG59XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTZW50cnlSb3V0aW5nKFJvdXRlKSB7XG4gIHZhciBjb21wb25lbnREaXNwbGF5TmFtZSA9IFJvdXRlLmRpc3BsYXlOYW1lIHx8IFJvdXRlLm5hbWU7XG5cbiAgdmFyIFdyYXBwZWRSb3V0ZSA9IGZ1bmN0aW9uIFdyYXBwZWRSb3V0ZShwcm9wcykge1xuICAgIGlmIChhY3RpdmVUcmFuc2FjdGlvbiAmJiBwcm9wcyAmJiBwcm9wcy5jb21wdXRlZE1hdGNoICYmIHByb3BzLmNvbXB1dGVkTWF0Y2guaXNFeGFjdCkge1xuICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uc2V0TmFtZShwcm9wcy5jb21wdXRlZE1hdGNoLnBhdGgpO1xuICAgIH0gLy8gQHRzLWlnbm9yZSBTZXR0aW5nIG1vcmUgc3BlY2lmaWMgUmVhY3QgQ29tcG9uZW50IHR5cGluZyBmb3IgYFJgIGdlbmVyaWMgYWJvdmVcbiAgICAvLyB3aWxsIGJyZWFrIGFkdmFuY2VkIHR5cGUgaW5mZXJlbmNlIGRvbmUgYnkgcmVhY3Qgcm91dGVyIHBhcmFtczpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9ibG9iLzEzZGM0MjM1YzA2OWUyNWZlN2VlMTZlMTFmNTI5ZDkwOWY5ZjNmZjgvdHlwZXMvcmVhY3Qtcm91dGVyL2luZGV4LmQudHMjTDE1NC1MMTY0XG5cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlLCBfX2Fzc2lnbih7fSwgcHJvcHMpKTtcbiAgfTtcblxuICBXcmFwcGVkUm91dGUuZGlzcGxheU5hbWUgPSBcInNlbnRyeVJvdXRlKFwiICsgY29tcG9uZW50RGlzcGxheU5hbWUgKyBcIilcIjtcbiAgaG9pc3ROb25SZWFjdFN0YXRpY3MoV3JhcHBlZFJvdXRlLCBSb3V0ZSk7IC8vIEB0cy1pZ25vcmUgU2V0dGluZyBtb3JlIHNwZWNpZmljIFJlYWN0IENvbXBvbmVudCB0eXBpbmcgZm9yIGBSYCBnZW5lcmljIGFib3ZlXG4gIC8vIHdpbGwgYnJlYWsgYWR2YW5jZWQgdHlwZSBpbmZlcmVuY2UgZG9uZSBieSByZWFjdCByb3V0ZXIgcGFyYW1zOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9ibG9iLzEzZGM0MjM1YzA2OWUyNWZlN2VlMTZlMTFmNTI5ZDkwOWY5ZjNmZjgvdHlwZXMvcmVhY3Qtcm91dGVyL2luZGV4LmQudHMjTDE1NC1MMTY0XG5cbiAgcmV0dXJuIFdyYXBwZWRSb3V0ZTtcbn1cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsImV4cG9ydCAqIGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG5leHBvcnQgeyBpbml0IH0gZnJvbSAnLi9zZGsnO1xuZXhwb3J0IHsgUHJvZmlsZXIsIHdpdGhQcm9maWxlciwgdXNlUHJvZmlsZXIgfSBmcm9tICcuL3Byb2ZpbGVyJztcbmV4cG9ydCB7IEVycm9yQm91bmRhcnksIHdpdGhFcnJvckJvdW5kYXJ5IH0gZnJvbSAnLi9lcnJvcmJvdW5kYXJ5JztcbmV4cG9ydCB7IGNyZWF0ZVJlZHV4RW5oYW5jZXIgfSBmcm9tICcuL3JlZHV4JztcbmV4cG9ydCB7IHJlYWN0Um91dGVyVjNJbnN0cnVtZW50YXRpb24gfSBmcm9tICcuL3JlYWN0cm91dGVydjMnO1xuZXhwb3J0IHsgcmVhY3RSb3V0ZXJWNEluc3RydW1lbnRhdGlvbiwgcmVhY3RSb3V0ZXJWNUluc3RydW1lbnRhdGlvbiwgd2l0aFNlbnRyeVJvdXRpbmcgfSBmcm9tICcuL3JlYWN0cm91dGVyJzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7066\n")},6275:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "ro": function() { return /* binding */ addExtensionMethods; },\n "lb": function() { return /* binding */ startIdleTransaction; }\n});\n\n// UNUSED EXPORTS: _addTracingExtensions\n\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(7870);\n// EXTERNAL MODULE: ./node_modules/@sentry/hub/esm/hub.js + 1 modules\nvar hub = __webpack_require__(3210);\n;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/transaction.js\nvar TransactionSamplingMethod;\n\n(function (TransactionSamplingMethod) {\n TransactionSamplingMethod["Explicit"] = "explicitly_set";\n TransactionSamplingMethod["Sampler"] = "client_sampler";\n TransactionSamplingMethod["Rate"] = "client_rate";\n TransactionSamplingMethod["Inheritance"] = "inheritance";\n})(TransactionSamplingMethod || (TransactionSamplingMethod = {}));\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js\nvar logger = __webpack_require__(245);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/node.js\nvar node = __webpack_require__(7864);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/instrument.js\nvar instrument = __webpack_require__(6710);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/spanstatus.js\nvar spanstatus = __webpack_require__(6314);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/utils.js\nvar utils = __webpack_require__(2662);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/errors.js\n\n\n\n/**\n * Configures global error listeners\n */\n\nfunction registerErrorInstrumentation() {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: errorCallback,\n type: \'error\'\n });\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: errorCallback,\n type: \'unhandledrejection\'\n });\n}\n/**\n * If an error or unhandled promise occurs, we mark the active transaction as failed\n */\n\nfunction errorCallback() {\n var activeTransaction = (0,utils/* getActiveTransaction */.x1)();\n\n if (activeTransaction) {\n logger/* logger.log */.k.log("[Tracing] Transaction: " + spanstatus/* SpanStatus.InternalError */.p.InternalError + " -> Global error occured");\n activeTransaction.setStatus(spanstatus/* SpanStatus.InternalError */.p.InternalError);\n }\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/idletransaction.js\nvar idletransaction = __webpack_require__(1441);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/transaction.js\nvar esm_transaction = __webpack_require__(5955);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/hubextensions.js\n/* module decorator */ module = __webpack_require__.hmd(module);\n\n\n\n\n\n\n\n\n/** Returns all trace headers that are currently on the top scope. */\n\nfunction traceHeaders() {\n var scope = this.getScope();\n\n if (scope) {\n var span = scope.getSpan();\n\n if (span) {\n return {\n \'sentry-trace\': span.toTraceparent()\n };\n }\n }\n\n return {};\n}\n/**\n * Makes a sampling decision for the given transaction and stores it on the transaction.\n *\n * Called every time a transaction is created. Only transactions which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n *\n * @param hub: The hub off of which to read config options\n * @param transaction: The transaction needing a sampling decision\n * @param samplingContext: Default and user-provided data which may be used to help make the decision\n *\n * @returns The given transaction with its `sampled` value set\n */\n\n\nfunction sample(transaction, options, samplingContext) {\n // nothing to do if tracing is not enabled\n if (!(0,utils/* hasTracingEnabled */.zu)()) {\n transaction.sampled = false;\n return transaction;\n } // if the user has forced a sampling decision by passing a `sampled` value in their transaction context, go with that\n\n\n if (transaction.sampled !== undefined) {\n transaction.setMetadata({\n transactionSampling: {\n method: TransactionSamplingMethod.Explicit\n }\n });\n return transaction;\n } // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should\n // work; prefer the hook if so\n\n\n var sampleRate;\n\n if (typeof options.tracesSampler === \'function\') {\n sampleRate = options.tracesSampler(samplingContext);\n transaction.setMetadata({\n transactionSampling: {\n method: TransactionSamplingMethod.Sampler,\n // cast to number in case it\'s a boolean\n rate: Number(sampleRate)\n }\n });\n } else if (samplingContext.parentSampled !== undefined) {\n sampleRate = samplingContext.parentSampled;\n transaction.setMetadata({\n transactionSampling: {\n method: TransactionSamplingMethod.Inheritance\n }\n });\n } else {\n sampleRate = options.tracesSampleRate;\n transaction.setMetadata({\n transactionSampling: {\n method: TransactionSamplingMethod.Rate,\n // cast to number in case it\'s a boolean\n rate: Number(sampleRate)\n }\n });\n } // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n // only valid values are booleans or numbers between 0 and 1.)\n\n\n if (!isValidSampleRate(sampleRate)) {\n logger/* logger.warn */.k.warn("[Tracing] Discarding transaction because of invalid sample rate.");\n transaction.sampled = false;\n return transaction;\n } // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it\'s a sign the transaction should be dropped\n\n\n if (!sampleRate) {\n logger/* logger.log */.k.log("[Tracing] Discarding transaction because " + (typeof options.tracesSampler === \'function\' ? \'tracesSampler returned 0 or false\' : \'a negative sampling decision was inherited or tracesSampleRate is set to 0\'));\n transaction.sampled = false;\n return transaction;\n } // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n // a boolean, the < comparison will cause it to be automatically cast to 1 if it\'s true and 0 if it\'s false.\n\n\n transaction.sampled = Math.random() < sampleRate; // if we\'re not going to keep it, we\'re done\n\n if (!transaction.sampled) {\n logger/* logger.log */.k.log("[Tracing] Discarding transaction because it\'s not included in the random sample (sampling rate = " + Number(sampleRate) + ")");\n return transaction;\n }\n\n logger/* logger.log */.k.log("[Tracing] starting " + transaction.op + " transaction - " + transaction.name);\n return transaction;\n}\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\n\n\nfunction isValidSampleRate(rate) {\n // we need to check NaN explicitly because it\'s of type \'number\' and therefore wouldn\'t get caught by this typecheck\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (isNaN(rate) || !(typeof rate === \'number\' || typeof rate === \'boolean\')) {\n logger/* logger.warn */.k.warn("[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got " + JSON.stringify(rate) + " of type " + JSON.stringify(typeof rate) + ".");\n return false;\n } // in case sampleRate is a boolean, it will get automatically cast to 1 if it\'s true and 0 if it\'s false\n\n\n if (rate < 0 || rate > 1) {\n logger/* logger.warn */.k.warn("[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got " + rate + ".");\n return false;\n }\n\n return true;\n}\n/**\n * Creates a new transaction and adds a sampling decision if it doesn\'t yet have one.\n *\n * The Hub.startTransaction method delegates to this method to do its work, passing the Hub instance in as `this`, as if\n * it had been called on the hub directly. Exists as a separate function so that it can be injected into the class as an\n * "extension method."\n *\n * @param this: The Hub starting the transaction\n * @param transactionContext: Data used to configure the transaction\n * @param CustomSamplingContext: Optional data to be provided to the `tracesSampler` function (if any)\n *\n * @returns The new transaction\n *\n * @see {@link Hub.startTransaction}\n */\n\n\nfunction _startTransaction(transactionContext, customSamplingContext) {\n var _a, _b;\n\n var options = ((_a = this.getClient()) === null || _a === void 0 ? void 0 : _a.getOptions()) || {};\n var transaction = new esm_transaction/* Transaction */.Y(transactionContext, this);\n transaction = sample(transaction, options, (0,tslib_es6/* __assign */.pi)({\n parentSampled: transactionContext.parentSampled,\n transactionContext: transactionContext\n }, customSamplingContext));\n\n if (transaction.sampled) {\n transaction.initSpanRecorder((_b = options._experiments) === null || _b === void 0 ? void 0 : _b.maxSpans);\n }\n\n return transaction;\n}\n/**\n * Create new idle transaction.\n */\n\n\nfunction startIdleTransaction(hub, transactionContext, idleTimeout, onScope, customSamplingContext) {\n var _a, _b;\n\n var options = ((_a = hub.getClient()) === null || _a === void 0 ? void 0 : _a.getOptions()) || {};\n var transaction = new idletransaction/* IdleTransaction */.io(transactionContext, hub, idleTimeout, onScope);\n transaction = sample(transaction, options, (0,tslib_es6/* __assign */.pi)({\n parentSampled: transactionContext.parentSampled,\n transactionContext: transactionContext\n }, customSamplingContext));\n\n if (transaction.sampled) {\n transaction.initSpanRecorder((_b = options._experiments) === null || _b === void 0 ? void 0 : _b.maxSpans);\n }\n\n return transaction;\n}\n/**\n * @private\n */\n\nfunction _addTracingExtensions() {\n var carrier = (0,hub/* getMainCarrier */.cu)();\n\n if (!carrier.__SENTRY__) {\n return;\n }\n\n carrier.__SENTRY__.extensions = carrier.__SENTRY__.extensions || {};\n\n if (!carrier.__SENTRY__.extensions.startTransaction) {\n carrier.__SENTRY__.extensions.startTransaction = _startTransaction;\n }\n\n if (!carrier.__SENTRY__.extensions.traceHeaders) {\n carrier.__SENTRY__.extensions.traceHeaders = traceHeaders;\n }\n}\n/**\n * @private\n */\n\nfunction _autoloadDatabaseIntegrations() {\n var carrier = (0,hub/* getMainCarrier */.cu)();\n\n if (!carrier.__SENTRY__) {\n return;\n }\n\n var packageToIntegrationMapping = {\n mongodb: function mongodb() {\n var integration = (0,node/* dynamicRequire */.l$)(module, \'./integrations/mongo\');\n return new integration.Mongo();\n },\n mongoose: function mongoose() {\n var integration = (0,node/* dynamicRequire */.l$)(module, \'./integrations/mongo\');\n return new integration.Mongo({\n mongoose: true\n });\n },\n mysql: function mysql() {\n var integration = (0,node/* dynamicRequire */.l$)(module, \'./integrations/mysql\');\n return new integration.Mysql();\n },\n pg: function pg() {\n var integration = (0,node/* dynamicRequire */.l$)(module, \'./integrations/postgres\');\n return new integration.Postgres();\n }\n };\n var mappedPackages = Object.keys(packageToIntegrationMapping).filter(function (moduleName) {\n return !!(0,node/* loadModule */.$y)(moduleName);\n }).map(function (pkg) {\n try {\n return packageToIntegrationMapping[pkg]();\n } catch (e) {\n return undefined;\n }\n }).filter(function (p) {\n return p;\n });\n\n if (mappedPackages.length > 0) {\n carrier.__SENTRY__.integrations = (0,tslib_es6/* __spread */.fl)(carrier.__SENTRY__.integrations || [], mappedPackages);\n }\n}\n/**\n * This patches the global object and injects the Tracing extensions methods\n */\n\n\nfunction addExtensionMethods() {\n _addTracingExtensions(); // Detect and automatically load specified integrations.\n\n\n if ((0,node/* isNodeEnv */.KV)()) {\n _autoloadDatabaseIntegrations();\n } // If an error happens globally, we should make sure transaction status is set to error.\n\n\n registerErrorInstrumentation();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS90cmFuc2FjdGlvbi5qcz8zNmU2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vZXJyb3JzLmpzPzY3OTgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL2VzbS9odWJleHRlbnNpb25zLmpzPzM0MjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4REFBOEQsRzs7Ozs7Ozs7Ozs7O0FDUEc7QUFDeEI7QUFDSztBQUMvQztBQUNBO0FBQ0E7O0FBRU87QUFDUCxFQUFFLCtDQUF5QjtBQUMzQjtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUUsK0NBQXlCO0FBQzNCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsc0NBQW9COztBQUU5QztBQUNBLElBQUksNEJBQVUsNkJBQTZCLHdEQUF3QjtBQUNuRSxnQ0FBZ0Msd0RBQXdCO0FBQ3hEO0FBQ0EsQzs7Ozs7OztBQzVCbUQ7QUFDTjtBQUNhO0FBQ29CO0FBQ3RCO0FBQ0o7QUFDUjtBQUNBO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU8sbUNBQWlCO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0NBQWtDO0FBQ2xEO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNILFVBQVU7OztBQUdWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlDQUFpQztBQUNqRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxQ0FBcUM7QUFDckQ7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7O0FBR0E7QUFDQSxJQUFJLDhCQUFXO0FBQ2Y7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsSUFBSSw0QkFBVTtBQUNkO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBLG1EQUFtRDs7QUFFbkQ7QUFDQSxJQUFJLDRCQUFVO0FBQ2Q7QUFDQTs7QUFFQSxFQUFFLDRCQUFVO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDhCQUFXO0FBQ2Y7QUFDQSxHQUFHOzs7QUFHSDtBQUNBLElBQUksOEJBQVc7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixrQ0FBVztBQUNuQyw2Q0FBNkMsOEJBQVE7QUFDckQ7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7O0FBRUE7QUFDQSx3QkFBd0IsdUNBQWU7QUFDdkMsNkNBQTZDLDhCQUFRO0FBQ3JEO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsZ0JBQWdCLDhCQUFjOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLDhCQUFjOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QiwrQkFBYztBQUN0QztBQUNBLEtBQUs7QUFDTDtBQUNBLHdCQUF3QiwrQkFBYztBQUN0QztBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLHdCQUF3QiwrQkFBYztBQUN0QztBQUNBLEtBQUs7QUFDTDtBQUNBLHdCQUF3QiwrQkFBYztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMkJBQVU7QUFDdkIsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUg7QUFDQSxzQ0FBc0MsOEJBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR087QUFDUCwwQkFBMEI7OztBQUcxQixNQUFNLDBCQUFTO0FBQ2Y7QUFDQSxHQUFHOzs7QUFHSCxFQUFFLDRCQUE0QjtBQUM5QiIsImZpbGUiOiI2Mjc1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHZhciBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kO1xuXG4oZnVuY3Rpb24gKFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QpIHtcbiAgVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZFtcIkV4cGxpY2l0XCJdID0gXCJleHBsaWNpdGx5X3NldFwiO1xuICBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kW1wiU2FtcGxlclwiXSA9IFwiY2xpZW50X3NhbXBsZXJcIjtcbiAgVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZFtcIlJhdGVcIl0gPSBcImNsaWVudF9yYXRlXCI7XG4gIFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2RbXCJJbmhlcml0YW5jZVwiXSA9IFwiaW5oZXJpdGFuY2VcIjtcbn0pKFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QgfHwgKFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QgPSB7fSkpOyIsImltcG9ydCB7IGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBDb25maWd1cmVzIGdsb2JhbCBlcnJvciBsaXN0ZW5lcnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJFcnJvckluc3RydW1lbnRhdGlvbigpIHtcbiAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgY2FsbGJhY2s6IGVycm9yQ2FsbGJhY2ssXG4gICAgdHlwZTogJ2Vycm9yJ1xuICB9KTtcbiAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgY2FsbGJhY2s6IGVycm9yQ2FsbGJhY2ssXG4gICAgdHlwZTogJ3VuaGFuZGxlZHJlamVjdGlvbidcbiAgfSk7XG59XG4vKipcbiAqIElmIGFuIGVycm9yIG9yIHVuaGFuZGxlZCBwcm9taXNlIG9jY3Vycywgd2UgbWFyayB0aGUgYWN0aXZlIHRyYW5zYWN0aW9uIGFzIGZhaWxlZFxuICovXG5cbmZ1bmN0aW9uIGVycm9yQ2FsbGJhY2soKSB7XG4gIHZhciBhY3RpdmVUcmFuc2FjdGlvbiA9IGdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7XG5cbiAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgbG9nZ2VyLmxvZyhcIltUcmFjaW5nXSBUcmFuc2FjdGlvbjogXCIgKyBTcGFuU3RhdHVzLkludGVybmFsRXJyb3IgKyBcIiAtPiBHbG9iYWwgZXJyb3Igb2NjdXJlZFwiKTtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5JbnRlcm5hbEVycm9yKTtcbiAgfVxufSIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRNYWluQ2FycmllciB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGR5bmFtaWNSZXF1aXJlLCBpc05vZGVFbnYsIGxvYWRNb2R1bGUsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJFcnJvckluc3RydW1lbnRhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IElkbGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vaWRsZXRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBoYXNUcmFjaW5nRW5hYmxlZCB9IGZyb20gJy4vdXRpbHMnO1xuLyoqIFJldHVybnMgYWxsIHRyYWNlIGhlYWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IG9uIHRoZSB0b3Agc2NvcGUuICovXG5cbmZ1bmN0aW9uIHRyYWNlSGVhZGVycygpIHtcbiAgdmFyIHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuXG4gIGlmIChzY29wZSkge1xuICAgIHZhciBzcGFuID0gc2NvcGUuZ2V0U3BhbigpO1xuXG4gICAgaWYgKHNwYW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdzZW50cnktdHJhY2UnOiBzcGFuLnRvVHJhY2VwYXJlbnQoKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG4vKipcbiAqIE1ha2VzIGEgc2FtcGxpbmcgZGVjaXNpb24gZm9yIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBhbmQgc3RvcmVzIGl0IG9uIHRoZSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBDYWxsZWQgZXZlcnkgdGltZSBhIHRyYW5zYWN0aW9uIGlzIGNyZWF0ZWQuIE9ubHkgdHJhbnNhY3Rpb25zIHdoaWNoIGVtZXJnZSB3aXRoIGEgYHNhbXBsZWRgIHZhbHVlIG9mIGB0cnVlYCB3aWxsIGJlXG4gKiBzZW50IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gaHViOiBUaGUgaHViIG9mZiBvZiB3aGljaCB0byByZWFkIGNvbmZpZyBvcHRpb25zXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb246IFRoZSB0cmFuc2FjdGlvbiBuZWVkaW5nIGEgc2FtcGxpbmcgZGVjaXNpb25cbiAqIEBwYXJhbSBzYW1wbGluZ0NvbnRleHQ6IERlZmF1bHQgYW5kIHVzZXItcHJvdmlkZWQgZGF0YSB3aGljaCBtYXkgYmUgdXNlZCB0byBoZWxwIG1ha2UgdGhlIGRlY2lzaW9uXG4gKlxuICogQHJldHVybnMgVGhlIGdpdmVuIHRyYW5zYWN0aW9uIHdpdGggaXRzIGBzYW1wbGVkYCB2YWx1ZSBzZXRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNhbXBsZSh0cmFuc2FjdGlvbiwgb3B0aW9ucywgc2FtcGxpbmdDb250ZXh0KSB7XG4gIC8vIG5vdGhpbmcgdG8gZG8gaWYgdHJhY2luZyBpcyBub3QgZW5hYmxlZFxuICBpZiAoIWhhc1RyYWNpbmdFbmFibGVkKCkpIHtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9IC8vIGlmIHRoZSB1c2VyIGhhcyBmb3JjZWQgYSBzYW1wbGluZyBkZWNpc2lvbiBieSBwYXNzaW5nIGEgYHNhbXBsZWRgIHZhbHVlIGluIHRoZWlyIHRyYW5zYWN0aW9uIGNvbnRleHQsIGdvIHdpdGggdGhhdFxuXG5cbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyYW5zYWN0aW9uLnNldE1ldGFkYXRhKHtcbiAgICAgIHRyYW5zYWN0aW9uU2FtcGxpbmc6IHtcbiAgICAgICAgbWV0aG9kOiBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLkV4cGxpY2l0XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9IC8vIHdlIHdvdWxkIGhhdmUgYmFpbGVkIGFscmVhZHkgaWYgbmVpdGhlciBgdHJhY2VzU2FtcGxlcmAgbm9yIGB0cmFjZXNTYW1wbGVSYXRlYCB3ZXJlIGRlZmluZWQsIHNvIG9uZSBvZiB0aGVzZSBzaG91bGRcbiAgLy8gd29yazsgcHJlZmVyIHRoZSBob29rIGlmIHNvXG5cblxuICB2YXIgc2FtcGxlUmF0ZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMudHJhY2VzU2FtcGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNhbXBsZVJhdGUgPSBvcHRpb25zLnRyYWNlc1NhbXBsZXIoc2FtcGxpbmdDb250ZXh0KTtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7XG4gICAgICAgIG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5TYW1wbGVyLFxuICAgICAgICAvLyBjYXN0IHRvIG51bWJlciBpbiBjYXNlIGl0J3MgYSBib29sZWFuXG4gICAgICAgIHJhdGU6IE51bWJlcihzYW1wbGVSYXRlKVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHNhbXBsaW5nQ29udGV4dC5wYXJlbnRTYW1wbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBzYW1wbGVSYXRlID0gc2FtcGxpbmdDb250ZXh0LnBhcmVudFNhbXBsZWQ7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzoge1xuICAgICAgICBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuSW5oZXJpdGFuY2VcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzYW1wbGVSYXRlID0gb3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlO1xuICAgIHRyYW5zYWN0aW9uLnNldE1ldGFkYXRhKHtcbiAgICAgIHRyYW5zYWN0aW9uU2FtcGxpbmc6IHtcbiAgICAgICAgbWV0aG9kOiBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLlJhdGUsXG4gICAgICAgIC8vIGNhc3QgdG8gbnVtYmVyIGluIGNhc2UgaXQncyBhIGJvb2xlYW5cbiAgICAgICAgcmF0ZTogTnVtYmVyKHNhbXBsZVJhdGUpXG4gICAgICB9XG4gICAgfSk7XG4gIH0gLy8gU2luY2UgdGhpcyBpcyBjb21pbmcgZnJvbSB0aGUgdXNlciAob3IgZnJvbSBhIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSB1c2VyKSwgd2hvIGtub3dzIHdoYXQgd2UgbWlnaHQgZ2V0LiAoVGhlXG4gIC8vIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSBib29sZWFucyBvciBudW1iZXJzIGJldHdlZW4gMCBhbmQgMS4pXG5cblxuICBpZiAoIWlzVmFsaWRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJbVHJhY2luZ10gRGlzY2FyZGluZyB0cmFuc2FjdGlvbiBiZWNhdXNlIG9mIGludmFsaWQgc2FtcGxlIHJhdGUuXCIpO1xuICAgIHRyYW5zYWN0aW9uLnNhbXBsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH0gLy8gaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIDAgKG9yIGZhbHNlKSwgb3IgaWYgYHRyYWNlc1NhbXBsZVJhdGVgIGlzIDAsIGl0J3MgYSBzaWduIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgZHJvcHBlZFxuXG5cbiAgaWYgKCFzYW1wbGVSYXRlKSB7XG4gICAgbG9nZ2VyLmxvZyhcIltUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgXCIgKyAodHlwZW9mIG9wdGlvbnMudHJhY2VzU2FtcGxlciA9PT0gJ2Z1bmN0aW9uJyA/ICd0cmFjZXNTYW1wbGVyIHJldHVybmVkIDAgb3IgZmFsc2UnIDogJ2EgbmVnYXRpdmUgc2FtcGxpbmcgZGVjaXNpb24gd2FzIGluaGVyaXRlZCBvciB0cmFjZXNTYW1wbGVSYXRlIGlzIHNldCB0byAwJykpO1xuICAgIHRyYW5zYWN0aW9uLnNhbXBsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH0gLy8gTm93IHdlIHJvbGwgdGhlIGRpY2UuIE1hdGgucmFuZG9tIGlzIGluY2x1c2l2ZSBvZiAwLCBidXQgbm90IG9mIDEsIHNvIHN0cmljdCA8IGlzIHNhZmUgaGVyZS4gSW4gY2FzZSBzYW1wbGVSYXRlIGlzXG4gIC8vIGEgYm9vbGVhbiwgdGhlIDwgY29tcGFyaXNvbiB3aWxsIGNhdXNlIGl0IHRvIGJlIGF1dG9tYXRpY2FsbHkgY2FzdCB0byAxIGlmIGl0J3MgdHJ1ZSBhbmQgMCBpZiBpdCdzIGZhbHNlLlxuXG5cbiAgdHJhbnNhY3Rpb24uc2FtcGxlZCA9IE1hdGgucmFuZG9tKCkgPCBzYW1wbGVSYXRlOyAvLyBpZiB3ZSdyZSBub3QgZ29pbmcgdG8ga2VlcCBpdCwgd2UncmUgZG9uZVxuXG4gIGlmICghdHJhbnNhY3Rpb24uc2FtcGxlZCkge1xuICAgIGxvZ2dlci5sb2coXCJbVHJhY2luZ10gRGlzY2FyZGluZyB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3Mgbm90IGluY2x1ZGVkIGluIHRoZSByYW5kb20gc2FtcGxlIChzYW1wbGluZyByYXRlID0gXCIgKyBOdW1iZXIoc2FtcGxlUmF0ZSkgKyBcIilcIik7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgbG9nZ2VyLmxvZyhcIltUcmFjaW5nXSBzdGFydGluZyBcIiArIHRyYW5zYWN0aW9uLm9wICsgXCIgdHJhbnNhY3Rpb24gLSBcIiArIHRyYW5zYWN0aW9uLm5hbWUpO1xuICByZXR1cm4gdHJhbnNhY3Rpb247XG59XG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gc2FtcGxlIHJhdGUgdG8gbWFrZSBzdXJlIGl0IGlzIHZhbGlkIHR5cGUgYW5kIHZhbHVlIChhIGJvb2xlYW4sIG9yIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSkuXG4gKi9cblxuXG5mdW5jdGlvbiBpc1ZhbGlkU2FtcGxlUmF0ZShyYXRlKSB7XG4gIC8vIHdlIG5lZWQgdG8gY2hlY2sgTmFOIGV4cGxpY2l0bHkgYmVjYXVzZSBpdCdzIG9mIHR5cGUgJ251bWJlcicgYW5kIHRoZXJlZm9yZSB3b3VsZG4ndCBnZXQgY2F1Z2h0IGJ5IHRoaXMgdHlwZWNoZWNrXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGlmIChpc05hTihyYXRlKSB8fCAhKHR5cGVvZiByYXRlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcmF0ZSA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIGxvZ2dlci53YXJuKFwiW1RyYWNpbmddIEdpdmVuIHNhbXBsZSByYXRlIGlzIGludmFsaWQuIFNhbXBsZSByYXRlIG11c3QgYmUgYSBib29sZWFuIG9yIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4gR290IFwiICsgSlNPTi5zdHJpbmdpZnkocmF0ZSkgKyBcIiBvZiB0eXBlIFwiICsgSlNPTi5zdHJpbmdpZnkodHlwZW9mIHJhdGUpICsgXCIuXCIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBpbiBjYXNlIHNhbXBsZVJhdGUgaXMgYSBib29sZWFuLCBpdCB3aWxsIGdldCBhdXRvbWF0aWNhbGx5IGNhc3QgdG8gMSBpZiBpdCdzIHRydWUgYW5kIDAgaWYgaXQncyBmYWxzZVxuXG5cbiAgaWYgKHJhdGUgPCAwIHx8IHJhdGUgPiAxKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJbVHJhY2luZ10gR2l2ZW4gc2FtcGxlIHJhdGUgaXMgaW52YWxpZC4gU2FtcGxlIHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuIEdvdCBcIiArIHJhdGUgKyBcIi5cIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNhY3Rpb24gYW5kIGFkZHMgYSBzYW1wbGluZyBkZWNpc2lvbiBpZiBpdCBkb2Vzbid0IHlldCBoYXZlIG9uZS5cbiAqXG4gKiBUaGUgSHViLnN0YXJ0VHJhbnNhY3Rpb24gbWV0aG9kIGRlbGVnYXRlcyB0byB0aGlzIG1ldGhvZCB0byBkbyBpdHMgd29yaywgcGFzc2luZyB0aGUgSHViIGluc3RhbmNlIGluIGFzIGB0aGlzYCwgYXMgaWZcbiAqIGl0IGhhZCBiZWVuIGNhbGxlZCBvbiB0aGUgaHViIGRpcmVjdGx5LiBFeGlzdHMgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHRoZSBjbGFzcyBhcyBhblxuICogXCJleHRlbnNpb24gbWV0aG9kLlwiXG4gKlxuICogQHBhcmFtIHRoaXM6IFRoZSBIdWIgc3RhcnRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25Db250ZXh0OiBEYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIEN1c3RvbVNhbXBsaW5nQ29udGV4dDogT3B0aW9uYWwgZGF0YSB0byBiZSBwcm92aWRlZCB0byB0aGUgYHRyYWNlc1NhbXBsZXJgIGZ1bmN0aW9uIChpZiBhbnkpXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyB0cmFuc2FjdGlvblxuICpcbiAqIEBzZWUge0BsaW5rIEh1Yi5zdGFydFRyYW5zYWN0aW9ufVxuICovXG5cblxuZnVuY3Rpb24gX3N0YXJ0VHJhbnNhY3Rpb24odHJhbnNhY3Rpb25Db250ZXh0LCBjdXN0b21TYW1wbGluZ0NvbnRleHQpIHtcbiAgdmFyIF9hLCBfYjtcblxuICB2YXIgb3B0aW9ucyA9ICgoX2EgPSB0aGlzLmdldENsaWVudCgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0T3B0aW9ucygpKSB8fCB7fTtcbiAgdmFyIHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgdGhpcyk7XG4gIHRyYW5zYWN0aW9uID0gc2FtcGxlKHRyYW5zYWN0aW9uLCBvcHRpb25zLCBfX2Fzc2lnbih7XG4gICAgcGFyZW50U2FtcGxlZDogdHJhbnNhY3Rpb25Db250ZXh0LnBhcmVudFNhbXBsZWQsXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0OiB0cmFuc2FjdGlvbkNvbnRleHRcbiAgfSwgY3VzdG9tU2FtcGxpbmdDb250ZXh0KSk7XG5cbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5pbml0U3BhblJlY29yZGVyKChfYiA9IG9wdGlvbnMuX2V4cGVyaW1lbnRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWF4U3BhbnMpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuLyoqXG4gKiBDcmVhdGUgbmV3IGlkbGUgdHJhbnNhY3Rpb24uXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRJZGxlVHJhbnNhY3Rpb24oaHViLCB0cmFuc2FjdGlvbkNvbnRleHQsIGlkbGVUaW1lb3V0LCBvblNjb3BlLCBjdXN0b21TYW1wbGluZ0NvbnRleHQpIHtcbiAgdmFyIF9hLCBfYjtcblxuICB2YXIgb3B0aW9ucyA9ICgoX2EgPSBodWIuZ2V0Q2xpZW50KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRPcHRpb25zKCkpIHx8IHt9O1xuICB2YXIgdHJhbnNhY3Rpb24gPSBuZXcgSWRsZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgaHViLCBpZGxlVGltZW91dCwgb25TY29wZSk7XG4gIHRyYW5zYWN0aW9uID0gc2FtcGxlKHRyYW5zYWN0aW9uLCBvcHRpb25zLCBfX2Fzc2lnbih7XG4gICAgcGFyZW50U2FtcGxlZDogdHJhbnNhY3Rpb25Db250ZXh0LnBhcmVudFNhbXBsZWQsXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0OiB0cmFuc2FjdGlvbkNvbnRleHRcbiAgfSwgY3VzdG9tU2FtcGxpbmdDb250ZXh0KSk7XG5cbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5pbml0U3BhblJlY29yZGVyKChfYiA9IG9wdGlvbnMuX2V4cGVyaW1lbnRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWF4U3BhbnMpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBfYWRkVHJhY2luZ0V4dGVuc2lvbnMoKSB7XG4gIHZhciBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcblxuICBpZiAoIWNhcnJpZXIuX19TRU5UUllfXykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zID0gY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMgfHwge307XG5cbiAgaWYgKCFjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy5zdGFydFRyYW5zYWN0aW9uKSB7XG4gICAgY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMuc3RhcnRUcmFuc2FjdGlvbiA9IF9zdGFydFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgaWYgKCFjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy50cmFjZUhlYWRlcnMpIHtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy50cmFjZUhlYWRlcnMgPSB0cmFjZUhlYWRlcnM7XG4gIH1cbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBfYXV0b2xvYWREYXRhYmFzZUludGVncmF0aW9ucygpIHtcbiAgdmFyIGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuXG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhY2thZ2VUb0ludGVncmF0aW9uTWFwcGluZyA9IHtcbiAgICBtb25nb2RiOiBmdW5jdGlvbiBtb25nb2RiKCkge1xuICAgICAgdmFyIGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbW9uZ28nKTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uTW9uZ28oKTtcbiAgICB9LFxuICAgIG1vbmdvb3NlOiBmdW5jdGlvbiBtb25nb29zZSgpIHtcbiAgICAgIHZhciBpbnRlZ3JhdGlvbiA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJy4vaW50ZWdyYXRpb25zL21vbmdvJyk7XG4gICAgICByZXR1cm4gbmV3IGludGVncmF0aW9uLk1vbmdvKHtcbiAgICAgICAgbW9uZ29vc2U6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbXlzcWw6IGZ1bmN0aW9uIG15c3FsKCkge1xuICAgICAgdmFyIGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbXlzcWwnKTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uTXlzcWwoKTtcbiAgICB9LFxuICAgIHBnOiBmdW5jdGlvbiBwZygpIHtcbiAgICAgIHZhciBpbnRlZ3JhdGlvbiA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJy4vaW50ZWdyYXRpb25zL3Bvc3RncmVzJyk7XG4gICAgICByZXR1cm4gbmV3IGludGVncmF0aW9uLlBvc3RncmVzKCk7XG4gICAgfVxuICB9O1xuICB2YXIgbWFwcGVkUGFja2FnZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmcpLmZpbHRlcihmdW5jdGlvbiAobW9kdWxlTmFtZSkge1xuICAgIHJldHVybiAhIWxvYWRNb2R1bGUobW9kdWxlTmFtZSk7XG4gIH0pLm1hcChmdW5jdGlvbiAocGtnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmdbcGtnXSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KS5maWx0ZXIoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcDtcbiAgfSk7XG5cbiAgaWYgKG1hcHBlZFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uaW50ZWdyYXRpb25zID0gX19zcHJlYWQoY2Fycmllci5fX1NFTlRSWV9fLmludGVncmF0aW9ucyB8fCBbXSwgbWFwcGVkUGFja2FnZXMpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGF0Y2hlcyB0aGUgZ2xvYmFsIG9iamVjdCBhbmQgaW5qZWN0cyB0aGUgVHJhY2luZyBleHRlbnNpb25zIG1ldGhvZHNcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRlbnNpb25NZXRob2RzKCkge1xuICBfYWRkVHJhY2luZ0V4dGVuc2lvbnMoKTsgLy8gRGV0ZWN0IGFuZCBhdXRvbWF0aWNhbGx5IGxvYWQgc3BlY2lmaWVkIGludGVncmF0aW9ucy5cblxuXG4gIGlmIChpc05vZGVFbnYoKSkge1xuICAgIF9hdXRvbG9hZERhdGFiYXNlSW50ZWdyYXRpb25zKCk7XG4gIH0gLy8gSWYgYW4gZXJyb3IgaGFwcGVucyBnbG9iYWxseSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbiBzdGF0dXMgaXMgc2V0IHRvIGVycm9yLlxuXG5cbiAgcmVnaXN0ZXJFcnJvckluc3RydW1lbnRhdGlvbigpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6275\n')},1441:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"nT\": function() { return /* binding */ DEFAULT_IDLE_TIMEOUT; },\n/* harmony export */ \"io\": function() { return /* binding */ IdleTransaction; }\n/* harmony export */ });\n/* unused harmony exports HEARTBEAT_INTERVAL, IdleTransactionSpanRecorder */\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7870);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5153);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(245);\n/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6369);\n/* harmony import */ var _spanstatus__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6314);\n/* harmony import */ var _transaction__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5955);\n\n\n\n\n\nvar DEFAULT_IDLE_TIMEOUT = 1000;\nvar HEARTBEAT_INTERVAL = 5000;\n/**\n * @inheritDoc\n */\n\nvar IdleTransactionSpanRecorder =\n/** @class */\nfunction (_super) {\n (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__extends */ .ZT)(IdleTransactionSpanRecorder, _super);\n\n function IdleTransactionSpanRecorder(_pushActivity, _popActivity, transactionSpanId, maxlen) {\n if (transactionSpanId === void 0) {\n transactionSpanId = '';\n }\n\n var _this = _super.call(this, maxlen) || this;\n\n _this._pushActivity = _pushActivity;\n _this._popActivity = _popActivity;\n _this.transactionSpanId = transactionSpanId;\n return _this;\n }\n /**\n * @inheritDoc\n */\n\n\n IdleTransactionSpanRecorder.prototype.add = function (span) {\n var _this = this; // We should make sure we do not push and pop activities for\n // the transaction that this span recorder belongs to.\n\n\n if (span.spanId !== this.transactionSpanId) {\n // We patch span.finish() to pop an activity after setting an endTimestamp.\n span.finish = function (endTimestamp) {\n span.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)();\n\n _this._popActivity(span.spanId);\n }; // We should only push new activities if the span does not have an end timestamp.\n\n\n if (span.endTimestamp === undefined) {\n this._pushActivity(span.spanId);\n }\n }\n\n _super.prototype.add.call(this, span);\n };\n\n return IdleTransactionSpanRecorder;\n}(_span__WEBPACK_IMPORTED_MODULE_2__/* .SpanRecorder */ .g);\n\n\n/**\n * An IdleTransaction is a transaction that automatically finishes. It does this by tracking child spans as activities.\n * You can have multiple IdleTransactions active, but if the `onScope` option is specified, the idle transaction will\n * put itself on the scope on creation.\n */\n\nvar IdleTransaction =\n/** @class */\nfunction (_super) {\n (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__extends */ .ZT)(IdleTransaction, _super);\n\n function IdleTransaction(transactionContext, _idleHub,\n /**\n * The time to wait in ms until the idle transaction will be finished.\n * @default 1000\n */\n _idleTimeout, // If an idle transaction should be put itself on and off the scope automatically.\n _onScope) {\n if (_idleTimeout === void 0) {\n _idleTimeout = DEFAULT_IDLE_TIMEOUT;\n }\n\n if (_onScope === void 0) {\n _onScope = false;\n }\n\n var _this = _super.call(this, transactionContext, _idleHub) || this;\n\n _this._idleHub = _idleHub;\n _this._idleTimeout = _idleTimeout;\n _this._onScope = _onScope; // Activities store a list of active spans\n\n _this.activities = {}; // Amount of times heartbeat has counted. Will cause transaction to finish after 3 beats.\n\n _this._heartbeatCounter = 0; // We should not use heartbeat if we finished a transaction\n\n _this._finished = false;\n _this._beforeFinishCallbacks = [];\n\n if (_idleHub && _onScope) {\n // There should only be one active transaction on the scope\n clearActiveTransaction(_idleHub); // We set the transaction here on the scope so error events pick up the trace\n // context and attach it to the error.\n\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log(\"Setting idle transaction on scope. Span ID: \" + _this.spanId);\n\n _idleHub.configureScope(function (scope) {\n return scope.setSpan(_this);\n });\n }\n\n _this._initTimeout = setTimeout(function () {\n if (!_this._finished) {\n _this.finish();\n }\n }, _this._idleTimeout);\n return _this;\n }\n /** {@inheritDoc} */\n\n\n IdleTransaction.prototype.finish = function (endTimestamp) {\n var e_1, _a;\n\n var _this = this;\n\n if (endTimestamp === void 0) {\n endTimestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)();\n }\n\n this._finished = true;\n this.activities = {};\n\n if (this.spanRecorder) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op);\n\n try {\n for (var _b = (0,tslib__WEBPACK_IMPORTED_MODULE_0__/* .__values */ .XA)(this._beforeFinishCallbacks), _c = _b.next(); !_c.done; _c = _b.next()) {\n var callback = _c.value;\n callback(this, endTimestamp);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n this.spanRecorder.spans = this.spanRecorder.spans.filter(function (span) {\n // If we are dealing with the transaction itself, we just return it\n if (span.spanId === _this.spanId) {\n return true;\n } // We cancel all pending spans with status \"cancelled\" to indicate the idle transaction was finished early\n\n\n if (!span.endTimestamp) {\n span.endTimestamp = endTimestamp;\n span.setStatus(_spanstatus__WEBPACK_IMPORTED_MODULE_4__/* .SpanStatus.Cancelled */ .p.Cancelled);\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] cancelling span since transaction ended early', JSON.stringify(span, undefined, 2));\n }\n\n var keepSpan = span.startTimestamp < endTimestamp;\n\n if (!keepSpan) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] discarding Span since it happened after Transaction was finished', JSON.stringify(span, undefined, 2));\n }\n\n return keepSpan;\n });\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] flushing IdleTransaction');\n } else {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] No active IdleTransaction');\n } // this._onScope is true if the transaction was previously on the scope.\n\n\n if (this._onScope) {\n clearActiveTransaction(this._idleHub);\n }\n\n return _super.prototype.finish.call(this, endTimestamp);\n };\n /**\n * Register a callback function that gets excecuted before the transaction finishes.\n * Useful for cleanup or if you want to add any additional spans based on current context.\n *\n * This is exposed because users have no other way of running something before an idle transaction\n * finishes.\n */\n\n\n IdleTransaction.prototype.registerBeforeFinishCallback = function (callback) {\n this._beforeFinishCallbacks.push(callback);\n };\n /**\n * @inheritDoc\n */\n\n\n IdleTransaction.prototype.initSpanRecorder = function (maxlen) {\n var _this = this;\n\n if (!this.spanRecorder) {\n var pushActivity = function pushActivity(id) {\n if (_this._finished) {\n return;\n }\n\n _this._pushActivity(id);\n };\n\n var popActivity = function popActivity(id) {\n if (_this._finished) {\n return;\n }\n\n _this._popActivity(id);\n };\n\n this.spanRecorder = new IdleTransactionSpanRecorder(pushActivity, popActivity, this.spanId, maxlen); // Start heartbeat so that transactions do not run forever.\n\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('Starting heartbeat');\n\n this._pingHeartbeat();\n }\n\n this.spanRecorder.add(this);\n };\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n\n\n IdleTransaction.prototype._pushActivity = function (spanId) {\n if (this._initTimeout) {\n clearTimeout(this._initTimeout);\n this._initTimeout = undefined;\n }\n\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log(\"[Tracing] pushActivity: \" + spanId);\n this.activities[spanId] = true;\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] new activities count', Object.keys(this.activities).length);\n };\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n\n\n IdleTransaction.prototype._popActivity = function (spanId) {\n var _this = this;\n\n if (this.activities[spanId]) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log(\"[Tracing] popActivity \" + spanId); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\n delete this.activities[spanId];\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log('[Tracing] new activities count', Object.keys(this.activities).length);\n }\n\n if (Object.keys(this.activities).length === 0) {\n var timeout = this._idleTimeout; // We need to add the timeout here to have the real endtimestamp of the transaction\n // Remember timestampWithMs is in seconds, timeout is in ms\n\n var end_1 = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)() + timeout / 1000;\n setTimeout(function () {\n if (!_this._finished) {\n _this.finish(end_1);\n }\n }, timeout);\n }\n };\n /**\n * Checks when entries of this.activities are not changing for 3 beats.\n * If this occurs we finish the transaction.\n */\n\n\n IdleTransaction.prototype._beat = function () {\n // We should not be running heartbeat if the idle transaction is finished.\n if (this._finished) {\n return;\n }\n\n var heartbeatString = Object.keys(this.activities).join('');\n\n if (heartbeatString === this._prevHeartbeatString) {\n this._heartbeatCounter += 1;\n } else {\n this._heartbeatCounter = 1;\n }\n\n this._prevHeartbeatString = heartbeatString;\n\n if (this._heartbeatCounter >= 3) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log(\"[Tracing] Transaction finished because of no change for 3 heart beats\");\n this.setStatus(_spanstatus__WEBPACK_IMPORTED_MODULE_4__/* .SpanStatus.DeadlineExceeded */ .p.DeadlineExceeded);\n this.setTag('heartbeat', 'failed');\n this.finish();\n } else {\n this._pingHeartbeat();\n }\n };\n /**\n * Pings the heartbeat\n */\n\n\n IdleTransaction.prototype._pingHeartbeat = function () {\n var _this = this;\n\n _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .k.log(\"pinging Heartbeat -> current counter: \" + this._heartbeatCounter);\n setTimeout(function () {\n _this._beat();\n }, HEARTBEAT_INTERVAL);\n };\n\n return IdleTransaction;\n}(_transaction__WEBPACK_IMPORTED_MODULE_5__/* .Transaction */ .Y);\n\n\n/**\n * Reset active transaction on scope\n */\n\nfunction clearActiveTransaction(hub) {\n if (hub) {\n var scope = hub.getScope();\n\n if (scope) {\n var transaction = scope.getTransaction();\n\n if (transaction) {\n scope.setSpan(undefined);\n }\n }\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2lkbGV0cmFuc2FjdGlvbi5qcz8zNjBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQTRDO0FBQ1k7QUFDbEI7QUFDSTtBQUNFO0FBQ3JDO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRSwwREFBUzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLHFCQUFxQjtBQUNyQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLHdFQUFlOztBQUU3RjtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMsd0RBQVk7O0FBRXlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRSwwREFBUzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUIsMEJBQTBCOztBQUUxQixnQ0FBZ0M7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1QztBQUN2Qzs7QUFFQSxNQUFNLGtFQUFVOztBQUVoQjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPLFlBQVk7OztBQUduQjtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLHdFQUFlO0FBQ3BDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLGtFQUFVOztBQUVoQjtBQUNBLHNCQUFzQix5REFBUSw4Q0FBOEMsVUFBVTtBQUN0RjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLHlCQUF5QixnRkFBb0I7QUFDN0MsVUFBVSxrRUFBVTtBQUNwQjs7QUFFQTs7QUFFQTtBQUNBLFVBQVUsa0VBQVU7QUFDcEI7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsTUFBTSxrRUFBVTtBQUNoQixLQUFLO0FBQ0wsTUFBTSxrRUFBVTtBQUNoQixLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMEdBQTBHOztBQUUxRyxNQUFNLGtFQUFVOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGtFQUFVO0FBQ2Q7QUFDQSxJQUFJLGtFQUFVO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sa0VBQVUsb0NBQW9DOztBQUVwRDtBQUNBLE1BQU0sa0VBQVU7QUFDaEI7O0FBRUE7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUEsa0JBQWtCLHdFQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNLGtFQUFVO0FBQ2hCLHFCQUFxQiw4RkFBMkI7QUFDaEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsSUFBSSxrRUFBVTtBQUNkO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDLENBQUMsOERBQVc7O0FBRWM7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNDQxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19leHRlbmRzLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgbG9nZ2VyLCB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IFNwYW5SZWNvcmRlciB9IGZyb20gJy4vc3Bhbic7XG5pbXBvcnQgeyBTcGFuU3RhdHVzIH0gZnJvbSAnLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgdmFyIERFRkFVTFRfSURMRV9USU1FT1VUID0gMTAwMDtcbmV4cG9ydCB2YXIgSEVBUlRCRUFUX0lOVEVSVkFMID0gNTAwMDtcbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xuXG52YXIgSWRsZVRyYW5zYWN0aW9uU3BhblJlY29yZGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKElkbGVUcmFuc2FjdGlvblNwYW5SZWNvcmRlciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBJZGxlVHJhbnNhY3Rpb25TcGFuUmVjb3JkZXIoX3B1c2hBY3Rpdml0eSwgX3BvcEFjdGl2aXR5LCB0cmFuc2FjdGlvblNwYW5JZCwgbWF4bGVuKSB7XG4gICAgaWYgKHRyYW5zYWN0aW9uU3BhbklkID09PSB2b2lkIDApIHtcbiAgICAgIHRyYW5zYWN0aW9uU3BhbklkID0gJyc7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF4bGVuKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuX3B1c2hBY3Rpdml0eSA9IF9wdXNoQWN0aXZpdHk7XG4gICAgX3RoaXMuX3BvcEFjdGl2aXR5ID0gX3BvcEFjdGl2aXR5O1xuICAgIF90aGlzLnRyYW5zYWN0aW9uU3BhbklkID0gdHJhbnNhY3Rpb25TcGFuSWQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIElkbGVUcmFuc2FjdGlvblNwYW5SZWNvcmRlci5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzOyAvLyBXZSBzaG91bGQgbWFrZSBzdXJlIHdlIGRvIG5vdCBwdXNoIGFuZCBwb3AgYWN0aXZpdGllcyBmb3JcbiAgICAvLyB0aGUgdHJhbnNhY3Rpb24gdGhhdCB0aGlzIHNwYW4gcmVjb3JkZXIgYmVsb25ncyB0by5cblxuXG4gICAgaWYgKHNwYW4uc3BhbklkICE9PSB0aGlzLnRyYW5zYWN0aW9uU3BhbklkKSB7XG4gICAgICAvLyBXZSBwYXRjaCBzcGFuLmZpbmlzaCgpIHRvIHBvcCBhbiBhY3Rpdml0eSBhZnRlciBzZXR0aW5nIGFuIGVuZFRpbWVzdGFtcC5cbiAgICAgIHNwYW4uZmluaXNoID0gZnVuY3Rpb24gKGVuZFRpbWVzdGFtcCkge1xuICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IHR5cGVvZiBlbmRUaW1lc3RhbXAgPT09ICdudW1iZXInID8gZW5kVGltZXN0YW1wIDogdGltZXN0YW1wV2l0aE1zKCk7XG5cbiAgICAgICAgX3RoaXMuX3BvcEFjdGl2aXR5KHNwYW4uc3BhbklkKTtcbiAgICAgIH07IC8vIFdlIHNob3VsZCBvbmx5IHB1c2ggbmV3IGFjdGl2aXRpZXMgaWYgdGhlIHNwYW4gZG9lcyBub3QgaGF2ZSBhbiBlbmQgdGltZXN0YW1wLlxuXG5cbiAgICAgIGlmIChzcGFuLmVuZFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3B1c2hBY3Rpdml0eShzcGFuLnNwYW5JZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3N1cGVyLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLCBzcGFuKTtcbiAgfTtcblxuICByZXR1cm4gSWRsZVRyYW5zYWN0aW9uU3BhblJlY29yZGVyO1xufShTcGFuUmVjb3JkZXIpO1xuXG5leHBvcnQgeyBJZGxlVHJhbnNhY3Rpb25TcGFuUmVjb3JkZXIgfTtcbi8qKlxuICogQW4gSWRsZVRyYW5zYWN0aW9uIGlzIGEgdHJhbnNhY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGZpbmlzaGVzLiBJdCBkb2VzIHRoaXMgYnkgdHJhY2tpbmcgY2hpbGQgc3BhbnMgYXMgYWN0aXZpdGllcy5cbiAqIFlvdSBjYW4gaGF2ZSBtdWx0aXBsZSBJZGxlVHJhbnNhY3Rpb25zIGFjdGl2ZSwgYnV0IGlmIHRoZSBgb25TY29wZWAgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGlkbGUgdHJhbnNhY3Rpb24gd2lsbFxuICogcHV0IGl0c2VsZiBvbiB0aGUgc2NvcGUgb24gY3JlYXRpb24uXG4gKi9cblxudmFyIElkbGVUcmFuc2FjdGlvbiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhJZGxlVHJhbnNhY3Rpb24sIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gSWRsZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgX2lkbGVIdWIsXG4gIC8qKlxuICAgKiBUaGUgdGltZSB0byB3YWl0IGluIG1zIHVudGlsIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdpbGwgYmUgZmluaXNoZWQuXG4gICAqIEBkZWZhdWx0IDEwMDBcbiAgICovXG4gIF9pZGxlVGltZW91dCwgLy8gSWYgYW4gaWRsZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcHV0IGl0c2VsZiBvbiBhbmQgb2ZmIHRoZSBzY29wZSBhdXRvbWF0aWNhbGx5LlxuICBfb25TY29wZSkge1xuICAgIGlmIChfaWRsZVRpbWVvdXQgPT09IHZvaWQgMCkge1xuICAgICAgX2lkbGVUaW1lb3V0ID0gREVGQVVMVF9JRExFX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgaWYgKF9vblNjb3BlID09PSB2b2lkIDApIHtcbiAgICAgIF9vblNjb3BlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHJhbnNhY3Rpb25Db250ZXh0LCBfaWRsZUh1YikgfHwgdGhpcztcblxuICAgIF90aGlzLl9pZGxlSHViID0gX2lkbGVIdWI7XG4gICAgX3RoaXMuX2lkbGVUaW1lb3V0ID0gX2lkbGVUaW1lb3V0O1xuICAgIF90aGlzLl9vblNjb3BlID0gX29uU2NvcGU7IC8vIEFjdGl2aXRpZXMgc3RvcmUgYSBsaXN0IG9mIGFjdGl2ZSBzcGFuc1xuXG4gICAgX3RoaXMuYWN0aXZpdGllcyA9IHt9OyAvLyBBbW91bnQgb2YgdGltZXMgaGVhcnRiZWF0IGhhcyBjb3VudGVkLiBXaWxsIGNhdXNlIHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBhZnRlciAzIGJlYXRzLlxuXG4gICAgX3RoaXMuX2hlYXJ0YmVhdENvdW50ZXIgPSAwOyAvLyBXZSBzaG91bGQgbm90IHVzZSBoZWFydGJlYXQgaWYgd2UgZmluaXNoZWQgYSB0cmFuc2FjdGlvblxuXG4gICAgX3RoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgX3RoaXMuX2JlZm9yZUZpbmlzaENhbGxiYWNrcyA9IFtdO1xuXG4gICAgaWYgKF9pZGxlSHViICYmIF9vblNjb3BlKSB7XG4gICAgICAvLyBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgYWN0aXZlIHRyYW5zYWN0aW9uIG9uIHRoZSBzY29wZVxuICAgICAgY2xlYXJBY3RpdmVUcmFuc2FjdGlvbihfaWRsZUh1Yik7IC8vIFdlIHNldCB0aGUgdHJhbnNhY3Rpb24gaGVyZSBvbiB0aGUgc2NvcGUgc28gZXJyb3IgZXZlbnRzIHBpY2sgdXAgdGhlIHRyYWNlXG4gICAgICAvLyBjb250ZXh0IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVycm9yLlxuXG4gICAgICBsb2dnZXIubG9nKFwiU2V0dGluZyBpZGxlIHRyYW5zYWN0aW9uIG9uIHNjb3BlLiBTcGFuIElEOiBcIiArIF90aGlzLnNwYW5JZCk7XG5cbiAgICAgIF9pZGxlSHViLmNvbmZpZ3VyZVNjb3BlKGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICByZXR1cm4gc2NvcGUuc2V0U3BhbihfdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfdGhpcy5faW5pdFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgIF90aGlzLmZpbmlzaCgpO1xuICAgICAgfVxuICAgIH0sIF90aGlzLl9pZGxlVGltZW91dCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKiB7QGluaGVyaXREb2N9ICovXG5cblxuICBJZGxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChlbmRUaW1lc3RhbXApIHtcbiAgICB2YXIgZV8xLCBfYTtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoZW5kVGltZXN0YW1wID09PSB2b2lkIDApIHtcbiAgICAgIGVuZFRpbWVzdGFtcCA9IHRpbWVzdGFtcFdpdGhNcygpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2aXRpZXMgPSB7fTtcblxuICAgIGlmICh0aGlzLnNwYW5SZWNvcmRlcikge1xuICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGZpbmlzaGluZyBJZGxlVHJhbnNhY3Rpb24nLCBuZXcgRGF0ZShlbmRUaW1lc3RhbXAgKiAxMDAwKS50b0lTT1N0cmluZygpLCB0aGlzLm9wKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0aGlzLl9iZWZvcmVGaW5pc2hDYWxsYmFja3MpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gX2MudmFsdWU7XG4gICAgICAgICAgY2FsbGJhY2sodGhpcywgZW5kVGltZXN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgZV8xID0ge1xuICAgICAgICAgIGVycm9yOiBlXzFfMVxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3BhblJlY29yZGVyLnNwYW5zID0gdGhpcy5zcGFuUmVjb3JkZXIuc3BhbnMuZmlsdGVyKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIGl0c2VsZiwgd2UganVzdCByZXR1cm4gaXRcbiAgICAgICAgaWYgKHNwYW4uc3BhbklkID09PSBfdGhpcy5zcGFuSWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyBXZSBjYW5jZWwgYWxsIHBlbmRpbmcgc3BhbnMgd2l0aCBzdGF0dXMgXCJjYW5jZWxsZWRcIiB0byBpbmRpY2F0ZSB0aGUgaWRsZSB0cmFuc2FjdGlvbiB3YXMgZmluaXNoZWQgZWFybHlcblxuXG4gICAgICAgIGlmICghc3Bhbi5lbmRUaW1lc3RhbXApIHtcbiAgICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgICBzcGFuLnNldFN0YXR1cyhTcGFuU3RhdHVzLkNhbmNlbGxlZCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGNhbmNlbGxpbmcgc3BhbiBzaW5jZSB0cmFuc2FjdGlvbiBlbmRlZCBlYXJseScsIEpTT04uc3RyaW5naWZ5KHNwYW4sIHVuZGVmaW5lZCwgMikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtlZXBTcGFuID0gc3Bhbi5zdGFydFRpbWVzdGFtcCA8IGVuZFRpbWVzdGFtcDtcblxuICAgICAgICBpZiAoIWtlZXBTcGFuKSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGRpc2NhcmRpbmcgU3BhbiBzaW5jZSBpdCBoYXBwZW5lZCBhZnRlciBUcmFuc2FjdGlvbiB3YXMgZmluaXNoZWQnLCBKU09OLnN0cmluZ2lmeShzcGFuLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZWVwU3BhbjtcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGZsdXNoaW5nIElkbGVUcmFuc2FjdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gTm8gYWN0aXZlIElkbGVUcmFuc2FjdGlvbicpO1xuICAgIH0gLy8gdGhpcy5fb25TY29wZSBpcyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgcHJldmlvdXNseSBvbiB0aGUgc2NvcGUuXG5cblxuICAgIGlmICh0aGlzLl9vblNjb3BlKSB7XG4gICAgICBjbGVhckFjdGl2ZVRyYW5zYWN0aW9uKHRoaXMuX2lkbGVIdWIpO1xuICAgIH1cblxuICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmZpbmlzaC5jYWxsKHRoaXMsIGVuZFRpbWVzdGFtcCk7XG4gIH07XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZ2V0cyBleGNlY3V0ZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBmaW5pc2hlcy5cbiAgICogVXNlZnVsIGZvciBjbGVhbnVwIG9yIGlmIHlvdSB3YW50IHRvIGFkZCBhbnkgYWRkaXRpb25hbCBzcGFucyBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQuXG4gICAqXG4gICAqIFRoaXMgaXMgZXhwb3NlZCBiZWNhdXNlIHVzZXJzIGhhdmUgbm8gb3RoZXIgd2F5IG9mIHJ1bm5pbmcgc29tZXRoaW5nIGJlZm9yZSBhbiBpZGxlIHRyYW5zYWN0aW9uXG4gICAqIGZpbmlzaGVzLlxuICAgKi9cblxuXG4gIElkbGVUcmFuc2FjdGlvbi5wcm90b3R5cGUucmVnaXN0ZXJCZWZvcmVGaW5pc2hDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHRoaXMuX2JlZm9yZUZpbmlzaENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgSWRsZVRyYW5zYWN0aW9uLnByb3RvdHlwZS5pbml0U3BhblJlY29yZGVyID0gZnVuY3Rpb24gKG1heGxlbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMuc3BhblJlY29yZGVyKSB7XG4gICAgICB2YXIgcHVzaEFjdGl2aXR5ID0gZnVuY3Rpb24gcHVzaEFjdGl2aXR5KGlkKSB7XG4gICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fcHVzaEFjdGl2aXR5KGlkKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwb3BBY3Rpdml0eSA9IGZ1bmN0aW9uIHBvcEFjdGl2aXR5KGlkKSB7XG4gICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fcG9wQWN0aXZpdHkoaWQpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zcGFuUmVjb3JkZXIgPSBuZXcgSWRsZVRyYW5zYWN0aW9uU3BhblJlY29yZGVyKHB1c2hBY3Rpdml0eSwgcG9wQWN0aXZpdHksIHRoaXMuc3BhbklkLCBtYXhsZW4pOyAvLyBTdGFydCBoZWFydGJlYXQgc28gdGhhdCB0cmFuc2FjdGlvbnMgZG8gbm90IHJ1biBmb3JldmVyLlxuXG4gICAgICBsb2dnZXIubG9nKCdTdGFydGluZyBoZWFydGJlYXQnKTtcblxuICAgICAgdGhpcy5fcGluZ0hlYXJ0YmVhdCgpO1xuICAgIH1cblxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfTtcbiAgLyoqXG4gICAqIFN0YXJ0IHRyYWNraW5nIGEgc3BlY2lmaWMgYWN0aXZpdHkuXG4gICAqIEBwYXJhbSBzcGFuSWQgVGhlIHNwYW4gaWQgdGhhdCByZXByZXNlbnRzIHRoZSBhY3Rpdml0eVxuICAgKi9cblxuXG4gIElkbGVUcmFuc2FjdGlvbi5wcm90b3R5cGUuX3B1c2hBY3Rpdml0eSA9IGZ1bmN0aW9uIChzcGFuSWQpIHtcbiAgICBpZiAodGhpcy5faW5pdFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pbml0VGltZW91dCk7XG4gICAgICB0aGlzLl9pbml0VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKFwiW1RyYWNpbmddIHB1c2hBY3Rpdml0eTogXCIgKyBzcGFuSWQpO1xuICAgIHRoaXMuYWN0aXZpdGllc1tzcGFuSWRdID0gdHJ1ZTtcbiAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gbmV3IGFjdGl2aXRpZXMgY291bnQnLCBPYmplY3Qua2V5cyh0aGlzLmFjdGl2aXRpZXMpLmxlbmd0aCk7XG4gIH07XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gYWN0aXZpdHkgZnJvbSB1c2FnZVxuICAgKiBAcGFyYW0gc3BhbklkIFRoZSBzcGFuIGlkIHRoYXQgcmVwcmVzZW50cyB0aGUgYWN0aXZpdHlcbiAgICovXG5cblxuICBJZGxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLl9wb3BBY3Rpdml0eSA9IGZ1bmN0aW9uIChzcGFuSWQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZpdGllc1tzcGFuSWRdKSB7XG4gICAgICBsb2dnZXIubG9nKFwiW1RyYWNpbmddIHBvcEFjdGl2aXR5IFwiICsgc3BhbklkKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuXG4gICAgICBkZWxldGUgdGhpcy5hY3Rpdml0aWVzW3NwYW5JZF07XG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gbmV3IGFjdGl2aXRpZXMgY291bnQnLCBPYmplY3Qua2V5cyh0aGlzLmFjdGl2aXRpZXMpLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2lkbGVUaW1lb3V0OyAvLyBXZSBuZWVkIHRvIGFkZCB0aGUgdGltZW91dCBoZXJlIHRvIGhhdmUgdGhlIHJlYWwgZW5kdGltZXN0YW1wIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gUmVtZW1iZXIgdGltZXN0YW1wV2l0aE1zIGlzIGluIHNlY29uZHMsIHRpbWVvdXQgaXMgaW4gbXNcblxuICAgICAgdmFyIGVuZF8xID0gdGltZXN0YW1wV2l0aE1zKCkgKyB0aW1lb3V0IC8gMTAwMDtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLl9maW5pc2hlZCkge1xuICAgICAgICAgIF90aGlzLmZpbmlzaChlbmRfMSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGVuIGVudHJpZXMgb2YgdGhpcy5hY3Rpdml0aWVzIGFyZSBub3QgY2hhbmdpbmcgZm9yIDMgYmVhdHMuXG4gICAqIElmIHRoaXMgb2NjdXJzIHdlIGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuXG5cbiAgSWRsZVRyYW5zYWN0aW9uLnByb3RvdHlwZS5fYmVhdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaGVhcnRiZWF0IGlmIHRoZSBpZGxlIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLlxuICAgIGlmICh0aGlzLl9maW5pc2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBoZWFydGJlYXRTdHJpbmcgPSBPYmplY3Qua2V5cyh0aGlzLmFjdGl2aXRpZXMpLmpvaW4oJycpO1xuXG4gICAgaWYgKGhlYXJ0YmVhdFN0cmluZyA9PT0gdGhpcy5fcHJldkhlYXJ0YmVhdFN0cmluZykge1xuICAgICAgdGhpcy5faGVhcnRiZWF0Q291bnRlciArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWFydGJlYXRDb3VudGVyID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmV2SGVhcnRiZWF0U3RyaW5nID0gaGVhcnRiZWF0U3RyaW5nO1xuXG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdENvdW50ZXIgPj0gMykge1xuICAgICAgbG9nZ2VyLmxvZyhcIltUcmFjaW5nXSBUcmFuc2FjdGlvbiBmaW5pc2hlZCBiZWNhdXNlIG9mIG5vIGNoYW5nZSBmb3IgMyBoZWFydCBiZWF0c1wiKTtcbiAgICAgIHRoaXMuc2V0U3RhdHVzKFNwYW5TdGF0dXMuRGVhZGxpbmVFeGNlZWRlZCk7XG4gICAgICB0aGlzLnNldFRhZygnaGVhcnRiZWF0JywgJ2ZhaWxlZCcpO1xuICAgICAgdGhpcy5maW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGluZ0hlYXJ0YmVhdCgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBoZWFydGJlYXRcbiAgICovXG5cblxuICBJZGxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLl9waW5nSGVhcnRiZWF0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBsb2dnZXIubG9nKFwicGluZ2luZyBIZWFydGJlYXQgLT4gY3VycmVudCBjb3VudGVyOiBcIiArIHRoaXMuX2hlYXJ0YmVhdENvdW50ZXIpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX2JlYXQoKTtcbiAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUwpO1xuICB9O1xuXG4gIHJldHVybiBJZGxlVHJhbnNhY3Rpb247XG59KFRyYW5zYWN0aW9uKTtcblxuZXhwb3J0IHsgSWRsZVRyYW5zYWN0aW9uIH07XG4vKipcbiAqIFJlc2V0IGFjdGl2ZSB0cmFuc2FjdGlvbiBvbiBzY29wZVxuICovXG5cbmZ1bmN0aW9uIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24oaHViKSB7XG4gIGlmIChodWIpIHtcbiAgICB2YXIgc2NvcGUgPSBodWIuZ2V0U2NvcGUoKTtcblxuICAgIGlmIChzY29wZSkge1xuICAgICAgdmFyIHRyYW5zYWN0aW9uID0gc2NvcGUuZ2V0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHNjb3BlLnNldFNwYW4odW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1441\n")},7374:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"IdleTransaction\": function() { return /* reexport */ idletransaction/* IdleTransaction */.io; },\n \"Integrations\": function() { return /* binding */ Integrations; },\n \"Span\": function() { return /* reexport */ span/* Span */.D; },\n \"SpanStatus\": function() { return /* reexport */ spanstatus/* SpanStatus */.p; },\n \"TRACEPARENT_REGEXP\": function() { return /* reexport */ utils/* TRACEPARENT_REGEXP */.Ke; },\n \"Transaction\": function() { return /* reexport */ transaction/* Transaction */.Y; },\n \"addExtensionMethods\": function() { return /* reexport */ hubextensions/* addExtensionMethods */.ro; },\n \"defaultRequestInstrumentationOptions\": function() { return /* reexport */ defaultRequestInstrumentationOptions; },\n \"extractTraceparentData\": function() { return /* reexport */ utils/* extractTraceparentData */.qG; },\n \"getActiveTransaction\": function() { return /* reexport */ utils/* getActiveTransaction */.x1; },\n \"hasTracingEnabled\": function() { return /* reexport */ utils/* hasTracingEnabled */.zu; },\n \"registerRequestInstrumentation\": function() { return /* reexport */ instrumentOutgoingRequests; },\n \"startIdleTransaction\": function() { return /* reexport */ hubextensions/* startIdleTransaction */.lb; },\n \"stripUrlQueryAndFragment\": function() { return /* reexport */ misc/* stripUrlQueryAndFragment */.rt; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/@sentry/tracing/esm/integrations/index.js\nvar integrations_namespaceObject = {};\n__webpack_require__.r(integrations_namespaceObject);\n__webpack_require__.d(integrations_namespaceObject, {\n \"Express\": function() { return Express; },\n \"Mongo\": function() { return Mongo; },\n \"Mysql\": function() { return Mysql; },\n \"Postgres\": function() { return Postgres; }\n});\n\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(7870);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js\nvar logger = __webpack_require__(245);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/misc.js\nvar misc = __webpack_require__(2861);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/hubextensions.js + 2 modules\nvar hubextensions = __webpack_require__(6275);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/idletransaction.js\nvar idletransaction = __webpack_require__(1441);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/spanstatus.js\nvar spanstatus = __webpack_require__(6314);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/utils.js\nvar utils = __webpack_require__(2662);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/backgroundtab.js\n\n\n\nvar global = (0,misc/* getGlobalObject */.Rf)();\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\n\nfunction registerBackgroundTabDetection() {\n if (global && global.document) {\n global.document.addEventListener('visibilitychange', function () {\n var activeTransaction = (0,utils/* getActiveTransaction */.x1)();\n\n if (global.document.hidden && activeTransaction) {\n logger/* logger.log */.k.log(\"[Tracing] Transaction: \" + spanstatus/* SpanStatus.Cancelled */.p.Cancelled + \" -> since tab moved to the background, op: \" + activeTransaction.op); // We should not set status if it is already set, this prevent important statuses like\n // error or data loss from being overwritten on transaction.\n\n if (!activeTransaction.status) {\n activeTransaction.setStatus(spanstatus/* SpanStatus.Cancelled */.p.Cancelled);\n }\n\n activeTransaction.setTag('visibilitychange', 'document.hidden');\n activeTransaction.finish();\n }\n });\n } else {\n logger/* logger.warn */.k.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n }\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/node.js\nvar node = __webpack_require__(7864);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/time.js\nvar time = __webpack_require__(5153);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/browser.js\nvar browser = __webpack_require__(595);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/bindReporter.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar bindReporter = function bindReporter(callback, metric, reportAllChanges) {\n var prevValue;\n return function (forceReport) {\n if (metric.value >= 0) {\n if (forceReport || reportAllChanges) {\n metric.delta = metric.value - (prevValue || 0); // Report the metric if there's a non-zero delta or if no previous\n // value exists (which can happen in the case of the document becoming\n // hidden when the metric value is 0).\n // See: https://github.com/GoogleChrome/web-vitals/issues/14\n\n if (metric.delta || prevValue === undefined) {\n prevValue = metric.value;\n callback(metric);\n }\n }\n }\n };\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/generateUniqueID.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nvar generateUniqueID = function generateUniqueID() {\n return \"v2-\" + Date.now() + \"-\" + (Math.floor(Math.random() * (9e12 - 1)) + 1e12);\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/initMetric.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar initMetric = function initMetric(name, value) {\n return {\n name: name,\n value: value !== null && value !== void 0 ? value : -1,\n delta: 0,\n entries: [],\n id: generateUniqueID()\n };\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/observe.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nvar observe = function observe(type, callback) {\n try {\n if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n // More extensive feature detect needed for Firefox due to:\n // https://github.com/GoogleChrome/web-vitals/issues/142\n if (type === 'first-input' && !('PerformanceEventTiming' in self)) {\n return;\n }\n\n var po = new PerformanceObserver(function (l) {\n return l.getEntries().map(callback);\n });\n po.observe({\n type: type,\n buffered: true\n });\n return po;\n }\n } catch (e) {// Do nothing.\n }\n\n return;\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/onHidden.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar onHidden = function onHidden(cb, once) {\n var onHiddenOrPageHide = function onHiddenOrPageHide(event) {\n if (event.type === 'pagehide' || (0,misc/* getGlobalObject */.Rf)().document.visibilityState === 'hidden') {\n cb(event);\n\n if (once) {\n removeEventListener('visibilitychange', onHiddenOrPageHide, true);\n removeEventListener('pagehide', onHiddenOrPageHide, true);\n }\n }\n };\n\n addEventListener('visibilitychange', onHiddenOrPageHide, true); // Some browsers have buggy implementations of visibilitychange,\n // so we use pagehide in addition, just to be safe.\n\n addEventListener('pagehide', onHiddenOrPageHide, true);\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getCLS.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\nvar getCLS = function getCLS(onReport, reportAllChanges) {\n var metric = initMetric('CLS', 0);\n var report;\n var sessionValue = 0;\n var sessionEntries = [];\n\n var entryHandler = function entryHandler(entry) {\n // Only count layout shifts without recent user input.\n // TODO: Figure out why entry can be undefined\n if (entry && !entry.hadRecentInput) {\n var firstSessionEntry = sessionEntries[0];\n var lastSessionEntry = sessionEntries[sessionEntries.length - 1]; // If the entry occurred less than 1 second after the previous entry and\n // less than 5 seconds after the first entry in the session, include the\n // entry in the current session. Otherwise, start a new session.\n\n if (sessionValue && sessionEntries.length !== 0 && entry.startTime - lastSessionEntry.startTime < 1000 && entry.startTime - firstSessionEntry.startTime < 5000) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n sessionValue = entry.value;\n sessionEntries = [entry];\n } // If the current session value is larger than the current CLS value,\n // update CLS and the entries contributing to it.\n\n\n if (sessionValue > metric.value) {\n metric.value = sessionValue;\n metric.entries = sessionEntries;\n\n if (report) {\n report();\n }\n }\n }\n };\n\n var po = observe('layout-shift', entryHandler);\n\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n onHidden(function () {\n po.takeRecords().map(entryHandler);\n report(true);\n });\n }\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nvar firstHiddenTime = -1;\n\nvar initHiddenTime = function initHiddenTime() {\n return (0,misc/* getGlobalObject */.Rf)().document.visibilityState === 'hidden' ? 0 : Infinity;\n};\n\nvar trackChanges = function trackChanges() {\n // Update the time if/when the document becomes hidden.\n onHidden(function (_a) {\n var timeStamp = _a.timeStamp;\n firstHiddenTime = timeStamp;\n }, true);\n};\n\nvar getVisibilityWatcher = function getVisibilityWatcher() {\n if (firstHiddenTime < 0) {\n // If the document is hidden when this code runs, assume it was hidden\n // since navigation start. This isn't a perfect heuristic, but it's the\n // best we can do until an API is available to support querying past\n // visibilityState.\n firstHiddenTime = initHiddenTime();\n trackChanges();\n }\n\n return {\n get firstHiddenTime() {\n return firstHiddenTime;\n }\n\n };\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getFID.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\n\nvar getFID = function getFID(onReport, reportAllChanges) {\n var visibilityWatcher = getVisibilityWatcher();\n var metric = initMetric('FID');\n var report;\n\n var entryHandler = function entryHandler(entry) {\n // Only report if the page wasn't hidden prior to the first input.\n if (report && entry.startTime < visibilityWatcher.firstHiddenTime) {\n metric.value = entry.processingStart - entry.startTime;\n metric.entries.push(entry);\n report(true);\n }\n };\n\n var po = observe('first-input', entryHandler);\n\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n onHidden(function () {\n po.takeRecords().map(entryHandler);\n po.disconnect();\n }, true);\n }\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getLCP.js\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\n\n\nvar reportedMetricIDs = {};\nvar getLCP = function getLCP(onReport, reportAllChanges) {\n var visibilityWatcher = getVisibilityWatcher();\n var metric = initMetric('LCP');\n var report;\n\n var entryHandler = function entryHandler(entry) {\n // The startTime attribute returns the value of the renderTime if it is not 0,\n // and the value of the loadTime otherwise.\n var value = entry.startTime; // If the page was hidden prior to paint time of the entry,\n // ignore it and mark the metric as final, otherwise add the entry.\n\n if (value < visibilityWatcher.firstHiddenTime) {\n metric.value = value;\n metric.entries.push(entry);\n }\n\n if (report) {\n report();\n }\n };\n\n var po = observe('largest-contentful-paint', entryHandler);\n\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n\n var stopListening_1 = function stopListening_1() {\n if (!reportedMetricIDs[metric.id]) {\n po.takeRecords().map(entryHandler);\n po.disconnect();\n reportedMetricIDs[metric.id] = true;\n report(true);\n }\n }; // Stop listening after input. Note: while scrolling is an input that\n // stop LCP observation, it's unreliable since it can be programmatically\n // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n\n\n ['keydown', 'click'].forEach(function (type) {\n addEventListener(type, stopListening_1, {\n once: true,\n capture: true\n });\n });\n onHidden(stopListening_1, true);\n }\n};\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/metrics.js\n\n\n\n\n\n\n\nvar metrics_global = (0,misc/* getGlobalObject */.Rf)();\nvar DEFAULT_METRICS_INSTR_OPTIONS = {\n _reportAllChanges: false\n};\n/** Class tracking metrics */\n\nvar MetricsInstrumentation =\n/** @class */\nfunction () {\n function MetricsInstrumentation(_options) {\n var _a, _b;\n\n this._measurements = {};\n this._performanceCursor = 0;\n\n if (!(0,node/* isNodeEnv */.KV)() && ((_a = metrics_global) === null || _a === void 0 ? void 0 : _a.performance) && ((_b = metrics_global) === null || _b === void 0 ? void 0 : _b.document)) {\n if (metrics_global.performance.mark) {\n metrics_global.performance.mark('sentry-tracing-init');\n }\n\n this._trackCLS();\n\n this._trackLCP(_options._reportAllChanges);\n\n this._trackFID();\n }\n }\n /** Add performance related spans to a transaction */\n\n\n MetricsInstrumentation.prototype.addPerformanceEntries = function (transaction) {\n var _this = this;\n\n if (!metrics_global || !metrics_global.performance || !metrics_global.performance.getEntries || !time/* browserPerformanceTimeOrigin */.Z1) {\n // Gatekeeper if performance API not available\n return;\n }\n\n logger/* logger.log */.k.log('[Tracing] Adding & adjusting spans using Performance API');\n var timeOrigin = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1);\n var entryScriptSrc;\n\n if (metrics_global.document && metrics_global.document.scripts) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (var i = 0; i < metrics_global.document.scripts.length; i++) {\n // We go through all scripts on the page and look for 'data-entry'\n // We remember the name and measure the time between this script finished loading and\n // our mark 'sentry-tracing-init'\n if (metrics_global.document.scripts[i].dataset.entry === 'true') {\n entryScriptSrc = metrics_global.document.scripts[i].src;\n break;\n }\n }\n }\n\n var entryScriptStartTimestamp;\n var tracingInitMarkStartTime;\n var responseStartTimestamp;\n var requestStartTimestamp;\n metrics_global.performance.getEntries().slice(this._performanceCursor).forEach(function (entry) {\n var startTime = (0,utils/* msToSec */.XL)(entry.startTime);\n var duration = (0,utils/* msToSec */.XL)(entry.duration);\n\n if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation':\n {\n addNavigationSpans(transaction, entry, timeOrigin);\n responseStartTimestamp = timeOrigin + (0,utils/* msToSec */.XL)(entry.responseStart);\n requestStartTimestamp = timeOrigin + (0,utils/* msToSec */.XL)(entry.requestStart);\n break;\n }\n\n case 'mark':\n case 'paint':\n case 'measure':\n {\n var startTimestamp = addMeasureSpans(transaction, entry, startTime, duration, timeOrigin);\n\n if (tracingInitMarkStartTime === undefined && entry.name === 'sentry-tracing-init') {\n tracingInitMarkStartTime = startTimestamp;\n } // capture web vitals\n\n\n var firstHidden = getVisibilityWatcher(); // Only report if the page wasn't hidden prior to the web vital.\n\n var shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n if (entry.name === 'first-paint' && shouldRecord) {\n logger/* logger.log */.k.log('[Measurements] Adding FP');\n _this._measurements['fp'] = {\n value: entry.startTime\n };\n _this._measurements['mark.fp'] = {\n value: startTimestamp\n };\n }\n\n if (entry.name === 'first-contentful-paint' && shouldRecord) {\n logger/* logger.log */.k.log('[Measurements] Adding FCP');\n _this._measurements['fcp'] = {\n value: entry.startTime\n };\n _this._measurements['mark.fcp'] = {\n value: startTimestamp\n };\n }\n\n break;\n }\n\n case 'resource':\n {\n var resourceName = entry.name.replace(metrics_global.location.origin, '');\n var endTimestamp = addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin); // We remember the entry script end time to calculate the difference to the first init mark\n\n if (entryScriptStartTimestamp === undefined && (entryScriptSrc || '').indexOf(resourceName) > -1) {\n entryScriptStartTimestamp = endTimestamp;\n }\n\n break;\n }\n\n default: // Ignore other entry types.\n\n }\n });\n\n if (entryScriptStartTimestamp !== undefined && tracingInitMarkStartTime !== undefined) {\n _startChild(transaction, {\n description: 'evaluation',\n endTimestamp: tracingInitMarkStartTime,\n op: 'script',\n startTimestamp: entryScriptStartTimestamp\n });\n }\n\n this._performanceCursor = Math.max(performance.getEntries().length - 1, 0);\n\n this._trackNavigator(transaction); // Measurements are only available for pageload transactions\n\n\n if (transaction.op === 'pageload') {\n // normalize applicable web vital values to be relative to transaction.startTimestamp\n var timeOrigin_1 = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1); // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the\n // start of the response in milliseconds\n\n if (typeof responseStartTimestamp === 'number') {\n logger/* logger.log */.k.log('[Measurements] Adding TTFB');\n this._measurements['ttfb'] = {\n value: (responseStartTimestamp - transaction.startTimestamp) * 1000\n };\n\n if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) {\n // Capture the time spent making the request and receiving the first byte of the response.\n // This is the time between the start of the request and the start of the response in milliseconds.\n this._measurements['ttfb.requestTime'] = {\n value: (responseStartTimestamp - requestStartTimestamp) * 1000\n };\n }\n }\n\n ['fcp', 'fp', 'lcp'].forEach(function (name) {\n if (!_this._measurements[name] || timeOrigin_1 >= transaction.startTimestamp) {\n return;\n } // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin.\n // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need\n // to be adjusted to be relative to transaction.startTimestamp.\n\n\n var oldValue = _this._measurements[name].value;\n var measurementTimestamp = timeOrigin_1 + (0,utils/* msToSec */.XL)(oldValue); // normalizedValue should be in milliseconds\n\n var normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000);\n var delta = normalizedValue - oldValue;\n logger/* logger.log */.k.log(\"[Measurements] Normalized \" + name + \" from \" + oldValue + \" to \" + normalizedValue + \" (\" + delta + \")\");\n _this._measurements[name].value = normalizedValue;\n });\n\n if (this._measurements['mark.fid'] && this._measurements['fid']) {\n // create span for FID\n _startChild(transaction, {\n description: 'first input delay',\n endTimestamp: this._measurements['mark.fid'].value + (0,utils/* msToSec */.XL)(this._measurements['fid'].value),\n op: 'web.vitals',\n startTimestamp: this._measurements['mark.fid'].value\n });\n } // If FCP is not recorded we should not record the cls value\n // according to the new definition of CLS.\n\n\n if (!('fcp' in this._measurements)) {\n delete this._measurements.cls;\n }\n\n transaction.setMeasurements(this._measurements);\n\n this._tagMetricInfo(transaction);\n }\n };\n /** Add LCP / CLS data to transaction to allow debugging */\n\n\n MetricsInstrumentation.prototype._tagMetricInfo = function (transaction) {\n if (this._lcpEntry) {\n logger/* logger.log */.k.log('[Measurements] Adding LCP Data'); // Capture Properties of the LCP element that contributes to the LCP.\n\n if (this._lcpEntry.element) {\n transaction.setTag('lcp.element', (0,browser/* htmlTreeAsString */.R)(this._lcpEntry.element));\n }\n\n if (this._lcpEntry.id) {\n transaction.setTag('lcp.id', this._lcpEntry.id);\n }\n\n if (this._lcpEntry.url) {\n // Trim URL to the first 200 characters.\n transaction.setTag('lcp.url', this._lcpEntry.url.trim().slice(0, 200));\n }\n\n transaction.setTag('lcp.size', this._lcpEntry.size);\n } // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n\n\n if (this._clsEntry && this._clsEntry.sources) {\n logger/* logger.log */.k.log('[Measurements] Adding CLS Data');\n\n this._clsEntry.sources.forEach(function (source, index) {\n return transaction.setTag(\"cls.source.\" + (index + 1), (0,browser/* htmlTreeAsString */.R)(source.node));\n });\n }\n };\n /** Starts tracking the Cumulative Layout Shift on the current page. */\n\n\n MetricsInstrumentation.prototype._trackCLS = function () {\n var _this = this; // See:\n // https://web.dev/evolving-cls/\n // https://web.dev/cls-web-tooling/\n\n\n getCLS(function (metric) {\n var entry = metric.entries.pop();\n\n if (!entry) {\n return;\n }\n\n logger/* logger.log */.k.log('[Measurements] Adding CLS');\n _this._measurements['cls'] = {\n value: metric.value\n };\n _this._clsEntry = entry;\n });\n };\n /**\n * Capture the information of the user agent.\n */\n\n\n MetricsInstrumentation.prototype._trackNavigator = function (transaction) {\n var navigator = metrics_global.navigator;\n\n if (!navigator) {\n return;\n } // track network connectivity\n\n\n var connection = navigator.connection;\n\n if (connection) {\n if (connection.effectiveType) {\n transaction.setTag('effectiveConnectionType', connection.effectiveType);\n }\n\n if (connection.type) {\n transaction.setTag('connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n this._measurements['connection.rtt'] = {\n value: connection.rtt\n };\n }\n\n if (isMeasurementValue(connection.downlink)) {\n this._measurements['connection.downlink'] = {\n value: connection.downlink\n };\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n transaction.setTag('deviceMemory', String(navigator.deviceMemory));\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n };\n /** Starts tracking the Largest Contentful Paint on the current page. */\n\n\n MetricsInstrumentation.prototype._trackLCP = function (reportAllChanges) {\n var _this = this;\n\n getLCP(function (metric) {\n var entry = metric.entries.pop();\n\n if (!entry) {\n return;\n }\n\n var timeOrigin = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1);\n var startTime = (0,utils/* msToSec */.XL)(entry.startTime);\n logger/* logger.log */.k.log('[Measurements] Adding LCP');\n _this._measurements['lcp'] = {\n value: metric.value\n };\n _this._measurements['mark.lcp'] = {\n value: timeOrigin + startTime\n };\n _this._lcpEntry = entry;\n }, reportAllChanges);\n };\n /** Starts tracking the First Input Delay on the current page. */\n\n\n MetricsInstrumentation.prototype._trackFID = function () {\n var _this = this;\n\n getFID(function (metric) {\n var entry = metric.entries.pop();\n\n if (!entry) {\n return;\n }\n\n var timeOrigin = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1);\n var startTime = (0,utils/* msToSec */.XL)(entry.startTime);\n logger/* logger.log */.k.log('[Measurements] Adding FID');\n _this._measurements['fid'] = {\n value: metric.value\n };\n _this._measurements['mark.fid'] = {\n value: timeOrigin + startTime\n };\n });\n };\n\n return MetricsInstrumentation;\n}();\n\n\n/** Instrument navigation entries */\n\nfunction addNavigationSpans(transaction, entry, timeOrigin) {\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'unloadEvent',\n timeOrigin: timeOrigin\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'redirect',\n timeOrigin: timeOrigin\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'domContentLoadedEvent',\n timeOrigin: timeOrigin\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'loadEvent',\n timeOrigin: timeOrigin\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'connect',\n timeOrigin: timeOrigin\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'secureConnection',\n timeOrigin: timeOrigin,\n eventEnd: 'connectEnd',\n description: 'TLS/SSL'\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'fetch',\n timeOrigin: timeOrigin,\n eventEnd: 'domainLookupStart',\n description: 'cache'\n });\n addPerformanceNavigationTiming({\n transaction: transaction,\n entry: entry,\n event: 'domainLookup',\n timeOrigin: timeOrigin,\n description: 'DNS'\n });\n addRequest(transaction, entry, timeOrigin);\n}\n/** Create measure related spans */\n\n\nfunction addMeasureSpans(transaction, entry, startTime, duration, timeOrigin) {\n var measureStartTimestamp = timeOrigin + startTime;\n var measureEndTimestamp = measureStartTimestamp + duration;\n\n _startChild(transaction, {\n description: entry.name,\n endTimestamp: measureEndTimestamp,\n op: entry.entryType,\n startTimestamp: measureStartTimestamp\n });\n\n return measureStartTimestamp;\n}\n/** Create resource-related spans */\n\n\nfunction addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin) {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return undefined;\n }\n\n var data = {};\n\n if ('transferSize' in entry) {\n data['Transfer Size'] = entry.transferSize;\n }\n\n if ('encodedBodySize' in entry) {\n data['Encoded Body Size'] = entry.encodedBodySize;\n }\n\n if ('decodedBodySize' in entry) {\n data['Decoded Body Size'] = entry.decodedBodySize;\n }\n\n var startTimestamp = timeOrigin + startTime;\n var endTimestamp = startTimestamp + duration;\n\n _startChild(transaction, {\n description: resourceName,\n endTimestamp: endTimestamp,\n op: entry.initiatorType ? \"resource.\" + entry.initiatorType : 'resource',\n startTimestamp: startTimestamp,\n data: data\n });\n\n return endTimestamp;\n}\n/** Create performance navigation related spans */\n\nfunction addPerformanceNavigationTiming(props) {\n var transaction = props.transaction,\n entry = props.entry,\n event = props.event,\n timeOrigin = props.timeOrigin,\n eventEnd = props.eventEnd,\n description = props.description;\n var end = eventEnd ? entry[eventEnd] : entry[event + \"End\"];\n var start = entry[event + \"Start\"];\n\n if (!start || !end) {\n return;\n }\n\n _startChild(transaction, {\n op: 'browser',\n description: description !== null && description !== void 0 ? description : event,\n startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(start),\n endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(end)\n });\n}\n/** Create request and response related spans */\n\n\nfunction addRequest(transaction, entry, timeOrigin) {\n _startChild(transaction, {\n op: 'browser',\n description: 'request',\n startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.requestStart),\n endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseEnd)\n });\n\n _startChild(transaction, {\n op: 'browser',\n description: 'response',\n startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseStart),\n endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseEnd)\n });\n}\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\n\n\nfunction _startChild(transaction, _a) {\n var startTimestamp = _a.startTimestamp,\n ctx = (0,tslib_es6/* __rest */._T)(_a, [\"startTimestamp\"]);\n\n if (startTimestamp && transaction.startTimestamp > startTimestamp) {\n transaction.startTimestamp = startTimestamp;\n }\n\n return transaction.startChild((0,tslib_es6/* __assign */.pi)({\n startTimestamp: startTimestamp\n }, ctx));\n}\n/**\n * Checks if a given value is a valid measurement value.\n */\n\nfunction isMeasurementValue(value) {\n return typeof value === 'number' && isFinite(value);\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/string.js\nvar string = __webpack_require__(7940);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/instrument.js\nvar instrument = __webpack_require__(6710);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/is.js\nvar is = __webpack_require__(2684);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/request.js\n\n\n\n\nvar DEFAULT_TRACING_ORIGINS = ['localhost', /^\\//];\nvar defaultRequestInstrumentationOptions = {\n traceFetch: true,\n traceXHR: true,\n tracingOrigins: DEFAULT_TRACING_ORIGINS\n};\n/** Registers span creators for xhr and fetch requests */\n\nfunction instrumentOutgoingRequests(_options) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var _a = (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, defaultRequestInstrumentationOptions), _options),\n traceFetch = _a.traceFetch,\n traceXHR = _a.traceXHR,\n tracingOrigins = _a.tracingOrigins,\n shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest; // We should cache url -> decision so that we don't have to compute\n // regexp everytime we create a request.\n\n\n var urlMap = {};\n\n var defaultShouldCreateSpan = function defaultShouldCreateSpan(url) {\n if (urlMap[url]) {\n return urlMap[url];\n }\n\n var origins = tracingOrigins;\n urlMap[url] = origins.some(function (origin) {\n return (0,string/* isMatchingPattern */.zC)(url, origin);\n }) && !(0,string/* isMatchingPattern */.zC)(url, 'sentry_key');\n return urlMap[url];\n }; // We want that our users don't have to re-implement shouldCreateSpanForRequest themselves\n // That's why we filter out already unwanted Spans from tracingOrigins\n\n\n var shouldCreateSpan = defaultShouldCreateSpan;\n\n if (typeof shouldCreateSpanForRequest === 'function') {\n shouldCreateSpan = function shouldCreateSpan(url) {\n return defaultShouldCreateSpan(url) && shouldCreateSpanForRequest(url);\n };\n }\n\n var spans = {};\n\n if (traceFetch) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback(handlerData) {\n fetchCallback(handlerData, shouldCreateSpan, spans);\n },\n type: 'fetch'\n });\n }\n\n if (traceXHR) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback(handlerData) {\n xhrCallback(handlerData, shouldCreateSpan, spans);\n },\n type: 'xhr'\n });\n }\n}\n/**\n * Create and track fetch request spans\n */\n\nfunction fetchCallback(handlerData, shouldCreateSpan, spans) {\n if (!(0,utils/* hasTracingEnabled */.zu)() || !(handlerData.fetchData && shouldCreateSpan(handlerData.fetchData.url))) {\n return;\n }\n\n if (handlerData.endTimestamp && handlerData.fetchData.__span) {\n var span = spans[handlerData.fetchData.__span];\n\n if (span) {\n if (handlerData.response) {\n // TODO (kmclb) remove this once types PR goes through\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n span.setHttpStatus(handlerData.response.status);\n } else if (handlerData.error) {\n span.setStatus(spanstatus/* SpanStatus.InternalError */.p.InternalError);\n }\n\n span.finish(); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\n delete spans[handlerData.fetchData.__span];\n }\n\n return;\n }\n\n var activeTransaction = (0,utils/* getActiveTransaction */.x1)();\n\n if (activeTransaction) {\n var span = activeTransaction.startChild({\n data: (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, handlerData.fetchData), {\n type: 'fetch'\n }),\n description: handlerData.fetchData.method + \" \" + handlerData.fetchData.url,\n op: 'http.client'\n });\n handlerData.fetchData.__span = span.spanId;\n spans[span.spanId] = span;\n var request = handlerData.args[0] = handlerData.args[0]; // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n var options = handlerData.args[1] = handlerData.args[1] || {};\n var headers = options.headers;\n\n if ((0,is/* isInstanceOf */.V9)(request, Request)) {\n headers = request.headers;\n }\n\n if (headers) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (typeof headers.append === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n headers.append('sentry-trace', span.toTraceparent());\n } else if (Array.isArray(headers)) {\n headers = (0,tslib_es6/* __spread */.fl)(headers, [['sentry-trace', span.toTraceparent()]]);\n } else {\n headers = (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, headers), {\n 'sentry-trace': span.toTraceparent()\n });\n }\n } else {\n headers = {\n 'sentry-trace': span.toTraceparent()\n };\n }\n\n options.headers = headers;\n }\n}\n/**\n * Create and track xhr request spans\n */\n\nfunction xhrCallback(handlerData, shouldCreateSpan, spans) {\n var _a, _b;\n\n if (!(0,utils/* hasTracingEnabled */.zu)() || ((_a = handlerData.xhr) === null || _a === void 0 ? void 0 : _a.__sentry_own_request__) || !(((_b = handlerData.xhr) === null || _b === void 0 ? void 0 : _b.__sentry_xhr__) && shouldCreateSpan(handlerData.xhr.__sentry_xhr__.url))) {\n return;\n }\n\n var xhr = handlerData.xhr.__sentry_xhr__; // check first if the request has finished and is tracked by an existing span which should now end\n\n if (handlerData.endTimestamp && handlerData.xhr.__sentry_xhr_span_id__) {\n var span = spans[handlerData.xhr.__sentry_xhr_span_id__];\n\n if (span) {\n span.setHttpStatus(xhr.status_code);\n span.finish(); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\n delete spans[handlerData.xhr.__sentry_xhr_span_id__];\n }\n\n return;\n } // if not, create a new span to track it\n\n\n var activeTransaction = (0,utils/* getActiveTransaction */.x1)();\n\n if (activeTransaction) {\n var span = activeTransaction.startChild({\n data: (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, xhr.data), {\n type: 'xhr',\n method: xhr.method,\n url: xhr.url\n }),\n description: xhr.method + \" \" + xhr.url,\n op: 'http.client'\n });\n handlerData.xhr.__sentry_xhr_span_id__ = span.spanId;\n spans[handlerData.xhr.__sentry_xhr_span_id__] = span;\n\n if (handlerData.xhr.setRequestHeader) {\n try {\n handlerData.xhr.setRequestHeader('sentry-trace', span.toTraceparent());\n } catch (_) {// Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n }\n }\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/router.js\n\nvar router_global = (0,misc/* getGlobalObject */.Rf)();\n/**\n * Default function implementing pageload and navigation transactions\n */\n\nfunction instrumentRoutingWithDefaults(customStartTransaction, startTransactionOnPageLoad, startTransactionOnLocationChange) {\n if (startTransactionOnPageLoad === void 0) {\n startTransactionOnPageLoad = true;\n }\n\n if (startTransactionOnLocationChange === void 0) {\n startTransactionOnLocationChange = true;\n }\n\n if (!router_global || !router_global.location) {\n logger/* logger.warn */.k.warn('Could not initialize routing instrumentation due to invalid location');\n return;\n }\n\n var startingUrl = router_global.location.href;\n var activeTransaction;\n\n if (startTransactionOnPageLoad) {\n activeTransaction = customStartTransaction({\n name: router_global.location.pathname,\n op: 'pageload'\n });\n }\n\n if (startTransactionOnLocationChange) {\n (0,instrument/* addInstrumentationHandler */.o)({\n callback: function callback(_a) {\n var to = _a.to,\n from = _a.from;\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n\n if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n\n if (activeTransaction) {\n logger/* logger.log */.k.log(\"[Tracing] Finishing current transaction with op: \" + activeTransaction.op); // If there's an open transaction on the scope, we need to finish it before creating an new one.\n\n activeTransaction.finish();\n }\n\n activeTransaction = customStartTransaction({\n name: router_global.location.pathname,\n op: 'navigation'\n });\n }\n },\n type: 'history'\n });\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/browsertracing.js\n\n\n\n\n\n\n\n\n\n\nvar DEFAULT_MAX_TRANSACTION_DURATION_SECONDS = 600;\n\nvar DEFAULT_BROWSER_TRACING_OPTIONS = (0,tslib_es6/* __assign */.pi)({\n idleTimeout: idletransaction/* DEFAULT_IDLE_TIMEOUT */.nT,\n markBackgroundTransactions: true,\n maxTransactionDuration: DEFAULT_MAX_TRANSACTION_DURATION_SECONDS,\n routingInstrumentation: instrumentRoutingWithDefaults,\n startTransactionOnLocationChange: true,\n startTransactionOnPageLoad: true\n}, defaultRequestInstrumentationOptions);\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library. This integration uses {@see IdleTransaction} to create transactions.\n */\n\n\nvar BrowserTracing =\n/** @class */\nfunction () {\n function BrowserTracing(_options) {\n /**\n * @inheritDoc\n */\n this.name = BrowserTracing.id;\n this._emitOptionsWarning = false;\n var tracingOrigins = defaultRequestInstrumentationOptions.tracingOrigins; // NOTE: Logger doesn't work in constructors, as it's initialized after integrations instances\n\n if (_options && _options.tracingOrigins && Array.isArray(_options.tracingOrigins) && _options.tracingOrigins.length !== 0) {\n tracingOrigins = _options.tracingOrigins;\n } else {\n this._emitOptionsWarning = true;\n }\n\n this.options = (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, DEFAULT_BROWSER_TRACING_OPTIONS), _options), {\n tracingOrigins: tracingOrigins\n });\n this._metrics = new MetricsInstrumentation((0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, DEFAULT_METRICS_INSTR_OPTIONS), this.options._metricOptions));\n }\n /**\n * @inheritDoc\n */\n\n\n BrowserTracing.prototype.setupOnce = function (_, getCurrentHub) {\n var _this = this;\n\n this._getCurrentHub = getCurrentHub;\n\n if (this._emitOptionsWarning) {\n logger/* logger.warn */.k.warn('[Tracing] You need to define `tracingOrigins` in the options. Set an array of urls or patterns to trace.');\n logger/* logger.warn */.k.warn(\"[Tracing] We added a reasonable default for you: \" + defaultRequestInstrumentationOptions.tracingOrigins);\n } // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n var _a = this.options,\n instrumentRouting = _a.routingInstrumentation,\n startTransactionOnLocationChange = _a.startTransactionOnLocationChange,\n startTransactionOnPageLoad = _a.startTransactionOnPageLoad,\n markBackgroundTransactions = _a.markBackgroundTransactions,\n traceFetch = _a.traceFetch,\n traceXHR = _a.traceXHR,\n tracingOrigins = _a.tracingOrigins,\n shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest;\n instrumentRouting(function (context) {\n return _this._createRouteTransaction(context);\n }, startTransactionOnPageLoad, startTransactionOnLocationChange);\n\n if (markBackgroundTransactions) {\n registerBackgroundTabDetection();\n }\n\n instrumentOutgoingRequests({\n traceFetch: traceFetch,\n traceXHR: traceXHR,\n tracingOrigins: tracingOrigins,\n shouldCreateSpanForRequest: shouldCreateSpanForRequest\n });\n };\n /** Create routing idle transaction. */\n\n\n BrowserTracing.prototype._createRouteTransaction = function (context) {\n var _this = this;\n\n if (!this._getCurrentHub) {\n logger/* logger.warn */.k.warn(\"[Tracing] Did not create \" + context.op + \" transaction because _getCurrentHub is invalid.\");\n return undefined;\n } // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n var _a = this.options,\n beforeNavigate = _a.beforeNavigate,\n idleTimeout = _a.idleTimeout,\n maxTransactionDuration = _a.maxTransactionDuration;\n var parentContextFromHeader = context.op === 'pageload' ? getHeaderContext() : undefined;\n\n var expandedContext = (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, context), parentContextFromHeader), {\n trimEnd: true\n });\n\n var modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext; // For backwards compatibility reasons, beforeNavigate can return undefined to \"drop\" the transaction (prevent it\n // from being sent to Sentry).\n\n var finalContext = modifiedContext === undefined ? (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, expandedContext), {\n sampled: false\n }) : modifiedContext;\n\n if (finalContext.sampled === false) {\n logger/* logger.log */.k.log(\"[Tracing] Will not send \" + finalContext.op + \" transaction because of beforeNavigate.\");\n }\n\n logger/* logger.log */.k.log(\"[Tracing] Starting \" + finalContext.op + \" transaction on scope\");\n\n var hub = this._getCurrentHub();\n\n var location = (0,misc/* getGlobalObject */.Rf)().location;\n var idleTransaction = (0,hubextensions/* startIdleTransaction */.lb)(hub, finalContext, idleTimeout, true, {\n location: location\n });\n idleTransaction.registerBeforeFinishCallback(function (transaction, endTimestamp) {\n _this._metrics.addPerformanceEntries(transaction);\n\n adjustTransactionDuration((0,utils/* secToMs */.WB)(maxTransactionDuration), transaction, endTimestamp);\n });\n return idleTransaction;\n };\n /**\n * @inheritDoc\n */\n\n\n BrowserTracing.id = 'BrowserTracing';\n return BrowserTracing;\n}();\n\n\n/**\n * Gets transaction context from a sentry-trace meta.\n *\n * @returns Transaction context data from the header or undefined if there's no header or the header is malformed\n */\n\nfunction getHeaderContext() {\n var header = getMetaContent('sentry-trace');\n\n if (header) {\n return (0,utils/* extractTraceparentData */.qG)(header);\n }\n\n return undefined;\n}\n/** Returns the value of a meta tag */\n\nfunction getMetaContent(metaName) {\n var el = (0,misc/* getGlobalObject */.Rf)().document.querySelector(\"meta[name=\" + metaName + \"]\");\n return el ? el.getAttribute('content') : null;\n}\n/** Adjusts transaction value based on max transaction duration */\n\nfunction adjustTransactionDuration(maxDuration, transaction, endTimestamp) {\n var diff = endTimestamp - transaction.startTimestamp;\n var isOutdatedTransaction = endTimestamp && (diff > maxDuration || diff < 0);\n\n if (isOutdatedTransaction) {\n transaction.setStatus(spanstatus/* SpanStatus.DeadlineExceeded */.p.DeadlineExceeded);\n transaction.setTag('maxTransactionDurationExceeded', 'true');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/integrations/node/express.js\n\n\n/**\n * Express integration\n *\n * Provides an request and error handler for Express framework as well as tracing capabilities\n */\n\nvar Express =\n/** @class */\nfunction () {\n /**\n * @inheritDoc\n */\n function Express(options) {\n if (options === void 0) {\n options = {};\n }\n /**\n * @inheritDoc\n */\n\n\n this.name = Express.id;\n this._router = options.router || options.app;\n this._methods = (Array.isArray(options.methods) ? options.methods : []).concat('use');\n }\n /**\n * @inheritDoc\n */\n\n\n Express.prototype.setupOnce = function () {\n if (!this._router) {\n logger/* logger.error */.k.error('ExpressIntegration is missing an Express instance');\n return;\n }\n\n instrumentMiddlewares(this._router, this._methods);\n };\n /**\n * @inheritDoc\n */\n\n\n Express.id = 'Express';\n return Express;\n}();\n\n\n/**\n * Wraps original middleware function in a tracing call, which stores the info about the call as a span,\n * and finishes it once the middleware is done invoking.\n *\n * Express middlewares have 3 various forms, thus we have to take care of all of them:\n * // sync\n * app.use(function (req, res) { ... })\n * // async\n * app.use(function (req, res, next) { ... })\n * // error handler\n * app.use(function (err, req, res, next) { ... })\n *\n * They all internally delegate to the `router[method]` of the given application instance.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any\n\nfunction wrap(fn, method) {\n var arity = fn.length;\n\n switch (arity) {\n case 2:\n {\n return function (req, res) {\n var transaction = res.__sentry_transaction;\n\n if (transaction) {\n var span_1 = transaction.startChild({\n description: fn.name,\n op: \"middleware.\" + method\n });\n res.once('finish', function () {\n span_1.finish();\n });\n }\n\n return fn.call(this, req, res);\n };\n }\n\n case 3:\n {\n return function (req, res, next) {\n var _a;\n\n var transaction = res.__sentry_transaction;\n var span = (_a = transaction) === null || _a === void 0 ? void 0 : _a.startChild({\n description: fn.name,\n op: \"middleware.\" + method\n });\n fn.call(this, req, res, function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n next.call.apply(next, (0,tslib_es6/* __spread */.fl)([this], args));\n });\n };\n }\n\n case 4:\n {\n return function (err, req, res, next) {\n var _a;\n\n var transaction = res.__sentry_transaction;\n var span = (_a = transaction) === null || _a === void 0 ? void 0 : _a.startChild({\n description: fn.name,\n op: \"middleware.\" + method\n });\n fn.call(this, err, req, res, function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n next.call.apply(next, (0,tslib_es6/* __spread */.fl)([this], args));\n });\n };\n }\n\n default:\n {\n throw new Error(\"Express middleware takes 2-4 arguments. Got: \" + arity);\n }\n }\n}\n/**\n * Takes all the function arguments passed to the original `app` or `router` method, eg. `app.use` or `router.use`\n * and wraps every function, as well as array of functions with a call to our `wrap` method.\n * We have to take care of the arrays as well as iterate over all of the arguments,\n * as `app.use` can accept middlewares in few various forms.\n *\n * app.use([], )\n * app.use([], , ...)\n * app.use([], ...[])\n */\n\n\nfunction wrapMiddlewareArgs(args, method) {\n return args.map(function (arg) {\n if (typeof arg === 'function') {\n return wrap(arg, method);\n }\n\n if (Array.isArray(arg)) {\n return arg.map(function (a) {\n if (typeof a === 'function') {\n return wrap(a, method);\n }\n\n return a;\n });\n }\n\n return arg;\n });\n}\n/**\n * Patches original router to utilize our tracing functionality\n */\n\n\nfunction patchMiddleware(router, method) {\n var originalCallback = router[method];\n\n router[method] = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return originalCallback.call.apply(originalCallback, (0,tslib_es6/* __spread */.fl)([this], wrapMiddlewareArgs(args, method)));\n };\n\n return router;\n}\n/**\n * Patches original router methods\n */\n\n\nfunction instrumentMiddlewares(router, methods) {\n if (methods === void 0) {\n methods = [];\n }\n\n methods.forEach(function (method) {\n return patchMiddleware(router, method);\n });\n}\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/object.js + 1 modules\nvar object = __webpack_require__(150);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/integrations/node/postgres.js\n\n/** Tracing integration for node-postgres package */\n\nvar Postgres =\n/** @class */\nfunction () {\n function Postgres(options) {\n if (options === void 0) {\n options = {};\n }\n /**\n * @inheritDoc\n */\n\n\n this.name = Postgres.id;\n this._usePgNative = !!options.usePgNative;\n }\n /**\n * @inheritDoc\n */\n\n\n Postgres.prototype.setupOnce = function (_, getCurrentHub) {\n var _a;\n\n var pkg = (0,node/* loadModule */.$y)('pg');\n\n if (!pkg) {\n logger/* logger.error */.k.error('Postgres Integration was unable to require `pg` package.');\n return;\n }\n\n if (this._usePgNative && !((_a = pkg.native) === null || _a === void 0 ? void 0 : _a.Client)) {\n logger/* logger.error */.k.error(\"Postgres Integration was unable to access 'pg-native' bindings.\");\n return;\n }\n\n var Client = (this._usePgNative ? pkg.native : pkg).Client;\n /**\n * function (query, callback) => void\n * function (query, params, callback) => void\n * function (query) => Promise\n * function (query, params) => Promise\n * function (pg.Cursor) => pg.Cursor\n */\n\n (0,object/* fill */.hl)(Client.prototype, 'query', function (orig) {\n return function (config, values, callback) {\n var _a, _b, _c;\n\n var scope = getCurrentHub().getScope();\n var parentSpan = (_a = scope) === null || _a === void 0 ? void 0 : _a.getSpan();\n var span = (_b = parentSpan) === null || _b === void 0 ? void 0 : _b.startChild({\n description: typeof config === 'string' ? config : config.text,\n op: \"db\"\n });\n\n if (typeof callback === 'function') {\n return orig.call(this, config, values, function (err, result) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n callback(err, result);\n });\n }\n\n if (typeof values === 'function') {\n return orig.call(this, config, function (err, result) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n values(err, result);\n });\n }\n\n var rv = typeof values !== 'undefined' ? orig.call(this, config, values) : orig.call(this, config);\n\n if ((0,is/* isThenable */.J8)(rv)) {\n return rv.then(function (res) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n return res;\n });\n }\n\n (_c = span) === null || _c === void 0 ? void 0 : _c.finish();\n return rv;\n };\n });\n };\n /**\n * @inheritDoc\n */\n\n\n Postgres.id = 'Postgres';\n return Postgres;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/integrations/node/mysql.js\n\n/** Tracing integration for node-mysql package */\n\nvar Mysql =\n/** @class */\nfunction () {\n function Mysql() {\n /**\n * @inheritDoc\n */\n this.name = Mysql.id;\n }\n /**\n * @inheritDoc\n */\n\n\n Mysql.prototype.setupOnce = function (_, getCurrentHub) {\n var pkg = (0,node/* loadModule */.$y)('mysql/lib/Connection.js');\n\n if (!pkg) {\n logger/* logger.error */.k.error('Mysql Integration was unable to require `mysql` package.');\n return;\n } // The original function will have one of these signatures:\n // function (callback) => void\n // function (options, callback) => void\n // function (options, values, callback) => void\n\n\n (0,object/* fill */.hl)(pkg, 'createQuery', function (orig) {\n return function (options, values, callback) {\n var _a, _b;\n\n var scope = getCurrentHub().getScope();\n var parentSpan = (_a = scope) === null || _a === void 0 ? void 0 : _a.getSpan();\n var span = (_b = parentSpan) === null || _b === void 0 ? void 0 : _b.startChild({\n description: typeof options === 'string' ? options : options.sql,\n op: \"db\"\n });\n\n if (typeof callback === 'function') {\n return orig.call(this, options, values, function (err, result, fields) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n callback(err, result, fields);\n });\n }\n\n if (typeof values === 'function') {\n return orig.call(this, options, function (err, result, fields) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n values(err, result, fields);\n });\n }\n\n return orig.call(this, options, values, callback);\n };\n });\n };\n /**\n * @inheritDoc\n */\n\n\n Mysql.id = 'Mysql';\n return Mysql;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/integrations/node/mongo.js\n\n\nvar OPERATIONS = ['aggregate', 'bulkWrite', 'countDocuments', 'createIndex', 'createIndexes', 'deleteMany', 'deleteOne', 'distinct', 'drop', 'dropIndex', 'dropIndexes', 'estimatedDocumentCount', 'find', 'findOne', 'findOneAndDelete', 'findOneAndReplace', 'findOneAndUpdate', 'indexes', 'indexExists', 'indexInformation', 'initializeOrderedBulkOp', 'insertMany', 'insertOne', 'isCapped', 'mapReduce', 'options', 'parallelCollectionScan', 'rename', 'replaceOne', 'stats', 'updateMany', 'updateOne']; // All of the operations above take `options` and `callback` as their final parameters, but some of them\n// take additional parameters as well. For those operations, this is a map of\n// { : [] }, as a way to know what to call the operation's\n// positional arguments when we add them to the span's `data` object later\n\nvar OPERATION_SIGNATURES = {\n // aggregate intentionally not included because `pipeline` arguments are too complex to serialize well\n // see https://github.com/getsentry/sentry-javascript/pull/3102\n bulkWrite: ['operations'],\n countDocuments: ['query'],\n createIndex: ['fieldOrSpec'],\n createIndexes: ['indexSpecs'],\n deleteMany: ['filter'],\n deleteOne: ['filter'],\n distinct: ['key', 'query'],\n dropIndex: ['indexName'],\n find: ['query'],\n findOne: ['query'],\n findOneAndDelete: ['filter'],\n findOneAndReplace: ['filter', 'replacement'],\n findOneAndUpdate: ['filter', 'update'],\n indexExists: ['indexes'],\n insertMany: ['docs'],\n insertOne: ['doc'],\n mapReduce: ['map', 'reduce'],\n rename: ['newName'],\n replaceOne: ['filter', 'doc'],\n updateMany: ['filter', 'update'],\n updateOne: ['filter', 'update']\n};\n/** Tracing integration for mongo package */\n\nvar Mongo =\n/** @class */\nfunction () {\n /**\n * @inheritDoc\n */\n function Mongo(options) {\n if (options === void 0) {\n options = {};\n }\n /**\n * @inheritDoc\n */\n\n\n this.name = Mongo.id;\n this._operations = Array.isArray(options.operations) ? options.operations : OPERATIONS;\n this._describeOperations = 'describeOperations' in options ? options.describeOperations : true;\n this._useMongoose = !!options.useMongoose;\n }\n /**\n * @inheritDoc\n */\n\n\n Mongo.prototype.setupOnce = function (_, getCurrentHub) {\n var moduleName = this._useMongoose ? 'mongoose' : 'mongodb';\n var pkg = (0,node/* loadModule */.$y)(moduleName);\n\n if (!pkg) {\n logger/* logger.error */.k.error(\"Mongo Integration was unable to require `\" + moduleName + \"` package.\");\n return;\n }\n\n this._instrumentOperations(pkg.Collection, this._operations, getCurrentHub);\n };\n /**\n * Patches original collection methods\n */\n\n\n Mongo.prototype._instrumentOperations = function (collection, operations, getCurrentHub) {\n var _this = this;\n\n operations.forEach(function (operation) {\n return _this._patchOperation(collection, operation, getCurrentHub);\n });\n };\n /**\n * Patches original collection to utilize our tracing functionality\n */\n\n\n Mongo.prototype._patchOperation = function (collection, operation, getCurrentHub) {\n if (!(operation in collection.prototype)) return;\n\n var getSpanContext = this._getSpanContextFromOperationArguments.bind(this);\n\n (0,object/* fill */.hl)(collection.prototype, operation, function (orig) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var _a, _b, _c, _d;\n\n var lastArg = args[args.length - 1];\n var scope = getCurrentHub().getScope();\n var parentSpan = (_a = scope) === null || _a === void 0 ? void 0 : _a.getSpan(); // Check if the operation was passed a callback. (mapReduce requires a different check, as\n // its (non-callback) arguments can also be functions.)\n\n if (typeof lastArg !== 'function' || operation === 'mapReduce' && args.length === 2) {\n var span_1 = (_b = parentSpan) === null || _b === void 0 ? void 0 : _b.startChild(getSpanContext(this, operation, args));\n var maybePromise = orig.call.apply(orig, (0,tslib_es6/* __spread */.fl)([this], args));\n\n if ((0,is/* isThenable */.J8)(maybePromise)) {\n return maybePromise.then(function (res) {\n var _a;\n\n (_a = span_1) === null || _a === void 0 ? void 0 : _a.finish();\n return res;\n });\n } else {\n (_c = span_1) === null || _c === void 0 ? void 0 : _c.finish();\n return maybePromise;\n }\n }\n\n var span = (_d = parentSpan) === null || _d === void 0 ? void 0 : _d.startChild(getSpanContext(this, operation, args.slice(0, -1)));\n return orig.call.apply(orig, (0,tslib_es6/* __spread */.fl)([this], args.slice(0, -1), [function (err, result) {\n var _a;\n\n (_a = span) === null || _a === void 0 ? void 0 : _a.finish();\n lastArg(err, result);\n }]));\n };\n });\n };\n /**\n * Form a SpanContext based on the user input to a given operation.\n */\n\n\n Mongo.prototype._getSpanContextFromOperationArguments = function (collection, operation, args) {\n var data = {\n collectionName: collection.collectionName,\n dbName: collection.dbName,\n namespace: collection.namespace\n };\n var spanContext = {\n op: \"db\",\n description: operation,\n data: data\n }; // If the operation takes no arguments besides `options` and `callback`, or if argument\n // collection is disabled for this operation, just return early.\n\n var signature = OPERATION_SIGNATURES[operation];\n var shouldDescribe = Array.isArray(this._describeOperations) ? this._describeOperations.includes(operation) : this._describeOperations;\n\n if (!signature || !shouldDescribe) {\n return spanContext;\n }\n\n try {\n // Special case for `mapReduce`, as the only one accepting functions as arguments.\n if (operation === 'mapReduce') {\n var _a = (0,tslib_es6/* __read */.CR)(args, 2),\n map = _a[0],\n reduce = _a[1];\n\n data[signature[0]] = typeof map === 'string' ? map : map.name || '';\n data[signature[1]] = typeof reduce === 'string' ? reduce : reduce.name || '';\n } else {\n for (var i = 0; i < signature.length; i++) {\n data[signature[i]] = JSON.stringify(args[i]);\n }\n }\n } catch (_oO) {// no-empty\n }\n\n return spanContext;\n };\n /**\n * @inheritDoc\n */\n\n\n Mongo.id = 'Mongo';\n return Mongo;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/integrations/index.js\n\n\n\n\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/span.js\nvar span = __webpack_require__(6369);\n// EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/transaction.js\nvar transaction = __webpack_require__(5955);\n;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/index.js\n\n\n\n\n\nvar Integrations = (0,tslib_es6/* __assign */.pi)((0,tslib_es6/* __assign */.pi)({}, integrations_namespaceObject), {\n BrowserTracing: BrowserTracing\n});\n\n\n\n\n\n\n\n // We are patching the global object with our hub extension methods\n\n(0,hubextensions/* addExtensionMethods */.ro)();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvYmFja2dyb3VuZHRhYi5qcz9kYjIxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vYnJvd3Nlci93ZWItdml0YWxzL2xpYi9iaW5kUmVwb3J0ZXIuanM/NDAxMyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvZ2VuZXJhdGVVbmlxdWVJRC5qcz81MDRhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vYnJvd3Nlci93ZWItdml0YWxzL2xpYi9pbml0TWV0cmljLmpzP2NmZmEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL2VzbS9icm93c2VyL3dlYi12aXRhbHMvbGliL29ic2VydmUuanM/MTE4ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvb25IaWRkZW4uanM/ZjA3NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRDTFMuanM/ODhjYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXIuanM/MWJjMyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRGSUQuanM/MmY2OCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRMQ1AuanM/NzZkMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2Jyb3dzZXIvbWV0cmljcy5qcz9iZDQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vYnJvd3Nlci9yZXF1ZXN0LmpzPzY3YTciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL2VzbS9icm93c2VyL3JvdXRlci5qcz81YjE4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vYnJvd3Nlci9icm93c2VydHJhY2luZy5qcz8zZmNkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vaW50ZWdyYXRpb25zL25vZGUvZXhwcmVzcy5qcz81NWM0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vaW50ZWdyYXRpb25zL25vZGUvcG9zdGdyZXMuanM/YWUwZSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL2ludGVncmF0aW9ucy9ub2RlL215c3FsLmpzPzEyYWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL2VzbS9pbnRlZ3JhdGlvbnMvbm9kZS9tb25nby5qcz9jZTkzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9lc20vaW50ZWdyYXRpb25zL2luZGV4LmpzP2UyNjIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL2VzbS9pbmRleC5qcz8yMzBjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBd0Q7QUFDYjtBQUNLO0FBQ2hELGFBQWEsZ0NBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsOEJBQThCLHNDQUFvQjs7QUFFbEQ7QUFDQSxRQUFRLDRCQUFVLDZCQUE2QixnREFBb0IseUVBQXlFO0FBQzVJOztBQUVBO0FBQ0Esc0NBQXNDLGdEQUFvQjtBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILElBQUksOEJBQVc7QUFDZjtBQUNBLEM7Ozs7Ozs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNPO0FBQ1A7QUFDQSxFOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDc0Q7QUFDL0M7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnQkFBZ0I7QUFDeEI7QUFDQSxFOztBQ3hCQTtBQUNB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QUNBLEtBQUssY0FBYztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQzs7OztBQ3pMd0M7QUFDRTtBQUNOOzs7Ozs7O0FDRko7QUFDVTtBQUNXO0FBQ0E7O0FBRXRELG1CQUFtQiw4QkFBUSxDQUFDLDhCQUFRLEdBQUcsRUFBRSw0QkFBbUI7QUFDNUQsa0JBQWtCLGNBQWM7QUFDaEMsQ0FBQzs7QUFFdUI7QUFDTTtBQUNjO0FBRTBFO0FBQzVFO0FBQ1U7QUFDRzs7QUFFdkQsNkNBQW1CO0FBQ1kiLCJmaWxlIjoiNzM3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBTcGFuU3RhdHVzIH0gZnJvbSAnLi4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgdGhhdCBjYW5jZWxzIGFuZCBmaW5pc2hlcyBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlIGdsb2JhbFxuICogZG9jdW1lbnQgaXMgaGlkZGVuLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJhY2tncm91bmRUYWJEZXRlY3Rpb24oKSB7XG4gIGlmIChnbG9iYWwgJiYgZ2xvYmFsLmRvY3VtZW50KSB7XG4gICAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuXG4gICAgICBpZiAoZ2xvYmFsLmRvY3VtZW50LmhpZGRlbiAmJiBhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgICAgICBsb2dnZXIubG9nKFwiW1RyYWNpbmddIFRyYW5zYWN0aW9uOiBcIiArIFNwYW5TdGF0dXMuQ2FuY2VsbGVkICsgXCIgLT4gc2luY2UgdGFiIG1vdmVkIHRvIHRoZSBiYWNrZ3JvdW5kLCBvcDogXCIgKyBhY3RpdmVUcmFuc2FjdGlvbi5vcCk7IC8vIFdlIHNob3VsZCBub3Qgc2V0IHN0YXR1cyBpZiBpdCBpcyBhbHJlYWR5IHNldCwgdGhpcyBwcmV2ZW50IGltcG9ydGFudCBzdGF0dXNlcyBsaWtlXG4gICAgICAgIC8vIGVycm9yIG9yIGRhdGEgbG9zcyBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIG9uIHRyYW5zYWN0aW9uLlxuXG4gICAgICAgIGlmICghYWN0aXZlVHJhbnNhY3Rpb24uc3RhdHVzKSB7XG4gICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uc2V0U3RhdHVzKFNwYW5TdGF0dXMuQ2FuY2VsbGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFRhZygndmlzaWJpbGl0eWNoYW5nZScsICdkb2N1bWVudC5oaWRkZW4nKTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tUcmFjaW5nXSBDb3VsZCBub3Qgc2V0IHVwIGJhY2tncm91bmQgdGFiIGRldGVjdGlvbiBkdWUgdG8gbGFjayBvZiBnbG9iYWwgZG9jdW1lbnQnKTtcbiAgfVxufSIsIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IHZhciBiaW5kUmVwb3J0ZXIgPSBmdW5jdGlvbiBiaW5kUmVwb3J0ZXIoY2FsbGJhY2ssIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcykge1xuICB2YXIgcHJldlZhbHVlO1xuICByZXR1cm4gZnVuY3Rpb24gKGZvcmNlUmVwb3J0KSB7XG4gICAgaWYgKG1ldHJpYy52YWx1ZSA+PSAwKSB7XG4gICAgICBpZiAoZm9yY2VSZXBvcnQgfHwgcmVwb3J0QWxsQ2hhbmdlcykge1xuICAgICAgICBtZXRyaWMuZGVsdGEgPSBtZXRyaWMudmFsdWUgLSAocHJldlZhbHVlIHx8IDApOyAvLyBSZXBvcnQgdGhlIG1ldHJpYyBpZiB0aGVyZSdzIGEgbm9uLXplcm8gZGVsdGEgb3IgaWYgbm8gcHJldmlvdXNcbiAgICAgICAgLy8gdmFsdWUgZXhpc3RzICh3aGljaCBjYW4gaGFwcGVuIGluIHRoZSBjYXNlIG9mIHRoZSBkb2N1bWVudCBiZWNvbWluZ1xuICAgICAgICAvLyBoaWRkZW4gd2hlbiB0aGUgbWV0cmljIHZhbHVlIGlzIDApLlxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvd2ViLXZpdGFscy9pc3N1ZXMvMTRcblxuICAgICAgICBpZiAobWV0cmljLmRlbHRhIHx8IHByZXZWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJldlZhbHVlID0gbWV0cmljLnZhbHVlO1xuICAgICAgICAgIGNhbGxiYWNrKG1ldHJpYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59OyIsIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1hbnRseSBnZW5lcmF0ZSBhIHVuaXF1ZSwgMzAtY2hhciBzdHJpbmcgYnkgY29tYmluaW5nIGEgdmVyc2lvblxuICogbnVtYmVyLCB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2l0aCBhIDEzLWRpZ2l0IG51bWJlciBpbnRlZ2VyLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgdmFyIGdlbmVyYXRlVW5pcXVlSUQgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlEKCkge1xuICByZXR1cm4gXCJ2Mi1cIiArIERhdGUubm93KCkgKyBcIi1cIiArIChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoOWUxMiAtIDEpKSArIDFlMTIpO1xufTsiLCIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSUQgfSBmcm9tICcuL2dlbmVyYXRlVW5pcXVlSUQnO1xuZXhwb3J0IHZhciBpbml0TWV0cmljID0gZnVuY3Rpb24gaW5pdE1ldHJpYyhuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgPyB2YWx1ZSA6IC0xLFxuICAgIGRlbHRhOiAwLFxuICAgIGVudHJpZXM6IFtdLFxuICAgIGlkOiBnZW5lcmF0ZVVuaXF1ZUlEKClcbiAgfTtcbn07IiwiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogVGFrZXMgYSBwZXJmb3JtYW5jZSBlbnRyeSB0eXBlIGFuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBhbmQgY3JlYXRlcyBhXG4gKiBgUGVyZm9ybWFuY2VPYnNlcnZlcmAgaW5zdGFuY2UgdGhhdCB3aWxsIG9ic2VydmUgdGhlIHNwZWNpZmllZCBlbnRyeSB0eXBlXG4gKiB3aXRoIGJ1ZmZlcmluZyBlbmFibGVkIGFuZCBjYWxsIHRoZSBjYWxsYmFjayBfZm9yIGVhY2ggZW50cnlfLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmZWF0dXJlLWRldGVjdHMgZW50cnkgc3VwcG9ydCBhbmQgd3JhcHMgdGhlIGxvZ2ljIGluIGFcbiAqIHRyeS9jYXRjaCB0byBhdm9pZCBlcnJvcnMgaW4gdW5zdXBwb3J0aW5nIGJyb3dzZXJzLlxuICovXG5leHBvcnQgdmFyIG9ic2VydmUgPSBmdW5jdGlvbiBvYnNlcnZlKHR5cGUsIGNhbGxiYWNrKSB7XG4gIHRyeSB7XG4gICAgaWYgKFBlcmZvcm1hbmNlT2JzZXJ2ZXIuc3VwcG9ydGVkRW50cnlUeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgLy8gTW9yZSBleHRlbnNpdmUgZmVhdHVyZSBkZXRlY3QgbmVlZGVkIGZvciBGaXJlZm94IGR1ZSB0bzpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvd2ViLXZpdGFscy9pc3N1ZXMvMTQyXG4gICAgICBpZiAodHlwZSA9PT0gJ2ZpcnN0LWlucHV0JyAmJiAhKCdQZXJmb3JtYW5jZUV2ZW50VGltaW5nJyBpbiBzZWxmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwbyA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgIHJldHVybiBsLmdldEVudHJpZXMoKS5tYXAoY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgICBwby5vYnNlcnZlKHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgYnVmZmVyZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBvO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgey8vIERvIG5vdGhpbmcuXG4gIH1cblxuICByZXR1cm47XG59OyIsIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5leHBvcnQgdmFyIG9uSGlkZGVuID0gZnVuY3Rpb24gb25IaWRkZW4oY2IsIG9uY2UpIHtcbiAgdmFyIG9uSGlkZGVuT3JQYWdlSGlkZSA9IGZ1bmN0aW9uIG9uSGlkZGVuT3JQYWdlSGlkZShldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09PSAncGFnZWhpZGUnIHx8IGdldEdsb2JhbE9iamVjdCgpLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgIGNiKGV2ZW50KTtcblxuICAgICAgaWYgKG9uY2UpIHtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uSGlkZGVuT3JQYWdlSGlkZSwgdHJ1ZSk7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25IaWRkZW5PclBhZ2VIaWRlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uSGlkZGVuT3JQYWdlSGlkZSwgdHJ1ZSk7IC8vIFNvbWUgYnJvd3NlcnMgaGF2ZSBidWdneSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlzaWJpbGl0eWNoYW5nZSxcbiAgLy8gc28gd2UgdXNlIHBhZ2VoaWRlIGluIGFkZGl0aW9uLCBqdXN0IHRvIGJlIHNhZmUuXG5cbiAgYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xufTsiLCIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBpbml0TWV0cmljIH0gZnJvbSAnLi9saWIvaW5pdE1ldHJpYyc7XG5pbXBvcnQgeyBvYnNlcnZlIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmV4cG9ydCB2YXIgZ2V0Q0xTID0gZnVuY3Rpb24gZ2V0Q0xTKG9uUmVwb3J0LCByZXBvcnRBbGxDaGFuZ2VzKSB7XG4gIHZhciBtZXRyaWMgPSBpbml0TWV0cmljKCdDTFMnLCAwKTtcbiAgdmFyIHJlcG9ydDtcbiAgdmFyIHNlc3Npb25WYWx1ZSA9IDA7XG4gIHZhciBzZXNzaW9uRW50cmllcyA9IFtdO1xuXG4gIHZhciBlbnRyeUhhbmRsZXIgPSBmdW5jdGlvbiBlbnRyeUhhbmRsZXIoZW50cnkpIHtcbiAgICAvLyBPbmx5IGNvdW50IGxheW91dCBzaGlmdHMgd2l0aG91dCByZWNlbnQgdXNlciBpbnB1dC5cbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBlbnRyeSBjYW4gYmUgdW5kZWZpbmVkXG4gICAgaWYgKGVudHJ5ICYmICFlbnRyeS5oYWRSZWNlbnRJbnB1dCkge1xuICAgICAgdmFyIGZpcnN0U2Vzc2lvbkVudHJ5ID0gc2Vzc2lvbkVudHJpZXNbMF07XG4gICAgICB2YXIgbGFzdFNlc3Npb25FbnRyeSA9IHNlc3Npb25FbnRyaWVzW3Nlc3Npb25FbnRyaWVzLmxlbmd0aCAtIDFdOyAvLyBJZiB0aGUgZW50cnkgb2NjdXJyZWQgbGVzcyB0aGFuIDEgc2Vjb25kIGFmdGVyIHRoZSBwcmV2aW91cyBlbnRyeSBhbmRcbiAgICAgIC8vIGxlc3MgdGhhbiA1IHNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzZXNzaW9uLCBpbmNsdWRlIHRoZVxuICAgICAgLy8gZW50cnkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gT3RoZXJ3aXNlLCBzdGFydCBhIG5ldyBzZXNzaW9uLlxuXG4gICAgICBpZiAoc2Vzc2lvblZhbHVlICYmIHNlc3Npb25FbnRyaWVzLmxlbmd0aCAhPT0gMCAmJiBlbnRyeS5zdGFydFRpbWUgLSBsYXN0U2Vzc2lvbkVudHJ5LnN0YXJ0VGltZSA8IDEwMDAgJiYgZW50cnkuc3RhcnRUaW1lIC0gZmlyc3RTZXNzaW9uRW50cnkuc3RhcnRUaW1lIDwgNTAwMCkge1xuICAgICAgICBzZXNzaW9uVmFsdWUgKz0gZW50cnkudmFsdWU7XG4gICAgICAgIHNlc3Npb25FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vzc2lvblZhbHVlID0gZW50cnkudmFsdWU7XG4gICAgICAgIHNlc3Npb25FbnRyaWVzID0gW2VudHJ5XTtcbiAgICAgIH0gLy8gSWYgdGhlIGN1cnJlbnQgc2Vzc2lvbiB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBDTFMgdmFsdWUsXG4gICAgICAvLyB1cGRhdGUgQ0xTIGFuZCB0aGUgZW50cmllcyBjb250cmlidXRpbmcgdG8gaXQuXG5cblxuICAgICAgaWYgKHNlc3Npb25WYWx1ZSA+IG1ldHJpYy52YWx1ZSkge1xuICAgICAgICBtZXRyaWMudmFsdWUgPSBzZXNzaW9uVmFsdWU7XG4gICAgICAgIG1ldHJpYy5lbnRyaWVzID0gc2Vzc2lvbkVudHJpZXM7XG5cbiAgICAgICAgaWYgKHJlcG9ydCkge1xuICAgICAgICAgIHJlcG9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBwbyA9IG9ic2VydmUoJ2xheW91dC1zaGlmdCcsIGVudHJ5SGFuZGxlcik7XG5cbiAgaWYgKHBvKSB7XG4gICAgcmVwb3J0ID0gYmluZFJlcG9ydGVyKG9uUmVwb3J0LCBtZXRyaWMsIHJlcG9ydEFsbENoYW5nZXMpO1xuICAgIG9uSGlkZGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlcik7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfSk7XG4gIH1cbn07IiwiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IG9uSGlkZGVuIH0gZnJvbSAnLi9vbkhpZGRlbic7XG52YXIgZmlyc3RIaWRkZW5UaW1lID0gLTE7XG5cbnZhciBpbml0SGlkZGVuVGltZSA9IGZ1bmN0aW9uIGluaXRIaWRkZW5UaW1lKCkge1xuICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0KCkuZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJyA/IDAgOiBJbmZpbml0eTtcbn07XG5cbnZhciB0cmFja0NoYW5nZXMgPSBmdW5jdGlvbiB0cmFja0NoYW5nZXMoKSB7XG4gIC8vIFVwZGF0ZSB0aGUgdGltZSBpZi93aGVuIHRoZSBkb2N1bWVudCBiZWNvbWVzIGhpZGRlbi5cbiAgb25IaWRkZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHRpbWVTdGFtcCA9IF9hLnRpbWVTdGFtcDtcbiAgICBmaXJzdEhpZGRlblRpbWUgPSB0aW1lU3RhbXA7XG4gIH0sIHRydWUpO1xufTtcblxuZXhwb3J0IHZhciBnZXRWaXNpYmlsaXR5V2F0Y2hlciA9IGZ1bmN0aW9uIGdldFZpc2liaWxpdHlXYXRjaGVyKCkge1xuICBpZiAoZmlyc3RIaWRkZW5UaW1lIDwgMCkge1xuICAgIC8vIElmIHRoZSBkb2N1bWVudCBpcyBoaWRkZW4gd2hlbiB0aGlzIGNvZGUgcnVucywgYXNzdW1lIGl0IHdhcyBoaWRkZW5cbiAgICAvLyBzaW5jZSBuYXZpZ2F0aW9uIHN0YXJ0LiBUaGlzIGlzbid0IGEgcGVyZmVjdCBoZXVyaXN0aWMsIGJ1dCBpdCdzIHRoZVxuICAgIC8vIGJlc3Qgd2UgY2FuIGRvIHVudGlsIGFuIEFQSSBpcyBhdmFpbGFibGUgdG8gc3VwcG9ydCBxdWVyeWluZyBwYXN0XG4gICAgLy8gdmlzaWJpbGl0eVN0YXRlLlxuICAgIGZpcnN0SGlkZGVuVGltZSA9IGluaXRIaWRkZW5UaW1lKCk7XG4gICAgdHJhY2tDaGFuZ2VzKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldCBmaXJzdEhpZGRlblRpbWUoKSB7XG4gICAgICByZXR1cm4gZmlyc3RIaWRkZW5UaW1lO1xuICAgIH1cblxuICB9O1xufTsiLCIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUgfSBmcm9tICcuL2xpYi9vYnNlcnZlJztcbmltcG9ydCB7IG9uSGlkZGVuIH0gZnJvbSAnLi9saWIvb25IaWRkZW4nO1xuZXhwb3J0IHZhciBnZXRGSUQgPSBmdW5jdGlvbiBnZXRGSUQob25SZXBvcnQsIHJlcG9ydEFsbENoYW5nZXMpIHtcbiAgdmFyIHZpc2liaWxpdHlXYXRjaGVyID0gZ2V0VmlzaWJpbGl0eVdhdGNoZXIoKTtcbiAgdmFyIG1ldHJpYyA9IGluaXRNZXRyaWMoJ0ZJRCcpO1xuICB2YXIgcmVwb3J0O1xuXG4gIHZhciBlbnRyeUhhbmRsZXIgPSBmdW5jdGlvbiBlbnRyeUhhbmRsZXIoZW50cnkpIHtcbiAgICAvLyBPbmx5IHJlcG9ydCBpZiB0aGUgcGFnZSB3YXNuJ3QgaGlkZGVuIHByaW9yIHRvIHRoZSBmaXJzdCBpbnB1dC5cbiAgICBpZiAocmVwb3J0ICYmIGVudHJ5LnN0YXJ0VGltZSA8IHZpc2liaWxpdHlXYXRjaGVyLmZpcnN0SGlkZGVuVGltZSkge1xuICAgICAgbWV0cmljLnZhbHVlID0gZW50cnkucHJvY2Vzc2luZ1N0YXJ0IC0gZW50cnkuc3RhcnRUaW1lO1xuICAgICAgbWV0cmljLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwbyA9IG9ic2VydmUoJ2ZpcnN0LWlucHV0JywgZW50cnlIYW5kbGVyKTtcblxuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG4gICAgb25IaWRkZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcG8udGFrZVJlY29yZHMoKS5tYXAoZW50cnlIYW5kbGVyKTtcbiAgICAgIHBvLmRpc2Nvbm5lY3QoKTtcbiAgICB9LCB0cnVlKTtcbiAgfVxufTsiLCIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUgfSBmcm9tICcuL2xpYi9vYnNlcnZlJztcbmltcG9ydCB7IG9uSGlkZGVuIH0gZnJvbSAnLi9saWIvb25IaWRkZW4nO1xudmFyIHJlcG9ydGVkTWV0cmljSURzID0ge307XG5leHBvcnQgdmFyIGdldExDUCA9IGZ1bmN0aW9uIGdldExDUChvblJlcG9ydCwgcmVwb3J0QWxsQ2hhbmdlcykge1xuICB2YXIgdmlzaWJpbGl0eVdhdGNoZXIgPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICB2YXIgbWV0cmljID0gaW5pdE1ldHJpYygnTENQJyk7XG4gIHZhciByZXBvcnQ7XG5cbiAgdmFyIGVudHJ5SGFuZGxlciA9IGZ1bmN0aW9uIGVudHJ5SGFuZGxlcihlbnRyeSkge1xuICAgIC8vIFRoZSBzdGFydFRpbWUgYXR0cmlidXRlIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSByZW5kZXJUaW1lIGlmIGl0IGlzIG5vdCAwLFxuICAgIC8vIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGxvYWRUaW1lIG90aGVyd2lzZS5cbiAgICB2YXIgdmFsdWUgPSBlbnRyeS5zdGFydFRpbWU7IC8vIElmIHRoZSBwYWdlIHdhcyBoaWRkZW4gcHJpb3IgdG8gcGFpbnQgdGltZSBvZiB0aGUgZW50cnksXG4gICAgLy8gaWdub3JlIGl0IGFuZCBtYXJrIHRoZSBtZXRyaWMgYXMgZmluYWwsIG90aGVyd2lzZSBhZGQgdGhlIGVudHJ5LlxuXG4gICAgaWYgKHZhbHVlIDwgdmlzaWJpbGl0eVdhdGNoZXIuZmlyc3RIaWRkZW5UaW1lKSB7XG4gICAgICBtZXRyaWMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG1ldHJpYy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIHJlcG9ydCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcG8gPSBvYnNlcnZlKCdsYXJnZXN0LWNvbnRlbnRmdWwtcGFpbnQnLCBlbnRyeUhhbmRsZXIpO1xuXG4gIGlmIChwbykge1xuICAgIHJlcG9ydCA9IGJpbmRSZXBvcnRlcihvblJlcG9ydCwgbWV0cmljLCByZXBvcnRBbGxDaGFuZ2VzKTtcblxuICAgIHZhciBzdG9wTGlzdGVuaW5nXzEgPSBmdW5jdGlvbiBzdG9wTGlzdGVuaW5nXzEoKSB7XG4gICAgICBpZiAoIXJlcG9ydGVkTWV0cmljSURzW21ldHJpYy5pZF0pIHtcbiAgICAgICAgcG8udGFrZVJlY29yZHMoKS5tYXAoZW50cnlIYW5kbGVyKTtcbiAgICAgICAgcG8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZXBvcnRlZE1ldHJpY0lEc1ttZXRyaWMuaWRdID0gdHJ1ZTtcbiAgICAgICAgcmVwb3J0KHRydWUpO1xuICAgICAgfVxuICAgIH07IC8vIFN0b3AgbGlzdGVuaW5nIGFmdGVyIGlucHV0LiBOb3RlOiB3aGlsZSBzY3JvbGxpbmcgaXMgYW4gaW5wdXQgdGhhdFxuICAgIC8vIHN0b3AgTENQIG9ic2VydmF0aW9uLCBpdCdzIHVucmVsaWFibGUgc2luY2UgaXQgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHlcbiAgICAvLyBnZW5lcmF0ZWQuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS93ZWItdml0YWxzL2lzc3Vlcy83NVxuXG5cbiAgICBbJ2tleWRvd24nLCAnY2xpY2snXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIHN0b3BMaXN0ZW5pbmdfMSwge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBjYXB0dXJlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBvbkhpZGRlbihzdG9wTGlzdGVuaW5nXzEsIHRydWUpO1xuICB9XG59OyIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4sIGdldEdsb2JhbE9iamVjdCwgaHRtbFRyZWVBc1N0cmluZywgaXNOb2RlRW52LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IG1zVG9TZWMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDTFMgfSBmcm9tICcuL3dlYi12aXRhbHMvZ2V0Q0xTJztcbmltcG9ydCB7IGdldEZJRCB9IGZyb20gJy4vd2ViLXZpdGFscy9nZXRGSUQnO1xuaW1wb3J0IHsgZ2V0TENQIH0gZnJvbSAnLi93ZWItdml0YWxzL2dldExDUCc7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vd2ViLXZpdGFscy9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXInO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuZXhwb3J0IHZhciBERUZBVUxUX01FVFJJQ1NfSU5TVFJfT1BUSU9OUyA9IHtcbiAgX3JlcG9ydEFsbENoYW5nZXM6IGZhbHNlXG59O1xuLyoqIENsYXNzIHRyYWNraW5nIG1ldHJpY3MgICovXG5cbnZhciBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWV0cmljc0luc3RydW1lbnRhdGlvbihfb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG5cbiAgICB0aGlzLl9tZWFzdXJlbWVudHMgPSB7fTtcbiAgICB0aGlzLl9wZXJmb3JtYW5jZUN1cnNvciA9IDA7XG5cbiAgICBpZiAoIWlzTm9kZUVudigpICYmICgoX2EgPSBnbG9iYWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wZXJmb3JtYW5jZSkgJiYgKChfYiA9IGdsb2JhbCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRvY3VtZW50KSkge1xuICAgICAgaWYgKGdsb2JhbC5wZXJmb3JtYW5jZS5tYXJrKSB7XG4gICAgICAgIGdsb2JhbC5wZXJmb3JtYW5jZS5tYXJrKCdzZW50cnktdHJhY2luZy1pbml0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyYWNrQ0xTKCk7XG5cbiAgICAgIHRoaXMuX3RyYWNrTENQKF9vcHRpb25zLl9yZXBvcnRBbGxDaGFuZ2VzKTtcblxuICAgICAgdGhpcy5fdHJhY2tGSUQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEFkZCBwZXJmb3JtYW5jZSByZWxhdGVkIHNwYW5zIHRvIGEgdHJhbnNhY3Rpb24gKi9cblxuXG4gIE1ldHJpY3NJbnN0cnVtZW50YXRpb24ucHJvdG90eXBlLmFkZFBlcmZvcm1hbmNlRW50cmllcyA9IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIWdsb2JhbCB8fCAhZ2xvYmFsLnBlcmZvcm1hbmNlIHx8ICFnbG9iYWwucGVyZm9ybWFuY2UuZ2V0RW50cmllcyB8fCAhYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbikge1xuICAgICAgLy8gR2F0ZWtlZXBlciBpZiBwZXJmb3JtYW5jZSBBUEkgbm90IGF2YWlsYWJsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBBZGRpbmcgJiBhZGp1c3Rpbmcgc3BhbnMgdXNpbmcgUGVyZm9ybWFuY2UgQVBJJyk7XG4gICAgdmFyIHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pO1xuICAgIHZhciBlbnRyeVNjcmlwdFNyYztcblxuICAgIGlmIChnbG9iYWwuZG9jdW1lbnQgJiYgZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWwuZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBXZSBnbyB0aHJvdWdoIGFsbCBzY3JpcHRzIG9uIHRoZSBwYWdlIGFuZCBsb29rIGZvciAnZGF0YS1lbnRyeSdcbiAgICAgICAgLy8gV2UgcmVtZW1iZXIgdGhlIG5hbWUgYW5kIG1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbiB0aGlzIHNjcmlwdCBmaW5pc2hlZCBsb2FkaW5nIGFuZFxuICAgICAgICAvLyBvdXIgbWFyayAnc2VudHJ5LXRyYWNpbmctaW5pdCdcbiAgICAgICAgaWYgKGdsb2JhbC5kb2N1bWVudC5zY3JpcHRzW2ldLmRhdGFzZXQuZW50cnkgPT09ICd0cnVlJykge1xuICAgICAgICAgIGVudHJ5U2NyaXB0U3JjID0gZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHNbaV0uc3JjO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXA7XG4gICAgdmFyIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZTtcbiAgICB2YXIgcmVzcG9uc2VTdGFydFRpbWVzdGFtcDtcbiAgICB2YXIgcmVxdWVzdFN0YXJ0VGltZXN0YW1wO1xuICAgIGdsb2JhbC5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzKCkuc2xpY2UodGhpcy5fcGVyZm9ybWFuY2VDdXJzb3IpLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICB2YXIgc3RhcnRUaW1lID0gbXNUb1NlYyhlbnRyeS5zdGFydFRpbWUpO1xuICAgICAgdmFyIGR1cmF0aW9uID0gbXNUb1NlYyhlbnRyeS5kdXJhdGlvbik7XG5cbiAgICAgIGlmICh0cmFuc2FjdGlvbi5vcCA9PT0gJ25hdmlnYXRpb24nICYmIHRpbWVPcmlnaW4gKyBzdGFydFRpbWUgPCB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZW50cnkuZW50cnlUeXBlKSB7XG4gICAgICAgIGNhc2UgJ25hdmlnYXRpb24nOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZE5hdmlnYXRpb25TcGFucyh0cmFuc2FjdGlvbiwgZW50cnksIHRpbWVPcmlnaW4pO1xuICAgICAgICAgICAgcmVzcG9uc2VTdGFydFRpbWVzdGFtcCA9IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlc3BvbnNlU3RhcnQpO1xuICAgICAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXN0YW1wID0gdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVxdWVzdFN0YXJ0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICdtYXJrJzpcbiAgICAgICAgY2FzZSAncGFpbnQnOlxuICAgICAgICBjYXNlICdtZWFzdXJlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc3RhcnRUaW1lc3RhbXAgPSBhZGRNZWFzdXJlU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCBzdGFydFRpbWUsIGR1cmF0aW9uLCB0aW1lT3JpZ2luKTtcblxuICAgICAgICAgICAgaWYgKHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSA9PT0gdW5kZWZpbmVkICYmIGVudHJ5Lm5hbWUgPT09ICdzZW50cnktdHJhY2luZy1pbml0Jykge1xuICAgICAgICAgICAgICB0cmFjaW5nSW5pdE1hcmtTdGFydFRpbWUgPSBzdGFydFRpbWVzdGFtcDtcbiAgICAgICAgICAgIH0gLy8gY2FwdHVyZSB3ZWIgdml0YWxzXG5cblxuICAgICAgICAgICAgdmFyIGZpcnN0SGlkZGVuID0gZ2V0VmlzaWJpbGl0eVdhdGNoZXIoKTsgLy8gT25seSByZXBvcnQgaWYgdGhlIHBhZ2Ugd2Fzbid0IGhpZGRlbiBwcmlvciB0byB0aGUgd2ViIHZpdGFsLlxuXG4gICAgICAgICAgICB2YXIgc2hvdWxkUmVjb3JkID0gZW50cnkuc3RhcnRUaW1lIDwgZmlyc3RIaWRkZW4uZmlyc3RIaWRkZW5UaW1lO1xuXG4gICAgICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gJ2ZpcnN0LXBhaW50JyAmJiBzaG91bGRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIEZQJyk7XG4gICAgICAgICAgICAgIF90aGlzLl9tZWFzdXJlbWVudHNbJ2ZwJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBfdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZwJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXJ0VGltZXN0YW1wXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS5uYW1lID09PSAnZmlyc3QtY29udGVudGZ1bC1wYWludCcgJiYgc2hvdWxkUmVjb3JkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBGQ1AnKTtcbiAgICAgICAgICAgICAgX3RoaXMuX21lYXN1cmVtZW50c1snZmNwJ10gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBfdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZjcCddID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzdGFydFRpbWVzdGFtcFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAncmVzb3VyY2UnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoZ2xvYmFsLmxvY2F0aW9uLm9yaWdpbiwgJycpO1xuICAgICAgICAgICAgdmFyIGVuZFRpbWVzdGFtcCA9IGFkZFJlc291cmNlU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCByZXNvdXJjZU5hbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24sIHRpbWVPcmlnaW4pOyAvLyBXZSByZW1lbWJlciB0aGUgZW50cnkgc2NyaXB0IGVuZCB0aW1lIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSB0byB0aGUgZmlyc3QgaW5pdCBtYXJrXG5cbiAgICAgICAgICAgIGlmIChlbnRyeVNjcmlwdFN0YXJ0VGltZXN0YW1wID09PSB1bmRlZmluZWQgJiYgKGVudHJ5U2NyaXB0U3JjIHx8ICcnKS5pbmRleE9mKHJlc291cmNlTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICBlbnRyeVNjcmlwdFN0YXJ0VGltZXN0YW1wID0gZW5kVGltZXN0YW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDogLy8gSWdub3JlIG90aGVyIGVudHJ5IHR5cGVzLlxuXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ2V2YWx1YXRpb24nLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSxcbiAgICAgICAgb3A6ICdzY3JpcHQnLFxuICAgICAgICBzdGFydFRpbWVzdGFtcDogZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGVyZm9ybWFuY2VDdXJzb3IgPSBNYXRoLm1heChwZXJmb3JtYW5jZS5nZXRFbnRyaWVzKCkubGVuZ3RoIC0gMSwgMCk7XG5cbiAgICB0aGlzLl90cmFja05hdmlnYXRvcih0cmFuc2FjdGlvbik7IC8vIE1lYXN1cmVtZW50cyBhcmUgb25seSBhdmFpbGFibGUgZm9yIHBhZ2Vsb2FkIHRyYW5zYWN0aW9uc1xuXG5cbiAgICBpZiAodHJhbnNhY3Rpb24ub3AgPT09ICdwYWdlbG9hZCcpIHtcbiAgICAgIC8vIG5vcm1hbGl6ZSBhcHBsaWNhYmxlIHdlYiB2aXRhbCB2YWx1ZXMgdG8gYmUgcmVsYXRpdmUgdG8gdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXBcbiAgICAgIHZhciB0aW1lT3JpZ2luXzEgPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pOyAvLyBHZW5lcmF0ZSBUVEZCIChUaW1lIHRvIEZpcnN0IEJ5dGUpLCB3aGljaCBtZWFzdXJlZCBhcyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zYWN0aW9uIGFuZCB0aGVcbiAgICAgIC8vIHN0YXJ0IG9mIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHNcblxuICAgICAgaWYgKHR5cGVvZiByZXNwb25zZVN0YXJ0VGltZXN0YW1wID09PSAnbnVtYmVyJykge1xuICAgICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgVFRGQicpO1xuICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ3R0ZmInXSA9IHtcbiAgICAgICAgICB2YWx1ZTogKHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgLSB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCkgKiAxMDAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0U3RhcnRUaW1lc3RhbXAgPT09ICdudW1iZXInICYmIHJlcXVlc3RTdGFydFRpbWVzdGFtcCA8PSByZXNwb25zZVN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgdGltZSBzcGVudCBtYWtpbmcgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWyd0dGZiLnJlcXVlc3RUaW1lJ10gPSB7XG4gICAgICAgICAgICB2YWx1ZTogKHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgLSByZXF1ZXN0U3RhcnRUaW1lc3RhbXApICogMTAwMFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgWydmY3AnLCAnZnAnLCAnbGNwJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAoIV90aGlzLl9tZWFzdXJlbWVudHNbbmFtZV0gfHwgdGltZU9yaWdpbl8xID49IHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSB3ZWIgdml0YWxzLCBmY3AsIGZwLCBsY3AsIGFuZCB0dGZiLCBhbGwgbWVhc3VyZSByZWxhdGl2ZSB0byB0aW1lT3JpZ2luLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aW1lT3JpZ2luIGlzIG5vdCBjYXB0dXJlZCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIHNwYW4gZGF0YSwgc28gdGhlc2Ugd2ViIHZpdGFscyB3aWxsIG5lZWRcbiAgICAgICAgLy8gdG8gYmUgYWRqdXN0ZWQgdG8gYmUgcmVsYXRpdmUgdG8gdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAuXG5cblxuICAgICAgICB2YXIgb2xkVmFsdWUgPSBfdGhpcy5fbWVhc3VyZW1lbnRzW25hbWVdLnZhbHVlO1xuICAgICAgICB2YXIgbWVhc3VyZW1lbnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luXzEgKyBtc1RvU2VjKG9sZFZhbHVlKTsgLy8gbm9ybWFsaXplZFZhbHVlIHNob3VsZCBiZSBpbiBtaWxsaXNlY29uZHNcblxuICAgICAgICB2YXIgbm9ybWFsaXplZFZhbHVlID0gTWF0aC5hYnMoKG1lYXN1cmVtZW50VGltZXN0YW1wIC0gdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXApICogMTAwMCk7XG4gICAgICAgIHZhciBkZWx0YSA9IG5vcm1hbGl6ZWRWYWx1ZSAtIG9sZFZhbHVlO1xuICAgICAgICBsb2dnZXIubG9nKFwiW01lYXN1cmVtZW50c10gTm9ybWFsaXplZCBcIiArIG5hbWUgKyBcIiBmcm9tIFwiICsgb2xkVmFsdWUgKyBcIiB0byBcIiArIG5vcm1hbGl6ZWRWYWx1ZSArIFwiIChcIiArIGRlbHRhICsgXCIpXCIpO1xuICAgICAgICBfdGhpcy5fbWVhc3VyZW1lbnRzW25hbWVdLnZhbHVlID0gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10gJiYgdGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXSkge1xuICAgICAgICAvLyBjcmVhdGUgc3BhbiBmb3IgRklEXG4gICAgICAgIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdmaXJzdCBpbnB1dCBkZWxheScsXG4gICAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10udmFsdWUgKyBtc1RvU2VjKHRoaXMuX21lYXN1cmVtZW50c1snZmlkJ10udmFsdWUpLFxuICAgICAgICAgIG9wOiAnd2ViLnZpdGFscycsXG4gICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5maWQnXS52YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gLy8gSWYgRkNQIGlzIG5vdCByZWNvcmRlZCB3ZSBzaG91bGQgbm90IHJlY29yZCB0aGUgY2xzIHZhbHVlXG4gICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBkZWZpbml0aW9uIG9mIENMUy5cblxuXG4gICAgICBpZiAoISgnZmNwJyBpbiB0aGlzLl9tZWFzdXJlbWVudHMpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tZWFzdXJlbWVudHMuY2xzO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRNZWFzdXJlbWVudHModGhpcy5fbWVhc3VyZW1lbnRzKTtcblxuICAgICAgdGhpcy5fdGFnTWV0cmljSW5mbyh0cmFuc2FjdGlvbik7XG4gICAgfVxuICB9O1xuICAvKiogQWRkIExDUCAvIENMUyBkYXRhIHRvIHRyYW5zYWN0aW9uIHRvIGFsbG93IGRlYnVnZ2luZyAqL1xuXG5cbiAgTWV0cmljc0luc3RydW1lbnRhdGlvbi5wcm90b3R5cGUuX3RhZ01ldHJpY0luZm8gPSBmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICBpZiAodGhpcy5fbGNwRW50cnkpIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBMQ1AgRGF0YScpOyAvLyBDYXB0dXJlIFByb3BlcnRpZXMgb2YgdGhlIExDUCBlbGVtZW50IHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIExDUC5cblxuICAgICAgaWYgKHRoaXMuX2xjcEVudHJ5LmVsZW1lbnQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuZWxlbWVudCcsIGh0bWxUcmVlQXNTdHJpbmcodGhpcy5fbGNwRW50cnkuZWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbGNwRW50cnkuaWQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuaWQnLCB0aGlzLl9sY3BFbnRyeS5pZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9sY3BFbnRyeS51cmwpIHtcbiAgICAgICAgLy8gVHJpbSBVUkwgdG8gdGhlIGZpcnN0IDIwMCBjaGFyYWN0ZXJzLlxuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC51cmwnLCB0aGlzLl9sY3BFbnRyeS51cmwudHJpbSgpLnNsaWNlKDAsIDIwMCkpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC5zaXplJywgdGhpcy5fbGNwRW50cnkuc2l6ZSk7XG4gICAgfSAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9MYXlvdXRTaGlmdFxuXG5cbiAgICBpZiAodGhpcy5fY2xzRW50cnkgJiYgdGhpcy5fY2xzRW50cnkuc291cmNlcykge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIENMUyBEYXRhJyk7XG5cbiAgICAgIHRoaXMuX2Nsc0VudHJ5LnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2V0VGFnKFwiY2xzLnNvdXJjZS5cIiArIChpbmRleCArIDEpLCBodG1sVHJlZUFzU3RyaW5nKHNvdXJjZS5ub2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIEN1bXVsYXRpdmUgTGF5b3V0IFNoaWZ0IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG5cblxuICBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uLnByb3RvdHlwZS5fdHJhY2tDTFMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8gU2VlOlxuICAgIC8vIGh0dHBzOi8vd2ViLmRldi9ldm9sdmluZy1jbHMvXG4gICAgLy8gaHR0cHM6Ly93ZWIuZGV2L2Nscy13ZWItdG9vbGluZy9cblxuXG4gICAgZ2V0Q0xTKGZ1bmN0aW9uIChtZXRyaWMpIHtcbiAgICAgIHZhciBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIENMUycpO1xuICAgICAgX3RoaXMuX21lYXN1cmVtZW50c1snY2xzJ10gPSB7XG4gICAgICAgIHZhbHVlOiBtZXRyaWMudmFsdWVcbiAgICAgIH07XG4gICAgICBfdGhpcy5fY2xzRW50cnkgPSBlbnRyeTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIENhcHR1cmUgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSB1c2VyIGFnZW50LlxuICAgKi9cblxuXG4gIE1ldHJpY3NJbnN0cnVtZW50YXRpb24ucHJvdG90eXBlLl90cmFja05hdmlnYXRvciA9IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgIHZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG4gICAgaWYgKCFuYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHRyYWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5XG5cblxuICAgIHZhciBjb25uZWN0aW9uID0gbmF2aWdhdG9yLmNvbm5lY3Rpb247XG5cbiAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgaWYgKGNvbm5lY3Rpb24uZWZmZWN0aXZlVHlwZSkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2VmZmVjdGl2ZUNvbm5lY3Rpb25UeXBlJywgY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbm5lY3Rpb24udHlwZSkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2Nvbm5lY3Rpb25UeXBlJywgY29ubmVjdGlvbi50eXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShjb25uZWN0aW9uLnJ0dCkpIHtcbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydjb25uZWN0aW9uLnJ0dCddID0ge1xuICAgICAgICAgIHZhbHVlOiBjb25uZWN0aW9uLnJ0dFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNZWFzdXJlbWVudFZhbHVlKGNvbm5lY3Rpb24uZG93bmxpbmspKSB7XG4gICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snY29ubmVjdGlvbi5kb3dubGluayddID0ge1xuICAgICAgICAgIHZhbHVlOiBjb25uZWN0aW9uLmRvd25saW5rXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5KSkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdkZXZpY2VNZW1vcnknLCBTdHJpbmcobmF2aWdhdG9yLmRldmljZU1lbW9yeSkpO1xuICAgIH1cblxuICAgIGlmIChpc01lYXN1cmVtZW50VmFsdWUobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2hhcmR3YXJlQ29uY3VycmVuY3knLCBTdHJpbmcobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKTtcbiAgICB9XG4gIH07XG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIExhcmdlc3QgQ29udGVudGZ1bCBQYWludCBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuXG5cbiAgTWV0cmljc0luc3RydW1lbnRhdGlvbi5wcm90b3R5cGUuX3RyYWNrTENQID0gZnVuY3Rpb24gKHJlcG9ydEFsbENoYW5nZXMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZ2V0TENQKGZ1bmN0aW9uIChtZXRyaWMpIHtcbiAgICAgIHZhciBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pO1xuICAgICAgdmFyIHN0YXJ0VGltZSA9IG1zVG9TZWMoZW50cnkuc3RhcnRUaW1lKTtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBMQ1AnKTtcbiAgICAgIF90aGlzLl9tZWFzdXJlbWVudHNbJ2xjcCddID0ge1xuICAgICAgICB2YWx1ZTogbWV0cmljLnZhbHVlXG4gICAgICB9O1xuICAgICAgX3RoaXMuX21lYXN1cmVtZW50c1snbWFyay5sY3AnXSA9IHtcbiAgICAgICAgdmFsdWU6IHRpbWVPcmlnaW4gKyBzdGFydFRpbWVcbiAgICAgIH07XG4gICAgICBfdGhpcy5fbGNwRW50cnkgPSBlbnRyeTtcbiAgICB9LCByZXBvcnRBbGxDaGFuZ2VzKTtcbiAgfTtcbiAgLyoqIFN0YXJ0cyB0cmFja2luZyB0aGUgRmlyc3QgSW5wdXQgRGVsYXkgb24gdGhlIGN1cnJlbnQgcGFnZS4gKi9cblxuXG4gIE1ldHJpY3NJbnN0cnVtZW50YXRpb24ucHJvdG90eXBlLl90cmFja0ZJRCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZ2V0RklEKGZ1bmN0aW9uIChtZXRyaWMpIHtcbiAgICAgIHZhciBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pO1xuICAgICAgdmFyIHN0YXJ0VGltZSA9IG1zVG9TZWMoZW50cnkuc3RhcnRUaW1lKTtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBGSUQnKTtcbiAgICAgIF90aGlzLl9tZWFzdXJlbWVudHNbJ2ZpZCddID0ge1xuICAgICAgICB2YWx1ZTogbWV0cmljLnZhbHVlXG4gICAgICB9O1xuICAgICAgX3RoaXMuX21lYXN1cmVtZW50c1snbWFyay5maWQnXSA9IHtcbiAgICAgICAgdmFsdWU6IHRpbWVPcmlnaW4gKyBzdGFydFRpbWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIE1ldHJpY3NJbnN0cnVtZW50YXRpb247XG59KCk7XG5cbmV4cG9ydCB7IE1ldHJpY3NJbnN0cnVtZW50YXRpb24gfTtcbi8qKiBJbnN0cnVtZW50IG5hdmlnYXRpb24gZW50cmllcyAqL1xuXG5mdW5jdGlvbiBhZGROYXZpZ2F0aW9uU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCB0aW1lT3JpZ2luKSB7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7XG4gICAgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5OiBlbnRyeSxcbiAgICBldmVudDogJ3VubG9hZEV2ZW50JyxcbiAgICB0aW1lT3JpZ2luOiB0aW1lT3JpZ2luXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbixcbiAgICBlbnRyeTogZW50cnksXG4gICAgZXZlbnQ6ICdyZWRpcmVjdCcsXG4gICAgdGltZU9yaWdpbjogdGltZU9yaWdpblxuICB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHtcbiAgICB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24sXG4gICAgZW50cnk6IGVudHJ5LFxuICAgIGV2ZW50OiAnZG9tQ29udGVudExvYWRlZEV2ZW50JyxcbiAgICB0aW1lT3JpZ2luOiB0aW1lT3JpZ2luXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbixcbiAgICBlbnRyeTogZW50cnksXG4gICAgZXZlbnQ6ICdsb2FkRXZlbnQnLFxuICAgIHRpbWVPcmlnaW46IHRpbWVPcmlnaW5cbiAgfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7XG4gICAgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5OiBlbnRyeSxcbiAgICBldmVudDogJ2Nvbm5lY3QnLFxuICAgIHRpbWVPcmlnaW46IHRpbWVPcmlnaW5cbiAgfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7XG4gICAgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5OiBlbnRyeSxcbiAgICBldmVudDogJ3NlY3VyZUNvbm5lY3Rpb24nLFxuICAgIHRpbWVPcmlnaW46IHRpbWVPcmlnaW4sXG4gICAgZXZlbnRFbmQ6ICdjb25uZWN0RW5kJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RMUy9TU0wnXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbixcbiAgICBlbnRyeTogZW50cnksXG4gICAgZXZlbnQ6ICdmZXRjaCcsXG4gICAgdGltZU9yaWdpbjogdGltZU9yaWdpbixcbiAgICBldmVudEVuZDogJ2RvbWFpbkxvb2t1cFN0YXJ0JyxcbiAgICBkZXNjcmlwdGlvbjogJ2NhY2hlJ1xuICB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHtcbiAgICB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24sXG4gICAgZW50cnk6IGVudHJ5LFxuICAgIGV2ZW50OiAnZG9tYWluTG9va3VwJyxcbiAgICB0aW1lT3JpZ2luOiB0aW1lT3JpZ2luLFxuICAgIGRlc2NyaXB0aW9uOiAnRE5TJ1xuICB9KTtcbiAgYWRkUmVxdWVzdCh0cmFuc2FjdGlvbiwgZW50cnksIHRpbWVPcmlnaW4pO1xufVxuLyoqIENyZWF0ZSBtZWFzdXJlIHJlbGF0ZWQgc3BhbnMgKi9cblxuXG5mdW5jdGlvbiBhZGRNZWFzdXJlU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCBzdGFydFRpbWUsIGR1cmF0aW9uLCB0aW1lT3JpZ2luKSB7XG4gIHZhciBtZWFzdXJlU3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgc3RhcnRUaW1lO1xuICB2YXIgbWVhc3VyZUVuZFRpbWVzdGFtcCA9IG1lYXN1cmVTdGFydFRpbWVzdGFtcCArIGR1cmF0aW9uO1xuXG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgZGVzY3JpcHRpb246IGVudHJ5Lm5hbWUsXG4gICAgZW5kVGltZXN0YW1wOiBtZWFzdXJlRW5kVGltZXN0YW1wLFxuICAgIG9wOiBlbnRyeS5lbnRyeVR5cGUsXG4gICAgc3RhcnRUaW1lc3RhbXA6IG1lYXN1cmVTdGFydFRpbWVzdGFtcFxuICB9KTtcblxuICByZXR1cm4gbWVhc3VyZVN0YXJ0VGltZXN0YW1wO1xufVxuLyoqIENyZWF0ZSByZXNvdXJjZS1yZWxhdGVkIHNwYW5zICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlc291cmNlU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCByZXNvdXJjZU5hbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24sIHRpbWVPcmlnaW4pIHtcbiAgLy8gd2UgYWxyZWFkeSBpbnN0cnVtZW50IGJhc2VkIG9uIGZldGNoIGFuZCB4aHIsIHNvIHdlIGRvbid0IG5lZWQgdG9cbiAgLy8gZHVwbGljYXRlIHNwYW5zIGhlcmUuXG4gIGlmIChlbnRyeS5pbml0aWF0b3JUeXBlID09PSAneG1saHR0cHJlcXVlc3QnIHx8IGVudHJ5LmluaXRpYXRvclR5cGUgPT09ICdmZXRjaCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGRhdGEgPSB7fTtcblxuICBpZiAoJ3RyYW5zZmVyU2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydUcmFuc2ZlciBTaXplJ10gPSBlbnRyeS50cmFuc2ZlclNpemU7XG4gIH1cblxuICBpZiAoJ2VuY29kZWRCb2R5U2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydFbmNvZGVkIEJvZHkgU2l6ZSddID0gZW50cnkuZW5jb2RlZEJvZHlTaXplO1xuICB9XG5cbiAgaWYgKCdkZWNvZGVkQm9keVNpemUnIGluIGVudHJ5KSB7XG4gICAgZGF0YVsnRGVjb2RlZCBCb2R5IFNpemUnXSA9IGVudHJ5LmRlY29kZWRCb2R5U2l6ZTtcbiAgfVxuXG4gIHZhciBzdGFydFRpbWVzdGFtcCA9IHRpbWVPcmlnaW4gKyBzdGFydFRpbWU7XG4gIHZhciBlbmRUaW1lc3RhbXAgPSBzdGFydFRpbWVzdGFtcCArIGR1cmF0aW9uO1xuXG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgZGVzY3JpcHRpb246IHJlc291cmNlTmFtZSxcbiAgICBlbmRUaW1lc3RhbXA6IGVuZFRpbWVzdGFtcCxcbiAgICBvcDogZW50cnkuaW5pdGlhdG9yVHlwZSA/IFwicmVzb3VyY2UuXCIgKyBlbnRyeS5pbml0aWF0b3JUeXBlIDogJ3Jlc291cmNlJyxcbiAgICBzdGFydFRpbWVzdGFtcDogc3RhcnRUaW1lc3RhbXAsXG4gICAgZGF0YTogZGF0YVxuICB9KTtcblxuICByZXR1cm4gZW5kVGltZXN0YW1wO1xufVxuLyoqIENyZWF0ZSBwZXJmb3JtYW5jZSBuYXZpZ2F0aW9uIHJlbGF0ZWQgc3BhbnMgKi9cblxuZnVuY3Rpb24gYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHByb3BzKSB7XG4gIHZhciB0cmFuc2FjdGlvbiA9IHByb3BzLnRyYW5zYWN0aW9uLFxuICAgICAgZW50cnkgPSBwcm9wcy5lbnRyeSxcbiAgICAgIGV2ZW50ID0gcHJvcHMuZXZlbnQsXG4gICAgICB0aW1lT3JpZ2luID0gcHJvcHMudGltZU9yaWdpbixcbiAgICAgIGV2ZW50RW5kID0gcHJvcHMuZXZlbnRFbmQsXG4gICAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICB2YXIgZW5kID0gZXZlbnRFbmQgPyBlbnRyeVtldmVudEVuZF0gOiBlbnRyeVtldmVudCArIFwiRW5kXCJdO1xuICB2YXIgc3RhcnQgPSBlbnRyeVtldmVudCArIFwiU3RhcnRcIl07XG5cbiAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBvcDogJ2Jyb3dzZXInLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiAhPT0gbnVsbCAmJiBkZXNjcmlwdGlvbiAhPT0gdm9pZCAwID8gZGVzY3JpcHRpb24gOiBldmVudCxcbiAgICBzdGFydFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoc3RhcnQpLFxuICAgIGVuZFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW5kKVxuICB9KTtcbn1cbi8qKiBDcmVhdGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmVsYXRlZCBzcGFucyAqL1xuXG5cbmZ1bmN0aW9uIGFkZFJlcXVlc3QodHJhbnNhY3Rpb24sIGVudHJ5LCB0aW1lT3JpZ2luKSB7XG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgb3A6ICdicm93c2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ3JlcXVlc3QnLFxuICAgIHN0YXJ0VGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXF1ZXN0U3RhcnQpLFxuICAgIGVuZFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVzcG9uc2VFbmQpXG4gIH0pO1xuXG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgb3A6ICdicm93c2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Jlc3BvbnNlJyxcbiAgICBzdGFydFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVzcG9uc2VTdGFydCksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZUVuZClcbiAgfSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBjaGlsZCBvbiB0cmFuc2FjdGlvbnMuIFRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbFxuICogdXNlIHRoZSBzdGFydCB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0ZWQgY2hpbGQgc3BhbiBpZiBpdCBpcyBlYXJsaWVyIHRoYW4gdGhlIHRyYW5zYWN0aW9ucyBhY3R1YWxcbiAqIHN0YXJ0IHRpbWVzdGFtcC5cbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwgX2EpIHtcbiAgdmFyIHN0YXJ0VGltZXN0YW1wID0gX2Euc3RhcnRUaW1lc3RhbXAsXG4gICAgICBjdHggPSBfX3Jlc3QoX2EsIFtcInN0YXJ0VGltZXN0YW1wXCJdKTtcblxuICBpZiAoc3RhcnRUaW1lc3RhbXAgJiYgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAgPiBzdGFydFRpbWVzdGFtcCkge1xuICAgIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wID0gc3RhcnRUaW1lc3RhbXA7XG4gIH1cblxuICByZXR1cm4gdHJhbnNhY3Rpb24uc3RhcnRDaGlsZChfX2Fzc2lnbih7XG4gICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZXN0YW1wXG4gIH0sIGN0eCkpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIG1lYXN1cmVtZW50IHZhbHVlLlxuICovXG5cbmZ1bmN0aW9uIGlzTWVhc3VyZW1lbnRWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG59IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVhZCwgX19zcHJlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGlzSW5zdGFuY2VPZiwgaXNNYXRjaGluZ1BhdHRlcm4gfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IGdldEFjdGl2ZVRyYW5zYWN0aW9uLCBoYXNUcmFjaW5nRW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzJztcbmV4cG9ydCB2YXIgREVGQVVMVF9UUkFDSU5HX09SSUdJTlMgPSBbJ2xvY2FsaG9zdCcsIC9eXFwvL107XG5leHBvcnQgdmFyIGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyA9IHtcbiAgdHJhY2VGZXRjaDogdHJ1ZSxcbiAgdHJhY2VYSFI6IHRydWUsXG4gIHRyYWNpbmdPcmlnaW5zOiBERUZBVUxUX1RSQUNJTkdfT1JJR0lOU1xufTtcbi8qKiBSZWdpc3RlcnMgc3BhbiBjcmVhdG9ycyBmb3IgeGhyIGFuZCBmZXRjaCByZXF1ZXN0cyAgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzKF9vcHRpb25zKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgdmFyIF9hID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyksIF9vcHRpb25zKSxcbiAgICAgIHRyYWNlRmV0Y2ggPSBfYS50cmFjZUZldGNoLFxuICAgICAgdHJhY2VYSFIgPSBfYS50cmFjZVhIUixcbiAgICAgIHRyYWNpbmdPcmlnaW5zID0gX2EudHJhY2luZ09yaWdpbnMsXG4gICAgICBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCA9IF9hLnNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0OyAvLyBXZSBzaG91bGQgY2FjaGUgdXJsIC0+IGRlY2lzaW9uIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb21wdXRlXG4gIC8vIHJlZ2V4cCBldmVyeXRpbWUgd2UgY3JlYXRlIGEgcmVxdWVzdC5cblxuXG4gIHZhciB1cmxNYXAgPSB7fTtcblxuICB2YXIgZGVmYXVsdFNob3VsZENyZWF0ZVNwYW4gPSBmdW5jdGlvbiBkZWZhdWx0U2hvdWxkQ3JlYXRlU3Bhbih1cmwpIHtcbiAgICBpZiAodXJsTWFwW3VybF0pIHtcbiAgICAgIHJldHVybiB1cmxNYXBbdXJsXTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2lucyA9IHRyYWNpbmdPcmlnaW5zO1xuICAgIHVybE1hcFt1cmxdID0gb3JpZ2lucy5zb21lKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHJldHVybiBpc01hdGNoaW5nUGF0dGVybih1cmwsIG9yaWdpbik7XG4gICAgfSkgJiYgIWlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgJ3NlbnRyeV9rZXknKTtcbiAgICByZXR1cm4gdXJsTWFwW3VybF07XG4gIH07IC8vIFdlIHdhbnQgdGhhdCBvdXIgdXNlcnMgZG9uJ3QgaGF2ZSB0byByZS1pbXBsZW1lbnQgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QgdGhlbXNlbHZlc1xuICAvLyBUaGF0J3Mgd2h5IHdlIGZpbHRlciBvdXQgYWxyZWFkeSB1bndhbnRlZCBTcGFucyBmcm9tIHRyYWNpbmdPcmlnaW5zXG5cblxuICB2YXIgc2hvdWxkQ3JlYXRlU3BhbiA9IGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuO1xuXG4gIGlmICh0eXBlb2Ygc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaG91bGRDcmVhdGVTcGFuID0gZnVuY3Rpb24gc2hvdWxkQ3JlYXRlU3Bhbih1cmwpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0U2hvdWxkQ3JlYXRlU3Bhbih1cmwpICYmIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0KHVybCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBzcGFucyA9IHt9O1xuXG4gIGlmICh0cmFjZUZldGNoKSB7XG4gICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soaGFuZGxlckRhdGEpIHtcbiAgICAgICAgZmV0Y2hDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICdmZXRjaCdcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0cmFjZVhIUikge1xuICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHhockNhbGxiYWNrKGhhbmRsZXJEYXRhLCBzaG91bGRDcmVhdGVTcGFuLCBzcGFucyk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ3hocidcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW5kIHRyYWNrIGZldGNoIHJlcXVlc3Qgc3BhbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpIHtcbiAgaWYgKCFoYXNUcmFjaW5nRW5hYmxlZCgpIHx8ICEoaGFuZGxlckRhdGEuZmV0Y2hEYXRhICYmIHNob3VsZENyZWF0ZVNwYW4oaGFuZGxlckRhdGEuZmV0Y2hEYXRhLnVybCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCAmJiBoYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuKSB7XG4gICAgdmFyIHNwYW4gPSBzcGFuc1toYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuXTtcblxuICAgIGlmIChzcGFuKSB7XG4gICAgICBpZiAoaGFuZGxlckRhdGEucmVzcG9uc2UpIHtcbiAgICAgICAgLy8gVE9ETyAoa21jbGIpIHJlbW92ZSB0aGlzIG9uY2UgdHlwZXMgUFIgZ29lcyB0aHJvdWdoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgc3Bhbi5zZXRIdHRwU3RhdHVzKGhhbmRsZXJEYXRhLnJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICB9IGVsc2UgaWYgKGhhbmRsZXJEYXRhLmVycm9yKSB7XG4gICAgICAgIHNwYW4uc2V0U3RhdHVzKFNwYW5TdGF0dXMuSW50ZXJuYWxFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHNwYW4uZmluaXNoKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcblxuICAgICAgZGVsZXRlIHNwYW5zW2hhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW5dO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhY3RpdmVUcmFuc2FjdGlvbiA9IGdldEFjdGl2ZVRyYW5zYWN0aW9uKCk7XG5cbiAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgdmFyIHNwYW4gPSBhY3RpdmVUcmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgIGRhdGE6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBoYW5kbGVyRGF0YS5mZXRjaERhdGEpLCB7XG4gICAgICAgIHR5cGU6ICdmZXRjaCdcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246IGhhbmRsZXJEYXRhLmZldGNoRGF0YS5tZXRob2QgKyBcIiBcIiArIGhhbmRsZXJEYXRhLmZldGNoRGF0YS51cmwsXG4gICAgICBvcDogJ2h0dHAuY2xpZW50J1xuICAgIH0pO1xuICAgIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW4gPSBzcGFuLnNwYW5JZDtcbiAgICBzcGFuc1tzcGFuLnNwYW5JZF0gPSBzcGFuO1xuICAgIHZhciByZXF1ZXN0ID0gaGFuZGxlckRhdGEuYXJnc1swXSA9IGhhbmRsZXJEYXRhLmFyZ3NbMF07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgICB2YXIgb3B0aW9ucyA9IGhhbmRsZXJEYXRhLmFyZ3NbMV0gPSBoYW5kbGVyRGF0YS5hcmdzWzFdIHx8IHt9O1xuICAgIHZhciBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuXG4gICAgaWYgKGlzSW5zdGFuY2VPZihyZXF1ZXN0LCBSZXF1ZXN0KSkge1xuICAgICAgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycztcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgaWYgKHR5cGVvZiBoZWFkZXJzLmFwcGVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdzZW50cnktdHJhY2UnLCBzcGFuLnRvVHJhY2VwYXJlbnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAgICAgaGVhZGVycyA9IF9fc3ByZWFkKGhlYWRlcnMsIFtbJ3NlbnRyeS10cmFjZScsIHNwYW4udG9UcmFjZXBhcmVudCgpXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVycyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBoZWFkZXJzKSwge1xuICAgICAgICAgICdzZW50cnktdHJhY2UnOiBzcGFuLnRvVHJhY2VwYXJlbnQoKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVycyA9IHtcbiAgICAgICAgJ3NlbnRyeS10cmFjZSc6IHNwYW4udG9UcmFjZXBhcmVudCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuZCB0cmFjayB4aHIgcmVxdWVzdCBzcGFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB4aHJDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpIHtcbiAgdmFyIF9hLCBfYjtcblxuICBpZiAoIWhhc1RyYWNpbmdFbmFibGVkKCkgfHwgKChfYSA9IGhhbmRsZXJEYXRhLnhocikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fc2VudHJ5X293bl9yZXF1ZXN0X18pIHx8ICEoKChfYiA9IGhhbmRsZXJEYXRhLnhocikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLl9fc2VudHJ5X3hocl9fKSAmJiBzaG91bGRDcmVhdGVTcGFuKGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfXy51cmwpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB4aHIgPSBoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX187IC8vIGNoZWNrIGZpcnN0IGlmIHRoZSByZXF1ZXN0IGhhcyBmaW5pc2hlZCBhbmQgaXMgdHJhY2tlZCBieSBhbiBleGlzdGluZyBzcGFuIHdoaWNoIHNob3VsZCBub3cgZW5kXG5cbiAgaWYgKGhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCAmJiBoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfXykge1xuICAgIHZhciBzcGFuID0gc3BhbnNbaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX19dO1xuXG4gICAgaWYgKHNwYW4pIHtcbiAgICAgIHNwYW4uc2V0SHR0cFN0YXR1cyh4aHIuc3RhdHVzX2NvZGUpO1xuICAgICAgc3Bhbi5maW5pc2goKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuXG4gICAgICBkZWxldGUgc3BhbnNbaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX19dO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBpZiBub3QsIGNyZWF0ZSBhIG5ldyBzcGFuIHRvIHRyYWNrIGl0XG5cblxuICB2YXIgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuXG4gIGlmIChhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgIHZhciBzcGFuID0gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICBkYXRhOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgeGhyLmRhdGEpLCB7XG4gICAgICAgIHR5cGU6ICd4aHInLFxuICAgICAgICBtZXRob2Q6IHhoci5tZXRob2QsXG4gICAgICAgIHVybDogeGhyLnVybFxuICAgICAgfSksXG4gICAgICBkZXNjcmlwdGlvbjogeGhyLm1ldGhvZCArIFwiIFwiICsgeGhyLnVybCxcbiAgICAgIG9wOiAnaHR0cC5jbGllbnQnXG4gICAgfSk7XG4gICAgaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX18gPSBzcGFuLnNwYW5JZDtcbiAgICBzcGFuc1toYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfX10gPSBzcGFuO1xuXG4gICAgaWYgKGhhbmRsZXJEYXRhLnhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyRGF0YS54aHIuc2V0UmVxdWVzdEhlYWRlcignc2VudHJ5LXRyYWNlJywgc3Bhbi50b1RyYWNlcGFyZW50KCkpO1xuICAgICAgfSBjYXRjaCAoXykgey8vIEVycm9yOiBJbnZhbGlkU3RhdGVFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldFJlcXVlc3RIZWFkZXInIG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSBvYmplY3QncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIGltcGxlbWVudGluZyBwYWdlbG9hZCBhbmQgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHMoY3VzdG9tU3RhcnRUcmFuc2FjdGlvbiwgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQsIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlKSB7XG4gIGlmIChzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCA9PT0gdm9pZCAwKSB7XG4gICAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlID09PSB2b2lkIDApIHtcbiAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSA9IHRydWU7XG4gIH1cblxuICBpZiAoIWdsb2JhbCB8fCAhZ2xvYmFsLmxvY2F0aW9uKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbml0aWFsaXplIHJvdXRpbmcgaW5zdHJ1bWVudGF0aW9uIGR1ZSB0byBpbnZhbGlkIGxvY2F0aW9uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0YXJ0aW5nVXJsID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG4gIHZhciBhY3RpdmVUcmFuc2FjdGlvbjtcblxuICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQpIHtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oe1xuICAgICAgbmFtZTogZ2xvYmFsLmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgb3A6ICdwYWdlbG9hZCdcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSkge1xuICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKF9hKSB7XG4gICAgICAgIHZhciB0byA9IF9hLnRvLFxuICAgICAgICAgICAgZnJvbSA9IF9hLmZyb207XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVhcmx5IHJldHVybiBpcyB0aGVyZSB0byBhY2NvdW50IGZvciBzb21lIGNhc2VzIHdoZXJlIGEgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbiBzdGFydHMgcmlnaHQgYWZ0ZXJcbiAgICAgICAgICogbG9uZy1ydW5uaW5nIHBhZ2Vsb2FkLiBXZSBtYWtlIHN1cmUgdGhhdCBpZiBgZnJvbWAgaXMgdW5kZWZpbmVkIGFuZCBhIHZhbGlkIGBzdGFydGluZ1VSTGAgZXhpc3RzLCB3ZSBkb24ndFxuICAgICAgICAgKiBjcmVhdGUgYW4gdW5lY2Nlc3NhcnkgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyB3YXMgaGFyZCB0byBkdXBsaWNhdGUsIGJ1dCB0aGlzIGJlaGF2aW9yIHN0b3BwZWQgYXMgc29vbiBhcyB0aGlzIGZpeCB3YXMgYXBwbGllZC4gVGhpcyBpc3N1ZSBtaWdodCBhbHNvXG4gICAgICAgICAqIG9ubHkgYmUgY2F1c2VkIGluIGNlcnRhaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIHdoZXJlIHRoZSB1c2FnZSBvZiBhIGhvdCBtb2R1bGUgcmVsb2FkZXIgaXMgY2F1c2luZ1xuICAgICAgICAgKiBlcnJvcnMuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQgJiYgc3RhcnRpbmdVcmwgJiYgc3RhcnRpbmdVcmwuaW5kZXhPZih0bykgIT09IC0xKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5sb2coXCJbVHJhY2luZ10gRmluaXNoaW5nIGN1cnJlbnQgdHJhbnNhY3Rpb24gd2l0aCBvcDogXCIgKyBhY3RpdmVUcmFuc2FjdGlvbi5vcCk7IC8vIElmIHRoZXJlJ3MgYW4gb3BlbiB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGUsIHdlIG5lZWQgdG8gZmluaXNoIGl0IGJlZm9yZSBjcmVhdGluZyBhbiBuZXcgb25lLlxuXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbi5maW5pc2goKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgbmFtZTogZ2xvYmFsLmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgb3A6ICduYXZpZ2F0aW9uJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHlwZTogJ2hpc3RvcnknXG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IHN0YXJ0SWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaHViZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0lETEVfVElNRU9VVCB9IGZyb20gJy4uL2lkbGV0cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBTcGFuU3RhdHVzIH0gZnJvbSAnLi4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBleHRyYWN0VHJhY2VwYXJlbnREYXRhLCBzZWNUb01zIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJCYWNrZ3JvdW5kVGFiRGV0ZWN0aW9uIH0gZnJvbSAnLi9iYWNrZ3JvdW5kdGFiJztcbmltcG9ydCB7IERFRkFVTFRfTUVUUklDU19JTlNUUl9PUFRJT05TLCBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSAnLi9tZXRyaWNzJztcbmltcG9ydCB7IGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucywgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMgfSBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHMgfSBmcm9tICcuL3JvdXRlcic7XG5leHBvcnQgdmFyIERFRkFVTFRfTUFYX1RSQU5TQUNUSU9OX0RVUkFUSU9OX1NFQ09ORFMgPSA2MDA7XG5cbnZhciBERUZBVUxUX0JST1dTRVJfVFJBQ0lOR19PUFRJT05TID0gX19hc3NpZ24oe1xuICBpZGxlVGltZW91dDogREVGQVVMVF9JRExFX1RJTUVPVVQsXG4gIG1hcmtCYWNrZ3JvdW5kVHJhbnNhY3Rpb25zOiB0cnVlLFxuICBtYXhUcmFuc2FjdGlvbkR1cmF0aW9uOiBERUZBVUxUX01BWF9UUkFOU0FDVElPTl9EVVJBVElPTl9TRUNPTkRTLFxuICByb3V0aW5nSW5zdHJ1bWVudGF0aW9uOiBpbnN0cnVtZW50Um91dGluZ1dpdGhEZWZhdWx0cyxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U6IHRydWUsXG4gIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkOiB0cnVlXG59LCBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMpO1xuLyoqXG4gKiBUaGUgQnJvd3NlciBUcmFjaW5nIGludGVncmF0aW9uIGF1dG9tYXRpY2FsbHkgaW5zdHJ1bWVudHMgYnJvd3NlciBwYWdlbG9hZC9uYXZpZ2F0aW9uXG4gKiBhY3Rpb25zIGFzIHRyYW5zYWN0aW9ucywgYW5kIGNhcHR1cmVzIHJlcXVlc3RzLCBtZXRyaWNzIGFuZCBlcnJvcnMgYXMgc3BhbnMuXG4gKlxuICogVGhlIGludGVncmF0aW9uIGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSB2YXJpZXR5IG9mIG9wdGlvbnMsIGFuZCBjYW4gYmUgZXh0ZW5kZWQgdG8gdXNlXG4gKiBhbnkgcm91dGluZyBsaWJyYXJ5LiBUaGlzIGludGVncmF0aW9uIHVzZXMge0BzZWUgSWRsZVRyYW5zYWN0aW9ufSB0byBjcmVhdGUgdHJhbnNhY3Rpb25zLlxuICovXG5cblxudmFyIEJyb3dzZXJUcmFjaW5nID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnJvd3NlclRyYWNpbmcoX29wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IEJyb3dzZXJUcmFjaW5nLmlkO1xuICAgIHRoaXMuX2VtaXRPcHRpb25zV2FybmluZyA9IGZhbHNlO1xuICAgIHZhciB0cmFjaW5nT3JpZ2lucyA9IGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucy50cmFjaW5nT3JpZ2luczsgLy8gTk9URTogTG9nZ2VyIGRvZXNuJ3Qgd29yayBpbiBjb25zdHJ1Y3RvcnMsIGFzIGl0J3MgaW5pdGlhbGl6ZWQgYWZ0ZXIgaW50ZWdyYXRpb25zIGluc3RhbmNlc1xuXG4gICAgaWYgKF9vcHRpb25zICYmIF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zICYmIEFycmF5LmlzQXJyYXkoX29wdGlvbnMudHJhY2luZ09yaWdpbnMpICYmIF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdHJhY2luZ09yaWdpbnMgPSBfb3B0aW9ucy50cmFjaW5nT3JpZ2lucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZW1pdE9wdGlvbnNXYXJuaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9CUk9XU0VSX1RSQUNJTkdfT1BUSU9OUyksIF9vcHRpb25zKSwge1xuICAgICAgdHJhY2luZ09yaWdpbnM6IHRyYWNpbmdPcmlnaW5zXG4gICAgfSk7XG4gICAgdGhpcy5fbWV0cmljcyA9IG5ldyBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBERUZBVUxUX01FVFJJQ1NfSU5TVFJfT1BUSU9OUyksIHRoaXMub3B0aW9ucy5fbWV0cmljT3B0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIEJyb3dzZXJUcmFjaW5nLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoXywgZ2V0Q3VycmVudEh1Yikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9nZXRDdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YjtcblxuICAgIGlmICh0aGlzLl9lbWl0T3B0aW9uc1dhcm5pbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbVHJhY2luZ10gWW91IG5lZWQgdG8gZGVmaW5lIGB0cmFjaW5nT3JpZ2luc2AgaW4gdGhlIG9wdGlvbnMuIFNldCBhbiBhcnJheSBvZiB1cmxzIG9yIHBhdHRlcm5zIHRvIHRyYWNlLicpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJbVHJhY2luZ10gV2UgYWRkZWQgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9yIHlvdTogXCIgKyBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMudHJhY2luZ09yaWdpbnMpO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuXG5cbiAgICB2YXIgX2EgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGluc3RydW1lbnRSb3V0aW5nID0gX2Eucm91dGluZ0luc3RydW1lbnRhdGlvbixcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UgPSBfYS5zdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSxcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQgPSBfYS5zdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCxcbiAgICAgICAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnMgPSBfYS5tYXJrQmFja2dyb3VuZFRyYW5zYWN0aW9ucyxcbiAgICAgICAgdHJhY2VGZXRjaCA9IF9hLnRyYWNlRmV0Y2gsXG4gICAgICAgIHRyYWNlWEhSID0gX2EudHJhY2VYSFIsXG4gICAgICAgIHRyYWNpbmdPcmlnaW5zID0gX2EudHJhY2luZ09yaWdpbnMsXG4gICAgICAgIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0ID0gX2Euc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3Q7XG4gICAgaW5zdHJ1bWVudFJvdXRpbmcoZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBfdGhpcy5fY3JlYXRlUm91dGVUcmFuc2FjdGlvbihjb250ZXh0KTtcbiAgICB9LCBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCwgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UpO1xuXG4gICAgaWYgKG1hcmtCYWNrZ3JvdW5kVHJhbnNhY3Rpb25zKSB7XG4gICAgICByZWdpc3RlckJhY2tncm91bmRUYWJEZXRlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpbnN0cnVtZW50T3V0Z29pbmdSZXF1ZXN0cyh7XG4gICAgICB0cmFjZUZldGNoOiB0cmFjZUZldGNoLFxuICAgICAgdHJhY2VYSFI6IHRyYWNlWEhSLFxuICAgICAgdHJhY2luZ09yaWdpbnM6IHRyYWNpbmdPcmlnaW5zLFxuICAgICAgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3Q6IHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0XG4gICAgfSk7XG4gIH07XG4gIC8qKiBDcmVhdGUgcm91dGluZyBpZGxlIHRyYW5zYWN0aW9uLiAqL1xuXG5cbiAgQnJvd3NlclRyYWNpbmcucHJvdG90eXBlLl9jcmVhdGVSb3V0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLl9nZXRDdXJyZW50SHViKSB7XG4gICAgICBsb2dnZXIud2FybihcIltUcmFjaW5nXSBEaWQgbm90IGNyZWF0ZSBcIiArIGNvbnRleHQub3AgKyBcIiB0cmFuc2FjdGlvbiBiZWNhdXNlIF9nZXRDdXJyZW50SHViIGlzIGludmFsaWQuXCIpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcblxuXG4gICAgdmFyIF9hID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBiZWZvcmVOYXZpZ2F0ZSA9IF9hLmJlZm9yZU5hdmlnYXRlLFxuICAgICAgICBpZGxlVGltZW91dCA9IF9hLmlkbGVUaW1lb3V0LFxuICAgICAgICBtYXhUcmFuc2FjdGlvbkR1cmF0aW9uID0gX2EubWF4VHJhbnNhY3Rpb25EdXJhdGlvbjtcbiAgICB2YXIgcGFyZW50Q29udGV4dEZyb21IZWFkZXIgPSBjb250ZXh0Lm9wID09PSAncGFnZWxvYWQnID8gZ2V0SGVhZGVyQ29udGV4dCgpIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGV4cGFuZGVkQ29udGV4dCA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb250ZXh0KSwgcGFyZW50Q29udGV4dEZyb21IZWFkZXIpLCB7XG4gICAgICB0cmltRW5kOiB0cnVlXG4gICAgfSk7XG5cbiAgICB2YXIgbW9kaWZpZWRDb250ZXh0ID0gdHlwZW9mIGJlZm9yZU5hdmlnYXRlID09PSAnZnVuY3Rpb24nID8gYmVmb3JlTmF2aWdhdGUoZXhwYW5kZWRDb250ZXh0KSA6IGV4cGFuZGVkQ29udGV4dDsgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGJlZm9yZU5hdmlnYXRlIGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIFwiZHJvcFwiIHRoZSB0cmFuc2FjdGlvbiAocHJldmVudCBpdFxuICAgIC8vIGZyb20gYmVpbmcgc2VudCB0byBTZW50cnkpLlxuXG4gICAgdmFyIGZpbmFsQ29udGV4dCA9IG1vZGlmaWVkQ29udGV4dCA9PT0gdW5kZWZpbmVkID8gX19hc3NpZ24oX19hc3NpZ24oe30sIGV4cGFuZGVkQ29udGV4dCksIHtcbiAgICAgIHNhbXBsZWQ6IGZhbHNlXG4gICAgfSkgOiBtb2RpZmllZENvbnRleHQ7XG5cbiAgICBpZiAoZmluYWxDb250ZXh0LnNhbXBsZWQgPT09IGZhbHNlKSB7XG4gICAgICBsb2dnZXIubG9nKFwiW1RyYWNpbmddIFdpbGwgbm90IHNlbmQgXCIgKyBmaW5hbENvbnRleHQub3AgKyBcIiB0cmFuc2FjdGlvbiBiZWNhdXNlIG9mIGJlZm9yZU5hdmlnYXRlLlwiKTtcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKFwiW1RyYWNpbmddIFN0YXJ0aW5nIFwiICsgZmluYWxDb250ZXh0Lm9wICsgXCIgdHJhbnNhY3Rpb24gb24gc2NvcGVcIik7XG5cbiAgICB2YXIgaHViID0gdGhpcy5fZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgdmFyIGxvY2F0aW9uID0gZ2V0R2xvYmFsT2JqZWN0KCkubG9jYXRpb247XG4gICAgdmFyIGlkbGVUcmFuc2FjdGlvbiA9IHN0YXJ0SWRsZVRyYW5zYWN0aW9uKGh1YiwgZmluYWxDb250ZXh0LCBpZGxlVGltZW91dCwgdHJ1ZSwge1xuICAgICAgbG9jYXRpb246IGxvY2F0aW9uXG4gICAgfSk7XG4gICAgaWRsZVRyYW5zYWN0aW9uLnJlZ2lzdGVyQmVmb3JlRmluaXNoQ2FsbGJhY2soZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBlbmRUaW1lc3RhbXApIHtcbiAgICAgIF90aGlzLl9tZXRyaWNzLmFkZFBlcmZvcm1hbmNlRW50cmllcyh0cmFuc2FjdGlvbik7XG5cbiAgICAgIGFkanVzdFRyYW5zYWN0aW9uRHVyYXRpb24oc2VjVG9NcyhtYXhUcmFuc2FjdGlvbkR1cmF0aW9uKSwgdHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkbGVUcmFuc2FjdGlvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgQnJvd3NlclRyYWNpbmcuaWQgPSAnQnJvd3NlclRyYWNpbmcnO1xuICByZXR1cm4gQnJvd3NlclRyYWNpbmc7XG59KCk7XG5cbmV4cG9ydCB7IEJyb3dzZXJUcmFjaW5nIH07XG4vKipcbiAqIEdldHMgdHJhbnNhY3Rpb24gY29udGV4dCBmcm9tIGEgc2VudHJ5LXRyYWNlIG1ldGEuXG4gKlxuICogQHJldHVybnMgVHJhbnNhY3Rpb24gY29udGV4dCBkYXRhIGZyb20gdGhlIGhlYWRlciBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBoZWFkZXIgb3IgdGhlIGhlYWRlciBpcyBtYWxmb3JtZWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZGVyQ29udGV4dCgpIHtcbiAgdmFyIGhlYWRlciA9IGdldE1ldGFDb250ZW50KCdzZW50cnktdHJhY2UnKTtcblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcmV0dXJuIGV4dHJhY3RUcmFjZXBhcmVudERhdGEoaGVhZGVyKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4vKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBtZXRhIHRhZyAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0YUNvbnRlbnQobWV0YU5hbWUpIHtcbiAgdmFyIGVsID0gZ2V0R2xvYmFsT2JqZWN0KCkuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT1cIiArIG1ldGFOYW1lICsgXCJdXCIpO1xuICByZXR1cm4gZWwgPyBlbC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IG51bGw7XG59XG4vKiogQWRqdXN0cyB0cmFuc2FjdGlvbiB2YWx1ZSBiYXNlZCBvbiBtYXggdHJhbnNhY3Rpb24gZHVyYXRpb24gKi9cblxuZnVuY3Rpb24gYWRqdXN0VHJhbnNhY3Rpb25EdXJhdGlvbihtYXhEdXJhdGlvbiwgdHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcCkge1xuICB2YXIgZGlmZiA9IGVuZFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wO1xuICB2YXIgaXNPdXRkYXRlZFRyYW5zYWN0aW9uID0gZW5kVGltZXN0YW1wICYmIChkaWZmID4gbWF4RHVyYXRpb24gfHwgZGlmZiA8IDApO1xuXG4gIGlmIChpc091dGRhdGVkVHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkKTtcbiAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ21heFRyYW5zYWN0aW9uRHVyYXRpb25FeGNlZWRlZCcsICd0cnVlJyk7XG4gIH1cbn0iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKlxuICogRXhwcmVzcyBpbnRlZ3JhdGlvblxuICpcbiAqIFByb3ZpZGVzIGFuIHJlcXVlc3QgYW5kIGVycm9yIGhhbmRsZXIgZm9yIEV4cHJlc3MgZnJhbWV3b3JrIGFzIHdlbGwgYXMgdHJhY2luZyBjYXBhYmlsaXRpZXNcbiAqL1xuXG52YXIgRXhwcmVzcyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZnVuY3Rpb24gRXhwcmVzcyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuXG5cbiAgICB0aGlzLm5hbWUgPSBFeHByZXNzLmlkO1xuICAgIHRoaXMuX3JvdXRlciA9IG9wdGlvbnMucm91dGVyIHx8IG9wdGlvbnMuYXBwO1xuICAgIHRoaXMuX21ldGhvZHMgPSAoQXJyYXkuaXNBcnJheShvcHRpb25zLm1ldGhvZHMpID8gb3B0aW9ucy5tZXRob2RzIDogW10pLmNvbmNhdCgndXNlJyk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgRXhwcmVzcy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fcm91dGVyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0V4cHJlc3NJbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGFuIEV4cHJlc3MgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0cnVtZW50TWlkZGxld2FyZXModGhpcy5fcm91dGVyLCB0aGlzLl9tZXRob2RzKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgRXhwcmVzcy5pZCA9ICdFeHByZXNzJztcbiAgcmV0dXJuIEV4cHJlc3M7XG59KCk7XG5cbmV4cG9ydCB7IEV4cHJlc3MgfTtcbi8qKlxuICogV3JhcHMgb3JpZ2luYWwgbWlkZGxld2FyZSBmdW5jdGlvbiBpbiBhIHRyYWNpbmcgY2FsbCwgd2hpY2ggc3RvcmVzIHRoZSBpbmZvIGFib3V0IHRoZSBjYWxsIGFzIGEgc3BhbixcbiAqIGFuZCBmaW5pc2hlcyBpdCBvbmNlIHRoZSBtaWRkbGV3YXJlIGlzIGRvbmUgaW52b2tpbmcuXG4gKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlcyBoYXZlIDMgdmFyaW91cyBmb3JtcywgdGh1cyB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBhbGwgb2YgdGhlbTpcbiAqIC8vIHN5bmNcbiAqIGFwcC51c2UoZnVuY3Rpb24gKHJlcSwgcmVzKSB7IC4uLiB9KVxuICogLy8gYXN5bmNcbiAqIGFwcC51c2UoZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7IC4uLiB9KVxuICogLy8gZXJyb3IgaGFuZGxlclxuICogYXBwLnVzZShmdW5jdGlvbiAoZXJyLCByZXEsIHJlcywgbmV4dCkgeyAuLi4gfSlcbiAqXG4gKiBUaGV5IGFsbCBpbnRlcm5hbGx5IGRlbGVnYXRlIHRvIHRoZSBgcm91dGVyW21ldGhvZF1gIG9mIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuZnVuY3Rpb24gd3JhcChmbiwgbWV0aG9kKSB7XG4gIHZhciBhcml0eSA9IGZuLmxlbmd0aDtcblxuICBzd2l0Y2ggKGFyaXR5KSB7XG4gICAgY2FzZSAyOlxuICAgICAge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlcSwgcmVzKSB7XG4gICAgICAgICAgdmFyIHRyYW5zYWN0aW9uID0gcmVzLl9fc2VudHJ5X3RyYW5zYWN0aW9uO1xuXG4gICAgICAgICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc3Bhbl8xID0gdHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbi5uYW1lLFxuICAgICAgICAgICAgICBvcDogXCJtaWRkbGV3YXJlLlwiICsgbWV0aG9kXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlcy5vbmNlKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHNwYW5fMS5maW5pc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIHJlcSwgcmVzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgIGNhc2UgMzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuICAgICAgICAgIHZhciBfYTtcblxuICAgICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHJlcy5fX3NlbnRyeV90cmFuc2FjdGlvbjtcbiAgICAgICAgICB2YXIgc3BhbiA9IChfYSA9IHRyYW5zYWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhcnRDaGlsZCh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZm4ubmFtZSxcbiAgICAgICAgICAgIG9wOiBcIm1pZGRsZXdhcmUuXCIgKyBtZXRob2RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmbi5jYWxsKHRoaXMsIHJlcSwgcmVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfYTtcblxuICAgICAgICAgICAgKF9hID0gc3BhbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmlzaCgpO1xuICAgICAgICAgICAgbmV4dC5jYWxsLmFwcGx5KG5leHQsIF9fc3ByZWFkKFt0aGlzXSwgYXJncykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgY2FzZSA0OlxuICAgICAge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVyciwgcmVxLCByZXMsIG5leHQpIHtcbiAgICAgICAgICB2YXIgX2E7XG5cbiAgICAgICAgICB2YXIgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgICAgdmFyIHNwYW4gPSAoX2EgPSB0cmFuc2FjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGZuLm5hbWUsXG4gICAgICAgICAgICBvcDogXCJtaWRkbGV3YXJlLlwiICsgbWV0aG9kXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm4uY2FsbCh0aGlzLCBlcnIsIHJlcSwgcmVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfYTtcblxuICAgICAgICAgICAgKF9hID0gc3BhbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmlzaCgpO1xuICAgICAgICAgICAgbmV4dC5jYWxsLmFwcGx5KG5leHQsIF9fc3ByZWFkKFt0aGlzXSwgYXJncykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwcmVzcyBtaWRkbGV3YXJlIHRha2VzIDItNCBhcmd1bWVudHMuIEdvdDogXCIgKyBhcml0eSk7XG4gICAgICB9XG4gIH1cbn1cbi8qKlxuICogVGFrZXMgYWxsIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBvcmlnaW5hbCBgYXBwYCBvciBgcm91dGVyYCBtZXRob2QsIGVnLiBgYXBwLnVzZWAgb3IgYHJvdXRlci51c2VgXG4gKiBhbmQgd3JhcHMgZXZlcnkgZnVuY3Rpb24sIGFzIHdlbGwgYXMgYXJyYXkgb2YgZnVuY3Rpb25zIHdpdGggYSBjYWxsIHRvIG91ciBgd3JhcGAgbWV0aG9kLlxuICogV2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgdGhlIGFycmF5cyBhcyB3ZWxsIGFzIGl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGFyZ3VtZW50cyxcbiAqIGFzIGBhcHAudXNlYCBjYW4gYWNjZXB0IG1pZGRsZXdhcmVzIGluIGZldyB2YXJpb3VzIGZvcm1zLlxuICpcbiAqIGFwcC51c2UoWzxwYXRoPl0sIDxmbj4pXG4gKiBhcHAudXNlKFs8cGF0aD5dLCA8Zm4+LCAuLi48Zm4+KVxuICogYXBwLnVzZShbPHBhdGg+XSwgLi4uPGZuPltdKVxuICovXG5cblxuZnVuY3Rpb24gd3JhcE1pZGRsZXdhcmVBcmdzKGFyZ3MsIG1ldGhvZCkge1xuICByZXR1cm4gYXJncy5tYXAoZnVuY3Rpb24gKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gd3JhcChhcmcsIG1ldGhvZCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgcmV0dXJuIGFyZy5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXAoYSwgbWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG4vKipcbiAqIFBhdGNoZXMgb3JpZ2luYWwgcm91dGVyIHRvIHV0aWxpemUgb3VyIHRyYWNpbmcgZnVuY3Rpb25hbGl0eVxuICovXG5cblxuZnVuY3Rpb24gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlciwgbWV0aG9kKSB7XG4gIHZhciBvcmlnaW5hbENhbGxiYWNrID0gcm91dGVyW21ldGhvZF07XG5cbiAgcm91dGVyW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsQ2FsbGJhY2suY2FsbC5hcHBseShvcmlnaW5hbENhbGxiYWNrLCBfX3NwcmVhZChbdGhpc10sIHdyYXBNaWRkbGV3YXJlQXJncyhhcmdzLCBtZXRob2QpKSk7XG4gIH07XG5cbiAgcmV0dXJuIHJvdXRlcjtcbn1cbi8qKlxuICogUGF0Y2hlcyBvcmlnaW5hbCByb3V0ZXIgbWV0aG9kc1xuICovXG5cblxuZnVuY3Rpb24gaW5zdHJ1bWVudE1pZGRsZXdhcmVzKHJvdXRlciwgbWV0aG9kcykge1xuICBpZiAobWV0aG9kcyA9PT0gdm9pZCAwKSB7XG4gICAgbWV0aG9kcyA9IFtdO1xuICB9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICByZXR1cm4gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlciwgbWV0aG9kKTtcbiAgfSk7XG59IiwiaW1wb3J0IHsgZmlsbCwgaXNUaGVuYWJsZSwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKiogVHJhY2luZyBpbnRlZ3JhdGlvbiBmb3Igbm9kZS1wb3N0Z3JlcyBwYWNrYWdlICovXG5cbnZhciBQb3N0Z3JlcyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvc3RncmVzKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG5cblxuICAgIHRoaXMubmFtZSA9IFBvc3RncmVzLmlkO1xuICAgIHRoaXMuX3VzZVBnTmF0aXZlID0gISFvcHRpb25zLnVzZVBnTmF0aXZlO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFBvc3RncmVzLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoXywgZ2V0Q3VycmVudEh1Yikge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBwa2cgPSBsb2FkTW9kdWxlKCdwZycpO1xuXG4gICAgaWYgKCFwa2cpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUG9zdGdyZXMgSW50ZWdyYXRpb24gd2FzIHVuYWJsZSB0byByZXF1aXJlIGBwZ2AgcGFja2FnZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXNlUGdOYXRpdmUgJiYgISgoX2EgPSBwa2cubmF0aXZlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuQ2xpZW50KSkge1xuICAgICAgbG9nZ2VyLmVycm9yKFwiUG9zdGdyZXMgSW50ZWdyYXRpb24gd2FzIHVuYWJsZSB0byBhY2Nlc3MgJ3BnLW5hdGl2ZScgYmluZGluZ3MuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBDbGllbnQgPSAodGhpcy5fdXNlUGdOYXRpdmUgPyBwa2cubmF0aXZlIDogcGtnKS5DbGllbnQ7XG4gICAgLyoqXG4gICAgICogZnVuY3Rpb24gKHF1ZXJ5LCBjYWxsYmFjaykgPT4gdm9pZFxuICAgICAqIGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykgPT4gdm9pZFxuICAgICAqIGZ1bmN0aW9uIChxdWVyeSkgPT4gUHJvbWlzZVxuICAgICAqIGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1zKSA9PiBQcm9taXNlXG4gICAgICogZnVuY3Rpb24gKHBnLkN1cnNvcikgPT4gcGcuQ3Vyc29yXG4gICAgICovXG5cbiAgICBmaWxsKENsaWVudC5wcm90b3R5cGUsICdxdWVyeScsIGZ1bmN0aW9uIChvcmlnKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbmZpZywgdmFsdWVzLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcblxuICAgICAgICB2YXIgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgdmFyIHBhcmVudFNwYW4gPSAoX2EgPSBzY29wZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldFNwYW4oKTtcbiAgICAgICAgdmFyIHNwYW4gPSAoX2IgPSBwYXJlbnRTcGFuKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogY29uZmlnLnRleHQsXG4gICAgICAgICAgb3A6IFwiZGJcIlxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBjb25maWcsIHZhbHVlcywgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgX2E7XG5cbiAgICAgICAgICAgIChfYSA9IHNwYW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maW5pc2goKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBjb25maWcsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgICAoX2EgPSBzcGFuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmluaXNoKCk7XG4gICAgICAgICAgICB2YWx1ZXMoZXJyLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJ2ID0gdHlwZW9mIHZhbHVlcyAhPT0gJ3VuZGVmaW5lZCcgPyBvcmlnLmNhbGwodGhpcywgY29uZmlnLCB2YWx1ZXMpIDogb3JpZy5jYWxsKHRoaXMsIGNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGlzVGhlbmFibGUocnYpKSB7XG4gICAgICAgICAgcmV0dXJuIHJ2LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgICAoX2EgPSBzcGFuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgKF9jID0gc3BhbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4gcnY7XG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBQb3N0Z3Jlcy5pZCA9ICdQb3N0Z3Jlcyc7XG4gIHJldHVybiBQb3N0Z3Jlcztcbn0oKTtcblxuZXhwb3J0IHsgUG9zdGdyZXMgfTsiLCJpbXBvcnQgeyBmaWxsLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBUcmFjaW5nIGludGVncmF0aW9uIGZvciBub2RlLW15c3FsIHBhY2thZ2UgKi9cblxudmFyIE15c3FsID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTXlzcWwoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBNeXNxbC5pZDtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBNeXNxbC5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKF8sIGdldEN1cnJlbnRIdWIpIHtcbiAgICB2YXIgcGtnID0gbG9hZE1vZHVsZSgnbXlzcWwvbGliL0Nvbm5lY3Rpb24uanMnKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ015c3FsIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gcmVxdWlyZSBgbXlzcWxgIHBhY2thZ2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGUgb3JpZ2luYWwgZnVuY3Rpb24gd2lsbCBoYXZlIG9uZSBvZiB0aGVzZSBzaWduYXR1cmVzOlxuICAgIC8vICAgIGZ1bmN0aW9uIChjYWxsYmFjaykgPT4gdm9pZFxuICAgIC8vICAgIGZ1bmN0aW9uIChvcHRpb25zLCBjYWxsYmFjaykgPT4gdm9pZFxuICAgIC8vICAgIGZ1bmN0aW9uIChvcHRpb25zLCB2YWx1ZXMsIGNhbGxiYWNrKSA9PiB2b2lkXG5cblxuICAgIGZpbGwocGtnLCAnY3JlYXRlUXVlcnknLCBmdW5jdGlvbiAob3JpZykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvcHRpb25zLCB2YWx1ZXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG5cbiAgICAgICAgdmFyIHNjb3BlID0gZ2V0Q3VycmVudEh1YigpLmdldFNjb3BlKCk7XG4gICAgICAgIHZhciBwYXJlbnRTcGFuID0gKF9hID0gc2NvcGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRTcGFuKCk7XG4gICAgICAgIHZhciBzcGFuID0gKF9iID0gcGFyZW50U3BhbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBvcHRpb25zIDogb3B0aW9ucy5zcWwsXG4gICAgICAgICAgb3A6IFwiZGJcIlxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBvcHRpb25zLCB2YWx1ZXMsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCwgZmllbGRzKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG5cbiAgICAgICAgICAgIChfYSA9IHNwYW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maW5pc2goKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0LCBmaWVsZHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCwgZmllbGRzKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG5cbiAgICAgICAgICAgIChfYSA9IHNwYW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maW5pc2goKTtcbiAgICAgICAgICAgIHZhbHVlcyhlcnIsIHJlc3VsdCwgZmllbGRzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwodGhpcywgb3B0aW9ucywgdmFsdWVzLCBjYWxsYmFjayk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBNeXNxbC5pZCA9ICdNeXNxbCc7XG4gIHJldHVybiBNeXNxbDtcbn0oKTtcblxuZXhwb3J0IHsgTXlzcWwgfTsiLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBmaWxsLCBpc1RoZW5hYmxlLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbnZhciBPUEVSQVRJT05TID0gWydhZ2dyZWdhdGUnLCAnYnVsa1dyaXRlJywgJ2NvdW50RG9jdW1lbnRzJywgJ2NyZWF0ZUluZGV4JywgJ2NyZWF0ZUluZGV4ZXMnLCAnZGVsZXRlTWFueScsICdkZWxldGVPbmUnLCAnZGlzdGluY3QnLCAnZHJvcCcsICdkcm9wSW5kZXgnLCAnZHJvcEluZGV4ZXMnLCAnZXN0aW1hdGVkRG9jdW1lbnRDb3VudCcsICdmaW5kJywgJ2ZpbmRPbmUnLCAnZmluZE9uZUFuZERlbGV0ZScsICdmaW5kT25lQW5kUmVwbGFjZScsICdmaW5kT25lQW5kVXBkYXRlJywgJ2luZGV4ZXMnLCAnaW5kZXhFeGlzdHMnLCAnaW5kZXhJbmZvcm1hdGlvbicsICdpbml0aWFsaXplT3JkZXJlZEJ1bGtPcCcsICdpbnNlcnRNYW55JywgJ2luc2VydE9uZScsICdpc0NhcHBlZCcsICdtYXBSZWR1Y2UnLCAnb3B0aW9ucycsICdwYXJhbGxlbENvbGxlY3Rpb25TY2FuJywgJ3JlbmFtZScsICdyZXBsYWNlT25lJywgJ3N0YXRzJywgJ3VwZGF0ZU1hbnknLCAndXBkYXRlT25lJ107IC8vIEFsbCBvZiB0aGUgb3BlcmF0aW9ucyBhYm92ZSB0YWtlIGBvcHRpb25zYCBhbmQgYGNhbGxiYWNrYCBhcyB0aGVpciBmaW5hbCBwYXJhbWV0ZXJzLCBidXQgc29tZSBvZiB0aGVtXG4vLyB0YWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcyB3ZWxsLiBGb3IgdGhvc2Ugb3BlcmF0aW9ucywgdGhpcyBpcyBhIG1hcCBvZlxuLy8geyA8b3BlcmF0aW9uIG5hbWU+OiAgWzxuYW1lcyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnM+XSB9LCBhcyBhIHdheSB0byBrbm93IHdoYXQgdG8gY2FsbCB0aGUgb3BlcmF0aW9uJ3Ncbi8vIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdoZW4gd2UgYWRkIHRoZW0gdG8gdGhlIHNwYW4ncyBgZGF0YWAgb2JqZWN0IGxhdGVyXG5cbnZhciBPUEVSQVRJT05fU0lHTkFUVVJFUyA9IHtcbiAgLy8gYWdncmVnYXRlIGludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGJlY2F1c2UgYHBpcGVsaW5lYCBhcmd1bWVudHMgYXJlIHRvbyBjb21wbGV4IHRvIHNlcmlhbGl6ZSB3ZWxsXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L3B1bGwvMzEwMlxuICBidWxrV3JpdGU6IFsnb3BlcmF0aW9ucyddLFxuICBjb3VudERvY3VtZW50czogWydxdWVyeSddLFxuICBjcmVhdGVJbmRleDogWydmaWVsZE9yU3BlYyddLFxuICBjcmVhdGVJbmRleGVzOiBbJ2luZGV4U3BlY3MnXSxcbiAgZGVsZXRlTWFueTogWydmaWx0ZXInXSxcbiAgZGVsZXRlT25lOiBbJ2ZpbHRlciddLFxuICBkaXN0aW5jdDogWydrZXknLCAncXVlcnknXSxcbiAgZHJvcEluZGV4OiBbJ2luZGV4TmFtZSddLFxuICBmaW5kOiBbJ3F1ZXJ5J10sXG4gIGZpbmRPbmU6IFsncXVlcnknXSxcbiAgZmluZE9uZUFuZERlbGV0ZTogWydmaWx0ZXInXSxcbiAgZmluZE9uZUFuZFJlcGxhY2U6IFsnZmlsdGVyJywgJ3JlcGxhY2VtZW50J10sXG4gIGZpbmRPbmVBbmRVcGRhdGU6IFsnZmlsdGVyJywgJ3VwZGF0ZSddLFxuICBpbmRleEV4aXN0czogWydpbmRleGVzJ10sXG4gIGluc2VydE1hbnk6IFsnZG9jcyddLFxuICBpbnNlcnRPbmU6IFsnZG9jJ10sXG4gIG1hcFJlZHVjZTogWydtYXAnLCAncmVkdWNlJ10sXG4gIHJlbmFtZTogWyduZXdOYW1lJ10sXG4gIHJlcGxhY2VPbmU6IFsnZmlsdGVyJywgJ2RvYyddLFxuICB1cGRhdGVNYW55OiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbiAgdXBkYXRlT25lOiBbJ2ZpbHRlcicsICd1cGRhdGUnXVxufTtcbi8qKiBUcmFjaW5nIGludGVncmF0aW9uIGZvciBtb25nbyBwYWNrYWdlICovXG5cbnZhciBNb25nbyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZnVuY3Rpb24gTW9uZ28ob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cblxuXG4gICAgdGhpcy5uYW1lID0gTW9uZ28uaWQ7XG4gICAgdGhpcy5fb3BlcmF0aW9ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcGVyYXRpb25zKSA/IG9wdGlvbnMub3BlcmF0aW9ucyA6IE9QRVJBVElPTlM7XG4gICAgdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zID0gJ2Rlc2NyaWJlT3BlcmF0aW9ucycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZGVzY3JpYmVPcGVyYXRpb25zIDogdHJ1ZTtcbiAgICB0aGlzLl91c2VNb25nb29zZSA9ICEhb3B0aW9ucy51c2VNb25nb29zZTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBNb25nby5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKF8sIGdldEN1cnJlbnRIdWIpIHtcbiAgICB2YXIgbW9kdWxlTmFtZSA9IHRoaXMuX3VzZU1vbmdvb3NlID8gJ21vbmdvb3NlJyA6ICdtb25nb2RiJztcbiAgICB2YXIgcGtnID0gbG9hZE1vZHVsZShtb2R1bGVOYW1lKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJNb25nbyBJbnRlZ3JhdGlvbiB3YXMgdW5hYmxlIHRvIHJlcXVpcmUgYFwiICsgbW9kdWxlTmFtZSArIFwiYCBwYWNrYWdlLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnN0cnVtZW50T3BlcmF0aW9ucyhwa2cuQ29sbGVjdGlvbiwgdGhpcy5fb3BlcmF0aW9ucywgZ2V0Q3VycmVudEh1Yik7XG4gIH07XG4gIC8qKlxuICAgKiBQYXRjaGVzIG9yaWdpbmFsIGNvbGxlY3Rpb24gbWV0aG9kc1xuICAgKi9cblxuXG4gIE1vbmdvLnByb3RvdHlwZS5faW5zdHJ1bWVudE9wZXJhdGlvbnMgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgb3BlcmF0aW9ucywgZ2V0Q3VycmVudEh1Yikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBvcGVyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgICAgcmV0dXJuIF90aGlzLl9wYXRjaE9wZXJhdGlvbihjb2xsZWN0aW9uLCBvcGVyYXRpb24sIGdldEN1cnJlbnRIdWIpO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogUGF0Y2hlcyBvcmlnaW5hbCBjb2xsZWN0aW9uIHRvIHV0aWxpemUgb3VyIHRyYWNpbmcgZnVuY3Rpb25hbGl0eVxuICAgKi9cblxuXG4gIE1vbmdvLnByb3RvdHlwZS5fcGF0Y2hPcGVyYXRpb24gPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgb3BlcmF0aW9uLCBnZXRDdXJyZW50SHViKSB7XG4gICAgaWYgKCEob3BlcmF0aW9uIGluIGNvbGxlY3Rpb24ucHJvdG90eXBlKSkgcmV0dXJuO1xuXG4gICAgdmFyIGdldFNwYW5Db250ZXh0ID0gdGhpcy5fZ2V0U3BhbkNvbnRleHRGcm9tT3BlcmF0aW9uQXJndW1lbnRzLmJpbmQodGhpcyk7XG5cbiAgICBmaWxsKGNvbGxlY3Rpb24ucHJvdG90eXBlLCBvcGVyYXRpb24sIGZ1bmN0aW9uIChvcmlnKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuXG4gICAgICAgIHZhciBsYXN0QXJnID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgdmFyIHBhcmVudFNwYW4gPSAoX2EgPSBzY29wZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldFNwYW4oKTsgLy8gQ2hlY2sgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcGFzc2VkIGEgY2FsbGJhY2suIChtYXBSZWR1Y2UgcmVxdWlyZXMgYSBkaWZmZXJlbnQgY2hlY2ssIGFzXG4gICAgICAgIC8vIGl0cyAobm9uLWNhbGxiYWNrKSBhcmd1bWVudHMgY2FuIGFsc28gYmUgZnVuY3Rpb25zLilcblxuICAgICAgICBpZiAodHlwZW9mIGxhc3RBcmcgIT09ICdmdW5jdGlvbicgfHwgb3BlcmF0aW9uID09PSAnbWFwUmVkdWNlJyAmJiBhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHZhciBzcGFuXzEgPSAoX2IgPSBwYXJlbnRTcGFuKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RhcnRDaGlsZChnZXRTcGFuQ29udGV4dCh0aGlzLCBvcGVyYXRpb24sIGFyZ3MpKTtcbiAgICAgICAgICB2YXIgbWF5YmVQcm9taXNlID0gb3JpZy5jYWxsLmFwcGx5KG9yaWcsIF9fc3ByZWFkKFt0aGlzXSwgYXJncykpO1xuXG4gICAgICAgICAgaWYgKGlzVGhlbmFibGUobWF5YmVQcm9taXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heWJlUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgICAgIChfYSA9IHNwYW5fMSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmlzaCgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChfYyA9IHNwYW5fMSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuIG1heWJlUHJvbWlzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3BhbiA9IChfZCA9IHBhcmVudFNwYW4pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5zdGFydENoaWxkKGdldFNwYW5Db250ZXh0KHRoaXMsIG9wZXJhdGlvbiwgYXJncy5zbGljZSgwLCAtMSkpKTtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbC5hcHBseShvcmlnLCBfX3NwcmVhZChbdGhpc10sIGFyZ3Muc2xpY2UoMCwgLTEpLCBbZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgICAgKF9hID0gc3BhbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmlzaCgpO1xuICAgICAgICAgIGxhc3RBcmcoZXJyLCByZXN1bHQpO1xuICAgICAgICB9XSkpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEZvcm0gYSBTcGFuQ29udGV4dCBiYXNlZCBvbiB0aGUgdXNlciBpbnB1dCB0byBhIGdpdmVuIG9wZXJhdGlvbi5cbiAgICovXG5cblxuICBNb25nby5wcm90b3R5cGUuX2dldFNwYW5Db250ZXh0RnJvbU9wZXJhdGlvbkFyZ3VtZW50cyA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBvcGVyYXRpb24sIGFyZ3MpIHtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIGNvbGxlY3Rpb25OYW1lOiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgZGJOYW1lOiBjb2xsZWN0aW9uLmRiTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogY29sbGVjdGlvbi5uYW1lc3BhY2VcbiAgICB9O1xuICAgIHZhciBzcGFuQ29udGV4dCA9IHtcbiAgICAgIG9wOiBcImRiXCIsXG4gICAgICBkZXNjcmlwdGlvbjogb3BlcmF0aW9uLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH07IC8vIElmIHRoZSBvcGVyYXRpb24gdGFrZXMgbm8gYXJndW1lbnRzIGJlc2lkZXMgYG9wdGlvbnNgIGFuZCBgY2FsbGJhY2tgLCBvciBpZiBhcmd1bWVudFxuICAgIC8vIGNvbGxlY3Rpb24gaXMgZGlzYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uLCBqdXN0IHJldHVybiBlYXJseS5cblxuICAgIHZhciBzaWduYXR1cmUgPSBPUEVSQVRJT05fU0lHTkFUVVJFU1tvcGVyYXRpb25dO1xuICAgIHZhciBzaG91bGREZXNjcmliZSA9IEFycmF5LmlzQXJyYXkodGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zKSA/IHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pIDogdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zO1xuXG4gICAgaWYgKCFzaWduYXR1cmUgfHwgIXNob3VsZERlc2NyaWJlKSB7XG4gICAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYG1hcFJlZHVjZWAsIGFzIHRoZSBvbmx5IG9uZSBhY2NlcHRpbmcgZnVuY3Rpb25zIGFzIGFyZ3VtZW50cy5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICdtYXBSZWR1Y2UnKSB7XG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChhcmdzLCAyKSxcbiAgICAgICAgICAgIG1hcCA9IF9hWzBdLFxuICAgICAgICAgICAgcmVkdWNlID0gX2FbMV07XG5cbiAgICAgICAgZGF0YVtzaWduYXR1cmVbMF1dID0gdHlwZW9mIG1hcCA9PT0gJ3N0cmluZycgPyBtYXAgOiBtYXAubmFtZSB8fCAnPGFub255bW91cz4nO1xuICAgICAgICBkYXRhW3NpZ25hdHVyZVsxXV0gPSB0eXBlb2YgcmVkdWNlID09PSAnc3RyaW5nJyA/IHJlZHVjZSA6IHJlZHVjZS5uYW1lIHx8ICc8YW5vbnltb3VzPic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ25hdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGFbc2lnbmF0dXJlW2ldXSA9IEpTT04uc3RyaW5naWZ5KGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX29PKSB7Ly8gbm8tZW1wdHlcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIE1vbmdvLmlkID0gJ01vbmdvJztcbiAgcmV0dXJuIE1vbmdvO1xufSgpO1xuXG5leHBvcnQgeyBNb25nbyB9OyIsImV4cG9ydCB7IEV4cHJlc3MgfSBmcm9tICcuL25vZGUvZXhwcmVzcyc7XG5leHBvcnQgeyBQb3N0Z3JlcyB9IGZyb20gJy4vbm9kZS9wb3N0Z3Jlcyc7XG5leHBvcnQgeyBNeXNxbCB9IGZyb20gJy4vbm9kZS9teXNxbCc7XG5leHBvcnQgeyBNb25nbyB9IGZyb20gJy4vbm9kZS9tb25nbyc7IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEJyb3dzZXJUcmFjaW5nIH0gZnJvbSAnLi9icm93c2VyJztcbmltcG9ydCB7IGFkZEV4dGVuc2lvbk1ldGhvZHMgfSBmcm9tICcuL2h1YmV4dGVuc2lvbnMnO1xuaW1wb3J0ICogYXMgVHJhY2luZ0ludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5cbnZhciBJbnRlZ3JhdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgVHJhY2luZ0ludGVncmF0aW9ucyksIHtcbiAgQnJvd3NlclRyYWNpbmc6IEJyb3dzZXJUcmFjaW5nXG59KTtcblxuZXhwb3J0IHsgSW50ZWdyYXRpb25zIH07XG5leHBvcnQgeyBTcGFuIH0gZnJvbSAnLi9zcGFuJztcbmV4cG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgeyAvLyBUT0RPIGRlcHJlY2F0ZSBvbGQgbmFtZSBpbiB2N1xuaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMgYXMgcmVnaXN0ZXJSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uLCBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5leHBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lkbGV0cmFuc2FjdGlvbic7XG5leHBvcnQgeyBzdGFydElkbGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vaHViZXh0ZW5zaW9ucyc7IC8vIFdlIGFyZSBwYXRjaGluZyB0aGUgZ2xvYmFsIG9iamVjdCB3aXRoIG91ciBodWIgZXh0ZW5zaW9uIG1ldGhvZHNcblxuYWRkRXh0ZW5zaW9uTWV0aG9kcygpO1xuZXhwb3J0IHsgYWRkRXh0ZW5zaW9uTWV0aG9kcyB9O1xuZXhwb3J0IHsgZXh0cmFjdFRyYWNlcGFyZW50RGF0YSwgZ2V0QWN0aXZlVHJhbnNhY3Rpb24sIGhhc1RyYWNpbmdFbmFibGVkLCBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQsIFRSQUNFUEFSRU5UX1JFR0VYUCB9IGZyb20gJy4vdXRpbHMnOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7374\n")},6369:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"g\": function() { return /* binding */ SpanRecorder; },\n/* harmony export */ \"D\": function() { return /* binding */ Span; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7870);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2861);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5153);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(150);\n/* harmony import */ var _spanstatus__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6314);\n\n\n\n/**\n * Keeps track of finished spans for a given transaction\n * @internal\n * @hideconstructor\n * @hidden\n */\n\nvar SpanRecorder =\n/** @class */\nfunction () {\n function SpanRecorder(maxlen) {\n if (maxlen === void 0) {\n maxlen = 1000;\n }\n\n this.spans = [];\n this._maxlen = maxlen;\n }\n /**\n * This is just so that we don't run out of memory while recording a lot\n * of spans. At some point we just stop and flush out the start of the\n * trace tree (i.e.the first n spans with the smallest\n * start_timestamp).\n */\n\n\n SpanRecorder.prototype.add = function (span) {\n if (this.spans.length > this._maxlen) {\n span.spanRecorder = undefined;\n } else {\n this.spans.push(span);\n }\n };\n\n return SpanRecorder;\n}();\n\n\n/**\n * Span contains all data about a span\n */\n\nvar Span =\n/** @class */\nfunction () {\n /**\n * You should never call the constructor manually, always use `Sentry.startTransaction()`\n * or call `startChild()` on an existing span.\n * @internal\n * @hideconstructor\n * @hidden\n */\n function Span(spanContext) {\n /**\n * @inheritDoc\n */\n this.traceId = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .uuid4 */ .DM)();\n /**\n * @inheritDoc\n */\n\n this.spanId = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .uuid4 */ .DM)().substring(16);\n /**\n * Timestamp in seconds when the span was created.\n */\n\n this.startTimestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)();\n /**\n * @inheritDoc\n */\n\n this.tags = {};\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n this.data = {};\n\n if (!spanContext) {\n return this;\n }\n\n if (spanContext.traceId) {\n this.traceId = spanContext.traceId;\n }\n\n if (spanContext.spanId) {\n this.spanId = spanContext.spanId;\n }\n\n if (spanContext.parentSpanId) {\n this.parentSpanId = spanContext.parentSpanId;\n } // We want to include booleans as well here\n\n\n if ('sampled' in spanContext) {\n this.sampled = spanContext.sampled;\n }\n\n if (spanContext.op) {\n this.op = spanContext.op;\n }\n\n if (spanContext.description) {\n this.description = spanContext.description;\n }\n\n if (spanContext.data) {\n this.data = spanContext.data;\n }\n\n if (spanContext.tags) {\n this.tags = spanContext.tags;\n }\n\n if (spanContext.status) {\n this.status = spanContext.status;\n }\n\n if (spanContext.startTimestamp) {\n this.startTimestamp = spanContext.startTimestamp;\n }\n\n if (spanContext.endTimestamp) {\n this.endTimestamp = spanContext.endTimestamp;\n }\n }\n /**\n * @inheritDoc\n * @deprecated\n */\n\n\n Span.prototype.child = function (spanContext) {\n return this.startChild(spanContext);\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.startChild = function (spanContext) {\n var childSpan = new Span((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, spanContext), {\n parentSpanId: this.spanId,\n sampled: this.sampled,\n traceId: this.traceId\n }));\n childSpan.spanRecorder = this.spanRecorder;\n\n if (childSpan.spanRecorder) {\n childSpan.spanRecorder.add(childSpan);\n }\n\n childSpan.transaction = this.transaction;\n return childSpan;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.setTag = function (key, value) {\n var _a;\n\n this.tags = (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, this.tags), (_a = {}, _a[key] = value, _a));\n return this;\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n Span.prototype.setData = function (key, value) {\n var _a;\n\n this.data = (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, this.data), (_a = {}, _a[key] = value, _a));\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.setStatus = function (value) {\n this.status = value;\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.setHttpStatus = function (httpStatus) {\n this.setTag('http.status_code', String(httpStatus));\n var spanStatus = _spanstatus__WEBPACK_IMPORTED_MODULE_3__/* .SpanStatus.fromHttpCode */ .p.fromHttpCode(httpStatus);\n\n if (spanStatus !== _spanstatus__WEBPACK_IMPORTED_MODULE_3__/* .SpanStatus.UnknownError */ .p.UnknownError) {\n this.setStatus(spanStatus);\n }\n\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.isSuccess = function () {\n return this.status === _spanstatus__WEBPACK_IMPORTED_MODULE_3__/* .SpanStatus.Ok */ .p.Ok;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.finish = function (endTimestamp) {\n this.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)();\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.toTraceparent = function () {\n var sampledString = '';\n\n if (this.sampled !== undefined) {\n sampledString = this.sampled ? '-1' : '-0';\n }\n\n return this.traceId + \"-\" + this.spanId + sampledString;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.toContext = function () {\n return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .dropUndefinedKeys */ .Jr)({\n data: this.data,\n description: this.description,\n endTimestamp: this.endTimestamp,\n op: this.op,\n parentSpanId: this.parentSpanId,\n sampled: this.sampled,\n spanId: this.spanId,\n startTimestamp: this.startTimestamp,\n status: this.status,\n tags: this.tags,\n traceId: this.traceId\n });\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.updateWithContext = function (spanContext) {\n var _a, _b, _c, _d, _e;\n\n this.data = (_a = spanContext.data, _a !== null && _a !== void 0 ? _a : {});\n this.description = spanContext.description;\n this.endTimestamp = spanContext.endTimestamp;\n this.op = spanContext.op;\n this.parentSpanId = spanContext.parentSpanId;\n this.sampled = spanContext.sampled;\n this.spanId = (_b = spanContext.spanId, _b !== null && _b !== void 0 ? _b : this.spanId);\n this.startTimestamp = (_c = spanContext.startTimestamp, _c !== null && _c !== void 0 ? _c : this.startTimestamp);\n this.status = spanContext.status;\n this.tags = (_d = spanContext.tags, _d !== null && _d !== void 0 ? _d : {});\n this.traceId = (_e = spanContext.traceId, _e !== null && _e !== void 0 ? _e : this.traceId);\n return this;\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.getTraceContext = function () {\n return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .dropUndefinedKeys */ .Jr)({\n data: Object.keys(this.data).length > 0 ? this.data : undefined,\n description: this.description,\n op: this.op,\n parent_span_id: this.parentSpanId,\n span_id: this.spanId,\n status: this.status,\n tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n trace_id: this.traceId\n });\n };\n /**\n * @inheritDoc\n */\n\n\n Span.prototype.toJSON = function () {\n return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .dropUndefinedKeys */ .Jr)({\n data: Object.keys(this.data).length > 0 ? this.data : undefined,\n description: this.description,\n op: this.op,\n parent_span_id: this.parentSpanId,\n span_id: this.spanId,\n start_timestamp: this.startTimestamp,\n status: this.status,\n tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n timestamp: this.endTimestamp,\n trace_id: this.traceId\n });\n };\n\n return Span;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL3NwYW4uanM/YzhkNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBaUM7QUFDeUM7QUFDaEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRXVCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDhEQUFLO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsOERBQUs7QUFDdkI7QUFDQTtBQUNBOztBQUVBLDBCQUEwQix3RUFBZTtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSw2QkFBNkIseURBQVEsQ0FBQyx5REFBUSxHQUFHO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLGdCQUFnQix5REFBUSxDQUFDLHlEQUFRLEdBQUcsc0JBQXNCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxnQkFBZ0IseURBQVEsQ0FBQyx5REFBUSxHQUFHLHNCQUFzQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHFCQUFxQixzRkFBdUI7O0FBRTVDLHVCQUF1QixzRkFBdUI7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDJCQUEyQixrRUFBYTtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwwRUFBMEUsd0VBQWU7QUFDekY7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsV0FBVywwRUFBaUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsV0FBVywwRUFBaUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxXQUFXLDBFQUFpQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUMiLCJmaWxlIjoiNjM2OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgdGltZXN0YW1wV2l0aE1zLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIGZpbmlzaGVkIHNwYW5zIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBoaWRkZW5cbiAqL1xuXG52YXIgU3BhblJlY29yZGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3BhblJlY29yZGVyKG1heGxlbikge1xuICAgIGlmIChtYXhsZW4gPT09IHZvaWQgMCkge1xuICAgICAgbWF4bGVuID0gMTAwMDtcbiAgICB9XG5cbiAgICB0aGlzLnNwYW5zID0gW107XG4gICAgdGhpcy5fbWF4bGVuID0gbWF4bGVuO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGlzIGp1c3Qgc28gdGhhdCB3ZSBkb24ndCBydW4gb3V0IG9mIG1lbW9yeSB3aGlsZSByZWNvcmRpbmcgYSBsb3RcbiAgICogb2Ygc3BhbnMuIEF0IHNvbWUgcG9pbnQgd2UganVzdCBzdG9wIGFuZCBmbHVzaCBvdXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgKiB0cmFjZSB0cmVlIChpLmUudGhlIGZpcnN0IG4gc3BhbnMgd2l0aCB0aGUgc21hbGxlc3RcbiAgICogc3RhcnRfdGltZXN0YW1wKS5cbiAgICovXG5cblxuICBTcGFuUmVjb3JkZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgaWYgKHRoaXMuc3BhbnMubGVuZ3RoID4gdGhpcy5fbWF4bGVuKSB7XG4gICAgICBzcGFuLnNwYW5SZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU3BhblJlY29yZGVyO1xufSgpO1xuXG5leHBvcnQgeyBTcGFuUmVjb3JkZXIgfTtcbi8qKlxuICogU3BhbiBjb250YWlucyBhbGwgZGF0YSBhYm91dCBhIHNwYW5cbiAqL1xuXG52YXIgU3BhbiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBZb3Ugc2hvdWxkIG5ldmVyIGNhbGwgdGhlIGNvbnN0cnVjdG9yIG1hbnVhbGx5LCBhbHdheXMgdXNlIGBTZW50cnkuc3RhcnRUcmFuc2FjdGlvbigpYFxuICAgKiBvciBjYWxsIGBzdGFydENoaWxkKClgIG9uIGFuIGV4aXN0aW5nIHNwYW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIGZ1bmN0aW9uIFNwYW4oc3BhbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRoaXMudHJhY2VJZCA9IHV1aWQ0KCk7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cblxuICAgIHRoaXMuc3BhbklkID0gdXVpZDQoKS5zdWJzdHJpbmcoMTYpO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHdoZW4gdGhlIHNwYW4gd2FzIGNyZWF0ZWQuXG4gICAgICovXG5cbiAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cblxuICAgIHRoaXMudGFncyA9IHt9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIHRoaXMuZGF0YSA9IHt9O1xuXG4gICAgaWYgKCFzcGFuQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlSWQpIHtcbiAgICAgIHRoaXMudHJhY2VJZCA9IHNwYW5Db250ZXh0LnRyYWNlSWQ7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnNwYW5JZCkge1xuICAgICAgdGhpcy5zcGFuSWQgPSBzcGFuQ29udGV4dC5zcGFuSWQ7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnBhcmVudFNwYW5JZCkge1xuICAgICAgdGhpcy5wYXJlbnRTcGFuSWQgPSBzcGFuQ29udGV4dC5wYXJlbnRTcGFuSWQ7XG4gICAgfSAvLyBXZSB3YW50IHRvIGluY2x1ZGUgYm9vbGVhbnMgYXMgd2VsbCBoZXJlXG5cblxuICAgIGlmICgnc2FtcGxlZCcgaW4gc3BhbkNvbnRleHQpIHtcbiAgICAgIHRoaXMuc2FtcGxlZCA9IHNwYW5Db250ZXh0LnNhbXBsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0Lm9wKSB7XG4gICAgICB0aGlzLm9wID0gc3BhbkNvbnRleHQub3A7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gc3BhbkNvbnRleHQuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHNwYW5Db250ZXh0LmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnRhZ3MpIHtcbiAgICAgIHRoaXMudGFncyA9IHNwYW5Db250ZXh0LnRhZ3M7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnN0YXR1cykge1xuICAgICAgdGhpcy5zdGF0dXMgPSBzcGFuQ29udGV4dC5zdGF0dXM7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXA7XG4gICAgfVxuXG4gICAgaWYgKHNwYW5Db250ZXh0LmVuZFRpbWVzdGFtcCkge1xuICAgICAgdGhpcy5lbmRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5lbmRUaW1lc3RhbXA7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLmNoaWxkID0gZnVuY3Rpb24gKHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRDaGlsZChzcGFuQ29udGV4dCk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLnN0YXJ0Q2hpbGQgPSBmdW5jdGlvbiAoc3BhbkNvbnRleHQpIHtcbiAgICB2YXIgY2hpbGRTcGFuID0gbmV3IFNwYW4oX19hc3NpZ24oX19hc3NpZ24oe30sIHNwYW5Db250ZXh0KSwge1xuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuc2FtcGxlZCxcbiAgICAgIHRyYWNlSWQ6IHRoaXMudHJhY2VJZFxuICAgIH0pKTtcbiAgICBjaGlsZFNwYW4uc3BhblJlY29yZGVyID0gdGhpcy5zcGFuUmVjb3JkZXI7XG5cbiAgICBpZiAoY2hpbGRTcGFuLnNwYW5SZWNvcmRlcikge1xuICAgICAgY2hpbGRTcGFuLnNwYW5SZWNvcmRlci5hZGQoY2hpbGRTcGFuKTtcbiAgICB9XG5cbiAgICBjaGlsZFNwYW4udHJhbnNhY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uO1xuICAgIHJldHVybiBjaGlsZFNwYW47XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLnNldFRhZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdGhpcy50YWdzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMudGFncyksIChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcblxuXG4gIFNwYW4ucHJvdG90eXBlLnNldERhdGEgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBfYTtcblxuICAgIHRoaXMuZGF0YSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLmRhdGEpLCAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTcGFuLnByb3RvdHlwZS5zZXRTdGF0dXMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB0aGlzLnN0YXR1cyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTcGFuLnByb3RvdHlwZS5zZXRIdHRwU3RhdHVzID0gZnVuY3Rpb24gKGh0dHBTdGF0dXMpIHtcbiAgICB0aGlzLnNldFRhZygnaHR0cC5zdGF0dXNfY29kZScsIFN0cmluZyhodHRwU3RhdHVzKSk7XG4gICAgdmFyIHNwYW5TdGF0dXMgPSBTcGFuU3RhdHVzLmZyb21IdHRwQ29kZShodHRwU3RhdHVzKTtcblxuICAgIGlmIChzcGFuU3RhdHVzICE9PSBTcGFuU3RhdHVzLlVua25vd25FcnJvcikge1xuICAgICAgdGhpcy5zZXRTdGF0dXMoc3BhblN0YXR1cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLmlzU3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFNwYW5TdGF0dXMuT2s7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChlbmRUaW1lc3RhbXApIHtcbiAgICB0aGlzLmVuZFRpbWVzdGFtcCA9IHR5cGVvZiBlbmRUaW1lc3RhbXAgPT09ICdudW1iZXInID8gZW5kVGltZXN0YW1wIDogdGltZXN0YW1wV2l0aE1zKCk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLnRvVHJhY2VwYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNhbXBsZWRTdHJpbmcgPSAnJztcblxuICAgIGlmICh0aGlzLnNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FtcGxlZFN0cmluZyA9IHRoaXMuc2FtcGxlZCA/ICctMScgOiAnLTAnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYWNlSWQgKyBcIi1cIiArIHRoaXMuc3BhbklkICsgc2FtcGxlZFN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgU3Bhbi5wcm90b3R5cGUudG9Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGVuZFRpbWVzdGFtcDogdGhpcy5lbmRUaW1lc3RhbXAsXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHBhcmVudFNwYW5JZDogdGhpcy5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLnNhbXBsZWQsXG4gICAgICBzcGFuSWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc3RhcnRUaW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgdHJhY2VJZDogdGhpcy50cmFjZUlkXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLnVwZGF0ZVdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKHNwYW5Db250ZXh0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcblxuICAgIHRoaXMuZGF0YSA9IChfYSA9IHNwYW5Db250ZXh0LmRhdGEsIF9hICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9KTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gc3BhbkNvbnRleHQuZGVzY3JpcHRpb247XG4gICAgdGhpcy5lbmRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5lbmRUaW1lc3RhbXA7XG4gICAgdGhpcy5vcCA9IHNwYW5Db250ZXh0Lm9wO1xuICAgIHRoaXMucGFyZW50U3BhbklkID0gc3BhbkNvbnRleHQucGFyZW50U3BhbklkO1xuICAgIHRoaXMuc2FtcGxlZCA9IHNwYW5Db250ZXh0LnNhbXBsZWQ7XG4gICAgdGhpcy5zcGFuSWQgPSAoX2IgPSBzcGFuQ29udGV4dC5zcGFuSWQsIF9iICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMuc3BhbklkKTtcbiAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gKF9jID0gc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXAsIF9jICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRoaXMuc3RhcnRUaW1lc3RhbXApO1xuICAgIHRoaXMuc3RhdHVzID0gc3BhbkNvbnRleHQuc3RhdHVzO1xuICAgIHRoaXMudGFncyA9IChfZCA9IHNwYW5Db250ZXh0LnRhZ3MsIF9kICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHt9KTtcbiAgICB0aGlzLnRyYWNlSWQgPSAoX2UgPSBzcGFuQ29udGV4dC50cmFjZUlkLCBfZSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLnRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBTcGFuLnByb3RvdHlwZS5nZXRUcmFjZUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIGRhdGE6IE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID4gMCA/IHRoaXMuZGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgb3A6IHRoaXMub3AsXG4gICAgICBwYXJlbnRfc3Bhbl9pZDogdGhpcy5wYXJlbnRTcGFuSWQsXG4gICAgICBzcGFuX2lkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB0YWdzOiBPYmplY3Qua2V5cyh0aGlzLnRhZ3MpLmxlbmd0aCA+IDAgPyB0aGlzLnRhZ3MgOiB1bmRlZmluZWQsXG4gICAgICB0cmFjZV9pZDogdGhpcy50cmFjZUlkXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFNwYW4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwID8gdGhpcy5kYXRhIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHBhcmVudF9zcGFuX2lkOiB0aGlzLnBhcmVudFNwYW5JZCxcbiAgICAgIHNwYW5faWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc3RhcnRfdGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IE9iamVjdC5rZXlzKHRoaXMudGFncykubGVuZ3RoID4gMCA/IHRoaXMudGFncyA6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy5lbmRUaW1lc3RhbXAsXG4gICAgICB0cmFjZV9pZDogdGhpcy50cmFjZUlkXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwYW47XG59KCk7XG5cbmV4cG9ydCB7IFNwYW4gfTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6369\n")},6314:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "p": function() { return /* binding */ SpanStatus; }\n/* harmony export */ });\n/** The status of an Span. */\n// eslint-disable-next-line import/export\nvar SpanStatus;\n\n(function (SpanStatus) {\n /** The operation completed successfully. */\n SpanStatus["Ok"] = "ok";\n /** Deadline expired before operation could complete. */\n\n SpanStatus["DeadlineExceeded"] = "deadline_exceeded";\n /** 401 Unauthorized (actually does mean unauthenticated according to RFC 7235) */\n\n SpanStatus["Unauthenticated"] = "unauthenticated";\n /** 403 Forbidden */\n\n SpanStatus["PermissionDenied"] = "permission_denied";\n /** 404 Not Found. Some requested entity (file or directory) was not found. */\n\n SpanStatus["NotFound"] = "not_found";\n /** 429 Too Many Requests */\n\n SpanStatus["ResourceExhausted"] = "resource_exhausted";\n /** Client specified an invalid argument. 4xx. */\n\n SpanStatus["InvalidArgument"] = "invalid_argument";\n /** 501 Not Implemented */\n\n SpanStatus["Unimplemented"] = "unimplemented";\n /** 503 Service Unavailable */\n\n SpanStatus["Unavailable"] = "unavailable";\n /** Other/generic 5xx. */\n\n SpanStatus["InternalError"] = "internal_error";\n /** Unknown. Any non-standard HTTP status code. */\n\n SpanStatus["UnknownError"] = "unknown_error";\n /** The operation was cancelled (typically by the user). */\n\n SpanStatus["Cancelled"] = "cancelled";\n /** Already exists (409) */\n\n SpanStatus["AlreadyExists"] = "already_exists";\n /** Operation was rejected because the system is not in a state required for the operation\'s */\n\n SpanStatus["FailedPrecondition"] = "failed_precondition";\n /** The operation was aborted, typically due to a concurrency issue. */\n\n SpanStatus["Aborted"] = "aborted";\n /** Operation was attempted past the valid range. */\n\n SpanStatus["OutOfRange"] = "out_of_range";\n /** Unrecoverable data loss or corruption */\n\n SpanStatus["DataLoss"] = "data_loss";\n})(SpanStatus || (SpanStatus = {})); // eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n\n\n(function (SpanStatus) {\n /**\n * Converts a HTTP status code into a {@link SpanStatus}.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or {@link SpanStatus.UnknownError}.\n */\n function fromHttpCode(httpStatus) {\n if (httpStatus < 400) {\n return SpanStatus.Ok;\n }\n\n if (httpStatus >= 400 && httpStatus < 500) {\n switch (httpStatus) {\n case 401:\n return SpanStatus.Unauthenticated;\n\n case 403:\n return SpanStatus.PermissionDenied;\n\n case 404:\n return SpanStatus.NotFound;\n\n case 409:\n return SpanStatus.AlreadyExists;\n\n case 413:\n return SpanStatus.FailedPrecondition;\n\n case 429:\n return SpanStatus.ResourceExhausted;\n\n default:\n return SpanStatus.InvalidArgument;\n }\n }\n\n if (httpStatus >= 500 && httpStatus < 600) {\n switch (httpStatus) {\n case 501:\n return SpanStatus.Unimplemented;\n\n case 503:\n return SpanStatus.Unavailable;\n\n case 504:\n return SpanStatus.DeadlineExceeded;\n\n default:\n return SpanStatus.InternalError;\n }\n }\n\n return SpanStatus.UnknownError;\n }\n\n SpanStatus.fromHttpCode = fromHttpCode;\n})(SpanStatus || (SpanStatus = {}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL3NwYW5zdGF0dXMuanM/MjBlNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ087O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLGdDQUFnQyxHQUFHOzs7QUFHcEM7QUFDQTtBQUNBLHlDQUF5QyxpQkFBaUI7QUFDMUQ7QUFDQTtBQUNBLGtDQUFrQyw4QkFBOEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLGdDQUFnQyIsImZpbGUiOiI2MzE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFRoZSBzdGF0dXMgb2YgYW4gU3Bhbi4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvZXhwb3J0XG5leHBvcnQgdmFyIFNwYW5TdGF0dXM7XG5cbihmdW5jdGlvbiAoU3BhblN0YXR1cykge1xuICAvKiogVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAqL1xuICBTcGFuU3RhdHVzW1wiT2tcIl0gPSBcIm9rXCI7XG4gIC8qKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuICovXG5cbiAgU3BhblN0YXR1c1tcIkRlYWRsaW5lRXhjZWVkZWRcIl0gPSBcImRlYWRsaW5lX2V4Y2VlZGVkXCI7XG4gIC8qKiA0MDEgVW5hdXRob3JpemVkIChhY3R1YWxseSBkb2VzIG1lYW4gdW5hdXRoZW50aWNhdGVkIGFjY29yZGluZyB0byBSRkMgNzIzNSkgKi9cblxuICBTcGFuU3RhdHVzW1wiVW5hdXRoZW50aWNhdGVkXCJdID0gXCJ1bmF1dGhlbnRpY2F0ZWRcIjtcbiAgLyoqIDQwMyBGb3JiaWRkZW4gKi9cblxuICBTcGFuU3RhdHVzW1wiUGVybWlzc2lvbkRlbmllZFwiXSA9IFwicGVybWlzc2lvbl9kZW5pZWRcIjtcbiAgLyoqIDQwNCBOb3QgRm91bmQuIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG5cbiAgU3BhblN0YXR1c1tcIk5vdEZvdW5kXCJdID0gXCJub3RfZm91bmRcIjtcbiAgLyoqIDQyOSBUb28gTWFueSBSZXF1ZXN0cyAqL1xuXG4gIFNwYW5TdGF0dXNbXCJSZXNvdXJjZUV4aGF1c3RlZFwiXSA9IFwicmVzb3VyY2VfZXhoYXVzdGVkXCI7XG4gIC8qKiBDbGllbnQgc3BlY2lmaWVkIGFuIGludmFsaWQgYXJndW1lbnQuIDR4eC4gKi9cblxuICBTcGFuU3RhdHVzW1wiSW52YWxpZEFyZ3VtZW50XCJdID0gXCJpbnZhbGlkX2FyZ3VtZW50XCI7XG4gIC8qKiA1MDEgTm90IEltcGxlbWVudGVkICovXG5cbiAgU3BhblN0YXR1c1tcIlVuaW1wbGVtZW50ZWRcIl0gPSBcInVuaW1wbGVtZW50ZWRcIjtcbiAgLyoqIDUwMyBTZXJ2aWNlIFVuYXZhaWxhYmxlICovXG5cbiAgU3BhblN0YXR1c1tcIlVuYXZhaWxhYmxlXCJdID0gXCJ1bmF2YWlsYWJsZVwiO1xuICAvKiogT3RoZXIvZ2VuZXJpYyA1eHguICovXG5cbiAgU3BhblN0YXR1c1tcIkludGVybmFsRXJyb3JcIl0gPSBcImludGVybmFsX2Vycm9yXCI7XG4gIC8qKiBVbmtub3duLiBBbnkgbm9uLXN0YW5kYXJkIEhUVFAgc3RhdHVzIGNvZGUuICovXG5cbiAgU3BhblN0YXR1c1tcIlVua25vd25FcnJvclwiXSA9IFwidW5rbm93bl9lcnJvclwiO1xuICAvKiogVGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkICh0eXBpY2FsbHkgYnkgdGhlIHVzZXIpLiAqL1xuXG4gIFNwYW5TdGF0dXNbXCJDYW5jZWxsZWRcIl0gPSBcImNhbmNlbGxlZFwiO1xuICAvKiogQWxyZWFkeSBleGlzdHMgKDQwOSkgKi9cblxuICBTcGFuU3RhdHVzW1wiQWxyZWFkeUV4aXN0c1wiXSA9IFwiYWxyZWFkeV9leGlzdHNcIjtcbiAgLyoqIE9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3lzdGVtIGlzIG5vdCBpbiBhIHN0YXRlIHJlcXVpcmVkIGZvciB0aGUgb3BlcmF0aW9uJ3MgKi9cblxuICBTcGFuU3RhdHVzW1wiRmFpbGVkUHJlY29uZGl0aW9uXCJdID0gXCJmYWlsZWRfcHJlY29uZGl0aW9uXCI7XG4gIC8qKiBUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLCB0eXBpY2FsbHkgZHVlIHRvIGEgY29uY3VycmVuY3kgaXNzdWUuICovXG5cbiAgU3BhblN0YXR1c1tcIkFib3J0ZWRcIl0gPSBcImFib3J0ZWRcIjtcbiAgLyoqIE9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHBhc3QgdGhlIHZhbGlkIHJhbmdlLiAqL1xuXG4gIFNwYW5TdGF0dXNbXCJPdXRPZlJhbmdlXCJdID0gXCJvdXRfb2ZfcmFuZ2VcIjtcbiAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24gKi9cblxuICBTcGFuU3RhdHVzW1wiRGF0YUxvc3NcIl0gPSBcImRhdGFfbG9zc1wiO1xufSkoU3BhblN0YXR1cyB8fCAoU3BhblN0YXR1cyA9IHt9KSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlLCBpbXBvcnQvZXhwb3J0XG5cblxuKGZ1bmN0aW9uIChTcGFuU3RhdHVzKSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEhUVFAgc3RhdHVzIGNvZGUgaW50byBhIHtAbGluayBTcGFuU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGh0dHBTdGF0dXMgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzcGFuIHN0YXR1cyBvciB7QGxpbmsgU3BhblN0YXR1cy5Vbmtub3duRXJyb3J9LlxuICAgKi9cbiAgZnVuY3Rpb24gZnJvbUh0dHBDb2RlKGh0dHBTdGF0dXMpIHtcbiAgICBpZiAoaHR0cFN0YXR1cyA8IDQwMCkge1xuICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuT2s7XG4gICAgfVxuXG4gICAgaWYgKGh0dHBTdGF0dXMgPj0gNDAwICYmIGh0dHBTdGF0dXMgPCA1MDApIHtcbiAgICAgIHN3aXRjaCAoaHR0cFN0YXR1cykge1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5VbmF1dGhlbnRpY2F0ZWQ7XG5cbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuUGVybWlzc2lvbkRlbmllZDtcblxuICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5Ob3RGb3VuZDtcblxuICAgICAgICBjYXNlIDQwOTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5BbHJlYWR5RXhpc3RzO1xuXG4gICAgICAgIGNhc2UgNDEzOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkZhaWxlZFByZWNvbmRpdGlvbjtcblxuICAgICAgICBjYXNlIDQyOTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5SZXNvdXJjZUV4aGF1c3RlZDtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludmFsaWRBcmd1bWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHR0cFN0YXR1cyA+PSA1MDAgJiYgaHR0cFN0YXR1cyA8IDYwMCkge1xuICAgICAgc3dpdGNoIChodHRwU3RhdHVzKSB7XG4gICAgICAgIGNhc2UgNTAxOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlVuaW1wbGVtZW50ZWQ7XG5cbiAgICAgICAgY2FzZSA1MDM6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuVW5hdmFpbGFibGU7XG5cbiAgICAgICAgY2FzZSA1MDQ6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuRGVhZGxpbmVFeGNlZWRlZDtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludGVybmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFNwYW5TdGF0dXMuVW5rbm93bkVycm9yO1xuICB9XG5cbiAgU3BhblN0YXR1cy5mcm9tSHR0cENvZGUgPSBmcm9tSHR0cENvZGU7XG59KShTcGFuU3RhdHVzIHx8IChTcGFuU3RhdHVzID0ge30pKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6314\n')},5955:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Y\": function() { return /* binding */ Transaction; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_string_trim_end_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8702);\n/* harmony import */ var core_js_modules_es_string_trim_end_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim_end_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7870);\n/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3210);\n/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2649);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2684);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(245);\n/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(150);\n/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6369);\n\n\n\n\n\n\n/** JSDoc */\n\nvar Transaction =\n/** @class */\nfunction (_super) {\n (0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__extends */ .ZT)(Transaction, _super);\n /**\n * This constructor should never be called manually. Those instrumenting tracing should use\n * `Sentry.startTransaction()`, and internal methods should use `hub.startTransaction()`.\n * @internal\n * @hideconstructor\n * @hidden\n */\n\n\n function Transaction(transactionContext, hub) {\n var _this = _super.call(this, transactionContext) || this;\n\n _this._measurements = {};\n /**\n * The reference to the current hub.\n */\n\n _this._hub = (0,_sentry_hub__WEBPACK_IMPORTED_MODULE_2__/* .getCurrentHub */ .Gd)();\n\n if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .isInstanceOf */ .V9)(hub, _sentry_hub__WEBPACK_IMPORTED_MODULE_2__/* .Hub */ .Xb)) {\n _this._hub = hub;\n }\n\n _this.name = transactionContext.name || '';\n _this.metadata = transactionContext.metadata || {};\n _this._trimEnd = transactionContext.trimEnd; // this is because transactions are also spans, and spans have a transaction pointer\n\n _this.transaction = _this;\n return _this;\n }\n /**\n * JSDoc\n */\n\n\n Transaction.prototype.setName = function (name) {\n this.name = name;\n };\n /**\n * Attaches SpanRecorder to the span itself\n * @param maxlen maximum number of spans that can be recorded\n */\n\n\n Transaction.prototype.initSpanRecorder = function (maxlen) {\n if (maxlen === void 0) {\n maxlen = 1000;\n }\n\n if (!this.spanRecorder) {\n this.spanRecorder = new _span__WEBPACK_IMPORTED_MODULE_4__/* .SpanRecorder */ .g(maxlen);\n }\n\n this.spanRecorder.add(this);\n };\n /**\n * Set observed measurements for this transaction.\n * @hidden\n */\n\n\n Transaction.prototype.setMeasurements = function (measurements) {\n this._measurements = (0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__assign */ .pi)({}, measurements);\n };\n /**\n * Set metadata for this transaction.\n * @hidden\n */\n\n\n Transaction.prototype.setMetadata = function (newMetadata) {\n this.metadata = (0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__assign */ .pi)({}, this.metadata), newMetadata);\n };\n /**\n * @inheritDoc\n */\n\n\n Transaction.prototype.finish = function (endTimestamp) {\n var _this = this;\n\n var _a, _b, _c; // This transaction is already finished, so we should not flush it again.\n\n\n if (this.endTimestamp !== undefined) {\n return undefined;\n }\n\n if (!this.name) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .logger.warn */ .k.warn('Transaction has no name, falling back to ``.');\n this.name = '';\n } // just sets the end timestamp\n\n\n _super.prototype.finish.call(this, endTimestamp);\n\n if (this.sampled !== true) {\n // At this point if `sampled !== true` we want to discard the transaction.\n _sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .logger.log */ .k.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.');\n (_c = (_a = this._hub.getClient()) === null || _a === void 0 ? void 0 : (_b = _a.getTransport()).recordLostEvent) === null || _c === void 0 ? void 0 : _c.call(_b, _sentry_types__WEBPACK_IMPORTED_MODULE_6__/* .Outcome.SampleRate */ .k.SampleRate, 'transaction');\n return undefined;\n }\n\n var finishedSpans = this.spanRecorder ? this.spanRecorder.spans.filter(function (s) {\n return s !== _this && s.endTimestamp;\n }) : [];\n\n if (this._trimEnd && finishedSpans.length > 0) {\n this.endTimestamp = finishedSpans.reduce(function (prev, current) {\n if (prev.endTimestamp && current.endTimestamp) {\n return prev.endTimestamp > current.endTimestamp ? prev : current;\n }\n\n return prev;\n }).endTimestamp;\n }\n\n var transaction = {\n contexts: {\n trace: this.getTraceContext()\n },\n spans: finishedSpans,\n start_timestamp: this.startTimestamp,\n tags: this.tags,\n timestamp: this.endTimestamp,\n transaction: this.name,\n type: 'transaction',\n debug_meta: this.metadata\n };\n var hasMeasurements = Object.keys(this._measurements).length > 0;\n\n if (hasMeasurements) {\n _sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .logger.log */ .k.log('[Measurements] Adding measurements to transaction', JSON.stringify(this._measurements, undefined, 2));\n transaction.measurements = this._measurements;\n }\n\n _sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .logger.log */ .k.log(\"[Tracing] Finishing \" + this.op + \" transaction: \" + this.name + \".\");\n return this._hub.captureEvent(transaction);\n };\n /**\n * @inheritDoc\n */\n\n\n Transaction.prototype.toContext = function () {\n var spanContext = _super.prototype.toContext.call(this);\n\n return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_7__/* .dropUndefinedKeys */ .Jr)((0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_1__/* .__assign */ .pi)({}, spanContext), {\n name: this.name,\n trimEnd: this._trimEnd\n }));\n };\n /**\n * @inheritDoc\n */\n\n\n Transaction.prototype.updateWithContext = function (transactionContext) {\n var _a;\n\n _super.prototype.updateWithContext.call(this, transactionContext);\n\n this.name = (_a = transactionContext.name, _a !== null && _a !== void 0 ? _a : '');\n this._trimEnd = transactionContext.trimEnd;\n return this;\n };\n\n return Transaction;\n}(_span__WEBPACK_IMPORTED_MODULE_4__/* .Span */ .D);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL3RyYW5zYWN0aW9uLmpzPzMwNGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQStDO0FBQ0g7QUFDSztBQUNUO0FBQ2dDO0FBQ2Y7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRSwwREFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixvRUFBYTs7QUFFOUIsUUFBUSxxRUFBWSxNQUFNLHNEQUFHO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsd0RBQVk7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLHlCQUF5Qix5REFBUSxHQUFHO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0Esb0JBQW9CLHlEQUFRLENBQUMseURBQVEsR0FBRztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxtQkFBbUI7OztBQUduQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLG9FQUFXO0FBQ2pCO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBLE1BQU0sa0VBQVU7QUFDaEIseUtBQXlLLGlGQUFrQjtBQUMzTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sa0VBQVU7QUFDaEI7QUFDQTs7QUFFQSxJQUFJLGtFQUFVO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxXQUFXLDBFQUFpQixDQUFDLHlEQUFRLENBQUMseURBQVEsR0FBRztBQUNqRDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxDQUFDLGdEQUFTIiwiZmlsZSI6IjU5NTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzXCI7XG5pbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50SHViLCBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBPdXRjb21lIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgaXNJbnN0YW5jZU9mLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IFNwYW4gYXMgU3BhbkNsYXNzLCBTcGFuUmVjb3JkZXIgfSBmcm9tICcuL3NwYW4nO1xuLyoqIEpTRG9jICovXG5cbnZhciBUcmFuc2FjdGlvbiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhUcmFuc2FjdGlvbiwgX3N1cGVyKTtcbiAgLyoqXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBtYW51YWxseS4gVGhvc2UgaW5zdHJ1bWVudGluZyB0cmFjaW5nIHNob3VsZCB1c2VcbiAgICogYFNlbnRyeS5zdGFydFRyYW5zYWN0aW9uKClgLCBhbmQgaW50ZXJuYWwgbWV0aG9kcyBzaG91bGQgdXNlIGBodWIuc3RhcnRUcmFuc2FjdGlvbigpYC5cbiAgICogQGludGVybmFsXG4gICAqIEBoaWRlY29uc3RydWN0b3JcbiAgICogQGhpZGRlblxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgaHViKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHJhbnNhY3Rpb25Db250ZXh0KSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuX21lYXN1cmVtZW50cyA9IHt9O1xuICAgIC8qKlxuICAgICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaHViLlxuICAgICAqL1xuXG4gICAgX3RoaXMuX2h1YiA9IGdldEN1cnJlbnRIdWIoKTtcblxuICAgIGlmIChpc0luc3RhbmNlT2YoaHViLCBIdWIpKSB7XG4gICAgICBfdGhpcy5faHViID0gaHViO1xuICAgIH1cblxuICAgIF90aGlzLm5hbWUgPSB0cmFuc2FjdGlvbkNvbnRleHQubmFtZSB8fCAnJztcbiAgICBfdGhpcy5tZXRhZGF0YSA9IHRyYW5zYWN0aW9uQ29udGV4dC5tZXRhZGF0YSB8fCB7fTtcbiAgICBfdGhpcy5fdHJpbUVuZCA9IHRyYW5zYWN0aW9uQ29udGV4dC50cmltRW5kOyAvLyB0aGlzIGlzIGJlY2F1c2UgdHJhbnNhY3Rpb25zIGFyZSBhbHNvIHNwYW5zLCBhbmQgc3BhbnMgaGF2ZSBhIHRyYW5zYWN0aW9uIHBvaW50ZXJcblxuICAgIF90aGlzLnRyYW5zYWN0aW9uID0gX3RoaXM7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBKU0RvY1xuICAgKi9cblxuXG4gIFRyYW5zYWN0aW9uLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9O1xuICAvKipcbiAgICogQXR0YWNoZXMgU3BhblJlY29yZGVyIHRvIHRoZSBzcGFuIGl0c2VsZlxuICAgKiBAcGFyYW0gbWF4bGVuIG1heGltdW0gbnVtYmVyIG9mIHNwYW5zIHRoYXQgY2FuIGJlIHJlY29yZGVkXG4gICAqL1xuXG5cbiAgVHJhbnNhY3Rpb24ucHJvdG90eXBlLmluaXRTcGFuUmVjb3JkZXIgPSBmdW5jdGlvbiAobWF4bGVuKSB7XG4gICAgaWYgKG1heGxlbiA9PT0gdm9pZCAwKSB7XG4gICAgICBtYXhsZW4gPSAxMDAwO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zcGFuUmVjb3JkZXIpIHtcbiAgICAgIHRoaXMuc3BhblJlY29yZGVyID0gbmV3IFNwYW5SZWNvcmRlcihtYXhsZW4pO1xuICAgIH1cblxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfTtcbiAgLyoqXG4gICAqIFNldCBvYnNlcnZlZCBtZWFzdXJlbWVudHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG5cblxuICBUcmFuc2FjdGlvbi5wcm90b3R5cGUuc2V0TWVhc3VyZW1lbnRzID0gZnVuY3Rpb24gKG1lYXN1cmVtZW50cykge1xuICAgIHRoaXMuX21lYXN1cmVtZW50cyA9IF9fYXNzaWduKHt9LCBtZWFzdXJlbWVudHMpO1xuICB9O1xuICAvKipcbiAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuXG5cbiAgVHJhbnNhY3Rpb24ucHJvdG90eXBlLnNldE1ldGFkYXRhID0gZnVuY3Rpb24gKG5ld01ldGFkYXRhKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLm1ldGFkYXRhKSwgbmV3TWV0YWRhdGEpO1xuICB9O1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG5cblxuICBUcmFuc2FjdGlvbi5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKGVuZFRpbWVzdGFtcCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgX2EsIF9iLCBfYzsgLy8gVGhpcyB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyB3ZSBzaG91bGQgbm90IGZsdXNoIGl0IGFnYWluLlxuXG5cbiAgICBpZiAodGhpcy5lbmRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1RyYW5zYWN0aW9uIGhhcyBubyBuYW1lLCBmYWxsaW5nIGJhY2sgdG8gYDx1bmxhYmVsZWQgdHJhbnNhY3Rpb24+YC4nKTtcbiAgICAgIHRoaXMubmFtZSA9ICc8dW5sYWJlbGVkIHRyYW5zYWN0aW9uPic7XG4gICAgfSAvLyBqdXN0IHNldHMgdGhlIGVuZCB0aW1lc3RhbXBcblxuXG4gICAgX3N1cGVyLnByb3RvdHlwZS5maW5pc2guY2FsbCh0aGlzLCBlbmRUaW1lc3RhbXApO1xuXG4gICAgaWYgKHRoaXMuc2FtcGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCBpZiBgc2FtcGxlZCAhPT0gdHJ1ZWAgd2Ugd2FudCB0byBkaXNjYXJkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgaXRzIHRyYWNlIHdhcyBub3QgY2hvc2VuIHRvIGJlIHNhbXBsZWQuJyk7XG4gICAgICAoX2MgPSAoX2EgPSB0aGlzLl9odWIuZ2V0Q2xpZW50KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2IgPSBfYS5nZXRUcmFuc3BvcnQoKSkucmVjb3JkTG9zdEV2ZW50KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FsbChfYiwgT3V0Y29tZS5TYW1wbGVSYXRlLCAndHJhbnNhY3Rpb24nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIGZpbmlzaGVkU3BhbnMgPSB0aGlzLnNwYW5SZWNvcmRlciA/IHRoaXMuc3BhblJlY29yZGVyLnNwYW5zLmZpbHRlcihmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMgIT09IF90aGlzICYmIHMuZW5kVGltZXN0YW1wO1xuICAgIH0pIDogW107XG5cbiAgICBpZiAodGhpcy5fdHJpbUVuZCAmJiBmaW5pc2hlZFNwYW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW5kVGltZXN0YW1wID0gZmluaXNoZWRTcGFucy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKHByZXYuZW5kVGltZXN0YW1wICYmIGN1cnJlbnQuZW5kVGltZXN0YW1wKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXYuZW5kVGltZXN0YW1wID4gY3VycmVudC5lbmRUaW1lc3RhbXAgPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSkuZW5kVGltZXN0YW1wO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2FjdGlvbiA9IHtcbiAgICAgIGNvbnRleHRzOiB7XG4gICAgICAgIHRyYWNlOiB0aGlzLmdldFRyYWNlQ29udGV4dCgpXG4gICAgICB9LFxuICAgICAgc3BhbnM6IGZpbmlzaGVkU3BhbnMsXG4gICAgICBzdGFydF90aW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgdHJhbnNhY3Rpb246IHRoaXMubmFtZSxcbiAgICAgIHR5cGU6ICd0cmFuc2FjdGlvbicsXG4gICAgICBkZWJ1Z19tZXRhOiB0aGlzLm1ldGFkYXRhXG4gICAgfTtcbiAgICB2YXIgaGFzTWVhc3VyZW1lbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWVhc3VyZW1lbnRzKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKGhhc01lYXN1cmVtZW50cykge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIG1lYXN1cmVtZW50cyB0byB0cmFuc2FjdGlvbicsIEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVtZW50cywgdW5kZWZpbmVkLCAyKSk7XG4gICAgICB0cmFuc2FjdGlvbi5tZWFzdXJlbWVudHMgPSB0aGlzLl9tZWFzdXJlbWVudHM7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZyhcIltUcmFjaW5nXSBGaW5pc2hpbmcgXCIgKyB0aGlzLm9wICsgXCIgdHJhbnNhY3Rpb246IFwiICsgdGhpcy5uYW1lICsgXCIuXCIpO1xuICAgIHJldHVybiB0aGlzLl9odWIuY2FwdHVyZUV2ZW50KHRyYW5zYWN0aW9uKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuXG5cbiAgVHJhbnNhY3Rpb24ucHJvdG90eXBlLnRvQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3BhbkNvbnRleHQgPSBfc3VwZXIucHJvdG90eXBlLnRvQ29udGV4dC5jYWxsKHRoaXMpO1xuXG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzcGFuQ29udGV4dCksIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHRyaW1FbmQ6IHRoaXMuX3RyaW1FbmRcbiAgICB9KSk7XG4gIH07XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cblxuXG4gIFRyYW5zYWN0aW9uLnByb3RvdHlwZS51cGRhdGVXaXRoQ29udGV4dCA9IGZ1bmN0aW9uICh0cmFuc2FjdGlvbkNvbnRleHQpIHtcbiAgICB2YXIgX2E7XG5cbiAgICBfc3VwZXIucHJvdG90eXBlLnVwZGF0ZVdpdGhDb250ZXh0LmNhbGwodGhpcywgdHJhbnNhY3Rpb25Db250ZXh0KTtcblxuICAgIHRoaXMubmFtZSA9IChfYSA9IHRyYW5zYWN0aW9uQ29udGV4dC5uYW1lLCBfYSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJyk7XG4gICAgdGhpcy5fdHJpbUVuZCA9IHRyYW5zYWN0aW9uQ29udGV4dC50cmltRW5kO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2FjdGlvbjtcbn0oU3BhbkNsYXNzKTtcblxuZXhwb3J0IHsgVHJhbnNhY3Rpb24gfTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5955\n")},2662:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Ke\": function() { return /* binding */ TRACEPARENT_REGEXP; },\n/* harmony export */ \"zu\": function() { return /* binding */ hasTracingEnabled; },\n/* harmony export */ \"qG\": function() { return /* binding */ extractTraceparentData; },\n/* harmony export */ \"x1\": function() { return /* binding */ getActiveTransaction; },\n/* harmony export */ \"XL\": function() { return /* binding */ msToSec; },\n/* harmony export */ \"WB\": function() { return /* binding */ secToMs; }\n/* harmony export */ });\n/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3210);\n\nvar TRACEPARENT_REGEXP = new RegExp('^[ \\\\t]*' + // whitespace\n'([0-9a-f]{32})?' + // trace_id\n'-?([0-9a-f]{16})?' + // span_id\n'-?([01])?' + // sampled\n'[ \\\\t]*$');\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\n\nfunction hasTracingEnabled(options) {\n if (options === void 0) {\n options = (_a = (0,_sentry_hub__WEBPACK_IMPORTED_MODULE_0__/* .getCurrentHub */ .Gd)().getClient()) === null || _a === void 0 ? void 0 : _a.getOptions();\n }\n\n var _a;\n\n if (!options) {\n return false;\n }\n\n return 'tracesSampleRate' in options || 'tracesSampler' in options;\n}\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\n\nfunction extractTraceparentData(traceparent) {\n var matches = traceparent.match(TRACEPARENT_REGEXP);\n\n if (matches) {\n var parentSampled = void 0;\n\n if (matches[3] === '1') {\n parentSampled = true;\n } else if (matches[3] === '0') {\n parentSampled = false;\n }\n\n return {\n traceId: matches[1],\n parentSampled: parentSampled,\n parentSpanId: matches[2]\n };\n }\n\n return undefined;\n}\n/** Grabs active transaction off scope, if any */\n\nfunction getActiveTransaction(hub) {\n if (hub === void 0) {\n hub = (0,_sentry_hub__WEBPACK_IMPORTED_MODULE_0__/* .getCurrentHub */ .Gd)();\n }\n\n var _a, _b;\n\n return (_b = (_a = hub) === null || _a === void 0 ? void 0 : _a.getScope()) === null || _b === void 0 ? void 0 : _b.getTransaction();\n}\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\n\nfunction msToSec(time) {\n return time / 1000;\n}\n/**\n * Converts from seconds to milliseconds\n * @param time time in seconds\n */\n\nfunction secToMs(time) {\n return time * 1000;\n} // so it can be used in manual instrumentation without necessitating a hard dependency on @sentry/utils\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvZXNtL3V0aWxzLmpzPzMyNGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQTRDO0FBQ3JDO0FBQ1AsV0FBVyxHQUFHO0FBQ2QsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQSxvQkFBb0Isb0VBQWE7QUFDakM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBLFVBQVUsb0VBQWE7QUFDdkI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQSxDQUFDIiwiZmlsZSI6IjI2NjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuZXhwb3J0IHZhciBUUkFDRVBBUkVOVF9SRUdFWFAgPSBuZXcgUmVnRXhwKCdeWyBcXFxcdF0qJyArIC8vIHdoaXRlc3BhY2VcbicoWzAtOWEtZl17MzJ9KT8nICsgLy8gdHJhY2VfaWRcbictPyhbMC05YS1mXXsxNn0pPycgKyAvLyBzcGFuX2lkXG4nLT8oWzAxXSk/JyArIC8vIHNhbXBsZWRcbidbIFxcXFx0XSokJyk7XG4vKipcbiAqIERldGVybWluZXMgaWYgdHJhY2luZyBpcyBjdXJyZW50bHkgZW5hYmxlZC5cbiAqXG4gKiBUcmFjaW5nIGlzIGVuYWJsZWQgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYHRyYWNlc1NhbXBsZVJhdGVgIGFuZCBgdHJhY2VzU2FtcGxlcmAgaXMgZGVmaW5lZCBpbiB0aGUgU0RLIGNvbmZpZy5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzVHJhY2luZ0VuYWJsZWQob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IChfYSA9IGdldEN1cnJlbnRIdWIoKS5nZXRDbGllbnQoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldE9wdGlvbnMoKTtcbiAgfVxuXG4gIHZhciBfYTtcblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gJ3RyYWNlc1NhbXBsZVJhdGUnIGluIG9wdGlvbnMgfHwgJ3RyYWNlc1NhbXBsZXInIGluIG9wdGlvbnM7XG59XG4vKipcbiAqIEV4dHJhY3QgdHJhbnNhY3Rpb24gY29udGV4dCBkYXRhIGZyb20gYSBgc2VudHJ5LXRyYWNlYCBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHRyYWNlcGFyZW50IFRyYWNlcGFyZW50IHN0cmluZ1xuICpcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGRhdGEgZnJvbSB0aGUgaGVhZGVyLCBvciB1bmRlZmluZWQgaWYgdHJhY2VwYXJlbnQgc3RyaW5nIGlzIG1hbGZvcm1lZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VHJhY2VwYXJlbnREYXRhKHRyYWNlcGFyZW50KSB7XG4gIHZhciBtYXRjaGVzID0gdHJhY2VwYXJlbnQubWF0Y2goVFJBQ0VQQVJFTlRfUkVHRVhQKTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIHZhciBwYXJlbnRTYW1wbGVkID0gdm9pZCAwO1xuXG4gICAgaWYgKG1hdGNoZXNbM10gPT09ICcxJykge1xuICAgICAgcGFyZW50U2FtcGxlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzWzNdID09PSAnMCcpIHtcbiAgICAgIHBhcmVudFNhbXBsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2VJZDogbWF0Y2hlc1sxXSxcbiAgICAgIHBhcmVudFNhbXBsZWQ6IHBhcmVudFNhbXBsZWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IG1hdGNoZXNbMl1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKiBHcmFicyBhY3RpdmUgdHJhbnNhY3Rpb24gb2ZmIHNjb3BlLCBpZiBhbnkgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVRyYW5zYWN0aW9uKGh1Yikge1xuICBpZiAoaHViID09PSB2b2lkIDApIHtcbiAgICBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gIH1cblxuICB2YXIgX2EsIF9iO1xuXG4gIHJldHVybiAoX2IgPSAoX2EgPSBodWIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRTY29wZSgpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZ2V0VHJhbnNhY3Rpb24oKTtcbn1cbi8qKlxuICogQ29udmVydHMgZnJvbSBtaWxsaXNlY29uZHMgdG8gc2Vjb25kc1xuICogQHBhcmFtIHRpbWUgdGltZSBpbiBtc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtc1RvU2VjKHRpbWUpIHtcbiAgcmV0dXJuIHRpbWUgLyAxMDAwO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGltZSB0aW1lIGluIHNlY29uZHNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2VjVG9Ncyh0aW1lKSB7XG4gIHJldHVybiB0aW1lICogMTAwMDtcbn0gLy8gc28gaXQgY2FuIGJlIHVzZWQgaW4gbWFudWFsIGluc3RydW1lbnRhdGlvbiB3aXRob3V0IG5lY2Vzc2l0YXRpbmcgYSBoYXJkIGRlcGVuZGVuY3kgb24gQHNlbnRyeS91dGlsc1xuXG5leHBvcnQgeyBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJzsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2662\n")},7870:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "ZT": function() { return /* binding */ __extends; },\n/* harmony export */ "pi": function() { return /* binding */ _assign; },\n/* harmony export */ "_T": function() { return /* binding */ __rest; },\n/* harmony export */ "XA": function() { return /* binding */ __values; },\n/* harmony export */ "CR": function() { return /* binding */ __read; },\n/* harmony export */ "fl": function() { return /* binding */ __spread; }\n/* harmony export */ });\n/* unused harmony exports __decorate, __param, __metadata, __awaiter, __generator, __createBinding, __exportStar, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault, __classPrivateFieldGet, __classPrivateFieldSet */\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return _assign.apply(this, arguments);\n};\n\n\nfunction __rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction __createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction __exportStar(m, exports) {\n for (var p in m) {\n if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to get private field on non-instance");\n }\n\n return privateMap.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to set private field on non-instance");\n }\n\n privateMap.set(receiver, value);\n return value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcz8wMTc2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDLE9BQU87QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUUrQjtBQUN4QjtBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwySEFBMkgsY0FBYztBQUN6STtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsaUlBQWlJLHdDQUF3QyxRQUFRO0FBQ2pMO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1AsMEJBQTBCLHNCQUFzQjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDTztBQUNQLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7O0FBRUEsc0NBQXNDLFFBQVE7QUFDOUMsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLHlHQUF5RztBQUN6RztBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNzg3MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXG52YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgIF9fcHJvdG9fXzogW11cbiAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZC5fX3Byb3RvX18gPSBiO1xuICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgfVxuXG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxudmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgeyBfYXNzaWduIGFzIF9fYXNzaWduIH07XG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICB9XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLFxuICAgICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgfVxuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHtcbiAgICBsYWJlbDogMCxcbiAgICBzZW50OiBmdW5jdGlvbiBzZW50KCkge1xuICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgICAgcmV0dXJuIHRbMV07XG4gICAgfSxcbiAgICB0cnlzOiBbXSxcbiAgICBvcHM6IFtdXG4gIH0sXG4gICAgICBmLFxuICAgICAgeSxcbiAgICAgIHQsXG4gICAgICBnO1xuICByZXR1cm4gZyA9IHtcbiAgICBuZXh0OiB2ZXJiKDApLFxuICAgIFwidGhyb3dcIjogdmVyYigxKSxcbiAgICBcInJldHVyblwiOiB2ZXJiKDIpXG4gIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZztcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBzdGVwKFtuLCB2XSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG5cbiAgICB3aGlsZSAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG5cbiAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSxcbiAgICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgICBvcCA9IFswXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgb3AgPSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgICBfID0gMDtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdO1xuICAgICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTtcblxuICAgICAgICAgICAgICBfLm9wcy5wdXNoKG9wKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgICB5ID0gMDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGYgPSB0ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsXG4gICAgICBkb25lOiB0cnVlXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59XG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcbiAgZm9yICh2YXIgcCBpbiBtKSB7XG4gICAgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgbSA9IHMgJiYgb1tzXSxcbiAgICAgIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG8gJiYgb1tpKytdLFxuICAgICAgICBkb25lOiAhb1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLFxuICAgICAgcixcbiAgICAgIGFyID0gW10sXG4gICAgICBlO1xuXG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGUpIHRocm93IGUuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKSB7XG4gICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspIHtcbiAgICAgIHJba10gPSBhW2pdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSxcbiAgICAgIGksXG4gICAgICBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXAocikge1xuICAgIHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJlc3VtZShcIm5leHRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHtcbiAgICBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgdGhyb3cgZTtcbiAgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHtcbiAgICBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gKHAgPSAhcCkgPyB7XG4gICAgICAgIHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLFxuICAgICAgICBkb25lOiBuID09PSBcInJldHVyblwiXG4gICAgICB9IDogZiA/IGYodikgOiB2O1xuICAgIH0gOiBmO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sXG4gICAgICBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpKTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikge1xuICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIGRvbmU6IGRcbiAgICAgIH0pO1xuICAgIH0sIHJlamVjdCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwge1xuICAgICAgdmFsdWU6IHJhd1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvb2tlZC5yYXcgPSByYXc7XG4gIH1cblxuICByZXR1cm4gY29va2VkO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgfVxuICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7870\n')},2355:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "$": function() { return /* binding */ SessionStatus; }\n/* harmony export */ });\n/* unused harmony export RequestSessionStatus */\n/**\n * Session Status\n */\nvar SessionStatus;\n\n(function (SessionStatus) {\n /** JSDoc */\n SessionStatus["Ok"] = "ok";\n /** JSDoc */\n\n SessionStatus["Exited"] = "exited";\n /** JSDoc */\n\n SessionStatus["Crashed"] = "crashed";\n /** JSDoc */\n\n SessionStatus["Abnormal"] = "abnormal";\n})(SessionStatus || (SessionStatus = {}));\n\nvar RequestSessionStatus;\n\n(function (RequestSessionStatus) {\n /** JSDoc */\n RequestSessionStatus["Ok"] = "ok";\n /** JSDoc */\n\n RequestSessionStatus["Errored"] = "errored";\n /** JSDoc */\n\n RequestSessionStatus["Crashed"] = "crashed";\n})(RequestSessionStatus || (RequestSessionStatus = {}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS9zZXNzaW9uLmpzPzIwZjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUMsc0NBQXNDOztBQUVoQzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxvREFBb0QiLCJmaWxlIjoiMjM1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2Vzc2lvbiBTdGF0dXNcbiAqL1xuZXhwb3J0IHZhciBTZXNzaW9uU3RhdHVzO1xuXG4oZnVuY3Rpb24gKFNlc3Npb25TdGF0dXMpIHtcbiAgLyoqIEpTRG9jICovXG4gIFNlc3Npb25TdGF0dXNbXCJPa1wiXSA9IFwib2tcIjtcbiAgLyoqIEpTRG9jICovXG5cbiAgU2Vzc2lvblN0YXR1c1tcIkV4aXRlZFwiXSA9IFwiZXhpdGVkXCI7XG4gIC8qKiBKU0RvYyAqL1xuXG4gIFNlc3Npb25TdGF0dXNbXCJDcmFzaGVkXCJdID0gXCJjcmFzaGVkXCI7XG4gIC8qKiBKU0RvYyAqL1xuXG4gIFNlc3Npb25TdGF0dXNbXCJBYm5vcm1hbFwiXSA9IFwiYWJub3JtYWxcIjtcbn0pKFNlc3Npb25TdGF0dXMgfHwgKFNlc3Npb25TdGF0dXMgPSB7fSkpO1xuXG5leHBvcnQgdmFyIFJlcXVlc3RTZXNzaW9uU3RhdHVzO1xuXG4oZnVuY3Rpb24gKFJlcXVlc3RTZXNzaW9uU3RhdHVzKSB7XG4gIC8qKiBKU0RvYyAqL1xuICBSZXF1ZXN0U2Vzc2lvblN0YXR1c1tcIk9rXCJdID0gXCJva1wiO1xuICAvKiogSlNEb2MgKi9cblxuICBSZXF1ZXN0U2Vzc2lvblN0YXR1c1tcIkVycm9yZWRcIl0gPSBcImVycm9yZWRcIjtcbiAgLyoqIEpTRG9jICovXG5cbiAgUmVxdWVzdFNlc3Npb25TdGF0dXNbXCJDcmFzaGVkXCJdID0gXCJjcmFzaGVkXCI7XG59KShSZXF1ZXN0U2Vzc2lvblN0YXR1cyB8fCAoUmVxdWVzdFNlc3Npb25TdGF0dXMgPSB7fSkpOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2355\n')},2649:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "k": function() { return /* binding */ Outcome; }\n/* harmony export */ });\nvar Outcome;\n\n(function (Outcome) {\n Outcome["BeforeSend"] = "before_send";\n Outcome["EventProcessor"] = "event_processor";\n Outcome["NetworkError"] = "network_error";\n Outcome["QueueOverflow"] = "queue_overflow";\n Outcome["RateLimitBackoff"] = "ratelimit_backoff";\n Outcome["SampleRate"] = "sample_rate";\n})(Outcome || (Outcome = {}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS90cmFuc3BvcnQuanM/MDc3OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMEJBQTBCIiwiZmlsZSI6IjI2NDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIE91dGNvbWU7XG5cbihmdW5jdGlvbiAoT3V0Y29tZSkge1xuICBPdXRjb21lW1wiQmVmb3JlU2VuZFwiXSA9IFwiYmVmb3JlX3NlbmRcIjtcbiAgT3V0Y29tZVtcIkV2ZW50UHJvY2Vzc29yXCJdID0gXCJldmVudF9wcm9jZXNzb3JcIjtcbiAgT3V0Y29tZVtcIk5ldHdvcmtFcnJvclwiXSA9IFwibmV0d29ya19lcnJvclwiO1xuICBPdXRjb21lW1wiUXVldWVPdmVyZmxvd1wiXSA9IFwicXVldWVfb3ZlcmZsb3dcIjtcbiAgT3V0Y29tZVtcIlJhdGVMaW1pdEJhY2tvZmZcIl0gPSBcInJhdGVsaW1pdF9iYWNrb2ZmXCI7XG4gIE91dGNvbWVbXCJTYW1wbGVSYXRlXCJdID0gXCJzYW1wbGVfcmF0ZVwiO1xufSkoT3V0Y29tZSB8fCAoT3V0Y29tZSA9IHt9KSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2649\n')},595:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "R": function() { return /* binding */ htmlTreeAsString; }\n/* harmony export */ });\n/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2684);\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\n\nfunction htmlTreeAsString(elem, keyAttrs) {\n // try/catch both:\n // - accessing event.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it\'s complex, and just accessing the DOM incorrectly\n // - can throw an exception in some circumstances.\n try {\n var currentElem = elem;\n var MAX_TRAVERSE_HEIGHT = 5;\n var MAX_OUTPUT_LEN = 80;\n var out = [];\n var height = 0;\n var len = 0;\n var separator = \' > \';\n var sepLength = separator.length;\n var nextStr = void 0; // eslint-disable-next-line no-plusplus\n\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem, keyAttrs); // bail out if\n // - nextStr is the \'html\' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n\n if (nextStr === \'html\' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) {\n break;\n }\n\n out.push(nextStr);\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n\n return out.reverse().join(separator);\n } catch (_oO) {\n return \'\';\n }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\n\nfunction _htmlElementAsString(el, keyAttrs) {\n var _a, _b;\n\n var elem = el;\n var out = [];\n var className;\n var classes;\n var key;\n var attr;\n var i;\n\n if (!elem || !elem.tagName) {\n return \'\';\n }\n\n out.push(elem.tagName.toLowerCase()); // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n\n var keyAttrPairs = ((_a = keyAttrs) === null || _a === void 0 ? void 0 : _a.length) ? keyAttrs.filter(function (keyAttr) {\n return elem.getAttribute(keyAttr);\n }).map(function (keyAttr) {\n return [keyAttr, elem.getAttribute(keyAttr)];\n }) : null;\n\n if ((_b = keyAttrPairs) === null || _b === void 0 ? void 0 : _b.length) {\n keyAttrPairs.forEach(function (keyAttrPair) {\n out.push("[" + keyAttrPair[0] + "=\\"" + keyAttrPair[1] + "\\"]");\n });\n } else {\n if (elem.id) {\n out.push("#" + elem.id);\n } // eslint-disable-next-line prefer-const\n\n\n className = elem.className;\n\n if (className && (0,_is__WEBPACK_IMPORTED_MODULE_0__/* .isString */ .HD)(className)) {\n classes = className.split(/\\s+/);\n\n for (i = 0; i < classes.length; i++) {\n out.push("." + classes[i]);\n }\n }\n }\n\n var allowedAttrs = [\'type\', \'name\', \'title\', \'alt\'];\n\n for (i = 0; i < allowedAttrs.length; i++) {\n key = allowedAttrs[i];\n attr = elem.getAttribute(key);\n\n if (attr) {\n out.push("[" + key + "=\\"" + attr + "\\"]");\n }\n }\n\n return out.join(\'\');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9icm93c2VyLmpzPzgzMmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUEscUJBQXFCLHVEQUFRO0FBQzdCOztBQUVBLGlCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsYUFBYSx5QkFBeUI7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjU5NS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG4vKipcbiAqIEdpdmVuIGEgY2hpbGQgRE9NIGVsZW1lbnQsIHJldHVybnMgYSBxdWVyeS1zZWxlY3RvciBzdGF0ZW1lbnQgZGVzY3JpYmluZyB0aGF0XG4gKiBhbmQgaXRzIGFuY2VzdG9yc1xuICogZS5nLiBbSFRNTEVsZW1lbnRdID0+IGJvZHkgPiBkaXYgPiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUcmVlQXNTdHJpbmcoZWxlbSwga2V5QXR0cnMpIHtcbiAgLy8gdHJ5L2NhdGNoIGJvdGg6XG4gIC8vIC0gYWNjZXNzaW5nIGV2ZW50LnRhcmdldCAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG4gIC8vIC0gYGh0bWxUcmVlQXNTdHJpbmdgIGJlY2F1c2UgaXQncyBjb21wbGV4LCBhbmQganVzdCBhY2Nlc3NpbmcgdGhlIERPTSBpbmNvcnJlY3RseVxuICAvLyAtIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSBjaXJjdW1zdGFuY2VzLlxuICB0cnkge1xuICAgIHZhciBjdXJyZW50RWxlbSA9IGVsZW07XG4gICAgdmFyIE1BWF9UUkFWRVJTRV9IRUlHSFQgPSA1O1xuICAgIHZhciBNQVhfT1VUUFVUX0xFTiA9IDgwO1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICB2YXIgbGVuID0gMDtcbiAgICB2YXIgc2VwYXJhdG9yID0gJyA+ICc7XG4gICAgdmFyIHNlcExlbmd0aCA9IHNlcGFyYXRvci5sZW5ndGg7XG4gICAgdmFyIG5leHRTdHIgPSB2b2lkIDA7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuXG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtICYmIGhlaWdodCsrIDwgTUFYX1RSQVZFUlNFX0hFSUdIVCkge1xuICAgICAgbmV4dFN0ciA9IF9odG1sRWxlbWVudEFzU3RyaW5nKGN1cnJlbnRFbGVtLCBrZXlBdHRycyk7IC8vIGJhaWwgb3V0IGlmXG4gICAgICAvLyAtIG5leHRTdHIgaXMgdGhlICdodG1sJyBlbGVtZW50XG4gICAgICAvLyAtIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IHdvdWxkIGJlIGNyZWF0ZWQgZXhjZWVkcyBNQVhfT1VUUFVUX0xFTlxuICAgICAgLy8gICAoaWdub3JlIHRoaXMgbGltaXQgaWYgd2UgYXJlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24pXG5cbiAgICAgIGlmIChuZXh0U3RyID09PSAnaHRtbCcgfHwgaGVpZ2h0ID4gMSAmJiBsZW4gKyBvdXQubGVuZ3RoICogc2VwTGVuZ3RoICsgbmV4dFN0ci5sZW5ndGggPj0gTUFYX09VVFBVVF9MRU4pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG91dC5wdXNoKG5leHRTdHIpO1xuICAgICAgbGVuICs9IG5leHRTdHIubGVuZ3RoO1xuICAgICAgY3VycmVudEVsZW0gPSBjdXJyZW50RWxlbS5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQucmV2ZXJzZSgpLmpvaW4oc2VwYXJhdG9yKTtcbiAgfSBjYXRjaCAoX29PKSB7XG4gICAgcmV0dXJuICc8dW5rbm93bj4nO1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBzaW1wbGUsIHF1ZXJ5LXNlbGVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIGEgRE9NIGVsZW1lbnRcbiAqIGUuZy4gW0hUTUxFbGVtZW50XSA9PiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cblxuZnVuY3Rpb24gX2h0bWxFbGVtZW50QXNTdHJpbmcoZWwsIGtleUF0dHJzKSB7XG4gIHZhciBfYSwgX2I7XG5cbiAgdmFyIGVsZW0gPSBlbDtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgY2xhc3NOYW1lO1xuICB2YXIgY2xhc3NlcztcbiAgdmFyIGtleTtcbiAgdmFyIGF0dHI7XG4gIHZhciBpO1xuXG4gIGlmICghZWxlbSB8fCAhZWxlbS50YWdOYW1lKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb3V0LnB1c2goZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOyAvLyBQYWlycyBvZiBhdHRyaWJ1dGUga2V5cyBkZWZpbmVkIGluIGBzZXJpYWxpemVBdHRyaWJ1dGVgIGFuZCB0aGVpciB2YWx1ZXMgb24gZWxlbWVudC5cblxuICB2YXIga2V5QXR0clBhaXJzID0gKChfYSA9IGtleUF0dHJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA/IGtleUF0dHJzLmZpbHRlcihmdW5jdGlvbiAoa2V5QXR0cikge1xuICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShrZXlBdHRyKTtcbiAgfSkubWFwKGZ1bmN0aW9uIChrZXlBdHRyKSB7XG4gICAgcmV0dXJuIFtrZXlBdHRyLCBlbGVtLmdldEF0dHJpYnV0ZShrZXlBdHRyKV07XG4gIH0pIDogbnVsbDtcblxuICBpZiAoKF9iID0ga2V5QXR0clBhaXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB7XG4gICAga2V5QXR0clBhaXJzLmZvckVhY2goZnVuY3Rpb24gKGtleUF0dHJQYWlyKSB7XG4gICAgICBvdXQucHVzaChcIltcIiArIGtleUF0dHJQYWlyWzBdICsgXCI9XFxcIlwiICsga2V5QXR0clBhaXJbMV0gKyBcIlxcXCJdXCIpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChlbGVtLmlkKSB7XG4gICAgICBvdXQucHVzaChcIiNcIiArIGVsZW0uaWQpO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuXG5cbiAgICBjbGFzc05hbWUgPSBlbGVtLmNsYXNzTmFtZTtcblxuICAgIGlmIChjbGFzc05hbWUgJiYgaXNTdHJpbmcoY2xhc3NOYW1lKSkge1xuICAgICAgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXQucHVzaChcIi5cIiArIGNsYXNzZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBhbGxvd2VkQXR0cnMgPSBbJ3R5cGUnLCAnbmFtZScsICd0aXRsZScsICdhbHQnXTtcblxuICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gYWxsb3dlZEF0dHJzW2ldO1xuICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShrZXkpO1xuXG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIG91dC5wdXNoKFwiW1wiICsga2V5ICsgXCI9XFxcIlwiICsgYXR0ciArIFwiXFxcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///595\n')},6710:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"o\": function() { return /* binding */ addInstrumentationHandler; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4850);\n/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2684);\n/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(245);\n/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2861);\n/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(150);\n/* harmony import */ var _stacktrace__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1313);\n/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4712);\n\n\n\n\n\n\n\nvar global = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\n\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\n\nfunction instrument(type) {\n if (instrumented[type]) {\n return;\n }\n\n instrumented[type] = true;\n\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n\n case 'dom':\n instrumentDOM();\n break;\n\n case 'xhr':\n instrumentXHR();\n break;\n\n case 'fetch':\n instrumentFetch();\n break;\n\n case 'history':\n instrumentHistory();\n break;\n\n case 'error':\n instrumentError();\n break;\n\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n\n default:\n _logger__WEBPACK_IMPORTED_MODULE_1__/* .logger.warn */ .k.warn('unknown instrumentation type:', type);\n }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\n\n\nfunction addInstrumentationHandler(handler) {\n if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n return;\n }\n\n handlers[handler.type] = handlers[handler.type] || [];\n handlers[handler.type].push(handler.callback);\n instrument(handler.type);\n}\n/** JSDoc */\n\nfunction triggerHandlers(type, data) {\n var e_1, _a;\n\n if (!type || !handlers[type]) {\n return;\n }\n\n try {\n for (var _b = (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__values */ .XA)(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var handler = _c.value;\n\n try {\n handler(data);\n } catch (e) {\n _logger__WEBPACK_IMPORTED_MODULE_1__/* .logger.error */ .k.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + (0,_stacktrace__WEBPACK_IMPORTED_MODULE_3__/* .getFunctionName */ .$)(handler) + \"\\nError: \" + e);\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n}\n/** JSDoc */\n\n\nfunction instrumentConsole() {\n if (!('console' in global)) {\n return;\n }\n\n ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n if (!(level in global.console)) {\n return;\n }\n\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(global.console, level, function (originalConsoleLevel) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n triggerHandlers('console', {\n args: args,\n level: level\n }); // this fails for some browsers. :(\n\n if (originalConsoleLevel) {\n Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n }\n };\n });\n });\n}\n/** JSDoc */\n\n\nfunction instrumentFetch() {\n if (!(0,_supports__WEBPACK_IMPORTED_MODULE_5__/* .supportsNativeFetch */ .t$)()) {\n return;\n }\n\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(global, 'fetch', function (originalFetch) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var handlerData = {\n args: args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args)\n },\n startTimestamp: Date.now()\n };\n triggerHandlers('fetch', (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, handlerData)); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n return originalFetch.apply(global, args).then(function (response) {\n triggerHandlers('fetch', (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, handlerData), {\n endTimestamp: Date.now(),\n response: response\n }));\n return response;\n }, function (error) {\n triggerHandlers('fetch', (0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)((0,tslib__WEBPACK_IMPORTED_MODULE_2__/* .__assign */ .pi)({}, handlerData), {\n endTimestamp: Date.now(),\n error: error\n })); // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n\n throw error;\n });\n };\n });\n}\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/** Extract `method` from fetch call arguments */\n\n\nfunction getFetchMethod(fetchArgs) {\n if (fetchArgs === void 0) {\n fetchArgs = [];\n }\n\n if ('Request' in global && (0,_is__WEBPACK_IMPORTED_MODULE_6__/* .isInstanceOf */ .V9)(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n\n return 'GET';\n}\n/** Extract `url` from fetch call arguments */\n\n\nfunction getFetchUrl(fetchArgs) {\n if (fetchArgs === void 0) {\n fetchArgs = [];\n }\n\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n\n if ('Request' in global && (0,_is__WEBPACK_IMPORTED_MODULE_6__/* .isInstanceOf */ .V9)(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n\n return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n/** JSDoc */\n\n\nfunction instrumentXHR() {\n if (!('XMLHttpRequest' in global)) {\n return;\n } // Poor man's implementation of ES6 `Map`, tracking and keeping in sync key and value separately.\n\n\n var requestKeys = [];\n var requestValues = [];\n var xhrproto = XMLHttpRequest.prototype;\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(xhrproto, 'open', function (originalOpen) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n } // eslint-disable-next-line @typescript-eslint/no-this-alias\n\n\n var xhr = this;\n var url = args[1];\n xhr.__sentry_xhr__ = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n method: (0,_is__WEBPACK_IMPORTED_MODULE_6__/* .isString */ .HD)(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1]\n }; // if Sentry key appears in URL, don't capture it as a request\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n if ((0,_is__WEBPACK_IMPORTED_MODULE_6__/* .isString */ .HD)(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n xhr.__sentry_own_request__ = true;\n }\n\n var onreadystatechangeHandler = function onreadystatechangeHandler() {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n if (xhr.__sentry_xhr__) {\n xhr.__sentry_xhr__.status_code = xhr.status;\n }\n } catch (e) {\n /* do nothing */\n }\n\n try {\n var requestPos = requestKeys.indexOf(xhr);\n\n if (requestPos !== -1) {\n // Make sure to pop both key and value to keep it in sync.\n requestKeys.splice(requestPos);\n var args_1 = requestValues.splice(requestPos)[0];\n\n if (xhr.__sentry_xhr__ && args_1[0] !== undefined) {\n xhr.__sentry_xhr__.body = args_1[0];\n }\n }\n } catch (e) {\n /* do nothing */\n }\n\n triggerHandlers('xhr', {\n args: args,\n endTimestamp: Date.now(),\n startTimestamp: Date.now(),\n xhr: xhr\n });\n }\n };\n\n if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(xhr, 'onreadystatechange', function (original) {\n return function () {\n var readyStateArgs = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n readyStateArgs[_i] = arguments[_i];\n }\n\n onreadystatechangeHandler();\n return original.apply(xhr, readyStateArgs);\n };\n });\n } else {\n xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n return originalOpen.apply(xhr, args);\n };\n });\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(xhrproto, 'send', function (originalSend) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n requestKeys.push(this);\n requestValues.push(args);\n triggerHandlers('xhr', {\n args: args,\n startTimestamp: Date.now(),\n xhr: this\n });\n return originalSend.apply(this, args);\n };\n });\n}\n\nvar lastHref;\n/** JSDoc */\n\nfunction instrumentHistory() {\n if (!(0,_supports__WEBPACK_IMPORTED_MODULE_5__/* .supportsHistory */ .Bf)()) {\n return;\n }\n\n var oldOnPopState = global.onpopstate;\n\n global.onpopstate = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var to = global.location.href; // keep track of the current URL state, as we always receive only the updated state\n\n var from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to\n });\n\n if (oldOnPopState) {\n // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n // https://github.com/getsentry/sentry-javascript/issues/3344\n // https://github.com/bugsnag/bugsnag-js/issues/469\n try {\n return oldOnPopState.apply(this, args);\n } catch (_oO) {// no-empty\n }\n }\n };\n /** @hidden */\n\n\n function historyReplacementFunction(originalHistoryFunction) {\n return function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var url = args.length > 2 ? args[2] : undefined;\n\n if (url) {\n // coerce to string (this is what pushState does)\n var from = lastHref;\n var to = String(url); // keep track of the current URL state, as we always receive only the updated state\n\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to\n });\n }\n\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(global.history, 'pushState', historyReplacementFunction);\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(global.history, 'replaceState', historyReplacementFunction);\n}\n\nvar debounceDuration = 1000;\nvar debounceTimerID;\nvar lastCapturedEvent;\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\n\nfunction shouldShortcircuitPreviousDebounce(previous, current) {\n // If there was no previous event, it should always be swapped for the new one.\n if (!previous) {\n return true;\n } // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n\n\n if (previous.type !== current.type) {\n return true;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (previous.target !== current.target) {\n return true;\n }\n } catch (e) {// just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n } // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n\n\n return false;\n}\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\n\n\nfunction shouldSkipDOMEvent(event) {\n // We are only interested in filtering `keypress` events for now.\n if (event.type !== 'keypress') {\n return false;\n }\n\n try {\n var target = event.target;\n\n if (!target || !target.tagName) {\n return true;\n } // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n\n\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n } catch (e) {// just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n return true;\n}\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\n\n\nfunction makeDOMEventHandler(handler, globalListener) {\n if (globalListener === void 0) {\n globalListener = false;\n }\n\n return function (event) {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || lastCapturedEvent === event) {\n return;\n } // We always want to skip _some_ events.\n\n\n if (shouldSkipDOMEvent(event)) {\n return;\n }\n\n var name = event.type === 'keypress' ? 'input' : event.type; // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n\n if (debounceTimerID === undefined) {\n handler({\n event: event,\n name: name,\n global: globalListener\n });\n lastCapturedEvent = event;\n } // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n handler({\n event: event,\n name: name,\n global: globalListener\n });\n lastCapturedEvent = event;\n } // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n\n\n clearTimeout(debounceTimerID);\n debounceTimerID = global.setTimeout(function () {\n debounceTimerID = undefined;\n }, debounceDuration);\n };\n}\n/** JSDoc */\n\n\nfunction instrumentDOM() {\n if (!('document' in global)) {\n return;\n } // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n\n\n var triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n var globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n global.document.addEventListener('click', globalDOMEventHandler, false);\n global.document.addEventListener('keypress', globalDOMEventHandler, false); // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n\n ['EventTarget', 'Node'].forEach(function (target) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n var proto = global[target] && global[target].prototype; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(proto, 'addEventListener', function (originalAddEventListener) {\n return function (type, listener, options) {\n if (type === 'click' || type == 'keypress') {\n try {\n var el = this;\n var handlers_1 = el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {};\n var handlerForType = handlers_1[type] = handlers_1[type] || {\n refCount: 0\n };\n\n if (!handlerForType.handler) {\n var handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount += 1;\n } catch (e) {// Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n (0,_object__WEBPACK_IMPORTED_MODULE_4__/* .fill */ .hl)(proto, 'removeEventListener', function (originalRemoveEventListener) {\n return function (type, listener, options) {\n if (type === 'click' || type == 'keypress') {\n try {\n var el = this;\n var handlers_2 = el.__sentry_instrumentation_handlers__ || {};\n var handlerForType = handlers_2[type];\n\n if (handlerForType) {\n handlerForType.refCount -= 1; // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers_2[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n } // If there are no longer any custom handlers of any type on this element, cleanup everything.\n\n\n if (Object.keys(handlers_2).length === 0) {\n delete el.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {// Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n });\n });\n}\n\nvar _oldOnErrorHandler = null;\n/** JSDoc */\n\nfunction instrumentError() {\n _oldOnErrorHandler = global.onerror;\n\n global.onerror = function (msg, url, line, column, error) {\n triggerHandlers('error', {\n column: column,\n error: error,\n line: line,\n msg: msg,\n url: url\n });\n\n if (_oldOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n}\n\nvar _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\n\nfunction instrumentUnhandledRejection() {\n _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n\n global.onunhandledrejection = function (e) {\n triggerHandlers('unhandledrejection', e);\n\n if (_oldOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return true;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9pbnN0cnVtZW50LmpzP2I1NzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUEyQztBQUNHO0FBQ1o7QUFDTztBQUNUO0FBQ2U7QUFDbUI7QUFDbEUsYUFBYSxnRUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLDhEQUFXO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlEQUFRLHVDQUF1QyxVQUFVO0FBQzNFOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsUUFBUSxnRUFBWSxpRkFBaUYscUVBQWU7QUFDcEg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLHVEQUFJO0FBQ1I7QUFDQTs7QUFFQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNB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O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjY3MTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2Fzc2lnbiwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9vYmplY3QnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi9zdGFja3RyYWNlJztcbmltcG9ydCB7IHN1cHBvcnRzSGlzdG9yeSwgc3VwcG9ydHNOYXRpdmVGZXRjaCB9IGZyb20gJy4vc3VwcG9ydHMnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqXG4gKiBJbnN0cnVtZW50IG5hdGl2ZSBBUElzIHRvIGNhbGwgaGFuZGxlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYnJlYWRjcnVtYnMsIEFQTSBzcGFucyBldGMuXG4gKiAgLSBDb25zb2xlIEFQSVxuICogIC0gRmV0Y2ggQVBJXG4gKiAgLSBYSFIgQVBJXG4gKiAgLSBIaXN0b3J5IEFQSVxuICogIC0gRE9NIEFQSSAoY2xpY2svdHlwaW5nKVxuICogIC0gRXJyb3IgQVBJXG4gKiAgLSBVbmhhbmRsZWRSZWplY3Rpb24gQVBJXG4gKi9cblxudmFyIGhhbmRsZXJzID0ge307XG52YXIgaW5zdHJ1bWVudGVkID0ge307XG4vKiogSW5zdHJ1bWVudHMgZ2l2ZW4gQVBJICovXG5cbmZ1bmN0aW9uIGluc3RydW1lbnQodHlwZSkge1xuICBpZiAoaW5zdHJ1bWVudGVkW3R5cGVdKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5zdHJ1bWVudGVkW3R5cGVdID0gdHJ1ZTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdjb25zb2xlJzpcbiAgICAgIGluc3RydW1lbnRDb25zb2xlKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RvbSc6XG4gICAgICBpbnN0cnVtZW50RE9NKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3hocic6XG4gICAgICBpbnN0cnVtZW50WEhSKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZldGNoJzpcbiAgICAgIGluc3RydW1lbnRGZXRjaCgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdoaXN0b3J5JzpcbiAgICAgIGluc3RydW1lbnRIaXN0b3J5KCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGluc3RydW1lbnRFcnJvcigpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd1bmhhbmRsZWRyZWplY3Rpb24nOlxuICAgICAgaW5zdHJ1bWVudFVuaGFuZGxlZFJlamVjdGlvbigpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbG9nZ2VyLndhcm4oJ3Vua25vd24gaW5zdHJ1bWVudGF0aW9uIHR5cGU6JywgdHlwZSk7XG4gIH1cbn1cbi8qKlxuICogQWRkIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGdpdmVuIHR5cGUgb2YgaW5zdHJ1bWVudGF0aW9uIHRyaWdnZXJzLlxuICogVXNlIGF0IHlvdXIgb3duIHJpc2ssIHRoaXMgbWlnaHQgYnJlYWsgd2l0aG91dCBjaGFuZ2Vsb2cgbm90aWNlLCBvbmx5IHVzZWQgaW50ZXJuYWxseS5cbiAqIEBoaWRkZW5cbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKGhhbmRsZXIpIHtcbiAgaWYgKCFoYW5kbGVyIHx8IHR5cGVvZiBoYW5kbGVyLnR5cGUgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBoYW5kbGVyLmNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFuZGxlcnNbaGFuZGxlci50eXBlXSA9IGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gfHwgW107XG4gIGhhbmRsZXJzW2hhbmRsZXIudHlwZV0ucHVzaChoYW5kbGVyLmNhbGxiYWNrKTtcbiAgaW5zdHJ1bWVudChoYW5kbGVyLnR5cGUpO1xufVxuLyoqIEpTRG9jICovXG5cbmZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVycyh0eXBlLCBkYXRhKSB7XG4gIHZhciBlXzEsIF9hO1xuXG4gIGlmICghdHlwZSB8fCAhaGFuZGxlcnNbdHlwZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoaGFuZGxlcnNbdHlwZV0gfHwgW10pLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IF9jLnZhbHVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciB3aGlsZSB0cmlnZ2VyaW5nIGluc3RydW1lbnRhdGlvbiBoYW5kbGVyLlxcblR5cGU6IFwiICsgdHlwZSArIFwiXFxuTmFtZTogXCIgKyBnZXRGdW5jdGlvbk5hbWUoaGFuZGxlcikgKyBcIlxcbkVycm9yOiBcIiArIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICBlXzEgPSB7XG4gICAgICBlcnJvcjogZV8xXzFcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKiBKU0RvYyAqL1xuXG5cbmZ1bmN0aW9uIGluc3RydW1lbnRDb25zb2xlKCkge1xuICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZycsICdhc3NlcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGlmICghKGxldmVsIGluIGdsb2JhbC5jb25zb2xlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbGwoZ2xvYmFsLmNvbnNvbGUsIGxldmVsLCBmdW5jdGlvbiAob3JpZ2luYWxDb25zb2xlTGV2ZWwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cblxuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2NvbnNvbGUnLCB7XG4gICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICBsZXZlbDogbGV2ZWxcbiAgICAgICAgfSk7IC8vIHRoaXMgZmFpbHMgZm9yIHNvbWUgYnJvd3NlcnMuIDooXG5cbiAgICAgICAgaWYgKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwob3JpZ2luYWxDb25zb2xlTGV2ZWwsIGdsb2JhbC5jb25zb2xlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG4vKiogSlNEb2MgKi9cblxuXG5mdW5jdGlvbiBpbnN0cnVtZW50RmV0Y2goKSB7XG4gIGlmICghc3VwcG9ydHNOYXRpdmVGZXRjaCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmlsbChnbG9iYWwsICdmZXRjaCcsIGZ1bmN0aW9uIChvcmlnaW5hbEZldGNoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXJEYXRhID0ge1xuICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICBmZXRjaERhdGE6IHtcbiAgICAgICAgICBtZXRob2Q6IGdldEZldGNoTWV0aG9kKGFyZ3MpLFxuICAgICAgICAgIHVybDogZ2V0RmV0Y2hVcmwoYXJncylcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgIH07XG4gICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywgX19hc3NpZ24oe30sIGhhbmRsZXJEYXRhKSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcblxuICAgICAgcmV0dXJuIG9yaWdpbmFsRmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmdzKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywgX19hc3NpZ24oX19hc3NpZ24oe30sIGhhbmRsZXJEYXRhKSwge1xuICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdmZXRjaCcsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBoYW5kbGVyRGF0YSksIHtcbiAgICAgICAgICBlbmRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgIH0pKTsgLy8gTk9URTogSWYgeW91IGFyZSBhIFNlbnRyeSB1c2VyLCBhbmQgeW91IGFyZSBzZWVpbmcgdGhpcyBzdGFjayBmcmFtZSxcbiAgICAgICAgLy8gICAgICAgaXQgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICAgICAgICAvLyAgICAgICBUaGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHNlbnRyeS5qYXZhc2NyaXB0LlxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSk7XG59XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuLyoqIEV4dHJhY3QgYG1ldGhvZGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuXG5cbmZ1bmN0aW9uIGdldEZldGNoTWV0aG9kKGZldGNoQXJncykge1xuICBpZiAoZmV0Y2hBcmdzID09PSB2b2lkIDApIHtcbiAgICBmZXRjaEFyZ3MgPSBbXTtcbiAgfVxuXG4gIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpICYmIGZldGNoQXJnc1swXS5tZXRob2QpIHtcbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1swXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAoZmV0Y2hBcmdzWzFdICYmIGZldGNoQXJnc1sxXS5tZXRob2QpIHtcbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1sxXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICByZXR1cm4gJ0dFVCc7XG59XG4vKiogRXh0cmFjdCBgdXJsYCBmcm9tIGZldGNoIGNhbGwgYXJndW1lbnRzICovXG5cblxuZnVuY3Rpb24gZ2V0RmV0Y2hVcmwoZmV0Y2hBcmdzKSB7XG4gIGlmIChmZXRjaEFyZ3MgPT09IHZvaWQgMCkge1xuICAgIGZldGNoQXJncyA9IFtdO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBmZXRjaEFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZldGNoQXJnc1swXTtcbiAgfVxuXG4gIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpKSB7XG4gICAgcmV0dXJuIGZldGNoQXJnc1swXS51cmw7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1swXSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG4vKiogSlNEb2MgKi9cblxuXG5mdW5jdGlvbiBpbnN0cnVtZW50WEhSKCkge1xuICBpZiAoISgnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gUG9vciBtYW4ncyBpbXBsZW1lbnRhdGlvbiBvZiBFUzYgYE1hcGAsIHRyYWNraW5nIGFuZCBrZWVwaW5nIGluIHN5bmMga2V5IGFuZCB2YWx1ZSBzZXBhcmF0ZWx5LlxuXG5cbiAgdmFyIHJlcXVlc3RLZXlzID0gW107XG4gIHZhciByZXF1ZXN0VmFsdWVzID0gW107XG4gIHZhciB4aHJwcm90byA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgZmlsbCh4aHJwcm90bywgJ29wZW4nLCBmdW5jdGlvbiAob3JpZ2luYWxPcGVuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cblxuICAgICAgdmFyIHhociA9IHRoaXM7XG4gICAgICB2YXIgdXJsID0gYXJnc1sxXTtcbiAgICAgIHhoci5fX3NlbnRyeV94aHJfXyA9IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBtZXRob2Q6IGlzU3RyaW5nKGFyZ3NbMF0pID8gYXJnc1swXS50b1VwcGVyQ2FzZSgpIDogYXJnc1swXSxcbiAgICAgICAgdXJsOiBhcmdzWzFdXG4gICAgICB9OyAvLyBpZiBTZW50cnkga2V5IGFwcGVhcnMgaW4gVVJMLCBkb24ndCBjYXB0dXJlIGl0IGFzIGEgcmVxdWVzdFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuXG4gICAgICBpZiAoaXNTdHJpbmcodXJsKSAmJiB4aHIuX19zZW50cnlfeGhyX18ubWV0aG9kID09PSAnUE9TVCcgJiYgdXJsLm1hdGNoKC9zZW50cnlfa2V5LykpIHtcbiAgICAgICAgeGhyLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0b3VjaGluZyBzdGF0dXNDb2RlIGluIHNvbWUgcGxhdGZvcm1zIHRocm93c1xuICAgICAgICAgICAgLy8gYW4gZXhjZXB0aW9uXG4gICAgICAgICAgICBpZiAoeGhyLl9fc2VudHJ5X3hocl9fKSB7XG4gICAgICAgICAgICAgIHhoci5fX3NlbnRyeV94aHJfXy5zdGF0dXNfY29kZSA9IHhoci5zdGF0dXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdFBvcyA9IHJlcXVlc3RLZXlzLmluZGV4T2YoeGhyKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3RQb3MgIT09IC0xKSB7XG4gICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byBwb3AgYm90aCBrZXkgYW5kIHZhbHVlIHRvIGtlZXAgaXQgaW4gc3luYy5cbiAgICAgICAgICAgICAgcmVxdWVzdEtleXMuc3BsaWNlKHJlcXVlc3RQb3MpO1xuICAgICAgICAgICAgICB2YXIgYXJnc18xID0gcmVxdWVzdFZhbHVlcy5zcGxpY2UocmVxdWVzdFBvcylbMF07XG5cbiAgICAgICAgICAgICAgaWYgKHhoci5fX3NlbnRyeV94aHJfXyAmJiBhcmdzXzFbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHhoci5fX3NlbnRyeV94aHJfXy5ib2R5ID0gYXJnc18xWzBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygneGhyJywge1xuICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgeGhyOiB4aHJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKCdvbnJlYWR5c3RhdGVjaGFuZ2UnIGluIHhociAmJiB0eXBlb2YgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWxsKHhociwgJ29ucmVhZHlzdGF0ZWNoYW5nZScsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVhZHlTdGF0ZUFyZ3MgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgcmVhZHlTdGF0ZUFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlcigpO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHhociwgcmVhZHlTdGF0ZUFyZ3MpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbnJlYWR5c3RhdGVjaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsT3Blbi5hcHBseSh4aHIsIGFyZ3MpO1xuICAgIH07XG4gIH0pO1xuICBmaWxsKHhocnByb3RvLCAnc2VuZCcsIGZ1bmN0aW9uIChvcmlnaW5hbFNlbmQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0S2V5cy5wdXNoKHRoaXMpO1xuICAgICAgcmVxdWVzdFZhbHVlcy5wdXNoKGFyZ3MpO1xuICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB4aHI6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsU2VuZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KTtcbn1cblxudmFyIGxhc3RIcmVmO1xuLyoqIEpTRG9jICovXG5cbmZ1bmN0aW9uIGluc3RydW1lbnRIaXN0b3J5KCkge1xuICBpZiAoIXN1cHBvcnRzSGlzdG9yeSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG9sZE9uUG9wU3RhdGUgPSBnbG9iYWwub25wb3BzdGF0ZTtcblxuICBnbG9iYWwub25wb3BzdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICB2YXIgdG8gPSBnbG9iYWwubG9jYXRpb24uaHJlZjsgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcblxuICAgIHZhciBmcm9tID0gbGFzdEhyZWY7XG4gICAgbGFzdEhyZWYgPSB0bztcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICBmcm9tOiBmcm9tLFxuICAgICAgdG86IHRvXG4gICAgfSk7XG5cbiAgICBpZiAob2xkT25Qb3BTdGF0ZSkge1xuICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGNhbiB0aHJvdyBpbiBGaXJlZm94IHdoZW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMzNDRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9idWdzbmFnL2J1Z3NuYWctanMvaXNzdWVzLzQ2OVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9sZE9uUG9wU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9IGNhdGNoIChfb08pIHsvLyBuby1lbXB0eVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqIEBoaWRkZW4gKi9cblxuXG4gIGZ1bmN0aW9uIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKG9yaWdpbmFsSGlzdG9yeUZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVybCA9IGFyZ3MubGVuZ3RoID4gMiA/IGFyZ3NbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLy8gY29lcmNlIHRvIHN0cmluZyAodGhpcyBpcyB3aGF0IHB1c2hTdGF0ZSBkb2VzKVxuICAgICAgICB2YXIgZnJvbSA9IGxhc3RIcmVmO1xuICAgICAgICB2YXIgdG8gPSBTdHJpbmcodXJsKTsgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICBsYXN0SHJlZiA9IHRvO1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICB0bzogdG9cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbEhpc3RvcnlGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgZmlsbChnbG9iYWwuaGlzdG9yeSwgJ3B1c2hTdGF0ZScsIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKTtcbiAgZmlsbChnbG9iYWwuaGlzdG9yeSwgJ3JlcGxhY2VTdGF0ZScsIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKTtcbn1cblxudmFyIGRlYm91bmNlRHVyYXRpb24gPSAxMDAwO1xudmFyIGRlYm91bmNlVGltZXJJRDtcbnZhciBsYXN0Q2FwdHVyZWRFdmVudDtcbi8qKlxuICogRGVjaWRlIHdoZXRoZXIgdGhlIGN1cnJlbnQgZXZlbnQgc2hvdWxkIGZpbmlzaCB0aGUgZGVib3VuY2Ugb2YgcHJldmlvdXNseSBjYXB0dXJlZCBvbmUuXG4gKiBAcGFyYW0gcHJldmlvdXMgcHJldmlvdXNseSBjYXB0dXJlZCBldmVudFxuICogQHBhcmFtIGN1cnJlbnQgZXZlbnQgdG8gYmUgY2FwdHVyZWRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRTaG9ydGNpcmN1aXRQcmV2aW91c0RlYm91bmNlKHByZXZpb3VzLCBjdXJyZW50KSB7XG4gIC8vIElmIHRoZXJlIHdhcyBubyBwcmV2aW91cyBldmVudCwgaXQgc2hvdWxkIGFsd2F5cyBiZSBzd2FwcGVkIGZvciB0aGUgbmV3IG9uZS5cbiAgaWYgKCFwcmV2aW91cykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGJvdGggZXZlbnRzIGhhdmUgZGlmZmVyZW50IHR5cGUsIHRoZW4gdXNlciBkZWZpbml0ZWx5IHBlcmZvcm1lZCB0d28gc2VwYXJhdGUgYWN0aW9ucy4gZS5nLiBjbGljayArIGtleXByZXNzLlxuXG5cbiAgaWYgKHByZXZpb3VzLnR5cGUgIT09IGN1cnJlbnQudHlwZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBJZiBib3RoIGV2ZW50cyBoYXZlIHRoZSBzYW1lIHR5cGUsIGl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCBhY3Rpb25zIHdlcmUgcGVyZm9ybWVkIG9uIGRpZmZlcmVudCB0YXJnZXRzLlxuICAgIC8vIGUuZy4gMiBjbGlja3Mgb24gZGlmZmVyZW50IGJ1dHRvbnMuXG4gICAgaWYgKHByZXZpb3VzLnRhcmdldCAhPT0gY3VycmVudC50YXJnZXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkgey8vIGp1c3QgYWNjZXNzaW5nIGB0YXJnZXRgIHByb3BlcnR5IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOFxuICB9IC8vIElmIGJvdGggZXZlbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBfYW5kXyBzYW1lIGB0YXJnZXRgIChhbiBlbGVtZW50IHdoaWNoIHRyaWdnZXJlZCBhbiBldmVudCwgX25vdCBuZWNlc3NhcmlseV9cbiAgLy8gdG8gd2hpY2ggYW4gZXZlbnQgbGlzdGVuZXIgd2FzIGF0dGFjaGVkKSwgd2UgdHJlYXQgdGhlbSBhcyB0aGUgc2FtZSBhY3Rpb24sIGFzIHdlIHdhbnQgdG8gY2FwdHVyZVxuICAvLyBvbmx5IG9uZSBicmVhZGNydW1iLiBlLmcuIG11bHRpcGxlIGNsaWNrcyBvbiB0aGUgc2FtZSBidXR0b24sIG9yIHR5cGluZyBpbnNpZGUgYSB1c2VyIGlucHV0IGJveC5cblxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogRGVjaWRlIHdoZXRoZXIgYW4gZXZlbnQgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGNhcHR1cmVkXG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRTa2lwRE9NRXZlbnQoZXZlbnQpIHtcbiAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBmaWx0ZXJpbmcgYGtleXByZXNzYCBldmVudHMgZm9yIG5vdy5cbiAgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXlwcmVzcycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LnRhZ05hbWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gT25seSBjb25zaWRlciBrZXlwcmVzcyBldmVudHMgb24gYWN0dWFsIGlucHV0IGVsZW1lbnRzLiBUaGlzIHdpbGwgZGlzcmVnYXJkIGtleXByZXNzZXMgdGFyZ2V0aW5nIGJvZHlcbiAgICAvLyBlLmcudGFiYmluZyB0aHJvdWdoIGVsZW1lbnRzLCBob3RrZXlzLCBldGMuXG5cblxuICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHsvLyBqdXN0IGFjY2Vzc2luZyBgdGFyZ2V0YCBwcm9wZXJ0eSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNvbWUgcmFyZSBjaXJjdW1zdGFuY2VzXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy84MzhcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBXcmFwcyBhZGRFdmVudExpc3RlbmVyIHRvIGNhcHR1cmUgVUkgYnJlYWRjcnVtYnNcbiAqIEBwYXJhbSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWRcbiAqIEBwYXJhbSBnbG9iYWxMaXN0ZW5lciBpbmRpY2F0ZXMgd2hldGhlciBldmVudCB3YXMgY2FwdHVyZWQgYnkgdGhlIGdsb2JhbCBldmVudCBsaXN0ZW5lclxuICogQHJldHVybnMgd3JhcHBlZCBicmVhZGNydW1iIGV2ZW50cyBoYW5kbGVyXG4gKiBAaGlkZGVuXG4gKi9cblxuXG5mdW5jdGlvbiBtYWtlRE9NRXZlbnRIYW5kbGVyKGhhbmRsZXIsIGdsb2JhbExpc3RlbmVyKSB7XG4gIGlmIChnbG9iYWxMaXN0ZW5lciA9PT0gdm9pZCAwKSB7XG4gICAgZ2xvYmFsTGlzdGVuZXIgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoaXMgaGFuZGxlciBtaWdodCB0cmlnZ2VyIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZVxuICAgIC8vIGV2ZW50IChlLmcuIGV2ZW50IHByb3BhZ2F0aW9uIHRocm91Z2ggbm9kZSBhbmNlc3RvcnMpLlxuICAgIC8vIElnbm9yZSBpZiB3ZSd2ZSBhbHJlYWR5IGNhcHR1cmVkIHRoYXQgZXZlbnQuXG4gICAgaWYgKCFldmVudCB8fCBsYXN0Q2FwdHVyZWRFdmVudCA9PT0gZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIGFsd2F5cyB3YW50IHRvIHNraXAgX3NvbWVfIGV2ZW50cy5cblxuXG4gICAgaWYgKHNob3VsZFNraXBET01FdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycgPyAnaW5wdXQnIDogZXZlbnQudHlwZTsgLy8gSWYgdGhlcmUgaXMgbm8gZGVib3VuY2UgdGltZXIsIGl0IG1lYW5zIHRoYXQgd2UgY2FuIHNhZmVseSBjYXB0dXJlIHRoZSBuZXcgZXZlbnQgYW5kIHN0b3JlIGl0IGZvciBmdXR1cmUgY29tcGFyaXNvbnMuXG5cbiAgICBpZiAoZGVib3VuY2VUaW1lcklEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXIoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGdsb2JhbDogZ2xvYmFsTGlzdGVuZXJcbiAgICAgIH0pO1xuICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICB9IC8vIElmIHRoZXJlIGlzIGEgZGVib3VuY2UgYXdhaXRpbmcsIHNlZSBpZiB0aGUgbmV3IGV2ZW50IGlzIGRpZmZlcmVudCBlbm91Z2ggdG8gdHJlYXQgaXQgYXMgYSB1bmlxdWUgb25lLlxuICAgIC8vIElmIHRoYXQncyB0aGUgY2FzZSwgZW1pdCB0aGUgcHJldmlvdXMgZXZlbnQgYW5kIHN0b3JlIGxvY2FsbHkgdGhlIG5ld2x5LWNhcHR1cmVkIERPTSBldmVudC5cbiAgICBlbHNlIGlmIChzaG91bGRTaG9ydGNpcmN1aXRQcmV2aW91c0RlYm91bmNlKGxhc3RDYXB0dXJlZEV2ZW50LCBldmVudCkpIHtcbiAgICAgICAgaGFuZGxlcih7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgZ2xvYmFsOiBnbG9iYWxMaXN0ZW5lclxuICAgICAgICB9KTtcbiAgICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICAgIH0gLy8gU3RhcnQgYSBuZXcgZGVib3VuY2UgdGltZXIgdGhhdCB3aWxsIHByZXZlbnQgdXMgZnJvbSBjYXB0dXJpbmcgbXVsdGlwbGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGdyb3VwZWQgdG9nZXRoZXIuXG5cblxuICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVySUQpO1xuICAgIGRlYm91bmNlVGltZXJJRCA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlYm91bmNlVGltZXJJRCA9IHVuZGVmaW5lZDtcbiAgICB9LCBkZWJvdW5jZUR1cmF0aW9uKTtcbiAgfTtcbn1cbi8qKiBKU0RvYyAqL1xuXG5cbmZ1bmN0aW9uIGluc3RydW1lbnRET00oKSB7XG4gIGlmICghKCdkb2N1bWVudCcgaW4gZ2xvYmFsKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBNYWtlIGl0IHNvIHRoYXQgYW55IGNsaWNrIG9yIGtleXByZXNzIHRoYXQgaXMgdW5oYW5kbGVkIC8gYnViYmxlZCB1cCBhbGwgdGhlIHdheSB0byB0aGUgZG9jdW1lbnQgdHJpZ2dlcnMgb3VyIGRvbVxuICAvLyBoYW5kbGVycy4gKE5vcm1hbGx5IHdlIGhhdmUgb25seSBvbmUsIHdoaWNoIGNhcHR1cmVzIGEgYnJlYWRjcnVtYiBmb3IgZWFjaCBjbGljayBvciBrZXlwcmVzcy4pIERvIHRoaXMgYmVmb3JlXG4gIC8vIHdlIGluc3RydW1lbnQgYGFkZEV2ZW50TGlzdGVuZXJgIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGF0dGFjaGluZyB0aGlzIGhhbmRsZXIgdHdpY2UuXG5cblxuICB2YXIgdHJpZ2dlckRPTUhhbmRsZXIgPSB0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJyk7XG4gIHZhciBnbG9iYWxET01FdmVudEhhbmRsZXIgPSBtYWtlRE9NRXZlbnRIYW5kbGVyKHRyaWdnZXJET01IYW5kbGVyLCB0cnVlKTtcbiAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2xvYmFsRE9NRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG4gIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGdsb2JhbERPTUV2ZW50SGFuZGxlciwgZmFsc2UpOyAvLyBBZnRlciBob29raW5nIGludG8gY2xpY2sgYW5kIGtleXByZXNzIGV2ZW50cyBidWJibGVkIHVwIHRvIGBkb2N1bWVudGAsIHdlIGFsc28gaG9vayBpbnRvIHVzZXItaGFuZGxlZFxuICAvLyBjbGlja3MgJiBrZXlwcmVzc2VzLCBieSBhZGRpbmcgYW4gZXZlbnQgbGlzdGVuZXIgb2Ygb3VyIG93biB0byBhbnkgZWxlbWVudCB0byB3aGljaCB0aGV5IGFkZCBhIGxpc3RlbmVyLiBUaGF0XG4gIC8vIHdheSwgd2hlbmV2ZXIgb25lIG9mIHRoZWlyIGhhbmRsZXJzIGlzIHRyaWdnZXJlZCwgb3VycyB3aWxsIGJlLCB0b28uIChUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZWlyIGhhbmRsZXJcbiAgLy8gY291bGQgcG90ZW50aWFsbHkgcHJldmVudCB0aGUgZXZlbnQgZnJvbSBidWJibGluZyB1cCB0byBvdXIgZ2xvYmFsIGxpc3RlbmVycy4gVGhpcyB3YXksIG91ciBoYW5kbGVyIGFyZSBzdGlsbFxuICAvLyBndWFyYW50ZWVkIHRvIGZpcmUgYXQgbGVhc3Qgb25jZS4pXG5cbiAgWydFdmVudFRhcmdldCcsICdOb2RlJ10uZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIHZhciBwcm90byA9IGdsb2JhbFt0YXJnZXRdICYmIGdsb2JhbFt0YXJnZXRdLnByb3RvdHlwZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzcywgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5cbiAgICBpZiAoIXByb3RvIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkoJ2FkZEV2ZW50TGlzdGVuZXInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbGwocHJvdG8sICdhZGRFdmVudExpc3RlbmVyJywgZnVuY3Rpb24gKG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJyB8fCB0eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcztcbiAgICAgICAgICAgIHZhciBoYW5kbGVyc18xID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gPSBlbC5fX3NlbnRyeV9pbnN0cnVtZW50YXRpb25faGFuZGxlcnNfXyB8fCB7fTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyRm9yVHlwZSA9IGhhbmRsZXJzXzFbdHlwZV0gPSBoYW5kbGVyc18xW3R5cGVdIHx8IHtcbiAgICAgICAgICAgICAgcmVmQ291bnQ6IDBcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghaGFuZGxlckZvclR5cGUuaGFuZGxlcikge1xuICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG1ha2VET01FdmVudEhhbmRsZXIodHJpZ2dlckRPTUhhbmRsZXIpO1xuICAgICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgb3JpZ2luYWxBZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50ICs9IDE7XG4gICAgICAgICAgfSBjYXRjaCAoZSkgey8vIEFjY2Vzc2luZyBkb20gcHJvcGVydGllcyBpcyBhbHdheXMgZnJhZ2lsZS5cbiAgICAgICAgICAgIC8vIEFsc28gYWxsb3dzIHVzIHRvIHNraXAgYGFkZEV2ZW50TGlzdGVucnNgIGNhbGxzIHdpdGggbm8gcHJvcGVyIGB0aGlzYCBjb250ZXh0LlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0aGlzLCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZpbGwocHJvdG8sICdyZW1vdmVFdmVudExpc3RlbmVyJywgZnVuY3Rpb24gKG9yaWdpbmFsUmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJyB8fCB0eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcztcbiAgICAgICAgICAgIHZhciBoYW5kbGVyc18yID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gfHwge307XG4gICAgICAgICAgICB2YXIgaGFuZGxlckZvclR5cGUgPSBoYW5kbGVyc18yW3R5cGVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlckZvclR5cGUpIHtcbiAgICAgICAgICAgICAgaGFuZGxlckZvclR5cGUucmVmQ291bnQgLT0gMTsgLy8gSWYgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgY3VzdG9tIGhhbmRsZXJzIG9mIHRoZSBjdXJyZW50IHR5cGUgb24gdGhpcyBlbGVtZW50LCB3ZSBjYW4gcmVtb3ZlIG91cnMsIHRvby5cblxuICAgICAgICAgICAgICBpZiAoaGFuZGxlckZvclR5cGUucmVmQ291bnQgPD0gMCkge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVtb3ZlRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGhhbmRsZXJGb3JUeXBlLmhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJGb3JUeXBlLmhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXJzXzJbdHlwZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgICAgICAgIH0gLy8gSWYgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgY3VzdG9tIGhhbmRsZXJzIG9mIGFueSB0eXBlIG9uIHRoaXMgZWxlbWVudCwgY2xlYW51cCBldmVyeXRoaW5nLlxuXG5cbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhhbmRsZXJzXzIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbC5fX3NlbnRyeV9pbnN0cnVtZW50YXRpb25faGFuZGxlcnNfXztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsvLyBBY2Nlc3NpbmcgZG9tIHByb3BlcnRpZXMgaXMgYWx3YXlzIGZyYWdpbGUuXG4gICAgICAgICAgICAvLyBBbHNvIGFsbG93cyB1cyB0byBza2lwIGBhZGRFdmVudExpc3RlbnJzYCBjYWxscyB3aXRoIG5vIHByb3BlciBgdGhpc2AgY29udGV4dC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbnZhciBfb2xkT25FcnJvckhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5cbmZ1bmN0aW9uIGluc3RydW1lbnRFcnJvcigpIHtcbiAgX29sZE9uRXJyb3JIYW5kbGVyID0gZ2xvYmFsLm9uZXJyb3I7XG5cbiAgZ2xvYmFsLm9uZXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbiwgZXJyb3IpIHtcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ2Vycm9yJywge1xuICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgICBsaW5lOiBsaW5lLFxuICAgICAgbXNnOiBtc2csXG4gICAgICB1cmw6IHVybFxuICAgIH0pO1xuXG4gICAgaWYgKF9vbGRPbkVycm9ySGFuZGxlcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgcmV0dXJuIF9vbGRPbkVycm9ySGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cblxudmFyIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5cbmZ1bmN0aW9uIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKSB7XG4gIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb247XG5cbiAgZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGUpO1xuXG4gICAgaWYgKF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIHJldHVybiBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6710\n")},2684:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"VZ\": function() { return /* binding */ isError; },\n/* harmony export */ \"VW\": function() { return /* binding */ isErrorEvent; },\n/* harmony export */ \"TX\": function() { return /* binding */ isDOMError; },\n/* harmony export */ \"fm\": function() { return /* binding */ isDOMException; },\n/* harmony export */ \"HD\": function() { return /* binding */ isString; },\n/* harmony export */ \"pt\": function() { return /* binding */ isPrimitive; },\n/* harmony export */ \"PO\": function() { return /* binding */ isPlainObject; },\n/* harmony export */ \"cO\": function() { return /* binding */ isEvent; },\n/* harmony export */ \"kK\": function() { return /* binding */ isElement; },\n/* harmony export */ \"Kj\": function() { return /* binding */ isRegExp; },\n/* harmony export */ \"J8\": function() { return /* binding */ isThenable; },\n/* harmony export */ \"Cy\": function() { return /* binding */ isSyntheticEvent; },\n/* harmony export */ \"V9\": function() { return /* binding */ isInstanceOf; }\n/* harmony export */ });\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isError(wat) {\n switch (Object.prototype.toString.call(wat)) {\n case '[object Error]':\n return true;\n\n case '[object Exception]':\n return true;\n\n case '[object DOMException]':\n return true;\n\n default:\n return isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isErrorEvent(wat) {\n return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isDOMError(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isDOMException(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isString(wat) {\n return Object.prototype.toString.call(wat) === '[object String]';\n}\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isPrimitive(wat) {\n return wat === null || typeof wat !== 'object' && typeof wat !== 'function';\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isPlainObject(wat) {\n return Object.prototype.toString.call(wat) === '[object Object]';\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isEvent(wat) {\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isElement(wat) {\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isRegExp(wat) {\n return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\n\nfunction isThenable(wat) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\n\nfunction isSyntheticEvent(wat) {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\n\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch (_e) {\n return false;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9pcy5qcz8zN2FmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJLGNBQWM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQkFBbUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksaUJBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHFCQUFxQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGtCQUFrQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvQkFBb0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnQkFBZ0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZUFBZTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHVCQUF1QjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQkFBbUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwiZmlsZSI6IjI2ODQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgb25lIG9mIGEgZmV3IEVycm9yIG9yIEVycm9yLWxpa2VcbiAqIHtAbGluayBpc0Vycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3Iod2F0KSB7XG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkpIHtcbiAgICBjYXNlICdbb2JqZWN0IEVycm9yXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ1tvYmplY3QgRXhjZXB0aW9uXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gaXNJbnN0YW5jZU9mKHdhdCwgRXJyb3IpO1xuICB9XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBFcnJvckV2ZW50XG4gKiB7QGxpbmsgaXNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckV2ZW50KHdhdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IEVycm9yRXZlbnRdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIERPTUVycm9yXG4gKiB7QGxpbmsgaXNET01FcnJvcn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NRXJyb3Iod2F0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRE9NRXJyb3JdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIERPTUV4Y2VwdGlvblxuICoge0BsaW5rIGlzRE9NRXhjZXB0aW9ufS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNET01FeGNlcHRpb24od2F0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIHN0cmluZ1xuICoge0BsaW5rIGlzU3RyaW5nfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcod2F0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgaXMgYSBwcmltaXRpdmUgKHVuZGVmaW5lZCwgbnVsbCwgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIGJpZ2ludCwgc3ltYm9sKVxuICoge0BsaW5rIGlzUHJpbWl0aXZlfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUod2F0KSB7XG4gIHJldHVybiB3YXQgPT09IG51bGwgfHwgdHlwZW9mIHdhdCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHdhdCAhPT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB7QGxpbmsgaXNQbGFpbk9iamVjdH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qod2F0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBFdmVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V2ZW50KHdhdCkge1xuICByZXR1cm4gdHlwZW9mIEV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFdmVudCk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBFbGVtZW50IGluc3RhbmNlXG4gKiB7QGxpbmsgaXNFbGVtZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50KHdhdCkge1xuICByZXR1cm4gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih3YXQsIEVsZW1lbnQpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gcmVnZXhwXG4gKiB7QGxpbmsgaXNSZWdFeHB9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCh3YXQpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUgaGFzIGEgdGhlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RoZW5hYmxlKHdhdCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIHJldHVybiBCb29sZWFuKHdhdCAmJiB3YXQudGhlbiAmJiB0eXBlb2Ygd2F0LnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYSBTeW50aGV0aWNFdmVudFxuICoge0BsaW5rIGlzU3ludGhldGljRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KHdhdCkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh3YXQpICYmICduYXRpdmVFdmVudCcgaW4gd2F0ICYmICdwcmV2ZW50RGVmYXVsdCcgaW4gd2F0ICYmICdzdG9wUHJvcGFnYXRpb24nIGluIHdhdDtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIGluc3RhbmNlIG9mIHByb3ZpZGVkIGNvbnN0cnVjdG9yLlxuICoge0BsaW5rIGlzSW5zdGFuY2VPZn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcGFyYW0gYmFzZSBBIGNvbnN0cnVjdG9yIHRvIGJlIHVzZWQgaW4gYSBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHdhdCwgYmFzZSkge1xuICB0cnkge1xuICAgIHJldHVybiB3YXQgaW5zdGFuY2VvZiBiYXNlO1xuICB9IGNhdGNoIChfZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2684\n")},245:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"k\": function() { return /* binding */ logger; }\n/* harmony export */ });\n/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2861);\n/* eslint-disable @typescript-eslint/no-explicit-any */\n // TODO: Implement different loggers for different environments\n\nvar global = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)();\n/** Prefix for logging strings */\n\nvar PREFIX = 'Sentry Logger ';\n/** JSDoc */\n\nvar Logger =\n/** @class */\nfunction () {\n /** JSDoc */\n function Logger() {\n this._enabled = false;\n }\n /** JSDoc */\n\n\n Logger.prototype.disable = function () {\n this._enabled = false;\n };\n /** JSDoc */\n\n\n Logger.prototype.enable = function () {\n this._enabled = true;\n };\n /** JSDoc */\n\n\n Logger.prototype.log = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (!this._enabled) {\n return;\n }\n\n (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .consoleSandbox */ .Cf)(function () {\n global.console.log(PREFIX + \"[Log]: \" + args.join(' '));\n });\n };\n /** JSDoc */\n\n\n Logger.prototype.warn = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (!this._enabled) {\n return;\n }\n\n (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .consoleSandbox */ .Cf)(function () {\n global.console.warn(PREFIX + \"[Warn]: \" + args.join(' '));\n });\n };\n /** JSDoc */\n\n\n Logger.prototype.error = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (!this._enabled) {\n return;\n }\n\n (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .consoleSandbox */ .Cf)(function () {\n global.console.error(PREFIX + \"[Error]: \" + args.join(' '));\n });\n };\n\n return Logger;\n}(); // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\n\n\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nvar logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9sb2dnZXIuanM/MGQ5NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDeUQ7O0FBRXpELGFBQWEsZ0VBQWU7QUFDNUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLCtEQUFjO0FBQ2xCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLCtEQUFjO0FBQ2xCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLCtEQUFjO0FBQ2xCO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsQ0FBQyxHQUFHOzs7QUFHSjtBQUNBIiwiZmlsZSI6IjI0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGNvbnNvbGVTYW5kYm94LCBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL21pc2MnOyAvLyBUT0RPOiBJbXBsZW1lbnQgZGlmZmVyZW50IGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudHNcblxudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqIFByZWZpeCBmb3IgbG9nZ2luZyBzdHJpbmdzICovXG5cbnZhciBQUkVGSVggPSAnU2VudHJ5IExvZ2dlciAnO1xuLyoqIEpTRG9jICovXG5cbnZhciBMb2dnZXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICAvKiogSlNEb2MgKi9cbiAgZnVuY3Rpb24gTG9nZ2VyKCkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuICAvKiogSlNEb2MgKi9cblxuXG4gIExvZ2dlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgTG9nZ2VyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZVNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgZ2xvYmFsLmNvbnNvbGUubG9nKFBSRUZJWCArIFwiW0xvZ106IFwiICsgYXJncy5qb2luKCcgJykpO1xuICAgIH0pO1xuICB9O1xuICAvKiogSlNEb2MgKi9cblxuXG4gIExvZ2dlci5wcm90b3R5cGUud2FybiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICBnbG9iYWwuY29uc29sZS53YXJuKFBSRUZJWCArIFwiW1dhcm5dOiBcIiArIGFyZ3Muam9pbignICcpKTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBMb2dnZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGVTYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgIGdsb2JhbC5jb25zb2xlLmVycm9yKFBSRUZJWCArIFwiW0Vycm9yXTogXCIgKyBhcmdzLmpvaW4oJyAnKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIExvZ2dlcjtcbn0oKTsgLy8gRW5zdXJlIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBsb2dnZXIgaW5zdGFuY2UsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHNlbnRyeS91dGlscyBhcmUgYmVpbmcgdXNlZFxuXG5cbmdsb2JhbC5fX1NFTlRSWV9fID0gZ2xvYmFsLl9fU0VOVFJZX18gfHwge307XG52YXIgbG9nZ2VyID0gZ2xvYmFsLl9fU0VOVFJZX18ubG9nZ2VyIHx8IChnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgPSBuZXcgTG9nZ2VyKCkpO1xuZXhwb3J0IHsgbG9nZ2VyIH07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///245\n")},2861:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Rf\": function() { return /* binding */ getGlobalObject; },\n/* harmony export */ \"DM\": function() { return /* binding */ uuid4; },\n/* harmony export */ \"en\": function() { return /* binding */ parseUrl; },\n/* harmony export */ \"jH\": function() { return /* binding */ getEventDescription; },\n/* harmony export */ \"Cf\": function() { return /* binding */ consoleSandbox; },\n/* harmony export */ \"Db\": function() { return /* binding */ addExceptionTypeValue; },\n/* harmony export */ \"EG\": function() { return /* binding */ addExceptionMechanism; },\n/* harmony export */ \"l4\": function() { return /* binding */ getLocationHref; },\n/* harmony export */ \"J4\": function() { return /* binding */ parseSemver; },\n/* harmony export */ \"JY\": function() { return /* binding */ parseRetryAfterHeader; },\n/* harmony export */ \"rt\": function() { return /* binding */ stripUrlQueryAndFragment; }\n/* harmony export */ });\n/* unused harmony export addContextToFrame */\n/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7864);\n\n\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\n\nfunction getGlobalObject() {\n return (0,_node__WEBPACK_IMPORTED_MODULE_0__/* .isNodeEnv */ .KV)() ? __webpack_require__.g : typeof window !== 'undefined' // eslint-disable-line no-restricted-globals\n ? window // eslint-disable-line no-restricted-globals\n : typeof self !== 'undefined' ? self : fallbackGlobalObject;\n}\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\n\nfunction uuid4() {\n var global = getGlobalObject();\n var crypto = global.crypto || global.msCrypto;\n\n if (!(crypto === void 0) && crypto.getRandomValues) {\n // Use window.crypto API if available\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr); // set 4 in byte 7\n // eslint-disable-next-line no-bitwise\n\n arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10'\n // eslint-disable-next-line no-bitwise\n\n arr[4] = arr[4] & 0x3fff | 0x8000;\n\n var pad = function pad(num) {\n var v = num.toString(16);\n\n while (v.length < 4) {\n v = \"0\" + v;\n }\n\n return v;\n };\n\n return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]);\n } // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n\n\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n // eslint-disable-next-line no-bitwise\n var r = Math.random() * 16 | 0; // eslint-disable-next-line no-bitwise\n\n var v = c === 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n}\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\n\nfunction parseUrl(url) {\n if (!url) {\n return {};\n }\n\n var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n } // coerce to undefined values to empty string so we don't get 'undefined'\n\n\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment\n };\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\n\nfunction getEventDescription(event) {\n if (event.message) {\n return event.message;\n }\n\n if (event.exception && event.exception.values && event.exception.values[0]) {\n var exception = event.exception.values[0];\n\n if (exception.type && exception.value) {\n return exception.type + \": \" + exception.value;\n }\n\n return exception.type || exception.value || event.event_id || '';\n }\n\n return event.event_id || '';\n}\n/** JSDoc */\n\nfunction consoleSandbox(callback) {\n var global = getGlobalObject();\n var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n\n if (!('console' in global)) {\n return callback();\n } // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\n var originalConsole = global.console;\n var wrappedLevels = {}; // Restore all wrapped console methods\n\n levels.forEach(function (level) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (level in global.console && originalConsole[level].__sentry_original__) {\n wrappedLevels[level] = originalConsole[level];\n originalConsole[level] = originalConsole[level].__sentry_original__;\n }\n }); // Perform callback manipulations\n\n var result = callback(); // Revert restoration to wrapped state\n\n Object.keys(wrappedLevels).forEach(function (level) {\n originalConsole[level] = wrappedLevels[level];\n });\n return result;\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\n\nfunction addExceptionTypeValue(event, value, type) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].value = event.exception.values[0].value || value || '';\n event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\n\nfunction addExceptionMechanism(event, mechanism) {\n if (mechanism === void 0) {\n mechanism = {};\n } // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n\n\n try {\n // @ts-ignore Type 'Mechanism | {}' is not assignable to type 'Mechanism | undefined'\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n Object.keys(mechanism).forEach(function (key) {\n // @ts-ignore Mechanism has no index signature\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0].mechanism[key] = mechanism[key];\n });\n } catch (_oO) {// no-empty\n }\n}\n/**\n * A safe form of location.href\n */\n\nfunction getLocationHref() {\n var global = getGlobalObject();\n\n try {\n return global.document.location.href;\n } catch (oO) {\n return '';\n }\n} // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\n\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\n\nfunction parseSemver(input) {\n var match = input.match(SEMVER_REGEXP) || [];\n var major = parseInt(match[1], 10);\n var minor = parseInt(match[2], 10);\n var patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4]\n };\n}\nvar defaultRetryAfter = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\n\nfunction parseRetryAfterHeader(now, header) {\n if (!header) {\n return defaultRetryAfter;\n }\n\n var headerDelay = parseInt(\"\" + header, 10);\n\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n var headerDate = Date.parse(\"\" + header);\n\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return defaultRetryAfter;\n}\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\n\nfunction addContextToFrame(lines, frame, linesOfContext) {\n if (linesOfContext === void 0) {\n linesOfContext = 5;\n }\n\n var lineno = frame.lineno || 0;\n var maxLines = lines.length;\n var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n frame.pre_context = lines.slice(Math.max(0, sourceLine - linesOfContext), sourceLine).map(function (line) {\n return snipLine(line, 0);\n });\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n frame.post_context = lines.slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext).map(function (line) {\n return snipLine(line, 0);\n });\n}\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\n\nfunction stripUrlQueryAndFragment(urlPath) {\n // eslint-disable-next-line no-useless-escape\n return urlPath.split(/[\\?#]/, 1)[0];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9taXNjLmpzP2Q5NWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQW1DO0FBQ0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsU0FBUywwREFBUyxLQUFLLHFCQUFNO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUcsY0FBYztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwiZmlsZSI6IjI4NjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGVFbnYgfSBmcm9tICcuL25vZGUnO1xuaW1wb3J0IHsgc25pcExpbmUgfSBmcm9tICcuL3N0cmluZyc7XG52YXIgZmFsbGJhY2tHbG9iYWxPYmplY3QgPSB7fTtcbi8qKlxuICogU2FmZWx5IGdldCBnbG9iYWwgc2NvcGUgb2JqZWN0XG4gKlxuICogQHJldHVybnMgR2xvYmFsIHNjb3BlIG9iamVjdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxPYmplY3QoKSB7XG4gIHJldHVybiBpc05vZGVFbnYoKSA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gID8gd2luZG93IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IGZhbGxiYWNrR2xvYmFsT2JqZWN0O1xufVxuLyoqXG4gKiBVVUlENCBnZW5lcmF0b3JcbiAqXG4gKiBAcmV0dXJucyBzdHJpbmcgR2VuZXJhdGVkIFVVSUQ0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpIHtcbiAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICB2YXIgY3J5cHRvID0gZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG87XG5cbiAgaWYgKCEoY3J5cHRvID09PSB2b2lkIDApICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBVc2Ugd2luZG93LmNyeXB0byBBUEkgaWYgYXZhaWxhYmxlXG4gICAgdmFyIGFyciA9IG5ldyBVaW50MTZBcnJheSg4KTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7IC8vIHNldCA0IGluIGJ5dGUgN1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG5cbiAgICBhcnJbM10gPSBhcnJbM10gJiAweGZmZiB8IDB4NDAwMDsgLy8gc2V0IDIgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGJ5dGUgOSB0byAnMTAnXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcblxuICAgIGFycls0XSA9IGFycls0XSAmIDB4M2ZmZiB8IDB4ODAwMDtcblxuICAgIHZhciBwYWQgPSBmdW5jdGlvbiBwYWQobnVtKSB7XG4gICAgICB2YXIgdiA9IG51bS50b1N0cmluZygxNik7XG5cbiAgICAgIHdoaWxlICh2Lmxlbmd0aCA8IDQpIHtcbiAgICAgICAgdiA9IFwiMFwiICsgdjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHY7XG4gICAgfTtcblxuICAgIHJldHVybiBwYWQoYXJyWzBdKSArIHBhZChhcnJbMV0pICsgcGFkKGFyclsyXSkgKyBwYWQoYXJyWzNdKSArIHBhZChhcnJbNF0pICsgcGFkKGFycls1XSkgKyBwYWQoYXJyWzZdKSArIHBhZChhcnJbN10pO1xuICB9IC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTE3NTIzIzIxMTc1MjNcblxuXG4gIHJldHVybiAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcblxuICAgIHZhciB2ID0gYyA9PT0gJ3gnID8gciA6IHIgJiAweDMgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cbi8qKlxuICogUGFyc2VzIHN0cmluZyBmb3JtIG9mIFVSTCBpbnRvIGFuIG9iamVjdFxuICogLy8gYm9ycm93ZWQgZnJvbSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKiAvLyBpbnRlbnRpb25hbGx5IHVzaW5nIHJlZ2V4IGFuZCBub3QgPGEvPiBocmVmIHBhcnNpbmcgdHJpY2sgYmVjYXVzZSBSZWFjdCBOYXRpdmUgYW5kIG90aGVyXG4gKiAvLyBlbnZpcm9ubWVudHMgd2hlcmUgRE9NIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGVcbiAqIEByZXR1cm5zIHBhcnNlZCBVUkwgb2JqZWN0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsKHVybCkge1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBtYXRjaCA9IHVybC5tYXRjaCgvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7fTtcbiAgfSAvLyBjb2VyY2UgdG8gdW5kZWZpbmVkIHZhbHVlcyB0byBlbXB0eSBzdHJpbmcgc28gd2UgZG9uJ3QgZ2V0ICd1bmRlZmluZWQnXG5cblxuICB2YXIgcXVlcnkgPSBtYXRjaFs2XSB8fCAnJztcbiAgdmFyIGZyYWdtZW50ID0gbWF0Y2hbOF0gfHwgJyc7XG4gIHJldHVybiB7XG4gICAgaG9zdDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV0sXG4gICAgcHJvdG9jb2w6IG1hdGNoWzJdLFxuICAgIHJlbGF0aXZlOiBtYXRjaFs1XSArIHF1ZXJ5ICsgZnJhZ21lbnRcbiAgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgZWl0aGVyIG1lc3NhZ2Ugb3IgdHlwZSt2YWx1ZSBmcm9tIGFuIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHVzZXItZmFjaW5nIGxvZ3NcbiAqIEByZXR1cm5zIGV2ZW50J3MgZGVzY3JpcHRpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkge1xuICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgIHJldHVybiBldmVudC5tZXNzYWdlO1xuICB9XG5cbiAgaWYgKGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0pIHtcbiAgICB2YXIgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcblxuICAgIGlmIChleGNlcHRpb24udHlwZSAmJiBleGNlcHRpb24udmFsdWUpIHtcbiAgICAgIHJldHVybiBleGNlcHRpb24udHlwZSArIFwiOiBcIiArIGV4Y2VwdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhjZXB0aW9uLnR5cGUgfHwgZXhjZXB0aW9uLnZhbHVlIHx8IGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xuICB9XG5cbiAgcmV0dXJuIGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xufVxuLyoqIEpTRG9jICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlU2FuZGJveChjYWxsYmFjaykge1xuICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gIHZhciBsZXZlbHMgPSBbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdsb2cnLCAnYXNzZXJ0J107XG5cbiAgaWYgKCEoJ2NvbnNvbGUnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG5cblxuICB2YXIgb3JpZ2luYWxDb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIHZhciB3cmFwcGVkTGV2ZWxzID0ge307IC8vIFJlc3RvcmUgYWxsIHdyYXBwZWQgY29uc29sZSBtZXRob2RzXG5cbiAgbGV2ZWxzLmZvckVhY2goZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIGlmIChsZXZlbCBpbiBnbG9iYWwuY29uc29sZSAmJiBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdLl9fc2VudHJ5X29yaWdpbmFsX18pIHtcbiAgICAgIHdyYXBwZWRMZXZlbHNbbGV2ZWxdID0gb3JpZ2luYWxDb25zb2xlW2xldmVsXTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdLl9fc2VudHJ5X29yaWdpbmFsX187XG4gICAgfVxuICB9KTsgLy8gUGVyZm9ybSBjYWxsYmFjayBtYW5pcHVsYXRpb25zXG5cbiAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJldmVydCByZXN0b3JhdGlvbiB0byB3cmFwcGVkIHN0YXRlXG5cbiAgT2JqZWN0LmtleXMod3JhcHBlZExldmVscykuZm9yRWFjaChmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdID0gd3JhcHBlZExldmVsc1tsZXZlbF07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBZGRzIGV4Y2VwdGlvbiB2YWx1ZXMsIHR5cGUgYW5kIHZhbHVlIHRvIGFuIHN5bnRoZXRpYyBFeGNlcHRpb24uXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQHBhcmFtIHR5cGUgVHlwZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQGhpZGRlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIHZhbHVlLCB0eXBlKSB7XG4gIGV2ZW50LmV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiB8fCB7fTtcbiAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgW107XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdIHx8IHt9O1xuICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnZhbHVlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS52YWx1ZSB8fCB2YWx1ZSB8fCAnJztcbiAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlIHx8IHR5cGUgfHwgJ0Vycm9yJztcbn1cbi8qKlxuICogQWRkcyBleGNlcHRpb24gbWVjaGFuaXNtIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBtZWNoYW5pc20gTWVjaGFuaXNtIG9mIHRoZSBtZWNoYW5pc20uXG4gKiBAaGlkZGVuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwgbWVjaGFuaXNtKSB7XG4gIGlmIChtZWNoYW5pc20gPT09IHZvaWQgMCkge1xuICAgIG1lY2hhbmlzbSA9IHt9O1xuICB9IC8vIFRPRE86IFVzZSByZWFsIHR5cGUgd2l0aCBga2V5b2YgTWVjaGFuaXNtYCB0aGluZ3kgYW5kIG1heWJlIG1ha2UgaXQgYmV0dGVyP1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBAdHMtaWdub3JlIFR5cGUgJ01lY2hhbmlzbSB8IHt9JyBpcyBub3QgYXNzaWduYWJsZSB0byB0eXBlICdNZWNoYW5pc20gfCB1bmRlZmluZWQnXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLm1lY2hhbmlzbSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0ubWVjaGFuaXNtIHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKG1lY2hhbmlzbSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAvLyBAdHMtaWdub3JlIE1lY2hhbmlzbSBoYXMgbm8gaW5kZXggc2lnbmF0dXJlXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5tZWNoYW5pc21ba2V5XSA9IG1lY2hhbmlzbVtrZXldO1xuICAgIH0pO1xuICB9IGNhdGNoIChfb08pIHsvLyBuby1lbXB0eVxuICB9XG59XG4vKipcbiAqIEEgc2FmZSBmb3JtIG9mIGxvY2F0aW9uLmhyZWZcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYXRpb25IcmVmKCkge1xuICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gIH0gY2F0Y2ggKG9PKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59IC8vIGh0dHBzOi8vc2VtdmVyLm9yZy8jaXMtdGhlcmUtYS1zdWdnZXN0ZWQtcmVndWxhci1leHByZXNzaW9uLXJlZ2V4LXRvLWNoZWNrLWEtc2VtdmVyLXN0cmluZ1xuXG52YXIgU0VNVkVSX1JFR0VYUCA9IC9eKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopKD86LSgoPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKikpPyg/OlxcKyhbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKSk/JC87XG4vKipcbiAqIFBhcnNlcyBpbnB1dCBpbnRvIGEgU2VtVmVyIGludGVyZmFjZVxuICogQHBhcmFtIGlucHV0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNlbXZlciB2ZXJzaW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VtdmVyKGlucHV0KSB7XG4gIHZhciBtYXRjaCA9IGlucHV0Lm1hdGNoKFNFTVZFUl9SRUdFWFApIHx8IFtdO1xuICB2YXIgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB2YXIgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuICB2YXIgcGF0Y2ggPSBwYXJzZUludChtYXRjaFszXSwgMTApO1xuICByZXR1cm4ge1xuICAgIGJ1aWxkbWV0YWRhdGE6IG1hdGNoWzVdLFxuICAgIG1ham9yOiBpc05hTihtYWpvcikgPyB1bmRlZmluZWQgOiBtYWpvcixcbiAgICBtaW5vcjogaXNOYU4obWlub3IpID8gdW5kZWZpbmVkIDogbWlub3IsXG4gICAgcGF0Y2g6IGlzTmFOKHBhdGNoKSA/IHVuZGVmaW5lZCA6IHBhdGNoLFxuICAgIHByZXJlbGVhc2U6IG1hdGNoWzRdXG4gIH07XG59XG52YXIgZGVmYXVsdFJldHJ5QWZ0ZXIgPSA2MCAqIDEwMDA7IC8vIDYwIHNlY29uZHNcblxuLyoqXG4gKiBFeHRyYWN0cyBSZXRyeS1BZnRlciB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciBvciByZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAqIEBwYXJhbSBub3cgY3VycmVudCB1bml4IHRpbWVzdGFtcFxuICogQHBhcmFtIGhlYWRlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ1JldHJ5LUFmdGVyJyBoZWFkZXJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgaGVhZGVyKSB7XG4gIGlmICghaGVhZGVyKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXRyeUFmdGVyO1xuICB9XG5cbiAgdmFyIGhlYWRlckRlbGF5ID0gcGFyc2VJbnQoXCJcIiArIGhlYWRlciwgMTApO1xuXG4gIGlmICghaXNOYU4oaGVhZGVyRGVsYXkpKSB7XG4gICAgcmV0dXJuIGhlYWRlckRlbGF5ICogMTAwMDtcbiAgfVxuXG4gIHZhciBoZWFkZXJEYXRlID0gRGF0ZS5wYXJzZShcIlwiICsgaGVhZGVyKTtcblxuICBpZiAoIWlzTmFOKGhlYWRlckRhdGUpKSB7XG4gICAgcmV0dXJuIGhlYWRlckRhdGUgLSBub3c7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFJldHJ5QWZ0ZXI7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWRkcyBjb250ZXh0IChwcmUvcG9zdC9saW5lKSBsaW5lcyB0byB0aGUgcHJvdmlkZWQgZnJhbWVcbiAqXG4gKiBAcGFyYW0gbGluZXMgc3RyaW5nW10gY29udGFpbmluZyBhbGwgbGluZXNcbiAqIEBwYXJhbSBmcmFtZSBTdGFja0ZyYW1lIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gKiBAcGFyYW0gbGluZXNPZkNvbnRleHQgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgd2Ugd2FudCB0byBhZGQgcHJlL3Bvc3RcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29udGV4dFRvRnJhbWUobGluZXMsIGZyYW1lLCBsaW5lc09mQ29udGV4dCkge1xuICBpZiAobGluZXNPZkNvbnRleHQgPT09IHZvaWQgMCkge1xuICAgIGxpbmVzT2ZDb250ZXh0ID0gNTtcbiAgfVxuXG4gIHZhciBsaW5lbm8gPSBmcmFtZS5saW5lbm8gfHwgMDtcbiAgdmFyIG1heExpbmVzID0gbGluZXMubGVuZ3RoO1xuICB2YXIgc291cmNlTGluZSA9IE1hdGgubWF4KE1hdGgubWluKG1heExpbmVzLCBsaW5lbm8gLSAxKSwgMCk7XG4gIGZyYW1lLnByZV9jb250ZXh0ID0gbGluZXMuc2xpY2UoTWF0aC5tYXgoMCwgc291cmNlTGluZSAtIGxpbmVzT2ZDb250ZXh0KSwgc291cmNlTGluZSkubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgcmV0dXJuIHNuaXBMaW5lKGxpbmUsIDApO1xuICB9KTtcbiAgZnJhbWUuY29udGV4dF9saW5lID0gc25pcExpbmUobGluZXNbTWF0aC5taW4obWF4TGluZXMgLSAxLCBzb3VyY2VMaW5lKV0sIGZyYW1lLmNvbG5vIHx8IDApO1xuICBmcmFtZS5wb3N0X2NvbnRleHQgPSBsaW5lcy5zbGljZShNYXRoLm1pbihzb3VyY2VMaW5lICsgMSwgbWF4TGluZXMpLCBzb3VyY2VMaW5lICsgMSArIGxpbmVzT2ZDb250ZXh0KS5tYXAoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICByZXR1cm4gc25pcExpbmUobGluZSwgMCk7XG4gIH0pO1xufVxuLyoqXG4gKiBTdHJpcCB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudCBvZmYgb2YgYSBnaXZlbiBVUkwgb3IgcGF0aCAoaWYgcHJlc2VudClcbiAqXG4gKiBAcGFyYW0gdXJsUGF0aCBGdWxsIFVSTCBvciBwYXRoLCBpbmNsdWRpbmcgcG9zc2libGUgcXVlcnkgc3RyaW5nIGFuZC9vciBmcmFnbWVudFxuICogQHJldHVybnMgVVJMIG9yIHBhdGggd2l0aG91dCBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBVcmxRdWVyeUFuZEZyYWdtZW50KHVybFBhdGgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHJldHVybiB1cmxQYXRoLnNwbGl0KC9bXFw/I10vLCAxKVswXTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2861\n")},7864:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"KV\": function() { return /* binding */ isNodeEnv; },\n/* harmony export */ \"l$\": function() { return /* binding */ dynamicRequire; },\n/* harmony export */ \"$y\": function() { return /* binding */ loadModule; }\n/* harmony export */ });\n/* module decorator */ module = __webpack_require__.hmd(module);\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nfunction isNodeEnv() {\n return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n\nfunction dynamicRequire(mod, request) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return mod.require(request);\n}\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\n\nfunction loadModule(moduleName) {\n var mod;\n\n try {\n mod = dynamicRequire(module, moduleName);\n } catch (e) {// no-empty\n }\n\n try {\n var cwd = dynamicRequire(module, 'process').cwd;\n mod = dynamicRequire(module, cwd() + \"/node_modules/\" + moduleName);\n } catch (e) {// no-empty\n }\n\n return mod;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9ub2RlLmpzP2IwZWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsaUJBQWlCO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEdBQUcsWUFBWTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsWUFBWTtBQUNmOztBQUVBO0FBQ0EiLCJmaWxlIjoiNzg2NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgd2UncmUgaW4gdGhlIE5vZGUuanMgb3IgQnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byBnaXZlbiBxdWVzdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlRW52KCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MgOiAwKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xufVxuLyoqXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSB3aGljaCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBidW5kbGVyIG1pbmlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCBUaGUgbW9kdWxlIHBhdGggdG8gcmVzb2x2ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY1JlcXVpcmUobW9kLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgcmV0dXJuIG1vZC5yZXF1aXJlKHJlcXVlc3QpO1xufVxuLyoqXG4gKiBIZWxwZXIgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgbW9kdWxlIHRoYXQgc2hvdWxkIHdvcmsgd2l0aCBsaW5rZWQgZGVwZW5kZW5jaWVzLlxuICogVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBfc2hvdWxkXyBiZSB1c2luZyBgcmVxdWlyZShyZXF1aXJlLnJlc29sdmUobW9kdWxlTmFtZSwgeyBwYXRoczogW2N3ZCgpXSB9KSlgXG4gKiBIb3dldmVyIGl0J3MgX25vdCBwb3NzaWJsZV8gdG8gZG8gdGhhdCB3aXRoIFdlYnBhY2ssIGFzIGl0IGhhcyB0byBrbm93IGFsbCB0aGUgZGVwZW5kZW5jaWVzIGR1cmluZ1xuICogYnVpbGQgdGltZS4gYHJlcXVpcmUucmVzb2x2ZWAgaXMgYWxzbyBub3QgYXZhaWxhYmxlIGluIGFueSBvdGhlciB3YXksIHNvIHdlIGNhbm5vdCBjcmVhdGUsXG4gKiBhIGZha2UgaGVscGVyIGxpa2Ugd2UgZG8gd2l0aCBgZHluYW1pY1JlcXVpcmVgLlxuICpcbiAqIFdlIGFsd2F5cyBwcmVmZXIgdG8gdXNlIGxvY2FsIHBhY2thZ2UsIHRodXMgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBlYXJseSBmcm9tIGVhY2ggYHRyeS9jYXRjaGAgYmxvY2suXG4gKiBUaGF0IGlzIHRvIG1pbWljIHRoZSBiZWhhdmlvciBvZiBgcmVxdWlyZS5yZXNvbHZlYCBleGFjdGx5LlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIG1vZHVsZSBuYW1lIHRvIHJlcXVpcmVcbiAqIEByZXR1cm5zIHBvc3NpYmx5IHJlcXVpcmVkIG1vZHVsZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTW9kdWxlKG1vZHVsZU5hbWUpIHtcbiAgdmFyIG1vZDtcblxuICB0cnkge1xuICAgIG1vZCA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgbW9kdWxlTmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHsvLyBuby1lbXB0eVxuICB9XG5cbiAgdHJ5IHtcbiAgICB2YXIgY3dkID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncHJvY2VzcycpLmN3ZDtcbiAgICBtb2QgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsIGN3ZCgpICsgXCIvbm9kZV9tb2R1bGVzL1wiICsgbW9kdWxlTmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHsvLyBuby1lbXB0eVxuICB9XG5cbiAgcmV0dXJuIG1vZDtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7864\n")},150:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"Jr\": function() { return /* binding */ dropUndefinedKeys; },\n \"zf\": function() { return /* binding */ extractExceptionKeysForMessage; },\n \"hl\": function() { return /* binding */ fill; },\n \"Fv\": function() { return /* binding */ normalize; },\n \"Qy\": function() { return /* binding */ normalizeToSize; },\n \"_j\": function() { return /* binding */ urlEncode; }\n});\n\n// UNUSED EXPORTS: walk\n\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(4850);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/browser.js\nvar browser = __webpack_require__(595);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/is.js\nvar is = __webpack_require__(2684);\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/memo.js\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nvar Memo =\n/** @class */\nfunction () {\n function Memo() {\n this._hasWeakSet = typeof WeakSet === 'function';\n this._inner = this._hasWeakSet ? new WeakSet() : [];\n }\n /**\n * Sets obj to remember.\n * @param obj Object to remember\n */\n\n\n Memo.prototype.memoize = function (obj) {\n if (this._hasWeakSet) {\n if (this._inner.has(obj)) {\n return true;\n }\n\n this._inner.add(obj);\n\n return false;\n } // eslint-disable-next-line @typescript-eslint/prefer-for-of\n\n\n for (var i = 0; i < this._inner.length; i++) {\n var value = this._inner[i];\n\n if (value === obj) {\n return true;\n }\n }\n\n this._inner.push(obj);\n\n return false;\n };\n /**\n * Removes object from internal storage.\n * @param obj Object to forget\n */\n\n\n Memo.prototype.unmemoize = function (obj) {\n if (this._hasWeakSet) {\n this._inner.delete(obj);\n } else {\n for (var i = 0; i < this._inner.length; i++) {\n if (this._inner[i] === obj) {\n this._inner.splice(i, 1);\n\n break;\n }\n }\n }\n };\n\n return Memo;\n}();\n\n\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/stacktrace.js\nvar stacktrace = __webpack_require__(1313);\n// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/string.js\nvar string = __webpack_require__(7940);\n;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/object.js\n\n\n\n\n\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, )` or `origMethod.apply(this, [])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\n\nfunction fill(source, name, replacementFactory) {\n if (!(name in source)) {\n return;\n }\n\n var original = source[name];\n var wrapped = replacementFactory(original); // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n\n if (typeof wrapped === 'function') {\n try {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __sentry_original__: {\n enumerable: false,\n value: original\n }\n });\n } catch (_Oo) {// This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n\n source[name] = wrapped;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\n\nfunction urlEncode(object) {\n return Object.keys(object).map(function (key) {\n return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]);\n }).join('&');\n}\n/**\n * Transforms any object into an object literal with all its attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n */\n\nfunction getWalkSource(value) {\n if ((0,is/* isError */.VZ)(value)) {\n var error = value;\n var err = {\n message: error.message,\n name: error.name,\n stack: error.stack\n };\n\n for (var i in error) {\n if (Object.prototype.hasOwnProperty.call(error, i)) {\n err[i] = error[i];\n }\n }\n\n return err;\n }\n\n if ((0,is/* isEvent */.cO)(value)) {\n var event_1 = value;\n var source = {}; // Accessing event attributes can throw (see https://github.com/getsentry/sentry-javascript/issues/768 and\n // https://github.com/getsentry/sentry-javascript/issues/838), but accessing `type` hasn't been wrapped in a\n // try-catch in at least two years and no one's complained, so that's likely not an issue anymore\n\n source.type = event_1.type;\n\n try {\n source.target = (0,is/* isElement */.kK)(event_1.target) ? (0,browser/* htmlTreeAsString */.R)(event_1.target) : Object.prototype.toString.call(event_1.target);\n } catch (_oO) {\n source.target = '';\n }\n\n try {\n source.currentTarget = (0,is/* isElement */.kK)(event_1.currentTarget) ? (0,browser/* htmlTreeAsString */.R)(event_1.currentTarget) : Object.prototype.toString.call(event_1.currentTarget);\n } catch (_oO) {\n source.currentTarget = '';\n }\n\n if (typeof CustomEvent !== 'undefined' && (0,is/* isInstanceOf */.V9)(value, CustomEvent)) {\n source.detail = event_1.detail;\n }\n\n for (var attr in event_1) {\n if (Object.prototype.hasOwnProperty.call(event_1, attr)) {\n source[attr] = event_1[attr];\n }\n }\n\n return source;\n }\n\n return value;\n}\n/** Calculates bytes size of input string */\n\n\nfunction utf8Length(value) {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\n\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\n\n\nfunction normalizeToSize(object, // Default Node.js REPL depth\ndepth, // 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n if (depth === void 0) {\n depth = 3;\n }\n\n if (maxSize === void 0) {\n maxSize = 100 * 1024;\n }\n\n var serialized = normalize(object, depth);\n\n if (jsonSize(serialized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return serialized;\n}\n/**\n * Transform any non-primitive, BigInt, or Symbol-type value into a string. Acts as a no-op on strings, numbers,\n * booleans, null, and undefined.\n *\n * @param value The value to stringify\n * @returns For non-primitive, BigInt, and Symbol-type values, a string denoting the value's type, type and value, or\n * type and `description` property, respectively. For non-BigInt, non-Symbol primitives, returns the original value,\n * unchanged.\n */\n\nfunction serializeValue(value) {\n var type = Object.prototype.toString.call(value); // Node.js REPL notation\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (type === '[object Object]') {\n return '[Object]';\n }\n\n if (type === '[object Array]') {\n return '[Array]';\n }\n\n var normalized = normalizeValue(value);\n return (0,is/* isPrimitive */.pt)(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\n\n\nfunction normalizeValue(value, key) {\n if (key === 'domain' && value && typeof value === 'object' && value._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n if (typeof __webpack_require__.g !== 'undefined' && value === __webpack_require__.g) {\n return '[Global]';\n } // It's safe to use `window` and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n // eslint-disable-next-line no-restricted-globals\n\n\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n } // eslint-disable-next-line no-restricted-globals\n\n\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n } // React's SyntheticEvent thingy\n\n\n if ((0,is/* isSyntheticEvent */.Cy)(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n if (value === void 0) {\n return '[undefined]';\n }\n\n if (typeof value === 'function') {\n return \"[Function: \" + (0,stacktrace/* getFunctionName */.$)(value) + \"]\";\n } // symbols and bigints are considered primitives by TS, but aren't natively JSON-serilaizable\n\n\n if (typeof value === 'symbol') {\n return \"[\" + String(value) + \"]\";\n }\n\n if (typeof value === 'bigint') {\n return \"[BigInt: \" + String(value) + \"]\";\n }\n\n return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\nfunction walk(key, value, depth, memo) {\n if (depth === void 0) {\n depth = +Infinity;\n }\n\n if (memo === void 0) {\n memo = new Memo();\n } // If we reach the maximum depth, serialize whatever has left\n\n\n if (depth === 0) {\n return serializeValue(value);\n }\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // If value implements `toJSON` method, call it and return early\n\n\n if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n\n\n var normalized = normalizeValue(value, key);\n\n if ((0,is/* isPrimitive */.pt)(normalized)) {\n return normalized;\n } // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n\n\n var source = getWalkSource(value); // Create an accumulator that will act as a parent for all future itterations of that branch\n\n var acc = Array.isArray(value) ? [] : {}; // If we already walked that branch, bail out, as it's circular reference\n\n if (memo.memoize(value)) {\n return '[Circular ~]';\n } // Walk all keys of the source\n\n\n for (var innerKey in source) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n continue;\n } // Recursively walk through all the child nodes\n\n\n acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n } // Once walked through all the branches, remove the parent from memo storage\n\n\n memo.unmemoize(value); // Return accumulated values\n\n return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nfunction normalize(input, depth) {\n try {\n return JSON.parse(JSON.stringify(input, function (key, value) {\n return walk(key, value, depth);\n }));\n } catch (_oO) {\n return '**non-serializable**';\n }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nfunction extractExceptionKeysForMessage(exception, maxLength) {\n if (maxLength === void 0) {\n maxLength = 40;\n }\n\n var keys = Object.keys(getWalkSource(exception));\n keys.sort();\n\n if (!keys.length) {\n return '[object has no keys]';\n }\n\n if (keys[0].length >= maxLength) {\n return (0,string/* truncate */.$G)(keys[0], maxLength);\n }\n\n for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n var serialized = keys.slice(0, includedKeys).join(', ');\n\n if (serialized.length > maxLength) {\n continue;\n }\n\n if (includedKeys === keys.length) {\n return serialized;\n }\n\n return (0,string/* truncate */.$G)(serialized, maxLength);\n }\n\n return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\n\nfunction dropUndefinedKeys(val) {\n var e_1, _a;\n\n if ((0,is/* isPlainObject */.PO)(val)) {\n var obj = val;\n var rv = {};\n\n try {\n for (var _b = (0,tslib_es6/* __values */.XA)(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n\n if (typeof obj[key] !== 'undefined') {\n rv[key] = dropUndefinedKeys(obj[key]);\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return rv;\n }\n\n if (Array.isArray(val)) {\n return val.map(dropUndefinedKeys);\n }\n\n return val;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9tZW1vLmpzPzdkMmYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vb2JqZWN0LmpzPzBhZjciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0wsbUJBQW1CLHdCQUF3QjtBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7Ozs7Ozs7O0FDbkVnQztBQUNZO0FBQ2tFO0FBQ2pGO0FBQ2lCO0FBQ1g7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssY0FBYztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLHNCQUFPO0FBQ2I7QUFDQTtBQUNB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WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG5cbi8qKlxuICogTWVtbyBjbGFzcyB1c2VkIGZvciBkZWN5Y2xlIGpzb24gb2JqZWN0cy4gVXNlcyBXZWFrU2V0IGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgYXJyYXkuXG4gKi9cbnZhciBNZW1vID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVtbygpIHtcbiAgICB0aGlzLl9oYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbic7XG4gICAgdGhpcy5faW5uZXIgPSB0aGlzLl9oYXNXZWFrU2V0ID8gbmV3IFdlYWtTZXQoKSA6IFtdO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIG9iaiB0byByZW1lbWJlci5cbiAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gcmVtZW1iZXJcbiAgICovXG5cblxuICBNZW1vLnByb3RvdHlwZS5tZW1vaXplID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICBpZiAodGhpcy5faW5uZXIuaGFzKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lubmVyLmFkZChvYmopO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5faW5uZXJbaV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2lubmVyLnB1c2gob2JqKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgLyoqXG4gICAqIFJlbW92ZXMgb2JqZWN0IGZyb20gaW50ZXJuYWwgc3RvcmFnZS5cbiAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gZm9yZ2V0XG4gICAqL1xuXG5cbiAgTWVtby5wcm90b3R5cGUudW5tZW1vaXplID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICB0aGlzLl9pbm5lci5kZWxldGUob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5faW5uZXJbaV0gPT09IG9iaikge1xuICAgICAgICAgIHRoaXMuX2lubmVyLnNwbGljZShpLCAxKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBNZW1vO1xufSgpO1xuXG5leHBvcnQgeyBNZW1vIH07IiwiaW1wb3J0IHsgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGh0bWxUcmVlQXNTdHJpbmcgfSBmcm9tICcuL2Jyb3dzZXInO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0Vycm9yLCBpc0V2ZW50LCBpc0luc3RhbmNlT2YsIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlLCBpc1N5bnRoZXRpY0V2ZW50IH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBNZW1vIH0gZnJvbSAnLi9tZW1vJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uTmFtZSB9IGZyb20gJy4vc3RhY2t0cmFjZSc7XG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4vc3RyaW5nJztcbi8qKlxuICogUmVwbGFjZSBhIG1ldGhvZCBpbiBhbiBvYmplY3Qgd2l0aCBhIHdyYXBwZWQgdmVyc2lvbiBvZiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIHJlcGxhY2VtZW50RmFjdG9yeSBBIGhpZ2hlci1vcmRlciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBtZXRob2QgYW5kIHJldHVybnMgYVxuICogd3JhcHBlZCB2ZXJzaW9uLiBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYHJlcGxhY2VtZW50RmFjdG9yeWAgbmVlZHMgdG8gYmUgYSBub24tYXJyb3cgZnVuY3Rpb24sIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSB0aGUgY29ycmVjdCB2YWx1ZSBvZiBgdGhpc2AsIGFuZCB0aGUgb3JpZ2luYWwgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHVzaW5nIGBvcmlnTWV0aG9kLmNhbGwodGhpcywgPG90aGVyXG4gKiBhcmdzPilgIG9yIGBvcmlnTWV0aG9kLmFwcGx5KHRoaXMsIFs8b3RoZXIgYXJncz5dKWAgKHJhdGhlciB0aGFuIGJlaW5nIGNhbGxlZCBkaXJlY3RseSksIGFnYWluIHRvIHByZXNlcnZlIGB0aGlzYC5cbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsbChzb3VyY2UsIG5hbWUsIHJlcGxhY2VtZW50RmFjdG9yeSkge1xuICBpZiAoIShuYW1lIGluIHNvdXJjZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgb3JpZ2luYWwgPSBzb3VyY2VbbmFtZV07XG4gIHZhciB3cmFwcGVkID0gcmVwbGFjZW1lbnRGYWN0b3J5KG9yaWdpbmFsKTsgLy8gTWFrZSBzdXJlIGl0J3MgYSBmdW5jdGlvbiBmaXJzdCwgYXMgd2UgbmVlZCB0byBhdHRhY2ggYW4gZW1wdHkgcHJvdG90eXBlIGZvciBgZGVmaW5lUHJvcGVydGllc2AgdG8gd29ya1xuICAvLyBvdGhlcndpc2UgaXQnbGwgdGhyb3cgXCJUeXBlRXJyb3I6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGNhbGxlZCBvbiBub24tb2JqZWN0XCJcblxuICBpZiAodHlwZW9mIHdyYXBwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgd3JhcHBlZC5wcm90b3R5cGUgPSB3cmFwcGVkLnByb3RvdHlwZSB8fCB7fTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdyYXBwZWQsIHtcbiAgICAgICAgX19zZW50cnlfb3JpZ2luYWxfXzoge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBvcmlnaW5hbFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfT28pIHsvLyBUaGlzIGNhbiB0aHJvdyBpZiBtdWx0aXBsZSBmaWxsIGhhcHBlbnMgb24gYSBnbG9iYWwgb2JqZWN0IGxpa2UgWE1MSHR0cFJlcXVlc3RcbiAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIwNDNcbiAgICB9XG4gIH1cblxuICBzb3VyY2VbbmFtZV0gPSB3cmFwcGVkO1xufVxuLyoqXG4gKiBFbmNvZGVzIGdpdmVuIG9iamVjdCBpbnRvIHVybC1mcmllbmRseSBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNlcmlhbGl6YWJsZSB2YWx1ZXNcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVybEVuY29kZShvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChvYmplY3Rba2V5XSk7XG4gIH0pLmpvaW4oJyYnKTtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyBhbnkgb2JqZWN0IGludG8gYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBhbGwgaXRzIGF0dHJpYnV0ZXNcbiAqIGF0dGFjaGVkIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBJbml0aWFsIHNvdXJjZSB0aGF0IHdlIGhhdmUgdG8gdHJhbnNmb3JtIGluIG9yZGVyIGZvciBpdCB0byBiZSB1c2FibGUgYnkgdGhlIHNlcmlhbGl6ZXJcbiAqL1xuXG5mdW5jdGlvbiBnZXRXYWxrU291cmNlKHZhbHVlKSB7XG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIHZhciBlcnJvciA9IHZhbHVlO1xuICAgIHZhciBlcnIgPSB7XG4gICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpIGluIGVycm9yKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCBpKSkge1xuICAgICAgICBlcnJbaV0gPSBlcnJvcltpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyO1xuICB9XG5cbiAgaWYgKGlzRXZlbnQodmFsdWUpKSB7XG4gICAgdmFyIGV2ZW50XzEgPSB2YWx1ZTtcbiAgICB2YXIgc291cmNlID0ge307IC8vIEFjY2Vzc2luZyBldmVudCBhdHRyaWJ1dGVzIGNhbiB0aHJvdyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzc2OCBhbmRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy84MzgpLCBidXQgYWNjZXNzaW5nIGB0eXBlYCBoYXNuJ3QgYmVlbiB3cmFwcGVkIGluIGFcbiAgICAvLyB0cnktY2F0Y2ggaW4gYXQgbGVhc3QgdHdvIHllYXJzIGFuZCBubyBvbmUncyBjb21wbGFpbmVkLCBzbyB0aGF0J3MgbGlrZWx5IG5vdCBhbiBpc3N1ZSBhbnltb3JlXG5cbiAgICBzb3VyY2UudHlwZSA9IGV2ZW50XzEudHlwZTtcblxuICAgIHRyeSB7XG4gICAgICBzb3VyY2UudGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50XzEudGFyZ2V0KSA/IGh0bWxUcmVlQXNTdHJpbmcoZXZlbnRfMS50YXJnZXQpIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV2ZW50XzEudGFyZ2V0KTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHNvdXJjZS50YXJnZXQgPSAnPHVua25vd24+JztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc291cmNlLmN1cnJlbnRUYXJnZXQgPSBpc0VsZW1lbnQoZXZlbnRfMS5jdXJyZW50VGFyZ2V0KSA/IGh0bWxUcmVlQXNTdHJpbmcoZXZlbnRfMS5jdXJyZW50VGFyZ2V0KSA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudF8xLmN1cnJlbnRUYXJnZXQpO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgc291cmNlLmN1cnJlbnRUYXJnZXQgPSAnPHVua25vd24+JztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIEN1c3RvbUV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2YodmFsdWUsIEN1c3RvbUV2ZW50KSkge1xuICAgICAgc291cmNlLmRldGFpbCA9IGV2ZW50XzEuZGV0YWlsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGF0dHIgaW4gZXZlbnRfMSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChldmVudF8xLCBhdHRyKSkge1xuICAgICAgICBzb3VyY2VbYXR0cl0gPSBldmVudF8xW2F0dHJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG4vKiogQ2FsY3VsYXRlcyBieXRlcyBzaXplIG9mIGlucHV0IHN0cmluZyAqL1xuXG5cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgodmFsdWUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIH4tZW5jb2RlVVJJKHZhbHVlKS5zcGxpdCgvJS4ufC4vKS5sZW5ndGg7XG59XG4vKiogQ2FsY3VsYXRlcyBieXRlcyBzaXplIG9mIGlucHV0IG9iamVjdCAqL1xuXG5cbmZ1bmN0aW9uIGpzb25TaXplKHZhbHVlKSB7XG4gIHJldHVybiB1dGY4TGVuZ3RoKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG4vKiogSlNEb2MgKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9TaXplKG9iamVjdCwgLy8gRGVmYXVsdCBOb2RlLmpzIFJFUEwgZGVwdGhcbmRlcHRoLCAvLyAxMDBrQiwgYXMgMjAwa0IgaXMgbWF4IHBheWxvYWQgc2l6ZSwgc28gaGFsZiBzb3VuZHMgcmVhc29uYWJsZVxubWF4U2l6ZSkge1xuICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgIGRlcHRoID0gMztcbiAgfVxuXG4gIGlmIChtYXhTaXplID09PSB2b2lkIDApIHtcbiAgICBtYXhTaXplID0gMTAwICogMTAyNDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkID0gbm9ybWFsaXplKG9iamVjdCwgZGVwdGgpO1xuXG4gIGlmIChqc29uU2l6ZShzZXJpYWxpemVkKSA+IG1heFNpemUpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplVG9TaXplKG9iamVjdCwgZGVwdGggLSAxLCBtYXhTaXplKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuLyoqXG4gKiBUcmFuc2Zvcm0gYW55IG5vbi1wcmltaXRpdmUsIEJpZ0ludCwgb3IgU3ltYm9sLXR5cGUgdmFsdWUgaW50byBhIHN0cmluZy4gQWN0cyBhcyBhIG5vLW9wIG9uIHN0cmluZ3MsIG51bWJlcnMsXG4gKiBib29sZWFucywgbnVsbCwgYW5kIHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHN0cmluZ2lmeVxuICogQHJldHVybnMgRm9yIG5vbi1wcmltaXRpdmUsIEJpZ0ludCwgYW5kIFN5bWJvbC10eXBlIHZhbHVlcywgYSBzdHJpbmcgZGVub3RpbmcgdGhlIHZhbHVlJ3MgdHlwZSwgdHlwZSBhbmQgdmFsdWUsIG9yXG4gKiAgdHlwZSBhbmQgYGRlc2NyaXB0aW9uYCBwcm9wZXJ0eSwgcmVzcGVjdGl2ZWx5LiBGb3Igbm9uLUJpZ0ludCwgbm9uLVN5bWJvbCBwcmltaXRpdmVzLCByZXR1cm5zIHRoZSBvcmlnaW5hbCB2YWx1ZSxcbiAqICB1bmNoYW5nZWQuXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpOyAvLyBOb2RlLmpzIFJFUEwgbm90YXRpb25cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIHJldHVybiAnW09iamVjdF0nO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICByZXR1cm4gJ1tBcnJheV0nO1xuICB9XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShub3JtYWxpemVkKSA/IG5vcm1hbGl6ZWQgOiB0eXBlO1xufVxuLyoqXG4gKiBub3JtYWxpemVWYWx1ZSgpXG4gKlxuICogVGFrZXMgdW5zZXJpYWxpemFibGUgaW5wdXQgYW5kIG1ha2UgaXQgc2VyaWFsaXphYmxlIGZyaWVuZGx5XG4gKlxuICogLSB0cmFuc2xhdGVzIHVuZGVmaW5lZC9OYU4gdmFsdWVzIHRvIFwiW3VuZGVmaW5lZF1cIi9cIltOYU5dXCIgcmVzcGVjdGl2ZWx5LFxuICogLSBzZXJpYWxpemVzIEVycm9yIG9iamVjdHNcbiAqIC0gZmlsdGVyIGdsb2JhbCBvYmplY3RzXG4gKi9cblxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdkb21haW4nICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuX2V2ZW50cykge1xuICAgIHJldHVybiAnW0RvbWFpbl0nO1xuICB9XG5cbiAgaWYgKGtleSA9PT0gJ2RvbWFpbkVtaXR0ZXInKSB7XG4gICAgcmV0dXJuICdbRG9tYWluRW1pdHRlcl0nO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlID09PSBnbG9iYWwpIHtcbiAgICByZXR1cm4gJ1tHbG9iYWxdJztcbiAgfSAvLyBJdCdzIHNhZmUgdG8gdXNlIGB3aW5kb3dgIGFuZCBgZG9jdW1lbnRgIGhlcmUgaW4gdGhpcyBtYW5uZXIsIGFzIHdlIGFyZSBhc3NlcnRpbmcgdXNpbmcgYHR5cGVvZmAgZmlyc3RcbiAgLy8gd2hpY2ggd29uJ3QgdGhyb3cgaWYgdGhleSBhcmUgbm90IHByZXNlbnQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcblxuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSA9PT0gd2luZG93KSB7XG4gICAgcmV0dXJuICdbV2luZG93XSc7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuXG5cbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgPT09IGRvY3VtZW50KSB7XG4gICAgcmV0dXJuICdbRG9jdW1lbnRdJztcbiAgfSAvLyBSZWFjdCdzIFN5bnRoZXRpY0V2ZW50IHRoaW5neVxuXG5cbiAgaWYgKGlzU3ludGhldGljRXZlbnQodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbU3ludGhldGljRXZlbnRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiAnW05hTl0nO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gJ1t1bmRlZmluZWRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gXCJbRnVuY3Rpb246IFwiICsgZ2V0RnVuY3Rpb25OYW1lKHZhbHVlKSArIFwiXVwiO1xuICB9IC8vIHN5bWJvbHMgYW5kIGJpZ2ludHMgYXJlIGNvbnNpZGVyZWQgcHJpbWl0aXZlcyBieSBUUywgYnV0IGFyZW4ndCBuYXRpdmVseSBKU09OLXNlcmlsYWl6YWJsZVxuXG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gXCJbXCIgKyBTdHJpbmcodmFsdWUpICsgXCJdXCI7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBcIltCaWdJbnQ6IFwiICsgU3RyaW5nKHZhbHVlKSArIFwiXVwiO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBXYWxrcyBhbiBvYmplY3QgdG8gcGVyZm9ybSBhIG5vcm1hbGl6YXRpb24gb24gaXRcbiAqXG4gKiBAcGFyYW0ga2V5IG9mIG9iamVjdCB0aGF0J3Mgd2Fsa2VkIGluIGN1cnJlbnQgaXRlcmF0aW9uXG4gKiBAcGFyYW0gdmFsdWUgb2JqZWN0IHRvIGJlIHdhbGtlZFxuICogQHBhcmFtIGRlcHRoIE9wdGlvbmFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBkZWVwIHNob3VsZCB3YWxraW5nIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lbW8gT3B0aW9uYWwgTWVtbyBjbGFzcyBoYW5kbGluZyBkZWN5Y2xpbmdcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcblxuXG5leHBvcnQgZnVuY3Rpb24gd2FsayhrZXksIHZhbHVlLCBkZXB0aCwgbWVtbykge1xuICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgIGRlcHRoID0gK0luZmluaXR5O1xuICB9XG5cbiAgaWYgKG1lbW8gPT09IHZvaWQgMCkge1xuICAgIG1lbW8gPSBuZXcgTWVtbygpO1xuICB9IC8vIElmIHdlIHJlYWNoIHRoZSBtYXhpbXVtIGRlcHRoLCBzZXJpYWxpemUgd2hhdGV2ZXIgaGFzIGxlZnRcblxuXG4gIGlmIChkZXB0aCA9PT0gMCkge1xuICAgIHJldHVybiBzZXJpYWxpemVWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIElmIHZhbHVlIGltcGxlbWVudHMgYHRvSlNPTmAgbWV0aG9kLCBjYWxsIGl0IGFuZCByZXR1cm4gZWFybHlcblxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgLy8gSWYgbm9ybWFsaXplZCB2YWx1ZSBpcyBhIHByaW1pdGl2ZSwgdGhlcmUgYXJlIG5vIGJyYW5jaGVzIGxlZnQgdG8gd2Fsaywgc28gd2UgY2FuIGp1c3QgYmFpbCBvdXQsIGFzIHRoZXJlcyBubyBwb2ludCBpbiBnb2luZyBkb3duIHRoYXQgYnJhbmNoIGFueSBmdXJ0aGVyXG5cblxuICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlLCBrZXkpO1xuXG4gIGlmIChpc1ByaW1pdGl2ZShub3JtYWxpemVkKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9IC8vIENyZWF0ZSBzb3VyY2UgdGhhdCB3ZSB3aWxsIHVzZSBmb3IgbmV4dCBpdHRlcmF0aW9ucywgZWl0aGVyIG9iamVjdGlmaWVkIGVycm9yIG9iamVjdCAoRXJyb3IgdHlwZSB3aXRoIGV4dHJhY3RlZCBrZXlzOnZhbHVlIHBhaXJzKSBvciB0aGUgaW5wdXQgaXRzZWxmXG5cblxuICB2YXIgc291cmNlID0gZ2V0V2Fsa1NvdXJjZSh2YWx1ZSk7IC8vIENyZWF0ZSBhbiBhY2N1bXVsYXRvciB0aGF0IHdpbGwgYWN0IGFzIGEgcGFyZW50IGZvciBhbGwgZnV0dXJlIGl0dGVyYXRpb25zIG9mIHRoYXQgYnJhbmNoXG5cbiAgdmFyIGFjYyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTsgLy8gSWYgd2UgYWxyZWFkeSB3YWxrZWQgdGhhdCBicmFuY2gsIGJhaWwgb3V0LCBhcyBpdCdzIGNpcmN1bGFyIHJlZmVyZW5jZVxuXG4gIGlmIChtZW1vLm1lbW9pemUodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbQ2lyY3VsYXIgfl0nO1xuICB9IC8vIFdhbGsgYWxsIGtleXMgb2YgdGhlIHNvdXJjZVxuXG5cbiAgZm9yICh2YXIgaW5uZXJLZXkgaW4gc291cmNlKSB7XG4gICAgLy8gQXZvaWQgaXRlcmF0aW5nIG92ZXIgZmllbGRzIGluIHRoZSBwcm90b3R5cGUgaWYgdGhleSd2ZSBzb21laG93IGJlZW4gZXhwb3NlZCB0byBlbnVtZXJhdGlvbi5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGlubmVyS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZWN1cnNpdmVseSB3YWxrIHRocm91Z2ggYWxsIHRoZSBjaGlsZCBub2Rlc1xuXG5cbiAgICBhY2NbaW5uZXJLZXldID0gd2Fsayhpbm5lcktleSwgc291cmNlW2lubmVyS2V5XSwgZGVwdGggLSAxLCBtZW1vKTtcbiAgfSAvLyBPbmNlIHdhbGtlZCB0aHJvdWdoIGFsbCB0aGUgYnJhbmNoZXMsIHJlbW92ZSB0aGUgcGFyZW50IGZyb20gbWVtbyBzdG9yYWdlXG5cblxuICBtZW1vLnVubWVtb2l6ZSh2YWx1ZSk7IC8vIFJldHVybiBhY2N1bXVsYXRlZCB2YWx1ZXNcblxuICByZXR1cm4gYWNjO1xufVxuLyoqXG4gKiBub3JtYWxpemUoKVxuICpcbiAqIC0gQ3JlYXRlcyBhIGNvcHkgdG8gcHJldmVudCBvcmlnaW5hbCBpbnB1dCBtdXRhdGlvblxuICogLSBTa2lwIG5vbi1lbnVtZXJhYmxlcnNcbiAqIC0gQ2FsbHMgYHRvSlNPTmAgaWYgaW1wbGVtZW50ZWRcbiAqIC0gUmVtb3ZlcyBjaXJjdWxhciByZWZlcmVuY2VzXG4gKiAtIFRyYW5zbGF0ZXMgbm9uLXNlcmlhbGl6ZWFibGUgdmFsdWVzICh1bmRlZmluZWQvTmFOL0Z1bmN0aW9ucykgdG8gc2VyaWFsaXphYmxlIGZvcm1hdFxuICogLSBUcmFuc2xhdGVzIGtub3duIGdsb2JhbCBvYmplY3RzL0NsYXNzZXMgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25zXG4gKiAtIFRha2VzIGNhcmUgb2YgRXJyb3Igb2JqZWN0cyBzZXJpYWxpemF0aW9uXG4gKiAtIE9wdGlvbmFsbHkgbGltaXQgZGVwdGggb2YgZmluYWwgb3V0cHV0XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoaW5wdXQsIGRlcHRoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gd2FsayhrZXksIHZhbHVlLCBkZXB0aCk7XG4gICAgfSkpO1xuICB9IGNhdGNoIChfb08pIHtcbiAgICByZXR1cm4gJyoqbm9uLXNlcmlhbGl6YWJsZSoqJztcbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbnkgY2FwdHVyZWQgZXhjZXB0aW9uLCBleHRyYWN0IGl0cyBrZXlzIGFuZCBjcmVhdGUgYSBzb3J0ZWRcbiAqIGFuZCB0cnVuY2F0ZWQgbGlzdCB0aGF0IHdpbGwgYmUgdXNlZCBpbnNpZGUgdGhlIGV2ZW50IG1lc3NhZ2UuXG4gKiBlZy4gYE5vbi1lcnJvciBleGNlcHRpb24gY2FwdHVyZWQgd2l0aCBrZXlzOiBmb28sIGJhciwgYmF6YFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlKGV4Y2VwdGlvbiwgbWF4TGVuZ3RoKSB7XG4gIGlmIChtYXhMZW5ndGggPT09IHZvaWQgMCkge1xuICAgIG1heExlbmd0aCA9IDQwO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhnZXRXYWxrU291cmNlKGV4Y2VwdGlvbikpO1xuICBrZXlzLnNvcnQoKTtcblxuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0IGhhcyBubyBrZXlzXSc7XG4gIH1cblxuICBpZiAoa2V5c1swXS5sZW5ndGggPj0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydW5jYXRlKGtleXNbMF0sIG1heExlbmd0aCk7XG4gIH1cblxuICBmb3IgKHZhciBpbmNsdWRlZEtleXMgPSBrZXlzLmxlbmd0aDsgaW5jbHVkZWRLZXlzID4gMDsgaW5jbHVkZWRLZXlzLS0pIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9IGtleXMuc2xpY2UoMCwgaW5jbHVkZWRLZXlzKS5qb2luKCcsICcpO1xuXG4gICAgaWYgKHNlcmlhbGl6ZWQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZWRLZXlzID09PSBrZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydW5jYXRlKHNlcmlhbGl6ZWQsIG1heExlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIEdpdmVuIGFueSBvYmplY3QsIHJldHVybiB0aGUgbmV3IG9iamVjdCB3aXRoIHJlbW92ZWQga2V5cyB0aGF0IHZhbHVlIHdhcyBgdW5kZWZpbmVkYC5cbiAqIFdvcmtzIHJlY3Vyc2l2ZWx5IG9uIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZHJvcFVuZGVmaW5lZEtleXModmFsKSB7XG4gIHZhciBlXzEsIF9hO1xuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICB2YXIgb2JqID0gdmFsO1xuICAgIHZhciBydiA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXMob2JqKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIGtleSA9IF9jLnZhbHVlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcnZba2V5XSA9IGRyb3BVbmRlZmluZWRLZXlzKG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgICBlXzEgPSB7XG4gICAgICAgIGVycm9yOiBlXzFfMVxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBydjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gdmFsLm1hcChkcm9wVW5kZWZpbmVkS2V5cyk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///150\n")},1313:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"$\": function() { return /* binding */ getFunctionName; }\n/* harmony export */ });\nvar defaultFunctionName = '';\n/**\n * Safely extract function name from itself\n */\n\nfunction getFunctionName(fn) {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n\n return fn.name || defaultFunctionName;\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n return defaultFunctionName;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9zdGFja3RyYWNlLmpzPzdmOTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjEzMTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9ICc8YW5vbnltb3VzPic7XG4vKipcbiAqIFNhZmVseSBleHRyYWN0IGZ1bmN0aW9uIG5hbWUgZnJvbSBpdHNlbGZcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25OYW1lKGZuKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFmbiB8fCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBmbi5uYW1lIHx8IGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBKdXN0IGFjY2Vzc2luZyBjdXN0b20gcHJvcHMgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uTmFtZTtcbiAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1313\n")},7940:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"$G\": function() { return /* binding */ truncate; },\n/* harmony export */ \"nK\": function() { return /* binding */ safeJoin; },\n/* harmony export */ \"zC\": function() { return /* binding */ isMatchingPattern; }\n/* harmony export */ });\n/* unused harmony export snipLine */\n/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2684);\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\n\nfunction truncate(str, max) {\n if (max === void 0) {\n max = 0;\n }\n\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n\n return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\n\nfunction snipLine(line, colno) {\n var newLine = line;\n var ll = newLine.length;\n\n if (ll <= 150) {\n return newLine;\n }\n\n if (colno > ll) {\n // eslint-disable-next-line no-param-reassign\n colno = ll;\n }\n\n var start = Math.max(colno - 60, 0);\n\n if (start < 5) {\n start = 0;\n }\n\n var end = Math.min(start + 140, ll);\n\n if (end > ll - 5) {\n end = ll;\n }\n\n if (end === ll) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n\n if (start > 0) {\n newLine = \"'{snip} \" + newLine;\n }\n\n if (end < ll) {\n newLine += ' {snip}';\n }\n\n return newLine;\n}\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nfunction safeJoin(input, delimiter) {\n if (!Array.isArray(input)) {\n return '';\n }\n\n var output = []; // eslint-disable-next-line @typescript-eslint/prefer-for-of\n\n for (var i = 0; i < input.length; i++) {\n var value = input[i];\n\n try {\n output.push(String(value));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\n\nfunction isMatchingPattern(value, pattern) {\n if (!(0,_is__WEBPACK_IMPORTED_MODULE_0__/* .isString */ .HD)(value)) {\n return false;\n }\n\n if ((0,_is__WEBPACK_IMPORTED_MODULE_0__/* .isRegExp */ .Kj)(pattern)) {\n return pattern.test(value);\n }\n\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n\n return false;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9zdHJpbmcuanM/YmMwMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsaUJBQWlCLEtBQUs7QUFDdEI7O0FBRUE7QUFDQSxrQkFBa0IsS0FBSztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCOztBQUVsQixpQkFBaUIsa0JBQWtCO0FBQ25DOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsT0FBTyx1REFBUTtBQUNmO0FBQ0E7O0FBRUEsTUFBTSx1REFBUTtBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNzk0MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUmVnRXhwLCBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuLyoqXG4gKiBUcnVuY2F0ZXMgZ2l2ZW4gc3RyaW5nIHRvIHRoZSBtYXhpbXVtIGNoYXJhY3RlcnMgY291bnRcbiAqXG4gKiBAcGFyYW0gc3RyIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNlcmlhbGl6YWJsZSB2YWx1ZXNcbiAqIEBwYXJhbSBtYXggTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0cnVuY2F0ZWQgc3RyaW5nICgwID0gdW5saW1pdGVkKVxuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyLCBtYXgpIHtcbiAgaWYgKG1heCA9PT0gdm9pZCAwKSB7XG4gICAgbWF4ID0gMDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBtYXggPT09IDApIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5sZW5ndGggPD0gbWF4ID8gc3RyIDogc3RyLnN1YnN0cigwLCBtYXgpICsgXCIuLi5cIjtcbn1cbi8qKlxuICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBgdHJpbV9saW5lYCBmcm9tXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS9ibG9iL21hc3Rlci9zcmMvc2VudHJ5L2xhbmcvamF2YXNjcmlwdC9wcm9jZXNzb3IucHkjTDY3XG4gKlxuICogQHBhcmFtIHN0ciBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcGFyYW0gbWF4IE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHJ1bmNhdGVkIHN0cmluZ1xuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc25pcExpbmUobGluZSwgY29sbm8pIHtcbiAgdmFyIG5ld0xpbmUgPSBsaW5lO1xuICB2YXIgbGwgPSBuZXdMaW5lLmxlbmd0aDtcblxuICBpZiAobGwgPD0gMTUwKSB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG4gIH1cblxuICBpZiAoY29sbm8gPiBsbCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGNvbG5vID0gbGw7XG4gIH1cblxuICB2YXIgc3RhcnQgPSBNYXRoLm1heChjb2xubyAtIDYwLCAwKTtcblxuICBpZiAoc3RhcnQgPCA1KSB7XG4gICAgc3RhcnQgPSAwO1xuICB9XG5cbiAgdmFyIGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgMTQwLCBsbCk7XG5cbiAgaWYgKGVuZCA+IGxsIC0gNSkge1xuICAgIGVuZCA9IGxsO1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gbGwpIHtcbiAgICBzdGFydCA9IE1hdGgubWF4KGVuZCAtIDE0MCwgMCk7XG4gIH1cblxuICBuZXdMaW5lID0gbmV3TGluZS5zbGljZShzdGFydCwgZW5kKTtcblxuICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgbmV3TGluZSA9IFwiJ3tzbmlwfSBcIiArIG5ld0xpbmU7XG4gIH1cblxuICBpZiAoZW5kIDwgbGwpIHtcbiAgICBuZXdMaW5lICs9ICcge3NuaXB9JztcbiAgfVxuXG4gIHJldHVybiBuZXdMaW5lO1xufVxuLyoqXG4gKiBKb2luIHZhbHVlcyBpbiBhcnJheVxuICogQHBhcmFtIGlucHV0IGFycmF5IG9mIHZhbHVlcyB0byBiZSBqb2luZWQgdG9nZXRoZXJcbiAqIEBwYXJhbSBkZWxpbWl0ZXIgc3RyaW5nIHRvIGJlIHBsYWNlZCBpbi1iZXR3ZWVuIHZhbHVlc1xuICogQHJldHVybnMgSm9pbmVkIHZhbHVlc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZUpvaW4oaW5wdXQsIGRlbGltaXRlcikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdmFyIG91dHB1dCA9IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZhbHVlID0gaW5wdXRbaV07XG5cbiAgICB0cnkge1xuICAgICAgb3V0cHV0LnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3V0cHV0LnB1c2goJ1t2YWx1ZSBjYW5ub3QgYmUgc2VyaWFsaXplZF0nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmpvaW4oZGVsaW1pdGVyKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIGEgcmVnZXggb3IgaW5jbHVkZXMgdGhlIHN0cmluZ1xuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdmFsdWUgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0XG4gKiBAcGFyYW0gcGF0dGVybiBFaXRoZXIgYSByZWdleCBvciBhIHN0cmluZyB0aGF0IG11c3QgYmUgY29udGFpbmVkIGluIHZhbHVlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuKSB7XG4gIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YocGF0dGVybikgIT09IC0xO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7940\n")},4712:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Ak\": function() { return /* binding */ supportsFetch; },\n/* harmony export */ \"Du\": function() { return /* binding */ isNativeFetch; },\n/* harmony export */ \"t$\": function() { return /* binding */ supportsNativeFetch; },\n/* harmony export */ \"hv\": function() { return /* binding */ supportsReferrerPolicy; },\n/* harmony export */ \"Bf\": function() { return /* binding */ supportsHistory; }\n/* harmony export */ });\n/* unused harmony exports supportsErrorEvent, supportsDOMError, supportsDOMException, supportsReportingObserver */\n/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(245);\n/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2861);\n\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent('');\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsDOMError() {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsDOMException() {\n try {\n new DOMException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsFetch() {\n if (!('fetch' in (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)())) {\n return false;\n }\n\n try {\n new Headers();\n new Request('');\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\n\nfunction isNativeFetch(func) {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\n\nfunction supportsNativeFetch() {\n if (!supportsFetch()) {\n return false;\n }\n\n var global = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)(); // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n\n if (isNativeFetch(global.fetch)) {\n return true;\n } // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n\n\n var result = false;\n var doc = global.document; // eslint-disable-next-line deprecation/deprecation\n\n if (doc && typeof doc.createElement === \"function\") {\n try {\n var sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n\n doc.head.removeChild(sandbox);\n } catch (err) {\n _logger__WEBPACK_IMPORTED_MODULE_1__/* .logger.warn */ .k.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsReportingObserver() {\n return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsReferrerPolicy() {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n if (!supportsFetch()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\n\nfunction supportsHistory() {\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var global = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)();\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n var chrome = global.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n return !isChromePackagedApp && hasHistoryApi;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9zdXBwb3J0cy5qcz82Yzg1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBa0M7QUFDTztBQUN6QztBQUNBO0FBQ0EsSUFBSSx5QkFBeUI7QUFDN0I7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHVCQUF1QjtBQUMzQjtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMkJBQTJCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvQkFBb0I7QUFDeEI7QUFDQTtBQUNBOztBQUVPO0FBQ1AsbUJBQW1CLGdFQUFlO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLDBDQUEwQyx1QkFBdUI7QUFDakU7QUFDQTtBQUNBO0FBQ0EsSUFBSSwwQkFBMEI7QUFDOUI7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLGVBQWUsZ0VBQWUsR0FBRztBQUNqQzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxNQUFNLDhEQUFXO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdDQUFnQztBQUNwQztBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksNkJBQTZCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxzQkFBc0I7QUFDMUI7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnRUFBZTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDcxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vbWlzYyc7XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBFcnJvckV2ZW50IG9iamVjdHNcbiAqIHtAbGluayBzdXBwb3J0c0Vycm9yRXZlbnR9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRXJyb3JFdmVudCgpIHtcbiAgdHJ5IHtcbiAgICBuZXcgRXJyb3JFdmVudCgnJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIERPTUVycm9yIG9iamVjdHNcbiAqIHtAbGluayBzdXBwb3J0c0RPTUVycm9yfS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUVycm9yKCkge1xuICB0cnkge1xuICAgIC8vIENocm9tZTogVk04OToxIFVuY2F1Z2h0IFR5cGVFcnJvcjogRmFpbGVkIHRvIGNvbnN0cnVjdCAnRE9NRXJyb3InOlxuICAgIC8vIDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cbiAgICAvLyBAdHMtaWdub3JlIEl0IHJlYWxseSBuZWVkcyAxIGFyZ3VtZW50LCBub3QgMC5cbiAgICBuZXcgRE9NRXJyb3IoJycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBET01FeGNlcHRpb24gb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRE9NRXhjZXB0aW9ufS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUV4Y2VwdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBuZXcgRE9NRXhjZXB0aW9uKCcnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRmV0Y2ggQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNGZXRjaH0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNGZXRjaCgpIHtcbiAgaWYgKCEoJ2ZldGNoJyBpbiBnZXRHbG9iYWxPYmplY3QoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIG5ldyBIZWFkZXJzKCk7XG4gICAgbmV3IFJlcXVlc3QoJycpO1xuICAgIG5ldyBSZXNwb25zZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIGlzTmF0aXZlRmV0Y2ggY2hlY2tzIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBmZXRjaCgpXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZUZldGNoKGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmMgJiYgL15mdW5jdGlvbiBmZXRjaFxcKFxcKVxccytcXHtcXHMrXFxbbmF0aXZlIGNvZGVcXF1cXHMrXFx9JC8udGVzdChmdW5jLnRvU3RyaW5nKCkpO1xufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRmV0Y2ggQVBJIG5hdGl2ZWx5XG4gKiB7QGxpbmsgc3VwcG9ydHNOYXRpdmVGZXRjaH0uXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBgd2luZG93LmZldGNoYCBpcyBuYXRpdmVseSBpbXBsZW1lbnRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlRmV0Y2goKSB7XG4gIGlmICghc3VwcG9ydHNGZXRjaCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpOyAvLyBGYXN0IHBhdGggdG8gYXZvaWQgRE9NIEkvT1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG5cbiAgaWYgKGlzTmF0aXZlRmV0Y2goZ2xvYmFsLmZldGNoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHdpbmRvdy5mZXRjaCBpcyBpbXBsZW1lbnRlZCwgYnV0IGlzIHBvbHlmaWxsZWQgb3IgYWxyZWFkeSB3cmFwcGVkIChlLmc6IGJ5IGEgY2hyb21lIGV4dGVuc2lvbilcbiAgLy8gc28gY3JlYXRlIGEgXCJwdXJlXCIgaWZyYW1lIHRvIHNlZSBpZiB0aGF0IGhhcyBuYXRpdmUgZmV0Y2hcblxuXG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgaWYgKGRvYyAmJiB0eXBlb2YgZG9jLmNyZWF0ZUVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgc2FuZGJveCA9IGRvYy5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgIHNhbmRib3guaGlkZGVuID0gdHJ1ZTtcbiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNhbmRib3gpO1xuXG4gICAgICBpZiAoc2FuZGJveC5jb250ZW50V2luZG93ICYmIHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgICAgIHJlc3VsdCA9IGlzTmF0aXZlRmV0Y2goc2FuZGJveC5jb250ZW50V2luZG93LmZldGNoKTtcbiAgICAgIH1cblxuICAgICAgZG9jLmhlYWQucmVtb3ZlQ2hpbGQoc2FuZGJveCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGNyZWF0ZSBzYW5kYm94IGlmcmFtZSBmb3IgcHVyZSBmZXRjaCBjaGVjaywgYmFpbGluZyB0byB3aW5kb3cuZmV0Y2g6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIFJlcG9ydGluZ09ic2VydmVyIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXJ9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXIoKSB7XG4gIHJldHVybiAnUmVwb3J0aW5nT2JzZXJ2ZXInIGluIGdldEdsb2JhbE9iamVjdCgpO1xufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgUmVmZXJyZXIgUG9saWN5IEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3l9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3koKSB7XG4gIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAvLyBodHRwczovL2Nhbml1c2UuY29tLyNmZWF0PXJlZmVycmVyLXBvbGljeVxuICAvLyBJdCBkb2Vzbid0LiBBbmQgaXQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQgb2YgaWdub3JpbmcgdGhpcyBwYXJhbWV0ZXIuLi5cbiAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG4gIGlmICghc3VwcG9ydHNGZXRjaCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBuZXcgUmVxdWVzdCgnXycsIHtcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnb3JpZ2luJ1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBIaXN0b3J5IEFQSVxuICoge0BsaW5rIHN1cHBvcnRzSGlzdG9yeX0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNIaXN0b3J5KCkge1xuICAvLyBOT1RFOiBpbiBDaHJvbWUgQXBwIGVudmlyb25tZW50LCB0b3VjaGluZyBoaXN0b3J5LnB1c2hTdGF0ZSwgKmV2ZW4gaW5zaWRlXG4gIC8vICAgICAgIGEgdHJ5L2NhdGNoIGJsb2NrKiwgd2lsbCBjYXVzZSBDaHJvbWUgdG8gb3V0cHV0IGFuIGVycm9yIHRvIGNvbnNvbGUuZXJyb3JcbiAgLy8gYm9ycm93ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzEzOTQ1L2ZpbGVzXG4gIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgdmFyIGNocm9tZSA9IGdsb2JhbC5jaHJvbWU7XG4gIHZhciBpc0Nocm9tZVBhY2thZ2VkQXBwID0gY2hyb21lICYmIGNocm9tZS5hcHAgJiYgY2hyb21lLmFwcC5ydW50aW1lO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG4gIHZhciBoYXNIaXN0b3J5QXBpID0gJ2hpc3RvcnknIGluIGdsb2JhbCAmJiAhIWdsb2JhbC5oaXN0b3J5LnB1c2hTdGF0ZSAmJiAhIWdsb2JhbC5oaXN0b3J5LnJlcGxhY2VTdGF0ZTtcbiAgcmV0dXJuICFpc0Nocm9tZVBhY2thZ2VkQXBwICYmIGhhc0hpc3RvcnlBcGk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4712\n")},5370:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "c": function() { return /* binding */ SyncPromise; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7727);\n/* harmony import */ var core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2684);\n\n\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\n/* eslint-disable @typescript-eslint/typedef */\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** SyncPromise internal states */\n\nvar States;\n\n(function (States) {\n /** Pending */\n States["PENDING"] = "PENDING";\n /** Resolved / OK */\n\n States["RESOLVED"] = "RESOLVED";\n /** Rejected / Error */\n\n States["REJECTED"] = "REJECTED";\n})(States || (States = {}));\n/**\n * Thenable class that behaves like a Promise and follows it\'s interface\n * but is not async internally\n */\n\n\nvar SyncPromise =\n/** @class */\nfunction () {\n function SyncPromise(executor) {\n var _this = this;\n\n this._state = States.PENDING;\n this._handlers = [];\n /** JSDoc */\n\n this._resolve = function (value) {\n _this._setResult(States.RESOLVED, value);\n };\n /** JSDoc */\n\n\n this._reject = function (reason) {\n _this._setResult(States.REJECTED, reason);\n };\n /** JSDoc */\n\n\n this._setResult = function (state, value) {\n if (_this._state !== States.PENDING) {\n return;\n }\n\n if ((0,_is__WEBPACK_IMPORTED_MODULE_1__/* .isThenable */ .J8)(value)) {\n void value.then(_this._resolve, _this._reject);\n return;\n }\n\n _this._state = state;\n _this._value = value;\n\n _this._executeHandlers();\n }; // TODO: FIXME\n\n /** JSDoc */\n\n\n this._attachHandler = function (handler) {\n _this._handlers = _this._handlers.concat(handler);\n\n _this._executeHandlers();\n };\n /** JSDoc */\n\n\n this._executeHandlers = function () {\n if (_this._state === States.PENDING) {\n return;\n }\n\n var cachedHandlers = _this._handlers.slice();\n\n _this._handlers = [];\n cachedHandlers.forEach(function (handler) {\n if (handler.done) {\n return;\n }\n\n if (_this._state === States.RESOLVED) {\n if (handler.onfulfilled) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handler.onfulfilled(_this._value);\n }\n }\n\n if (_this._state === States.REJECTED) {\n if (handler.onrejected) {\n handler.onrejected(_this._value);\n }\n }\n\n handler.done = true;\n });\n };\n\n try {\n executor(this._resolve, this._reject);\n } catch (e) {\n this._reject(e);\n }\n }\n /** JSDoc */\n\n\n SyncPromise.resolve = function (value) {\n return new SyncPromise(function (resolve) {\n resolve(value);\n });\n };\n /** JSDoc */\n\n\n SyncPromise.reject = function (reason) {\n return new SyncPromise(function (_, reject) {\n reject(reason);\n });\n };\n /** JSDoc */\n\n\n SyncPromise.all = function (collection) {\n return new SyncPromise(function (resolve, reject) {\n if (!Array.isArray(collection)) {\n reject(new TypeError("Promise.all requires an array as input."));\n return;\n }\n\n if (collection.length === 0) {\n resolve([]);\n return;\n }\n\n var counter = collection.length;\n var resolvedCollection = [];\n collection.forEach(function (item, index) {\n void SyncPromise.resolve(item).then(function (value) {\n resolvedCollection[index] = value;\n counter -= 1;\n\n if (counter !== 0) {\n return;\n }\n\n resolve(resolvedCollection);\n }).then(null, reject);\n });\n });\n };\n /** JSDoc */\n\n\n SyncPromise.prototype.then = function (_onfulfilled, _onrejected) {\n var _this = this;\n\n return new SyncPromise(function (resolve, reject) {\n _this._attachHandler({\n done: false,\n onfulfilled: function onfulfilled(result) {\n if (!_onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result);\n return;\n }\n\n try {\n resolve(_onfulfilled(result));\n return;\n } catch (e) {\n reject(e);\n return;\n }\n },\n onrejected: function onrejected(reason) {\n if (!_onrejected) {\n reject(reason);\n return;\n }\n\n try {\n resolve(_onrejected(reason));\n return;\n } catch (e) {\n reject(e);\n return;\n }\n }\n });\n });\n };\n /** JSDoc */\n\n\n SyncPromise.prototype.catch = function (onrejected) {\n return this.then(function (val) {\n return val;\n }, onrejected);\n };\n /** JSDoc */\n\n\n SyncPromise.prototype.finally = function (onfinally) {\n var _this = this;\n\n return new SyncPromise(function (resolve, reject) {\n var val;\n var isRejected;\n return _this.then(function (value) {\n isRejected = false;\n val = value;\n\n if (onfinally) {\n onfinally();\n }\n }, function (reason) {\n isRejected = true;\n val = reason;\n\n if (onfinally) {\n onfinally();\n }\n }).then(function () {\n if (isRejected) {\n reject(val);\n return;\n }\n\n resolve(val);\n });\n });\n };\n /** JSDoc */\n\n\n SyncPromise.prototype.toString = function () {\n return \'[object SyncPromise]\';\n };\n\n return SyncPromise;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9zeW5jcHJvbWlzZS5qcz8yMTI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUErQzs7QUFFL0M7O0FBRUE7O0FBRUE7O0FBRUE7QUFDa0M7QUFDbEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUMsd0JBQXdCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVUseURBQVU7QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDIiwiZmlsZSI6IjUzNzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJjb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGlzVGhlbmFibGUgfSBmcm9tICcuL2lzJztcbi8qKiBTeW5jUHJvbWlzZSBpbnRlcm5hbCBzdGF0ZXMgKi9cblxudmFyIFN0YXRlcztcblxuKGZ1bmN0aW9uIChTdGF0ZXMpIHtcbiAgLyoqIFBlbmRpbmcgKi9cbiAgU3RhdGVzW1wiUEVORElOR1wiXSA9IFwiUEVORElOR1wiO1xuICAvKiogUmVzb2x2ZWQgLyBPSyAqL1xuXG4gIFN0YXRlc1tcIlJFU09MVkVEXCJdID0gXCJSRVNPTFZFRFwiO1xuICAvKiogUmVqZWN0ZWQgLyBFcnJvciAqL1xuXG4gIFN0YXRlc1tcIlJFSkVDVEVEXCJdID0gXCJSRUpFQ1RFRFwiO1xufSkoU3RhdGVzIHx8IChTdGF0ZXMgPSB7fSkpO1xuLyoqXG4gKiBUaGVuYWJsZSBjbGFzcyB0aGF0IGJlaGF2ZXMgbGlrZSBhIFByb21pc2UgYW5kIGZvbGxvd3MgaXQncyBpbnRlcmZhY2VcbiAqIGJ1dCBpcyBub3QgYXN5bmMgaW50ZXJuYWxseVxuICovXG5cblxudmFyIFN5bmNQcm9taXNlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3luY1Byb21pc2UoZXhlY3V0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5fc3RhdGUgPSBTdGF0ZXMuUEVORElORztcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgIC8qKiBKU0RvYyAqL1xuXG4gICAgdGhpcy5fcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgX3RoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVTT0xWRUQsIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuXG5cbiAgICB0aGlzLl9yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBfdGhpcy5fc2V0UmVzdWx0KFN0YXRlcy5SRUpFQ1RFRCwgcmVhc29uKTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuXG5cbiAgICB0aGlzLl9zZXRSZXN1bHQgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlKSB7XG4gICAgICBpZiAoX3RoaXMuX3N0YXRlICE9PSBTdGF0ZXMuUEVORElORykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICB2b2lkIHZhbHVlLnRoZW4oX3RoaXMuX3Jlc29sdmUsIF90aGlzLl9yZWplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgX3RoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICAgIF90aGlzLl9leGVjdXRlSGFuZGxlcnMoKTtcbiAgICB9OyAvLyBUT0RPOiBGSVhNRVxuXG4gICAgLyoqIEpTRG9jICovXG5cblxuICAgIHRoaXMuX2F0dGFjaEhhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgX3RoaXMuX2hhbmRsZXJzID0gX3RoaXMuX2hhbmRsZXJzLmNvbmNhdChoYW5kbGVyKTtcblxuICAgICAgX3RoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG5cblxuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5fc3RhdGUgPT09IFN0YXRlcy5QRU5ESU5HKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhY2hlZEhhbmRsZXJzID0gX3RoaXMuX2hhbmRsZXJzLnNsaWNlKCk7XG5cbiAgICAgIF90aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgY2FjaGVkSGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICBpZiAoaGFuZGxlci5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlJFU09MVkVEKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIub25mdWxmaWxsZWQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIGhhbmRsZXIub25mdWxmaWxsZWQoX3RoaXMuX3ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVKRUNURUQpIHtcbiAgICAgICAgICBpZiAoaGFuZGxlci5vbnJlamVjdGVkKSB7XG4gICAgICAgICAgICBoYW5kbGVyLm9ucmVqZWN0ZWQoX3RoaXMuX3ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVyLmRvbmUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcih0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlamVjdChlKTtcbiAgICB9XG4gIH1cbiAgLyoqIEpTRG9jICovXG5cblxuICBTeW5jUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU3luY1Byb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKF8sIHJlamVjdCkge1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU3luY1Byb21pc2UuYWxsID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcihcIlByb21pc2UuYWxsIHJlcXVpcmVzIGFuIGFycmF5IGFzIGlucHV0LlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjb3VudGVyID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICB2YXIgcmVzb2x2ZWRDb2xsZWN0aW9uID0gW107XG4gICAgICBjb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIHZvaWQgU3luY1Byb21pc2UucmVzb2x2ZShpdGVtKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJlc29sdmVkQ29sbGVjdGlvbltpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICBjb3VudGVyIC09IDE7XG5cbiAgICAgICAgICBpZiAoY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRDb2xsZWN0aW9uKTtcbiAgICAgICAgfSkudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU3luY1Byb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAoX29uZnVsZmlsbGVkLCBfb25yZWplY3RlZCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl9hdHRhY2hIYW5kbGVyKHtcbiAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgIG9uZnVsZmlsbGVkOiBmdW5jdGlvbiBvbmZ1bGZpbGxlZChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoIV9vbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogwq9cXF8o44OEKV8vwq9cbiAgICAgICAgICAgIC8vIFRPRE86IEZJWE1FXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmUoX29uZnVsZmlsbGVkKHJlc3VsdCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ucmVqZWN0ZWQ6IGZ1bmN0aW9uIG9ucmVqZWN0ZWQocmVhc29uKSB7XG4gICAgICAgICAgaWYgKCFfb25yZWplY3RlZCkge1xuICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmUoX29ucmVqZWN0ZWQocmVhc29uKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU3luY1Byb21pc2UucHJvdG90eXBlLmNhdGNoID0gZnVuY3Rpb24gKG9ucmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSwgb25yZWplY3RlZCk7XG4gIH07XG4gIC8qKiBKU0RvYyAqL1xuXG5cbiAgU3luY1Byb21pc2UucHJvdG90eXBlLmZpbmFsbHkgPSBmdW5jdGlvbiAob25maW5hbGx5KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHZhbDtcbiAgICAgIHZhciBpc1JlamVjdGVkO1xuICAgICAgcmV0dXJuIF90aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlzUmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgIG9uZmluYWxseSgpO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGlzUmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICB2YWwgPSByZWFzb247XG5cbiAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgIG9uZmluYWxseSgpO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzUmVqZWN0ZWQpIHtcbiAgICAgICAgICByZWplY3QodmFsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqIEpTRG9jICovXG5cblxuICBTeW5jUHJvbWlzZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0IFN5bmNQcm9taXNlXSc7XG4gIH07XG5cbiAgcmV0dXJuIFN5bmNQcm9taXNlO1xufSgpO1xuXG5leHBvcnQgeyBTeW5jUHJvbWlzZSB9OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5370\n')},5153:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"yW\": function() { return /* binding */ dateTimestampInSeconds; },\n/* harmony export */ \"ph\": function() { return /* binding */ timestampInSeconds; },\n/* harmony export */ \"_I\": function() { return /* binding */ timestampWithMs; },\n/* harmony export */ \"Z1\": function() { return /* binding */ browserPerformanceTimeOrigin; }\n/* harmony export */ });\n/* unused harmony exports usingPerformanceAPI, _browserPerformanceTimeOriginMode */\n/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2861);\n/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7864);\n/* module decorator */ module = __webpack_require__.hmd(module);\n\n\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\n\nvar dateTimestampSource = {\n nowSeconds: function nowSeconds() {\n return Date.now() / 1000;\n }\n};\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\n\nfunction getBrowserPerformance() {\n var performance = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)().performance;\n\n if (!performance || !performance.now) {\n return undefined;\n } // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n //\n // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n // performance.now() gives a date arbitrarily in the past.\n //\n // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n // undefined.\n //\n // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n // interact with data coming out of performance entries.\n //\n // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n // observed skews that can be as long as days, weeks or months.\n //\n // See https://github.com/getsentry/sentry-javascript/issues/2590.\n //\n // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n // transactions of long-lived web pages.\n\n\n var timeOrigin = Date.now() - performance.now();\n return {\n now: function now() {\n return performance.now();\n },\n timeOrigin: timeOrigin\n };\n}\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\n\n\nfunction getNodePerformance() {\n try {\n var perfHooks = (0,_node__WEBPACK_IMPORTED_MODULE_1__/* .dynamicRequire */ .l$)(module, 'perf_hooks');\n return perfHooks.performance;\n } catch (_) {\n return undefined;\n }\n}\n/**\n * The Performance API implementation for the current platform, if available.\n */\n\n\nvar platformPerformance = (0,_node__WEBPACK_IMPORTED_MODULE_1__/* .isNodeEnv */ .KV)() ? getNodePerformance() : getBrowserPerformance();\nvar timestampSource = platformPerformance === undefined ? dateTimestampSource : {\n nowSeconds: function nowSeconds() {\n return (platformPerformance.timeOrigin + platformPerformance.now()) / 1000;\n }\n};\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\n\nvar dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\n\nvar timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource); // Re-exported with an old name for backwards-compatibility.\n\nvar timestampWithMs = timestampInSeconds;\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\n\nvar usingPerformanceAPI = platformPerformance !== undefined;\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\n\nvar _browserPerformanceTimeOriginMode;\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\n\nvar browserPerformanceTimeOrigin = function () {\n // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n // data as reliable if they are within a reasonable threshold of the current time.\n var performance = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)().performance;\n\n if (!performance || !performance.now) {\n _browserPerformanceTimeOriginMode = 'none';\n return undefined;\n }\n\n var threshold = 3600 * 1000;\n var performanceNow = performance.now();\n var dateNow = Date.now(); // if timeOrigin isn't available set delta to threshold so it isn't used\n\n var timeOriginDelta = performance.timeOrigin ? Math.abs(performance.timeOrigin + performanceNow - dateNow) : threshold;\n var timeOriginIsReliable = timeOriginDelta < threshold; // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n\n var navigationStart = performance.timing && performance.timing.navigationStart;\n var hasNavigationStart = typeof navigationStart === 'number'; // if navigationStart isn't available set delta to threshold so it isn't used\n\n var navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n var navigationStartIsReliable = navigationStartDelta < threshold;\n\n if (timeOriginIsReliable || navigationStartIsReliable) {\n // Use the more reliable time origin\n if (timeOriginDelta <= navigationStartDelta) {\n _browserPerformanceTimeOriginMode = 'timeOrigin';\n return performance.timeOrigin;\n } else {\n _browserPerformanceTimeOriginMode = 'navigationStart';\n return navigationStart;\n }\n } // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n\n\n _browserPerformanceTimeOriginMode = 'dateNow';\n return dateNow;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS90aW1lLmpzPzNlOTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUF5QztBQUNVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsZ0VBQWU7O0FBRW5DO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxvQkFBb0IsK0RBQWM7QUFDbEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSwwQkFBMEIsMERBQVM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sMEVBQTBFOztBQUUxRTtBQUNQO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdFQUFlOztBQUVuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiNTE1My5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyBkeW5hbWljUmVxdWlyZSwgaXNOb2RlRW52IH0gZnJvbSAnLi9ub2RlJztcbi8qKlxuICogQSBUaW1lc3RhbXBTb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBQZXJmb3JtYW5jZSBXZWIgQVBJIG5hdGl2ZWx5LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIFRpbWVzdGFtcFNvdXJjZSBkb2VzIG5vdCB1c2UgYSBtb25vdG9uaWMgY2xvY2suIEEgY2FsbCB0byBgbm93U2Vjb25kc2AgbWF5IHJldHVybiBhIHRpbWVzdGFtcCBlYXJsaWVyXG4gKiB0aGFuIGEgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZS4gV2UgZG8gbm90IHRyeSB0byBlbXVsYXRlIGEgbW9ub3RvbmljIGJlaGF2aW9yIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nLiBJdFxuICogaXMgbW9yZSBvYnZpb3VzIHRvIGV4cGxhaW4gXCJ3aHkgZG9lcyBteSBzcGFuIGhhdmUgbmVnYXRpdmUgZHVyYXRpb25cIiB0aGFuIFwid2h5IG15IHNwYW5zIGhhdmUgemVybyBkdXJhdGlvblwiLlxuICovXG5cbnZhciBkYXRlVGltZXN0YW1wU291cmNlID0ge1xuICBub3dTZWNvbmRzOiBmdW5jdGlvbiBub3dTZWNvbmRzKCkge1xuICAgIHJldHVybiBEYXRlLm5vdygpIC8gMTAwMDtcbiAgfVxufTtcbi8qKlxuICogUmV0dXJucyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgUGVyZm9ybWFuY2UgQVBJIGJyb3dzZXIgaW1wbGVtZW50YXRpb24sIG9yIHVuZGVmaW5lZCBmb3IgYnJvd3NlcnMgdGhhdCBkbyBub3RcbiAqIHN1cHBvcnQgdGhlIEFQSS5cbiAqXG4gKiBXcmFwcGluZyB0aGUgbmF0aXZlIEFQSSB3b3JrcyBhcm91bmQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgZnJvbSBkaWZmZXJlbnQgYnJvd3NlcnMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0QnJvd3NlclBlcmZvcm1hbmNlKCkge1xuICB2YXIgcGVyZm9ybWFuY2UgPSBnZXRHbG9iYWxPYmplY3QoKS5wZXJmb3JtYW5jZTtcblxuICBpZiAoIXBlcmZvcm1hbmNlIHx8ICFwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IC8vIFJlcGxhY2UgcGVyZm9ybWFuY2UudGltZU9yaWdpbiB3aXRoIG91ciBvd24gdGltZU9yaWdpbiBiYXNlZCBvbiBEYXRlLm5vdygpLlxuICAvL1xuICAvLyBUaGlzIGlzIGEgcGFydGlhbCB3b3JrYXJvdW5kIGZvciBicm93c2VycyByZXBvcnRpbmcgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBzdWNoIHRoYXQgcGVyZm9ybWFuY2UudGltZU9yaWdpbiArXG4gIC8vIHBlcmZvcm1hbmNlLm5vdygpIGdpdmVzIGEgZGF0ZSBhcmJpdHJhcmlseSBpbiB0aGUgcGFzdC5cbiAgLy9cbiAgLy8gQWRkaXRpb25hbGx5LCBjb21wdXRpbmcgdGltZU9yaWdpbiBpbiB0aGlzIHdheSBmaWxscyB0aGUgZ2FwIGZvciBicm93c2VycyB3aGVyZSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIGlzXG4gIC8vIHVuZGVmaW5lZC5cbiAgLy9cbiAgLy8gVGhlIGFzc3VtcHRpb24gdGhhdCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkgfj0gRGF0ZS5ub3coKSBpcyBmbGF3ZWQsIGJ1dCB3ZSBkZXBlbmQgb24gaXQgdG9cbiAgLy8gaW50ZXJhY3Qgd2l0aCBkYXRhIGNvbWluZyBvdXQgb2YgcGVyZm9ybWFuY2UgZW50cmllcy5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgcmVjb21tZW5kYXRpb25zIGFnYWluc3QgaXQgaW4gdGhlIHNwZWMsIGJyb3dzZXJzIGltcGxlbWVudCB0aGUgUGVyZm9ybWFuY2UgQVBJIHdpdGggYSBjbG9jayB0aGF0XG4gIC8vIG1pZ2h0IHN0b3Agd2hlbiB0aGUgY29tcHV0ZXIgaXMgYXNsZWVwIChhbmQgcGVyaGFwcyB1bmRlciBvdGhlciBjaXJjdW1zdGFuY2VzKS4gU3VjaCBiZWhhdmlvciBjYXVzZXNcbiAgLy8gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpIHRvIGhhdmUgYW4gYXJiaXRyYXJ5IHNrZXcgb3ZlciBEYXRlLm5vdygpLiBJbiBsYXB0b3AgY29tcHV0ZXJzLCB3ZSBoYXZlXG4gIC8vIG9ic2VydmVkIHNrZXdzIHRoYXQgY2FuIGJlIGFzIGxvbmcgYXMgZGF5cywgd2Vla3Mgb3IgbW9udGhzLlxuICAvL1xuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjU5MC5cbiAgLy9cbiAgLy8gQlVHOiBkZXNwaXRlIG91ciBiZXN0IGludGVudGlvbnMsIHRoaXMgd29ya2Fyb3VuZCBoYXMgaXRzIGxpbWl0YXRpb25zLiBJdCBtb3N0bHkgYWRkcmVzc2VzIHRpbWluZ3Mgb2YgcGFnZWxvYWRcbiAgLy8gdHJhbnNhY3Rpb25zLCBidXQgaWdub3JlcyB0aGUgc2tldyBidWlsdCB1cCBvdmVyIHRpbWUgdGhhdCBjYW4gYXZlcnNlbHkgYWZmZWN0IHRpbWVzdGFtcHMgb2YgbmF2aWdhdGlvblxuICAvLyB0cmFuc2FjdGlvbnMgb2YgbG9uZy1saXZlZCB3ZWIgcGFnZXMuXG5cblxuICB2YXIgdGltZU9yaWdpbiA9IERhdGUubm93KCkgLSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBub3c6IGZ1bmN0aW9uIG5vdygpIHtcbiAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9LFxuICAgIHRpbWVPcmlnaW46IHRpbWVPcmlnaW5cbiAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbmF0aXZlIFBlcmZvcm1hbmNlIEFQSSBpbXBsZW1lbnRhdGlvbiBmcm9tIE5vZGUuanMuIFJldHVybnMgdW5kZWZpbmVkIGluIG9sZCBOb2RlLmpzIHZlcnNpb25zIHRoYXQgZG9uJ3RcbiAqIGltcGxlbWVudCB0aGUgQVBJLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZVBlcmZvcm1hbmNlKCkge1xuICB0cnkge1xuICAgIHZhciBwZXJmSG9va3MgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICdwZXJmX2hvb2tzJyk7XG4gICAgcmV0dXJuIHBlcmZIb29rcy5wZXJmb3JtYW5jZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbi8qKlxuICogVGhlIFBlcmZvcm1hbmNlIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIGlmIGF2YWlsYWJsZS5cbiAqL1xuXG5cbnZhciBwbGF0Zm9ybVBlcmZvcm1hbmNlID0gaXNOb2RlRW52KCkgPyBnZXROb2RlUGVyZm9ybWFuY2UoKSA6IGdldEJyb3dzZXJQZXJmb3JtYW5jZSgpO1xudmFyIHRpbWVzdGFtcFNvdXJjZSA9IHBsYXRmb3JtUGVyZm9ybWFuY2UgPT09IHVuZGVmaW5lZCA/IGRhdGVUaW1lc3RhbXBTb3VyY2UgOiB7XG4gIG5vd1NlY29uZHM6IGZ1bmN0aW9uIG5vd1NlY29uZHMoKSB7XG4gICAgcmV0dXJuIChwbGF0Zm9ybVBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwbGF0Zm9ybVBlcmZvcm1hbmNlLm5vdygpKSAvIDEwMDA7XG4gIH1cbn07XG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB1c2luZyB0aGUgRGF0ZSBBUEkuXG4gKi9cblxuZXhwb3J0IHZhciBkYXRlVGltZXN0YW1wSW5TZWNvbmRzID0gZGF0ZVRpbWVzdGFtcFNvdXJjZS5ub3dTZWNvbmRzLmJpbmQoZGF0ZVRpbWVzdGFtcFNvdXJjZSk7XG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB1c2luZyBlaXRoZXIgdGhlIFBlcmZvcm1hbmNlIG9yIERhdGUgQVBJcywgZGVwZW5kaW5nIG9uIHRoZVxuICogYXZhaWxhYmlsaXR5IG9mIHRoZSBQZXJmb3JtYW5jZSBBUEkuXG4gKlxuICogU2VlIGB1c2luZ1BlcmZvcm1hbmNlQVBJYCB0byB0ZXN0IHdoZXRoZXIgdGhlIFBlcmZvcm1hbmNlIEFQSSBpcyB1c2VkLlxuICpcbiAqIEJVRzogTm90ZSB0aGF0IGJlY2F1c2Ugb2YgaG93IGJyb3dzZXJzIGltcGxlbWVudCB0aGUgUGVyZm9ybWFuY2UgQVBJLCB0aGUgY2xvY2sgbWlnaHQgc3RvcCB3aGVuIHRoZSBjb21wdXRlciBpc1xuICogYXNsZWVwLiBUaGlzIGNyZWF0ZXMgYSBza2V3IGJldHdlZW4gYGRhdGVUaW1lc3RhbXBJblNlY29uZHNgIGFuZCBgdGltZXN0YW1wSW5TZWNvbmRzYC4gVGhlXG4gKiBza2V3IGNhbiBncm93IHRvIGFyYml0cmFyeSBhbW91bnRzIGxpa2UgZGF5cywgd2Vla3Mgb3IgbW9udGhzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI1OTAuXG4gKi9cblxuZXhwb3J0IHZhciB0aW1lc3RhbXBJblNlY29uZHMgPSB0aW1lc3RhbXBTb3VyY2Uubm93U2Vjb25kcy5iaW5kKHRpbWVzdGFtcFNvdXJjZSk7IC8vIFJlLWV4cG9ydGVkIHdpdGggYW4gb2xkIG5hbWUgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LlxuXG5leHBvcnQgdmFyIHRpbWVzdGFtcFdpdGhNcyA9IHRpbWVzdGFtcEluU2Vjb25kcztcbi8qKlxuICogQSBib29sZWFuIHRoYXQgaXMgdHJ1ZSB3aGVuIHRpbWVzdGFtcEluU2Vjb25kcyB1c2VzIHRoZSBQZXJmb3JtYW5jZSBBUEkgdG8gcHJvZHVjZSBtb25vdG9uaWMgdGltZXN0YW1wcy5cbiAqL1xuXG5leHBvcnQgdmFyIHVzaW5nUGVyZm9ybWFuY2VBUEkgPSBwbGF0Zm9ybVBlcmZvcm1hbmNlICE9PSB1bmRlZmluZWQ7XG4vKipcbiAqIEludGVybmFsIGhlbHBlciB0byBzdG9yZSB3aGF0IGlzIHRoZSBzb3VyY2Ugb2YgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiBiZWxvdy4gRm9yIGRlYnVnZ2luZyBvbmx5LlxuICovXG5cbmV4cG9ydCB2YXIgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlO1xuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHVzYWJsZSBpbiBhIGJyb3dzZXIsIGFuZCBvbmx5IHdoZW4gdGhlXG4gKiBwZXJmb3JtYW5jZSBBUEkgaXMgYXZhaWxhYmxlLlxuICovXG5cbmV4cG9ydCB2YXIgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVW5mb3J0dW5hdGVseSBicm93c2VycyBtYXkgcmVwb3J0IGFuIGluYWNjdXJhdGUgdGltZSBvcmlnaW4gZGF0YSwgdGhyb3VnaCBlaXRoZXIgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBvclxuICAvLyBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0LCB3aGljaCByZXN1bHRzIGluIHBvb3IgcmVzdWx0cyBpbiBwZXJmb3JtYW5jZSBkYXRhLiBXZSBvbmx5IHRyZWF0IHRpbWUgb3JpZ2luXG4gIC8vIGRhdGEgYXMgcmVsaWFibGUgaWYgdGhleSBhcmUgd2l0aGluIGEgcmVhc29uYWJsZSB0aHJlc2hvbGQgb2YgdGhlIGN1cnJlbnQgdGltZS5cbiAgdmFyIHBlcmZvcm1hbmNlID0gZ2V0R2xvYmFsT2JqZWN0KCkucGVyZm9ybWFuY2U7XG5cbiAgaWYgKCFwZXJmb3JtYW5jZSB8fCAhcGVyZm9ybWFuY2Uubm93KSB7XG4gICAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ25vbmUnO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgdGhyZXNob2xkID0gMzYwMCAqIDEwMDA7XG4gIHZhciBwZXJmb3JtYW5jZU5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICB2YXIgZGF0ZU5vdyA9IERhdGUubm93KCk7IC8vIGlmIHRpbWVPcmlnaW4gaXNuJ3QgYXZhaWxhYmxlIHNldCBkZWx0YSB0byB0aHJlc2hvbGQgc28gaXQgaXNuJ3QgdXNlZFxuXG4gIHZhciB0aW1lT3JpZ2luRGVsdGEgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luID8gTWF0aC5hYnMocGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlTm93IC0gZGF0ZU5vdykgOiB0aHJlc2hvbGQ7XG4gIHZhciB0aW1lT3JpZ2luSXNSZWxpYWJsZSA9IHRpbWVPcmlnaW5EZWx0YSA8IHRocmVzaG9sZDsgLy8gV2hpbGUgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4sIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW5cbiAgLy8gaXMgbm90IGFzIHdpZGVseSBzdXBwb3J0ZWQuIE5hbWVseSwgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBpcyB1bmRlZmluZWQgaW4gU2FmYXJpIGFzIG9mIHdyaXRpbmcuXG4gIC8vIEFsc28gYXMgb2Ygd3JpdGluZywgcGVyZm9ybWFuY2UudGltaW5nIGlzIG5vdCBhdmFpbGFibGUgaW4gV2ViIFdvcmtlcnMgaW4gbWFpbnN0cmVhbSBicm93c2Vycywgc28gaXQgaXMgbm90IGFsd2F5c1xuICAvLyBhIHZhbGlkIGZhbGxiYWNrLiBJbiB0aGUgYWJzZW5jZSBvZiBhbiBpbml0aWFsIHRpbWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIsIGZhbGxiYWNrIHRvIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGVcbiAgLy8gRGF0ZSBBUEkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIHZhciBuYXZpZ2F0aW9uU3RhcnQgPSBwZXJmb3JtYW5jZS50aW1pbmcgJiYgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydDtcbiAgdmFyIGhhc05hdmlnYXRpb25TdGFydCA9IHR5cGVvZiBuYXZpZ2F0aW9uU3RhcnQgPT09ICdudW1iZXInOyAvLyBpZiBuYXZpZ2F0aW9uU3RhcnQgaXNuJ3QgYXZhaWxhYmxlIHNldCBkZWx0YSB0byB0aHJlc2hvbGQgc28gaXQgaXNuJ3QgdXNlZFxuXG4gIHZhciBuYXZpZ2F0aW9uU3RhcnREZWx0YSA9IGhhc05hdmlnYXRpb25TdGFydCA/IE1hdGguYWJzKG5hdmlnYXRpb25TdGFydCArIHBlcmZvcm1hbmNlTm93IC0gZGF0ZU5vdykgOiB0aHJlc2hvbGQ7XG4gIHZhciBuYXZpZ2F0aW9uU3RhcnRJc1JlbGlhYmxlID0gbmF2aWdhdGlvblN0YXJ0RGVsdGEgPCB0aHJlc2hvbGQ7XG5cbiAgaWYgKHRpbWVPcmlnaW5Jc1JlbGlhYmxlIHx8IG5hdmlnYXRpb25TdGFydElzUmVsaWFibGUpIHtcbiAgICAvLyBVc2UgdGhlIG1vcmUgcmVsaWFibGUgdGltZSBvcmlnaW5cbiAgICBpZiAodGltZU9yaWdpbkRlbHRhIDw9IG5hdmlnYXRpb25TdGFydERlbHRhKSB7XG4gICAgICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAndGltZU9yaWdpbic7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2UudGltZU9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ25hdmlnYXRpb25TdGFydCc7XG4gICAgICByZXR1cm4gbmF2aWdhdGlvblN0YXJ0O1xuICAgIH1cbiAgfSAvLyBFaXRoZXIgYm90aCB0aW1lT3JpZ2luIGFuZCBuYXZpZ2F0aW9uU3RhcnQgYXJlIHNrZXdlZCBvciBuZWl0aGVyIGlzIGF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gRGF0ZS5cblxuXG4gIF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZSA9ICdkYXRlTm93JztcbiAgcmV0dXJuIGRhdGVOb3c7XG59KCk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5153\n")},4850:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "ZT": function() { return /* binding */ __extends; },\n/* harmony export */ "pi": function() { return /* binding */ _assign; },\n/* harmony export */ "XA": function() { return /* binding */ __values; },\n/* harmony export */ "CR": function() { return /* binding */ __read; }\n/* harmony export */ });\n/* unused harmony exports __rest, __decorate, __param, __metadata, __awaiter, __generator, __createBinding, __exportStar, __spread, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault, __classPrivateFieldGet, __classPrivateFieldSet */\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return _assign.apply(this, arguments);\n};\n\n\nfunction __rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nfunction __createBinding(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}\nfunction __exportStar(m, exports) {\n for (var p in m) {\n if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n }\n}\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\n;\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n }\n result.default = mod;\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to get private field on non-instance");\n }\n\n return privateMap.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError("attempted to set private field on non-instance");\n }\n\n privateMap.set(receiver, value);\n return value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/Y2ZhYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsT0FBTztBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRStCO0FBQ3hCO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJIQUEySCxjQUFjO0FBQ3pJO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxpSUFBaUksd0NBQXdDLFFBQVE7QUFDakw7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ087QUFDUCwwQkFBMEIsc0JBQXNCO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1AsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTs7QUFFQSxzQ0FBc0MsUUFBUTtBQUM5QyxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWU7QUFDZjtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EseUdBQXlHO0FBQ3pHO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiI0ODUwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cblxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cbnZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgX19wcm90b19fOiBbXVxuICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBkLl9fcHJvdG9fXyA9IGI7XG4gIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICB9XG5cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG52YXIgX2Fzc2lnbiA9IGZ1bmN0aW9uIF9fYXNzaWduKCkge1xuICBfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydCB7IF9hc3NpZ24gYXMgX19hc3NpZ24gfTtcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsXG4gICAgICBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO2Vsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICB9XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0ge1xuICAgIGxhYmVsOiAwLFxuICAgIHNlbnQ6IGZ1bmN0aW9uIHNlbnQoKSB7XG4gICAgICBpZiAodFswXSAmIDEpIHRocm93IHRbMV07XG4gICAgICByZXR1cm4gdFsxXTtcbiAgICB9LFxuICAgIHRyeXM6IFtdLFxuICAgIG9wczogW11cbiAgfSxcbiAgICAgIGYsXG4gICAgICB5LFxuICAgICAgdCxcbiAgICAgIGc7XG4gIHJldHVybiBnID0ge1xuICAgIG5leHQ6IHZlcmIoMCksXG4gICAgXCJ0aHJvd1wiOiB2ZXJiKDEpLFxuICAgIFwicmV0dXJuXCI6IHZlcmIoMilcbiAgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcblxuICAgIHdoaWxlIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcblxuICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG9wWzFdLFxuICAgICAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICAgIHkgPSBvcFsxXTtcbiAgICAgICAgICAgIG9wID0gWzBdO1xuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuXG4gICAgICAgICAgICBfLnRyeXMucG9wKCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7XG4gICAgICAgICAgICAgIF8gPSAwO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gb3BbMV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICAgIHQgPSBvcDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuXG4gICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb3AgPSBbNiwgZV07XG4gICAgICAgIHkgPSAwO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZiA9IHQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCxcbiAgICAgIGRvbmU6IHRydWVcbiAgICB9O1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVCaW5kaW5nKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xuICBmb3IgKHZhciBwIGluIG0pIHtcbiAgICBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsXG4gICAgICBtID0gcyAmJiBvW3NdLFxuICAgICAgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgIGRvbmU6ICFvXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICByLFxuICAgICAgYXIgPSBbXSxcbiAgICAgIGU7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkge1xuICAgICAgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICB9XG5cbiAgcmV0dXJuIGFyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIH1cblxuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspIHtcbiAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKykge1xuICAgICAgcltrXSA9IGFbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHI7XG59XG47XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLFxuICAgICAgaSxcbiAgICAgIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHtcbiAgICB0cnkge1xuICAgICAgc3RlcChnW25dKHYpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXR0bGUocVswXVszXSwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RlcChyKSB7XG4gICAgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7XG4gIH1cblxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHtcbiAgICByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikge1xuICAgIGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICB0aHJvdyBlO1xuICB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobiwgZikge1xuICAgIGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiAocCA9ICFwKSA/IHtcbiAgICAgICAgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksXG4gICAgICAgIGRvbmU6IG4gPT09IFwicmV0dXJuXCJcbiAgICAgIH0gOiBmID8gZih2KSA6IHY7XG4gICAgfSA6IGY7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSxcbiAgICAgIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGkpO1xuXG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgZG9uZTogZFxuICAgICAgfSk7XG4gICAgfSwgcmVqZWN0KTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7XG4gICAgICB2YWx1ZTogcmF3XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29va2VkLnJhdyA9IHJhdztcbiAgfVxuXG4gIHJldHVybiBjb29rZWQ7XG59XG47XG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICB9XG4gIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHtcbiAgICBkZWZhdWx0OiBtb2RcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4850\n')},9771:function(__unused_webpack_module,exports){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.default = void 0;\n\nfunction startsWith(string, target, position) {\n var length = string.length;\n position = position == null ? 0 : position;\n\n if (position < 0) {\n position = 0;\n } else if (position > length) {\n position = length;\n }\n\n target = "".concat(target);\n return string.slice(position, position + target.length) == target;\n}\n\nfunction getBrowserLang() {\n if (typeof window === "undefined") {\n return null;\n }\n\n var lang = window.navigator.languages && window.navigator.languages[0] || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage || window.navigator.systemLanguage || null;\n return lang;\n}\n\nfunction normalizeCode(code) {\n return code.toLowerCase().replace(/-/, "_");\n}\n\nfunction getPreferredLanguage(options) {\n if (!options) {\n return getBrowserLang();\n }\n\n var languages = options.languages,\n fallback = options.fallback;\n\n if (!options.languages) {\n return fallback;\n } // some browsers report language as en-US instead of en_US\n\n\n var browserLanguage = normalizeCode(getBrowserLang());\n\n if (!browserLanguage) {\n return fallback;\n }\n\n var match = languages.filter(function (lang) {\n return normalizeCode(lang) === browserLanguage;\n });\n\n if (match.length > 0) {\n return match[0] || fallback;\n } // en == en_US\n\n\n var matchCodeOnly = languages.filter(function (lang) {\n return startsWith(browserLanguage, lang);\n });\n return matchCodeOnly[0] || fallback;\n}\n\nvar _default = getPreferredLanguage;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9icm93c2VyLWxhbmcvZGlzdC9pbmRleC5qcz9iNmY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGVBQWU7O0FBRWY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLGVBQWUiLCJmaWxlIjoiOTc3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsID8gMCA6IHBvc2l0aW9uO1xuXG4gIGlmIChwb3NpdGlvbiA8IDApIHtcbiAgICBwb3NpdGlvbiA9IDA7XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IGxlbmd0aDtcbiAgfVxuXG4gIHRhcmdldCA9IFwiXCIuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBnZXRCcm93c2VyTGFuZygpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsYW5nID0gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgJiYgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCB3aW5kb3cubmF2aWdhdG9yLnN5c3RlbUxhbmd1YWdlIHx8IG51bGw7XG4gIHJldHVybiBsYW5nO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb2RlKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tLywgXCJfXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVmZXJyZWRMYW5ndWFnZShvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBnZXRCcm93c2VyTGFuZygpO1xuICB9XG5cbiAgdmFyIGxhbmd1YWdlcyA9IG9wdGlvbnMubGFuZ3VhZ2VzLFxuICAgICAgZmFsbGJhY2sgPSBvcHRpb25zLmZhbGxiYWNrO1xuXG4gIGlmICghb3B0aW9ucy5sYW5ndWFnZXMpIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH0gLy8gc29tZSBicm93c2VycyByZXBvcnQgbGFuZ3VhZ2UgYXMgZW4tVVMgaW5zdGVhZCBvZiBlbl9VU1xuXG5cbiAgdmFyIGJyb3dzZXJMYW5ndWFnZSA9IG5vcm1hbGl6ZUNvZGUoZ2V0QnJvd3NlckxhbmcoKSk7XG5cbiAgaWYgKCFicm93c2VyTGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cblxuICB2YXIgbWF0Y2ggPSBsYW5ndWFnZXMuZmlsdGVyKGZ1bmN0aW9uIChsYW5nKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUNvZGUobGFuZykgPT09IGJyb3dzZXJMYW5ndWFnZTtcbiAgfSk7XG5cbiAgaWYgKG1hdGNoLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gfHwgZmFsbGJhY2s7XG4gIH0gLy8gZW4gPT0gZW5fVVNcblxuXG4gIHZhciBtYXRjaENvZGVPbmx5ID0gbGFuZ3VhZ2VzLmZpbHRlcihmdW5jdGlvbiAobGFuZykge1xuICAgIHJldHVybiBzdGFydHNXaXRoKGJyb3dzZXJMYW5ndWFnZSwgbGFuZyk7XG4gIH0pO1xuICByZXR1cm4gbWF0Y2hDb2RlT25seVswXSB8fCBmYWxsYmFjaztcbn1cblxudmFyIF9kZWZhdWx0ID0gZ2V0UHJlZmVycmVkTGFuZ3VhZ2U7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9771\n')},6494:function(module){"use strict";eval("\n\nmodule.exports = Object.assign;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnkvZGlzdC9pbnRlcm5hbC1wbHVnaW5zL2J1bmRsZS1vcHRpbWlzYXRpb25zL3BvbHlmaWxscy9vYmplY3QtYXNzaWduLmpzP2ViZmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIiLCJmaWxlIjoiNjQ5NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ247Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6494\n")},5706:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nvar reactIs = __webpack_require__(8812);\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\n\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcz83MzFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGNBQWMsbUJBQU8sQ0FBQyxJQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGlCQUFpQjtBQUNwQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiI1NzA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cblxudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge307XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5Gb3J3YXJkUmVmXSA9IEZPUldBUkRfUkVGX1NUQVRJQ1M7XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5NZW1vXSA9IE1FTU9fU1RBVElDUztcblxuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgLy8gUmVhY3QgdjE2LjExIGFuZCBiZWxvd1xuICBpZiAocmVhY3RJcy5pc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH0gLy8gUmVhY3QgdjE2LjEyIGFuZCBhYm92ZVxuXG5cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbJyQkdHlwZW9mJ11dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5706\n")},165:function(__unused_webpack_module,exports){"use strict";eval('/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar b = "function" === typeof Symbol && Symbol.for,\n c = b ? Symbol.for("react.element") : 60103,\n d = b ? Symbol.for("react.portal") : 60106,\n e = b ? Symbol.for("react.fragment") : 60107,\n f = b ? Symbol.for("react.strict_mode") : 60108,\n g = b ? Symbol.for("react.profiler") : 60114,\n h = b ? Symbol.for("react.provider") : 60109,\n k = b ? Symbol.for("react.context") : 60110,\n l = b ? Symbol.for("react.async_mode") : 60111,\n m = b ? Symbol.for("react.concurrent_mode") : 60111,\n n = b ? Symbol.for("react.forward_ref") : 60112,\n p = b ? Symbol.for("react.suspense") : 60113,\n q = b ? Symbol.for("react.suspense_list") : 60120,\n r = b ? Symbol.for("react.memo") : 60115,\n t = b ? Symbol.for("react.lazy") : 60116,\n v = b ? Symbol.for("react.block") : 60121,\n w = b ? Symbol.for("react.fundamental") : 60117,\n x = b ? Symbol.for("react.responder") : 60118,\n y = b ? Symbol.for("react.scope") : 60119;\n\nfunction z(a) {\n if ("object" === typeof a && null !== a) {\n var u = a.$$typeof;\n\n switch (u) {\n case c:\n switch (a = a.type, a) {\n case l:\n case m:\n case e:\n case g:\n case f:\n case p:\n return a;\n\n default:\n switch (a = a && a.$$typeof, a) {\n case k:\n case n:\n case t:\n case r:\n case h:\n return a;\n\n default:\n return u;\n }\n\n }\n\n case d:\n return u;\n }\n }\n}\n\nfunction A(a) {\n return z(a) === m;\n}\n\nexports.AsyncMode = l;\nexports.ConcurrentMode = m;\nexports.ContextConsumer = k;\nexports.ContextProvider = h;\nexports.Element = c;\nexports.ForwardRef = n;\nexports.Fragment = e;\nexports.Lazy = t;\nexports.Memo = r;\nexports.Portal = d;\nexports.Profiler = g;\nexports.StrictMode = f;\nexports.Suspense = p;\n\nexports.isAsyncMode = function (a) {\n return A(a) || z(a) === l;\n};\n\nexports.isConcurrentMode = A;\n\nexports.isContextConsumer = function (a) {\n return z(a) === k;\n};\n\nexports.isContextProvider = function (a) {\n return z(a) === h;\n};\n\nexports.isElement = function (a) {\n return "object" === typeof a && null !== a && a.$$typeof === c;\n};\n\nexports.isForwardRef = function (a) {\n return z(a) === n;\n};\n\nexports.isFragment = function (a) {\n return z(a) === e;\n};\n\nexports.isLazy = function (a) {\n return z(a) === t;\n};\n\nexports.isMemo = function (a) {\n return z(a) === r;\n};\n\nexports.isPortal = function (a) {\n return z(a) === d;\n};\n\nexports.isProfiler = function (a) {\n return z(a) === g;\n};\n\nexports.isStrictMode = function (a) {\n return z(a) === f;\n};\n\nexports.isSuspense = function (a) {\n return z(a) === p;\n};\n\nexports.isValidElementType = function (a) {\n return "string" === typeof a || "function" === typeof a || a === e || a === m || a === g || a === f || a === p || a === q || "object" === typeof a && null !== a && (a.$$typeof === t || a.$$typeof === r || a.$$typeof === h || a.$$typeof === k || a.$$typeof === n || a.$$typeof === w || a.$$typeof === x || a.$$typeof === y || a.$$typeof === v);\n};\n\nexports.typeOf = z;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanM/YWQxMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osWUFBWTtBQUNaLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLGdCQUFnQjs7QUFFaEIsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUEsd0JBQXdCOztBQUV4Qix5QkFBeUI7QUFDekI7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxjQUFjIiwiZmlsZSI6IjE2NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYiA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yLFxuICAgIGMgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgOiA2MDEwMyxcbiAgICBkID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIikgOiA2MDEwNixcbiAgICBlID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSA6IDYwMTA3LFxuICAgIGYgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpIDogNjAxMDgsXG4gICAgZyA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIikgOiA2MDExNCxcbiAgICBoID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSA6IDYwMTA5LFxuICAgIGsgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIikgOiA2MDExMCxcbiAgICBsID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5hc3luY19tb2RlXCIpIDogNjAxMTEsXG4gICAgbSA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuY29uY3VycmVudF9tb2RlXCIpIDogNjAxMTEsXG4gICAgbiA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIikgOiA2MDExMixcbiAgICBwID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSA6IDYwMTEzLFxuICAgIHEgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIikgOiA2MDEyMCxcbiAgICByID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpIDogNjAxMTUsXG4gICAgdCA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSA6IDYwMTE2LFxuICAgIHYgPSBiID8gU3ltYm9sLmZvcihcInJlYWN0LmJsb2NrXCIpIDogNjAxMjEsXG4gICAgdyA9IGIgPyBTeW1ib2wuZm9yKFwicmVhY3QuZnVuZGFtZW50YWxcIikgOiA2MDExNyxcbiAgICB4ID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5yZXNwb25kZXJcIikgOiA2MDExOCxcbiAgICB5ID0gYiA/IFN5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKSA6IDYwMTE5O1xuXG5mdW5jdGlvbiB6KGEpIHtcbiAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBhICYmIG51bGwgIT09IGEpIHtcbiAgICB2YXIgdSA9IGEuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKHUpIHtcbiAgICAgIGNhc2UgYzpcbiAgICAgICAgc3dpdGNoIChhID0gYS50eXBlLCBhKSB7XG4gICAgICAgICAgY2FzZSBsOlxuICAgICAgICAgIGNhc2UgbTpcbiAgICAgICAgICBjYXNlIGU6XG4gICAgICAgICAgY2FzZSBnOlxuICAgICAgICAgIGNhc2UgZjpcbiAgICAgICAgICBjYXNlIHA6XG4gICAgICAgICAgICByZXR1cm4gYTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzd2l0Y2ggKGEgPSBhICYmIGEuJCR0eXBlb2YsIGEpIHtcbiAgICAgICAgICAgICAgY2FzZSBrOlxuICAgICAgICAgICAgICBjYXNlIG46XG4gICAgICAgICAgICAgIGNhc2UgdDpcbiAgICAgICAgICAgICAgY2FzZSByOlxuICAgICAgICAgICAgICBjYXNlIGg6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGE7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgZDpcbiAgICAgICAgcmV0dXJuIHU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEEoYSkge1xuICByZXR1cm4geihhKSA9PT0gbTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBsO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IG07XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IGs7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IGg7XG5leHBvcnRzLkVsZW1lbnQgPSBjO1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gbjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBlO1xuZXhwb3J0cy5MYXp5ID0gdDtcbmV4cG9ydHMuTWVtbyA9IHI7XG5leHBvcnRzLlBvcnRhbCA9IGQ7XG5leHBvcnRzLlByb2ZpbGVyID0gZztcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IGY7XG5leHBvcnRzLlN1c3BlbnNlID0gcDtcblxuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiBBKGEpIHx8IHooYSkgPT09IGw7XG59O1xuXG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBBO1xuXG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGs7XG59O1xuXG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGg7XG59O1xuXG5leHBvcnRzLmlzRWxlbWVudCA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiBcIm9iamVjdFwiID09PSB0eXBlb2YgYSAmJiBudWxsICE9PSBhICYmIGEuJCR0eXBlb2YgPT09IGM7XG59O1xuXG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBuO1xufTtcblxuZXhwb3J0cy5pc0ZyYWdtZW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgcmV0dXJuIHooYSkgPT09IGU7XG59O1xuXG5leHBvcnRzLmlzTGF6eSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSB0O1xufTtcblxuZXhwb3J0cy5pc01lbW8gPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gcjtcbn07XG5cbmV4cG9ydHMuaXNQb3J0YWwgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gZDtcbn07XG5cbmV4cG9ydHMuaXNQcm9maWxlciA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBnO1xufTtcblxuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4geihhKSA9PT0gZjtcbn07XG5cbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiB6KGEpID09PSBwO1xufTtcblxuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGEgfHwgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYSB8fCBhID09PSBlIHx8IGEgPT09IG0gfHwgYSA9PT0gZyB8fCBhID09PSBmIHx8IGEgPT09IHAgfHwgYSA9PT0gcSB8fCBcIm9iamVjdFwiID09PSB0eXBlb2YgYSAmJiBudWxsICE9PSBhICYmIChhLiQkdHlwZW9mID09PSB0IHx8IGEuJCR0eXBlb2YgPT09IHIgfHwgYS4kJHR5cGVvZiA9PT0gaCB8fCBhLiQkdHlwZW9mID09PSBrIHx8IGEuJCR0eXBlb2YgPT09IG4gfHwgYS4kJHR5cGVvZiA9PT0gdyB8fCBhLiQkdHlwZW9mID09PSB4IHx8IGEuJCR0eXBlb2YgPT09IHkgfHwgYS4kJHR5cGVvZiA9PT0gdik7XG59O1xuXG5leHBvcnRzLnR5cGVPZiA9IHo7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///165\n')},8812:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(165);\n} else {}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcz8zOTgxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksSUFBcUM7QUFDekMsRUFBRSx5Q0FBNEQ7QUFDOUQsQ0FBQyxNQUFNIiwiZmlsZSI6Ijg4MTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8812\n")},9108:function(module){"use strict";eval("\n\nfunction shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key] || !Object.prototype.hasOwnProperty.call(objB, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqualObjects;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zaGFsbG93LWVxdWFsL29iamVjdHMvaW5kZXguanM/MzYxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjkxMDguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbE9iamVjdHMob2JqQSwgb2JqQikge1xuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFvYmpBIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGFLZXlzID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKG9iakIpO1xuICB2YXIgbGVuID0gYUtleXMubGVuZ3RoO1xuXG4gIGlmIChiS2V5cy5sZW5ndGggIT09IGxlbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gYUtleXNbaV07XG5cbiAgICBpZiAob2JqQVtrZXldICE9PSBvYmpCW2tleV0gfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsT2JqZWN0czsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9108\n")},8037:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var __webpack_unused_export__;\n\n\nvar _interopRequireDefault = __webpack_require__(5318);\n\n__webpack_unused_export__ = true;\nexports.dq = withPrefix;\nexports.mc = withAssetPrefix;\nexports.c4 = exports.ZP = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(__webpack_require__(7316));\n\nvar _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(1506));\n\nvar _inheritsLoose2 = _interopRequireDefault(__webpack_require__(5354));\n\nvar _extends2 = _interopRequireDefault(__webpack_require__(7154));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(5697));\n\nvar _react = _interopRequireDefault(__webpack_require__(7294));\n\nvar _reachRouter = __webpack_require__(9499);\n\nvar _utils = __webpack_require__(2098);\n\nvar _parsePath = __webpack_require__(1752);\n\nexports.cP = _parsePath.parsePath;\nvar _excluded = ["to", "getProps", "onClick", "onMouseEnter", "activeClassName", "activeStyle", "innerRef", "partiallyActive", "state", "replace", "_location"];\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n return path === null || path === void 0 ? void 0 : path.startsWith("/");\n};\n\nfunction withPrefix(path, prefix) {\n var _ref, _prefix;\n\n if (prefix === void 0) {\n prefix = getGlobalBasePrefix();\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n if (path.startsWith("./") || path.startsWith("../")) {\n return path;\n }\n\n var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : "/";\n return "" + (base !== null && base !== void 0 && base.endsWith("/") ? base.slice(0, -1) : base) + (path.startsWith("/") ? path : "/" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n return false ? 0 : "/justice40-tool/803-0bf34ac";\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n return false ? 0 : "/justice40-tool/803-0bf34ac";\n};\n\nvar isLocalLink = function isLocalLink(path) {\n return path && !path.startsWith("http://") && !path.startsWith("https://") && !path.startsWith("//");\n};\n\nfunction withAssetPrefix(path) {\n return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n // If it\'s already absolute, return as-is\n if (isAbsolutePath(path)) {\n return path;\n }\n\n return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n if (typeof path === "number") {\n return path;\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n activeClassName: _propTypes.default.string,\n activeStyle: _propTypes.default.object,\n partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n var io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (el === entry.target) {\n // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n // MSEdge doesn\'t currently support isIntersecting, so also test for an intersectionRatio > 0\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(el);\n io.disconnect();\n cb();\n }\n }\n });\n }); // Add element to the observer\n\n io.observe(el);\n return {\n instance: io,\n el: el\n };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Location, null, function (_ref2) {\n var location = _ref2.location;\n return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n _location: location\n }));\n });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n function GatsbyLink(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n _this.defaultGetProps = function (_ref3) {\n var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n isCurrent = _ref3.isCurrent;\n\n if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n return {\n className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(" "),\n style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n };\n }\n\n return null;\n };\n\n var IOSupported = false;\n\n if (typeof window !== "undefined" && window.IntersectionObserver) {\n IOSupported = true;\n }\n\n _this.state = {\n IOSupported: IOSupported\n };\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = GatsbyLink.prototype;\n\n _proto._prefetch = function _prefetch() {\n var currentPath = window.location.pathname; // reach router should have the correct state\n\n if (this.props._location && this.props._location.pathname) {\n currentPath = this.props._location.pathname;\n }\n\n var rewrittenPath = rewriteLinkPath(this.props.to, currentPath);\n var newPathName = (0, _parsePath.parsePath)(rewrittenPath).pathname; // Prefech is used to speed up next navigations. When you use it on the current navigation,\n // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n if (currentPath !== newPathName) {\n ___loader.enqueue(newPathName);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n // Preserve non IO functionality if no support\n if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentDidMount = function componentDidMount() {\n // Preserve non IO functionality if no support\n if (!this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!this.io) {\n return;\n }\n\n var _this$io = this.io,\n instance = _this$io.instance,\n el = _this$io.el;\n instance.unobserve(el);\n instance.disconnect();\n };\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.props.innerRef && this.props.innerRef.hasOwnProperty("current")) {\n this.props.innerRef.current = ref;\n } else if (this.props.innerRef) {\n this.props.innerRef(ref);\n }\n\n if (this.state.IOSupported && ref) {\n // If IO supported and element reference found, setup Observer functionality\n this.io = createIntersectionObserver(ref, function () {\n _this2._prefetch();\n });\n }\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n to = _this$props.to,\n _this$props$getProps = _this$props.getProps,\n getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n _onClick = _this$props.onClick,\n _onMouseEnter = _this$props.onMouseEnter,\n $activeClassName = _this$props.activeClassName,\n $activeStyle = _this$props.activeStyle,\n $innerRef = _this$props.innerRef,\n partiallyActive = _this$props.partiallyActive,\n state = _this$props.state,\n replace = _this$props.replace,\n _location = _this$props._location,\n rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded);\n\n if (false) {}\n\n var prefixedTo = rewriteLinkPath(to, _location.pathname);\n\n if (!isLocalLink(prefixedTo)) {\n return /*#__PURE__*/_react.default.createElement("a", (0, _extends2.default)({\n href: prefixedTo\n }, rest));\n }\n\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Link, (0, _extends2.default)({\n to: prefixedTo,\n state: state,\n getProps: getProps,\n innerRef: this.handleRef,\n onMouseEnter: function onMouseEnter(e) {\n if (_onMouseEnter) {\n _onMouseEnter(e);\n }\n\n ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n },\n onClick: function onClick(e) {\n if (_onClick) {\n _onClick(e);\n }\n\n if (e.button === 0 && // ignore right clicks\n !_this3.props.target && // let browser handle "target=_blank"\n !e.defaultPrevented && // onClick prevented default\n !e.metaKey && // ignore clicks with modifier keys...\n !e.altKey && !e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n var shouldReplace = replace;\n\n var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n if (typeof replace !== "boolean" && isCurrent) {\n shouldReplace = true;\n } // Make sure the necessary scripts and data are\n // loaded before continuing.\n\n\n window.___navigate(prefixedTo, {\n state: state,\n replace: shouldReplace\n });\n }\n\n return true;\n }\n }, rest));\n };\n\n return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n onClick: _propTypes.default.func,\n to: _propTypes.default.string.isRequired,\n replace: _propTypes.default.bool,\n state: _propTypes.default.object\n});\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n innerRef: ref\n }, props));\n});\n\nexports.ZP = _default;\n\nvar navigate = function navigate(to, options) {\n window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.c4 = navigate;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktbGluay9pbmRleC5qcz9mOTkwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxJQUE4Qzs7QUFFbkYseUJBQWtCO0FBQ2xCLFVBQWtCO0FBQ2xCLFVBQXVCO0FBQ3ZCLFVBQWdCLEdBQUcsVUFBZTs7QUFFbEMsNERBQTRELG1CQUFPLENBQUMsSUFBcUQ7O0FBRXpILHFEQUFxRCxtQkFBTyxDQUFDLElBQThDOztBQUUzRyw2Q0FBNkMsbUJBQU8sQ0FBQyxJQUFzQzs7QUFFM0YsdUNBQXVDLG1CQUFPLENBQUMsSUFBZ0M7O0FBRS9FLHdDQUF3QyxtQkFBTyxDQUFDLElBQVk7O0FBRTVELG9DQUFvQyxtQkFBTyxDQUFDLElBQU87O0FBRW5ELG1CQUFtQixtQkFBTyxDQUFDLElBQXdCOztBQUVuRCxhQUFhLG1CQUFPLENBQUMsSUFBa0M7O0FBRXZELGlCQUFpQixtQkFBTyxDQUFDLElBQWM7O0FBRXZDLFVBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0EsU0FBUyxNQUFxQyxHQUFHLENBQW9FLEdBQUcsNkJBQWU7QUFDdkk7O0FBRUE7QUFDQSxTQUFTLE1BQXFDLEdBQUcsQ0FBZ0UsR0FBRyw2QkFBYTtBQUNqSTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUcsRUFBRTs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0U7QUFDeEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxLQUF5RCxFQUFFLEVBRTlEOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVELGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQsVUFBZTs7QUFFZjtBQUNBO0FBQ0E7O0FBRUEsVUFBZ0IiLCJmaWxlIjoiODAzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMud2l0aFByZWZpeCA9IHdpdGhQcmVmaXg7XG5leHBvcnRzLndpdGhBc3NldFByZWZpeCA9IHdpdGhBc3NldFByZWZpeDtcbmV4cG9ydHMubmF2aWdhdGUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIikpO1xuXG52YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKSk7XG5cbnZhciBfaW5oZXJpdHNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2VcIikpO1xuXG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcblxudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9yZWFjaFJvdXRlciA9IHJlcXVpcmUoXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIkBnYXRzYnlqcy9yZWFjaC1yb3V0ZXIvbGliL3V0aWxzXCIpO1xuXG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoXCIuL3BhcnNlLXBhdGhcIik7XG5cbmV4cG9ydHMucGFyc2VQYXRoID0gX3BhcnNlUGF0aC5wYXJzZVBhdGg7XG52YXIgX2V4Y2x1ZGVkID0gW1widG9cIiwgXCJnZXRQcm9wc1wiLCBcIm9uQ2xpY2tcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJhY3RpdmVDbGFzc05hbWVcIiwgXCJhY3RpdmVTdHlsZVwiLCBcImlubmVyUmVmXCIsIFwicGFydGlhbGx5QWN0aXZlXCIsIFwic3RhdGVcIiwgXCJyZXBsYWNlXCIsIFwiX2xvY2F0aW9uXCJdO1xuXG52YXIgaXNBYnNvbHV0ZVBhdGggPSBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChwYXRoKSB7XG4gIHJldHVybiBwYXRoID09PSBudWxsIHx8IHBhdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhdGguc3RhcnRzV2l0aChcIi9cIik7XG59O1xuXG5mdW5jdGlvbiB3aXRoUHJlZml4KHBhdGgsIHByZWZpeCkge1xuICB2YXIgX3JlZiwgX3ByZWZpeDtcblxuICBpZiAocHJlZml4ID09PSB2b2lkIDApIHtcbiAgICBwcmVmaXggPSBnZXRHbG9iYWxCYXNlUHJlZml4KCk7XG4gIH1cblxuICBpZiAoIWlzTG9jYWxMaW5rKHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBpZiAocGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICB2YXIgYmFzZSA9IChfcmVmID0gKF9wcmVmaXggPSBwcmVmaXgpICE9PSBudWxsICYmIF9wcmVmaXggIT09IHZvaWQgMCA/IF9wcmVmaXggOiBnZXRHbG9iYWxQYXRoUHJlZml4KCkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBcIi9cIjtcbiAgcmV0dXJuIFwiXCIgKyAoYmFzZSAhPT0gbnVsbCAmJiBiYXNlICE9PSB2b2lkIDAgJiYgYmFzZS5lbmRzV2l0aChcIi9cIikgPyBiYXNlLnNsaWNlKDAsIC0xKSA6IGJhc2UpICsgKHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRoKTtcbn0gLy8gVGhlc2UgZ2xvYmFsIHZhbHVlcyBhcmUgd3JhcHBlZCBpbiB0eXBlb2YgY2xhdXNlcyB0byBlbnN1cmUgdGhlIHZhbHVlcyBleGlzdC5cbi8vIFRoaXMgaXMgZXNwZWNpYWxseSBwcm9ibGVtYXRpYyBpbiB1bml0IHRlc3Rpbmcgb2YgdGhpcyBjb21wb25lbnQuXG5cblxudmFyIGdldEdsb2JhbFBhdGhQcmVmaXggPSBmdW5jdGlvbiBnZXRHbG9iYWxQYXRoUHJlZml4KCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gdHlwZW9mIF9fUEFUSF9QUkVGSVhfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fUEFUSF9QUkVGSVhfXyA6IHVuZGVmaW5lZCA6IF9fUEFUSF9QUkVGSVhfXztcbn07XG5cbnZhciBnZXRHbG9iYWxCYXNlUHJlZml4ID0gZnVuY3Rpb24gZ2V0R2xvYmFsQmFzZVByZWZpeCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHR5cGVvZiBfX0JBU0VfUEFUSF9fICE9PSBcInVuZGVmaW5lZFwiID8gX19CQVNFX1BBVEhfXyA6IHVuZGVmaW5lZCA6IF9fQkFTRV9QQVRIX187XG59O1xuXG52YXIgaXNMb2NhbExpbmsgPSBmdW5jdGlvbiBpc0xvY2FsTGluayhwYXRoKSB7XG4gIHJldHVybiBwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpICYmICFwYXRoLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSAmJiAhcGF0aC5zdGFydHNXaXRoKFwiLy9cIik7XG59O1xuXG5mdW5jdGlvbiB3aXRoQXNzZXRQcmVmaXgocGF0aCkge1xuICByZXR1cm4gd2l0aFByZWZpeChwYXRoLCBnZXRHbG9iYWxQYXRoUHJlZml4KCkpO1xufVxuXG5mdW5jdGlvbiBhYnNvbHV0aWZ5KHBhdGgsIGN1cnJlbnQpIHtcbiAgLy8gSWYgaXQncyBhbHJlYWR5IGFic29sdXRlLCByZXR1cm4gYXMtaXNcbiAgaWYgKGlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICByZXR1cm4gKDAsIF91dGlscy5yZXNvbHZlKShwYXRoLCBjdXJyZW50KTtcbn1cblxudmFyIHJld3JpdGVMaW5rUGF0aCA9IGZ1bmN0aW9uIHJld3JpdGVMaW5rUGF0aChwYXRoLCByZWxhdGl2ZVRvKSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgaWYgKCFpc0xvY2FsTGluayhwYXRoKSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGlzQWJzb2x1dGVQYXRoKHBhdGgpID8gd2l0aFByZWZpeChwYXRoKSA6IGFic29sdXRpZnkocGF0aCwgcmVsYXRpdmVUbyk7XG59O1xuXG52YXIgTmF2TGlua1Byb3BUeXBlcyA9IHtcbiAgYWN0aXZlQ2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBhY3RpdmVTdHlsZTogX3Byb3BUeXBlcy5kZWZhdWx0Lm9iamVjdCxcbiAgcGFydGlhbGx5QWN0aXZlOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbFxufTsgLy8gU2V0IHVwIEludGVyc2VjdGlvbk9ic2VydmVyXG5cbnZhciBjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciA9IGZ1bmN0aW9uIGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyKGVsLCBjYikge1xuICB2YXIgaW8gPSBuZXcgd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVsID09PSBlbnRyeS50YXJnZXQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyB3aXRoaW4gdmlld3BvcnQsIHJlbW92ZSBsaXN0ZW5lciwgZGVzdHJveSBvYnNlcnZlciwgYW5kIHJ1biBsaW5rIGNhbGxiYWNrLlxuICAgICAgICAvLyBNU0VkZ2UgZG9lc24ndCBjdXJyZW50bHkgc3VwcG9ydCBpc0ludGVyc2VjdGluZywgc28gYWxzbyB0ZXN0IGZvciAgYW4gaW50ZXJzZWN0aW9uUmF0aW8gPiAwXG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZyB8fCBlbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApIHtcbiAgICAgICAgICBpby51bm9ic2VydmUoZWwpO1xuICAgICAgICAgIGlvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pOyAvLyBBZGQgZWxlbWVudCB0byB0aGUgb2JzZXJ2ZXJcblxuICBpby5vYnNlcnZlKGVsKTtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW8sXG4gICAgZWw6IGVsXG4gIH07XG59O1xuXG5mdW5jdGlvbiBHYXRzYnlMaW5rTG9jYXRpb25XcmFwcGVyKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfcmVhY2hSb3V0ZXIuTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBsb2NhdGlvbiA9IF9yZWYyLmxvY2F0aW9uO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChHYXRzYnlMaW5rLCAoMCwgX2V4dGVuZHMyLmRlZmF1bHQpKHt9LCBwcm9wcywge1xuICAgICAgX2xvY2F0aW9uOiBsb2NhdGlvblxuICAgIH0pKTtcbiAgfSk7XG59XG5cbnZhciBHYXRzYnlMaW5rID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHNMb29zZTIuZGVmYXVsdCkoR2F0c2J5TGluaywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gR2F0c2J5TGluayhwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzOyAvLyBEZWZhdWx0IHRvIG5vIHN1cHBvcnQgZm9yIEludGVyc2VjdGlvbk9ic2VydmVyXG5cbiAgICBfdGhpcy5kZWZhdWx0R2V0UHJvcHMgPSBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgIHZhciBpc1BhcnRpYWxseUN1cnJlbnQgPSBfcmVmMy5pc1BhcnRpYWxseUN1cnJlbnQsXG4gICAgICAgICAgaXNDdXJyZW50ID0gX3JlZjMuaXNDdXJyZW50O1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMucGFydGlhbGx5QWN0aXZlID8gaXNQYXJ0aWFsbHlDdXJyZW50IDogaXNDdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBbX3RoaXMucHJvcHMuY2xhc3NOYW1lLCBfdGhpcy5wcm9wcy5hY3RpdmVDbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKSxcbiAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7fSwgX3RoaXMucHJvcHMuc3R5bGUsIF90aGlzLnByb3BzLmFjdGl2ZVN0eWxlKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIElPU3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIElPU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIElPU3VwcG9ydGVkOiBJT1N1cHBvcnRlZFxuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlUmVmID0gX3RoaXMuaGFuZGxlUmVmLmJpbmQoKDAsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQyLmRlZmF1bHQpKF90aGlzKSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdhdHNieUxpbmsucHJvdG90eXBlO1xuXG4gIF9wcm90by5fcHJlZmV0Y2ggPSBmdW5jdGlvbiBfcHJlZmV0Y2goKSB7XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyAvLyByZWFjaCByb3V0ZXIgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3Qgc3RhdGVcblxuICAgIGlmICh0aGlzLnByb3BzLl9sb2NhdGlvbiAmJiB0aGlzLnByb3BzLl9sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgY3VycmVudFBhdGggPSB0aGlzLnByb3BzLl9sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG5cbiAgICB2YXIgcmV3cml0dGVuUGF0aCA9IHJld3JpdGVMaW5rUGF0aCh0aGlzLnByb3BzLnRvLCBjdXJyZW50UGF0aCk7XG4gICAgdmFyIG5ld1BhdGhOYW1lID0gKDAsIF9wYXJzZVBhdGgucGFyc2VQYXRoKShyZXdyaXR0ZW5QYXRoKS5wYXRobmFtZTsgLy8gUHJlZmVjaCBpcyB1c2VkIHRvIHNwZWVkIHVwIG5leHQgbmF2aWdhdGlvbnMuIFdoZW4geW91IHVzZSBpdCBvbiB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLFxuICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgcmFjZS1jb25kaXRpb24gd2hlcmUgQ2hyb21lIHVzZXMgdGhlIHN0YWxlIGRhdGEgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV0d29yayB0byBjb21wbGV0ZVxuXG4gICAgaWYgKGN1cnJlbnRQYXRoICE9PSBuZXdQYXRoTmFtZSkge1xuICAgICAgX19fbG9hZGVyLmVucXVldWUobmV3UGF0aE5hbWUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgLy8gUHJlc2VydmUgbm9uIElPIGZ1bmN0aW9uYWxpdHkgaWYgbm8gc3VwcG9ydFxuICAgIGlmICh0aGlzLnByb3BzLnRvICE9PSBwcmV2UHJvcHMudG8gJiYgIXRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX3ByZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIFByZXNlcnZlIG5vbiBJTyBmdW5jdGlvbmFsaXR5IGlmIG5vIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX3ByZWZldGNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICghdGhpcy5pbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyRpbyA9IHRoaXMuaW8sXG4gICAgICAgIGluc3RhbmNlID0gX3RoaXMkaW8uaW5zdGFuY2UsXG4gICAgICAgIGVsID0gX3RoaXMkaW8uZWw7XG4gICAgaW5zdGFuY2UudW5vYnNlcnZlKGVsKTtcbiAgICBpbnN0YW5jZS5kaXNjb25uZWN0KCk7XG4gIH07XG5cbiAgX3Byb3RvLmhhbmRsZVJlZiA9IGZ1bmN0aW9uIGhhbmRsZVJlZihyZWYpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLnByb3BzLmlubmVyUmVmICYmIHRoaXMucHJvcHMuaW5uZXJSZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpKSB7XG4gICAgICB0aGlzLnByb3BzLmlubmVyUmVmLmN1cnJlbnQgPSByZWY7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmlubmVyUmVmKSB7XG4gICAgICB0aGlzLnByb3BzLmlubmVyUmVmKHJlZik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuSU9TdXBwb3J0ZWQgJiYgcmVmKSB7XG4gICAgICAvLyBJZiBJTyBzdXBwb3J0ZWQgYW5kIGVsZW1lbnQgcmVmZXJlbmNlIGZvdW5kLCBzZXR1cCBPYnNlcnZlciBmdW5jdGlvbmFsaXR5XG4gICAgICB0aGlzLmlvID0gY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5fcHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdG8gPSBfdGhpcyRwcm9wcy50byxcbiAgICAgICAgX3RoaXMkcHJvcHMkZ2V0UHJvcHMgPSBfdGhpcyRwcm9wcy5nZXRQcm9wcyxcbiAgICAgICAgZ2V0UHJvcHMgPSBfdGhpcyRwcm9wcyRnZXRQcm9wcyA9PT0gdm9pZCAwID8gdGhpcy5kZWZhdWx0R2V0UHJvcHMgOiBfdGhpcyRwcm9wcyRnZXRQcm9wcyxcbiAgICAgICAgX29uQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkNsaWNrLFxuICAgICAgICBfb25Nb3VzZUVudGVyID0gX3RoaXMkcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICAkYWN0aXZlQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgICAkYWN0aXZlU3R5bGUgPSBfdGhpcyRwcm9wcy5hY3RpdmVTdHlsZSxcbiAgICAgICAgJGlubmVyUmVmID0gX3RoaXMkcHJvcHMuaW5uZXJSZWYsXG4gICAgICAgIHBhcnRpYWxseUFjdGl2ZSA9IF90aGlzJHByb3BzLnBhcnRpYWxseUFjdGl2ZSxcbiAgICAgICAgc3RhdGUgPSBfdGhpcyRwcm9wcy5zdGF0ZSxcbiAgICAgICAgcmVwbGFjZSA9IF90aGlzJHByb3BzLnJlcGxhY2UsXG4gICAgICAgIF9sb2NhdGlvbiA9IF90aGlzJHByb3BzLl9sb2NhdGlvbixcbiAgICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIuZGVmYXVsdCkoX3RoaXMkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc0xvY2FsTGluayh0bykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkV4dGVybmFsIGxpbmsgXCIgKyB0byArIFwiIHdhcyBkZXRlY3RlZCBpbiBhIExpbmsgY29tcG9uZW50LiBVc2UgdGhlIExpbmsgY29tcG9uZW50IG9ubHkgZm9yIGludGVybmFsIGxpbmtzLiBTZWU6IGh0dHBzOi8vZ2F0c2J5LmRldi9pbnRlcm5hbC1saW5rc1wiKTtcbiAgICB9XG5cbiAgICB2YXIgcHJlZml4ZWRUbyA9IHJld3JpdGVMaW5rUGF0aCh0bywgX2xvY2F0aW9uLnBhdGhuYW1lKTtcblxuICAgIGlmICghaXNMb2NhbExpbmsocHJlZml4ZWRUbykpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwgKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7XG4gICAgICAgIGhyZWY6IHByZWZpeGVkVG9cbiAgICAgIH0sIHJlc3QpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3JlYWNoUm91dGVyLkxpbmssICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgICAgdG86IHByZWZpeGVkVG8sXG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBnZXRQcm9wczogZ2V0UHJvcHMsXG4gICAgICBpbm5lclJlZjogdGhpcy5oYW5kbGVSZWYsXG4gICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihlKSB7XG4gICAgICAgIGlmIChfb25Nb3VzZUVudGVyKSB7XG4gICAgICAgICAgX29uTW91c2VFbnRlcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9fX2xvYWRlci5ob3ZlcmluZygoMCwgX3BhcnNlUGF0aC5wYXJzZVBhdGgpKHByZWZpeGVkVG8pLnBhdGhuYW1lKTtcbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgaWYgKF9vbkNsaWNrKSB7XG4gICAgICAgICAgX29uQ2xpY2soZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5idXR0b24gPT09IDAgJiYgLy8gaWdub3JlIHJpZ2h0IGNsaWNrc1xuICAgICAgICAhX3RoaXMzLnByb3BzLnRhcmdldCAmJiAvLyBsZXQgYnJvd3NlciBoYW5kbGUgXCJ0YXJnZXQ9X2JsYW5rXCJcbiAgICAgICAgIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAvLyBvbkNsaWNrIHByZXZlbnRlZCBkZWZhdWx0XG4gICAgICAgICFlLm1ldGFLZXkgJiYgLy8gaWdub3JlIGNsaWNrcyB3aXRoIG1vZGlmaWVyIGtleXMuLi5cbiAgICAgICAgIWUuYWx0S2V5ICYmICFlLmN0cmxLZXkgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdmFyIHNob3VsZFJlcGxhY2UgPSByZXBsYWNlO1xuXG4gICAgICAgICAgdmFyIGlzQ3VycmVudCA9IGVuY29kZVVSSShwcmVmaXhlZFRvKSA9PT0gX2xvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlICE9PSBcImJvb2xlYW5cIiAmJiBpc0N1cnJlbnQpIHtcbiAgICAgICAgICAgIHNob3VsZFJlcGxhY2UgPSB0cnVlO1xuICAgICAgICAgIH0gLy8gTWFrZSBzdXJlIHRoZSBuZWNlc3Nhcnkgc2NyaXB0cyBhbmQgZGF0YSBhcmVcbiAgICAgICAgICAvLyBsb2FkZWQgYmVmb3JlIGNvbnRpbnVpbmcuXG5cblxuICAgICAgICAgIHdpbmRvdy5fX19uYXZpZ2F0ZShwcmVmaXhlZFRvLCB7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICByZXBsYWNlOiBzaG91bGRSZXBsYWNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCByZXN0KSk7XG4gIH07XG5cbiAgcmV0dXJuIEdhdHNieUxpbms7XG59KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCk7XG5cbkdhdHNieUxpbmsucHJvcFR5cGVzID0gKDAsIF9leHRlbmRzMi5kZWZhdWx0KSh7fSwgTmF2TGlua1Byb3BUeXBlcywge1xuICBvbkNsaWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgdG86IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgcmVwbGFjZTogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIHN0YXRlOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0XG59KTtcblxudmFyIF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEdhdHNieUxpbmtMb2NhdGlvbldyYXBwZXIsICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe1xuICAgIGlubmVyUmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcblxudmFyIG5hdmlnYXRlID0gZnVuY3Rpb24gbmF2aWdhdGUodG8sIG9wdGlvbnMpIHtcbiAgd2luZG93Ll9fX25hdmlnYXRlKHJld3JpdGVMaW5rUGF0aCh0bywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKSwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnRzLm5hdmlnYXRlID0gbmF2aWdhdGU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8037\n')},1752:function(__unused_webpack_module,exports){"use strict";eval('\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n var pathname = path || "/";\n var search = "";\n var hash = "";\n var hashIndex = pathname.indexOf("#");\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf("?");\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === "?" ? "" : search,\n hash: hash === "#" ? "" : hash\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktbGluay9wYXJzZS1wYXRoLmpzPzcyZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCO0FBQ2xCLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTc1Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5wYXJzZVBhdGggPSBwYXJzZVBhdGg7XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBwYXRobmFtZSA9IHBhdGggfHwgXCIvXCI7XG4gIHZhciBzZWFyY2ggPSBcIlwiO1xuICB2YXIgaGFzaCA9IFwiXCI7XG4gIHZhciBoYXNoSW5kZXggPSBwYXRobmFtZS5pbmRleE9mKFwiI1wiKTtcblxuICBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGhhc2ggPSBwYXRobmFtZS5zdWJzdHIoaGFzaEluZGV4KTtcbiAgICBwYXRobmFtZSA9IHBhdGhuYW1lLnN1YnN0cigwLCBoYXNoSW5kZXgpO1xuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZihcIj9cIik7XG5cbiAgaWYgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgIHNlYXJjaCA9IHBhdGhuYW1lLnN1YnN0cihzZWFyY2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2ggPT09IFwiP1wiID8gXCJcIiA6IHNlYXJjaCxcbiAgICBoYXNoOiBoYXNoID09PSBcIiNcIiA/IFwiXCIgOiBoYXNoXG4gIH07XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1752\n')},9679:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = true;\nexports.p2 = exports.$C = void 0;\n\nvar _scrollHandler = __webpack_require__(1432);\n\nexports.$C = _scrollHandler.ScrollHandler;\n\nvar _useScrollRestoration = __webpack_require__(4855);\n\nexports.p2 = _useScrollRestoration.useScrollRestoration;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9pbmRleC5qcz9lZTEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBYTs7QUFFYix5QkFBa0I7QUFDbEIsVUFBNEIsR0FBRyxVQUFxQjs7QUFFcEQscUJBQXFCLG1CQUFPLENBQUMsSUFBa0I7O0FBRS9DLFVBQXFCOztBQUVyQiw0QkFBNEIsbUJBQU8sQ0FBQyxJQUEwQjs7QUFFOUQsVUFBNEIiLCJmaWxlIjoiOTY3OS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy51c2VTY3JvbGxSZXN0b3JhdGlvbiA9IGV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IHZvaWQgMDtcblxudmFyIF9zY3JvbGxIYW5kbGVyID0gcmVxdWlyZShcIi4vc2Nyb2xsLWhhbmRsZXJcIik7XG5cbmV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IF9zY3JvbGxIYW5kbGVyLlNjcm9sbEhhbmRsZXI7XG5cbnZhciBfdXNlU2Nyb2xsUmVzdG9yYXRpb24gPSByZXF1aXJlKFwiLi91c2Utc2Nyb2xsLXJlc3RvcmF0aW9uXCIpO1xuXG5leHBvcnRzLnVzZVNjcm9sbFJlc3RvcmF0aW9uID0gX3VzZVNjcm9sbFJlc3RvcmF0aW9uLnVzZVNjcm9sbFJlc3RvcmF0aW9uOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9679\n")},1432:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('\n\nvar _interopRequireDefault = __webpack_require__(5318);\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(1506));\n\nvar _inheritsLoose2 = _interopRequireDefault(__webpack_require__(5354));\n\nvar React = _interopRequireWildcard(__webpack_require__(7294));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(5697));\n\nvar _sessionStorage = __webpack_require__(1142);\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = "GatsbyScrollContext";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n function ScrollHandler() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n if (!shouldUpdateScroll) {\n return true;\n } // Hack to allow accessing this._stateStorage.\n\n\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n\n return _this;\n }\n\n var _proto = ScrollHandler.prototype;\n\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n\n this._isTicking = false;\n };\n\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener("scroll", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n } else if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener("scroll", this.scrollListener);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n\n return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9zY3JvbGwtaGFuZGxlci5qcz8xMjdjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLElBQThDOztBQUVuRixrQkFBa0I7QUFDbEIscUJBQXFCLEdBQUcscUJBQXFCOztBQUU3QyxxREFBcUQsbUJBQU8sQ0FBQyxJQUE4Qzs7QUFFM0csNkNBQTZDLG1CQUFPLENBQUMsSUFBc0M7O0FBRTNGLG9DQUFvQyxtQkFBTyxDQUFDLElBQU87O0FBRW5ELHdDQUF3QyxtQkFBTyxDQUFDLElBQVk7O0FBRTVELHNCQUFzQixtQkFBTyxDQUFDLElBQW1COztBQUVqRCxnREFBZ0QsZ0RBQWdELHVDQUF1QyxzQ0FBc0Msb0ZBQW9GLDJEQUEyRCxFQUFFLGVBQWU7O0FBRTdVLG9EQUFvRCw2Q0FBNkMsWUFBWSxFQUFFLDRFQUE0RSxTQUFTLGdCQUFnQixFQUFFLG1EQUFtRCwrQkFBK0IsdUJBQXVCLEVBQUUsaUJBQWlCLHNGQUFzRix1QkFBdUIsMkVBQTJFLHFGQUFxRixzQ0FBc0MsMENBQTBDLEVBQUUsT0FBTyx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsc0JBQXNCLGFBQWEsd0JBQXdCLEVBQUUsZUFBZTs7QUFFbHlCO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx1RUFBdUUsYUFBYTtBQUNwRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVELHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE0MzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlNjcm9sbEhhbmRsZXIgPSBleHBvcnRzLlNjcm9sbENvbnRleHQgPSB2b2lkIDA7XG5cbnZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpKTtcblxudmFyIF9pbmhlcml0c0xvb3NlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNMb29zZVwiKSk7XG5cbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbnZhciBfc2Vzc2lvblN0b3JhZ2UgPSByZXF1aXJlKFwiLi9zZXNzaW9uLXN0b3JhZ2VcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbnZhciBTY3JvbGxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobmV3IF9zZXNzaW9uU3RvcmFnZS5TZXNzaW9uU3RvcmFnZSgpKTtcbmV4cG9ydHMuU2Nyb2xsQ29udGV4dCA9IFNjcm9sbENvbnRleHQ7XG5TY3JvbGxDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJHYXRzYnlTY3JvbGxDb250ZXh0XCI7XG5cbnZhciBTY3JvbGxIYW5kbGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHNMb29zZTIuZGVmYXVsdCkoU2Nyb2xsSGFuZGxlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsSGFuZGxlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5fc3RhdGVTdG9yYWdlID0gbmV3IF9zZXNzaW9uU3RvcmFnZS5TZXNzaW9uU3RvcmFnZSgpO1xuICAgIF90aGlzLl9pc1RpY2tpbmcgPSBmYWxzZTtcbiAgICBfdGhpcy5fbGF0ZXN0S25vd25TY3JvbGxZID0gMDtcblxuICAgIF90aGlzLnNjcm9sbExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX2xhdGVzdEtub3duU2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZO1xuXG4gICAgICBpZiAoIV90aGlzLl9pc1RpY2tpbmcpIHtcbiAgICAgICAgX3RoaXMuX2lzVGlja2luZyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5fc2F2ZVNjcm9sbC5iaW5kKCgwLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkMi5kZWZhdWx0KShfdGhpcykpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMud2luZG93U2Nyb2xsID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBwcmV2UHJvcHMpIHtcbiAgICAgIGlmIChfdGhpcy5zaG91bGRVcGRhdGVTY3JvbGwocHJldlByb3BzLCBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2Nyb2xsVG9IYXNoID0gZnVuY3Rpb24gKGhhc2gsIHByZXZQcm9wcykge1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoLnN1YnN0cmluZygxKSk7XG5cbiAgICAgIGlmIChub2RlICYmIF90aGlzLnNob3VsZFVwZGF0ZVNjcm9sbChwcmV2UHJvcHMsIF90aGlzLnByb3BzKSkge1xuICAgICAgICBub2RlLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNob3VsZFVwZGF0ZVNjcm9sbCA9IGZ1bmN0aW9uIChwcmV2Um91dGVyUHJvcHMsIHJvdXRlclByb3BzKSB7XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlU2Nyb2xsID0gX3RoaXMucHJvcHMuc2hvdWxkVXBkYXRlU2Nyb2xsO1xuXG4gICAgICBpZiAoIXNob3VsZFVwZGF0ZVNjcm9sbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gSGFjayB0byBhbGxvdyBhY2Nlc3NpbmcgdGhpcy5fc3RhdGVTdG9yYWdlLlxuXG5cbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGVTY3JvbGwuY2FsbCgoMCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZDIuZGVmYXVsdCkoX3RoaXMpLCBwcmV2Um91dGVyUHJvcHMsIHJvdXRlclByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNjcm9sbEhhbmRsZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5fc2F2ZVNjcm9sbCA9IGZ1bmN0aW9uIF9zYXZlU2Nyb2xsKCkge1xuICAgIHZhciBrZXkgPSB0aGlzLnByb3BzLmxvY2F0aW9uLmtleSB8fCBudWxsO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgdGhpcy5fc3RhdGVTdG9yYWdlLnNhdmUodGhpcy5wcm9wcy5sb2NhdGlvbiwga2V5LCB0aGlzLl9sYXRlc3RLbm93blNjcm9sbFkpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzVGlja2luZyA9IGZhbHNlO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xuICAgIHZhciBzY3JvbGxQb3NpdGlvbjtcbiAgICB2YXIgX3RoaXMkcHJvcHMkbG9jYXRpb24gPSB0aGlzLnByb3BzLmxvY2F0aW9uLFxuICAgICAgICBrZXkgPSBfdGhpcyRwcm9wcyRsb2NhdGlvbi5rZXksXG4gICAgICAgIGhhc2ggPSBfdGhpcyRwcm9wcyRsb2NhdGlvbi5oYXNoO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLl9zdGF0ZVN0b3JhZ2UucmVhZCh0aGlzLnByb3BzLmxvY2F0aW9uLCBrZXkpO1xuICAgIH1cblxuICAgIGlmIChzY3JvbGxQb3NpdGlvbikge1xuICAgICAgdGhpcy53aW5kb3dTY3JvbGwoc2Nyb2xsUG9zaXRpb24sIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmIChoYXNoKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvSGFzaChkZWNvZGVVUkkoaGFzaCksIHVuZGVmaW5lZCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuc2Nyb2xsTGlzdGVuZXIpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgdmFyIF90aGlzJHByb3BzJGxvY2F0aW9uMiA9IHRoaXMucHJvcHMubG9jYXRpb24sXG4gICAgICAgIGhhc2ggPSBfdGhpcyRwcm9wcyRsb2NhdGlvbjIuaGFzaCxcbiAgICAgICAga2V5ID0gX3RoaXMkcHJvcHMkbG9jYXRpb24yLmtleTtcbiAgICB2YXIgc2Nyb2xsUG9zaXRpb247XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3N0YXRlU3RvcmFnZS5yZWFkKHRoaXMucHJvcHMubG9jYXRpb24sIGtleSk7XG4gICAgfVxuICAgIC8qKiAgVGhlcmUgYXJlIHR3byBwaWVjZXMgb2Ygc3RhdGU6IHRoZSBicm93c2VyIHVybCBhbmRcbiAgICAgKiBoaXN0b3J5IHN0YXRlIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHNjcm9sbCBwb3NpdGlvblxuICAgICAqIE5hdGl2ZSBiZWhhdmlvdXIgcHJlc2NyaWJlcyB0aGF0IHdlIG91Z2h0IHRvIHJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICogd2hlbiBhIHVzZXIgbmF2aWdhdGVzIGJhY2sgaW4gdGhlaXIgYnJvd3NlciAodGhpcyBpcyB0aGUgYFBPUGAgYWN0aW9uKVxuICAgICAqIEN1cnJlbnRseSwgcmVhY2ggcm91dGVyIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHRoaXMgYXQgaHR0cHM6Ly9naXRodWIuY29tL3JlYWNoL3JvdXRlci9pc3N1ZXMvMjI4XG4gICAgICogU28gd2UgX2Fsd2F5c18gc3RpY2sgdG8gdGhlIHVybCBhcyBhIHNvdXJjZSBvZiB0cnV0aCDigJQgaWYgdGhlIHVybFxuICAgICAqIGNvbnRhaW5zIGEgaGFzaCwgd2Ugc2Nyb2xsIHRvIGl0XG4gICAgICovXG5cblxuICAgIGlmIChoYXNoKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvSGFzaChkZWNvZGVVUkkoaGFzaCksIHByZXZQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2luZG93U2Nyb2xsKHNjcm9sbFBvc2l0aW9uLCBwcmV2UHJvcHMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogdGhpcy5fc3RhdGVTdG9yYWdlXG4gICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbik7XG4gIH07XG5cbiAgcmV0dXJuIFNjcm9sbEhhbmRsZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuU2Nyb2xsSGFuZGxlciA9IFNjcm9sbEhhbmRsZXI7XG5TY3JvbGxIYW5kbGVyLnByb3BUeXBlcyA9IHtcbiAgc2hvdWxkVXBkYXRlU2Nyb2xsOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMuZGVmYXVsdC5lbGVtZW50LmlzUmVxdWlyZWQsXG4gIGxvY2F0aW9uOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0LmlzUmVxdWlyZWRcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1432\n')},1142:function(__unused_webpack_module,exports){"use strict";eval('\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = "@@scroll|";\nvar GATSBY_ROUTER_SCROLL_STATE = "___GATSBY_REACT_ROUTER_SCROLL";\n\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n\n var _proto = SessionStorage.prototype;\n\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (false) {}\n\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n\n return 0;\n }\n };\n\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n\n if (false) {}\n }\n };\n\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = "" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === "undefined" ? stateKeyBase : stateKeyBase + "|" + key;\n };\n\n return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC9zZXNzaW9uLXN0b3JhZ2UuanM/ZmUxNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0I7QUFDbEIsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxVQUFVLEtBQXFDLEVBQUUsRUFFMUM7O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQXFDLEVBQUUsRUFFMUM7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxzQkFBc0IiLCJmaWxlIjoiMTE0Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5TZXNzaW9uU3RvcmFnZSA9IHZvaWQgMDtcbnZhciBTVEFURV9LRVlfUFJFRklYID0gXCJAQHNjcm9sbHxcIjtcbnZhciBHQVRTQllfUk9VVEVSX1NDUk9MTF9TVEFURSA9IFwiX19fR0FUU0JZX1JFQUNUX1JPVVRFUl9TQ1JPTExcIjtcblxudmFyIFNlc3Npb25TdG9yYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2Vzc2lvblN0b3JhZ2UoKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBTZXNzaW9uU3RvcmFnZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlYWQgPSBmdW5jdGlvbiByZWFkKGxvY2F0aW9uLCBrZXkpIHtcbiAgICB2YXIgc3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KGxvY2F0aW9uLCBrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciB2YWx1ZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHN0YXRlS2V5KTtcbiAgICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogMDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbF0gVW5hYmxlIHRvIGFjY2VzcyBzZXNzaW9uU3RvcmFnZTsgc2Vzc2lvblN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSAmJiB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSkge1xuICAgICAgICByZXR1cm4gd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXVtzdGF0ZUtleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2F2ZSA9IGZ1bmN0aW9uIHNhdmUobG9jYXRpb24sIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGVLZXkgPSB0aGlzLmdldFN0YXRlS2V5KGxvY2F0aW9uLCBrZXkpO1xuICAgIHZhciBzdG9yZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICAgIHRyeSB7XG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShzdGF0ZUtleSwgc3RvcmVkVmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSkge1xuICAgICAgICB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93W0dBVFNCWV9ST1VURVJfU0NST0xMX1NUQVRFXSA9IHt9O1xuICAgICAgICB3aW5kb3dbR0FUU0JZX1JPVVRFUl9TQ1JPTExfU1RBVEVdW3N0YXRlS2V5XSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbF0gVW5hYmxlIHRvIHNhdmUgc3RhdGUgaW4gc2Vzc2lvblN0b3JhZ2U7IHNlc3Npb25TdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0U3RhdGVLZXkgPSBmdW5jdGlvbiBnZXRTdGF0ZUtleShsb2NhdGlvbiwga2V5KSB7XG4gICAgdmFyIHN0YXRlS2V5QmFzZSA9IFwiXCIgKyBTVEFURV9LRVlfUFJFRklYICsgbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgcmV0dXJuIGtleSA9PT0gbnVsbCB8fCB0eXBlb2Yga2V5ID09PSBcInVuZGVmaW5lZFwiID8gc3RhdGVLZXlCYXNlIDogc3RhdGVLZXlCYXNlICsgXCJ8XCIgKyBrZXk7XG4gIH07XG5cbiAgcmV0dXJuIFNlc3Npb25TdG9yYWdlO1xufSgpO1xuXG5leHBvcnRzLlNlc3Npb25TdG9yYWdlID0gU2Vzc2lvblN0b3JhZ2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1142\n')},4855:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = __webpack_require__(1432);\n\nvar _react = __webpack_require__(7294);\n\nvar _reachRouter = __webpack_require__(9499);\n\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbC91c2Utc2Nyb2xsLXJlc3RvcmF0aW9uLmpzP2RlZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCO0FBQ2xCLDRCQUE0Qjs7QUFFNUIscUJBQXFCLG1CQUFPLENBQUMsSUFBa0I7O0FBRS9DLGFBQWEsbUJBQU8sQ0FBQyxJQUFPOztBQUU1QixtQkFBbUIsbUJBQU8sQ0FBQyxJQUF3Qjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0ODU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnVzZVNjcm9sbFJlc3RvcmF0aW9uID0gdXNlU2Nyb2xsUmVzdG9yYXRpb247XG5cbnZhciBfc2Nyb2xsSGFuZGxlciA9IHJlcXVpcmUoXCIuL3Njcm9sbC1oYW5kbGVyXCIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3JlYWNoUm91dGVyID0gcmVxdWlyZShcIkBnYXRzYnlqcy9yZWFjaC1yb3V0ZXJcIik7XG5cbmZ1bmN0aW9uIHVzZVNjcm9sbFJlc3RvcmF0aW9uKGlkZW50aWZpZXIpIHtcbiAgdmFyIGxvY2F0aW9uID0gKDAsIF9yZWFjaFJvdXRlci51c2VMb2NhdGlvbikoKTtcbiAgdmFyIHN0YXRlID0gKDAsIF9yZWFjdC51c2VDb250ZXh0KShfc2Nyb2xsSGFuZGxlci5TY3JvbGxDb250ZXh0KTtcbiAgdmFyIHJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShudWxsKTtcbiAgKDAsIF9yZWFjdC51c2VMYXlvdXRFZmZlY3QpKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IHN0YXRlLnJlYWQobG9jYXRpb24sIGlkZW50aWZpZXIpO1xuICAgICAgcmVmLmN1cnJlbnQuc2Nyb2xsVG8oMCwgcG9zaXRpb24gfHwgMCk7XG4gICAgfVxuICB9LCBbbG9jYXRpb24ua2V5XSk7XG4gIHJldHVybiB7XG4gICAgcmVmOiByZWYsXG4gICAgb25TY3JvbGw6IGZ1bmN0aW9uIG9uU2Nyb2xsKCkge1xuICAgICAgaWYgKHJlZi5jdXJyZW50KSB7XG4gICAgICAgIHN0YXRlLnNhdmUobG9jYXRpb24sIGlkZW50aWZpZXIsIHJlZi5jdXJyZW50LnNjcm9sbFRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4855\n")},4999:function(__unused_webpack_module,exports,__webpack_require__){eval('// prefer default export if available\nvar preferDefault=function preferDefault(m){return m&&m.default||m;};exports.components={"component---src-pages-404-tsx":function componentSrcPages404Tsx(){return Promise.all(/* import() | component---src-pages-404-tsx */[__webpack_require__.e(30), __webpack_require__.e(351), __webpack_require__.e(218)]).then(__webpack_require__.bind(__webpack_require__, 9458));},"component---src-pages-cejst-tsx":function componentSrcPagesCejstTsx(){return Promise.all(/* import() | component---src-pages-cejst-tsx */[__webpack_require__.e(532), __webpack_require__.e(30), __webpack_require__.e(644), __webpack_require__.e(351), __webpack_require__.e(281)]).then(__webpack_require__.bind(__webpack_require__, 1317));},"component---src-pages-contact-tsx":function componentSrcPagesContactTsx(){return Promise.all(/* import() | component---src-pages-contact-tsx */[__webpack_require__.e(532), __webpack_require__.e(30), __webpack_require__.e(351), __webpack_require__.e(650)]).then(__webpack_require__.bind(__webpack_require__, 440));},"component---src-pages-index-tsx":function componentSrcPagesIndexTsx(){return Promise.all(/* import() | component---src-pages-index-tsx */[__webpack_require__.e(532), __webpack_require__.e(30), __webpack_require__.e(351), __webpack_require__.e(691)]).then(__webpack_require__.bind(__webpack_require__, 9697));},"component---src-pages-methodology-tsx":function componentSrcPagesMethodologyTsx(){return Promise.all(/* import() | component---src-pages-methodology-tsx */[__webpack_require__.e(532), __webpack_require__.e(30), __webpack_require__.e(351), __webpack_require__.e(647)]).then(__webpack_require__.bind(__webpack_require__, 1095));}};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9fdGhpc19pc192aXJ0dWFsX2ZzX3BhdGhfLyR2aXJ0dWFsL2FzeW5jLXJlcXVpcmVzLmpzPzM2YzEiXSwibmFtZXMiOlsicHJlZmVyRGVmYXVsdCIsIm0iLCJkZWZhdWx0IiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxHQUFNQSxjQUFhLENBQUcsUUFBaEJBLGNBQWdCLENBQUFDLENBQUMsUUFBS0EsRUFBQyxFQUFJQSxDQUFDLENBQUNDLE9BQVIsRUFBb0JELENBQXhCLEVBQXZCLENBRUFFLGtCQUFBLENBQXFCLENBQ25CLGdDQUFpQyx5Q0FBTSx5TUFBTixFQURkLENBRW5CLGtDQUFtQywyQ0FBTSxtUUFBTixFQUZoQixDQUduQixvQ0FBcUMsNkNBQU0sd09BQU4sRUFIbEIsQ0FJbkIsa0NBQW1DLDJDQUFNLHVPQUFOLEVBSmhCLENBS25CLHdDQUF5QyxpREFBTSw2T0FBTixFQUx0QixDQUFyQiIsImZpbGUiOiI0OTk5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHJlZmVyIGRlZmF1bHQgZXhwb3J0IGlmIGF2YWlsYWJsZVxuY29uc3QgcHJlZmVyRGVmYXVsdCA9IG0gPT4gKG0gJiYgbS5kZWZhdWx0KSB8fCBtXG5cbmV4cG9ydHMuY29tcG9uZW50cyA9IHtcbiAgXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtNDA0LXRzeFwiOiAoKSA9PiBpbXBvcnQoXCIuLy4uLy4uLy4uL3NyYy9wYWdlcy80MDQudHN4XCIgLyogd2VicGFja0NodW5rTmFtZTogXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtNDA0LXRzeFwiICovKSxcbiAgXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtY2Vqc3QtdHN4XCI6ICgpID0+IGltcG9ydChcIi4vLi4vLi4vLi4vc3JjL3BhZ2VzL2NlanN0LnRzeFwiIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiY29tcG9uZW50LS0tc3JjLXBhZ2VzLWNlanN0LXRzeFwiICovKSxcbiAgXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtY29udGFjdC10c3hcIjogKCkgPT4gaW1wb3J0KFwiLi8uLi8uLi8uLi9zcmMvcGFnZXMvY29udGFjdC50c3hcIiAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImNvbXBvbmVudC0tLXNyYy1wYWdlcy1jb250YWN0LXRzeFwiICovKSxcbiAgXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtaW5kZXgtdHN4XCI6ICgpID0+IGltcG9ydChcIi4vLi4vLi4vLi4vc3JjL3BhZ2VzL2luZGV4LnRzeFwiIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiY29tcG9uZW50LS0tc3JjLXBhZ2VzLWluZGV4LXRzeFwiICovKSxcbiAgXCJjb21wb25lbnQtLS1zcmMtcGFnZXMtbWV0aG9kb2xvZ3ktdHN4XCI6ICgpID0+IGltcG9ydChcIi4vLi4vLi4vLi4vc3JjL3BhZ2VzL21ldGhvZG9sb2d5LnRzeFwiIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiY29tcG9uZW50LS0tc3JjLXBhZ2VzLW1ldGhvZG9sb2d5LXRzeFwiICovKVxufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4999\n')},5182:function(module,__unused_webpack_exports,__webpack_require__){eval('module.exports=[{plugin:__webpack_require__(5526),options:{"plugins":[],"path":"/home/runner/work/justice40-tool/justice40-tool/client/src/intl","languages":["en","es"],"defaultLanguage":"en","redirect":true}},{plugin:__webpack_require__(6101),options:{"plugins":[],"dsn":"https://da0c28c22c9e4ff69d81650cabdec3d9@o1022662.ingest.sentry.io/5989007","sampleRate":0.7}},{plugin:__webpack_require__(9037),options:{"plugins":[]}}];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9hcGktcnVubmVyLWJyb3dzZXItcGx1Z2lucy5qcz8yZGUyIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJwbHVnaW4iLCJyZXF1aXJlIiwib3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFpQixDQUFDLENBQ1pDLE1BQU0sQ0FBRUMsbUJBQU8sQ0FBQyxJQUFELENBREgsQ0FFWkMsT0FBTyxDQUFFLENBQUMsVUFBVSxFQUFYLENBQWMsT0FBTyxpRUFBckIsQ0FBdUYsWUFBWSxDQUFDLElBQUQsQ0FBTSxJQUFOLENBQW5HLENBQStHLGtCQUFrQixJQUFqSSxDQUFzSSxXQUFXLElBQWpKLENBRkcsQ0FBRCxDQUdYLENBQ0FGLE1BQU0sQ0FBRUMsbUJBQU8sQ0FBQyxJQUFELENBRGYsQ0FFQUMsT0FBTyxDQUFFLENBQUMsVUFBVSxFQUFYLENBQWMsTUFBTSw0RUFBcEIsQ0FBaUcsYUFBYSxHQUE5RyxDQUZULENBSFcsQ0FNWCxDQUNBRixNQUFNLENBQUVDLG1CQUFPLENBQUMsSUFBRCxDQURmLENBRUFDLE9BQU8sQ0FBRSxDQUFDLFVBQVUsRUFBWCxDQUZULENBTlcsQ0FBakIiLCJmaWxlIjoiNTE4Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gW3tcbiAgICAgIHBsdWdpbjogcmVxdWlyZSgnLi4vbm9kZV9tb2R1bGVzL2dhdHNieS1wbHVnaW4taW50bC9nYXRzYnktYnJvd3Nlci5qcycpLFxuICAgICAgb3B0aW9uczoge1wicGx1Z2luc1wiOltdLFwicGF0aFwiOlwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L3NyYy9pbnRsXCIsXCJsYW5ndWFnZXNcIjpbXCJlblwiLFwiZXNcIl0sXCJkZWZhdWx0TGFuZ3VhZ2VcIjpcImVuXCIsXCJyZWRpcmVjdFwiOnRydWV9LFxuICAgIH0se1xuICAgICAgcGx1Z2luOiByZXF1aXJlKCcuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9nYXRzYnkvZ2F0c2J5LWJyb3dzZXIuanMnKSxcbiAgICAgIG9wdGlvbnM6IHtcInBsdWdpbnNcIjpbXSxcImRzblwiOlwiaHR0cHM6Ly9kYTBjMjhjMjJjOWU0ZmY2OWQ4MTY1MGNhYmRlYzNkOUBvMTAyMjY2Mi5pbmdlc3Quc2VudHJ5LmlvLzU5ODkwMDdcIixcInNhbXBsZVJhdGVcIjowLjd9LFxuICAgIH0se1xuICAgICAgcGx1Z2luOiByZXF1aXJlKCcuLi9nYXRzYnktYnJvd3Nlci5qcycpLFxuICAgICAgb3B0aW9uczoge1wicGx1Z2luc1wiOltdfSxcbiAgICB9XVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5182\n')},7343:function(__unused_webpack_module,exports,__webpack_require__){eval('var plugins=__webpack_require__(5182);var _require$publicLoader=__webpack_require__(8741)/* .publicLoader */ .jN,getResourceURLsForPathname=_require$publicLoader.getResourceURLsForPathname,loadPage=_require$publicLoader.loadPage,loadPageSync=_require$publicLoader.loadPageSync;exports.h=function(api,args,defaultReturn,argTransform){if(args===void 0){args={};}// Hooks for gatsby-cypress\'s API handler\nif(undefined){if(window.___apiHandler){window.___apiHandler(api);}else if(window.___resolvedAPIs){window.___resolvedAPIs.push(api);}else{window.___resolvedAPIs=[api];}}var results=plugins.map(function(plugin){if(!plugin.plugin[api]){return undefined;}args.getResourceURLsForPathname=getResourceURLsForPathname;args.loadPage=loadPage;args.loadPageSync=loadPageSync;var result=plugin.plugin[api](args,plugin.options);if(result&&argTransform){args=argTransform({args:args,result:result,plugin:plugin});}return result;});// Filter out undefined results.\nresults=results.filter(function(result){return typeof result!=="undefined";});if(results.length>0){return results;}else if(defaultReturn){return[defaultReturn];}else{return[];}};exports.I=function(api,args,defaultReturn){return plugins.reduce(function(previous,next){return next.plugin[api]?previous.then(function(){return next.plugin[api](args,next.options);}):previous;},Promise.resolve());};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9hcGktcnVubmVyLWJyb3dzZXIuanM/YzZkYiJdLCJuYW1lcyI6WyJwbHVnaW5zIiwicmVxdWlyZSIsImdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lIiwibG9hZFBhZ2UiLCJsb2FkUGFnZVN5bmMiLCJleHBvcnRzIiwiYXBpIiwiYXJncyIsImRlZmF1bHRSZXR1cm4iLCJhcmdUcmFuc2Zvcm0iLCJwcm9jZXNzIiwid2luZG93IiwiX19fYXBpSGFuZGxlciIsIl9fX3Jlc29sdmVkQVBJcyIsInB1c2giLCJyZXN1bHRzIiwibWFwIiwicGx1Z2luIiwidW5kZWZpbmVkIiwicmVzdWx0Iiwib3B0aW9ucyIsImZpbHRlciIsImxlbmd0aCIsInJlZHVjZSIsInByZXZpb3VzIiwibmV4dCIsInRoZW4iLCJQcm9taXNlIiwicmVzb2x2ZSJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBTUEsUUFBTyxDQUFHQyxtQkFBTyxDQUFDLEtBQXhCLENBQ0EsMEJBSUlBLGdEQUpKLENBQ0VDLDBCQURGLHVCQUNFQSwwQkFERixDQUVFQyxRQUZGLHVCQUVFQSxRQUZGLENBR0VDLFlBSEYsdUJBR0VBLFlBSEYsQ0FNQUMsU0FBQSxDQUFvQixTQUFDQyxHQUFELENBQU1DLElBQU4sQ0FBaUJDLGFBQWpCLENBQWdDQyxZQUFoQyxDQUFpRCxJQUEzQ0YsSUFBMkMsV0FBM0NBLElBQTJDLENBQXBDLEVBQW9DLEVBQ25FO0FBQ0EsR0FBSUcsU0FBSixDQUFpQyxDQUMvQixHQUFJQyxNQUFNLENBQUNDLGFBQVgsQ0FBMEIsQ0FDeEJELE1BQU0sQ0FBQ0MsYUFBUCxDQUFxQk4sR0FBckIsRUFDRCxDQUZELElBRU8sSUFBSUssTUFBTSxDQUFDRSxlQUFYLENBQTRCLENBQ2pDRixNQUFNLENBQUNFLGVBQVAsQ0FBdUJDLElBQXZCLENBQTRCUixHQUE1QixFQUNELENBRk0sSUFFQSxDQUNMSyxNQUFNLENBQUNFLGVBQVAsQ0FBeUIsQ0FBQ1AsR0FBRCxDQUF6QixDQUNELENBQ0YsQ0FFRCxHQUFJUyxRQUFPLENBQUdmLE9BQU8sQ0FBQ2dCLEdBQVIsQ0FBWSxTQUFBQyxNQUFNLENBQUksQ0FDbEMsR0FBSSxDQUFDQSxNQUFNLENBQUNBLE1BQVAsQ0FBY1gsR0FBZCxDQUFMLENBQXlCLENBQ3ZCLE1BQU9ZLFVBQVAsQ0FDRCxDQUVEWCxJQUFJLENBQUNMLDBCQUFMLENBQWtDQSwwQkFBbEMsQ0FDQUssSUFBSSxDQUFDSixRQUFMLENBQWdCQSxRQUFoQixDQUNBSSxJQUFJLENBQUNILFlBQUwsQ0FBb0JBLFlBQXBCLENBRUEsR0FBTWUsT0FBTSxDQUFHRixNQUFNLENBQUNBLE1BQVAsQ0FBY1gsR0FBZCxFQUFtQkMsSUFBbkIsQ0FBeUJVLE1BQU0sQ0FBQ0csT0FBaEMsQ0FBZixDQUNBLEdBQUlELE1BQU0sRUFBSVYsWUFBZCxDQUE0QixDQUMxQkYsSUFBSSxDQUFHRSxZQUFZLENBQUMsQ0FBRUYsSUFBSSxDQUFKQSxJQUFGLENBQVFZLE1BQU0sQ0FBTkEsTUFBUixDQUFnQkYsTUFBTSxDQUFOQSxNQUFoQixDQUFELENBQW5CLENBQ0QsQ0FDRCxNQUFPRSxPQUFQLENBQ0QsQ0FkYSxDQUFkLENBZ0JBO0FBQ0FKLE9BQU8sQ0FBR0EsT0FBTyxDQUFDTSxNQUFSLENBQWUsU0FBQUYsTUFBTSxRQUFJLE9BQU9BLE9BQVAsY0FBSixFQUFyQixDQUFWLENBRUEsR0FBSUosT0FBTyxDQUFDTyxNQUFSLENBQWlCLENBQXJCLENBQXdCLENBQ3RCLE1BQU9QLFFBQVAsQ0FDRCxDQUZELElBRU8sSUFBSVAsYUFBSixDQUFtQixDQUN4QixNQUFPLENBQUNBLGFBQUQsQ0FBUCxDQUNELENBRk0sSUFFQSxDQUNMLE1BQU8sRUFBUCxDQUNELENBQ0YsQ0F0Q0QsQ0F3Q0FILFNBQUEsQ0FBeUIsU0FBQ0MsR0FBRCxDQUFNQyxJQUFOLENBQVlDLGFBQVosUUFDdkJSLFFBQU8sQ0FBQ3VCLE1BQVIsQ0FDRSxTQUFDQyxRQUFELENBQVdDLElBQVgsUUFDRUEsS0FBSSxDQUFDUixNQUFMLENBQVlYLEdBQVosRUFDSWtCLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjLGlCQUFNRCxLQUFJLENBQUNSLE1BQUwsQ0FBWVgsR0FBWixFQUFpQkMsSUFBakIsQ0FBdUJrQixJQUFJLENBQUNMLE9BQTVCLENBQU4sRUFBZCxDQURKLENBRUlJLFFBSE4sRUFERixDQUtFRyxPQUFPLENBQUNDLE9BQVIsRUFMRixDQUR1QixFQUF6QiIsImZpbGUiOiI3MzQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGx1Z2lucyA9IHJlcXVpcmUoYC4vYXBpLXJ1bm5lci1icm93c2VyLXBsdWdpbnNgKVxuY29uc3Qge1xuICBnZXRSZXNvdXJjZVVSTHNGb3JQYXRobmFtZSxcbiAgbG9hZFBhZ2UsXG4gIGxvYWRQYWdlU3luYyxcbn0gPSByZXF1aXJlKGAuL2xvYWRlcmApLnB1YmxpY0xvYWRlclxuXG5leHBvcnRzLmFwaVJ1bm5lciA9IChhcGksIGFyZ3MgPSB7fSwgZGVmYXVsdFJldHVybiwgYXJnVHJhbnNmb3JtKSA9PiB7XG4gIC8vIEhvb2tzIGZvciBnYXRzYnktY3lwcmVzcydzIEFQSSBoYW5kbGVyXG4gIGlmIChwcm9jZXNzLmVudi5DWVBSRVNTX1NVUFBPUlQpIHtcbiAgICBpZiAod2luZG93Ll9fX2FwaUhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5fX19hcGlIYW5kbGVyKGFwaSlcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5fX19yZXNvbHZlZEFQSXMpIHtcbiAgICAgIHdpbmRvdy5fX19yZXNvbHZlZEFQSXMucHVzaChhcGkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5fX19yZXNvbHZlZEFQSXMgPSBbYXBpXVxuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHRzID0gcGx1Z2lucy5tYXAocGx1Z2luID0+IHtcbiAgICBpZiAoIXBsdWdpbi5wbHVnaW5bYXBpXSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFyZ3MuZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUgPSBnZXRSZXNvdXJjZVVSTHNGb3JQYXRobmFtZVxuICAgIGFyZ3MubG9hZFBhZ2UgPSBsb2FkUGFnZVxuICAgIGFyZ3MubG9hZFBhZ2VTeW5jID0gbG9hZFBhZ2VTeW5jXG5cbiAgICBjb25zdCByZXN1bHQgPSBwbHVnaW4ucGx1Z2luW2FwaV0oYXJncywgcGx1Z2luLm9wdGlvbnMpXG4gICAgaWYgKHJlc3VsdCAmJiBhcmdUcmFuc2Zvcm0pIHtcbiAgICAgIGFyZ3MgPSBhcmdUcmFuc2Zvcm0oeyBhcmdzLCByZXN1bHQsIHBsdWdpbiB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5cbiAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgcmVzdWx0cy5cbiAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKHJlc3VsdCA9PiB0eXBlb2YgcmVzdWx0ICE9PSBgdW5kZWZpbmVkYClcblxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfSBlbHNlIGlmIChkZWZhdWx0UmV0dXJuKSB7XG4gICAgcmV0dXJuIFtkZWZhdWx0UmV0dXJuXVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydHMuYXBpUnVubmVyQXN5bmMgPSAoYXBpLCBhcmdzLCBkZWZhdWx0UmV0dXJuKSA9PlxuICBwbHVnaW5zLnJlZHVjZShcbiAgICAocHJldmlvdXMsIG5leHQpID0+XG4gICAgICBuZXh0LnBsdWdpblthcGldXG4gICAgICAgID8gcHJldmlvdXMudGhlbigoKSA9PiBuZXh0LnBsdWdpblthcGldKGFyZ3MsIG5leHQub3B0aW9ucykpXG4gICAgICAgIDogcHJldmlvdXMsXG4gICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgKVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7343\n')},8110:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ _cache_emitter; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/mitt/dist/mitt.es.js\n// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `"*"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `"*"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `"*"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all[\'*\'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\n/* harmony default export */ var mitt_es = (mitt);\n//# sourceMappingURL=mitt.es.js.map\n\n;// CONCATENATED MODULE: ./.cache/emitter.js\nvar emitter=mitt_es();/* harmony default export */ var _cache_emitter = (emitter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5lcy5qcz8xNGI3Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL2VtaXR0ZXIuanM/ZTcyYSJdLCJuYW1lcyI6WyJlbWl0dGVyIiwibWl0dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7OztBQUlBOzs7QUFHQTs7Ozs7O0FBTUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxJQUFJO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxjQUFjLEVBQUU7QUFDckUsb0RBQW9ELG9CQUFvQixFQUFFO0FBQzFFO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBZSxJQUFJLEVBQUM7QUFDcEI7OztBQzdEQSxHQUFNQSxRQUFPLENBQUdDLE9BQUksRUFBcEIsQ0FDQSxtREFBZUQsT0FBZiIsImZpbGUiOiI4MTEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gICAgICBcbi8vIEFuIGV2ZW50IGhhbmRsZXIgY2FuIHRha2UgYW4gb3B0aW9uYWwgZXZlbnQgYXJndW1lbnRcbi8vIGFuZCBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBBbiBhcnJheSBvZiBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlcnMgZm9yIGEgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuLy8gQSBtYXAgb2YgZXZlbnQgdHlwZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKiBNaXR0OiBUaW55ICh+MjAwYikgZnVuY3Rpb25hbCBldmVudCBlbWl0dGVyIC8gcHVic3ViLlxuICogIEBuYW1lIG1pdHRcbiAqICBAcmV0dXJucyB7TWl0dH1cbiAqL1xuZnVuY3Rpb24gbWl0dChhbGwgICAgICAgICAgICAgICAgICkge1xuXHRhbGwgPSBhbGwgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHRyZXR1cm4ge1xuXHRcdC8qKlxuXHRcdCAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXHRUeXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IsIG9yIGBcIipcImAgZm9yIGFsbCBldmVudHNcblx0XHQgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGluIHJlc3BvbnNlIHRvIGdpdmVuIGV2ZW50XG5cdFx0ICogQG1lbWJlck9mIG1pdHRcblx0XHQgKi9cblx0XHRvbjogZnVuY3Rpb24gb24odHlwZSAgICAgICAgLCBoYW5kbGVyICAgICAgICAgICAgICApIHtcblx0XHRcdChhbGxbdHlwZV0gfHwgKGFsbFt0eXBlXSA9IFtdKSkucHVzaChoYW5kbGVyKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXHRUeXBlIG9mIGV2ZW50IHRvIHVucmVnaXN0ZXIgYGhhbmRsZXJgIGZyb20sIG9yIGBcIipcImBcblx0XHQgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlciBIYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0b2ZmOiBmdW5jdGlvbiBvZmYodHlwZSAgICAgICAgLCBoYW5kbGVyICAgICAgICAgICAgICApIHtcblx0XHRcdGlmIChhbGxbdHlwZV0pIHtcblx0XHRcdFx0YWxsW3R5cGVdLnNwbGljZShhbGxbdHlwZV0uaW5kZXhPZihoYW5kbGVyKSA+Pj4gMCwgMSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZSBhbGwgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuXHRcdCAqIElmIHByZXNlbnQsIGBcIipcImAgaGFuZGxlcnMgYXJlIGludm9rZWQgYWZ0ZXIgdHlwZS1tYXRjaGVkIGhhbmRsZXJzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgIFRoZSBldmVudCB0eXBlIHRvIGludm9rZVxuXHRcdCAqIEBwYXJhbSB7QW55fSBbZXZ0XSAgQW55IHZhbHVlIChvYmplY3QgaXMgcmVjb21tZW5kZWQgYW5kIHBvd2VyZnVsKSwgcGFzc2VkIHRvIGVhY2ggaGFuZGxlclxuXHRcdCAqIEBtZW1iZXJPZiBtaXR0XG5cdFx0ICovXG5cdFx0ZW1pdDogZnVuY3Rpb24gZW1pdCh0eXBlICAgICAgICAsIGV2dCAgICAgKSB7XG5cdFx0XHQoYWxsW3R5cGVdIHx8IFtdKS5zbGljZSgpLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyBoYW5kbGVyKGV2dCk7IH0pO1xuXHRcdFx0KGFsbFsnKiddIHx8IFtdKS5zbGljZSgpLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyBoYW5kbGVyKHR5cGUsIGV2dCk7IH0pO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWl0dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pdHQuZXMuanMubWFwXG4iLCJpbXBvcnQgbWl0dCBmcm9tIFwibWl0dFwiXG5cbmNvbnN0IGVtaXR0ZXIgPSBtaXR0KClcbmV4cG9ydCBkZWZhdWx0IGVtaXR0ZXJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8110\n')},2257:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "UD": function() { return /* binding */ findMatchPath; },\n "Cj": function() { return /* binding */ findPath; },\n "GA": function() { return /* binding */ grabMatchParams; },\n "DS": function() { return /* binding */ setMatchPaths; }\n});\n\n// UNUSED EXPORTS: cleanPath\n\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/lib/utils.js\nvar utils = __webpack_require__(2098);\n// EXTERNAL MODULE: ./.cache/strip-prefix.js\nvar strip_prefix = __webpack_require__(1578);\n;// CONCATENATED MODULE: ./.cache/normalize-page-path.js\n/* harmony default export */ var normalize_page_path = (function(path){if(path===undefined){return path;}if(path==="/"){return"/";}if(path.charAt(path.length-1)==="/"){return path.slice(0,-1);}return path;});\n// EXTERNAL MODULE: ./.cache/redirect-utils.js + 1 modules\nvar redirect_utils = __webpack_require__(5166);\n;// CONCATENATED MODULE: ./.cache/find-path.js\nvar pathCache=new Map();var matchPaths=[];var trimPathname=function trimPathname(rawPathname){var pathname=decodeURIComponent(rawPathname);// Remove the pathPrefix from the pathname.\nvar trimmedPathname=(0,strip_prefix/* default */.Z)(pathname,decodeURIComponent("/justice40-tool/803-0bf34ac"))// Remove any hashfragment\n.split("#")[0]// Remove search query\n.split("?")[0];return trimmedPathname;};function absolutify(path){// If it\'s already absolute, return as-is\nif(path.startsWith("/")||path.startsWith("https://")||path.startsWith("http://")){return path;}// Calculate path relative to current location, adding a trailing slash to\n// match behavior of @reach/router\nreturn new URL(path,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname;}/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */var setMatchPaths=function setMatchPaths(value){matchPaths=value;};/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */var findMatchPath=function findMatchPath(rawPathname){var trimmedPathname=cleanPath(rawPathname);var pickPaths=matchPaths.map(function(_ref){var path=_ref.path,matchPath=_ref.matchPath;return{path:matchPath,originalPath:path};});var path=(0,utils.pick)(pickPaths,trimmedPathname);if(path){return normalize_page_path(path.route.originalPath);}return null;};/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ ":bar/*foo" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */var grabMatchParams=function grabMatchParams(rawPathname){var trimmedPathname=cleanPath(rawPathname);var pickPaths=matchPaths.map(function(_ref2){var path=_ref2.path,matchPath=_ref2.matchPath;return{path:matchPath,originalPath:path};});var path=(0,utils.pick)(pickPaths,trimmedPathname);if(path){return path.params;}return{};};// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ "/foo*": "/page1", ...}`, then\n// `/foo?bar=far` => `/page1`\nvar findPath=function findPath(rawPathname){var trimmedPathname=trimPathname(absolutify(rawPathname));if(pathCache.has(trimmedPathname)){return pathCache.get(trimmedPathname);}var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(rawPathname);if(redirect){return findPath(redirect.toPath);}var foundPath=findMatchPath(trimmedPathname);if(!foundPath){foundPath=cleanPath(rawPathname);}pathCache.set(trimmedPathname,foundPath);return foundPath;};/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */var cleanPath=function cleanPath(rawPathname){var trimmedPathname=trimPathname(absolutify(rawPathname));var foundPath=trimmedPathname;if(foundPath==="/index.html"){foundPath="/";}foundPath=normalize_page_path(foundPath);return foundPath;};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9ub3JtYWxpemUtcGFnZS1wYXRoLmpzPzY3YjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi8uY2FjaGUvZmluZC1wYXRoLmpzP2RmNDQiXSwibmFtZXMiOlsicGF0aCIsInVuZGVmaW5lZCIsImNoYXJBdCIsImxlbmd0aCIsInNsaWNlIiwicGF0aENhY2hlIiwiTWFwIiwibWF0Y2hQYXRocyIsInRyaW1QYXRobmFtZSIsInJhd1BhdGhuYW1lIiwicGF0aG5hbWUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJ0cmltbWVkUGF0aG5hbWUiLCJzdHJpcFByZWZpeCIsIl9fQkFTRV9QQVRIX18iLCJzcGxpdCIsImFic29sdXRpZnkiLCJzdGFydHNXaXRoIiwiVVJMIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiZW5kc1dpdGgiLCJzZXRNYXRjaFBhdGhzIiwidmFsdWUiLCJmaW5kTWF0Y2hQYXRoIiwiY2xlYW5QYXRoIiwicGlja1BhdGhzIiwibWFwIiwibWF0Y2hQYXRoIiwib3JpZ2luYWxQYXRoIiwicGljayIsIm5vcm1hbGl6ZVBhZ2VQYXRoIiwicm91dGUiLCJncmFiTWF0Y2hQYXJhbXMiLCJwYXJhbXMiLCJmaW5kUGF0aCIsImhhcyIsImdldCIsInJlZGlyZWN0IiwibWF5YmVHZXRCcm93c2VyUmVkaXJlY3QiLCJ0b1BhdGgiLCJmb3VuZFBhdGgiLCJzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3REFBZSxTQUFBQSxJQUFJLENBQUksQ0FDckIsR0FBSUEsSUFBSSxHQUFLQyxTQUFiLENBQXdCLENBQ3RCLE1BQU9ELEtBQVAsQ0FDRCxDQUNELEdBQUlBLElBQUksTUFBUixDQUFrQixDQUNoQixVQUNELENBQ0QsR0FBSUEsSUFBSSxDQUFDRSxNQUFMLENBQVlGLElBQUksQ0FBQ0csTUFBTCxDQUFjLENBQTFCLE9BQUosQ0FBMEMsQ0FDeEMsTUFBT0gsS0FBSSxD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cG9ydCBkZWZhdWx0IHBhdGggPT4ge1xuICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuICBpZiAocGF0aCA9PT0gYC9gKSB7XG4gICAgcmV0dXJuIGAvYFxuICB9XG4gIGlmIChwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCAtIDEpID09PSBgL2ApIHtcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCAtMSlcbiAgfVxuICByZXR1cm4gcGF0aFxufVxuIiwiaW1wb3J0IHsgcGljayB9IGZyb20gXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyL2xpYi91dGlsc1wiXG5pbXBvcnQgc3RyaXBQcmVmaXggZnJvbSBcIi4vc3RyaXAtcHJlZml4XCJcbmltcG9ydCBub3JtYWxpemVQYWdlUGF0aCBmcm9tIFwiLi9ub3JtYWxpemUtcGFnZS1wYXRoXCJcbmltcG9ydCB7IG1heWJlR2V0QnJvd3NlclJlZGlyZWN0IH0gZnJvbSBcIi4vcmVkaXJlY3QtdXRpbHMuanNcIlxuXG5jb25zdCBwYXRoQ2FjaGUgPSBuZXcgTWFwKClcbmxldCBtYXRjaFBhdGhzID0gW11cblxuY29uc3QgdHJpbVBhdGhuYW1lID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCBwYXRobmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChyYXdQYXRobmFtZSlcbiAgLy8gUmVtb3ZlIHRoZSBwYXRoUHJlZml4IGZyb20gdGhlIHBhdGhuYW1lLlxuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSBzdHJpcFByZWZpeChcbiAgICBwYXRobmFtZSxcbiAgICBkZWNvZGVVUklDb21wb25lbnQoX19CQVNFX1BBVEhfXylcbiAgKVxuICAgIC8vIFJlbW92ZSBhbnkgaGFzaGZyYWdtZW50XG4gICAgLnNwbGl0KGAjYClbMF1cbiAgICAvLyBSZW1vdmUgc2VhcmNoIHF1ZXJ5XG4gICAgLnNwbGl0KGA/YClbMF1cblxuICByZXR1cm4gdHJpbW1lZFBhdGhuYW1lXG59XG5cbmZ1bmN0aW9uIGFic29sdXRpZnkocGF0aCkge1xuICAvLyBJZiBpdCdzIGFscmVhZHkgYWJzb2x1dGUsIHJldHVybiBhcy1pc1xuICBpZiAoXG4gICAgcGF0aC5zdGFydHNXaXRoKGAvYCkgfHxcbiAgICBwYXRoLnN0YXJ0c1dpdGgoYGh0dHBzOi8vYCkgfHxcbiAgICBwYXRoLnN0YXJ0c1dpdGgoYGh0dHA6Ly9gKVxuICApIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG4gIC8vIENhbGN1bGF0ZSBwYXRoIHJlbGF0aXZlIHRvIGN1cnJlbnQgbG9jYXRpb24sIGFkZGluZyBhIHRyYWlsaW5nIHNsYXNoIHRvXG4gIC8vIG1hdGNoIGJlaGF2aW9yIG9mIEByZWFjaC9yb3V0ZXJcbiAgcmV0dXJuIG5ldyBVUkwoXG4gICAgcGF0aCxcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiArICh3aW5kb3cubG9jYXRpb24uaHJlZi5lbmRzV2l0aChgL2ApID8gYGAgOiBgL2ApXG4gICkucGF0aG5hbWVcbn1cblxuLyoqXG4gKiBTZXQgbGlzdCBvZiBtYXRjaFBhdGhzXG4gKlxuICogQHBhcmFtIHtBcnJheTx7cGF0aDogc3RyaW5nLCBtYXRjaFBhdGg6IHN0cmluZ30+fSB2YWx1ZSBjb2xsZWN0aW9uIG9mIG1hdGNoUGF0aHNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hdGNoUGF0aHMgPSB2YWx1ZSA9PiB7XG4gIG1hdGNoUGF0aHMgPSB2YWx1ZVxufVxuXG4vKipcbiAqIFJldHVybiBhIG1hdGNocGF0aCB1cmxcbiAqIGlmIGBtYXRjaC1wYXRocy5qc29uYCBjb250YWlucyBgeyBcIi9mb28qXCI6IFwiL3BhZ2UxXCIsIC4uLn1gLCB0aGVuXG4gKiBgL2Zvbz9iYXI9ZmFyYCA9PiBgL3BhZ2UxYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdQYXRobmFtZSBBIHJhdyBwYXRobmFtZVxuICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gKi9cbmV4cG9ydCBjb25zdCBmaW5kTWF0Y2hQYXRoID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSBjbGVhblBhdGgocmF3UGF0aG5hbWUpXG5cbiAgY29uc3QgcGlja1BhdGhzID0gbWF0Y2hQYXRocy5tYXAoKHsgcGF0aCwgbWF0Y2hQYXRoIH0pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogbWF0Y2hQYXRoLFxuICAgICAgb3JpZ2luYWxQYXRoOiBwYXRoLFxuICAgIH1cbiAgfSlcblxuICBjb25zdCBwYXRoID0gcGljayhwaWNrUGF0aHMsIHRyaW1tZWRQYXRobmFtZSlcblxuICBpZiAocGF0aCkge1xuICAgIHJldHVybiBub3JtYWxpemVQYWdlUGF0aChwYXRoLnJvdXRlLm9yaWdpbmFsUGF0aClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUmV0dXJuIGEgbWF0Y2hwYXRoIHBhcmFtcyBmcm9tIHJlYWNoL3JvdXRlciBydWxlc1xuICogaWYgYG1hdGNoLXBhdGhzLmpzb25gIGNvbnRhaW5zIGB7IFwiOmJhci8qZm9vXCIgfWAsIGFuZCB0aGUgcGF0aCBpcyAvYmF6L3phei96b29cbiAqIHRoZW4gaXQgcmV0dXJuc1xuICogIHsgYmFyOiBiYXosIGZvbzogemF6L3pvbyB9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1BhdGhuYW1lIEEgcmF3IHBhdGhuYW1lXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBncmFiTWF0Y2hQYXJhbXMgPSByYXdQYXRobmFtZSA9PiB7XG4gIGNvbnN0IHRyaW1tZWRQYXRobmFtZSA9IGNsZWFuUGF0aChyYXdQYXRobmFtZSlcblxuICBjb25zdCBwaWNrUGF0aHMgPSBtYXRjaFBhdGhzLm1hcCgoeyBwYXRoLCBtYXRjaFBhdGggfSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBtYXRjaFBhdGgsXG4gICAgICBvcmlnaW5hbFBhdGg6IHBhdGgsXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IHBhdGggPSBwaWNrKHBpY2tQYXRocywgdHJpbW1lZFBhdGhuYW1lKVxuXG4gIGlmIChwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgucGFyYW1zXG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuLy8gR2l2ZW4gYSByYXcgVVJMIHBhdGgsIHJldHVybnMgdGhlIGNsZWFuZWQgdmVyc2lvbiBvZiBpdCAodHJpbSBvZmZcbi8vIGAjYCBhbmQgcXVlcnkgcGFyYW1zKSwgb3IgaWYgaXQgbWF0Y2hlcyBhbiBlbnRyeSBpblxuLy8gYG1hdGNoLXBhdGhzLmpzb25gLCBpdHMgbWF0Y2hlZCBwYXRoIGlzIHJldHVybmVkXG4vL1xuLy8gRS5nLiBgL2Zvbz9iYXI9ZmFyYCA9PiBgL2Zvb2Bcbi8vXG4vLyBPciBpZiBgbWF0Y2gtcGF0aHMuanNvbmAgY29udGFpbnMgYHsgXCIvZm9vKlwiOiBcIi9wYWdlMVwiLCAuLi59YCwgdGhlblxuLy8gYC9mb28/YmFyPWZhcmAgPT4gYC9wYWdlMWBcbmV4cG9ydCBjb25zdCBmaW5kUGF0aCA9IHJhd1BhdGhuYW1lID0+IHtcbiAgY29uc3QgdHJpbW1lZFBhdGhuYW1lID0gdHJpbVBhdGhuYW1lKGFic29sdXRpZnkocmF3UGF0aG5hbWUpKVxuICBpZiAocGF0aENhY2hlLmhhcyh0cmltbWVkUGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHBhdGhDYWNoZS5nZXQodHJpbW1lZFBhdGhuYW1lKVxuICB9XG5cbiAgY29uc3QgcmVkaXJlY3QgPSBtYXliZUdldEJyb3dzZXJSZWRpcmVjdChyYXdQYXRobmFtZSlcbiAgaWYgKHJlZGlyZWN0KSB7XG4gICAgcmV0dXJuIGZpbmRQYXRoKHJlZGlyZWN0LnRvUGF0aClcbiAgfVxuXG4gIGxldCBmb3VuZFBhdGggPSBmaW5kTWF0Y2hQYXRoKHRyaW1tZWRQYXRobmFtZSlcblxuICBpZiAoIWZvdW5kUGF0aCkge1xuICAgIGZvdW5kUGF0aCA9IGNsZWFuUGF0aChyYXdQYXRobmFtZSlcbiAgfVxuXG4gIHBhdGhDYWNoZS5zZXQodHJpbW1lZFBhdGhuYW1lLCBmb3VuZFBhdGgpXG5cbiAgcmV0dXJuIGZvdW5kUGF0aFxufVxuXG4vKipcbiAqIENsZWFuIGEgdXJsIGFuZCBjb252ZXJ0cyAvaW5kZXguaHRtbCA9PiAvXG4gKiBFLmcuIGAvZm9vP2Jhcj1mYXJgID0+IGAvZm9vYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdQYXRobmFtZSBBIHJhdyBwYXRobmFtZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgY2xlYW5QYXRoID0gcmF3UGF0aG5hbWUgPT4ge1xuICBjb25zdCB0cmltbWVkUGF0aG5hbWUgPSB0cmltUGF0aG5hbWUoYWJzb2x1dGlmeShyYXdQYXRobmFtZSkpXG5cbiAgbGV0IGZvdW5kUGF0aCA9IHRyaW1tZWRQYXRobmFtZVxuICBpZiAoZm91bmRQYXRoID09PSBgL2luZGV4Lmh0bWxgKSB7XG4gICAgZm91bmRQYXRoID0gYC9gXG4gIH1cblxuICBmb3VuZFBhdGggPSBub3JtYWxpemVQYWdlUGF0aChmb3VuZFBhdGgpXG5cbiAgcmV0dXJuIGZvdW5kUGF0aFxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2257\n')},5444:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Link": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.ZP; },\n/* harmony export */ "withAssetPrefix": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.mc; },\n/* harmony export */ "withPrefix": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.dq; },\n/* harmony export */ "graphql": function() { return /* binding */ graphql; },\n/* harmony export */ "parsePath": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.cP; },\n/* harmony export */ "navigate": function() { return /* reexport safe */ gatsby_link__WEBPACK_IMPORTED_MODULE_1__.c4; },\n/* harmony export */ "useScrollRestoration": function() { return /* reexport safe */ gatsby_react_router_scroll__WEBPACK_IMPORTED_MODULE_2__.p2; },\n/* harmony export */ "StaticQueryContext": function() { return /* binding */ StaticQueryContext; },\n/* harmony export */ "StaticQuery": function() { return /* binding */ StaticQuery; },\n/* harmony export */ "PageRenderer": function() { return /* reexport default from dynamic */ _public_page_renderer__WEBPACK_IMPORTED_MODULE_3___default.a; },\n/* harmony export */ "useStaticQuery": function() { return /* binding */ useStaticQuery; },\n/* harmony export */ "prefetchPathname": function() { return /* binding */ prefetchPathname; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var gatsby_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8037);\n/* harmony import */ var gatsby_react_router_scroll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9679);\n/* harmony import */ var _public_page_renderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(861);\n/* harmony import */ var _public_page_renderer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_public_page_renderer__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8741);\nvar prefetchPathname=_loader__WEBPACK_IMPORTED_MODULE_4__/* .default.enqueue */ .ZP.enqueue;var StaticQueryContext=/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({});function StaticQueryDataRenderer(_ref){var staticQueryData=_ref.staticQueryData,data=_ref.data,query=_ref.query,render=_ref.render;var finalData=data?data.data:staticQueryData[query]&&staticQueryData[query].data;return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment,null,finalData&&render(finalData),!finalData&&/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("div",null,"Loading (StaticQuery)"));}var StaticQuery=function StaticQuery(props){var data=props.data,query=props.query,render=props.render,children=props.children;return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(StaticQueryContext.Consumer,null,function(staticQueryData){return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(StaticQueryDataRenderer,{data:data,query:query,render:render||children,staticQueryData:staticQueryData});});};var useStaticQuery=function useStaticQuery(query){var _context$query;if(typeof react__WEBPACK_IMPORTED_MODULE_0__.useContext!=="function"&&"production"==="development"){throw new Error("You\'re likely using a version of React that doesn\'t support Hooks\\n"+"Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.");}var context=react__WEBPACK_IMPORTED_MODULE_0__.useContext(StaticQueryContext);// query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n// to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n// catch the misuse of the API and give proper direction\nif(isNaN(Number(query))){throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\\n\\nimport { useStaticQuery, graphql } from \'gatsby\';\\n\\nuseStaticQuery(graphql`"+query+"`);\\n");}if((_context$query=context[query])!==null&&_context$query!==void 0&&_context$query.data){return context[query].data;}else{throw new Error("The result of this StaticQuery could not be fetched.\\n\\n"+"This is likely a bug in Gatsby and if refreshing the page does not fix it, "+"please open an issue in https://github.com/gatsbyjs/gatsby/issues");}};function graphql(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls "+"are supposed to only be evaluated at compile time, and then compiled away. "+"Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n"+"Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.");}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9nYXRzYnktYnJvd3Nlci1lbnRyeS5qcz81OWJjIl0sIm5hbWVzIjpbInByZWZldGNoUGF0aG5hbWUiLCJsb2FkZXIiLCJTdGF0aWNRdWVyeUNvbnRleHQiLCJSZWFjdCIsIlN0YXRpY1F1ZXJ5RGF0YVJlbmRlcmVyIiwic3RhdGljUXVlcnlEYXRhIiwiZGF0YSIsInF1ZXJ5IiwicmVuZGVyIiwiZmluYWxEYXRhIiwiU3RhdGljUXVlcnkiLCJwcm9wcyIsImNoaWxkcmVuIiwidXNlU3RhdGljUXVlcnkiLCJwcm9jZXNzIiwiRXJyb3IiLCJjb250ZXh0IiwiaXNOYU4iLCJOdW1iZXIiLCJncmFwaHFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxHQUFNQSxpQkFBZ0IsQ0FBR0Msc0VBQXpCLENBRUEsR0FBTUMsbUJBQWtCLGNBQUdDLGdEQUFBLENBQW9CLEVBQXBCLENBQTNCLENBRUEsUUFBU0Msd0JBQVQsTUFBMkUsSUFBeENDLGdCQUF3QyxNQUF4Q0EsZUFBd0MsQ0FBdkJDLElBQXVCLE1BQXZCQSxJQUF1QixDQUFqQkMsS0FBaUIsTUFBakJBLEtBQWlCLENBQVZDLE1BQVUsTUFBVkEsTUFBVSxDQUN6RSxHQUFNQyxVQUFTLENBQUdILElBQUksQ0FDbEJBLElBQUksQ0FBQ0EsSUFEYSxDQUVsQkQsZUFBZSxDQUFDRSxLQUFELENBQWYsRUFBMEJGLGVBQWUsQ0FBQ0UsS0FBRCxDQUFmLENBQXVCRCxJQUZyRCxDQUlBLG1CQUNFLGlEQUFDLDJDQUFELE1BQ0dHLFNBQVMsRUFBSUQsTUFBTSxDQUFDQyxTQUFELENBRHRCLENBRUcsQ0FBQ0EsU0FBRCxlQUFjLG9GQUZqQixDQURGLENBTUQsQ0FFRCxHQUFNQyxZQUFXLENBQUcsUUFBZEEsWUFBYyxDQUFBQyxLQUFLLENBQUksQ0FDM0IsR0FBUUwsS0FBUixDQUEwQ0ssS0FBMUMsQ0FBUUwsSUFBUixDQUFjQyxLQUFkLENBQTBDSSxLQUExQyxDQUFjSixLQUFkLENBQXFCQyxNQUFyQixDQUEwQ0csS0FBMUMsQ0FBcUJILE1BQXJCLENBQTZCSSxRQUE3QixDQUEwQ0QsS0FBMUMsQ0FBNkJDLFFBQTdCLENBRUEsbUJBQ0UsaURBQUMsa0JBQUQsQ0FBb0IsUUFBcEIsTUFDRyxTQUFBUCxlQUFlLHFCQUNkLGlEQUFDLHVCQUFELEVBQ0UsSUFBSSxDQUFFQyxJQURSLENBRUUsS0FBSyxDQUFFQyxLQUZULENBR0UsTUFBTSxDQUFFQyxNQUFNLEVBQUlJLFFBSHBCLENBSUUsZUFBZSxDQUFFUCxlQUpuQixFQURjLEVBRGxCLENBREYsQ0FZRCxDQWZELENBaUJBLEdBQU1RLGVBQWMsQ0FBRyxRQUFqQkEsZUFBaUIsQ0FBQU4sS0FBSyxDQUFJLG9CQUM5QixHQUNFLE1BQU9KLDhDQUFQLGVBQ0FXLFlBQUEsZ0JBRkYsQ0FHRSxDQUNBLEtBQU0sSUFBSUMsTUFBSixDQUNKLDJKQURJLENBQU4sQ0FJRCxDQUNELEdBQU1DLFFBQU8sQ0FBR2IsNkNBQUEsQ0FBaUJELGtCQUFqQixDQUFoQixDQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUllLEtBQUssQ0FBQ0MsTUFBTSxDQUFDWCxLQUFELENBQVAsQ0FBVCxDQUEwQixDQUN4QixLQUFNLElBQUlRLE1BQUosK0tBSWdCUixLQUpoQixTQUFOLENBTUQsQ0FFRCxtQkFBSVMsT0FBTyxDQUFDVCxLQUFELENBQVgsbUNBQUksZUFBZ0JELElBQXBCLENBQTBCLENBQ3hCLE1BQU9VLFFBQU8sQ0FBQ1QsS0FBRCxDQUFQLENBQWVELElBQXRCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsS0FBTSxJQUFJUyxNQUFKLENBQ0osNE1BREksQ0FBTixDQUtELENBQ0YsQ0FqQ0QsQ0EwQ0EsUUFBU0ksUUFBVCxFQUFtQixDQUNqQixLQUFNLElBQUlKLE1BQUosQ0FDSixxVkFESSxDQUFOLENBTUQiLCJmaWxlIjoiNTQ0NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgTGluaywge1xuICB3aXRoUHJlZml4LFxuICB3aXRoQXNzZXRQcmVmaXgsXG4gIG5hdmlnYXRlLFxuICBwdXNoLFxuICByZXBsYWNlLFxuICBuYXZpZ2F0ZVRvLFxuICBwYXJzZVBhdGgsXG59IGZyb20gXCJnYXRzYnktbGlua1wiXG5pbXBvcnQgeyB1c2VTY3JvbGxSZXN0b3JhdGlvbiB9IGZyb20gXCJnYXRzYnktcmVhY3Qtcm91dGVyLXNjcm9sbFwiXG5pbXBvcnQgUGFnZVJlbmRlcmVyIGZyb20gXCIuL3B1YmxpYy1wYWdlLXJlbmRlcmVyXCJcbmltcG9ydCBsb2FkZXIgZnJvbSBcIi4vbG9hZGVyXCJcblxuY29uc3QgcHJlZmV0Y2hQYXRobmFtZSA9IGxvYWRlci5lbnF1ZXVlXG5cbmNvbnN0IFN0YXRpY1F1ZXJ5Q29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pXG5cbmZ1bmN0aW9uIFN0YXRpY1F1ZXJ5RGF0YVJlbmRlcmVyKHsgc3RhdGljUXVlcnlEYXRhLCBkYXRhLCBxdWVyeSwgcmVuZGVyIH0pIHtcbiAgY29uc3QgZmluYWxEYXRhID0gZGF0YVxuICAgID8gZGF0YS5kYXRhXG4gICAgOiBzdGF0aWNRdWVyeURhdGFbcXVlcnldICYmIHN0YXRpY1F1ZXJ5RGF0YVtxdWVyeV0uZGF0YVxuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAge2ZpbmFsRGF0YSAmJiByZW5kZXIoZmluYWxEYXRhKX1cbiAgICAgIHshZmluYWxEYXRhICYmIDxkaXY+TG9hZGluZyAoU3RhdGljUXVlcnkpPC9kaXY+fVxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gIClcbn1cblxuY29uc3QgU3RhdGljUXVlcnkgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHsgZGF0YSwgcXVlcnksIHJlbmRlciwgY2hpbGRyZW4gfSA9IHByb3BzXG5cbiAgcmV0dXJuIChcbiAgICA8U3RhdGljUXVlcnlDb250ZXh0LkNvbnN1bWVyPlxuICAgICAge3N0YXRpY1F1ZXJ5RGF0YSA9PiAoXG4gICAgICAgIDxTdGF0aWNRdWVyeURhdGFSZW5kZXJlclxuICAgICAgICAgIGRhdGE9e2RhdGF9XG4gICAgICAgICAgcXVlcnk9e3F1ZXJ5fVxuICAgICAgICAgIHJlbmRlcj17cmVuZGVyIHx8IGNoaWxkcmVufVxuICAgICAgICAgIHN0YXRpY1F1ZXJ5RGF0YT17c3RhdGljUXVlcnlEYXRhfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L1N0YXRpY1F1ZXJ5Q29udGV4dC5Db25zdW1lcj5cbiAgKVxufVxuXG5jb25zdCB1c2VTdGF0aWNRdWVyeSA9IHF1ZXJ5ID0+IHtcbiAgaWYgKFxuICAgIHR5cGVvZiBSZWFjdC51c2VDb250ZXh0ICE9PSBgZnVuY3Rpb25gICYmXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IGBkZXZlbG9wbWVudGBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFlvdSdyZSBsaWtlbHkgdXNpbmcgYSB2ZXJzaW9uIG9mIFJlYWN0IHRoYXQgZG9lc24ndCBzdXBwb3J0IEhvb2tzXFxuYCArXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIFJlYWN0IGFuZCBSZWFjdERPTSB0byAxNi44LjAgb3IgbGF0ZXIgdG8gdXNlIHRoZSB1c2VTdGF0aWNRdWVyeSBob29rLmBcbiAgICApXG4gIH1cbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3RhdGljUXVlcnlDb250ZXh0KVxuXG4gIC8vIHF1ZXJ5IGlzIGEgc3RyaW5naWZpZWQgbnVtYmVyIGxpa2UgYDMzMDM4ODJgIHdoZW4gd3JhcHBlZCB3aXRoIGdyYXBocWwsIElmIGEgdXNlciBmb3JnZXRzXG4gIC8vIHRvIHdyYXAgdGhlIHF1ZXJ5IGluIGEgZ3JxcGhxbCwgdGhlbiBjYXN0aW5nIGl0IHRvIGEgTnVtYmVyIHJlc3VsdHMgaW4gYE5hTmAgYWxsb3dpbmcgdXMgdG9cbiAgLy8gY2F0Y2ggdGhlIG1pc3VzZSBvZiB0aGUgQVBJIGFuZCBnaXZlIHByb3BlciBkaXJlY3Rpb25cbiAgaWYgKGlzTmFOKE51bWJlcihxdWVyeSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1c2VTdGF0aWNRdWVyeSB3YXMgY2FsbGVkIHdpdGggYSBzdHJpbmcgYnV0IGV4cGVjdHMgdG8gYmUgY2FsbGVkIHVzaW5nIFxcYGdyYXBocWxcXGAuIFRyeSB0aGlzOlxuXG5pbXBvcnQgeyB1c2VTdGF0aWNRdWVyeSwgZ3JhcGhxbCB9IGZyb20gJ2dhdHNieSc7XG5cbnVzZVN0YXRpY1F1ZXJ5KGdyYXBocWxcXGAke3F1ZXJ5fVxcYCk7XG5gKVxuICB9XG5cbiAgaWYgKGNvbnRleHRbcXVlcnldPy5kYXRhKSB7XG4gICAgcmV0dXJuIGNvbnRleHRbcXVlcnldLmRhdGFcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlc3VsdCBvZiB0aGlzIFN0YXRpY1F1ZXJ5IGNvdWxkIG5vdCBiZSBmZXRjaGVkLlxcblxcbmAgK1xuICAgICAgICBgVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gR2F0c2J5IGFuZCBpZiByZWZyZXNoaW5nIHRoZSBwYWdlIGRvZXMgbm90IGZpeCBpdCwgYCArXG4gICAgICAgIGBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBpbiBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlc2BcbiAgICApXG4gIH1cbn1cblxuU3RhdGljUXVlcnkucHJvcFR5cGVzID0ge1xuICBkYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxuICBxdWVyeTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICByZW5kZXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMsXG59XG5cbmZ1bmN0aW9uIGdyYXBocWwoKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgSXQgYXBwZWFycyBsaWtlIEdhdHNieSBpcyBtaXNjb25maWd1cmVkLiBHYXRzYnkgcmVsYXRlZCBcXGBncmFwaHFsXFxgIGNhbGxzIGAgK1xuICAgICAgYGFyZSBzdXBwb3NlZCB0byBvbmx5IGJlIGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUsIGFuZCB0aGVuIGNvbXBpbGVkIGF3YXkuIGAgK1xuICAgICAgYFVuZm9ydHVuYXRlbHksIHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCB0aGUgcXVlcnkgd2FzIGxlZnQgaW4gdGhlIGNvbXBpbGVkIGNvZGUuXFxuXFxuYCArXG4gICAgICBgVW5sZXNzIHlvdXIgc2l0ZSBoYXMgYSBjb21wbGV4IG9yIGN1c3RvbSBiYWJlbC9HYXRzYnkgY29uZmlndXJhdGlvbiB0aGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBHYXRzYnkuYFxuICApXG59XG5cbmV4cG9ydCB7XG4gIExpbmssXG4gIHdpdGhBc3NldFByZWZpeCxcbiAgd2l0aFByZWZpeCxcbiAgZ3JhcGhxbCxcbiAgcGFyc2VQYXRoLFxuICBuYXZpZ2F0ZSxcbiAgdXNlU2Nyb2xsUmVzdG9yYXRpb24sXG4gIFN0YXRpY1F1ZXJ5Q29udGV4dCxcbiAgU3RhdGljUXVlcnksXG4gIFBhZ2VSZW5kZXJlcixcbiAgdXNlU3RhdGljUXVlcnksXG4gIHByZWZldGNoUGF0aG5hbWUsXG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5444\n')},8741:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "uQ": function() { return /* binding */ PageResourceStatus; },\n "kL": function() { return /* binding */ ProdLoader; },\n "ZP": function() { return /* binding */ loader; },\n "hs": function() { return /* binding */ getStaticQueryResults; },\n "jN": function() { return /* binding */ publicLoader; },\n "N1": function() { return /* binding */ setLoader; }\n});\n\n// UNUSED EXPORTS: BaseLoader\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(1788);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 3 modules\nvar toConsumableArray = __webpack_require__(7329);\n;// CONCATENATED MODULE: ./.cache/prefetch.js\nvar support=function support(feature){if(typeof document==="undefined"){return false;}var fakeLink=document.createElement("link");try{if(fakeLink.relList&&typeof fakeLink.relList.supports==="function"){return fakeLink.relList.supports(feature);}}catch(err){return false;}return false;};var linkPrefetchStrategy=function linkPrefetchStrategy(url,options){return new Promise(function(resolve,reject){if(typeof document==="undefined"){reject();return;}var link=document.createElement("link");link.setAttribute("rel","prefetch");link.setAttribute("href",url);Object.keys(options).forEach(function(key){link.setAttribute(key,options[key]);});link.onload=resolve;link.onerror=reject;var parentElement=document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode;parentElement.appendChild(link);});};var xhrPrefetchStrategy=function xhrPrefetchStrategy(url){return new Promise(function(resolve,reject){var req=new XMLHttpRequest();req.open("GET",url,true);req.onload=function(){if(req.status===200){resolve();}else{reject();}};req.send(null);});};var supportedPrefetchStrategy=support("prefetch")?linkPrefetchStrategy:xhrPrefetchStrategy;var preFetched={};var prefetch=function prefetch(url,options){return new Promise(function(resolve){if(preFetched[url]){resolve();return;}supportedPrefetchStrategy(url,options).then(function(){resolve();preFetched[url]=true;}).catch(function(){});// 404s are logged to the console anyway\n});};/* harmony default export */ var _cache_prefetch = (prefetch);\n// EXTERNAL MODULE: ./.cache/emitter.js + 1 modules\nvar emitter = __webpack_require__(8110);\n// EXTERNAL MODULE: ./.cache/find-path.js + 1 modules\nvar find_path = __webpack_require__(2257);\n;// CONCATENATED MODULE: ./.cache/loader.js\n/**\n * Available resource loading statuses\n */var PageResourceStatus={/**\n * At least one of critical resources failed to load\n */Error:"error",/**\n * Resources loaded successfully\n */Success:"success"};var preferDefault=function preferDefault(m){return m&&m.default||m;};var stripSurroundingSlashes=function stripSurroundingSlashes(s){s=s[0]==="/"?s.slice(1):s;s=s.endsWith("/")?s.slice(0,-1):s;return s;};var createPageDataUrl=function createPageDataUrl(path){var fixedPath=path==="/"?"index":stripSurroundingSlashes(path);return "/justice40-tool/803-0bf34ac"+"/page-data/"+fixedPath+"/page-data.json";};function doFetch(url,method){if(method===void 0){method="GET";}return new Promise(function(resolve,reject){var req=new XMLHttpRequest();req.open(method,url,true);req.onreadystatechange=function(){if(req.readyState==4){resolve(req);}};req.send(null);});}var doesConnectionSupportPrefetch=function doesConnectionSupportPrefetch(){if("connection"in navigator&&typeof navigator.connection!=="undefined"){if((navigator.connection.effectiveType||"").includes("2g")){return false;}if(navigator.connection.saveData){return false;}}return true;};var toPageResources=function toPageResources(pageData,component){if(component===void 0){component=null;}var page={componentChunkName:pageData.componentChunkName,path:pageData.path,webpackCompilationHash:pageData.webpackCompilationHash,matchPath:pageData.matchPath,staticQueryHashes:pageData.staticQueryHashes};return{component:component,json:pageData.result,page:page};};var BaseLoader=/*#__PURE__*/function(){function BaseLoader(loadComponent,matchPaths){this.inFlightNetworkRequests=new Map();// Map of pagePath -> Page. Where Page is an object with: {\n// status: PageResourceStatus.Success || PageResourceStatus.Error,\n// payload: PageResources, // undefined if PageResourceStatus.Error\n// }\n// PageResources is {\n// component,\n// json: pageData.result,\n// page: {\n// componentChunkName,\n// path,\n// webpackCompilationHash,\n// staticQueryHashes\n// },\n// staticQueryResults\n// }\nthis.pageDb=new Map();this.inFlightDb=new Map();this.staticQueryDb={};this.pageDataDb=new Map();this.prefetchTriggered=new Set();this.prefetchCompleted=new Set();this.loadComponent=loadComponent;(0,find_path/* setMatchPaths */.DS)(matchPaths);}var _proto=BaseLoader.prototype;_proto.memoizedGet=function memoizedGet(url){var _this=this;var inFlightPromise=this.inFlightNetworkRequests.get(url);if(!inFlightPromise){inFlightPromise=doFetch(url,"GET");this.inFlightNetworkRequests.set(url,inFlightPromise);}// Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\nreturn inFlightPromise.then(function(response){_this.inFlightNetworkRequests.delete(url);return response;}).catch(function(err){_this.inFlightNetworkRequests.delete(url);throw err;});};_proto.setApiRunner=function setApiRunner(apiRunner){this.apiRunner=apiRunner;this.prefetchDisabled=apiRunner("disableCorePrefetching").some(function(a){return a;});};_proto.fetchPageDataJson=function fetchPageDataJson(loadObj){var _this2=this;var pagePath=loadObj.pagePath,_loadObj$retries=loadObj.retries,retries=_loadObj$retries===void 0?0:_loadObj$retries;var url=createPageDataUrl(pagePath);return this.memoizedGet(url).then(function(req){var status=req.status,responseText=req.responseText;// Handle 200\nif(status===200){try{var jsonPayload=JSON.parse(responseText);if(jsonPayload.path===undefined){throw new Error("not a valid pageData response");}return Object.assign(loadObj,{status:PageResourceStatus.Success,payload:jsonPayload});}catch(err){// continue regardless of error\n}}// Handle 404\nif(status===404||status===200){// If the request was for a 404 page and it doesn\'t exist, we\'re done\nif(pagePath==="/404.html"){return Object.assign(loadObj,{status:PageResourceStatus.Error});}// Need some code here to cache the 404 request. In case\n// multiple loadPageDataJsons result in 404s\nreturn _this2.fetchPageDataJson(Object.assign(loadObj,{pagePath:"/404.html",notFound:true}));}// handle 500 response (Unrecoverable)\nif(status===500){return Object.assign(loadObj,{status:PageResourceStatus.Error});}// Handle everything else, including status === 0, and 503s. Should retry\nif(retries<3){return _this2.fetchPageDataJson(Object.assign(loadObj,{retries:retries+1}));}// Retried 3 times already, result is an error.\nreturn Object.assign(loadObj,{status:PageResourceStatus.Error});});};_proto.loadPageDataJson=function loadPageDataJson(rawPath){var _this3=this;var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDataDb.has(pagePath)){var pageData=this.pageDataDb.get(pagePath);if(true){return Promise.resolve(pageData);}}return this.fetchPageDataJson({pagePath:pagePath}).then(function(pageData){_this3.pageDataDb.set(pagePath,pageData);return pageData;});};_proto.findMatchPath=function findMatchPath(rawPath){return (0,find_path/* findMatchPath */.UD)(rawPath);}// TODO check all uses of this and whether they use undefined for page resources not exist\n;_proto.loadPage=function loadPage(rawPath){var _this4=this;var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDb.has(pagePath)){var page=this.pageDb.get(pagePath);if(true){if(page.error){return{error:page.error,status:page.status};}return Promise.resolve(page.payload);}}if(this.inFlightDb.has(pagePath)){return this.inFlightDb.get(pagePath);}var inFlightPromise=Promise.all([this.loadAppData(),this.loadPageDataJson(pagePath)]).then(function(allData){var result=allData[1];if(result.status===PageResourceStatus.Error){return{status:PageResourceStatus.Error};}var pageData=result.payload;var _pageData=pageData,componentChunkName=_pageData.componentChunkName,_pageData$staticQuery=_pageData.staticQueryHashes,staticQueryHashes=_pageData$staticQuery===void 0?[]:_pageData$staticQuery;var finalResult={};var componentChunkPromise=_this4.loadComponent(componentChunkName).then(function(component){finalResult.createdAt=new Date();var pageResources;if(!component||component instanceof Error){finalResult.status=PageResourceStatus.Error;finalResult.error=component;}else{finalResult.status=PageResourceStatus.Success;if(result.notFound===true){finalResult.notFound=true;}pageData=Object.assign(pageData,{webpackCompilationHash:allData[0]?allData[0].webpackCompilationHash:""});pageResources=toPageResources(pageData,component);}// undefined if final result is an error\nreturn pageResources;});var staticQueryBatchPromise=Promise.all(staticQueryHashes.map(function(staticQueryHash){// Check for cache in case this static query result has already been loaded\nif(_this4.staticQueryDb[staticQueryHash]){var jsonPayload=_this4.staticQueryDb[staticQueryHash];return{staticQueryHash:staticQueryHash,jsonPayload:jsonPayload};}return _this4.memoizedGet("/justice40-tool/803-0bf34ac"+"/page-data/sq/d/"+staticQueryHash+".json").then(function(req){var jsonPayload=JSON.parse(req.responseText);return{staticQueryHash:staticQueryHash,jsonPayload:jsonPayload};}).catch(function(){throw new Error("We couldn\'t load \\""+"/justice40-tool/803-0bf34ac"+"/page-data/sq/d/"+staticQueryHash+".json\\"");});})).then(function(staticQueryResults){var staticQueryResultsMap={};staticQueryResults.forEach(function(_ref){var staticQueryHash=_ref.staticQueryHash,jsonPayload=_ref.jsonPayload;staticQueryResultsMap[staticQueryHash]=jsonPayload;_this4.staticQueryDb[staticQueryHash]=jsonPayload;});return staticQueryResultsMap;});return Promise.all([componentChunkPromise,staticQueryBatchPromise]).then(function(_ref2){var pageResources=_ref2[0],staticQueryResults=_ref2[1];var payload;if(pageResources){payload=Object.assign({},pageResources,{staticQueryResults:staticQueryResults});finalResult.payload=payload;emitter/* default.emit */.Z.emit("onPostLoadPageResources",{page:payload,pageResources:payload});}_this4.pageDb.set(pagePath,finalResult);if(finalResult.error){return{error:finalResult.error,status:finalResult.status};}return payload;})// when static-query fail to load we throw a better error\n.catch(function(err){return{error:err,status:PageResourceStatus.Error};});});inFlightPromise.then(function(){_this4.inFlightDb.delete(pagePath);}).catch(function(error){_this4.inFlightDb.delete(pagePath);throw error;});this.inFlightDb.set(pagePath,inFlightPromise);return inFlightPromise;}// returns undefined if the page does not exists in cache\n;_proto.loadPageSync=function loadPageSync(rawPath,options){if(options===void 0){options={};}var pagePath=(0,find_path/* findPath */.Cj)(rawPath);if(this.pageDb.has(pagePath)){var _options;var pageData=this.pageDb.get(pagePath);if(pageData.payload){return pageData.payload;}if((_options=options)!==null&&_options!==void 0&&_options.withErrorDetails){return{error:pageData.error,status:pageData.status};}}return undefined;};_proto.shouldPrefetch=function shouldPrefetch(pagePath){// Skip prefetching if we know user is on slow or constrained connection\nif(!doesConnectionSupportPrefetch()){return false;}// Check if the page exists.\nif(this.pageDb.has(pagePath)){return false;}return true;};_proto.prefetch=function prefetch(pagePath){var _this5=this;if(!this.shouldPrefetch(pagePath)){return false;}// Tell plugins with custom prefetching logic that they should start\n// prefetching this path.\nif(!this.prefetchTriggered.has(pagePath)){this.apiRunner("onPrefetchPathname",{pathname:pagePath});this.prefetchTriggered.add(pagePath);}// If a plugin has disabled core prefetching, stop now.\nif(this.prefetchDisabled){return false;}var realPath=(0,find_path/* findPath */.Cj)(pagePath);// Todo make doPrefetch logic cacheable\n// eslint-disable-next-line consistent-return\nthis.doPrefetch(realPath).then(function(){if(!_this5.prefetchCompleted.has(pagePath)){_this5.apiRunner("onPostPrefetchPathname",{pathname:pagePath});_this5.prefetchCompleted.add(pagePath);}});return true;};_proto.doPrefetch=function doPrefetch(pagePath){var _this6=this;var pageDataUrl=createPageDataUrl(pagePath);return _cache_prefetch(pageDataUrl,{crossOrigin:"anonymous",as:"fetch"}).then(function(){return(// This was just prefetched, so will return a response from\n// the cache instead of making another request to the server\n_this6.loadPageDataJson(pagePath));});};_proto.hovering=function hovering(rawPath){this.loadPage(rawPath);};_proto.getResourceURLsForPathname=function getResourceURLsForPathname(rawPath){var pagePath=(0,find_path/* findPath */.Cj)(rawPath);var page=this.pageDataDb.get(pagePath);if(page){var pageResources=toPageResources(page.payload);return[].concat((0,toConsumableArray/* default */.Z)(createComponentUrls(pageResources.page.componentChunkName)),[createPageDataUrl(pagePath)]);}else{return null;}};_proto.isPageNotFound=function isPageNotFound(rawPath){var pagePath=(0,find_path/* findPath */.Cj)(rawPath);var page=this.pageDb.get(pagePath);return!page||page.notFound;};_proto.loadAppData=function loadAppData(retries){var _this7=this;if(retries===void 0){retries=0;}return this.memoizedGet("/justice40-tool/803-0bf34ac"+"/page-data/app-data.json").then(function(req){var status=req.status,responseText=req.responseText;var appData;if(status!==200&&retries<3){// Retry 3 times incase of non-200 responses\nreturn _this7.loadAppData(retries+1);}// Handle 200\nif(status===200){try{var jsonPayload=JSON.parse(responseText);if(jsonPayload.webpackCompilationHash===undefined){throw new Error("not a valid app-data response");}appData=jsonPayload;}catch(err){// continue regardless of error\n}}return appData;});};return BaseLoader;}();var createComponentUrls=function createComponentUrls(componentChunkName){return(window.___chunkMapping[componentChunkName]||[]).map(function(chunk){return "/justice40-tool/803-0bf34ac"+chunk;});};var ProdLoader=/*#__PURE__*/function(_BaseLoader){(0,inheritsLoose/* default */.Z)(ProdLoader,_BaseLoader);function ProdLoader(asyncRequires,matchPaths){var loadComponent=function loadComponent(chunkName){if(!asyncRequires.components[chunkName]){throw new Error("We couldn\'t find the correct component chunk with the name "+chunkName);}return asyncRequires.components[chunkName]().then(preferDefault)// loader will handle the case when component is error\n.catch(function(err){return err;});};return _BaseLoader.call(this,loadComponent,matchPaths)||this;}var _proto2=ProdLoader.prototype;_proto2.doPrefetch=function doPrefetch(pagePath){return _BaseLoader.prototype.doPrefetch.call(this,pagePath).then(function(result){if(result.status!==PageResourceStatus.Success){return Promise.resolve();}var pageData=result.payload;var chunkName=pageData.componentChunkName;var componentUrls=createComponentUrls(chunkName);return Promise.all(componentUrls.map(_cache_prefetch)).then(function(){return pageData;});});};_proto2.loadPageDataJson=function loadPageDataJson(rawPath){return _BaseLoader.prototype.loadPageDataJson.call(this,rawPath).then(function(data){if(data.notFound){// check if html file exist using HEAD request:\n// if it does we should navigate to it instead of showing 404\nreturn doFetch(rawPath,"HEAD").then(function(req){if(req.status===200){// page (.html file) actually exist (or we asked for 404 )\n// returning page resources status as errored to trigger\n// regular browser navigation to given page\nreturn{status:PageResourceStatus.Error};}// if HEAD request wasn\'t 200, return notFound result\n// and show 404 page\nreturn data;});}return data;});};return ProdLoader;}(BaseLoader);var instance;var setLoader=function setLoader(_loader){instance=_loader;};var publicLoader={enqueue:function enqueue(rawPath){return instance.prefetch(rawPath);},// Real methods\ngetResourceURLsForPathname:function getResourceURLsForPathname(rawPath){return instance.getResourceURLsForPathname(rawPath);},loadPage:function loadPage(rawPath){return instance.loadPage(rawPath);},// TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\nloadPageSync:function loadPageSync(rawPath,options){if(options===void 0){options={};}return instance.loadPageSync(rawPath,options);},prefetch:function prefetch(rawPath){return instance.prefetch(rawPath);},isPageNotFound:function isPageNotFound(rawPath){return instance.isPageNotFound(rawPath);},hovering:function hovering(rawPath){return instance.hovering(rawPath);},loadAppData:function loadAppData(){return instance.loadAppData();}};/* harmony default export */ var loader = (publicLoader);function getStaticQueryResults(){if(instance){return instance.staticQueryDb;}else{return{};}}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wcmVmZXRjaC5qcz9hOTNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL2xvYWRlci5qcz83YTYxIl0sIm5hbWVzIjpbInN1cHBvcnQiLCJmZWF0dXJlIiwiZG9jdW1lbnQiLCJmYWtlTGluayIsImNyZWF0ZUVsZW1lbnQiLCJyZWxMaXN0Iiwic3VwcG9ydHMiLCJlcnIiLCJsaW5rUHJlZmV0Y2hTdHJhdGVneSIsInVybCIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImxpbmsiLCJzZXRBdHRyaWJ1dGUiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJwYXJlbnRFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJnZXRFbGVtZW50c0J5TmFtZSIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsInhoclByZWZldGNoU3RyYXRlZ3kiLCJyZXEiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJzdGF0dXMiLCJzZW5kIiwic3VwcG9ydGVkUHJlZmV0Y2hTdHJhdGVneSIsInByZUZldGNoZWQiLCJwcmVmZXRjaCIsInRoZW4iLCJjYXRjaCIsIlBhZ2VSZXNvdXJjZVN0YXR1cyIsIkVycm9yIiwiU3VjY2VzcyIsInByZWZlckRlZmF1bHQiLCJtIiwiZGVmYXVsdCIsInN0cmlwU3Vycm91bmRpbmdTbGFzaGVzIiwicyIsInNsaWNlIiwiZW5kc1dpdGgiLCJjcmVhdGVQYWdlRGF0YVVybCIsInBhdGgiLCJmaXhlZFBhdGgiLCJfX1BBVEhfUFJFRklYX18iLCJkb0ZldGNoIiwibWV0aG9kIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsImRvZXNDb25uZWN0aW9uU3VwcG9ydFByZWZldGNoIiwibmF2aWdhdG9yIiwiY29ubmVjdGlvbiIsImVmZmVjdGl2ZVR5cGUiLCJpbmNsdWRlcyIsInNhdmVEYXRhIiwidG9QYWdlUmVzb3VyY2VzIiwicGFnZURhdGEiLCJjb21wb25lbnQiLCJwYWdlIiwiY29tcG9uZW50Q2h1bmtOYW1lIiwid2VicGFja0NvbXBpbGF0aW9uSGFzaCIsIm1hdGNoUGF0aCIsInN0YXRpY1F1ZXJ5SGFzaGVzIiwianNvbiIsInJlc3VsdCIsIkJhc2VMb2FkZXIiLCJsb2FkQ29tcG9uZW50IiwibWF0Y2hQYXRocyIsImluRmxpZ2h0TmV0d29ya1JlcXVlc3RzIiwiTWFwIiwicGFnZURiIiwiaW5GbGlnaHREYiIsInN0YXRpY1F1ZXJ5RGIiLCJwYWdlRGF0YURiIiwicHJlZmV0Y2hUcmlnZ2VyZWQiLCJTZXQiLCJwcmVmZXRjaENvbXBsZXRlZCIsInNldE1hdGNoUGF0aHMiLCJtZW1vaXplZEdldCIsImluRmxpZ2h0UHJvbWlzZSIsImdldCIsInNldCIsInJlc3BvbnNlIiwiZGVsZXRlIiwic2V0QXBpUnVubmVyIiwiYXBpUnVubmVyIiwicHJlZmV0Y2hEaXNhYmxlZCIsInNvbWUiLCJhIiwiZmV0Y2hQYWdlRGF0YUpzb24iLCJsb2FkT2JqIiwicGFnZVBhdGgiLCJyZXRyaWVzIiwicmVzcG9uc2VUZXh0IiwianNvblBheWxvYWQiLCJKU09OIiwicGFyc2UiLCJ1bmRlZmluZWQiLCJhc3NpZ24iLCJwYXlsb2FkIiwibm90Rm91bmQiLCJsb2FkUGFnZURhdGFKc29uIiwicmF3UGF0aCIsImZpbmRQYXRoIiwiaGFzIiwicHJvY2VzcyIsImZpbmRNYXRjaFBhdGgiLCJsb2FkUGFnZSIsImVycm9yIiwiYWxsIiwibG9hZEFwcERhdGEiLCJhbGxEYXRhIiwiZmluYWxSZXN1bHQiLCJjb21wb25lbnRDaHVua1Byb21pc2UiLCJjcmVhdGVkQXQiLCJEYXRlIiwicGFnZVJlc291cmNlcyIsInN0YXRpY1F1ZXJ5QmF0Y2hQcm9taXNlIiwibWFwIiwic3RhdGljUXVlcnlIYXNoIiwic3RhdGljUXVlcnlSZXN1bHRzIiwic3RhdGljUXVlcnlSZXN1bHRzTWFwIiwiZW1pdHRlciIsImxvYWRQYWdlU3luYyIsIndpdGhFcnJvckRldGFpbHMiLCJzaG91bGRQcmVmZXRjaCIsInBhdGhuYW1lIiwiYWRkIiwicmVhbFBhdGgiLCJkb1ByZWZldGNoIiwicGFnZURhdGFVcmwiLCJwcmVmZXRjaEhlbHBlciIsImNyb3NzT3JpZ2luIiwiYXMiLCJob3ZlcmluZyIsImdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lIiwiY3JlYXRlQ29tcG9uZW50VXJscyIsImlzUGFnZU5vdEZvdW5kIiwiYXBwRGF0YSIsIndpbmRvdyIsIl9fX2NodW5rTWFwcGluZyIsImNodW5rIiwiUHJvZExvYWRlciIsImFzeW5jUmVxdWlyZXMiLCJjaHVua05hbWUiLCJjb21wb25lbnRzIiwiY29tcG9uZW50VXJscyIsImRhdGEiLCJpbnN0YW5jZSIsInNldExvYWRlciIsIl9sb2FkZXIiLCJwdWJsaWNMb2FkZXIiLCJlbnF1ZXVlIiwiZ2V0U3RhdGljUXVlcnlSZXN1bHRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxHQUFNQSxRQUFPLENBQUcsUUFBVkEsUUFBVSxDQUFVQyxPQUFWLENBQW1CLENBQ2pDLEdBQUksTUFBT0MsU0FBUCxjQUFKLENBQXFDLENBQ25DLE1BQU8sTUFBUCxDQUNELENBQ0QsR0FBTUMsU0FBUSxDQUFHRCxRQUFRLENBQUNFLGFBQVQsUUFBakIsQ0FDQSxHQUFJLENBQ0YsR0FBSUQsUUFBUSxDQUFDRSxPQUFULEVBQW9CLE1BQU9GLFNBQVEsQ0FBQ0UsT0FBVCxDQUFpQkMsUUFBeEIsYUFBeEIsQ0FBeUUsQ0FDdkUsTUFBT0gsU0FBUSxDQUFDRSxPQUFULENBQWlCQyxRQUFqQixDQUEwQkwsT0FBMUIsQ0FBUCxDQUNELENBQ0YsQ0FBQyxNQUFPTSxHQUFQLENBQVksQ0FDWixNQUFPLE1BQVAsQ0FDRCxDQUNELE1BQU8sTUFBUCxDQUNELENBYkQsQ0FlQSxHQUFNQyxxQkFBb0IsQ0FBRyxRQUF2QkEscUJBQXVCLENBQVVDLEdBQVYsQ0FBZUMsT0FBZixDQUF3QixDQUNuRCxNQUFPLElB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LENBQ3RDLEdBQUlMLFFBQUosQ0FBYyxDQUNaLE1BQU9BLFNBQVEsQ0FBQzVFLGFBQWhCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsTUFBTyxFQUFQLENBQ0QsQ0FDRiIsImZpbGUiOiI4NzQxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3VwcG9ydCA9IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IGB1bmRlZmluZWRgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgZmFrZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYClcbiAgdHJ5IHtcbiAgICBpZiAoZmFrZUxpbmsucmVsTGlzdCAmJiB0eXBlb2YgZmFrZUxpbmsucmVsTGlzdC5zdXBwb3J0cyA9PT0gYGZ1bmN0aW9uYCkge1xuICAgICAgcmV0dXJuIGZha2VMaW5rLnJlbExpc3Quc3VwcG9ydHMoZmVhdHVyZSlcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBsaW5rUHJlZmV0Y2hTdHJhdGVneSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBgdW5kZWZpbmVkYCkge1xuICAgICAgcmVqZWN0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBsaW5rYClcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShgcmVsYCwgYHByZWZldGNoYClcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShgaHJlZmAsIHVybClcblxuICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKGtleSwgb3B0aW9uc1trZXldKVxuICAgIH0pXG5cbiAgICBsaW5rLm9ubG9hZCA9IHJlc29sdmVcbiAgICBsaW5rLm9uZXJyb3IgPSByZWplY3RcblxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYGhlYWRgKVswXSB8fFxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoYHNjcmlwdGApWzBdLnBhcmVudE5vZGVcbiAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGxpbmspXG4gIH0pXG59XG5cbmNvbnN0IHhoclByZWZldGNoU3RyYXRlZ3kgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICByZXEub3BlbihgR0VUYCwgdXJsLCB0cnVlKVxuXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmIChyZXEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlcS5zZW5kKG51bGwpXG4gIH0pXG59XG5cbmNvbnN0IHN1cHBvcnRlZFByZWZldGNoU3RyYXRlZ3kgPSBzdXBwb3J0KGBwcmVmZXRjaGApXG4gID8gbGlua1ByZWZldGNoU3RyYXRlZ3lcbiAgOiB4aHJQcmVmZXRjaFN0cmF0ZWd5XG5cbmNvbnN0IHByZUZldGNoZWQgPSB7fVxuXG5jb25zdCBwcmVmZXRjaCA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGlmIChwcmVGZXRjaGVkW3VybF0pIHtcbiAgICAgIHJlc29sdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkUHJlZmV0Y2hTdHJhdGVneSh1cmwsIG9wdGlvbnMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgICBwcmVGZXRjaGVkW3VybF0gPSB0cnVlXG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHt9KSAvLyA0MDRzIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgYW55d2F5XG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHByZWZldGNoXG4iLCJpbXBvcnQgcHJlZmV0Y2hIZWxwZXIgZnJvbSBcIi4vcHJlZmV0Y2hcIlxuaW1wb3J0IGVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlclwiXG5pbXBvcnQgeyBzZXRNYXRjaFBhdGhzLCBmaW5kUGF0aCwgZmluZE1hdGNoUGF0aCB9IGZyb20gXCIuL2ZpbmQtcGF0aFwiXG5cbi8qKlxuICogQXZhaWxhYmxlIHJlc291cmNlIGxvYWRpbmcgc3RhdHVzZXNcbiAqL1xuZXhwb3J0IGNvbnN0IFBhZ2VSZXNvdXJjZVN0YXR1cyA9IHtcbiAgLyoqXG4gICAqIEF0IGxlYXN0IG9uZSBvZiBjcml0aWNhbCByZXNvdXJjZXMgZmFpbGVkIHRvIGxvYWRcbiAgICovXG4gIEVycm9yOiBgZXJyb3JgLFxuICAvKipcbiAgICogUmVzb3VyY2VzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICovXG4gIFN1Y2Nlc3M6IGBzdWNjZXNzYCxcbn1cblxuY29uc3QgcHJlZmVyRGVmYXVsdCA9IG0gPT4gKG0gJiYgbS5kZWZhdWx0KSB8fCBtXG5cbmNvbnN0IHN0cmlwU3Vycm91bmRpbmdTbGFzaGVzID0gcyA9PiB7XG4gIHMgPSBzWzBdID09PSBgL2AgPyBzLnNsaWNlKDEpIDogc1xuICBzID0gcy5lbmRzV2l0aChgL2ApID8gcy5zbGljZSgwLCAtMSkgOiBzXG4gIHJldHVybiBzXG59XG5cbmNvbnN0IGNyZWF0ZVBhZ2VEYXRhVXJsID0gcGF0aCA9PiB7XG4gIGNvbnN0IGZpeGVkUGF0aCA9IHBhdGggPT09IGAvYCA/IGBpbmRleGAgOiBzdHJpcFN1cnJvdW5kaW5nU2xhc2hlcyhwYXRoKVxuICByZXR1cm4gYCR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvJHtmaXhlZFBhdGh9L3BhZ2UtZGF0YS5qc29uYFxufVxuXG5mdW5jdGlvbiBkb0ZldGNoKHVybCwgbWV0aG9kID0gYEdFVGApIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIHJlcS5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKVxuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT0gNCkge1xuICAgICAgICByZXNvbHZlKHJlcSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxLnNlbmQobnVsbClcbiAgfSlcbn1cblxuY29uc3QgZG9lc0Nvbm5lY3Rpb25TdXBwb3J0UHJlZmV0Y2ggPSAoKSA9PiB7XG4gIGlmIChcbiAgICBgY29ubmVjdGlvbmAgaW4gbmF2aWdhdG9yICYmXG4gICAgdHlwZW9mIG5hdmlnYXRvci5jb25uZWN0aW9uICE9PSBgdW5kZWZpbmVkYFxuICApIHtcbiAgICBpZiAoKG5hdmlnYXRvci5jb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUgfHwgYGApLmluY2x1ZGVzKGAyZ2ApKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKG5hdmlnYXRvci5jb25uZWN0aW9uLnNhdmVEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgdG9QYWdlUmVzb3VyY2VzID0gKHBhZ2VEYXRhLCBjb21wb25lbnQgPSBudWxsKSA9PiB7XG4gIGNvbnN0IHBhZ2UgPSB7XG4gICAgY29tcG9uZW50Q2h1bmtOYW1lOiBwYWdlRGF0YS5jb21wb25lbnRDaHVua05hbWUsXG4gICAgcGF0aDogcGFnZURhdGEucGF0aCxcbiAgICB3ZWJwYWNrQ29tcGlsYXRpb25IYXNoOiBwYWdlRGF0YS53ZWJwYWNrQ29tcGlsYXRpb25IYXNoLFxuICAgIG1hdGNoUGF0aDogcGFnZURhdGEubWF0Y2hQYXRoLFxuICAgIHN0YXRpY1F1ZXJ5SGFzaGVzOiBwYWdlRGF0YS5zdGF0aWNRdWVyeUhhc2hlcyxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29tcG9uZW50LFxuICAgIGpzb246IHBhZ2VEYXRhLnJlc3VsdCxcbiAgICBwYWdlLFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYXNlTG9hZGVyIHtcbiAgY29uc3RydWN0b3IobG9hZENvbXBvbmVudCwgbWF0Y2hQYXRocykge1xuICAgIC8vIE1hcCBvZiBwYWdlUGF0aCAtPiBQYWdlLiBXaGVyZSBQYWdlIGlzIGFuIG9iamVjdCB3aXRoOiB7XG4gICAgLy8gICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzIHx8IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAvLyAgIHBheWxvYWQ6IFBhZ2VSZXNvdXJjZXMsIC8vIHVuZGVmaW5lZCBpZiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3JcbiAgICAvLyB9XG4gICAgLy8gUGFnZVJlc291cmNlcyBpcyB7XG4gICAgLy8gICBjb21wb25lbnQsXG4gICAgLy8gICBqc29uOiBwYWdlRGF0YS5yZXN1bHQsXG4gICAgLy8gICBwYWdlOiB7XG4gICAgLy8gICAgIGNvbXBvbmVudENodW5rTmFtZSxcbiAgICAvLyAgICAgcGF0aCxcbiAgICAvLyAgICAgd2VicGFja0NvbXBpbGF0aW9uSGFzaCxcbiAgICAvLyAgICAgc3RhdGljUXVlcnlIYXNoZXNcbiAgICAvLyAgIH0sXG4gICAgLy8gICBzdGF0aWNRdWVyeVJlc3VsdHNcbiAgICAvLyB9XG4gICAgdGhpcy5wYWdlRGIgPSBuZXcgTWFwKClcbiAgICB0aGlzLmluRmxpZ2h0RGIgPSBuZXcgTWFwKClcbiAgICB0aGlzLnN0YXRpY1F1ZXJ5RGIgPSB7fVxuICAgIHRoaXMucGFnZURhdGFEYiA9IG5ldyBNYXAoKVxuICAgIHRoaXMucHJlZmV0Y2hUcmlnZ2VyZWQgPSBuZXcgU2V0KClcbiAgICB0aGlzLnByZWZldGNoQ29tcGxldGVkID0gbmV3IFNldCgpXG4gICAgdGhpcy5sb2FkQ29tcG9uZW50ID0gbG9hZENvbXBvbmVudFxuICAgIHNldE1hdGNoUGF0aHMobWF0Y2hQYXRocylcbiAgfVxuXG4gIGluRmxpZ2h0TmV0d29ya1JlcXVlc3RzID0gbmV3IE1hcCgpXG5cbiAgbWVtb2l6ZWRHZXQodXJsKSB7XG4gICAgbGV0IGluRmxpZ2h0UHJvbWlzZSA9IHRoaXMuaW5GbGlnaHROZXR3b3JrUmVxdWVzdHMuZ2V0KHVybClcblxuICAgIGlmICghaW5GbGlnaHRQcm9taXNlKSB7XG4gICAgICBpbkZsaWdodFByb21pc2UgPSBkb0ZldGNoKHVybCwgYEdFVGApXG4gICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLnNldCh1cmwsIGluRmxpZ2h0UHJvbWlzZSlcbiAgICB9XG5cbiAgICAvLyBQcmVmZXIgZHVwbGljYXRpb24gd2l0aCB0aGVuICsgY2F0Y2ggb3ZlciAuZmluYWxseSB0byBwcmV2ZW50IHByb2JsZW1zIGluIGllMTEgKyBmaXJlZm94XG4gICAgcmV0dXJuIGluRmxpZ2h0UHJvbWlzZVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLmRlbGV0ZSh1cmwpXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0TmV0d29ya1JlcXVlc3RzLmRlbGV0ZSh1cmwpXG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSlcbiAgfVxuXG4gIHNldEFwaVJ1bm5lcihhcGlSdW5uZXIpIHtcbiAgICB0aGlzLmFwaVJ1bm5lciA9IGFwaVJ1bm5lclxuICAgIHRoaXMucHJlZmV0Y2hEaXNhYmxlZCA9IGFwaVJ1bm5lcihgZGlzYWJsZUNvcmVQcmVmZXRjaGluZ2ApLnNvbWUoYSA9PiBhKVxuICB9XG5cbiAgZmV0Y2hQYWdlRGF0YUpzb24obG9hZE9iaikge1xuICAgIGNvbnN0IHsgcGFnZVBhdGgsIHJldHJpZXMgPSAwIH0gPSBsb2FkT2JqXG4gICAgY29uc3QgdXJsID0gY3JlYXRlUGFnZURhdGFVcmwocGFnZVBhdGgpXG4gICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRHZXQodXJsKS50aGVuKHJlcSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXR1cywgcmVzcG9uc2VUZXh0IH0gPSByZXFcblxuICAgICAgLy8gSGFuZGxlIDIwMFxuICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dClcbiAgICAgICAgICBpZiAoanNvblBheWxvYWQucGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHZhbGlkIHBhZ2VEYXRhIHJlc3BvbnNlYClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihsb2FkT2JqLCB7XG4gICAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzLFxuICAgICAgICAgICAgcGF5bG9hZDoganNvblBheWxvYWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSA0MDRcbiAgICAgIGlmIChzdGF0dXMgPT09IDQwNCB8fCBzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCB3YXMgZm9yIGEgNDA0IHBhZ2UgYW5kIGl0IGRvZXNuJ3QgZXhpc3QsIHdlJ3JlIGRvbmVcbiAgICAgICAgaWYgKHBhZ2VQYXRoID09PSBgLzQwNC5odG1sYCkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGxvYWRPYmosIHtcbiAgICAgICAgICAgIHN0YXR1czogUGFnZVJlc291cmNlU3RhdHVzLkVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWVkIHNvbWUgY29kZSBoZXJlIHRvIGNhY2hlIHRoZSA0MDQgcmVxdWVzdC4gSW4gY2FzZVxuICAgICAgICAvLyBtdWx0aXBsZSBsb2FkUGFnZURhdGFKc29ucyByZXN1bHQgaW4gNDA0c1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFBhZ2VEYXRhSnNvbihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGxvYWRPYmosIHsgcGFnZVBhdGg6IGAvNDA0Lmh0bWxgLCBub3RGb3VuZDogdHJ1ZSB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSA1MDAgcmVzcG9uc2UgKFVucmVjb3ZlcmFibGUpXG4gICAgICBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obG9hZE9iaiwge1xuICAgICAgICAgIHN0YXR1czogUGFnZVJlc291cmNlU3RhdHVzLkVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlcnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgc3RhdHVzID09PSAwLCBhbmQgNTAzcy4gU2hvdWxkIHJldHJ5XG4gICAgICBpZiAocmV0cmllcyA8IDMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hQYWdlRGF0YUpzb24oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihsb2FkT2JqLCB7IHJldHJpZXM6IHJldHJpZXMgKyAxIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllZCAzIHRpbWVzIGFscmVhZHksIHJlc3VsdCBpcyBhbiBlcnJvci5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGxvYWRPYmosIHtcbiAgICAgICAgc3RhdHVzOiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBsb2FkUGFnZURhdGFKc29uKHJhd1BhdGgpIHtcbiAgICBjb25zdCBwYWdlUGF0aCA9IGZpbmRQYXRoKHJhd1BhdGgpXG4gICAgaWYgKHRoaXMucGFnZURhdGFEYi5oYXMocGFnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZURhdGFEYi5nZXQocGFnZVBhdGgpXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgIT09IGBkZXZlbG9wYCB8fCAhcGFnZURhdGEuc3RhbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYWdlRGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mZXRjaFBhZ2VEYXRhSnNvbih7IHBhZ2VQYXRoIH0pLnRoZW4ocGFnZURhdGEgPT4ge1xuICAgICAgdGhpcy5wYWdlRGF0YURiLnNldChwYWdlUGF0aCwgcGFnZURhdGEpXG5cbiAgICAgIHJldHVybiBwYWdlRGF0YVxuICAgIH0pXG4gIH1cblxuICBmaW5kTWF0Y2hQYXRoKHJhd1BhdGgpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoUGF0aChyYXdQYXRoKVxuICB9XG5cbiAgLy8gVE9ETyBjaGVjayBhbGwgdXNlcyBvZiB0aGlzIGFuZCB3aGV0aGVyIHRoZXkgdXNlIHVuZGVmaW5lZCBmb3IgcGFnZSByZXNvdXJjZXMgbm90IGV4aXN0XG4gIGxvYWRQYWdlKHJhd1BhdGgpIHtcbiAgICBjb25zdCBwYWdlUGF0aCA9IGZpbmRQYXRoKHJhd1BhdGgpXG4gICAgaWYgKHRoaXMucGFnZURiLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VEYi5nZXQocGFnZVBhdGgpXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgIT09IGBkZXZlbG9wYCB8fCAhcGFnZS5wYXlsb2FkLnN0YWxlKSB7XG4gICAgICAgIGlmIChwYWdlLmVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBwYWdlLmVycm9yLFxuICAgICAgICAgICAgc3RhdHVzOiBwYWdlLnN0YXR1cyxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2UucGF5bG9hZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbkZsaWdodERiLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmluRmxpZ2h0RGIuZ2V0KHBhZ2VQYXRoKVxuICAgIH1cblxuICAgIGNvbnN0IGluRmxpZ2h0UHJvbWlzZSA9IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMubG9hZEFwcERhdGEoKSxcbiAgICAgIHRoaXMubG9hZFBhZ2VEYXRhSnNvbihwYWdlUGF0aCksXG4gICAgXSkudGhlbihhbGxEYXRhID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFsbERhdGFbMV1cbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgcGFnZURhdGEgPSByZXN1bHQucGF5bG9hZFxuICAgICAgY29uc3QgeyBjb21wb25lbnRDaHVua05hbWUsIHN0YXRpY1F1ZXJ5SGFzaGVzID0gW10gfSA9IHBhZ2VEYXRhXG5cbiAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0ge31cblxuICAgICAgY29uc3QgY29tcG9uZW50Q2h1bmtQcm9taXNlID0gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENodW5rTmFtZSkudGhlbihcbiAgICAgICAgY29tcG9uZW50ID0+IHtcbiAgICAgICAgICBmaW5hbFJlc3VsdC5jcmVhdGVkQXQgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgbGV0IHBhZ2VSZXNvdXJjZXNcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgZmluYWxSZXN1bHQuc3RhdHVzID0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yXG4gICAgICAgICAgICBmaW5hbFJlc3VsdC5lcnJvciA9IGNvbXBvbmVudFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFJlc3VsdC5zdGF0dXMgPSBQYWdlUmVzb3VyY2VTdGF0dXMuU3VjY2Vzc1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5ub3RGb3VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC5ub3RGb3VuZCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhZ2VEYXRhID0gT2JqZWN0LmFzc2lnbihwYWdlRGF0YSwge1xuICAgICAgICAgICAgICB3ZWJwYWNrQ29tcGlsYXRpb25IYXNoOiBhbGxEYXRhWzBdXG4gICAgICAgICAgICAgICAgPyBhbGxEYXRhWzBdLndlYnBhY2tDb21waWxhdGlvbkhhc2hcbiAgICAgICAgICAgICAgICA6IGBgLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhZ2VSZXNvdXJjZXMgPSB0b1BhZ2VSZXNvdXJjZXMocGFnZURhdGEsIGNvbXBvbmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdW5kZWZpbmVkIGlmIGZpbmFsIHJlc3VsdCBpcyBhbiBlcnJvclxuICAgICAgICAgIHJldHVybiBwYWdlUmVzb3VyY2VzXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgY29uc3Qgc3RhdGljUXVlcnlCYXRjaFByb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICAgICAgc3RhdGljUXVlcnlIYXNoZXMubWFwKHN0YXRpY1F1ZXJ5SGFzaCA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIGNhY2hlIGluIGNhc2UgdGhpcyBzdGF0aWMgcXVlcnkgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0aWNRdWVyeUhhc2gsIGpzb25QYXlsb2FkIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vaXplZEdldChcbiAgICAgICAgICAgIGAke19fUEFUSF9QUkVGSVhfX30vcGFnZS1kYXRhL3NxL2QvJHtzdGF0aWNRdWVyeUhhc2h9Lmpzb25gXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4ocmVxID0+IHtcbiAgICAgICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICAgICAgICAgIHJldHVybiB7IHN0YXRpY1F1ZXJ5SGFzaCwganNvblBheWxvYWQgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgV2UgY291bGRuJ3QgbG9hZCBcIiR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvc3EvZC8ke3N0YXRpY1F1ZXJ5SGFzaH0uanNvblwiYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHN0YXRpY1F1ZXJ5UmVzdWx0cyA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY1F1ZXJ5UmVzdWx0c01hcCA9IHt9XG5cbiAgICAgICAgc3RhdGljUXVlcnlSZXN1bHRzLmZvckVhY2goKHsgc3RhdGljUXVlcnlIYXNoLCBqc29uUGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgc3RhdGljUXVlcnlSZXN1bHRzTWFwW3N0YXRpY1F1ZXJ5SGFzaF0gPSBqc29uUGF5bG9hZFxuICAgICAgICAgIHRoaXMuc3RhdGljUXVlcnlEYltzdGF0aWNRdWVyeUhhc2hdID0ganNvblBheWxvYWRcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gc3RhdGljUXVlcnlSZXN1bHRzTWFwXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBQcm9taXNlLmFsbChbY29tcG9uZW50Q2h1bmtQcm9taXNlLCBzdGF0aWNRdWVyeUJhdGNoUHJvbWlzZV0pXG4gICAgICAgICAgLnRoZW4oKFtwYWdlUmVzb3VyY2VzLCBzdGF0aWNRdWVyeVJlc3VsdHNdKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF5bG9hZFxuICAgICAgICAgICAgaWYgKHBhZ2VSZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHsgLi4ucGFnZVJlc291cmNlcywgc3RhdGljUXVlcnlSZXN1bHRzIH1cbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQucGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KGBvblBvc3RMb2FkUGFnZVJlc291cmNlc2AsIHtcbiAgICAgICAgICAgICAgICBwYWdlOiBwYXlsb2FkLFxuICAgICAgICAgICAgICAgIHBhZ2VSZXNvdXJjZXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFnZURiLnNldChwYWdlUGF0aCwgZmluYWxSZXN1bHQpXG5cbiAgICAgICAgICAgIGlmIChmaW5hbFJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBmaW5hbFJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGZpbmFsUmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gd2hlbiBzdGF0aWMtcXVlcnkgZmFpbCB0byBsb2FkIHdlIHRocm93IGEgYmV0dGVyIGVycm9yXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICBzdGF0dXM6IFBhZ2VSZXNvdXJjZVN0YXR1cy5FcnJvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG5cbiAgICBpbkZsaWdodFByb21pc2VcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbkZsaWdodERiLmRlbGV0ZShwYWdlUGF0aClcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmluRmxpZ2h0RGIuZGVsZXRlKHBhZ2VQYXRoKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfSlcblxuICAgIHRoaXMuaW5GbGlnaHREYi5zZXQocGFnZVBhdGgsIGluRmxpZ2h0UHJvbWlzZSlcblxuICAgIHJldHVybiBpbkZsaWdodFByb21pc2VcbiAgfVxuXG4gIC8vIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBwYWdlIGRvZXMgbm90IGV4aXN0cyBpbiBjYWNoZVxuICBsb2FkUGFnZVN5bmMocmF3UGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcGFnZVBhdGggPSBmaW5kUGF0aChyYXdQYXRoKVxuICAgIGlmICh0aGlzLnBhZ2VEYi5oYXMocGFnZVBhdGgpKSB7XG4gICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZURiLmdldChwYWdlUGF0aClcblxuICAgICAgaWYgKHBhZ2VEYXRhLnBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VEYXRhLnBheWxvYWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnM/LndpdGhFcnJvckRldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogcGFnZURhdGEuZXJyb3IsXG4gICAgICAgICAgc3RhdHVzOiBwYWdlRGF0YS5zdGF0dXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgc2hvdWxkUHJlZmV0Y2gocGFnZVBhdGgpIHtcbiAgICAvLyBTa2lwIHByZWZldGNoaW5nIGlmIHdlIGtub3cgdXNlciBpcyBvbiBzbG93IG9yIGNvbnN0cmFpbmVkIGNvbm5lY3Rpb25cbiAgICBpZiAoIWRvZXNDb25uZWN0aW9uU3VwcG9ydFByZWZldGNoKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWdlIGV4aXN0cy5cbiAgICBpZiAodGhpcy5wYWdlRGIuaGFzKHBhZ2VQYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByZWZldGNoKHBhZ2VQYXRoKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFByZWZldGNoKHBhZ2VQYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gVGVsbCBwbHVnaW5zIHdpdGggY3VzdG9tIHByZWZldGNoaW5nIGxvZ2ljIHRoYXQgdGhleSBzaG91bGQgc3RhcnRcbiAgICAvLyBwcmVmZXRjaGluZyB0aGlzIHBhdGguXG4gICAgaWYgKCF0aGlzLnByZWZldGNoVHJpZ2dlcmVkLmhhcyhwYWdlUGF0aCkpIHtcbiAgICAgIHRoaXMuYXBpUnVubmVyKGBvblByZWZldGNoUGF0aG5hbWVgLCB7IHBhdGhuYW1lOiBwYWdlUGF0aCB9KVxuICAgICAgdGhpcy5wcmVmZXRjaFRyaWdnZXJlZC5hZGQocGFnZVBhdGgpXG4gICAgfVxuXG4gICAgLy8gSWYgYSBwbHVnaW4gaGFzIGRpc2FibGVkIGNvcmUgcHJlZmV0Y2hpbmcsIHN0b3Agbm93LlxuICAgIGlmICh0aGlzLnByZWZldGNoRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IHJlYWxQYXRoID0gZmluZFBhdGgocGFnZVBhdGgpXG4gICAgLy8gVG9kbyBtYWtlIGRvUHJlZmV0Y2ggbG9naWMgY2FjaGVhYmxlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gICAgdGhpcy5kb1ByZWZldGNoKHJlYWxQYXRoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcmVmZXRjaENvbXBsZXRlZC5oYXMocGFnZVBhdGgpKSB7XG4gICAgICAgIHRoaXMuYXBpUnVubmVyKGBvblBvc3RQcmVmZXRjaFBhdGhuYW1lYCwgeyBwYXRobmFtZTogcGFnZVBhdGggfSlcbiAgICAgICAgdGhpcy5wcmVmZXRjaENvbXBsZXRlZC5hZGQocGFnZVBhdGgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBkb1ByZWZldGNoKHBhZ2VQYXRoKSB7XG4gICAgY29uc3QgcGFnZURhdGFVcmwgPSBjcmVhdGVQYWdlRGF0YVVybChwYWdlUGF0aClcbiAgICByZXR1cm4gcHJlZmV0Y2hIZWxwZXIocGFnZURhdGFVcmwsIHtcbiAgICAgIGNyb3NzT3JpZ2luOiBgYW5vbnltb3VzYCxcbiAgICAgIGFzOiBgZmV0Y2hgLFxuICAgIH0pLnRoZW4oKCkgPT5cbiAgICAgIC8vIFRoaXMgd2FzIGp1c3QgcHJlZmV0Y2hlZCwgc28gd2lsbCByZXR1cm4gYSByZXNwb25zZSBmcm9tXG4gICAgICAvLyB0aGUgY2FjaGUgaW5zdGVhZCBvZiBtYWtpbmcgYW5vdGhlciByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXJcbiAgICAgIHRoaXMubG9hZFBhZ2VEYXRhSnNvbihwYWdlUGF0aClcbiAgICApXG4gIH1cblxuICBob3ZlcmluZyhyYXdQYXRoKSB7XG4gICAgdGhpcy5sb2FkUGFnZShyYXdQYXRoKVxuICB9XG5cbiAgZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUocmF3UGF0aCkge1xuICAgIGNvbnN0IHBhZ2VQYXRoID0gZmluZFBhdGgocmF3UGF0aClcbiAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlRGF0YURiLmdldChwYWdlUGF0aClcbiAgICBpZiAocGFnZSkge1xuICAgICAgY29uc3QgcGFnZVJlc291cmNlcyA9IHRvUGFnZVJlc291cmNlcyhwYWdlLnBheWxvYWQpXG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNyZWF0ZUNvbXBvbmVudFVybHMocGFnZVJlc291cmNlcy5wYWdlLmNvbXBvbmVudENodW5rTmFtZSksXG4gICAgICAgIGNyZWF0ZVBhZ2VEYXRhVXJsKHBhZ2VQYXRoKSxcbiAgICAgIF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBpc1BhZ2VOb3RGb3VuZChyYXdQYXRoKSB7XG4gICAgY29uc3QgcGFnZVBhdGggPSBmaW5kUGF0aChyYXdQYXRoKVxuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VEYi5nZXQocGFnZVBhdGgpXG4gICAgcmV0dXJuICFwYWdlIHx8IHBhZ2Uubm90Rm91bmRcbiAgfVxuXG4gIGxvYWRBcHBEYXRhKHJldHJpZXMgPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRHZXQoYCR7X19QQVRIX1BSRUZJWF9ffS9wYWdlLWRhdGEvYXBwLWRhdGEuanNvbmApLnRoZW4oXG4gICAgICByZXEgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcmVzcG9uc2VUZXh0IH0gPSByZXFcblxuICAgICAgICBsZXQgYXBwRGF0YVxuXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDIwMCAmJiByZXRyaWVzIDwgMykge1xuICAgICAgICAgIC8vIFJldHJ5IDMgdGltZXMgaW5jYXNlIG9mIG5vbi0yMDAgcmVzcG9uc2VzXG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEFwcERhdGEocmV0cmllcyArIDEpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgMjAwXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KVxuICAgICAgICAgICAgaWYgKGpzb25QYXlsb2FkLndlYnBhY2tDb21waWxhdGlvbkhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHZhbGlkIGFwcC1kYXRhIHJlc3BvbnNlYClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXBwRGF0YSA9IGpzb25QYXlsb2FkXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcERhdGFcbiAgICAgIH1cbiAgICApXG4gIH1cbn1cblxuY29uc3QgY3JlYXRlQ29tcG9uZW50VXJscyA9IGNvbXBvbmVudENodW5rTmFtZSA9PlxuICAod2luZG93Ll9fX2NodW5rTWFwcGluZ1tjb21wb25lbnRDaHVua05hbWVdIHx8IFtdKS5tYXAoXG4gICAgY2h1bmsgPT4gX19QQVRIX1BSRUZJWF9fICsgY2h1bmtcbiAgKVxuXG5leHBvcnQgY2xhc3MgUHJvZExvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuICBjb25zdHJ1Y3Rvcihhc3luY1JlcXVpcmVzLCBtYXRjaFBhdGhzKSB7XG4gICAgY29uc3QgbG9hZENvbXBvbmVudCA9IGNodW5rTmFtZSA9PiB7XG4gICAgICBpZiAoIWFzeW5jUmVxdWlyZXMuY29tcG9uZW50c1tjaHVua05hbWVdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2UgY291bGRuJ3QgZmluZCB0aGUgY29ycmVjdCBjb21wb25lbnQgY2h1bmsgd2l0aCB0aGUgbmFtZSAke2NodW5rTmFtZX1gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgYXN5bmNSZXF1aXJlcy5jb21wb25lbnRzW2NodW5rTmFtZV0oKVxuICAgICAgICAgIC50aGVuKHByZWZlckRlZmF1bHQpXG4gICAgICAgICAgLy8gbG9hZGVyIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZW4gY29tcG9uZW50IGlzIGVycm9yXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiBlcnIpXG4gICAgICApXG4gICAgfVxuXG4gICAgc3VwZXIobG9hZENvbXBvbmVudCwgbWF0Y2hQYXRocylcbiAgfVxuXG4gIGRvUHJlZmV0Y2gocGFnZVBhdGgpIHtcbiAgICByZXR1cm4gc3VwZXIuZG9QcmVmZXRjaChwYWdlUGF0aCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IFBhZ2VSZXNvdXJjZVN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgfVxuICAgICAgY29uc3QgcGFnZURhdGEgPSByZXN1bHQucGF5bG9hZFxuICAgICAgY29uc3QgY2h1bmtOYW1lID0gcGFnZURhdGEuY29tcG9uZW50Q2h1bmtOYW1lXG4gICAgICBjb25zdCBjb21wb25lbnRVcmxzID0gY3JlYXRlQ29tcG9uZW50VXJscyhjaHVua05hbWUpXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50VXJscy5tYXAocHJlZmV0Y2hIZWxwZXIpKS50aGVuKCgpID0+IHBhZ2VEYXRhKVxuICAgIH0pXG4gIH1cblxuICBsb2FkUGFnZURhdGFKc29uKHJhd1BhdGgpIHtcbiAgICByZXR1cm4gc3VwZXIubG9hZFBhZ2VEYXRhSnNvbihyYXdQYXRoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKGRhdGEubm90Rm91bmQpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgaHRtbCBmaWxlIGV4aXN0IHVzaW5nIEhFQUQgcmVxdWVzdDpcbiAgICAgICAgLy8gaWYgaXQgZG9lcyB3ZSBzaG91bGQgbmF2aWdhdGUgdG8gaXQgaW5zdGVhZCBvZiBzaG93aW5nIDQwNFxuICAgICAgICByZXR1cm4gZG9GZXRjaChyYXdQYXRoLCBgSEVBRGApLnRoZW4ocmVxID0+IHtcbiAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAvLyBwYWdlICguaHRtbCBmaWxlKSBhY3R1YWxseSBleGlzdCAob3Igd2UgYXNrZWQgZm9yIDQwNCApXG4gICAgICAgICAgICAvLyByZXR1cm5pbmcgcGFnZSByZXNvdXJjZXMgc3RhdHVzIGFzIGVycm9yZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgLy8gcmVndWxhciBicm93c2VyIG5hdmlnYXRpb24gdG8gZ2l2ZW4gcGFnZVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgSEVBRCByZXF1ZXN0IHdhc24ndCAyMDAsIHJldHVybiBub3RGb3VuZCByZXN1bHRcbiAgICAgICAgICAvLyBhbmQgc2hvdyA0MDQgcGFnZVxuICAgICAgICAgIHJldHVybiBkYXRhXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0pXG4gIH1cbn1cblxubGV0IGluc3RhbmNlXG5cbmV4cG9ydCBjb25zdCBzZXRMb2FkZXIgPSBfbG9hZGVyID0+IHtcbiAgaW5zdGFuY2UgPSBfbG9hZGVyXG59XG5cbmV4cG9ydCBjb25zdCBwdWJsaWNMb2FkZXIgPSB7XG4gIGVucXVldWU6IHJhd1BhdGggPT4gaW5zdGFuY2UucHJlZmV0Y2gocmF3UGF0aCksXG5cbiAgLy8gUmVhbCBtZXRob2RzXG4gIGdldFJlc291cmNlVVJMc0ZvclBhdGhuYW1lOiByYXdQYXRoID0+XG4gICAgaW5zdGFuY2UuZ2V0UmVzb3VyY2VVUkxzRm9yUGF0aG5hbWUocmF3UGF0aCksXG4gIGxvYWRQYWdlOiByYXdQYXRoID0+IGluc3RhbmNlLmxvYWRQYWdlKHJhd1BhdGgpLFxuICAvLyBUT0RPIGFkZCBkZXByZWNhdGlvbiB0byB2NCBzbyBwZW9wbGUgdXNlIHdpdGhFcnJvckRldGFpbHMgYW5kIHRoZW4gd2UgY2FuIHJlbW92ZSBpbiB2NSBhbmQgY2hhbmdlIGRlZmF1bHQgYmVoYXZpb3VyXG4gIGxvYWRQYWdlU3luYzogKHJhd1BhdGgsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBpbnN0YW5jZS5sb2FkUGFnZVN5bmMocmF3UGF0aCwgb3B0aW9ucyksXG4gIHByZWZldGNoOiByYXdQYXRoID0+IGluc3RhbmNlLnByZWZldGNoKHJhd1BhdGgpLFxuICBpc1BhZ2VOb3RGb3VuZDogcmF3UGF0aCA9PiBpbnN0YW5jZS5pc1BhZ2VOb3RGb3VuZChyYXdQYXRoKSxcbiAgaG92ZXJpbmc6IHJhd1BhdGggPT4gaW5zdGFuY2UuaG92ZXJpbmcocmF3UGF0aCksXG4gIGxvYWRBcHBEYXRhOiAoKSA9PiBpbnN0YW5jZS5sb2FkQXBwRGF0YSgpLFxufVxuXG5leHBvcnQgZGVmYXVsdCBwdWJsaWNMb2FkZXJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRpY1F1ZXJ5UmVzdWx0cygpIHtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnN0YXRpY1F1ZXJ5RGJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8741\n')},804:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1788);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _api_runner_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7343);\n/* harmony import */ var _find_path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2257);\n// Renders page\nvar PageRenderer=/*#__PURE__*/function(_React$Component){(0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z)(PageRenderer,_React$Component);function PageRenderer(){return _React$Component.apply(this,arguments)||this;}var _proto=PageRenderer.prototype;_proto.render=function render(){var props=Object.assign({},this.props,{params:Object.assign({},(0,_find_path__WEBPACK_IMPORTED_MODULE_2__/* .grabMatchParams */ .GA)(this.props.location.pathname),this.props.pageResources.json.pageContext.__params)});var pageElement=/*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(this.props.pageResources.component,Object.assign({},props,{key:this.props.path||this.props.pageResources.page.path}));var wrappedPage=(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_1__/* .apiRunner */ .h)("wrapPageElement",{element:pageElement,props:props},pageElement,function(_ref){var result=_ref.result;return{element:result,props:props};}).pop();return wrappedPage;};return PageRenderer;}(react__WEBPACK_IMPORTED_MODULE_0__.Component);/* harmony default export */ __webpack_exports__["Z"] = (PageRenderer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wYWdlLXJlbmRlcmVyLmpzPzIwZTUiXSwibmFtZXMiOlsiUGFnZVJlbmRlcmVyIiwicmVuZGVyIiwicHJvcHMiLCJwYXJhbXMiLCJncmFiTWF0Y2hQYXJhbXMiLCJsb2NhdGlvbiIsInBhdGhuYW1lIiwicGFnZVJlc291cmNlcyIsImpzb24iLCJwYWdlQ29udGV4dCIsIl9fcGFyYW1zIiwicGFnZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY29tcG9uZW50Iiwia2V5IiwicGF0aCIsInBhZ2UiLCJ3cmFwcGVkUGFnZSIsImFwaVJ1bm5lciIsImVsZW1lbnQiLCJyZXN1bHQiLCJwb3AiLCJSZWFjdCJdLCJtYXBwaW5ncyI6Ijs7OztBQUtBO0dBQ01BLGEseVJBQ0pDLE0sQ0FBQSxpQkFBUyxDQUNQLEdBQU1DLE1BQUssa0JBQ04sS0FBS0EsS0FEQyxFQUVUQyxNQUFNLGtCQUNEQyxxRUFBZSxDQUFDLEtBQUtGLEtBQUwsQ0FBV0csUUFBWCxDQUFvQkMsUUFBckIsQ0FEZCxDQUVELEtBQUtKLEtBQUwsQ0FBV0ssYUFBWCxDQUF5QkMsSUFBekIsQ0FBOEJDLFdBQTlCLENBQTBDQyxRQUZ6QyxDQUZHLEVBQVgsQ0FRQSxHQUFNQyxZQUFXLGNBQUdDLG9EQUFhLENBQUMsS0FBS1YsS0FBTCxDQUFXSyxhQUFYLENBQXlCTSxTQUExQixrQkFDNUJYLEtBRDRCLEVBRS9CWSxHQUFHLENBQUUsS0FBS1osS0FBTCxDQUFXYSxJQUFYLEVBQW1CLEtBQUtiLEtBQUwsQ0FBV0ssYUFBWCxDQUF5QlMsSUFBekIsQ0FBOEJELElBRnZCLEdBQWpDLENBS0EsR0FBTUUsWUFBVyxDQUFHQyx1RUFBUyxtQkFFM0IsQ0FBRUMsT0FBTyxDQUFFUixXQUFYLENBQXdCVCxLQUFLLENBQUxBLEtBQXhCLENBRjJCLENBRzNCUyxXQUgyQixDQUkzQixjQUFnQixJQUFiUyxPQUFhLE1BQWJBLE1BQWEsQ0FDZCxNQUFPLENBQUVELE9BQU8sQ0FBRUMsTUFBWCxDQUFtQmxCLEtBQUssQ0FBTEEsS0FBbkIsQ0FBUCxDQUNELENBTjBCLENBQVQsQ0FPbEJtQixHQVBrQixFQUFwQixDQVNBLE1BQU9KLFlBQVAsQ0FDRCxDLHVCQXpCd0JLLDRDLEVBbUMzQix5REFBZXRCLFlBQWYiLCJmaWxlIjoiODA0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgeyBhcGlSdW5uZXIgfSBmcm9tIFwiLi9hcGktcnVubmVyLWJyb3dzZXJcIlxuaW1wb3J0IHsgZ3JhYk1hdGNoUGFyYW1zIH0gZnJvbSBcIi4vZmluZC1wYXRoXCJcblxuLy8gUmVuZGVycyBwYWdlXG5jbGFzcyBQYWdlUmVuZGVyZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIC4uLmdyYWJNYXRjaFBhcmFtcyh0aGlzLnByb3BzLmxvY2F0aW9uLnBhdGhuYW1lKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5wYWdlUmVzb3VyY2VzLmpzb24ucGFnZUNvbnRleHQuX19wYXJhbXMsXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLnBhZ2VSZXNvdXJjZXMuY29tcG9uZW50LCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGtleTogdGhpcy5wcm9wcy5wYXRoIHx8IHRoaXMucHJvcHMucGFnZVJlc291cmNlcy5wYWdlLnBhdGgsXG4gICAgfSlcblxuICAgIGNvbnN0IHdyYXBwZWRQYWdlID0gYXBpUnVubmVyKFxuICAgICAgYHdyYXBQYWdlRWxlbWVudGAsXG4gICAgICB7IGVsZW1lbnQ6IHBhZ2VFbGVtZW50LCBwcm9wcyB9LFxuICAgICAgcGFnZUVsZW1lbnQsXG4gICAgICAoeyByZXN1bHQgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBlbGVtZW50OiByZXN1bHQsIHByb3BzIH1cbiAgICAgIH1cbiAgICApLnBvcCgpXG5cbiAgICByZXR1cm4gd3JhcHBlZFBhZ2VcbiAgfVxufVxuXG5QYWdlUmVuZGVyZXIucHJvcFR5cGVzID0ge1xuICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBwYWdlUmVzb3VyY2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGRhdGE6IFByb3BUeXBlcy5vYmplY3QsXG4gIHBhZ2VDb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhZ2VSZW5kZXJlclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///804\n')},2871:function(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__){"use strict";eval('\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\nvar inheritsLoose = __webpack_require__(1788);\n// EXTERNAL MODULE: ./.cache/api-runner-browser.js\nvar api_runner_browser = __webpack_require__(7343);\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(3935);\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/es/index.js + 2 modules\nvar es = __webpack_require__(9499);\n// EXTERNAL MODULE: ./node_modules/gatsby-react-router-scroll/index.js\nvar gatsby_react_router_scroll = __webpack_require__(9679);\n// EXTERNAL MODULE: ./.cache/gatsby-browser-entry.js\nvar gatsby_browser_entry = __webpack_require__(5444);\n// EXTERNAL MODULE: ./.cache/loader.js + 1 modules\nvar loader = __webpack_require__(8741);\n// EXTERNAL MODULE: ./.cache/redirect-utils.js + 1 modules\nvar redirect_utils = __webpack_require__(5166);\n// EXTERNAL MODULE: ./.cache/emitter.js + 1 modules\nvar emitter = __webpack_require__(8110);\n;// CONCATENATED MODULE: ./.cache/route-announcer-props.js\n// This is extracted to separate module because it\'s shared\n// between browser and SSR code\nvar RouteAnnouncerProps={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};\n// EXTERNAL MODULE: ./node_modules/@gatsbyjs/reach-router/lib/history.js\nvar lib_history = __webpack_require__(2393);\n// EXTERNAL MODULE: ./node_modules/gatsby-link/index.js\nvar gatsby_link = __webpack_require__(8037);\n;// CONCATENATED MODULE: ./.cache/navigation.js\nfunction maybeRedirect(pathname){var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(pathname);if(redirect!=null){window.___replace(redirect.toPath);return true;}else{return false;}}var onPreRouteUpdate=function onPreRouteUpdate(location,prevLocation){if(!maybeRedirect(location.pathname)){(0,api_runner_browser/* apiRunner */.h)("onPreRouteUpdate",{location:location,prevLocation:prevLocation});}};var onRouteUpdate=function onRouteUpdate(location,prevLocation){if(!maybeRedirect(location.pathname)){(0,api_runner_browser/* apiRunner */.h)("onRouteUpdate",{location:location,prevLocation:prevLocation});if(false){}}};var navigation_navigate=function navigate(to,options){if(options===void 0){options={};}// Support forward/backward navigation with numbers\n// navigate(-2) (jumps back 2 history steps)\n// navigate(2) (jumps forward 2 history steps)\nif(typeof to==="number"){lib_history/* globalHistory.navigate */.V5.navigate(to);return;}var _parsePath=(0,gatsby_link/* parsePath */.cP)(to),pathname=_parsePath.pathname;var redirect=(0,redirect_utils/* maybeGetBrowserRedirect */.J)(pathname);// If we\'re redirecting, just replace the passed in pathname\n// to the one we want to redirect to.\nif(redirect){to=redirect.toPath;pathname=(0,gatsby_link/* parsePath */.cP)(to).pathname;}// If we had a service worker update, no matter the path, reload window and\n// reset the pathname whitelist\nif(window.___swUpdated){window.location=pathname;return;}// Start a timer to wait for a second before transitioning and showing a\n// loader in case resources aren\'t around yet.\nvar timeoutId=setTimeout(function(){emitter/* default.emit */.Z.emit("onDelayedLoadPageResources",{pathname:pathname});(0,api_runner_browser/* apiRunner */.h)("onRouteUpdateDelayed",{location:window.location});},1000);loader/* default.loadPage */.ZP.loadPage(pathname).then(function(pageResources){// If no page resources, then refresh the page\n// Do this, rather than simply `window.location.reload()`, so that\n// pressing the back/forward buttons work - otherwise when pressing\n// back, the browser will just change the URL and expect JS to handle\n// the change, which won\'t always work since it might not be a Gatsby\n// page.\nif(!pageResources||pageResources.status===loader/* PageResourceStatus.Error */.uQ.Error){window.history.replaceState({},"",location.href);window.location=pathname;clearTimeout(timeoutId);return;}// If the loaded page has a different compilation hash to the\n// window, then a rebuild has occurred on the server. Reload.\nif( true&&pageResources){if(pageResources.page.webpackCompilationHash!==window.___webpackCompilationHash){// Purge plugin-offline cache\nif("serviceWorker"in navigator&&navigator.serviceWorker.controller!==null&&navigator.serviceWorker.controller.state==="activated"){navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"});}window.location=pathname;}}(0,es.navigate)(to,options);clearTimeout(timeoutId);});};function shouldUpdateScroll(prevRouterProps,_ref){var _this=this;var location=_ref.location;var pathname=location.pathname,hash=location.hash;var results=(0,api_runner_browser/* apiRunner */.h)("shouldUpdateScroll",{prevRouterProps:prevRouterProps,// `pathname` for backwards compatibility\npathname:pathname,routerProps:{location:location},getSavedScrollPosition:function getSavedScrollPosition(args){return[0,// FIXME this is actually a big code smell, we should fix this\n// eslint-disable-next-line @babel/no-invalid-this\n_this._stateStorage.read(args,args.key)];}});if(results.length>0){// Use the latest registered shouldUpdateScroll result, this allows users to override plugin\'s configuration\n// @see https://github.com/gatsbyjs/gatsby/issues/12038\nreturn results[results.length-1];}if(prevRouterProps){var oldPathname=prevRouterProps.location.pathname;if(oldPathname===pathname){// Scroll to element if it exists, if it doesn\'t, or no hash is provided,\n// scroll to top.\nreturn hash?decodeURI(hash.slice(1)):[0,0];}}return true;}function init(){// The "scroll-behavior" package expects the "action" to be on the location\n// object so let\'s copy it over.\nlib_history/* globalHistory.listen */.V5.listen(function(args){args.location.action=args.action;});window.___push=function(to){return navigation_navigate(to,{replace:false});};window.___replace=function(to){return navigation_navigate(to,{replace:true});};window.___navigate=function(to,options){return navigation_navigate(to,options);};// Check for initial page-load redirect\nmaybeRedirect(window.location.pathname);}var RouteAnnouncer=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(RouteAnnouncer,_React$Component);function RouteAnnouncer(props){var _this2;_this2=_React$Component.call(this,props)||this;_this2.announcementRef=/*#__PURE__*/react.createRef();return _this2;}var _proto=RouteAnnouncer.prototype;_proto.componentDidUpdate=function componentDidUpdate(prevProps,nextProps){var _this3=this;requestAnimationFrame(function(){var pageName="new page at "+_this3.props.location.pathname;if(document.title){pageName=document.title;}var pageHeadings=document.querySelectorAll("#gatsby-focus-wrapper h1");if(pageHeadings&&pageHeadings.length){pageName=pageHeadings[0].textContent;}var newAnnouncement="Navigated to "+pageName;if(_this3.announcementRef.current){var oldAnnouncement=_this3.announcementRef.current.innerText;if(oldAnnouncement!==newAnnouncement){_this3.announcementRef.current.innerText=newAnnouncement;}}});};_proto.render=function render(){return/*#__PURE__*/react.createElement("div",Object.assign({},RouteAnnouncerProps,{ref:this.announcementRef}));};return RouteAnnouncer;}(react.Component);var compareLocationProps=function compareLocationProps(prevLocation,nextLocation){var _prevLocation$state,_nextLocation$state;if(prevLocation.href!==nextLocation.href){return true;}if((prevLocation===null||prevLocation===void 0?void 0:(_prevLocation$state=prevLocation.state)===null||_prevLocation$state===void 0?void 0:_prevLocation$state.key)!==(nextLocation===null||nextLocation===void 0?void 0:(_nextLocation$state=nextLocation.state)===null||_nextLocation$state===void 0?void 0:_nextLocation$state.key)){return true;}return false;};// Fire on(Pre)RouteUpdate APIs\nvar RouteUpdates=/*#__PURE__*/function(_React$Component2){(0,inheritsLoose/* default */.Z)(RouteUpdates,_React$Component2);function RouteUpdates(props){var _this4;_this4=_React$Component2.call(this,props)||this;onPreRouteUpdate(props.location,null);return _this4;}var _proto2=RouteUpdates.prototype;_proto2.componentDidMount=function componentDidMount(){onRouteUpdate(this.props.location,null);};_proto2.shouldComponentUpdate=function shouldComponentUpdate(prevProps){if(compareLocationProps(prevProps.location,this.props.location)){onPreRouteUpdate(this.props.location,prevProps.location);return true;}return false;};_proto2.componentDidUpdate=function componentDidUpdate(prevProps){if(compareLocationProps(prevProps.location,this.props.location)){onRouteUpdate(this.props.location,prevProps.location);}};_proto2.render=function render(){return/*#__PURE__*/react.createElement(react.Fragment,null,this.props.children,/*#__PURE__*/react.createElement(RouteAnnouncer,{location:location}));};return RouteUpdates;}(react.Component);\n// EXTERNAL MODULE: ./.cache/page-renderer.js\nvar page_renderer = __webpack_require__(804);\n// EXTERNAL MODULE: ./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js\nvar async_requires = __webpack_require__(4999);\n;// CONCATENATED MODULE: ./node_modules/shallow-compare/es/index.js\n// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\n/* harmony default export */ var shallow_compare_es = (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});\n;// CONCATENATED MODULE: ./.cache/ensure-resources.js\nvar EnsureResources=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(EnsureResources,_React$Component);function EnsureResources(props){var _this;_this=_React$Component.call(this)||this;var location=props.location,pageResources=props.pageResources;_this.state={location:Object.assign({},location),pageResources:pageResources||loader/* default.loadPageSync */.ZP.loadPageSync(location.pathname,{withErrorDetails:true})};return _this;}EnsureResources.getDerivedStateFromProps=function getDerivedStateFromProps(_ref,prevState){var location=_ref.location;if(prevState.location.href!==location.href){var pageResources=loader/* default.loadPageSync */.ZP.loadPageSync(location.pathname,{withErrorDetails:true});return{pageResources:pageResources,location:Object.assign({},location)};}return{location:Object.assign({},location)};};var _proto=EnsureResources.prototype;_proto.loadResources=function loadResources(rawPath){var _this2=this;loader/* default.loadPage */.ZP.loadPage(rawPath).then(function(pageResources){if(pageResources&&pageResources.status!==loader/* PageResourceStatus.Error */.uQ.Error){_this2.setState({location:Object.assign({},window.location),pageResources:pageResources});}else{window.history.replaceState({},"",location.href);window.location=rawPath;}});};_proto.shouldComponentUpdate=function shouldComponentUpdate(nextProps,nextState){// Always return false if we\'re missing resources.\nif(!nextState.pageResources){this.loadResources(nextProps.location.pathname);return false;}if(false){}// Check if the component or json have changed.\nif(this.state.pageResources!==nextState.pageResources){return true;}if(this.state.pageResources.component!==nextState.pageResources.component){return true;}if(this.state.pageResources.json!==nextState.pageResources.json){return true;}// Check if location has changed on a page using internal routing\n// via matchPath configuration.\nif(this.state.location.key!==nextState.location.key&&nextState.pageResources.page&&(nextState.pageResources.page.matchPath||nextState.pageResources.page.path)){return true;}return shallow_compare_es(this,nextProps,nextState);};_proto.render=function render(){if(false){ var message, _this$state$pageResou; }return this.props.children(this.state);};return EnsureResources;}(react.Component);/* harmony default export */ var ensure_resources = (EnsureResources);\n// EXTERNAL MODULE: ./.cache/strip-prefix.js\nvar strip_prefix = __webpack_require__(1578);\n;// CONCATENATED MODULE: ./.cache/_this_is_virtual_fs_path_/$virtual/match-paths.json\nvar match_paths_namespaceObject = JSON.parse(\'[{"path":"/en/404.html","matchPath":"/en/404.html"},{"path":"/en/cejst/","matchPath":"/en/cejst/"},{"path":"/en/contact/","matchPath":"/en/contact/"},{"path":"/en/methodology/","matchPath":"/en/methodology/"},{"path":"/es/404.html","matchPath":"/es/404.html"},{"path":"/es/cejst/","matchPath":"/es/cejst/"},{"path":"/es/contact/","matchPath":"/es/contact/"},{"path":"/es/methodology/","matchPath":"/es/methodology/"},{"path":"/en/","matchPath":"/en/"},{"path":"/es/","matchPath":"/es/"},{"path":"/en/404/","matchPath":"/en/*"},{"path":"/es/404/","matchPath":"/es/*"}]\');\n;// CONCATENATED MODULE: ./.cache/production-app.js\n// Generated during bootstrap\nvar production_app_loader=new loader/* ProdLoader */.kL(async_requires,match_paths_namespaceObject);(0,loader/* setLoader */.N1)(production_app_loader);production_app_loader.setApiRunner(api_runner_browser/* apiRunner */.h);window.asyncRequires=async_requires;window.___emitter=emitter/* default */.Z;window.___loader=loader/* publicLoader */.jN;init();(0,api_runner_browser/* apiRunnerAsync */.I)("onClientEntry").then(function(){// Let plugins register a service worker. The plugin just needs\n// to return true.\nif((0,api_runner_browser/* apiRunner */.h)("registerServiceWorker").filter(Boolean).length>0){__webpack_require__(154);}// In gatsby v2 if Router is used in page using matchPaths\n// paths need to contain full path.\n// For example:\n// - page have `/app/*` matchPath\n// - inside template user needs to use `/app/xyz` as path\n// Resetting `basepath`/`baseuri` keeps current behaviour\n// to not introduce breaking change.\n// Remove this in v3\nvar RouteHandler=function RouteHandler(props){return/*#__PURE__*/react.createElement(es.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},/*#__PURE__*/react.createElement(page_renderer/* default */.Z,props));};var DataContext=/*#__PURE__*/react.createContext({});var GatsbyRoot=/*#__PURE__*/function(_React$Component){(0,inheritsLoose/* default */.Z)(GatsbyRoot,_React$Component);function GatsbyRoot(){return _React$Component.apply(this,arguments)||this;}var _proto=GatsbyRoot.prototype;_proto.render=function render(){var children=this.props.children;return/*#__PURE__*/react.createElement(es.Location,null,function(_ref){var location=_ref.location;return/*#__PURE__*/react.createElement(ensure_resources,{location:location},function(_ref2){var pageResources=_ref2.pageResources,location=_ref2.location;var staticQueryResults=(0,loader/* getStaticQueryResults */.hs)();return/*#__PURE__*/react.createElement(gatsby_browser_entry.StaticQueryContext.Provider,{value:staticQueryResults},/*#__PURE__*/react.createElement(DataContext.Provider,{value:{pageResources:pageResources,location:location}},children));});});};return GatsbyRoot;}(react.Component);var LocationHandler=/*#__PURE__*/function(_React$Component2){(0,inheritsLoose/* default */.Z)(LocationHandler,_React$Component2);function LocationHandler(){return _React$Component2.apply(this,arguments)||this;}var _proto2=LocationHandler.prototype;_proto2.render=function render(){var _this=this;return/*#__PURE__*/react.createElement(DataContext.Consumer,null,function(_ref3){var pageResources=_ref3.pageResources,location=_ref3.location;return/*#__PURE__*/react.createElement(RouteUpdates,{location:location},/*#__PURE__*/react.createElement(gatsby_react_router_scroll/* ScrollContext */.$C,{location:location,shouldUpdateScroll:shouldUpdateScroll},/*#__PURE__*/react.createElement(es.Router,{basepath:"/justice40-tool/803-0bf34ac",location:location,id:"gatsby-focus-wrapper"},/*#__PURE__*/react.createElement(RouteHandler,Object.assign({path:pageResources.page.path==="/404.html"?(0,strip_prefix/* default */.Z)(location.pathname,"/justice40-tool/803-0bf34ac"):encodeURI(pageResources.page.matchPath||pageResources.page.path)},_this.props,{location:location,pageResources:pageResources},pageResources.json)))));});};return LocationHandler;}(react.Component);var _window=window,pagePath=_window.pagePath,browserLoc=_window.location;// Explicitly call navigate if the canonical path (window.pagePath)\n// is different to the browser path (window.location.pathname). But\n// only if NONE of the following conditions hold:\n//\n// - The url matches a client side route (page.matchPath)\n// - it\'s a 404 page\n// - it\'s the offline plugin shell (/offline-plugin-app-shell-fallback/)\nif(pagePath&&"/justice40-tool/803-0bf34ac"+pagePath!==browserLoc.pathname&&!(production_app_loader.findMatchPath((0,strip_prefix/* default */.Z)(browserLoc.pathname,"/justice40-tool/803-0bf34ac"))||pagePath==="/404.html"||pagePath.match(/^\\/404\\/?$/)||pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/))){(0,es.navigate)("/justice40-tool/803-0bf34ac"+pagePath+browserLoc.search+browserLoc.hash,{replace:true});}loader/* publicLoader.loadPage */.jN.loadPage(browserLoc.pathname).then(function(page){if(!page||page.status===loader/* PageResourceStatus.Error */.uQ.Error){var message="page resources for "+browserLoc.pathname+" not found. Not rendering React";// if the chunk throws an error we want to capture the real error\n// This should help with https://github.com/gatsbyjs/gatsby/issues/19618\nif(page&&page.error){console.error(message);throw page.error;}throw new Error(message);}window.___webpackCompilationHash=page.page.webpackCompilationHash;var SiteRoot=(0,api_runner_browser/* apiRunner */.h)("wrapRootElement",{element:/*#__PURE__*/react.createElement(LocationHandler,null)},/*#__PURE__*/react.createElement(LocationHandler,null),function(_ref4){var result=_ref4.result;return{element:result};}).pop();var App=function App(){var onClientEntryRanRef=react.useRef(false);react.useEffect(function(){if(!onClientEntryRanRef.current){onClientEntryRanRef.current=true;performance.mark("onInitialClientRender");(0,api_runner_browser/* apiRunner */.h)("onInitialClientRender");}},[]);return/*#__PURE__*/react.createElement(GatsbyRoot,null,SiteRoot);};var renderer=(0,api_runner_browser/* apiRunner */.h)("replaceHydrateFunction",undefined,react_dom.createRoot?react_dom.createRoot:react_dom.hydrate)[0];function runRender(){var rootElement=typeof window!=="undefined"?document.getElementById("___gatsby"):null;if(renderer===react_dom.createRoot){renderer(rootElement,{hydrate:true}).render(/*#__PURE__*/react.createElement(App,null));}else{renderer(/*#__PURE__*/react.createElement(App,null),rootElement);}}// https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n// TODO remove IE 10 support\nvar doc=document;if(doc.readyState==="complete"||doc.readyState!=="loading"&&!doc.documentElement.doScroll){setTimeout(function(){runRender();},0);}else{var handler=function handler(){doc.removeEventListener("DOMContentLoaded",handler,false);window.removeEventListener("load",handler,false);runRender();};doc.addEventListener("DOMContentLoaded",handler,false);window.addEventListener("load",handler,false);}});});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yb3V0ZS1hbm5vdW5jZXItcHJvcHMuanM/ZWIwZiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9uYXZpZ2F0aW9uLmpzP2M5ZWUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvc2hhbGxvdy1jb21wYXJlL2VzL2luZGV4LmpzPzExY2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi8uY2FjaGUvZW5zdXJlLXJlc291cmNlcy5qcz9mZjRlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vLmNhY2hlL3Byb2R1Y3Rpb24tYXBwLmpzPzUzMTUiXSwibmFtZXMiOlsiUm91dGVBbm5vdW5jZXJQcm9wcyIsImlkIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsIndpZHRoIiwiaGVpZ2h0IiwicGFkZGluZyIsIm92ZXJmbG93IiwiY2xpcCIsIndoaXRlU3BhY2UiLCJib3JkZXIiLCJtYXliZVJlZGlyZWN0IiwicGF0aG5hbWUiLCJyZWRpcmVjdCIsIm1heWJlR2V0QnJvd3NlclJlZGlyZWN0Iiwid2luZG93IiwiX19fcmVwbGFjZSIsInRvUGF0aCIsIm9uUHJlUm91dGVVcGRhdGUiLCJsb2NhdGlvbiIsInByZXZMb2NhdGlvbiIsImFwaVJ1bm5lciIsIm9uUm91dGVVcGRhdGUiLCJwcm9jZXNzIiwibmF2aWdhdGUiLCJ0byIsIm9wdGlvbnMiLCJnbG9iYWxIaXN0b3J5IiwicGFyc2VQYXRoIiwiX19fc3dVcGRhdGVkIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImVtaXR0ZXIiLCJsb2FkZXIiLCJ0aGVuIiwicGFnZVJlc291cmNlcyIsInN0YXR1cyIsIlBhZ2VSZXNvdXJjZVN0YXR1cyIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJocmVmIiwiY2xlYXJUaW1lb3V0IiwicGFnZSIsIndlYnBhY2tDb21waWxhdGlvbkhhc2giLCJfX193ZWJwYWNrQ29tcGlsYXRpb25IYXNoIiwibmF2aWdhdG9yIiwic2VydmljZVdvcmtlciIsImNvbnRyb2xsZXIiLCJzdGF0ZSIsInBvc3RNZXNzYWdlIiwiZ2F0c2J5QXBpIiwicmVhY2hOYXZpZ2F0ZSIsInNob3VsZFVwZGF0ZVNjcm9sbCIsInByZXZSb3V0ZXJQcm9wcyIsImhhc2giLCJyZXN1bHRzIiwicm91dGVyUHJvcHMiLCJnZXRTYXZlZFNjcm9sbFBvc2l0aW9uIiwiYXJncyIsIl9zdGF0ZVN0b3JhZ2UiLCJyZWFkIiwia2V5IiwibGVuZ3RoIiwib2xkUGF0aG5hbWUiLCJkZWNvZGVVUkkiLCJzbGljZSIsImluaXQiLCJhY3Rpb24iLCJfX19wdXNoIiwicmVwbGFjZSIsIl9fX25hdmlnYXRlIiwiUm91dGVBbm5vdW5jZXIiLCJwcm9wcyIsImFubm91bmNlbWVudFJlZiIsIlJlYWN0IiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwibmV4dFByb3BzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGFnZU5hbWUiLCJkb2N1bWVudCIsInRpdGxlIiwicGFnZUhlYWRpbmdzIiwicXVlcnlTZWxlY3RvckFsbCIsInRleHRDb250ZW50IiwibmV3QW5ub3VuY2VtZW50IiwiY3VycmVudCIsIm9sZEFubm91bmNlbWVudCIsImlubmVyVGV4dCIsInJlbmRlciIsImNvbXBhcmVMb2NhdGlvblByb3BzIiwibmV4dExvY2F0aW9uIiwiUm91dGVVcGRhdGVzIiwiY29tcG9uZW50RGlkTW91bnQiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJjaGlsZHJlbiIsIkVuc3VyZVJlc291cmNlcyIsIndpdGhFcnJvckRldGFpbHMiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJwcmV2U3RhdGUiLCJsb2FkUmVzb3VyY2VzIiwicmF3UGF0aCIsInNldFN0YXRlIiwibmV4dFN0YXRlIiwiY29tcG9uZW50IiwianNvbiIsIm1hdGNoUGF0aCIsInBhdGgiLCJzaGFsbG93Q29tcGFyZSIsIlByb2RMb2FkZXIiLCJhc3luY1JlcXVpcmVzIiwibWF0Y2hQYXRocyIsInNldExvYWRlciIsInNldEFwaVJ1bm5lciIsIl9fX2VtaXR0ZXIiLCJfX19sb2FkZXIiLCJwdWJsaWNMb2FkZXIiLCJuYXZpZ2F0aW9uSW5pdCIsImFwaVJ1bm5lckFzeW5jIiwiZmlsdGVyIiwiQm9vbGVhbiIsInJlcXVpcmUiLCJSb3V0ZUhhbmRsZXIiLCJiYXNldXJpIiwiYmFzZXBhdGgiLCJEYXRhQ29udGV4dCIsIkdhdHNieVJvb3QiLCJzdGF0aWNRdWVyeVJlc3VsdHMiLCJnZXRTdGF0aWNRdWVyeVJlc3VsdHMiLCJMb2NhdGlvbkhhbmRsZXIiLCJfX0JBU0VfUEFUSF9fIiwic3RyaXBQcmVmaXgiLCJlbmNvZGVVUkkiLCJwYWdlUGF0aCIsImJyb3dzZXJMb2MiLCJmaW5kTWF0Y2hQYXRoIiwibWF0Y2giLCJzZWFyY2giLCJtZXNzYWdlIiwiZXJyb3IiLCJjb25zb2xlIiwiRXJyb3IiLCJTaXRlUm9vdCIsImVsZW1lbnQiLCJyZXN1bHQiLCJwb3AiLCJBcHAiLCJvbkNsaWVudEVudHJ5UmFuUmVmIiwicGVyZm9ybWFuY2UiLCJtYXJrIiwicmVuZGVyZXIiLCJ1bmRlZmluZWQiLCJSZWFjdERPTSIsInJ1blJlbmRlciIsInJvb3RFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJoeWRyYXRlIiwiZG9jIiwicmVhZHlTdGF0ZSIsImRvY3VtZW50RWxlbWVudCIsImRvU2Nyb2xsIiwiaGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNPLEdBQU1BLG9CQUFtQixDQUFHLENBQ2pDQyxFQUFFLG1CQUQrQixDQUVqQ0MsS0FBSyxDQUFFLENBQ0xDLFFBQVEsV0FESCxDQUVMQyxHQUFHLENBQUUsQ0FGQSxDQUdMQyxLQUFLLENBQUUsQ0FIRixDQUlMQyxNQUFNLENBQUUsQ0FKSCxDQUtMQyxPQUFPLENBQUUsQ0FMSixDQU1M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QUFuQyxDQUE0QyxLQUE1QyxFQUVBUixTQUFTLEdBQ1YsQ0FMRCxDQU9BSSxHQUFHLENBQUNNLGdCQUFKLG9CQUF5Q0YsT0FBekMsQ0FBa0QsS0FBbEQsRUFDQWxKLE1BQU0sQ0FBQ29KLGdCQUFQLFFBQWdDRixPQUFoQyxDQUF5QyxLQUF6QyxFQUNELENBQ0YsQ0FsRkQsRUFtRkQsQ0FyTUQiLCJmaWxlIjoiMjg3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgZXh0cmFjdGVkIHRvIHNlcGFyYXRlIG1vZHVsZSBiZWNhdXNlIGl0J3Mgc2hhcmVkXG4vLyBiZXR3ZWVuIGJyb3dzZXIgYW5kIFNTUiBjb2RlXG5leHBvcnQgY29uc3QgUm91dGVBbm5vdW5jZXJQcm9wcyA9IHtcbiAgaWQ6IGBnYXRzYnktYW5ub3VuY2VyYCxcbiAgc3R5bGU6IHtcbiAgICBwb3NpdGlvbjogYGFic29sdXRlYCxcbiAgICB0b3A6IDAsXG4gICAgd2lkdGg6IDEsXG4gICAgaGVpZ2h0OiAxLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgb3ZlcmZsb3c6IGBoaWRkZW5gLFxuICAgIGNsaXA6IGByZWN0KDAsIDAsIDAsIDApYCxcbiAgICB3aGl0ZVNwYWNlOiBgbm93cmFwYCxcbiAgICBib3JkZXI6IDAsXG4gIH0sXG4gIFwiYXJpYS1saXZlXCI6IGBhc3NlcnRpdmVgLFxuICBcImFyaWEtYXRvbWljXCI6IGB0cnVlYCxcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgbG9hZGVyLCB7IFBhZ2VSZXNvdXJjZVN0YXR1cyB9IGZyb20gXCIuL2xvYWRlclwiXG5pbXBvcnQgeyBtYXliZUdldEJyb3dzZXJSZWRpcmVjdCB9IGZyb20gXCIuL3JlZGlyZWN0LXV0aWxzLmpzXCJcbmltcG9ydCB7IGFwaVJ1bm5lciB9IGZyb20gXCIuL2FwaS1ydW5uZXItYnJvd3NlclwiXG5pbXBvcnQgZW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyXCJcbmltcG9ydCB7IFJvdXRlQW5ub3VuY2VyUHJvcHMgfSBmcm9tIFwiLi9yb3V0ZS1hbm5vdW5jZXItcHJvcHNcIlxuaW1wb3J0IHsgbmF2aWdhdGUgYXMgcmVhY2hOYXZpZ2F0ZSB9IGZyb20gXCJAZ2F0c2J5anMvcmVhY2gtcm91dGVyXCJcbmltcG9ydCB7IGdsb2JhbEhpc3RvcnkgfSBmcm9tIFwiQGdhdHNieWpzL3JlYWNoLXJvdXRlci9saWIvaGlzdG9yeVwiXG5pbXBvcnQgeyBwYXJzZVBhdGggfSBmcm9tIFwiZ2F0c2J5LWxpbmtcIlxuXG5mdW5jdGlvbiBtYXliZVJlZGlyZWN0KHBhdGhuYW1lKSB7XG4gIGNvbnN0IHJlZGlyZWN0ID0gbWF5YmVHZXRCcm93c2VyUmVkaXJlY3QocGF0aG5hbWUpXG5cbiAgaWYgKHJlZGlyZWN0ICE9IG51bGwpIHtcbiAgICB3aW5kb3cuX19fcmVwbGFjZShyZWRpcmVjdC50b1BhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBvblByZVJvdXRlVXBkYXRlID0gKGxvY2F0aW9uLCBwcmV2TG9jYXRpb24pID0+IHtcbiAgaWYgKCFtYXliZVJlZGlyZWN0KGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgIGFwaVJ1bm5lcihgb25QcmVSb3V0ZVVwZGF0ZWAsIHsgbG9jYXRpb24sIHByZXZMb2NhdGlvbiB9KVxuICB9XG59XG5cbmNvbnN0IG9uUm91dGVVcGRhdGUgPSAobG9jYXRpb24sIHByZXZMb2NhdGlvbikgPT4ge1xuICBpZiAoIW1heWJlUmVkaXJlY3QobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgYXBpUnVubmVyKGBvblJvdXRlVXBkYXRlYCwgeyBsb2NhdGlvbiwgcHJldkxvY2F0aW9uIH0pXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuR0FUU0JZX0VYUEVSSU1FTlRBTF9RVUVSWV9PTl9ERU1BTkQgJiZcbiAgICAgIHByb2Nlc3MuZW52LkdBVFNCWV9RVUVSWV9PTl9ERU1BTkRfTE9BRElOR19JTkRJQ0FUT1IgPT09IGB0cnVlYFxuICAgICkge1xuICAgICAgZW1pdHRlci5lbWl0KGBvblJvdXRlVXBkYXRlYCwgeyBsb2NhdGlvbiwgcHJldkxvY2F0aW9uIH0pXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG5hdmlnYXRlID0gKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgLy8gU3VwcG9ydCBmb3J3YXJkL2JhY2t3YXJkIG5hdmlnYXRpb24gd2l0aCBudW1iZXJzXG4gIC8vIG5hdmlnYXRlKC0yKSAoanVtcHMgYmFjayAyIGhpc3Rvcnkgc3RlcHMpXG4gIC8vIG5hdmlnYXRlKDIpICAoanVtcHMgZm9yd2FyZCAyIGhpc3Rvcnkgc3RlcHMpXG4gIGlmICh0eXBlb2YgdG8gPT09IGBudW1iZXJgKSB7XG4gICAgZ2xvYmFsSGlzdG9yeS5uYXZpZ2F0ZSh0bylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCB7IHBhdGhuYW1lIH0gPSBwYXJzZVBhdGgodG8pXG4gIGNvbnN0IHJlZGlyZWN0ID0gbWF5YmVHZXRCcm93c2VyUmVkaXJlY3QocGF0aG5hbWUpXG5cbiAgLy8gSWYgd2UncmUgcmVkaXJlY3RpbmcsIGp1c3QgcmVwbGFjZSB0aGUgcGFzc2VkIGluIHBhdGhuYW1lXG4gIC8vIHRvIHRoZSBvbmUgd2Ugd2FudCB0byByZWRpcmVjdCB0by5cbiAgaWYgKHJlZGlyZWN0KSB7XG4gICAgdG8gPSByZWRpcmVjdC50b1BhdGhcbiAgICBwYXRobmFtZSA9IHBhcnNlUGF0aCh0bykucGF0aG5hbWVcbiAgfVxuXG4gIC8vIElmIHdlIGhhZCBhIHNlcnZpY2Ugd29ya2VyIHVwZGF0ZSwgbm8gbWF0dGVyIHRoZSBwYXRoLCByZWxvYWQgd2luZG93IGFuZFxuICAvLyByZXNldCB0aGUgcGF0aG5hbWUgd2hpdGVsaXN0XG4gIGlmICh3aW5kb3cuX19fc3dVcGRhdGVkKSB7XG4gICAgd2luZG93LmxvY2F0aW9uID0gcGF0aG5hbWVcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFN0YXJ0IGEgdGltZXIgdG8gd2FpdCBmb3IgYSBzZWNvbmQgYmVmb3JlIHRyYW5zaXRpb25pbmcgYW5kIHNob3dpbmcgYVxuICAvLyBsb2FkZXIgaW4gY2FzZSByZXNvdXJjZXMgYXJlbid0IGFyb3VuZCB5ZXQuXG4gIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGVtaXR0ZXIuZW1pdChgb25EZWxheWVkTG9hZFBhZ2VSZXNvdXJjZXNgLCB7IHBhdGhuYW1lIH0pXG4gICAgYXBpUnVubmVyKGBvblJvdXRlVXBkYXRlRGVsYXllZGAsIHtcbiAgICAgIGxvY2F0aW9uOiB3aW5kb3cubG9jYXRpb24sXG4gICAgfSlcbiAgfSwgMTAwMClcblxuICBsb2FkZXIubG9hZFBhZ2UocGF0aG5hbWUpLnRoZW4ocGFnZVJlc291cmNlcyA9PiB7XG4gICAgLy8gSWYgbm8gcGFnZSByZXNvdXJjZXMsIHRoZW4gcmVmcmVzaCB0aGUgcGFnZVxuICAgIC8vIERvIHRoaXMsIHJhdGhlciB0aGFuIHNpbXBseSBgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpYCwgc28gdGhhdFxuICAgIC8vIHByZXNzaW5nIHRoZSBiYWNrL2ZvcndhcmQgYnV0dG9ucyB3b3JrIC0gb3RoZXJ3aXNlIHdoZW4gcHJlc3NpbmdcbiAgICAvLyBiYWNrLCB0aGUgYnJvd3NlciB3aWxsIGp1c3QgY2hhbmdlIHRoZSBVUkwgYW5kIGV4cGVjdCBKUyB0byBoYW5kbGVcbiAgICAvLyB0aGUgY2hhbmdlLCB3aGljaCB3b24ndCBhbHdheXMgd29yayBzaW5jZSBpdCBtaWdodCBub3QgYmUgYSBHYXRzYnlcbiAgICAvLyBwYWdlLlxuICAgIGlmICghcGFnZVJlc291cmNlcyB8fCBwYWdlUmVzb3VyY2VzLnN0YXR1cyA9PT0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yKSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGBgLCBsb2NhdGlvbi5ocmVmKVxuICAgICAgd2luZG93LmxvY2F0aW9uID0gcGF0aG5hbWVcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG9hZGVkIHBhZ2UgaGFzIGEgZGlmZmVyZW50IGNvbXBpbGF0aW9uIGhhc2ggdG8gdGhlXG4gICAgLy8gd2luZG93LCB0aGVuIGEgcmVidWlsZCBoYXMgb2NjdXJyZWQgb24gdGhlIHNlcnZlci4gUmVsb2FkLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gYHByb2R1Y3Rpb25gICYmIHBhZ2VSZXNvdXJjZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFnZVJlc291cmNlcy5wYWdlLndlYnBhY2tDb21waWxhdGlvbkhhc2ggIT09XG4gICAgICAgIHdpbmRvdy5fX193ZWJwYWNrQ29tcGlsYXRpb25IYXNoXG4gICAgICApIHtcbiAgICAgICAgLy8gUHVyZ2UgcGx1Z2luLW9mZmxpbmUgY2FjaGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGBzZXJ2aWNlV29ya2VyYCBpbiBuYXZpZ2F0b3IgJiZcbiAgICAgICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyICE9PSBudWxsICYmXG4gICAgICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlci5zdGF0ZSA9PT0gYGFjdGl2YXRlZGBcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuY29udHJvbGxlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBnYXRzYnlBcGk6IGBjbGVhclBhdGhSZXNvdXJjZXNgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXRobmFtZVxuICAgICAgfVxuICAgIH1cbiAgICByZWFjaE5hdmlnYXRlKHRvLCBvcHRpb25zKVxuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVNjcm9sbChwcmV2Um91dGVyUHJvcHMsIHsgbG9jYXRpb24gfSkge1xuICBjb25zdCB7IHBhdGhuYW1lLCBoYXNoIH0gPSBsb2NhdGlvblxuICBjb25zdCByZXN1bHRzID0gYXBpUnVubmVyKGBzaG91bGRVcGRhdGVTY3JvbGxgLCB7XG4gICAgcHJldlJvdXRlclByb3BzLFxuICAgIC8vIGBwYXRobmFtZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgcGF0aG5hbWUsXG4gICAgcm91dGVyUHJvcHM6IHsgbG9jYXRpb24gfSxcbiAgICBnZXRTYXZlZFNjcm9sbFBvc2l0aW9uOiBhcmdzID0+IFtcbiAgICAgIDAsXG4gICAgICAvLyBGSVhNRSB0aGlzIGlzIGFjdHVhbGx5IGEgYmlnIGNvZGUgc21lbGwsIHdlIHNob3VsZCBmaXggdGhpc1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBiYWJlbC9uby1pbnZhbGlkLXRoaXNcbiAgICAgIHRoaXMuX3N0YXRlU3RvcmFnZS5yZWFkKGFyZ3MsIGFyZ3Mua2V5KSxcbiAgICBdLFxuICB9KVxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgLy8gVXNlIHRoZSBsYXRlc3QgcmVnaXN0ZXJlZCBzaG91bGRVcGRhdGVTY3JvbGwgcmVzdWx0LCB0aGlzIGFsbG93cyB1c2VycyB0byBvdmVycmlkZSBwbHVnaW4ncyBjb25maWd1cmF0aW9uXG4gICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlcy8xMjAzOFxuICAgIHJldHVybiByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV1cbiAgfVxuXG4gIGlmIChwcmV2Um91dGVyUHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbjogeyBwYXRobmFtZTogb2xkUGF0aG5hbWUgfSxcbiAgICB9ID0gcHJldlJvdXRlclByb3BzXG4gICAgaWYgKG9sZFBhdGhuYW1lID09PSBwYXRobmFtZSkge1xuICAgICAgLy8gU2Nyb2xsIHRvIGVsZW1lbnQgaWYgaXQgZXhpc3RzLCBpZiBpdCBkb2Vzbid0LCBvciBubyBoYXNoIGlzIHByb3ZpZGVkLFxuICAgICAgLy8gc2Nyb2xsIHRvIHRvcC5cbiAgICAgIHJldHVybiBoYXNoID8gZGVjb2RlVVJJKGhhc2guc2xpY2UoMSkpIDogWzAsIDBdXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIFRoZSBcInNjcm9sbC1iZWhhdmlvclwiIHBhY2thZ2UgZXhwZWN0cyB0aGUgXCJhY3Rpb25cIiB0byBiZSBvbiB0aGUgbG9jYXRpb25cbiAgLy8gb2JqZWN0IHNvIGxldCdzIGNvcHkgaXQgb3Zlci5cbiAgZ2xvYmFsSGlzdG9yeS5saXN0ZW4oYXJncyA9PiB7XG4gICAgYXJncy5sb2NhdGlvbi5hY3Rpb24gPSBhcmdzLmFjdGlvblxuICB9KVxuXG4gIHdpbmRvdy5fX19wdXNoID0gdG8gPT4gbmF2aWdhdGUodG8sIHsgcmVwbGFjZTogZmFsc2UgfSlcbiAgd2luZG93Ll9fX3JlcGxhY2UgPSB0byA9PiBuYXZpZ2F0ZSh0bywgeyByZXBsYWNlOiB0cnVlIH0pXG4gIHdpbmRvdy5fX19uYXZpZ2F0ZSA9ICh0bywgb3B0aW9ucykgPT4gbmF2aWdhdGUodG8sIG9wdGlvbnMpXG5cbiAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgcGFnZS1sb2FkIHJlZGlyZWN0XG4gIG1heWJlUmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxufVxuXG5jbGFzcyBSb3V0ZUFubm91bmNlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5hbm5vdW5jZW1lbnRSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGxldCBwYWdlTmFtZSA9IGBuZXcgcGFnZSBhdCAke3RoaXMucHJvcHMubG9jYXRpb24ucGF0aG5hbWV9YFxuICAgICAgaWYgKGRvY3VtZW50LnRpdGxlKSB7XG4gICAgICAgIHBhZ2VOYW1lID0gZG9jdW1lbnQudGl0bGVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VIZWFkaW5ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCNnYXRzYnktZm9jdXMtd3JhcHBlciBoMWApXG4gICAgICBpZiAocGFnZUhlYWRpbmdzICYmIHBhZ2VIZWFkaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgcGFnZU5hbWUgPSBwYWdlSGVhZGluZ3NbMF0udGV4dENvbnRlbnRcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0Fubm91bmNlbWVudCA9IGBOYXZpZ2F0ZWQgdG8gJHtwYWdlTmFtZX1gXG4gICAgICBpZiAodGhpcy5hbm5vdW5jZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBvbGRBbm5vdW5jZW1lbnQgPSB0aGlzLmFubm91bmNlbWVudFJlZi5jdXJyZW50LmlubmVyVGV4dFxuICAgICAgICBpZiAob2xkQW5ub3VuY2VtZW50ICE9PSBuZXdBbm5vdW5jZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmFubm91bmNlbWVudFJlZi5jdXJyZW50LmlubmVyVGV4dCA9IG5ld0Fubm91bmNlbWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gPGRpdiB7Li4uUm91dGVBbm5vdW5jZXJQcm9wc30gcmVmPXt0aGlzLmFubm91bmNlbWVudFJlZn0+PC9kaXY+XG4gIH1cbn1cblxuY29uc3QgY29tcGFyZUxvY2F0aW9uUHJvcHMgPSAocHJldkxvY2F0aW9uLCBuZXh0TG9jYXRpb24pID0+IHtcbiAgaWYgKHByZXZMb2NhdGlvbi5ocmVmICE9PSBuZXh0TG9jYXRpb24uaHJlZikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAocHJldkxvY2F0aW9uPy5zdGF0ZT8ua2V5ICE9PSBuZXh0TG9jYXRpb24/LnN0YXRlPy5rZXkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIEZpcmUgb24oUHJlKVJvdXRlVXBkYXRlIEFQSXNcbmNsYXNzIFJvdXRlVXBkYXRlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgb25QcmVSb3V0ZVVwZGF0ZShwcm9wcy5sb2NhdGlvbiwgbnVsbClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIG9uUm91dGVVcGRhdGUodGhpcy5wcm9wcy5sb2NhdGlvbiwgbnVsbClcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBpZiAoY29tcGFyZUxvY2F0aW9uUHJvcHMocHJldlByb3BzLmxvY2F0aW9uLCB0aGlzLnByb3BzLmxvY2F0aW9uKSkge1xuICAgICAgb25QcmVSb3V0ZVVwZGF0ZSh0aGlzLnByb3BzLmxvY2F0aW9uLCBwcmV2UHJvcHMubG9jYXRpb24pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBpZiAoY29tcGFyZUxvY2F0aW9uUHJvcHMocHJldlByb3BzLmxvY2F0aW9uLCB0aGlzLnByb3BzLmxvY2F0aW9uKSkge1xuICAgICAgb25Sb3V0ZVVwZGF0ZSh0aGlzLnByb3BzLmxvY2F0aW9uLCBwcmV2UHJvcHMubG9jYXRpb24pXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICA8Um91dGVBbm5vdW5jZXIgbG9jYXRpb249e2xvY2F0aW9ufSAvPlxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICApXG4gIH1cbn1cblxuUm91dGVVcGRhdGVzLnByb3BUeXBlcyA9IHtcbiAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbn1cblxuZXhwb3J0IHsgaW5pdCwgc2hvdWxkVXBkYXRlU2Nyb2xsLCBSb3V0ZVVwZGF0ZXMsIG1heWJlR2V0QnJvd3NlclJlZGlyZWN0IH1cbiIsIi8vIFB1bGxlZCBmcm9tIHJlYWN0LWNvbXBhdFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9wcmVhY3QtY29tcGF0L2Jsb2IvN2M1ZGUwMGU3Yzg1ZTJmZmQwMTFiZjNhZjAyODk5YjYzZjY5OWQzYS9zcmMvaW5kZXguanMjTDM0OVxuZnVuY3Rpb24gc2hhbGxvd0RpZmZlcnMoYSwgYikge1xuICBmb3IgKHZhciBpIGluIGEpIHtcbiAgICBpZiAoIShpIGluIGIpKSByZXR1cm4gdHJ1ZTtcbiAgfWZvciAodmFyIF9pIGluIGIpIHtcbiAgICBpZiAoYVtfaV0gIT09IGJbX2ldKSByZXR1cm4gdHJ1ZTtcbiAgfXJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChpbnN0YW5jZSwgbmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgcmV0dXJuIHNoYWxsb3dEaWZmZXJzKGluc3RhbmNlLnByb3BzLCBuZXh0UHJvcHMpIHx8IHNoYWxsb3dEaWZmZXJzKGluc3RhbmNlLnN0YXRlLCBuZXh0U3RhdGUpO1xufSk7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgbG9hZGVyLCB7IFBhZ2VSZXNvdXJjZVN0YXR1cyB9IGZyb20gXCIuL2xvYWRlclwiXG5pbXBvcnQgc2hhbGxvd0NvbXBhcmUgZnJvbSBcInNoYWxsb3ctY29tcGFyZVwiXG5cbmNsYXNzIEVuc3VyZVJlc291cmNlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIoKVxuICAgIGNvbnN0IHsgbG9jYXRpb24sIHBhZ2VSZXNvdXJjZXMgfSA9IHByb3BzXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxvY2F0aW9uOiB7IC4uLmxvY2F0aW9uIH0sXG4gICAgICBwYWdlUmVzb3VyY2VzOlxuICAgICAgICBwYWdlUmVzb3VyY2VzIHx8XG4gICAgICAgIGxvYWRlci5sb2FkUGFnZVN5bmMobG9jYXRpb24ucGF0aG5hbWUsIHsgd2l0aEVycm9yRGV0YWlsczogdHJ1ZSB9KSxcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHsgbG9jYXRpb24gfSwgcHJldlN0YXRlKSB7XG4gICAgaWYgKHByZXZTdGF0ZS5sb2NhdGlvbi5ocmVmICE9PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBjb25zdCBwYWdlUmVzb3VyY2VzID0gbG9hZGVyLmxvYWRQYWdlU3luYyhsb2NhdGlvbi5wYXRobmFtZSwge1xuICAgICAgICB3aXRoRXJyb3JEZXRhaWxzOiB0cnVlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVJlc291cmNlcyxcbiAgICAgICAgbG9jYXRpb246IHsgLi4ubG9jYXRpb24gfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IHsgLi4ubG9jYXRpb24gfSxcbiAgICB9XG4gIH1cblxuICBsb2FkUmVzb3VyY2VzKHJhd1BhdGgpIHtcbiAgICBsb2FkZXIubG9hZFBhZ2UocmF3UGF0aCkudGhlbihwYWdlUmVzb3VyY2VzID0+IHtcbiAgICAgIGlmIChwYWdlUmVzb3VyY2VzICYmIHBhZ2VSZXNvdXJjZXMuc3RhdHVzICE9PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgbG9jYXRpb246IHsgLi4ud2luZG93LmxvY2F0aW9uIH0sXG4gICAgICAgICAgcGFnZVJlc291cmNlcyxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgYGAsIGxvY2F0aW9uLmhyZWYpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHJhd1BhdGhcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgLy8gQWx3YXlzIHJldHVybiBmYWxzZSBpZiB3ZSdyZSBtaXNzaW5nIHJlc291cmNlcy5cbiAgICBpZiAoIW5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzKSB7XG4gICAgICB0aGlzLmxvYWRSZXNvdXJjZXMobmV4dFByb3BzLmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBkZXZlbG9wYCAmJlxuICAgICAgbmV4dFN0YXRlLnBhZ2VSZXNvdXJjZXMuc3RhbGVcbiAgICApIHtcbiAgICAgIHRoaXMubG9hZFJlc291cmNlcyhuZXh0UHJvcHMubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50IG9yIGpzb24gaGF2ZSBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMgIT09IG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuY29tcG9uZW50ICE9PSBuZXh0U3RhdGUucGFnZVJlc291cmNlcy5jb21wb25lbnRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucGFnZVJlc291cmNlcy5qc29uICE9PSBuZXh0U3RhdGUucGFnZVJlc291cmNlcy5qc29uKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiBsb2NhdGlvbiBoYXMgY2hhbmdlZCBvbiBhIHBhZ2UgdXNpbmcgaW50ZXJuYWwgcm91dGluZ1xuICAgIC8vIHZpYSBtYXRjaFBhdGggY29uZmlndXJhdGlvbi5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmxvY2F0aW9uLmtleSAhPT0gbmV4dFN0YXRlLmxvY2F0aW9uLmtleSAmJlxuICAgICAgbmV4dFN0YXRlLnBhZ2VSZXNvdXJjZXMucGFnZSAmJlxuICAgICAgKG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzLnBhZ2UubWF0Y2hQYXRoIHx8XG4gICAgICAgIG5leHRTdGF0ZS5wYWdlUmVzb3VyY2VzLnBhZ2UucGF0aClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzaGFsbG93Q29tcGFyZSh0aGlzLCBuZXh0UHJvcHMsIG5leHRTdGF0ZSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gYHByb2R1Y3Rpb25gICYmXG4gICAgICAoIXRoaXMuc3RhdGUucGFnZVJlc291cmNlcyB8fFxuICAgICAgICB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuc3RhdHVzID09PSBQYWdlUmVzb3VyY2VTdGF0dXMuRXJyb3IpXG4gICAgKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEVuc3VyZVJlc291cmNlcyB3YXMgbm90IGFibGUgdG8gZmluZCByZXNvdXJjZXMgZm9yIHBhdGg6IFwiJHt0aGlzLnByb3BzLmxvY2F0aW9uLnBhdGhuYW1lfVwiXG5UaGlzIHR5cGljYWxseSBtZWFucyB0aGF0IGFuIGlzc3VlIG9jY3VycmVkIGJ1aWxkaW5nIGNvbXBvbmVudHMgZm9yIHRoYXQgcGF0aC5cblJ1biBcXGBnYXRzYnkgY2xlYW5cXGAgdG8gcmVtb3ZlIGFueSBjYWNoZWQgZWxlbWVudHMuYFxuICAgICAgaWYgKHRoaXMuc3RhdGUucGFnZVJlc291cmNlcz8uZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICB0aHJvdyB0aGlzLnN0YXRlLnBhZ2VSZXNvdXJjZXMuZXJyb3JcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5zdGF0ZSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFbnN1cmVSZXNvdXJjZXNcbiIsImltcG9ydCB7IGFwaVJ1bm5lciwgYXBpUnVubmVyQXN5bmMgfSBmcm9tIFwiLi9hcGktcnVubmVyLWJyb3dzZXJcIlxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiXG5pbXBvcnQgeyBSb3V0ZXIsIG5hdmlnYXRlLCBMb2NhdGlvbiwgQmFzZUNvbnRleHQgfSBmcm9tIFwiQGdhdHNieWpzL3JlYWNoLXJvdXRlclwiXG5pbXBvcnQgeyBTY3JvbGxDb250ZXh0IH0gZnJvbSBcImdhdHNieS1yZWFjdC1yb3V0ZXItc2Nyb2xsXCJcbmltcG9ydCB7IFN0YXRpY1F1ZXJ5Q29udGV4dCB9IGZyb20gXCJnYXRzYnlcIlxuaW1wb3J0IHtcbiAgc2hvdWxkVXBkYXRlU2Nyb2xsLFxuICBpbml0IGFzIG5hdmlnYXRpb25Jbml0LFxuICBSb3V0ZVVwZGF0ZXMsXG59IGZyb20gXCIuL25hdmlnYXRpb25cIlxuaW1wb3J0IGVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlclwiXG5pbXBvcnQgUGFnZVJlbmRlcmVyIGZyb20gXCIuL3BhZ2UtcmVuZGVyZXJcIlxuaW1wb3J0IGFzeW5jUmVxdWlyZXMgZnJvbSBcIiR2aXJ0dWFsL2FzeW5jLXJlcXVpcmVzXCJcbmltcG9ydCB7XG4gIHNldExvYWRlcixcbiAgUHJvZExvYWRlcixcbiAgcHVibGljTG9hZGVyLFxuICBQYWdlUmVzb3VyY2VTdGF0dXMsXG4gIGdldFN0YXRpY1F1ZXJ5UmVzdWx0cyxcbn0gZnJvbSBcIi4vbG9hZGVyXCJcbmltcG9ydCBFbnN1cmVSZXNvdXJjZXMgZnJvbSBcIi4vZW5zdXJlLXJlc291cmNlc1wiXG5pbXBvcnQgc3RyaXBQcmVmaXggZnJvbSBcIi4vc3RyaXAtcHJlZml4XCJcblxuLy8gR2VuZXJhdGVkIGR1cmluZyBib290c3RyYXBcbmltcG9ydCBtYXRjaFBhdGhzIGZyb20gXCIkdmlydHVhbC9tYXRjaC1wYXRocy5qc29uXCJcblxuY29uc3QgbG9hZGVyID0gbmV3IFByb2RMb2FkZXIoYXN5bmNSZXF1aXJlcywgbWF0Y2hQYXRocylcbnNldExvYWRlcihsb2FkZXIpXG5sb2FkZXIuc2V0QXBpUnVubmVyKGFwaVJ1bm5lcilcblxud2luZG93LmFzeW5jUmVxdWlyZXMgPSBhc3luY1JlcXVpcmVzXG53aW5kb3cuX19fZW1pdHRlciA9IGVtaXR0ZXJcbndpbmRvdy5fX19sb2FkZXIgPSBwdWJsaWNMb2FkZXJcblxubmF2aWdhdGlvbkluaXQoKVxuXG5hcGlSdW5uZXJBc3luYyhgb25DbGllbnRFbnRyeWApLnRoZW4oKCkgPT4ge1xuICAvLyBMZXQgcGx1Z2lucyByZWdpc3RlciBhIHNlcnZpY2Ugd29ya2VyLiBUaGUgcGx1Z2luIGp1c3QgbmVlZHNcbiAgLy8gdG8gcmV0dXJuIHRydWUuXG4gIGlmIChhcGlSdW5uZXIoYHJlZ2lzdGVyU2VydmljZVdvcmtlcmApLmZpbHRlcihCb29sZWFuKS5sZW5ndGggPiAwKSB7XG4gICAgcmVxdWlyZShgLi9yZWdpc3Rlci1zZXJ2aWNlLXdvcmtlcmApXG4gIH1cblxuICAvLyBJbiBnYXRzYnkgdjIgaWYgUm91dGVyIGlzIHVzZWQgaW4gcGFnZSB1c2luZyBtYXRjaFBhdGhzXG4gIC8vIHBhdGhzIG5lZWQgdG8gY29udGFpbiBmdWxsIHBhdGguXG4gIC8vIEZvciBleGFtcGxlOlxuICAvLyAgIC0gcGFnZSBoYXZlIGAvYXBwLypgIG1hdGNoUGF0aFxuICAvLyAgIC0gaW5zaWRlIHRlbXBsYXRlIHVzZXIgbmVlZHMgdG8gdXNlIGAvYXBwL3h5emAgYXMgcGF0aFxuICAvLyBSZXNldHRpbmcgYGJhc2VwYXRoYC9gYmFzZXVyaWAga2VlcHMgY3VycmVudCBiZWhhdmlvdXJcbiAgLy8gdG8gbm90IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2UuXG4gIC8vIFJlbW92ZSB0aGlzIGluIHYzXG4gIGNvbnN0IFJvdXRlSGFuZGxlciA9IHByb3BzID0+IChcbiAgICA8QmFzZUNvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGJhc2V1cmk6IGAvYCxcbiAgICAgICAgYmFzZXBhdGg6IGAvYCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPFBhZ2VSZW5kZXJlciB7Li4ucHJvcHN9IC8+XG4gICAgPC9CYXNlQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxuXG4gIGNvbnN0IERhdGFDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSlcblxuICBjbGFzcyBHYXRzYnlSb290IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSB0aGlzLnByb3BzXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8TG9jYXRpb24+XG4gICAgICAgICAgeyh7IGxvY2F0aW9uIH0pID0+IChcbiAgICAgICAgICAgIDxFbnN1cmVSZXNvdXJjZXMgbG9jYXRpb249e2xvY2F0aW9ufT5cbiAgICAgICAgICAgICAgeyh7IHBhZ2VSZXNvdXJjZXMsIGxvY2F0aW9uIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWNRdWVyeVJlc3VsdHMgPSBnZXRTdGF0aWNRdWVyeVJlc3VsdHMoKVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8U3RhdGljUXVlcnlDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtzdGF0aWNRdWVyeVJlc3VsdHN9PlxuICAgICAgICAgICAgICAgICAgICA8RGF0YUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgcGFnZVJlc291cmNlcywgbG9jYXRpb24gfX0+XG4gICAgICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICA8L0RhdGFDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgPC9TdGF0aWNRdWVyeUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9FbnN1cmVSZXNvdXJjZXM+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9Mb2NhdGlvbj5cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGFzcyBMb2NhdGlvbkhhbmRsZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEYXRhQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICB7KHsgcGFnZVJlc291cmNlcywgbG9jYXRpb24gfSkgPT4gKFxuICAgICAgICAgICAgPFJvdXRlVXBkYXRlcyBsb2NhdGlvbj17bG9jYXRpb259PlxuICAgICAgICAgICAgICA8U2Nyb2xsQ29udGV4dFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVTY3JvbGw9e3Nob3VsZFVwZGF0ZVNjcm9sbH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxSb3V0ZXJcbiAgICAgICAgICAgICAgICAgIGJhc2VwYXRoPXtfX0JBU0VfUEFUSF9ffVxuICAgICAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgaWQ9XCJnYXRzYnktZm9jdXMtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFJvdXRlSGFuZGxlclxuICAgICAgICAgICAgICAgICAgICBwYXRoPXtcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UucGF0aCA9PT0gYC80MDQuaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc3RyaXBQcmVmaXgobG9jYXRpb24ucGF0aG5hbWUsIF9fQkFTRV9QQVRIX18pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVuY29kZVVSSShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UubWF0Y2hQYXRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzb3VyY2VzLnBhZ2UucGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgcGFnZVJlc291cmNlcz17cGFnZVJlc291cmNlc31cbiAgICAgICAgICAgICAgICAgICAgey4uLnBhZ2VSZXNvdXJjZXMuanNvbn1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9Sb3V0ZXI+XG4gICAgICAgICAgICAgIDwvU2Nyb2xsQ29udGV4dD5cbiAgICAgICAgICAgIDwvUm91dGVVcGRhdGVzPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvRGF0YUNvbnRleHQuQ29uc3VtZXI+XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBwYWdlUGF0aCwgbG9jYXRpb246IGJyb3dzZXJMb2MgfSA9IHdpbmRvd1xuXG4gIC8vIEV4cGxpY2l0bHkgY2FsbCBuYXZpZ2F0ZSBpZiB0aGUgY2Fub25pY2FsIHBhdGggKHdpbmRvdy5wYWdlUGF0aClcbiAgLy8gaXMgZGlmZmVyZW50IHRvIHRoZSBicm93c2VyIHBhdGggKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkuIEJ1dFxuICAvLyBvbmx5IGlmIE5PTkUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6XG4gIC8vXG4gIC8vIC0gVGhlIHVybCBtYXRjaGVzIGEgY2xpZW50IHNpZGUgcm91dGUgKHBhZ2UubWF0Y2hQYXRoKVxuICAvLyAtIGl0J3MgYSA0MDQgcGFnZVxuICAvLyAtIGl0J3MgdGhlIG9mZmxpbmUgcGx1Z2luIHNoZWxsICgvb2ZmbGluZS1wbHVnaW4tYXBwLXNoZWxsLWZhbGxiYWNrLylcbiAgaWYgKFxuICAgIHBhZ2VQYXRoICYmXG4gICAgX19CQVNFX1BBVEhfXyArIHBhZ2VQYXRoICE9PSBicm93c2VyTG9jLnBhdGhuYW1lICYmXG4gICAgIShcbiAgICAgIGxvYWRlci5maW5kTWF0Y2hQYXRoKHN0cmlwUHJlZml4KGJyb3dzZXJMb2MucGF0aG5hbWUsIF9fQkFTRV9QQVRIX18pKSB8fFxuICAgICAgcGFnZVBhdGggPT09IGAvNDA0Lmh0bWxgIHx8XG4gICAgICBwYWdlUGF0aC5tYXRjaCgvXlxcLzQwNFxcLz8kLykgfHxcbiAgICAgIHBhZ2VQYXRoLm1hdGNoKC9eXFwvb2ZmbGluZS1wbHVnaW4tYXBwLXNoZWxsLWZhbGxiYWNrXFwvPyQvKVxuICAgIClcbiAgKSB7XG4gICAgbmF2aWdhdGUoX19CQVNFX1BBVEhfXyArIHBhZ2VQYXRoICsgYnJvd3NlckxvYy5zZWFyY2ggKyBicm93c2VyTG9jLmhhc2gsIHtcbiAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpY0xvYWRlci5sb2FkUGFnZShicm93c2VyTG9jLnBhdGhuYW1lKS50aGVuKHBhZ2UgPT4ge1xuICAgIGlmICghcGFnZSB8fCBwYWdlLnN0YXR1cyA9PT0gUGFnZVJlc291cmNlU3RhdHVzLkVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYHBhZ2UgcmVzb3VyY2VzIGZvciAke2Jyb3dzZXJMb2MucGF0aG5hbWV9IG5vdCBmb3VuZC4gTm90IHJlbmRlcmluZyBSZWFjdGBcblxuICAgICAgLy8gaWYgdGhlIGNodW5rIHRocm93cyBhbiBlcnJvciB3ZSB3YW50IHRvIGNhcHR1cmUgdGhlIHJlYWwgZXJyb3JcbiAgICAgIC8vIFRoaXMgc2hvdWxkIGhlbHAgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZ2F0c2J5anMvZ2F0c2J5L2lzc3Vlcy8xOTYxOFxuICAgICAgaWYgKHBhZ2UgJiYgcGFnZS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIHRocm93IHBhZ2UuZXJyb3JcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgd2luZG93Ll9fX3dlYnBhY2tDb21waWxhdGlvbkhhc2ggPSBwYWdlLnBhZ2Uud2VicGFja0NvbXBpbGF0aW9uSGFzaFxuXG4gICAgY29uc3QgU2l0ZVJvb3QgPSBhcGlSdW5uZXIoXG4gICAgICBgd3JhcFJvb3RFbGVtZW50YCxcbiAgICAgIHsgZWxlbWVudDogPExvY2F0aW9uSGFuZGxlciAvPiB9LFxuICAgICAgPExvY2F0aW9uSGFuZGxlciAvPixcbiAgICAgICh7IHJlc3VsdCB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsZW1lbnQ6IHJlc3VsdCB9XG4gICAgICB9XG4gICAgKS5wb3AoKVxuXG4gICAgY29uc3QgQXBwID0gZnVuY3Rpb24gQXBwKCkge1xuICAgICAgY29uc3Qgb25DbGllbnRFbnRyeVJhblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFvbkNsaWVudEVudHJ5UmFuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkNsaWVudEVudHJ5UmFuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgcGVyZm9ybWFuY2UubWFyayhgb25Jbml0aWFsQ2xpZW50UmVuZGVyYClcblxuICAgICAgICAgIGFwaVJ1bm5lcihgb25Jbml0aWFsQ2xpZW50UmVuZGVyYClcbiAgICAgICAgfVxuICAgICAgfSwgW10pXG5cbiAgICAgIHJldHVybiA8R2F0c2J5Um9vdD57U2l0ZVJvb3R9PC9HYXRzYnlSb290PlxuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlcmVyID0gYXBpUnVubmVyKFxuICAgICAgYHJlcGxhY2VIeWRyYXRlRnVuY3Rpb25gLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgUmVhY3RET00uY3JlYXRlUm9vdCA/IFJlYWN0RE9NLmNyZWF0ZVJvb3QgOiBSZWFjdERPTS5oeWRyYXRlXG4gICAgKVswXVxuXG4gICAgZnVuY3Rpb24gcnVuUmVuZGVyKCkge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPVxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBgdW5kZWZpbmVkYFxuICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYF9fX2dhdHNieWApXG4gICAgICAgICAgOiBudWxsXG5cbiAgICAgIGlmIChyZW5kZXJlciA9PT0gUmVhY3RET00uY3JlYXRlUm9vdCkge1xuICAgICAgICByZW5kZXJlcihyb290RWxlbWVudCwge1xuICAgICAgICAgIGh5ZHJhdGU6IHRydWUsXG4gICAgICAgIH0pLnJlbmRlcig8QXBwIC8+KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyZXIoPEFwcCAvPiwgcm9vdEVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hZHJvYmJ5L3plcHRvL2Jsb2IvYjVlZDhkNjA3ZjY3NzI0Nzg4ZWM5ZmY0OTJiZTI5N2Y2NGQ0N2RmYy9zcmMvemVwdG8uanMjTDQzOS1MNDUwXG4gICAgLy8gVE9ETyByZW1vdmUgSUUgMTAgc3VwcG9ydFxuICAgIGNvbnN0IGRvYyA9IGRvY3VtZW50XG4gICAgaWYgKFxuICAgICAgZG9jLnJlYWR5U3RhdGUgPT09IGBjb21wbGV0ZWAgfHxcbiAgICAgIChkb2MucmVhZHlTdGF0ZSAhPT0gYGxvYWRpbmdgICYmICFkb2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKVxuICAgICkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJ1blJlbmRlcigpXG4gICAgICB9LCAwKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihgRE9NQ29udGVudExvYWRlZGAsIGhhbmRsZXIsIGZhbHNlKVxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihgbG9hZGAsIGhhbmRsZXIsIGZhbHNlKVxuXG4gICAgICAgIHJ1blJlbmRlcigpXG4gICAgICB9XG5cbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKGBET01Db250ZW50TG9hZGVkYCwgaGFuZGxlciwgZmFsc2UpXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihgbG9hZGAsIGhhbmRsZXIsIGZhbHNlKVxuICAgIH1cbiAgfSlcbn0pXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2871\n')},6947:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8741);\n/* harmony import */ var _page_renderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(804);\nvar ProdPageRenderer=function ProdPageRenderer(_ref){var location=_ref.location;var pageResources=_loader__WEBPACK_IMPORTED_MODULE_1__/* .default.loadPageSync */ .ZP.loadPageSync(location.pathname);if(!pageResources){return null;}return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_page_renderer__WEBPACK_IMPORTED_MODULE_2__/* .default */ .Z,Object.assign({location:location,pageResources:pageResources},pageResources.json));};/* harmony default export */ __webpack_exports__["default"] = (ProdPageRenderer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wdWJsaWMtcGFnZS1yZW5kZXJlci1wcm9kLmpzP2FmMzkiXSwibmFtZXMiOlsiUHJvZFBhZ2VSZW5kZXJlciIsImxvY2F0aW9uIiwicGFnZVJlc291cmNlcyIsImxvYWRlciIsInBhdGhuYW1lIiwiUmVhY3QiLCJJbnRlcm5hbFBhZ2VSZW5kZXJlciIsImpzb24iXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSxHQUFNQSxpQkFBZ0IsQ0FBRyxRQUFuQkEsaUJBQW1CLE1BQWtCLElBQWZDLFNBQWUsTUFBZkEsUUFBZSxDQUN6QyxHQUFNQyxjQUFhLENBQUdDLGdGQUFBLENBQW9CRixRQUFRLENBQUNHLFFBQTdCLENBQXRCLENBQ0EsR0FBSSxDQUFDRixhQUFMLENBQW9CLENBQ2xCLE1BQU8sS0FBUCxDQUNELENBQ0QsbUJBQU9HLGdEQUFBLENBQW9CQyw0REFBcEIsZ0JBQ0xMLFFBQVEsQ0FBUkEsUUFESyxDQUVMQyxhQUFhLENBQWJBLGFBRkssRUFHRkEsYUFBYSxDQUFDSyxJQUhaLEVBQVAsQ0FLRCxDQVZELENBa0JBLCtEQUFlUCxnQkFBZiIsImZpbGUiOiI2OTQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcblxuaW1wb3J0IGxvYWRlciBmcm9tIFwiLi9sb2FkZXJcIlxuaW1wb3J0IEludGVybmFsUGFnZVJlbmRlcmVyIGZyb20gXCIuL3BhZ2UtcmVuZGVyZXJcIlxuXG5jb25zdCBQcm9kUGFnZVJlbmRlcmVyID0gKHsgbG9jYXRpb24gfSkgPT4ge1xuICBjb25zdCBwYWdlUmVzb3VyY2VzID0gbG9hZGVyLmxvYWRQYWdlU3luYyhsb2NhdGlvbi5wYXRobmFtZSlcbiAgaWYgKCFwYWdlUmVzb3VyY2VzKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFBhZ2VSZW5kZXJlciwge1xuICAgIGxvY2F0aW9uLFxuICAgIHBhZ2VSZXNvdXJjZXMsXG4gICAgLi4ucGFnZVJlc291cmNlcy5qc29uLFxuICB9KVxufVxuXG5Qcm9kUGFnZVJlbmRlcmVyLnByb3BUeXBlcyA9IHtcbiAgbG9jYXRpb246IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgcGF0aG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSkuaXNSZXF1aXJlZCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZFBhZ2VSZW5kZXJlclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6947\n')},861:function(module,__unused_webpack_exports,__webpack_require__){eval("var preferDefault=function preferDefault(m){return m&&m.default||m;};if(false){}else if(true){module.exports=preferDefault(__webpack_require__(6947));}else{}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wdWJsaWMtcGFnZS1yZW5kZXJlci5qcz85NzBkIl0sIm5hbWVzIjpbInByZWZlckRlZmF1bHQiLCJtIiwiZGVmYXVsdCIsInByb2Nlc3MiLCJtb2R1bGUiLCJleHBvcnRzIiwicmVxdWlyZSJdLCJtYXBwaW5ncyI6IkFBQUEsR0FBTUEsY0FBYSxDQUFHLFFBQWhCQSxjQUFnQixDQUFBQyxDQUFDLFFBQUtBLEVBQUMsRUFBSUEsQ0FBQyxDQUFDQyxPQUFSLEVBQW9CRCxDQUF4QixFQUF2QixDQUVBLEdBQUlFLEtBQUosQ0FBMkMsRUFBM0MsSUFFTyxJQUFJQSxJQUFKLENBQW9ELENBQ3pEQyxNQUFNLENBQUNDLE9BQVAsQ0FBaUJMLGFBQWEsQ0FBQ00sbUJBQU8sQ0FBQyxLQUFULENBQTlCLENBQ0QsQ0FGTSxJQUVBIiwiZmlsZSI6Ijg2MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHByZWZlckRlZmF1bHQgPSBtID0+IChtICYmIG0uZGVmYXVsdCkgfHwgbVxuXG5pZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBkZXZlbG9wYCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByZWZlckRlZmF1bHQocmVxdWlyZShgLi9wdWJsaWMtcGFnZS1yZW5kZXJlci1kZXZgKSlcbn0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuQlVJTERfU1RBR0UgPT09IGBidWlsZC1qYXZhc2NyaXB0YCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByZWZlckRlZmF1bHQocmVxdWlyZShgLi9wdWJsaWMtcGFnZS1yZW5kZXJlci1wcm9kYCkpXG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9ICgpID0+IG51bGxcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///861\n")},3639:function(__unused_webpack_module,exports){eval("exports.O=function(Component){return Component;};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWFjdC1saWZlY3ljbGVzLWNvbXBhdC5qcz9mNzg1Il0sIm5hbWVzIjpbImV4cG9ydHMiLCJDb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFBQSxTQUFBLENBQW1CLFNBQUFDLFNBQVMsUUFBSUEsVUFBSixFQUE1QiIsImZpbGUiOiIzNjM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5wb2x5ZmlsbCA9IENvbXBvbmVudCA9PiBDb21wb25lbnRcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3639\n")},5166:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "J": function() { return /* binding */ maybeGetBrowserRedirect; }\n});\n\n;// CONCATENATED MODULE: ./.cache/redirects.json\nvar redirects_namespaceObject = [];\n;// CONCATENATED MODULE: ./.cache/redirect-utils.js\n// Convert to a map for faster lookup in maybeRedirect()\nvar redirectMap=new Map();var redirectIgnoreCaseMap=new Map();redirects_namespaceObject.forEach(function(redirect){if(redirect.ignoreCase){redirectIgnoreCaseMap.set(redirect.fromPath,redirect);}else{redirectMap.set(redirect.fromPath,redirect);}});function maybeGetBrowserRedirect(pathname){var redirect=redirectMap.get(pathname);if(!redirect){redirect=redirectIgnoreCaseMap.get(pathname.toLowerCase());}return redirect;}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWRpcmVjdC11dGlscy5qcz84OWI4Il0sIm5hbWVzIjpbInJlZGlyZWN0TWFwIiwiTWFwIiwicmVkaXJlY3RJZ25vcmVDYXNlTWFwIiwicmVkaXJlY3RzIiwicmVkaXJlY3QiLCJpZ25vcmVDYXNlIiwic2V0IiwiZnJvbVBhdGgiLCJtYXliZUdldEJyb3dzZXJSZWRpcmVjdCIsInBhdGhuYW1lIiwiZ2V0IiwidG9Mb3dlckNhc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBO0FBRUEsR0FBTUEsWUFBVyxDQUFHLEdBQUlDLElBQUosRUFBcEIsQ0FDQSxHQUFNQyxzQkFBcUIsQ0FBRyxHQUFJRCxJQUFKLEVBQTlCLENBRUFFLGlDQUFBLENBQWtCLFNBQUFDLFFBQVEsQ0FBSSxDQUM1QixHQUFJQSxRQUFRLENBQUNDLFVBQWIsQ0FBeUIsQ0FDdkJILHFCQUFxQixDQUFDSSxHQUF0QixDQUEwQkYsUUFBUSxDQUFDRyxRQUFuQyxDQUE2Q0gsUUFBN0MsRUFDRCxDQUZELElBRU8sQ0FDTEosV0FBVyxDQUFDTSxHQUFaLENBQWdCRixRQUFRLENBQUNHLFFBQXpCLENBQW1DSCxRQUFuQyxFQUNELENBQ0YsQ0FORCxFQVFPLFFBQVNJLHdCQUFULENBQWlDQyxRQUFqQyxDQUEyQyxDQUNoRCxHQUFJTCxTQUFRLENBQUdKLFdBQVcsQ0FBQ1UsR0FBWixDQUFnQkQsUUFBaEIsQ0FBZixDQUNBLEdBQUksQ0FBQ0wsUUFBTCxDQUFlLENBQ2JBLFFBQVEsQ0FBR0YscUJBQXFCLENBQUNRLEdBQXRCLENBQTBCRCxRQUFRLENBQUNFLFdBQVQsRUFBMUIsQ0FBWCxDQUNELENBQ0QsTUFBT1AsU0FBUCxDQUNEIiwiZmlsZSI6IjUxNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVkaXJlY3RzIGZyb20gXCIuL3JlZGlyZWN0cy5qc29uXCJcblxuLy8gQ29udmVydCB0byBhIG1hcCBmb3IgZmFzdGVyIGxvb2t1cCBpbiBtYXliZVJlZGlyZWN0KClcblxuY29uc3QgcmVkaXJlY3RNYXAgPSBuZXcgTWFwKClcbmNvbnN0IHJlZGlyZWN0SWdub3JlQ2FzZU1hcCA9IG5ldyBNYXAoKVxuXG5yZWRpcmVjdHMuZm9yRWFjaChyZWRpcmVjdCA9PiB7XG4gIGlmIChyZWRpcmVjdC5pZ25vcmVDYXNlKSB7XG4gICAgcmVkaXJlY3RJZ25vcmVDYXNlTWFwLnNldChyZWRpcmVjdC5mcm9tUGF0aCwgcmVkaXJlY3QpXG4gIH0gZWxzZSB7XG4gICAgcmVkaXJlY3RNYXAuc2V0KHJlZGlyZWN0LmZyb21QYXRoLCByZWRpcmVjdClcbiAgfVxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QnJvd3NlclJlZGlyZWN0KHBhdGhuYW1lKSB7XG4gIGxldCByZWRpcmVjdCA9IHJlZGlyZWN0TWFwLmdldChwYXRobmFtZSlcbiAgaWYgKCFyZWRpcmVjdCkge1xuICAgIHJlZGlyZWN0ID0gcmVkaXJlY3RJZ25vcmVDYXNlTWFwLmdldChwYXRobmFtZS50b0xvd2VyQ2FzZSgpKVxuICB9XG4gIHJldHVybiByZWRpcmVjdFxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5166\n')},154:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api_runner_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7343);\nif(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){console.error("Service workers can only be used over HTTPS, or on localhost for development");}else if("serviceWorker"in navigator){navigator.serviceWorker.register("/justice40-tool/803-0bf34ac"+"/sw.js").then(function(reg){reg.addEventListener("updatefound",function(){(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerUpdateFound",{serviceWorker:reg});// The updatefound event implies that reg.installing is set; see\n// https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\nvar installingWorker=reg.installing;console.log("installingWorker",installingWorker);installingWorker.addEventListener("statechange",function(){switch(installingWorker.state){case"installed":if(navigator.serviceWorker.controller){// At this point, the old content will have been purged and the fresh content will\n// have been added to the cache.\n// We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\nwindow.___swUpdated=true;// We call the onServiceWorkerUpdateReady API so users can show update prompts.\n(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerUpdateReady",{serviceWorker:reg});// If resources failed for the current page, reload.\nif(window.___failedResources){console.log("resources failed, SW updated - reloading");window.location.reload();}}else{// At this point, everything has been precached.\n// It\'s the perfect time to display a "Content is cached for offline use." message.\nconsole.log("Content is now available offline!");// Post to service worker that install is complete.\n// Delay to allow time for the event listener to be added --\n// otherwise fetch is called too soon and resources aren\'t cached.\n(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerInstalled",{serviceWorker:reg});}break;case"redundant":console.error("The installing service worker became redundant.");(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerRedundant",{serviceWorker:reg});break;case"activated":(0,_api_runner_browser__WEBPACK_IMPORTED_MODULE_0__/* .apiRunner */ .h)("onServiceWorkerActive",{serviceWorker:reg});break;}});});}).catch(function(e){console.error("Error during service worker registration:",e);});}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9yZWdpc3Rlci1zZXJ2aWNlLXdvcmtlci5qcz8zNTI1Il0sIm5hbWVzIjpbIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsImNvbnNvbGUiLCJlcnJvciIsIm5hdmlnYXRvciIsInNlcnZpY2VXb3JrZXIiLCJyZWdpc3RlciIsIl9fQkFTRV9QQVRIX18iLCJ0aGVuIiwicmVnIiwiYWRkRXZlbnRMaXN0ZW5lciIsImFwaVJ1bm5lciIsImluc3RhbGxpbmdXb3JrZXIiLCJpbnN0YWxsaW5nIiwibG9nIiwic3RhdGUiLCJjb250cm9sbGVyIiwiX19fc3dVcGRhdGVkIiwiX19fZmFpbGVkUmVzb3VyY2VzIiwicmVsb2FkIiwiY2F0Y2giLCJlIl0sIm1hcHBpbmdzIjoiOztBQUVBLEdBQ0VBLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsUUFBaEIsYUFDQUYsTUFBTSxDQUFDQyxRQUFQLENBQWdCRSxRQUFoQixjQUZGLENBR0UsQ0FDQUMsT0FBTyxDQUFDQyxLQUFSLGlGQUdELENBUEQsSUFPTyxJQUFJLGlCQUFtQkMsVUFBdkIsQ0FBa0MsQ0FDdkNBLFNBQVMsQ0FBQ0MsYUFBVixDQUNHQyxRQURILENBQ2VDLDZCQURmLFdBRUdDLElBRkgsQ0FFUSxTQUFVQyxHQUFWLENBQWUsQ0FDbkJBLEdBQUcsQ0FBQ0MsZ0JBQUosZUFBb0MsVUFBTSxDQUN4Q0MsdUVBQVMsOEJBQStCLENBQUVOLGFBQWEsQ0FBRUksR0FBakIsQ0FBL0IsQ0FBVCxDQUNBO0FBQ0E7QUFDQSxHQUFNRyxpQkFBZ0IsQ0FBR0gsR0FBRyxDQUFDSSxVQUE3QixDQUNBWCxPQUFPLENBQUNZLEdBQVIsb0JBQWdDRixnQkFBaEMsRUFDQUEsZ0JBQWdCLENBQUNGLGdCQUFqQixlQUFpRCxVQUFNLENBQ3JELE9BQVFFLGdCQUFnQixDQUFDRyxLQUF6QixFQUNFLGdCQUNFLEdBQUlYLFNBQVMsQ0FBQ0MsYUFBVixDQUF3QlcsVUFBNUIsQ0FBd0MsQ0FDdEM7QUFDQTtBQUVBO0FBQ0FsQixNQUFNLENBQUNtQixZQUFQLENBQXNCLElBQXRCLENBQ0E7QUFDQU4sdUVBQVMsOEJBQStCLENBQUVOLGFBQWEsQ0FBRUksR0FBakIsQ0FBL0IsQ0FBVCxDQUVBO0FBQ0EsR0FBSVgsTUFBTSxDQUFDb0Isa0JBQVgsQ0FBK0IsQ0FDN0JoQixPQUFPLENBQUNZLEdBQVIsNkNBQ0FoQixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JvQixNQUFoQixHQUNELENBQ0YsQ0FkRCxJQWNPLENBQ0w7QUFDQTtBQUNBakIsT0FBTyxDQUFDWSxHQUFSLHNDQUVBO0FBQ0E7QUFDQTtBQUNBSCx1RUFBUyw0QkFBNkIsQ0FBRU4sYUFBYSxDQUFFSSxHQUFqQixDQUE3QixDQUFULENBQ0QsQ0FDRCxNQUVGLGdCQUNFUCxPQUFPLENBQUNDLEtBQVIsb0RBQ0FRLHVFQUFTLDRCQUE2QixDQUFFTixhQUFhLENBQUVJLEdBQWpCLENBQTdCLENBQVQsQ0FDQSxNQUVGLGdCQUNFRSx1RUFBUyx5QkFBMEIsQ0FBRU4sYUFBYSxDQUFFSSxHQUFqQixDQUExQixDQUFULENBQ0EsTUFuQ0osQ0FxQ0QsQ0F0Q0QsRUF1Q0QsQ0E3Q0QsRUE4Q0QsQ0FqREgsRUFrREdXLEtBbERILENBa0RTLFNBQVVDLENBQVYsQ0FBYSxDQUNsQm5CLE9BQU8sQ0FBQ0MsS0FBUiw2Q0FBMkRrQixDQUEzRCxFQUNELENBcERILEVBcUREIiwiZmlsZSI6IjE1NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFwaVJ1bm5lciB9IGZyb20gXCIuL2FwaS1ydW5uZXItYnJvd3NlclwiXG5cbmlmIChcbiAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSBgaHR0cHM6YCAmJlxuICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgIT09IGBsb2NhbGhvc3RgXG4pIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBgU2VydmljZSB3b3JrZXJzIGNhbiBvbmx5IGJlIHVzZWQgb3ZlciBIVFRQUywgb3Igb24gbG9jYWxob3N0IGZvciBkZXZlbG9wbWVudGBcbiAgKVxufSBlbHNlIGlmIChgc2VydmljZVdvcmtlcmAgaW4gbmF2aWdhdG9yKSB7XG4gIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyXG4gICAgLnJlZ2lzdGVyKGAke19fQkFTRV9QQVRIX199L3N3LmpzYClcbiAgICAudGhlbihmdW5jdGlvbiAocmVnKSB7XG4gICAgICByZWcuYWRkRXZlbnRMaXN0ZW5lcihgdXBkYXRlZm91bmRgLCAoKSA9PiB7XG4gICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VyVXBkYXRlRm91bmRgLCB7IHNlcnZpY2VXb3JrZXI6IHJlZyB9KVxuICAgICAgICAvLyBUaGUgdXBkYXRlZm91bmQgZXZlbnQgaW1wbGllcyB0aGF0IHJlZy5pbnN0YWxsaW5nIGlzIHNldDsgc2VlXG4gICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNzZXJ2aWNlLXdvcmtlci1yZWdpc3RyYXRpb24tdXBkYXRlZm91bmQtZXZlbnRcbiAgICAgICAgY29uc3QgaW5zdGFsbGluZ1dvcmtlciA9IHJlZy5pbnN0YWxsaW5nXG4gICAgICAgIGNvbnNvbGUubG9nKGBpbnN0YWxsaW5nV29ya2VyYCwgaW5zdGFsbGluZ1dvcmtlcilcbiAgICAgICAgaW5zdGFsbGluZ1dvcmtlci5hZGRFdmVudExpc3RlbmVyKGBzdGF0ZWNoYW5nZWAsICgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGluc3RhbGxpbmdXb3JrZXIuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgYGluc3RhbGxlZGA6XG4gICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIG9sZCBjb250ZW50IHdpbGwgaGF2ZSBiZWVuIHB1cmdlZCBhbmQgdGhlIGZyZXNoIGNvbnRlbnQgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY2FjaGUuXG5cbiAgICAgICAgICAgICAgICAvLyBXZSBzZXQgYSBmbGFnIHNvIEdhdHNieSBMaW5rIGtub3dzIHRvIHJlZnJlc2ggdGhlIHBhZ2Ugb24gbmV4dCBuYXZpZ2F0aW9uIGF0dGVtcHRcbiAgICAgICAgICAgICAgICB3aW5kb3cuX19fc3dVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbGwgdGhlIG9uU2VydmljZVdvcmtlclVwZGF0ZVJlYWR5IEFQSSBzbyB1c2VycyBjYW4gc2hvdyB1cGRhdGUgcHJvbXB0cy5cbiAgICAgICAgICAgICAgICBhcGlSdW5uZXIoYG9uU2VydmljZVdvcmtlclVwZGF0ZVJlYWR5YCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcblxuICAgICAgICAgICAgICAgIC8vIElmIHJlc291cmNlcyBmYWlsZWQgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIHJlbG9hZC5cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fX2ZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHJlc291cmNlcyBmYWlsZWQsIFNXIHVwZGF0ZWQgLSByZWxvYWRpbmdgKVxuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcHJlY2FjaGVkLlxuICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIHBlcmZlY3QgdGltZSB0byBkaXNwbGF5IGEgXCJDb250ZW50IGlzIGNhY2hlZCBmb3Igb2ZmbGluZSB1c2UuXCIgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29udGVudCBpcyBub3cgYXZhaWxhYmxlIG9mZmxpbmUhYClcblxuICAgICAgICAgICAgICAgIC8vIFBvc3QgdG8gc2VydmljZSB3b3JrZXIgdGhhdCBpbnN0YWxsIGlzIGNvbXBsZXRlLlxuICAgICAgICAgICAgICAgIC8vIERlbGF5IHRvIGFsbG93IHRpbWUgZm9yIHRoZSBldmVudCBsaXN0ZW5lciB0byBiZSBhZGRlZCAtLVxuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBmZXRjaCBpcyBjYWxsZWQgdG9vIHNvb24gYW5kIHJlc291cmNlcyBhcmVuJ3QgY2FjaGVkLlxuICAgICAgICAgICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VySW5zdGFsbGVkYCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlIGByZWR1bmRhbnRgOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgaW5zdGFsbGluZyBzZXJ2aWNlIHdvcmtlciBiZWNhbWUgcmVkdW5kYW50LmApXG4gICAgICAgICAgICAgIGFwaVJ1bm5lcihgb25TZXJ2aWNlV29ya2VyUmVkdW5kYW50YCwgeyBzZXJ2aWNlV29ya2VyOiByZWcgfSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBgYWN0aXZhdGVkYDpcbiAgICAgICAgICAgICAgYXBpUnVubmVyKGBvblNlcnZpY2VXb3JrZXJBY3RpdmVgLCB7IHNlcnZpY2VXb3JrZXI6IHJlZyB9KVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBzZXJ2aWNlIHdvcmtlciByZWdpc3RyYXRpb246YCwgZSlcbiAgICB9KVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///154\n')},1578:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Z": function() { return /* binding */ stripPrefix; }\n/* harmony export */ });\n/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn\'t found.\n */function stripPrefix(str,prefix){if(prefix===void 0){prefix="";}if(!prefix){return str;}if(str===prefix){return"/";}if(str.startsWith(prefix+"/")){return str.slice(prefix.length);}return str;}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9zdHJpcC1wcmVmaXguanM/NzEyMiJdLCJuYW1lcyI6WyJzdHJpcFByZWZpeCIsInN0ciIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImxlbmd0aCJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0EsR0FFZSxRQUFTQSxZQUFULENBQXFCQyxHQUFyQixDQUEwQkMsTUFBMUIsQ0FBdUMsSUFBYkEsTUFBYSxXQUFiQSxNQUFhLEtBQ3BELEdBQUksQ0FBQ0EsTUFBTCxDQUFhLENBQ1gsTUFBT0QsSUFBUCxDQUNELENBRUQsR0FBSUEsR0FBRyxHQUFLQyxNQUFaLENBQW9CLENBQ2xCLFVBQ0QsQ0FFRCxHQUFJRCxHQUFHLENBQUNFLFVBQUosQ0FBa0JELE1BQWxCLEtBQUosQ0FBa0MsQ0FDaEMsTUFBT0QsSUFBRyxDQUFDRyxLQUFKLENBQVVGLE1BQU0sQ0FBQ0csTUFBakIsQ0FBUCxDQUNELENBRUQsTUFBT0osSUFBUCxDQUNEIiwiZmlsZSI6IjE1NzguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlbW92ZSBhIHByZWZpeCBmcm9tIGEgc3RyaW5nLiBSZXR1cm4gdGhlIGlucHV0IHN0cmluZyBpZiB0aGUgZ2l2ZW4gcHJlZml4XG4gKiBpc24ndCBmb3VuZC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpcFByZWZpeChzdHIsIHByZWZpeCA9IGBgKSB7XG4gIGlmICghcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgaWYgKHN0ciA9PT0gcHJlZml4KSB7XG4gICAgcmV0dXJuIGAvYFxuICB9XG5cbiAgaWYgKHN0ci5zdGFydHNXaXRoKGAke3ByZWZpeH0vYCkpIHtcbiAgICByZXR1cm4gc3RyLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIH1cblxuICByZXR1cm4gc3RyXG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1578\n')},9037:function(n,I,g){"use strict";g.r(I)},6101:function(__unused_webpack_module,exports,__webpack_require__){eval("var _toConsumableArray=__webpack_require__(319);var Sentry=__webpack_require__(7066);var Tracing=__webpack_require__(7374);exports.onClientEntry=function(_,pluginParams){if(pluginParams===undefined){return;}pluginParams._metadata=pluginParams._metadata||{};pluginParams._metadata.sdk={name:'sentry.javascript.gatsby',packages:[{name:'npm:@sentry/gatsby',version:Sentry.SDK_VERSION}],version:Sentry.SDK_VERSION};var integrations=_toConsumableArray(pluginParams.integrations||[]);if(Tracing.hasTracingEnabled(pluginParams)&&!integrations.some(function(ele){return ele.name==='BrowserTracing';})){integrations.push(new Tracing.Integrations.BrowserTracing(pluginParams.browserTracingOptions));}Tracing.addExtensionMethods();Sentry.init(Object.assign({autoSessionTracking:true,environment:\"production\"||0,// eslint-disable-next-line no-undef\nrelease:\"0bf34ac718b61b68729f2f68afd60430d338a14a\",// eslint-disable-next-line no-undef\ndsn:\"\"},pluginParams,{integrations:integrations}));window.Sentry=Sentry;};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2dhdHNieS9nYXRzYnktYnJvd3Nlci5qcz8xNmFhIl0sIm5hbWVzIjpbIlNlbnRyeSIsInJlcXVpcmUiLCJUcmFjaW5nIiwiZXhwb3J0cyIsIl8iLCJwbHVnaW5QYXJhbXMiLCJ1bmRlZmluZWQiLCJfbWV0YWRhdGEiLCJzZGsiLCJuYW1lIiwicGFja2FnZXMiLCJ2ZXJzaW9uIiwiU0RLX1ZFUlNJT04iLCJpbnRlZ3JhdGlvbnMiLCJoYXNUcmFjaW5nRW5hYmxlZCIsInNvbWUiLCJlbGUiLCJwdXNoIiwiSW50ZWdyYXRpb25zIiwiQnJvd3NlclRyYWNpbmciLCJicm93c2VyVHJhY2luZ09wdGlvbnMiLCJhZGRFeHRlbnNpb25NZXRob2RzIiwiaW5pdCIsImF1dG9TZXNzaW9uVHJhY2tpbmciLCJlbnZpcm9ubWVudCIsInByb2Nlc3MiLCJyZWxlYXNlIiwiX19TRU5UUllfUkVMRUFTRV9fIiwiZHNuIiwiX19TRU5UUllfRFNOX18iLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiJnREFBQSxHQUFNQSxPQUFNLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUF0QixDQUNBLEdBQU1DLFFBQU8sQ0FBR0QsbUJBQU8sQ0FBQyxJQUFELENBQXZCLENBRUFFLHFCQUFBLENBQXdCLFNBQVNDLENBQVQsQ0FBWUMsWUFBWixDQUEwQixDQUNoRCxHQUFJQSxZQUFZLEdBQUtDLFNBQXJCLENBQWdDLENBQzlCLE9BQ0QsQ0FFREQsWUFBWSxDQUFDRSxTQUFiLENBQXlCRixZQUFZLENBQUNFLFNBQWIsRUFBMEIsRUFBbkQsQ0FDQUYsWUFBWSxDQUFDRSxTQUFiLENBQXVCQyxHQUF2QixDQUE2QixDQUMzQkMsSUFBSSxDQUFFLDBCQURxQixDQUUzQkMsUUFBUSxDQUFFLENBQ1IsQ0FDRUQsSUFBSSxDQUFFLG9CQURSLENBRUVFLE9BQU8sQ0FBRVgsTUFBTSxDQUFDWSxXQUZsQixDQURRLENBRmlCLENBUTNCRCxPQUFPLENBQUVYLE1BQU0sQ0FBQ1ksV0FSVyxDQUE3QixDQVdBLEdBQU1DLGFBQVksb0JBQVFSLFlBQVksQ0FBQ1EsWUFBYixFQUE2QixFQUFyQyxDQUFsQixDQUVBLEdBQUlYLE9BQU8sQ0FBQ1ksaUJBQVIsQ0FBMEJULFlBQTFCLEdBQTJDLENBQUNRLFlBQVksQ0FBQ0UsSUFBYixDQUFrQixTQUFBQyxHQUFHLFFBQUlBLElBQUcsQ0FBQ1AsSUFBSixHQUFhLGdCQUFqQixFQUFyQixDQUFoRCxDQUF5RyxDQUN2R0ksWUFBWSxDQUFDSSxJQUFiLENBQWtCLEdBQUlmLFFBQU8sQ0FBQ2dCLFlBQVIsQ0FBcUJDLGNBQXpCLENBQXdDZCxZQUFZLENBQUNlLHFCQUFyRCxDQUFsQixFQUNELENBRURsQixPQUFPLENBQUNtQixtQkFBUixHQUVBckIsTUFBTSxDQUFDc0IsSUFBUCxnQkFDRUMsbUJBQW1CLENBQUUsSUFEdkIsQ0FFRUMsV0FBVyxDQUFFQyxZQUFBLEVBQXdCLENBRnZDLENBR0U7QUFDQUMsT0FBTyxDQUFFQywwQ0FKWCxDQUtFO0FBQ0FDLEdBQUcsQ0FBRUMsRUFOUCxFQU9LeEIsWUFQTCxFQVFFUSxZQUFZLENBQVpBLFlBUkYsSUFXQWlCLE1BQU0sQ0FBQzlCLE1BQVAsQ0FBZ0JBLE1BQWhCLENBQ0QsQ0FyQ0QiLCJmaWxlIjoiNjEwMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbnRyeSA9IHJlcXVpcmUoJ0BzZW50cnkvcmVhY3QnKTtcbmNvbnN0IFRyYWNpbmcgPSByZXF1aXJlKCdAc2VudHJ5L3RyYWNpbmcnKTtcblxuZXhwb3J0cy5vbkNsaWVudEVudHJ5ID0gZnVuY3Rpb24oXywgcGx1Z2luUGFyYW1zKSB7XG4gIGlmIChwbHVnaW5QYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBsdWdpblBhcmFtcy5fbWV0YWRhdGEgPSBwbHVnaW5QYXJhbXMuX21ldGFkYXRhIHx8IHt9O1xuICBwbHVnaW5QYXJhbXMuX21ldGFkYXRhLnNkayA9IHtcbiAgICBuYW1lOiAnc2VudHJ5LmphdmFzY3JpcHQuZ2F0c2J5JyxcbiAgICBwYWNrYWdlczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnbnBtOkBzZW50cnkvZ2F0c2J5JyxcbiAgICAgICAgdmVyc2lvbjogU2VudHJ5LlNES19WRVJTSU9OLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHZlcnNpb246IFNlbnRyeS5TREtfVkVSU0lPTixcbiAgfTtcblxuICBjb25zdCBpbnRlZ3JhdGlvbnMgPSBbLi4uKHBsdWdpblBhcmFtcy5pbnRlZ3JhdGlvbnMgfHwgW10pXTtcblxuICBpZiAoVHJhY2luZy5oYXNUcmFjaW5nRW5hYmxlZChwbHVnaW5QYXJhbXMpICYmICFpbnRlZ3JhdGlvbnMuc29tZShlbGUgPT4gZWxlLm5hbWUgPT09ICdCcm93c2VyVHJhY2luZycpKSB7XG4gICAgaW50ZWdyYXRpb25zLnB1c2gobmV3IFRyYWNpbmcuSW50ZWdyYXRpb25zLkJyb3dzZXJUcmFjaW5nKHBsdWdpblBhcmFtcy5icm93c2VyVHJhY2luZ09wdGlvbnMpKTtcbiAgfVxuXG4gIFRyYWNpbmcuYWRkRXh0ZW5zaW9uTWV0aG9kcygpO1xuXG4gIFNlbnRyeS5pbml0KHtcbiAgICBhdXRvU2Vzc2lvblRyYWNraW5nOiB0cnVlLFxuICAgIGVudmlyb25tZW50OiBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHJlbGVhc2U6IF9fU0VOVFJZX1JFTEVBU0VfXyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBkc246IF9fU0VOVFJZX0RTTl9fLFxuICAgIC4uLnBsdWdpblBhcmFtcyxcbiAgICBpbnRlZ3JhdGlvbnMsXG4gIH0pO1xuXG4gIHdpbmRvdy5TZW50cnkgPSBTZW50cnk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6101\n")},5526:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.wrapPageElement=void 0;var _wrapPage=_interopRequireDefault(__webpack_require__(6604));var wrapPageElement=_wrapPage.default;exports.wrapPageElement=wrapPageElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvZ2F0c2J5LWJyb3dzZXIuanM/ZjRiYSJdLCJuYW1lcyI6WyJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImV4cG9ydHMiLCJfd3JhcFBhZ2UiLCJ3cmFwUGFnZUVsZW1lbnQiLCJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiQUFFQSxHQUFJQSx1QkFBc0IsQ0FBR0MsbUJBQU8sQ0FBQyxJQUFELENBQXBDLENBRUFDLGtCQUFBLENBQXFCLElBQXJCLENBQ0FBLHVCQUFBLENBQTBCLElBQUssRUFBL0IsQ0FFQSxHQUFJQyxVQUFTLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUF0QyxDQUVBLEdBQUlHLGdCQUFlLENBQUdELFNBQVMsQ0FBQ0UsT0FBaEMsQ0FDQUgsdUJBQUEsQ0FBMEJFLGVBQTFCIiwiZmlsZSI6IjU1MjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLndyYXBQYWdlRWxlbWVudCA9IHZvaWQgMDtcblxudmFyIF93cmFwUGFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vd3JhcC1wYWdlXCIpKTtcblxudmFyIHdyYXBQYWdlRWxlbWVudCA9IF93cmFwUGFnZS5kZWZhdWx0O1xuZXhwb3J0cy53cmFwUGFnZUVsZW1lbnQgPSB3cmFwUGFnZUVsZW1lbnQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5526\n")},8368:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.IntlContextConsumer=exports.IntlContextProvider=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var IntlContext=_react.default.createContext();var IntlContextProvider=IntlContext.Provider;exports.IntlContextProvider=IntlContextProvider;var IntlContextConsumer=IntlContext.Consumer;exports.IntlContextConsumer=IntlContextConsumer;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvaW50bC1jb250ZXh0LmpzPzlmY2QiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiSW50bENvbnRleHQiLCJkZWZhdWx0IiwiY3JlYXRlQ29udGV4dCIsIkludGxDb250ZXh0UHJvdmlkZXIiLCJQcm92aWRlciIsIkludGxDb250ZXh0Q29uc3VtZXIiLCJDb25zdW1lciJdLCJtYXBwaW5ncyI6IkFBRUEsR0FBSUEsdUJBQXNCLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFwQyxDQUVBQyxrQkFBQSxDQUFxQixJQUFyQixDQUNBQSwyQkFBQSxDQUE4QkEsMkJBQUEsQ0FBOEIsSUFBSyxFQUFqRSxDQUVBLEdBQUlDLE9BQU0sQ0FBR0gsc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQW5DLENBRUEsR0FBSUcsWUFBVyxDQUFHRCxNQUFNLENBQUNFLE9BQVAsQ0FBZUMsYUFBZixFQUFsQixDQUVBLEdBQUlDLG9CQUFtQixDQUFHSCxXQUFXLENBQUNJLFFBQXRDLENBQ0FOLDJCQUFBLENBQThCSyxtQkFBOUIsQ0FDQSxHQUFJRSxvQkFBbUIsQ0FBR0wsV0FBVyxDQUFDTSxRQUF0QyxDQUNBUiwyQkFBQSxDQUE4Qk8sbUJBQTlCIiwiZmlsZSI6IjgzNjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLkludGxDb250ZXh0Q29uc3VtZXIgPSBleHBvcnRzLkludGxDb250ZXh0UHJvdmlkZXIgPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBJbnRsQ29udGV4dCA9IF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUNvbnRleHQoKTtcblxudmFyIEludGxDb250ZXh0UHJvdmlkZXIgPSBJbnRsQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydHMuSW50bENvbnRleHRQcm92aWRlciA9IEludGxDb250ZXh0UHJvdmlkZXI7XG52YXIgSW50bENvbnRleHRDb25zdW1lciA9IEludGxDb250ZXh0LkNvbnN1bWVyO1xuZXhwb3J0cy5JbnRsQ29udGV4dENvbnN1bWVyID0gSW50bENvbnRleHRDb25zdW1lcjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8368\n")},7060:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"FormattedDate\": function() { return /* binding */ FormattedDate; },\n \"FormattedDateParts\": function() { return /* binding */ FormattedDateParts; },\n \"FormattedDisplayName\": function() { return /* binding */ FormattedDisplayName; },\n \"FormattedHTMLMessage\": function() { return /* reexport */ html_message; },\n \"FormattedList\": function() { return /* binding */ FormattedList; },\n \"FormattedMessage\": function() { return /* reexport */ message; },\n \"FormattedNumber\": function() { return /* binding */ FormattedNumber; },\n \"FormattedNumberParts\": function() { return /* reexport */ FormattedNumberParts; },\n \"FormattedPlural\": function() { return /* reexport */ plural; },\n \"FormattedRelativeTime\": function() { return /* reexport */ relative; },\n \"FormattedTime\": function() { return /* binding */ FormattedTime; },\n \"FormattedTimeParts\": function() { return /* binding */ FormattedTimeParts; },\n \"IntlContext\": function() { return /* reexport */ Context; },\n \"IntlProvider\": function() { return /* reexport */ provider_IntlProvider; },\n \"RawIntlProvider\": function() { return /* reexport */ Provider; },\n \"createIntl\": function() { return /* reexport */ createIntl; },\n \"createIntlCache\": function() { return /* reexport */ createIntlCache; },\n \"defineMessages\": function() { return /* binding */ defineMessages; },\n \"injectIntl\": function() { return /* reexport */ injectIntl; },\n \"useIntl\": function() { return /* reexport */ useIntl; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\nvar react_namespaceObject = /*#__PURE__*/__webpack_require__.t(react, 2);\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/types.js\nvar TYPE;\n\n(function (TYPE) {\n /**\n * Raw text\n */\n TYPE[TYPE[\"literal\"] = 0] = \"literal\";\n /**\n * Variable w/o any format, e.g `var` in `this is a {var}`\n */\n\n TYPE[TYPE[\"argument\"] = 1] = \"argument\";\n /**\n * Variable w/ number format\n */\n\n TYPE[TYPE[\"number\"] = 2] = \"number\";\n /**\n * Variable w/ date format\n */\n\n TYPE[TYPE[\"date\"] = 3] = \"date\";\n /**\n * Variable w/ time format\n */\n\n TYPE[TYPE[\"time\"] = 4] = \"time\";\n /**\n * Variable w/ select format\n */\n\n TYPE[TYPE[\"select\"] = 5] = \"select\";\n /**\n * Variable w/ plural format\n */\n\n TYPE[TYPE[\"plural\"] = 6] = \"plural\";\n /**\n * Only possible within plural argument.\n * This is the `#` symbol that will be substituted with the count.\n */\n\n TYPE[TYPE[\"pound\"] = 7] = \"pound\";\n})(TYPE || (TYPE = {}));\n/**\n * Type Guards\n */\n\n\nfunction isLiteralElement(el) {\n return el.type === TYPE.literal;\n}\nfunction isArgumentElement(el) {\n return el.type === TYPE.argument;\n}\nfunction isNumberElement(el) {\n return el.type === TYPE.number;\n}\nfunction isDateElement(el) {\n return el.type === TYPE.date;\n}\nfunction isTimeElement(el) {\n return el.type === TYPE.time;\n}\nfunction isSelectElement(el) {\n return el.type === TYPE.select;\n}\nfunction isPluralElement(el) {\n return el.type === TYPE.plural;\n}\nfunction isPoundElement(el) {\n return el.type === TYPE.pound;\n}\nfunction isNumberSkeleton(el) {\n return !!(el && typeof el === 'object' && el.type === 0\n /* number */\n );\n}\nfunction isDateTimeSkeleton(el) {\n return !!(el && typeof el === 'object' && el.type === 1\n /* dateTime */\n );\n}\nfunction createLiteralElement(value) {\n return {\n type: TYPE.literal,\n value: value\n };\n}\nfunction createNumberElement(value, style) {\n return {\n type: TYPE.number,\n value: value,\n style: style\n };\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/parser.js\n// tslint:disable:only-arrow-functions\n// tslint:disable:object-literal-shorthand\n// tslint:disable:trailing-comma\n// tslint:disable:object-literal-sort-keys\n// tslint:disable:one-variable-per-declaration\n// tslint:disable:max-line-length\n// tslint:disable:no-consecutive-blank-lines\n// tslint:disable:align\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (b.hasOwnProperty(p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar __assign = undefined && undefined.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n}; // Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.2.6 )\n//\n// https://pegjs.org/ https://github.com/metadevpro/ts-pegjs\n\n\n\n\nvar SyntaxError =\n/** @class */\nfunction (_super) {\n __extends(SyntaxError, _super);\n\n function SyntaxError(message, expected, found, location) {\n var _this = _super.call(this) || this;\n\n _this.message = message;\n _this.expected = expected;\n _this.found = found;\n _this.location = location;\n _this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(_this, SyntaxError);\n }\n\n return _this;\n }\n\n SyntaxError.buildMessage = function (expected, found) {\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\").replace(/\\0/g, \"\\\\0\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch);\n }).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch);\n });\n }\n\n function classEscape(s) {\n return s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\").replace(/\\^/g, \"\\\\^\").replace(/-/g, \"\\\\-\").replace(/\\0/g, \"\\\\0\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch);\n }).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch);\n });\n }\n\n function describeExpectation(expectation) {\n switch (expectation.type) {\n case \"literal\":\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n\n case \"class\":\n var escapedParts = expectation.parts.map(function (part) {\n return Array.isArray(part) ? classEscape(part[0]) + \"-\" + classEscape(part[1]) : classEscape(part);\n });\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n\n case \"any\":\n return \"any character\";\n\n case \"end\":\n return \"end of input\";\n\n case \"other\":\n return expectation.description;\n }\n }\n\n function describeExpected(expected1) {\n var descriptions = expected1.map(describeExpectation);\n var i;\n var j;\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \") + \", or \" + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found1) {\n return found1 ? \"\\\"\" + literalEscape(found1) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n };\n\n return SyntaxError;\n}(Error);\n\n\n\nfunction peg$parse(input, options) {\n options = options !== undefined ? options : {};\n var peg$FAILED = {};\n var peg$startRuleFunctions = {\n start: peg$parsestart\n };\n var peg$startRuleFunction = peg$parsestart;\n\n var peg$c0 = function peg$c0(parts) {\n return parts.join('');\n };\n\n var peg$c1 = function peg$c1(messageText) {\n return __assign({\n type: TYPE.literal,\n value: messageText\n }, insertLocation());\n };\n\n var peg$c2 = \"#\";\n var peg$c3 = peg$literalExpectation(\"#\", false);\n\n var peg$c4 = function peg$c4() {\n return __assign({\n type: TYPE.pound\n }, insertLocation());\n };\n\n var peg$c5 = peg$otherExpectation(\"argumentElement\");\n var peg$c6 = \"{\";\n var peg$c7 = peg$literalExpectation(\"{\", false);\n var peg$c8 = \"}\";\n var peg$c9 = peg$literalExpectation(\"}\", false);\n\n var peg$c10 = function peg$c10(value) {\n return __assign({\n type: TYPE.argument,\n value: value\n }, insertLocation());\n };\n\n var peg$c11 = peg$otherExpectation(\"numberSkeletonId\");\n var peg$c12 = /^['\\/{}]/;\n var peg$c13 = peg$classExpectation([\"'\", \"/\", \"{\", \"}\"], false, false);\n var peg$c14 = peg$anyExpectation();\n var peg$c15 = peg$otherExpectation(\"numberSkeletonTokenOption\");\n var peg$c16 = \"/\";\n var peg$c17 = peg$literalExpectation(\"/\", false);\n\n var peg$c18 = function peg$c18(option) {\n return option;\n };\n\n var peg$c19 = peg$otherExpectation(\"numberSkeletonToken\");\n\n var peg$c20 = function peg$c20(stem, options) {\n return {\n stem: stem,\n options: options\n };\n };\n\n var peg$c21 = function peg$c21(tokens) {\n return __assign({\n type: 0\n /* number */\n ,\n tokens: tokens\n }, insertLocation());\n };\n\n var peg$c22 = \"::\";\n var peg$c23 = peg$literalExpectation(\"::\", false);\n\n var peg$c24 = function peg$c24(skeleton) {\n return skeleton;\n };\n\n var peg$c25 = function peg$c25() {\n messageCtx.push('numberArgStyle');\n return true;\n };\n\n var peg$c26 = function peg$c26(style) {\n messageCtx.pop();\n return style.replace(/\\s*$/, '');\n };\n\n var peg$c27 = \",\";\n var peg$c28 = peg$literalExpectation(\",\", false);\n var peg$c29 = \"number\";\n var peg$c30 = peg$literalExpectation(\"number\", false);\n\n var peg$c31 = function peg$c31(value, type, style) {\n return __assign({\n type: type === 'number' ? TYPE.number : type === 'date' ? TYPE.date : TYPE.time,\n style: style && style[2],\n value: value\n }, insertLocation());\n };\n\n var peg$c32 = \"'\";\n var peg$c33 = peg$literalExpectation(\"'\", false);\n var peg$c34 = /^[^']/;\n var peg$c35 = peg$classExpectation([\"'\"], true, false);\n var peg$c36 = /^[^a-zA-Z'{}]/;\n var peg$c37 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"'\", \"{\", \"}\"], true, false);\n var peg$c38 = /^[a-zA-Z]/;\n var peg$c39 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"]], false, false);\n\n var peg$c40 = function peg$c40(pattern) {\n return __assign({\n type: 1\n /* dateTime */\n ,\n pattern: pattern\n }, insertLocation());\n };\n\n var peg$c41 = function peg$c41() {\n messageCtx.push('dateOrTimeArgStyle');\n return true;\n };\n\n var peg$c42 = \"date\";\n var peg$c43 = peg$literalExpectation(\"date\", false);\n var peg$c44 = \"time\";\n var peg$c45 = peg$literalExpectation(\"time\", false);\n var peg$c46 = \"plural\";\n var peg$c47 = peg$literalExpectation(\"plural\", false);\n var peg$c48 = \"selectordinal\";\n var peg$c49 = peg$literalExpectation(\"selectordinal\", false);\n var peg$c50 = \"offset:\";\n var peg$c51 = peg$literalExpectation(\"offset:\", false);\n\n var peg$c52 = function peg$c52(value, pluralType, offset, options) {\n return __assign({\n type: TYPE.plural,\n pluralType: pluralType === 'plural' ? 'cardinal' : 'ordinal',\n value: value,\n offset: offset ? offset[2] : 0,\n options: options.reduce(function (all, _a) {\n var id = _a.id,\n value = _a.value,\n optionLocation = _a.location;\n\n if (id in all) {\n error(\"Duplicate option \\\"\" + id + \"\\\" in plural element: \\\"\" + text() + \"\\\"\", location());\n }\n\n all[id] = {\n value: value,\n location: optionLocation\n };\n return all;\n }, {})\n }, insertLocation());\n };\n\n var peg$c53 = \"select\";\n var peg$c54 = peg$literalExpectation(\"select\", false);\n\n var peg$c55 = function peg$c55(value, options) {\n return __assign({\n type: TYPE.select,\n value: value,\n options: options.reduce(function (all, _a) {\n var id = _a.id,\n value = _a.value,\n optionLocation = _a.location;\n\n if (id in all) {\n error(\"Duplicate option \\\"\" + id + \"\\\" in select element: \\\"\" + text() + \"\\\"\", location());\n }\n\n all[id] = {\n value: value,\n location: optionLocation\n };\n return all;\n }, {})\n }, insertLocation());\n };\n\n var peg$c56 = \"=\";\n var peg$c57 = peg$literalExpectation(\"=\", false);\n\n var peg$c58 = function peg$c58(id) {\n messageCtx.push('select');\n return true;\n };\n\n var peg$c59 = function peg$c59(id, value) {\n messageCtx.pop();\n return __assign({\n id: id,\n value: value\n }, insertLocation());\n };\n\n var peg$c60 = function peg$c60(id) {\n messageCtx.push('plural');\n return true;\n };\n\n var peg$c61 = function peg$c61(id, value) {\n messageCtx.pop();\n return __assign({\n id: id,\n value: value\n }, insertLocation());\n };\n\n var peg$c62 = peg$otherExpectation(\"whitespace\");\n var peg$c63 = /^[\\t-\\r \\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/;\n var peg$c64 = peg$classExpectation([[\"\\t\", \"\\r\"], \" \", \"\\x85\", \"\\xA0\", \"\\u1680\", [\"\\u2000\", \"\\u200A\"], \"\\u2028\", \"\\u2029\", \"\\u202F\", \"\\u205F\", \"\\u3000\"], false, false);\n var peg$c65 = peg$otherExpectation(\"syntax pattern\");\n var peg$c66 = /^[!-\\/:-@[-\\^`{-~\\xA1-\\xA7\\xA9\\xAB\\xAC\\xAE\\xB0\\xB1\\xB6\\xBB\\xBF\\xD7\\xF7\\u2010-\\u2027\\u2030-\\u203E\\u2041-\\u2053\\u2055-\\u205E\\u2190-\\u245F\\u2500-\\u2775\\u2794-\\u2BFF\\u2E00-\\u2E7F\\u3001-\\u3003\\u3008-\\u3020\\u3030\\uFD3E\\uFD3F\\uFE45\\uFE46]/;\n var peg$c67 = peg$classExpectation([[\"!\", \"/\"], [\":\", \"@\"], [\"[\", \"^\"], \"`\", [\"{\", \"~\"], [\"\\xA1\", \"\\xA7\"], \"\\xA9\", \"\\xAB\", \"\\xAC\", \"\\xAE\", \"\\xB0\", \"\\xB1\", \"\\xB6\", \"\\xBB\", \"\\xBF\", \"\\xD7\", \"\\xF7\", [\"\\u2010\", \"\\u2027\"], [\"\\u2030\", \"\\u203E\"], [\"\\u2041\", \"\\u2053\"], [\"\\u2055\", \"\\u205E\"], [\"\\u2190\", \"\\u245F\"], [\"\\u2500\", \"\\u2775\"], [\"\\u2794\", \"\\u2BFF\"], [\"\\u2E00\", \"\\u2E7F\"], [\"\\u3001\", \"\\u3003\"], [\"\\u3008\", \"\\u3020\"], \"\\u3030\", \"\\uFD3E\", \"\\uFD3F\", \"\\uFE45\", \"\\uFE46\"], false, false);\n var peg$c68 = peg$otherExpectation(\"optional whitespace\");\n var peg$c69 = peg$otherExpectation(\"number\");\n var peg$c70 = \"-\";\n var peg$c71 = peg$literalExpectation(\"-\", false);\n\n var peg$c72 = function peg$c72(negative, num) {\n return num ? negative ? -num : num : 0;\n };\n\n var peg$c73 = peg$otherExpectation(\"apostrophe\");\n var peg$c74 = peg$otherExpectation(\"double apostrophes\");\n var peg$c75 = \"''\";\n var peg$c76 = peg$literalExpectation(\"''\", false);\n\n var peg$c77 = function peg$c77() {\n return \"'\";\n };\n\n var peg$c78 = function peg$c78(escapedChar, quotedChars) {\n return escapedChar + quotedChars.replace(\"''\", \"'\");\n };\n\n var peg$c79 = function peg$c79(x) {\n return x !== '{' && !(isInPluralOption() && x === '#') && !(isNestedMessageText() && x === '}');\n };\n\n var peg$c80 = \"\\n\";\n var peg$c81 = peg$literalExpectation(\"\\n\", false);\n\n var peg$c82 = function peg$c82(x) {\n return x === '{' || x === '}' || isInPluralOption() && x === '#';\n };\n\n var peg$c83 = peg$otherExpectation(\"argNameOrNumber\");\n var peg$c84 = peg$otherExpectation(\"argNumber\");\n var peg$c85 = \"0\";\n var peg$c86 = peg$literalExpectation(\"0\", false);\n\n var peg$c87 = function peg$c87() {\n return 0;\n };\n\n var peg$c88 = /^[1-9]/;\n var peg$c89 = peg$classExpectation([[\"1\", \"9\"]], false, false);\n var peg$c90 = /^[0-9]/;\n var peg$c91 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n\n var peg$c92 = function peg$c92(digits) {\n return parseInt(digits.join(''), 10);\n };\n\n var peg$c93 = peg$otherExpectation(\"argName\");\n var peg$currPos = 0;\n var peg$savedPos = 0;\n var peg$posDetailsCache = [{\n line: 1,\n column: 1\n }];\n var peg$maxFailPos = 0;\n var peg$maxFailExpected = [];\n var peg$silentFails = 0;\n var peg$result;\n\n if (options.startRule !== undefined) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location1) {\n location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1);\n }\n\n function error(message, location1) {\n location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildSimpleError(message, location1);\n }\n\n function peg$literalExpectation(text1, ignoreCase) {\n return {\n type: \"literal\",\n text: text1,\n ignoreCase: ignoreCase\n };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return {\n type: \"class\",\n parts: parts,\n inverted: inverted,\n ignoreCase: ignoreCase\n };\n }\n\n function peg$anyExpectation() {\n return {\n type: \"any\"\n };\n }\n\n function peg$endExpectation() {\n return {\n type: \"end\"\n };\n }\n\n function peg$otherExpectation(description) {\n return {\n type: \"other\",\n description: description\n };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos];\n var p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos);\n var endPosDetails = peg$computePosDetails(endPos);\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected1) {\n if (peg$currPos < peg$maxFailPos) {\n return;\n }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected1);\n }\n\n function peg$buildSimpleError(message, location1) {\n return new SyntaxError(message, [], \"\", location1);\n }\n\n function peg$buildStructuredError(expected1, found, location1) {\n return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1);\n }\n\n function peg$parsestart() {\n var s0;\n s0 = peg$parsemessage();\n return s0;\n }\n\n function peg$parsemessage() {\n var s0, s1;\n s0 = [];\n s1 = peg$parsemessageElement();\n\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsemessageElement();\n }\n\n return s0;\n }\n\n function peg$parsemessageElement() {\n var s0;\n s0 = peg$parseliteralElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseargumentElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsesimpleFormatElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsepluralElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseselectElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsepoundElement();\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parsemessageText() {\n var s0, s1, s2;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsedoubleApostrophes();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parsequotedString();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parseunquotedString();\n }\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsedoubleApostrophes();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parsequotedString();\n\n if (s2 === peg$FAILED) {\n s2 = peg$parseunquotedString();\n }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parseliteralElement() {\n var s0, s1;\n s0 = peg$currPos;\n s1 = peg$parsemessageText();\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c1(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsepoundElement() {\n var s0, s1;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 35) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c3);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c4();\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parseargumentElement() {\n var s0, s1, s2, s3, s4, s5;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s5 = peg$c8;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c10(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c5);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonId() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n if (peg$c12.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c13);\n }\n }\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n if (peg$c12.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c13);\n }\n }\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c11);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonTokenOption() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 47) {\n s1 = peg$c16;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c17);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeletonId();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c18(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c15);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeletonToken() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeletonId();\n\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$parsenumberSkeletonTokenOption();\n\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$parsenumberSkeletonTokenOption();\n }\n\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c20(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c19);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberSkeleton() {\n var s0, s1, s2;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsenumberSkeletonToken();\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsenumberSkeletonToken();\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c21(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsenumberArgStyle() {\n var s0, s1, s2;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s1 = peg$c22;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c23);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsenumberSkeleton();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n peg$savedPos = peg$currPos;\n s1 = peg$c25();\n\n if (s1) {\n s1 = undefined;\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsemessageText();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsenumberFormatElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c29) {\n s7 = peg$c29;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c30);\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n s9 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 44) {\n s10 = peg$c27;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s10 !== peg$FAILED) {\n s11 = peg$parse_();\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parsenumberArgStyle();\n\n if (s12 !== peg$FAILED) {\n s10 = [s10, s11, s12];\n s9 = s10;\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n\n if (s9 === peg$FAILED) {\n s9 = null;\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s11 = peg$c8;\n peg$currPos++;\n } else {\n s11 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s11 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s3, s7, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeletonLiteral() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c32;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parsedoubleApostrophes();\n\n if (s3 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsedoubleApostrophes();\n\n if (s3 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c32;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s3 !== peg$FAILED) {\n s1 = [s1, s2, s3];\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = [];\n s1 = peg$parsedoubleApostrophes();\n\n if (s1 === peg$FAILED) {\n if (peg$c36.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c37);\n }\n }\n }\n\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsedoubleApostrophes();\n\n if (s1 === peg$FAILED) {\n if (peg$c36.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c37);\n }\n }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeletonPattern() {\n var s0, s1;\n s0 = [];\n\n if (peg$c38.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c39);\n }\n }\n\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n\n if (peg$c38.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c39);\n }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsedateTimeSkeleton() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n s2 = [];\n s3 = peg$parsedateTimeSkeletonLiteral();\n\n if (s3 === peg$FAILED) {\n s3 = peg$parsedateTimeSkeletonPattern();\n }\n\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsedateTimeSkeletonLiteral();\n\n if (s3 === peg$FAILED) {\n s3 = peg$parsedateTimeSkeletonPattern();\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n s1 = input.substring(s1, peg$currPos);\n } else {\n s1 = s2;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c40(s1);\n }\n\n s0 = s1;\n return s0;\n }\n\n function peg$parsedateOrTimeArgStyle() {\n var s0, s1, s2;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s1 = peg$c22;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c23);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsedateTimeSkeleton();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n peg$savedPos = peg$currPos;\n s1 = peg$c41();\n\n if (s1) {\n s1 = undefined;\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsemessageText();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsedateOrTimeFormatElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c42) {\n s7 = peg$c42;\n peg$currPos += 4;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c43);\n }\n }\n\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c44) {\n s7 = peg$c44;\n peg$currPos += 4;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c45);\n }\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n s9 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 44) {\n s10 = peg$c27;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s10 !== peg$FAILED) {\n s11 = peg$parse_();\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parsedateOrTimeArgStyle();\n\n if (s12 !== peg$FAILED) {\n s10 = [s10, s11, s12];\n s9 = s10;\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n } else {\n peg$currPos = s9;\n s9 = peg$FAILED;\n }\n\n if (s9 === peg$FAILED) {\n s9 = null;\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s11 = peg$c8;\n peg$currPos++;\n } else {\n s11 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s11 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s3, s7, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsesimpleFormatElement() {\n var s0;\n s0 = peg$parsenumberFormatElement();\n\n if (s0 === peg$FAILED) {\n s0 = peg$parsedateOrTimeFormatElement();\n }\n\n return s0;\n }\n\n function peg$parsepluralElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c46) {\n s7 = peg$c46;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c47);\n }\n }\n\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 13) === peg$c48) {\n s7 = peg$c48;\n peg$currPos += 13;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c49);\n }\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c27;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n s11 = peg$currPos;\n\n if (input.substr(peg$currPos, 7) === peg$c50) {\n s12 = peg$c50;\n peg$currPos += 7;\n } else {\n s12 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c51);\n }\n }\n\n if (s12 !== peg$FAILED) {\n s13 = peg$parse_();\n\n if (s13 !== peg$FAILED) {\n s14 = peg$parsenumber();\n\n if (s14 !== peg$FAILED) {\n s12 = [s12, s13, s14];\n s11 = s12;\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n } else {\n peg$currPos = s11;\n s11 = peg$FAILED;\n }\n\n if (s11 === peg$FAILED) {\n s11 = null;\n }\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n\n if (s12 !== peg$FAILED) {\n s13 = [];\n s14 = peg$parsepluralOption();\n\n if (s14 !== peg$FAILED) {\n while (s14 !== peg$FAILED) {\n s13.push(s14);\n s14 = peg$parsepluralOption();\n }\n } else {\n s13 = peg$FAILED;\n }\n\n if (s13 !== peg$FAILED) {\n s14 = peg$parse_();\n\n if (s14 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s15 = peg$c8;\n peg$currPos++;\n } else {\n s15 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s15 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c52(s3, s7, s11, s13);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseselectElement() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c6;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parseargNameOrNumber();\n\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c27;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c53) {\n s7 = peg$c53;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c54);\n }\n }\n\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c27;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n\n if (s10 !== peg$FAILED) {\n s11 = [];\n s12 = peg$parseselectOption();\n\n if (s12 !== peg$FAILED) {\n while (s12 !== peg$FAILED) {\n s11.push(s12);\n s12 = peg$parseselectOption();\n }\n } else {\n s11 = peg$FAILED;\n }\n\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n\n if (s12 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s13 = peg$c8;\n peg$currPos++;\n } else {\n s13 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s13 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c55(s3, s11);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralRuleSelectValue() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 61) {\n s2 = peg$c56;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c57);\n }\n }\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parsenumber();\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n if (s0 === peg$FAILED) {\n s0 = peg$parseargName();\n }\n\n return s0;\n }\n\n function peg$parseselectOption() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseargName();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s4 = peg$c6;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s5 = peg$c58(s2);\n\n if (s5) {\n s5 = undefined;\n } else {\n s5 = peg$FAILED;\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parsemessage();\n\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s7 = peg$c8;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s7 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c59(s2, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralOption() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n s0 = peg$currPos;\n s1 = peg$parse_();\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parsepluralRuleSelectValue();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s4 = peg$c6;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s5 = peg$c60(s2);\n\n if (s5) {\n s5 = undefined;\n } else {\n s5 = peg$FAILED;\n }\n\n if (s5 !== peg$FAILED) {\n s6 = peg$parsemessage();\n\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s7 = peg$c8;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n\n if (s7 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c61(s2, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsewhiteSpace() {\n var s0, s1;\n peg$silentFails++;\n\n if (peg$c63.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c64);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c62);\n }\n }\n\n return s0;\n }\n\n function peg$parsepatternSyntax() {\n var s0, s1;\n peg$silentFails++;\n\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c67);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c65);\n }\n }\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsewhiteSpace();\n\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsewhiteSpace();\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c68);\n }\n }\n\n return s0;\n }\n\n function peg$parsenumber() {\n var s0, s1, s2;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 45) {\n s1 = peg$c70;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c71);\n }\n }\n\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseargNumber();\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c72(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c69);\n }\n }\n\n return s0;\n }\n\n function peg$parseapostrophe() {\n var s0, s1;\n peg$silentFails++;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s0 = peg$c32;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c73);\n }\n }\n\n return s0;\n }\n\n function peg$parsedoubleApostrophes() {\n var s0, s1;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s1 = peg$c75;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c77();\n }\n\n s0 = s1;\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c74);\n }\n }\n\n return s0;\n }\n\n function peg$parsequotedString() {\n var s0, s1, s2, s3, s4, s5;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c32;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s1 !== peg$FAILED) {\n s2 = peg$parseescapedChar();\n\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n s4 = [];\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s5 = peg$c75;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s5 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n\n if (input.substr(peg$currPos, 2) === peg$c75) {\n s5 = peg$c75;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c76);\n }\n }\n\n if (s5 === peg$FAILED) {\n if (peg$c34.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = input.substring(s3, peg$currPos);\n } else {\n s3 = s4;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s4 = peg$c32;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c78(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseunquotedString() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.length > peg$currPos) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s3 = peg$c79(s2);\n\n if (s3) {\n s3 = undefined;\n } else {\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 10) {\n s1 = peg$c80;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c81);\n }\n }\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseescapedChar() {\n var s0, s1, s2, s3;\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (input.length > peg$currPos) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s2 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s3 = peg$c82(s2);\n\n if (s3) {\n s3 = undefined;\n } else {\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseargNameOrNumber() {\n var s0, s1;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseargNumber();\n\n if (s1 === peg$FAILED) {\n s1 = peg$parseargName();\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c83);\n }\n }\n\n return s0;\n }\n\n function peg$parseargNumber() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n\n if (input.charCodeAt(peg$currPos) === 48) {\n s1 = peg$c85;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c86);\n }\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c87();\n }\n\n s0 = s1;\n\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$currPos;\n\n if (peg$c88.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c89);\n }\n }\n\n if (s2 !== peg$FAILED) {\n s3 = [];\n\n if (peg$c90.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c91);\n }\n }\n\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n\n if (peg$c90.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c91);\n }\n }\n }\n\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c92(s1);\n }\n\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c84);\n }\n }\n\n return s0;\n }\n\n function peg$parseargName() {\n var s0, s1, s2, s3, s4;\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n s4 = peg$parsepatternSyntax();\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n s4 = peg$parsewhiteSpace();\n\n if (s4 === peg$FAILED) {\n s4 = peg$parsepatternSyntax();\n }\n\n peg$silentFails--;\n\n if (s4 === peg$FAILED) {\n s3 = undefined;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c14);\n }\n }\n\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n peg$silentFails--;\n\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n\n if (peg$silentFails === 0) {\n peg$fail(peg$c93);\n }\n }\n\n return s0;\n }\n\n var messageCtx = ['root'];\n\n function isNestedMessageText() {\n return messageCtx.length > 1;\n }\n\n function isInPluralOption() {\n return messageCtx[messageCtx.length - 1] === 'plural';\n }\n\n function insertLocation() {\n return options && options.captureLocation ? {\n location: location()\n } : {};\n }\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos));\n }\n}\n\nvar pegParse = peg$parse;\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/normalize.js\nvar __spreadArrays = undefined && undefined.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n};\n\n\n\nvar PLURAL_HASHTAG_REGEX = /(^|[^\\\\])#/g;\n/**\n * Whether to convert `#` in plural rule options\n * to `{var, number}`\n * @param el AST Element\n * @param pluralStack current plural stack\n */\n\nfunction normalizeHashtagInPlural(els) {\n els.forEach(function (el) {\n // If we're encountering a plural el\n if (!isPluralElement(el) && !isSelectElement(el)) {\n return;\n } // Go down the options and search for # in any literal element\n\n\n Object.keys(el.options).forEach(function (id) {\n var _a;\n\n var opt = el.options[id]; // If we got a match, we have to split this\n // and inject a NumberElement in the middle\n\n var matchingLiteralElIndex = -1;\n var literalEl = undefined;\n\n for (var i = 0; i < opt.value.length; i++) {\n var el_1 = opt.value[i];\n\n if (isLiteralElement(el_1) && PLURAL_HASHTAG_REGEX.test(el_1.value)) {\n matchingLiteralElIndex = i;\n literalEl = el_1;\n break;\n }\n }\n\n if (literalEl) {\n var newValue = literalEl.value.replace(PLURAL_HASHTAG_REGEX, \"$1{\" + el.value + \", number}\");\n var newEls = pegParse(newValue);\n\n (_a = opt.value).splice.apply(_a, __spreadArrays([matchingLiteralElIndex, 1], newEls));\n }\n\n normalizeHashtagInPlural(opt.value);\n });\n });\n}\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/index.js\n\n\n\n\n\nfunction parse(input, opts) {\n var els = pegParse(input, opts);\n\n if (!opts || opts.normalizeHashtagInPlural !== false) {\n normalizeHashtagInPlural(els);\n }\n\n return els;\n}\n;// CONCATENATED MODULE: ./node_modules/intl-format-cache/lib/index.js\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nvar lib_spreadArrays = undefined && undefined.__spreadArrays || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}; // -- Utilities ----------------------------------------------------------------\n\n\nfunction getCacheId(inputs) {\n return JSON.stringify(inputs.map(function (input) {\n return input && typeof input === 'object' ? orderedProps(input) : input;\n }));\n}\n\nfunction orderedProps(obj) {\n return Object.keys(obj).sort().map(function (k) {\n var _a;\n\n return _a = {}, _a[k] = obj[k], _a;\n });\n}\n\nvar memoizeFormatConstructor = function memoizeFormatConstructor(FormatConstructor, cache) {\n if (cache === void 0) {\n cache = {};\n }\n\n return function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var cacheId = getCacheId(args);\n var format = cacheId && cache[cacheId];\n\n if (!format) {\n format = new ((_a = FormatConstructor).bind.apply(_a, lib_spreadArrays([void 0], args)))();\n\n if (cacheId) {\n cache[cacheId] = format;\n }\n }\n\n return format;\n };\n};\n\n/* harmony default export */ var lib = (memoizeFormatConstructor);\n;// CONCATENATED MODULE: ./node_modules/intl-messageformat-parser/lib/skeleton.js\nvar skeleton_assign = undefined && undefined.__assign || function () {\n skeleton_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return skeleton_assign.apply(this, arguments);\n};\n/**\n * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js\n * with some tweaks\n */\n\n\nvar DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;\n/**\n * Parse Date time skeleton into Intl.DateTimeFormatOptions\n * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * @public\n * @param skeleton skeleton string\n */\n\nfunction parseDateTimeSkeleton(skeleton) {\n var result = {};\n skeleton.replace(DATE_TIME_REGEX, function (match) {\n var len = match.length;\n\n switch (match[0]) {\n // Era\n case 'G':\n result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n break;\n // Year\n\n case 'y':\n result.year = len === 2 ? '2-digit' : 'numeric';\n break;\n\n case 'Y':\n case 'u':\n case 'U':\n case 'r':\n throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');\n // Quarter\n\n case 'q':\n case 'Q':\n throw new RangeError('`q/Q` (quarter) patterns are not supported');\n // Month\n\n case 'M':\n case 'L':\n result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];\n break;\n // Week\n\n case 'w':\n case 'W':\n throw new RangeError('`w/W` (week) patterns are not supported');\n\n case 'd':\n result.day = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'D':\n case 'F':\n case 'g':\n throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');\n // Weekday\n\n case 'E':\n result.weekday = len === 4 ? 'short' : len === 5 ? 'narrow' : 'short';\n break;\n\n case 'e':\n if (len < 4) {\n throw new RangeError('`e..eee` (weekday) patterns are not supported');\n }\n\n result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n break;\n\n case 'c':\n if (len < 4) {\n throw new RangeError('`c..ccc` (weekday) patterns are not supported');\n }\n\n result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n break;\n // Period\n\n case 'a':\n // AM, PM\n result.hour12 = true;\n break;\n\n case 'b': // am, pm, noon, midnight\n\n case 'B':\n // flexible day periods\n throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');\n // Hour\n\n case 'h':\n result.hourCycle = 'h12';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'H':\n result.hourCycle = 'h23';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'K':\n result.hourCycle = 'h11';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'k':\n result.hourCycle = 'h24';\n result.hour = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'j':\n case 'J':\n case 'C':\n throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');\n // Minute\n\n case 'm':\n result.minute = ['numeric', '2-digit'][len - 1];\n break;\n // Second\n\n case 's':\n result.second = ['numeric', '2-digit'][len - 1];\n break;\n\n case 'S':\n case 'A':\n throw new RangeError('`S/A` (second) pattenrs are not supported, use `s` instead');\n // Zone\n\n case 'z':\n // 1..3, 4: specific non-location format\n result.timeZoneName = len < 4 ? 'short' : 'long';\n break;\n\n case 'Z': // 1..3, 4, 5: The ISO8601 varios formats\n\n case 'O': // 1, 4: miliseconds in day short, long\n\n case 'v': // 1, 4: generic non-location format\n\n case 'V': // 1, 2, 3, 4: time zone ID or city\n\n case 'X': // 1, 2, 3, 4: The ISO8601 varios formats\n\n case 'x':\n // 1, 2, 3, 4: The ISO8601 varios formats\n throw new RangeError('`Z/O/v/V/X/x` (timeZone) pattenrs are not supported, use `z` instead');\n }\n\n return '';\n });\n return result;\n}\n\nfunction icuUnitToEcma(unit) {\n return unit.replace(/^(.*?)-/, '');\n}\n\nvar FRACTION_PRECISION_REGEX = /^\\.(?:(0+)(\\+|#+)?)?$/g;\nvar SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\\+|#+)?$/g;\n\nfunction parseSignificantPrecision(str) {\n var result = {};\n str.replace(SIGNIFICANT_PRECISION_REGEX, function (_, g1, g2) {\n // @@@ case\n if (typeof g2 !== 'string') {\n result.minimumSignificantDigits = g1.length;\n result.maximumSignificantDigits = g1.length;\n } // @@@+ case\n else if (g2 === '+') {\n result.minimumSignificantDigits = g1.length;\n } // .### case\n else if (g1[0] === '#') {\n result.maximumSignificantDigits = g1.length;\n } // .@@## or .@@@ case\n else {\n result.minimumSignificantDigits = g1.length;\n result.maximumSignificantDigits = g1.length + (typeof g2 === 'string' ? g2.length : 0);\n }\n\n return '';\n });\n return result;\n}\n\nfunction parseSign(str) {\n switch (str) {\n case 'sign-auto':\n return {\n signDisplay: 'auto'\n };\n\n case 'sign-accounting':\n return {\n currencySign: 'accounting'\n };\n\n case 'sign-always':\n return {\n signDisplay: 'always'\n };\n\n case 'sign-accounting-always':\n return {\n signDisplay: 'always',\n currencySign: 'accounting'\n };\n\n case 'sign-except-zero':\n return {\n signDisplay: 'exceptZero'\n };\n\n case 'sign-accounting-except-zero':\n return {\n signDisplay: 'exceptZero',\n currencySign: 'accounting'\n };\n\n case 'sign-never':\n return {\n signDisplay: 'never'\n };\n }\n}\n\nfunction parseNotationOptions(opt) {\n var result = {};\n var signOpts = parseSign(opt);\n\n if (signOpts) {\n return signOpts;\n }\n\n return result;\n}\n/**\n * https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#skeleton-stems-and-options\n */\n\n\nfunction convertNumberSkeletonToNumberFormatOptions(tokens) {\n var result = {};\n\n for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n var token = tokens_1[_i];\n\n switch (token.stem) {\n case 'percent':\n result.style = 'percent';\n continue;\n\n case 'currency':\n result.style = 'currency';\n result.currency = token.options[0];\n continue;\n\n case 'group-off':\n result.useGrouping = false;\n continue;\n\n case 'precision-integer':\n result.maximumFractionDigits = 0;\n continue;\n\n case 'measure-unit':\n result.style = 'unit';\n result.unit = icuUnitToEcma(token.options[0]);\n continue;\n\n case 'compact-short':\n result.notation = 'compact';\n result.compactDisplay = 'short';\n continue;\n\n case 'compact-long':\n result.notation = 'compact';\n result.compactDisplay = 'long';\n continue;\n\n case 'scientific':\n result = skeleton_assign(skeleton_assign(skeleton_assign({}, result), {\n notation: 'scientific'\n }), token.options.reduce(function (all, opt) {\n return skeleton_assign(skeleton_assign({}, all), parseNotationOptions(opt));\n }, {}));\n continue;\n\n case 'engineering':\n result = skeleton_assign(skeleton_assign(skeleton_assign({}, result), {\n notation: 'engineering'\n }), token.options.reduce(function (all, opt) {\n return skeleton_assign(skeleton_assign({}, all), parseNotationOptions(opt));\n }, {}));\n continue;\n\n case 'notation-simple':\n result.notation = 'standard';\n continue;\n // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h\n\n case 'unit-width-narrow':\n result.currencyDisplay = 'narrowSymbol';\n result.unitDisplay = 'narrow';\n continue;\n\n case 'unit-width-short':\n result.currencyDisplay = 'code';\n result.unitDisplay = 'short';\n continue;\n\n case 'unit-width-full-name':\n result.currencyDisplay = 'name';\n result.unitDisplay = 'long';\n continue;\n\n case 'unit-width-iso-code':\n result.currencyDisplay = 'symbol';\n continue;\n } // Precision\n // https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#fraction-precision\n\n\n if (FRACTION_PRECISION_REGEX.test(token.stem)) {\n if (token.options.length > 1) {\n throw new RangeError('Fraction-precision stems only accept a single optional option');\n }\n\n token.stem.replace(FRACTION_PRECISION_REGEX, function (match, g1, g2) {\n // precision-integer case\n if (match === '.') {\n result.maximumFractionDigits = 0;\n } // .000+ case\n else if (g2 === '+') {\n result.minimumFractionDigits = g2.length;\n } // .### case\n else if (g1[0] === '#') {\n result.maximumFractionDigits = g1.length;\n } // .00## or .000 case\n else {\n result.minimumFractionDigits = g1.length;\n result.maximumFractionDigits = g1.length + (typeof g2 === 'string' ? g2.length : 0);\n }\n\n return '';\n });\n\n if (token.options.length) {\n result = skeleton_assign(skeleton_assign({}, result), parseSignificantPrecision(token.options[0]));\n }\n\n continue;\n }\n\n if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {\n result = skeleton_assign(skeleton_assign({}, result), parseSignificantPrecision(token.stem));\n continue;\n }\n\n var signOpts = parseSign(token.stem);\n\n if (signOpts) {\n result = skeleton_assign(skeleton_assign({}, result), signOpts);\n }\n }\n\n return result;\n}\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/intl-messageformat/lib/formatters.js\nvar formatters_extends=undefined&&undefined.__extends||function(){var _extendStatics=function extendStatics(d,b){_extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||function(d,b){for(var p in b){if(b.hasOwnProperty(p))d[p]=b[p];}};return _extendStatics(d,b);};return function(d,b){_extendStatics(d,b);function __(){this.constructor=d;}d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());};}();var formatters_spreadArrays=undefined&&undefined.__spreadArrays||function(){for(var s=0,i=0,il=arguments.length;i(.*?)<\\/([0-9a-zA-Z-_]*?)>)|(<[0-9a-zA-Z-_]*?\\/>)/;var TEMPLATE_ID=Date.now()+'@@';var VOID_ELEMENTS=['area','base','br','col','embed','hr','img','input','link','meta','param','source','track','wbr'];function formatHTMLElement(el,objectParts,values){var tagName=el.tagName;var outerHTML=el.outerHTML,textContent=el.textContent,childNodes=el.childNodes;// Regular text\nif(!tagName){return restoreRichPlaceholderMessage(textContent||'',objectParts);}tagName=tagName.toLowerCase();var isVoidElement=~VOID_ELEMENTS.indexOf(tagName);var formatFnOrValue=values[tagName];if(formatFnOrValue&&isVoidElement){throw new FormatError(tagName+\" is a self-closing tag and can not be used, please use another tag name.\");}if(!childNodes.length){return[outerHTML];}var chunks=Array.prototype.slice.call(childNodes).reduce(function(all,child){return all.concat(formatHTMLElement(child,objectParts,values));},[]);// Legacy HTML\nif(!formatFnOrValue){return formatters_spreadArrays([\"<\"+tagName+\">\"],chunks,[\"\"]);}// HTML Tag replacement\nif(typeof formatFnOrValue==='function'){return[formatFnOrValue.apply(void 0,chunks)];}return[formatFnOrValue];}function formatHTMLMessage(els,locales,formatters,formats,values,// For debugging\noriginalMessage){var parts=formatToParts(els,locales,formatters,formats,values,undefined,originalMessage);var objectParts={};var formattedMessage=parts.reduce(function(all,part){if(part.type===0/* literal */){return all+=part.value;}var id=generateId();objectParts[id]=part.value;return all+=\"\"+TOKEN_DELIMITER+id+TOKEN_DELIMITER;},'');// Not designed to filter out aggressively\nif(!SIMPLE_XML_REGEX.test(formattedMessage)){return restoreRichPlaceholderMessage(formattedMessage,objectParts);}if(!values){throw new FormatError('Message has placeholders but no values was given');}if(typeof DOMParser==='undefined'){throw new FormatError('Cannot format XML message without DOMParser');}if(!domParser){domParser=new DOMParser();}var content=domParser.parseFromString(\"\"+formattedMessage+\"\",'text/html').getElementById(TEMPLATE_ID);if(!content){throw new FormatError(\"Malformed HTML message \"+formattedMessage);}var tagsToFormat=Object.keys(values).filter(function(varName){return!!content.getElementsByTagName(varName).length;});// No tags to format\nif(!tagsToFormat.length){return restoreRichPlaceholderMessage(formattedMessage,objectParts);}var caseSensitiveTags=tagsToFormat.filter(function(tagName){return tagName!==tagName.toLowerCase();});if(caseSensitiveTags.length){throw new FormatError(\"HTML tag must be lowercased but the following tags are not: \"+caseSensitiveTags.join(', '));}// We're doing this since top node is `` which does not have a formatter\nreturn Array.prototype.slice.call(content.childNodes).reduce(function(all,child){return all.concat(formatHTMLElement(child,objectParts,values));},[]);}\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/intl-messageformat/lib/core.js\n/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/var core_assign=undefined&&undefined.__assign||function(){core_assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<\"']/g;function utils_escape(str){return(''+str).replace(UNSAFE_CHARS_REGEX,function(match){return ESCAPED_CHARS[match.charCodeAt(0)];});}function filterProps(props,whitelist,defaults){if(defaults===void 0){defaults={};}return whitelist.reduce(function(filtered,name){if(name in props){filtered[name]=props[name];}else if(name in defaults){filtered[name]=defaults[name];}return filtered;},{});}function invariantIntlContext(intl){(0,invariant/* invariant */.k)(intl,'[React Intl] Could not find required `intl` object. '+' needs to exist in the component ancestry.');}function createError(message,exception){var eMsg=exception?\"\\n\"+exception.stack:'';return\"[React Intl] \"+message+eMsg;}function defaultErrorHandler(error){if(false){}}var DEFAULT_INTL_CONFIG={formats:{},messages:{},timeZone:undefined,textComponent:react.Fragment,defaultLocale:'en',defaultFormats:{},onError:defaultErrorHandler};function createIntlCache(){return{dateTime:{},number:{},message:{},relativeTime:{},pluralRules:{},list:{},displayNames:{}};}/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */function createFormatters(cache){if(cache===void 0){cache=createIntlCache();}var RelativeTimeFormat=Intl.RelativeTimeFormat;var ListFormat=Intl.ListFormat;var DisplayNames=Intl.DisplayNames;return{getDateTimeFormat:lib(Intl.DateTimeFormat,cache.dateTime),getNumberFormat:lib(Intl.NumberFormat,cache.number),getMessageFormat:lib(intl_messageformat_lib,cache.message),getRelativeTimeFormat:lib(RelativeTimeFormat,cache.relativeTime),getPluralRules:lib(Intl.PluralRules,cache.pluralRules),getListFormat:lib(ListFormat,cache.list),getDisplayNames:lib(DisplayNames,cache.displayNames)};}function getNamedFormat(formats,type,name,onError){var formatType=formats&&formats[type];var format;if(formatType){format=formatType[name];}if(format){return format;}onError(createError(\"No \"+type+\" format named: \"+name));}\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(5706);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/injectIntl.js\n// Since rollup cannot deal with namespace being a function,\n// this is to interop with TypeScript since `invariant`\n// does not export a default\n// https://github.com/rollup/rollup/issues/1267\nvar hoistNonReactStatics=(hoist_non_react_statics_cjs_default())||hoist_non_react_statics_cjs;function getDisplayName(Component){return Component.displayName||Component.name||'Component';}// TODO: We should provide initial value here\nvar IntlContext=/*#__PURE__*/react.createContext(null);var IntlConsumer=IntlContext.Consumer,IntlProvider=IntlContext.Provider;var Provider=IntlProvider;var Context=IntlContext;function injectIntl(WrappedComponent,options){var _ref=options||{},_ref$intlPropName=_ref.intlPropName,intlPropName=_ref$intlPropName===void 0?'intl':_ref$intlPropName,_ref$forwardRef=_ref.forwardRef,forwardRef=_ref$forwardRef===void 0?false:_ref$forwardRef,_ref$enforceContext=_ref.enforceContext,enforceContext=_ref$enforceContext===void 0?true:_ref$enforceContext;var WithIntl=function WithIntl(props){return/*#__PURE__*/react.createElement(IntlConsumer,null,function(intl){var _Object$assign;if(enforceContext){invariantIntlContext(intl);}return/*#__PURE__*/react.createElement(WrappedComponent,Object.assign({},props,(_Object$assign={},_Object$assign[intlPropName]=intl,_Object$assign),{ref:forwardRef?props.forwardedRef:null}));});};WithIntl.displayName=\"injectIntl(\"+getDisplayName(WrappedComponent)+\")\";WithIntl.WrappedComponent=WrappedComponent;if(forwardRef){return hoistNonReactStatics(/*#__PURE__*/react.forwardRef(function(props,ref){return/*#__PURE__*/react.createElement(WithIntl,Object.assign({},props,{forwardedRef:ref}));}),WrappedComponent);}return hoistNonReactStatics(WithIntl,WrappedComponent);}\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/createFormattedComponent.js\nvar __rest=undefined&&undefined.__rest||function(s,e){var t={};for(var p in s){if(Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0)t[p]=s[p];}if(s!=null&&typeof Object.getOwnPropertySymbols===\"function\")for(var i=0,p=Object.getOwnPropertySymbols(s);i for the\n// default locale, and a default message is in the source.\nif(!defaultMessage||locale&&locale.toLowerCase()!==defaultLocale.toLowerCase()){onError(createError(\"Missing message: \\\"\"+id+\"\\\" for locale: \\\"\"+locale+\"\\\"\"+(defaultMessage?', using default message as fallback.':'')));}}if(!formattedMessageParts.length&&defaultMessage){try{var _formatter=state.getMessageFormat(defaultMessage,defaultLocale,defaultFormats);formattedMessageParts=_formatter.formatHTMLMessage(values);}catch(e){onError(createError(\"Error formatting the default message for: \\\"\"+id+\"\\\"\",e));}}if(!formattedMessageParts.length){onError(createError(\"Cannot format message: \\\"\"+id+\"\\\", \"+(\"using message \"+(message||defaultMessage?'source':'id')+\" as fallback.\")));if(typeof message==='string'){return message||defaultMessage||String(id);}return defaultMessage||String(id);}if(formattedMessageParts.length===1&&typeof formattedMessageParts[0]==='string'){return formattedMessageParts[0]||defaultMessage||String(id);}return prepareIntlMessageFormatHtmlOutput(formattedMessageParts);}function message_formatHTMLMessage(config,state,messageDescriptor,rawValues){if(messageDescriptor===void 0){messageDescriptor={id:''};}if(rawValues===void 0){rawValues={};}// Process all the values before they are used when formatting the ICU\n// Message string. Since the formatted message might be injected via\n// `innerHTML`, all String-based values need to be HTML-escaped.\nvar escapedValues=Object.keys(rawValues).reduce(function(escaped,name){var value=rawValues[name];escaped[name]=typeof value==='string'?utils_escape(value):value;return escaped;},{});return formatMessage(config,state,messageDescriptor,escapedValues);}\n// EXTERNAL MODULE: ./node_modules/shallow-equal/objects/index.js\nvar objects = __webpack_require__(9108);\nvar objects_default = /*#__PURE__*/__webpack_require__.n(objects);\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/formatters/list.js\nvar LIST_FORMAT_OPTIONS=['localeMatcher','type','style'];var now=Date.now();function generateToken(i){return now+\"_\"+i+\"_\"+now;}function formatList(_ref,getListFormat,values,options){var locale=_ref.locale,onError=_ref.onError;if(options===void 0){options={};}var ListFormat=Intl.ListFormat;if(!ListFormat){onError(createError(\"Intl.ListFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-listformat\\\"\\n\"));}var filteredOptions=filterProps(options,LIST_FORMAT_OPTIONS);try{var richValues={};var serializedValues=values.map(function(v,i){if(typeof v==='object'){var id=generateToken(i);richValues[id]=v;return id;}return String(v);});if(!Object.keys(richValues).length){return getListFormat(locale,filteredOptions).format(serializedValues);}var parts=getListFormat(locale,filteredOptions).formatToParts(serializedValues);return parts.reduce(function(all,el){var val=el.value;if(richValues[val]){all.push(richValues[val]);}else if(typeof all[all.length-1]==='string'){all[all.length-1]+=val;}else{all.push(val);}return all;},[]);}catch(e){onError(createError('Error formatting list.',e));}return values;}\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/formatters/displayName.js\nvar DISPLAY_NAMES_OPTONS=['localeMatcher','style','type','fallback'];function formatDisplayName(_ref,getDisplayNames,value,options){var locale=_ref.locale,onError=_ref.onError;if(options===void 0){options={};}var DisplayNames=Intl.DisplayNames;if(!DisplayNames){onError(createError(\"Intl.DisplayNames is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-displaynames\\\"\\n\"));}var filteredOptions=filterProps(options,DISPLAY_NAMES_OPTONS);try{return getDisplayNames(locale,filteredOptions).of(value);}catch(e){onError(createError('Error formatting display name.',e));}}\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/provider.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */var shallowEquals=(objects_default())||objects;function processIntlConfig(config){return{locale:config.locale,timeZone:config.timeZone,formats:config.formats,textComponent:config.textComponent,messages:config.messages,defaultLocale:config.defaultLocale,defaultFormats:config.defaultFormats,onError:config.onError};}/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */function createIntl(config,cache){var formatters=createFormatters(cache);var resolvedConfig=Object.assign(Object.assign({},DEFAULT_INTL_CONFIG),config);var locale=resolvedConfig.locale,defaultLocale=resolvedConfig.defaultLocale,onError=resolvedConfig.onError;if(!locale){if(onError){onError(createError(\"\\\"locale\\\" was not configured, using \\\"\"+defaultLocale+\"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/API.md#intlshape for more details\"));}// Since there's no registered locale data for `locale`, this will\n// fallback to the `defaultLocale` to make sure things can render.\n// The `messages` are overridden to the `defaultProps` empty object\n// to maintain referential equality across re-renders. It's assumed\n// each contains a `defaultMessage` prop.\nresolvedConfig.locale=resolvedConfig.defaultLocale||'en';}else if(!Intl.NumberFormat.supportedLocalesOf(locale).length&&onError){onError(createError(\"Missing locale data for locale: \\\"\"+locale+\"\\\" in Intl.NumberFormat. Using default locale: \\\"\"+defaultLocale+\"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/Getting-Started.md#runtime-requirements for more details\"));}else if(!Intl.DateTimeFormat.supportedLocalesOf(locale).length&&onError){onError(createError(\"Missing locale data for locale: \\\"\"+locale+\"\\\" in Intl.DateTimeFormat. Using default locale: \\\"\"+defaultLocale+\"\\\" as fallback. See https://github.com/formatjs/react-intl/blob/master/docs/Getting-Started.md#runtime-requirements for more details\"));}return Object.assign(Object.assign({},resolvedConfig),{formatters:formatters,formatNumber:formatNumber.bind(null,resolvedConfig,formatters.getNumberFormat),formatNumberToParts:formatNumberToParts.bind(null,resolvedConfig,formatters.getNumberFormat),formatRelativeTime:formatRelativeTime.bind(null,resolvedConfig,formatters.getRelativeTimeFormat),formatDate:formatDate.bind(null,resolvedConfig,formatters.getDateTimeFormat),formatDateToParts:formatDateToParts.bind(null,resolvedConfig,formatters.getDateTimeFormat),formatTime:formatTime.bind(null,resolvedConfig,formatters.getDateTimeFormat),formatTimeToParts:formatTimeToParts.bind(null,resolvedConfig,formatters.getDateTimeFormat),formatPlural:formatPlural.bind(null,resolvedConfig,formatters.getPluralRules),formatMessage:formatMessage.bind(null,resolvedConfig,formatters),formatHTMLMessage:message_formatHTMLMessage.bind(null,resolvedConfig,formatters),formatList:formatList.bind(null,resolvedConfig,formatters.getListFormat),formatDisplayName:formatDisplayName.bind(null,resolvedConfig,formatters.getDisplayNames)});}var provider_IntlProvider=/*#__PURE__*/function(_React$PureComponent){(0,inheritsLoose/* default */.Z)(IntlProvider,_React$PureComponent);function IntlProvider(){var _this;_this=_React$PureComponent.apply(this,arguments)||this;_this.cache=createIntlCache();_this.state={cache:_this.cache,intl:createIntl(processIntlConfig(_this.props),_this.cache),prevConfig:processIntlConfig(_this.props)};return _this;}IntlProvider.getDerivedStateFromProps=function getDerivedStateFromProps(props,_ref){var prevConfig=_ref.prevConfig,cache=_ref.cache;var config=processIntlConfig(props);if(!shallowEquals(prevConfig,config)){return{intl:createIntl(config,cache),prevConfig:config};}return null;};var _proto=IntlProvider.prototype;_proto.render=function render(){invariantIntlContext(this.state.intl);return/*#__PURE__*/react.createElement(Provider,{value:this.state.intl},this.props.children);};return IntlProvider;}(react.PureComponent);provider_IntlProvider.displayName='IntlProvider';provider_IntlProvider.defaultProps=DEFAULT_INTL_CONFIG;\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/relative.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */var MINUTE=60;var HOUR=60*60;var DAY=60*60*24;function selectUnit(seconds){var absValue=Math.abs(seconds);if(absValue=currentValueInSeconds?prevInterestingValueInSeconds-unitDuration:prevInterestingValueInSeconds;var delayInSeconds=Math.abs(nextInterestingValueInSeconds-currentValueInSeconds);this._updateTimer=setTimeout(function(){return _this2.setState({currentValueInSeconds:nextInterestingValueInSeconds});},delayInSeconds*1e3);};_proto.componentDidMount=function componentDidMount(){this.scheduleNextUpdate(this.props,this.state);};_proto.componentDidUpdate=function componentDidUpdate(){this.scheduleNextUpdate(this.props,this.state);};_proto.componentWillUnmount=function componentWillUnmount(){clearTimeout(this._updateTimer);this._updateTimer=null;};FormattedRelativeTime.getDerivedStateFromProps=function getDerivedStateFromProps(props,state){if(props.unit!==state.prevUnit||props.value!==state.prevValue){return{prevValue:props.value,prevUnit:props.unit,currentValueInSeconds:canIncrement(props.unit)?valueToSeconds(props.value,props.unit):0};}return null;};_proto.render=function render(){var _this3=this;return/*#__PURE__*/react.createElement(Context.Consumer,null,function(intl){invariantIntlContext(intl);var formatRelativeTime=intl.formatRelativeTime,Text=intl.textComponent;var _this3$props=_this3.props,children=_this3$props.children,value=_this3$props.value,unit=_this3$props.unit,updateIntervalInSeconds=_this3$props.updateIntervalInSeconds;var currentValueInSeconds=_this3.state.currentValueInSeconds;var currentValue=value||0;var currentUnit=unit;if(canIncrement(unit)&&typeof currentValueInSeconds==='number'&&updateIntervalInSeconds){currentUnit=selectUnit(currentValueInSeconds);var unitDuration=getDurationInSeconds(currentUnit);currentValue=Math.round(currentValueInSeconds/unitDuration);}var formattedRelativeTime=formatRelativeTime(currentValue,currentUnit,Object.assign({},_this3.props));if(typeof children==='function'){return children(formattedRelativeTime);}if(Text){return/*#__PURE__*/react.createElement(Text,null,formattedRelativeTime);}return formattedRelativeTime;});};return FormattedRelativeTime;}(react.PureComponent);FormattedRelativeTime.displayName='FormattedRelativeTime';FormattedRelativeTime.defaultProps={value:0,unit:'second'};/* harmony default export */ var relative = (FormattedRelativeTime);\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/plural.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */var FormattedPlural=function FormattedPlural(props){var value=props.value,other=props.other,children=props.children,_props$intl=props.intl,formatPlural=_props$intl.formatPlural,Text=_props$intl.textComponent;var pluralCategory=formatPlural(value,props);var formattedPlural=props[pluralCategory]||other;if(typeof children==='function'){return children(formattedPlural);}if(Text){return/*#__PURE__*/react.createElement(Text,null,formattedPlural);}// Work around @types/react where React.FC cannot return string\nreturn formattedPlural;};FormattedPlural.defaultProps={type:'cardinal'};FormattedPlural.displayName='FormattedPlural';/* harmony default export */ var plural = (injectIntl(FormattedPlural));\n;// CONCATENATED MODULE: ./node_modules/gatsby-plugin-intl/node_modules/react-intl/lib/components/message.js\n/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */var message_rest=undefined&&undefined.__rest||function(s,e){var t={};for(var p in s){if(Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0)t[p]=s[p];}if(s!=null&&typeof Object.getOwnPropertySymbols===\"function\")for(var i=0,p=Object.getOwnPropertySymbols(s);i dynamic > splat > root\n//\n// This way we don\'t have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split("?"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === "";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || "*";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join("/");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? false ? 0 : browser_default()(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don\'t match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: "/" + uriSegments.slice(0, index).join("/")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be "in a directory"\n// you can be "at a file", too. For example\n//\n// browserSpecResolve(\'foo\', \'/bar/\') => /bar/foo\n// browserSpecResolve(\'foo\', \'/bar\') => /foo\n//\n// But on the command line of a file system, it\'s not as complicated, you can\'t\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, "/")) {\n return to;\n }\n\n var _to$split = to.split("?"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split("?"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === "") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], ".")) {\n var pathname = baseSegments.concat(toSegments).join("/");\n return addQuery((basePathname === "/" ? "" : "/") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === "..") segments.pop();else if (segment !== ".") segments.push(segment);\n }\n\n return addQuery("/" + segments.join("/"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split("?"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? "" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = "/" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join("/");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? "" : _params$location$sear;\n var searchSplit = search.split("?")[1] || "";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join("/");\n var toString = segmentize(to).filter(filter).sort().join("/");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === "";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === "*";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, "").split("/");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? "?" + query.join("&") : "");\n};\n\nvar reservedNames = ["uri", "path"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@gatsbyjs/reach-router/es/lib/history.js\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || "initial"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: "POP"\n });\n };\n\n source.addEventListener("popstate", popstateListener);\n return function () {\n source.removeEventListener("popstate", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === "number") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + ""\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? "replace" : "assign"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: "PUSH"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "/";\n var searchIndex = initialPath.indexOf("?");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : ""\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split("?"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? "" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? "?" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split("?"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? "" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar history_navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\n\n;// CONCATENATED MODULE: ./node_modules/@gatsbyjs/reach-router/es/index.js\nvar es_extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\n\n\n\n\n ////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = (0,react.createContext)(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\n\n\nvar LocationContext = createNamedContext("Location"); // sets up a listener if there isn\'t one already so apps don\'t need to be\n// wrapped in some top level provider\n\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return react.createElement(LocationContext.Consumer, null, function (context) {\n return context ? children(context) : react.createElement(LocationProvider, null, children);\n });\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: {\n unlisten: null\n }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n return {\n navigate: navigate,\n location: location\n };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, {\n replace: true\n });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it\'s ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return {\n context: _this2.getContext()\n };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n return react.createElement(LocationContext.Provider, {\n value: context\n }, typeof children === "function" ? children(context) : children || null);\n };\n\n return LocationProvider;\n}(react.Component); ////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\n false ? 0 : void 0;\n\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n var searchIndex = url.indexOf("?");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = "";\n var hash = "";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return react.createElement(LocationContext.Provider, {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error("You can\'t call navigate on the server.");\n }\n }\n }, children);\n}; ////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\n\n\nvar BaseContext = createNamedContext("Base", {\n baseuri: "/",\n basepath: "/",\n navigate: globalHistory.navigate\n}); ////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\n\nvar Router = function Router(props) {\n return react.createElement(BaseContext.Consumer, null, function (baseContext) {\n return react.createElement(Location, null, function (locationContext) {\n return react.createElement(RouterImpl, es_extends({}, baseContext, locationContext, props));\n });\n });\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? "div" : _props$component,\n domProps = _objectWithoutProperties(_props, ["location", "navigate", "basepath", "primary", "children", "baseuri", "component"]);\n\n var routes = react.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value; // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, "");\n\n var props = es_extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(resolve(to, uri), options);\n }\n });\n\n var clone = react.cloneElement(element, props, element.props.children ? react.createElement(Router, {\n location: location,\n primary: primary\n }, element.props.children) : undefined); // using \'div\' for < 16.3 support\n\n var FocusWrapper = primary ? FocusHandler : component; // don\'t pass any props to \'div\'\n\n var wrapperProps = primary ? es_extends({\n uri: uri,\n location: location,\n component: component\n }, domProps) : domProps;\n return react.createElement(BaseContext.Provider, {\n value: {\n baseuri: uri,\n basepath: basepath,\n navigate: props.navigate\n }\n }, react.createElement(FocusWrapper, wrapperProps, clone));\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // "\\n\\t"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(react.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\nvar FocusContext = createNamedContext("Focus");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, ["uri", "location", "component"]);\n\n return react.createElement(FocusContext.Consumer, null, function (requestFocus) {\n return react.createElement(FocusHandlerImpl, es_extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n });\n}; // don\'t focus on initial render\n\n\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n\n if (initial) {\n return es_extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return es_extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (false) {}\n\n var requestFocus = this.props.requestFocus;\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? "div" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, ["children", "style", "requestFocus", "component", "uri", "location"]);\n\n return react.createElement(Comp, es_extends({\n style: es_extends({\n outline: "none"\n }, style),\n tabIndex: "-1",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps), react.createElement(FocusContext.Provider, {\n value: this.requestFocus\n }, this.props.children));\n };\n\n return FocusHandlerImpl;\n}(react.Component);\n\n(0,react_lifecycles_compat/* polyfill */.O)(FocusHandlerImpl);\n\nvar k = function k() {}; ////////////////////////////////////////////////////////////////////////////////\n\n\nvar forwardRef = react.forwardRef;\n\nif (typeof forwardRef === "undefined") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, ["innerRef"]);\n\n return react.createElement(BaseContext.Consumer, null, function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return react.createElement(Location, null, function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, ["to", "state", "replace", "getProps"]);\n\n var href = resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n return react.createElement("a", es_extends({\n ref: ref || innerRef,\n "aria-current": isCurrent ? "page" : undefined\n }, anchorProps, getProps({\n isCurrent: isCurrent,\n isPartiallyCurrent: isPartiallyCurrent,\n href: href,\n location: location\n }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n\n if (typeof replace !== "boolean" && isCurrent) {\n var _location$state = es_extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, ["key"]);\n\n shouldReplace = shallowCompare(es_extends({}, state), restState);\n }\n\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n });\n });\n});\nLink.displayName = "Link";\n false ? 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n } // Support React < 16 with this hook\n\n\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), {\n replace: replace,\n state: state\n });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, ["navigate", "to", "from", "replace", "state", "noThrow", "baseuri"]);\n\n var resolvedTo = resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(react.Component);\n\nvar Redirect = function Redirect(props) {\n return react.createElement(BaseContext.Consumer, null, function (_ref7) {\n var baseuri = _ref7.baseuri;\n return react.createElement(Location, null, function (locationContext) {\n return react.createElement(RedirectImpl, es_extends({}, locationContext, {\n baseuri: baseuri\n }, props));\n });\n });\n};\n\n false ? 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return react.createElement(BaseContext.Consumer, null, function (_ref9) {\n var baseuri = _ref9.baseuri;\n return react.createElement(Location, null, function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n var resolvedPath = resolve(path, baseuri);\n var result = match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n });\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\n\nvar useLocation = function useLocation() {\n var context = (0,react.useContext)(LocationContext);\n\n if (!context) {\n throw new Error("useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useNavigate hook was used but a BaseContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n var results = match(context.basepath, location.pathname);\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error("useMatch(path: string) requires an argument of a string to match against");\n }\n\n var context = (0,react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error("useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");\n }\n\n var location = useLocation();\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? es_extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, "");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === react.Fragment && element.props.children) {\n return react.Children.map(element.props.children, createRoute(basepath));\n }\n\n !(element.props.path || element.props.default || element.type === Redirect) ? false ? 0 : browser_default()(false) : void 0;\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? false ? 0 : browser_default()(false) : void 0;\n\n if (element.props.default) {\n return {\n value: element,\n default: true\n };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n var path = elementPath === "/" ? basepath : stripSlashes(basepath) + "/" + stripSlashes(elementPath);\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + "/*" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}; ////////////////////////////////////////////////////////////////////////\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2VzL2xpYi91dGlscy5qcz8zNDNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BnYXRzYnlqcy9yZWFjaC1yb3V0ZXIvZXMvbGliL2hpc3RvcnkuanM/YmEyNCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZ2F0c2J5anMvcmVhY2gtcm91dGVyL2VzL2luZGV4LmpzPzc0MWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLE9BQU87QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxhQUFhO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLE1BQXFDLEdBQUcsQ0FBd0osR0FBRyxpQkFBUztBQUMxTztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsY0FBYztBQUN2QyxhQUFhLGtCQUFrQjtBQUMvQjs7QUFFQSxrRkFBa0YsTUFBcUMsR0FBRyxDQUFnSyxHQUFHLGlCQUFTO0FBQ3RTLGtGQUFrRixNQUFxQyxHQUFHLENBQW1LLEdBQUcsaUJBQVM7QUFDelMscUNBQXFDLGdCQUFnQiwwQ0FBMEMsTUFBcUMsR0FBRyxDQUEwTCxHQUFHLGlCQUFTOztBQUU3VTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFIiwiZmlsZSI6Ijk0OTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW52YXJpYW50IGZyb20gXCJpbnZhcmlhbnRcIjsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHN0YXJ0c1dpdGgoc3RyaW5nLCBzZWFyY2gpIC0gQ2hlY2sgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHNlYXJjaGBcblxudmFyIHN0YXJ0c1dpdGggPSBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgc2VhcmNoKSB7XG4gIHJldHVybiBzdHJpbmcuc3Vic3RyKDAsIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gcGljayhyb3V0ZXMsIHVyaSlcbi8vXG4vLyBSYW5rcyBhbmQgcGlja3MgdGhlIGJlc3Qgcm91dGUgdG8gbWF0Y2guIEVhY2ggc2VnbWVudCBnZXRzIHRoZSBoaWdoZXN0XG4vLyBhbW91bnQgb2YgcG9pbnRzLCB0aGVuIHRoZSB0eXBlIG9mIHNlZ21lbnQgZ2V0cyBhbiBhZGRpdGlvbmFsIGFtb3VudCBvZlxuLy8gcG9pbnRzIHdoZXJlXG4vL1xuLy8gICAgIHN0YXRpYyA+IGR5bmFtaWMgPiBzcGxhdCA+IHJvb3Rcbi8vXG4vLyBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBvcmRlciBvZiBvdXIgcm91dGVzLCBsZXQgdGhlXG4vLyBjb21wdXRlcnMgZG8gaXQuXG4vL1xuLy8gQSByb3V0ZSBsb29rcyBsaWtlIHRoaXNcbi8vXG4vLyAgICAgeyBwYXRoLCBkZWZhdWx0LCB2YWx1ZSB9XG4vL1xuLy8gQW5kIGEgcmV0dXJuZWQgbWF0Y2ggbG9va3MgbGlrZTpcbi8vXG4vLyAgICAgeyByb3V0ZSwgcGFyYW1zLCB1cmkgfVxuLy9cbi8vIEkga25vdywgSSBzaG91bGQgdXNlIFR5cGVTY3JpcHQgbm90IGNvbW1lbnRzIGZvciB0aGVzZSB0eXBlcy5cblxuXG52YXIgcGljayA9IGZ1bmN0aW9uIHBpY2socm91dGVzLCB1cmkpIHtcbiAgdmFyIG1hdGNoID0gdm9pZCAwO1xuICB2YXIgZGVmYXVsdF8gPSB2b2lkIDA7XG5cbiAgdmFyIF91cmkkc3BsaXQgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgdXJpUGF0aG5hbWUgPSBfdXJpJHNwbGl0WzBdO1xuXG4gIHZhciB1cmlTZWdtZW50cyA9IHNlZ21lbnRpemUodXJpUGF0aG5hbWUpO1xuICB2YXIgaXNSb290VXJpID0gdXJpU2VnbWVudHNbMF0gPT09IFwiXCI7XG4gIHZhciByYW5rZWQgPSByYW5rUm91dGVzKHJvdXRlcyk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSByYW5rZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIG1pc3NlZCA9IGZhbHNlO1xuICAgIHZhciByb3V0ZSA9IHJhbmtlZFtpXS5yb3V0ZTtcblxuICAgIGlmIChyb3V0ZS5kZWZhdWx0KSB7XG4gICAgICBkZWZhdWx0XyA9IHtcbiAgICAgICAgcm91dGU6IHJvdXRlLFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICB1cmk6IHVyaVxuICAgICAgfTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciByb3V0ZVNlZ21lbnRzID0gc2VnbWVudGl6ZShyb3V0ZS5wYXRoKTtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHVyaVNlZ21lbnRzLmxlbmd0aCwgcm91dGVTZWdtZW50cy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG5cbiAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgIHZhciByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2luZGV4XTtcbiAgICAgIHZhciB1cmlTZWdtZW50ID0gdXJpU2VnbWVudHNbaW5kZXhdO1xuXG4gICAgICBpZiAoaXNTcGxhdChyb3V0ZVNlZ21lbnQpKSB7XG4gICAgICAgIC8vIEhpdCBhIHNwbGF0LCBqdXN0IGdyYWIgdGhlIHJlc3QsIGFuZCByZXR1cm4gYSBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL2ZpbGVzL2RvY3VtZW50cy93b3JrXG4gICAgICAgIC8vIHJvdXRlOiAvZmlsZXMvKlxuICAgICAgICB2YXIgcGFyYW0gPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgfHwgXCIqXCI7XG4gICAgICAgIHBhcmFtc1twYXJhbV0gPSB1cmlTZWdtZW50cy5zbGljZShpbmRleCkubWFwKGRlY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAodXJpU2VnbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFVSSSBpcyBzaG9ydGVyIHRoYW4gdGhlIHJvdXRlLCBubyBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL3VzZXJzXG4gICAgICAgIC8vIHJvdXRlOiAvdXNlcnMvOnVzZXJJZFxuICAgICAgICBtaXNzZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdmFyIGR5bmFtaWNNYXRjaCA9IHBhcmFtUmUuZXhlYyhyb3V0ZVNlZ21lbnQpO1xuXG4gICAgICBpZiAoZHluYW1pY01hdGNoICYmICFpc1Jvb3RVcmkpIHtcbiAgICAgICAgdmFyIG1hdGNoSXNOb3RSZXNlcnZlZCA9IHJlc2VydmVkTmFtZXMuaW5kZXhPZihkeW5hbWljTWF0Y2hbMV0pID09PSAtMTtcbiAgICAgICAgIW1hdGNoSXNOb3RSZXNlcnZlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCI8Um91dGVyPiBkeW5hbWljIHNlZ21lbnQgXFxcIlwiICsgZHluYW1pY01hdGNoWzFdICsgXCJcXFwiIGlzIGEgcmVzZXJ2ZWQgbmFtZS4gUGxlYXNlIHVzZSBhIGRpZmZlcmVudCBuYW1lIGluIHBhdGggXFxcIlwiICsgcm91dGUucGF0aCArIFwiXFxcIi5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgICB2YXIgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodXJpU2VnbWVudCk7XG4gICAgICAgIHBhcmFtc1tkeW5hbWljTWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJvdXRlU2VnbWVudCAhPT0gdXJpU2VnbWVudCkge1xuICAgICAgICAvLyBDdXJyZW50IHNlZ21lbnRzIGRvbid0IG1hdGNoLCBub3QgZHluYW1pYywgbm90IHNwbGF0LCBzbyBubyBtYXRjaFxuICAgICAgICAvLyB1cmk6ICAgL3VzZXJzLzEyMy9zZXR0aW5nc1xuICAgICAgICAvLyByb3V0ZTogL3VzZXJzLzppZC9wcm9maWxlXG4gICAgICAgIG1pc3NlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbWlzc2VkKSB7XG4gICAgICBtYXRjaCA9IHtcbiAgICAgICAgcm91dGU6IHJvdXRlLFxuICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgdXJpOiBcIi9cIiArIHVyaVNlZ21lbnRzLnNsaWNlKDAsIGluZGV4KS5qb2luKFwiL1wiKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaCB8fCBkZWZhdWx0XyB8fCBudWxsO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1hdGNoKHBhdGgsIHVyaSkgLSBNYXRjaGVzIGp1c3Qgb25lIHBhdGggdG8gYSB1cmksIGFsc28gbG9sXG5cblxudmFyIG1hdGNoID0gZnVuY3Rpb24gbWF0Y2gocGF0aCwgdXJpKSB7XG4gIHJldHVybiBwaWNrKFt7XG4gICAgcGF0aDogcGF0aFxuICB9XSwgdXJpKTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyByZXNvbHZlKHRvLCBiYXNlcGF0aClcbi8vXG4vLyBSZXNvbHZlcyBVUklzIGFzIHRob3VnaCBldmVyeSBwYXRoIGlzIGEgZGlyZWN0b3J5LCBubyBmaWxlcy4gIFJlbGF0aXZlIFVSSXNcbi8vIGluIHRoZSBicm93c2VyIGNhbiBmZWVsIGF3a3dhcmQgYmVjYXVzZSBub3Qgb25seSBjYW4geW91IGJlIFwiaW4gYSBkaXJlY3RvcnlcIlxuLy8geW91IGNhbiBiZSBcImF0IGEgZmlsZVwiLCB0b28uIEZvciBleGFtcGxlXG4vL1xuLy8gICAgIGJyb3dzZXJTcGVjUmVzb2x2ZSgnZm9vJywgJy9iYXIvJykgPT4gL2Jhci9mb29cbi8vICAgICBicm93c2VyU3BlY1Jlc29sdmUoJ2ZvbycsICcvYmFyJykgPT4gL2Zvb1xuLy9cbi8vIEJ1dCBvbiB0aGUgY29tbWFuZCBsaW5lIG9mIGEgZmlsZSBzeXN0ZW0sIGl0J3Mgbm90IGFzIGNvbXBsaWNhdGVkLCB5b3UgY2FuJ3Rcbi8vIGBjZGAgZnJvbSBhIGZpbGUsIG9ubHkgZGlyZWN0b3JpZXMuICBUaGlzIHdheSwgbGlua3MgaGF2ZSB0byBrbm93IGxlc3MgYWJvdXRcbi8vIHRoZWlyIGN1cnJlbnQgcGF0aC4gVG8gZ28gZGVlcGVyIHlvdSBjYW4gZG8gdGhpczpcbi8vXG4vLyAgICAgPExpbmsgdG89XCJkZWVwZXJcIi8+XG4vLyAgICAgLy8gaW5zdGVhZCBvZlxuLy8gICAgIDxMaW5rIHRvPWB7JHtwcm9wcy51cml9L2RlZXBlcn1gLz5cbi8vXG4vLyBKdXN0IGxpa2UgYGNkYCwgaWYgeW91IHdhbnQgdG8gZ28gZGVlcGVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IGRvIHRoaXM6XG4vL1xuLy8gICAgIGNkIGRlZXBlclxuLy8gICAgICMgbm90XG4vLyAgICAgY2QgJChwd2QpL2RlZXBlclxuLy9cbi8vIEJ5IHRyZWF0aW5nIGV2ZXJ5IHBhdGggYXMgYSBkaXJlY3RvcnksIGxpbmtpbmcgdG8gcmVsYXRpdmUgcGF0aHMgc2hvdWxkXG4vLyByZXF1aXJlIGxlc3MgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgKGZpbmdlcnMgY3Jvc3NlZCkgYmUgbW9yZSBpbnR1aXRpdmUuXG5cblxudmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHRvLCBiYXNlKSB7XG4gIC8vIC9mb28vYmFyLCAvYmF6L3F1eCA9PiAvZm9vL2JhclxuICBpZiAoc3RhcnRzV2l0aCh0bywgXCIvXCIpKSB7XG4gICAgcmV0dXJuIHRvO1xuICB9XG5cbiAgdmFyIF90byRzcGxpdCA9IHRvLnNwbGl0KFwiP1wiKSxcbiAgICAgIHRvUGF0aG5hbWUgPSBfdG8kc3BsaXRbMF0sXG4gICAgICB0b1F1ZXJ5ID0gX3RvJHNwbGl0WzFdO1xuXG4gIHZhciBfYmFzZSRzcGxpdCA9IGJhc2Uuc3BsaXQoXCI/XCIpLFxuICAgICAgYmFzZVBhdGhuYW1lID0gX2Jhc2Ukc3BsaXRbMF07XG5cbiAgdmFyIHRvU2VnbWVudHMgPSBzZWdtZW50aXplKHRvUGF0aG5hbWUpO1xuICB2YXIgYmFzZVNlZ21lbnRzID0gc2VnbWVudGl6ZShiYXNlUGF0aG5hbWUpOyAvLyA/YT1iLCAvdXNlcnM/Yj1jID0+IC91c2Vycz9hPWJcblxuICBpZiAodG9TZWdtZW50c1swXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBhZGRRdWVyeShiYXNlUGF0aG5hbWUsIHRvUXVlcnkpO1xuICB9IC8vIHByb2ZpbGUsIC91c2Vycy83ODkgPT4gL3VzZXJzLzc4OS9wcm9maWxlXG5cblxuICBpZiAoIXN0YXJ0c1dpdGgodG9TZWdtZW50c1swXSwgXCIuXCIpKSB7XG4gICAgdmFyIHBhdGhuYW1lID0gYmFzZVNlZ21lbnRzLmNvbmNhdCh0b1NlZ21lbnRzKS5qb2luKFwiL1wiKTtcbiAgICByZXR1cm4gYWRkUXVlcnkoKGJhc2VQYXRobmFtZSA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgcGF0aG5hbWUsIHRvUXVlcnkpO1xuICB9IC8vIC4vICAgICAgICAgL3VzZXJzLzEyMyAgPT4gIC91c2Vycy8xMjNcbiAgLy8gLi4vICAgICAgICAvdXNlcnMvMTIzICA9PiAgL3VzZXJzXG4gIC8vIC4uLy4uICAgICAgL3VzZXJzLzEyMyAgPT4gIC9cbiAgLy8gLi4vLi4vb25lICAvYS9iL2MvZCAgICA9PiAgL2EvYi9vbmVcbiAgLy8gLi4vLi9vbmUgICAvYS9iL2MvZCAgICA9PiAgL2EvYi9jL29uZVxuXG5cbiAgdmFyIGFsbFNlZ21lbnRzID0gYmFzZVNlZ21lbnRzLmNvbmNhdCh0b1NlZ21lbnRzKTtcbiAgdmFyIHNlZ21lbnRzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbGxTZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IGFsbFNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHNlZ21lbnRzLnBvcCgpO2Vsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkZFF1ZXJ5KFwiL1wiICsgc2VnbWVudHMuam9pbihcIi9cIiksIHRvUXVlcnkpO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGluc2VydFBhcmFtcyhwYXRoLCBwYXJhbXMpXG5cblxudmFyIGluc2VydFBhcmFtcyA9IGZ1bmN0aW9uIGluc2VydFBhcmFtcyhwYXRoLCBwYXJhbXMpIHtcbiAgdmFyIF9wYXRoJHNwbGl0ID0gcGF0aC5zcGxpdChcIj9cIiksXG4gICAgICBwYXRoQmFzZSA9IF9wYXRoJHNwbGl0WzBdLFxuICAgICAgX3BhdGgkc3BsaXQkID0gX3BhdGgkc3BsaXRbMV0sXG4gICAgICBxdWVyeSA9IF9wYXRoJHNwbGl0JCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9wYXRoJHNwbGl0JDtcblxuICB2YXIgc2VnbWVudHMgPSBzZWdtZW50aXplKHBhdGhCYXNlKTtcbiAgdmFyIGNvbnN0cnVjdGVkUGF0aCA9IFwiL1wiICsgc2VnbWVudHMubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgdmFyIG1hdGNoID0gcGFyYW1SZS5leGVjKHNlZ21lbnQpO1xuICAgIHJldHVybiBtYXRjaCA/IHBhcmFtc1ttYXRjaFsxXV0gOiBzZWdtZW50O1xuICB9KS5qb2luKFwiL1wiKTtcbiAgdmFyIF9wYXJhbXMkbG9jYXRpb24gPSBwYXJhbXMubG9jYXRpb247XG4gIF9wYXJhbXMkbG9jYXRpb24gPSBfcGFyYW1zJGxvY2F0aW9uID09PSB1bmRlZmluZWQgPyB7fSA6IF9wYXJhbXMkbG9jYXRpb247XG4gIHZhciBfcGFyYW1zJGxvY2F0aW9uJHNlYXIgPSBfcGFyYW1zJGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHNlYXJjaCA9IF9wYXJhbXMkbG9jYXRpb24kc2VhciA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9wYXJhbXMkbG9jYXRpb24kc2VhcjtcbiAgdmFyIHNlYXJjaFNwbGl0ID0gc2VhcmNoLnNwbGl0KFwiP1wiKVsxXSB8fCBcIlwiO1xuICBjb25zdHJ1Y3RlZFBhdGggPSBhZGRRdWVyeShjb25zdHJ1Y3RlZFBhdGgsIHF1ZXJ5LCBzZWFyY2hTcGxpdCk7XG4gIHJldHVybiBjb25zdHJ1Y3RlZFBhdGg7XG59O1xuXG52YXIgdmFsaWRhdGVSZWRpcmVjdCA9IGZ1bmN0aW9uIHZhbGlkYXRlUmVkaXJlY3QoZnJvbSwgdG8pIHtcbiAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihzZWdtZW50KSB7XG4gICAgcmV0dXJuIGlzRHluYW1pYyhzZWdtZW50KTtcbiAgfTtcblxuICB2YXIgZnJvbVN0cmluZyA9IHNlZ21lbnRpemUoZnJvbSkuZmlsdGVyKGZpbHRlcikuc29ydCgpLmpvaW4oXCIvXCIpO1xuICB2YXIgdG9TdHJpbmcgPSBzZWdtZW50aXplKHRvKS5maWx0ZXIoZmlsdGVyKS5zb3J0KCkuam9pbihcIi9cIik7XG4gIHJldHVybiBmcm9tU3RyaW5nID09PSB0b1N0cmluZztcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBKdW5rXG5cblxudmFyIHBhcmFtUmUgPSAvXjooLispLztcbnZhciBTRUdNRU5UX1BPSU5UUyA9IDQ7XG52YXIgU1RBVElDX1BPSU5UUyA9IDM7XG52YXIgRFlOQU1JQ19QT0lOVFMgPSAyO1xudmFyIFNQTEFUX1BFTkFMVFkgPSAxO1xudmFyIFJPT1RfUE9JTlRTID0gMTtcblxudmFyIGlzUm9vdFNlZ21lbnQgPSBmdW5jdGlvbiBpc1Jvb3RTZWdtZW50KHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgPT09IFwiXCI7XG59O1xuXG52YXIgaXNEeW5hbWljID0gZnVuY3Rpb24gaXNEeW5hbWljKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHBhcmFtUmUudGVzdChzZWdtZW50KTtcbn07XG5cbnZhciBpc1NwbGF0ID0gZnVuY3Rpb24gaXNTcGxhdChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ICYmIHNlZ21lbnRbMF0gPT09IFwiKlwiO1xufTtcblxudmFyIHJhbmtSb3V0ZSA9IGZ1bmN0aW9uIHJhbmtSb3V0ZShyb3V0ZSwgaW5kZXgpIHtcbiAgdmFyIHNjb3JlID0gcm91dGUuZGVmYXVsdCA/IDAgOiBzZWdtZW50aXplKHJvdXRlLnBhdGgpLnJlZHVjZShmdW5jdGlvbiAoc2NvcmUsIHNlZ21lbnQpIHtcbiAgICBzY29yZSArPSBTRUdNRU5UX1BPSU5UUztcbiAgICBpZiAoaXNSb290U2VnbWVudChzZWdtZW50KSkgc2NvcmUgKz0gUk9PVF9QT0lOVFM7ZWxzZSBpZiAoaXNEeW5hbWljKHNlZ21lbnQpKSBzY29yZSArPSBEWU5BTUlDX1BPSU5UUztlbHNlIGlmIChpc1NwbGF0KHNlZ21lbnQpKSBzY29yZSAtPSBTRUdNRU5UX1BPSU5UUyArIFNQTEFUX1BFTkFMVFk7ZWxzZSBzY29yZSArPSBTVEFUSUNfUE9JTlRTO1xuICAgIHJldHVybiBzY29yZTtcbiAgfSwgMCk7XG4gIHJldHVybiB7XG4gICAgcm91dGU6IHJvdXRlLFxuICAgIHNjb3JlOiBzY29yZSxcbiAgICBpbmRleDogaW5kZXhcbiAgfTtcbn07XG5cbnZhciByYW5rUm91dGVzID0gZnVuY3Rpb24gcmFua1JvdXRlcyhyb3V0ZXMpIHtcbiAgcmV0dXJuIHJvdXRlcy5tYXAocmFua1JvdXRlKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEuc2NvcmUgPCBiLnNjb3JlID8gMSA6IGEuc2NvcmUgPiBiLnNjb3JlID8gLTEgOiBhLmluZGV4IC0gYi5pbmRleDtcbiAgfSk7XG59O1xuXG52YXIgc2VnbWVudGl6ZSA9IGZ1bmN0aW9uIHNlZ21lbnRpemUodXJpKSB7XG4gIHJldHVybiB1cmkgLy8gc3RyaXAgc3RhcnRpbmcvZW5kaW5nIHNsYXNoZXNcbiAgLnJlcGxhY2UoLyheXFwvK3xcXC8rJCkvZywgXCJcIikuc3BsaXQoXCIvXCIpO1xufTtcblxudmFyIGFkZFF1ZXJ5ID0gZnVuY3Rpb24gYWRkUXVlcnkocGF0aG5hbWUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJ5ID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHF1ZXJ5W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHF1ZXJ5ID0gcXVlcnkuZmlsdGVyKGZ1bmN0aW9uIChxKSB7XG4gICAgcmV0dXJuIHEgJiYgcS5sZW5ndGggPiAwO1xuICB9KTtcbiAgcmV0dXJuIHBhdGhuYW1lICsgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDAgPyBcIj9cIiArIHF1ZXJ5LmpvaW4oXCImXCIpIDogXCJcIik7XG59O1xuXG52YXIgcmVzZXJ2ZWROYW1lcyA9IFtcInVyaVwiLCBcInBhdGhcIl07XG4vKipcbiAqIFNoYWxsb3cgY29tcGFyZXMgdHdvIG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMiBUaGUgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlLlxuICovXG5cbnZhciBzaGFsbG93Q29tcGFyZSA9IGZ1bmN0aW9uIHNoYWxsb3dDb21wYXJlKG9iajEsIG9iajIpIHtcbiAgdmFyIG9iajFLZXlzID0gT2JqZWN0LmtleXMob2JqMSk7XG4gIHJldHVybiBvYmoxS2V5cy5sZW5ndGggPT09IE9iamVjdC5rZXlzKG9iajIpLmxlbmd0aCAmJiBvYmoxS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmoxW2tleV0gPT09IG9iajJba2V5XTtcbiAgfSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbmV4cG9ydCB7IHN0YXJ0c1dpdGgsIHBpY2ssIG1hdGNoLCByZXNvbHZlLCBpbnNlcnRQYXJhbXMsIHZhbGlkYXRlUmVkaXJlY3QsIHNoYWxsb3dDb21wYXJlIH07IiwidmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBnZXRMb2NhdGlvbiA9IGZ1bmN0aW9uIGdldExvY2F0aW9uKHNvdXJjZSkge1xuICB2YXIgX3NvdXJjZSRsb2NhdGlvbiA9IHNvdXJjZS5sb2NhdGlvbixcbiAgICAgIHNlYXJjaCA9IF9zb3VyY2UkbG9jYXRpb24uc2VhcmNoLFxuICAgICAgaGFzaCA9IF9zb3VyY2UkbG9jYXRpb24uaGFzaCxcbiAgICAgIGhyZWYgPSBfc291cmNlJGxvY2F0aW9uLmhyZWYsXG4gICAgICBvcmlnaW4gPSBfc291cmNlJGxvY2F0aW9uLm9yaWdpbixcbiAgICAgIHByb3RvY29sID0gX3NvdXJjZSRsb2NhdGlvbi5wcm90b2NvbCxcbiAgICAgIGhvc3QgPSBfc291cmNlJGxvY2F0aW9uLmhvc3QsXG4gICAgICBob3N0bmFtZSA9IF9zb3VyY2UkbG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICBwb3J0ID0gX3NvdXJjZSRsb2NhdGlvbi5wb3J0O1xuICB2YXIgcGF0aG5hbWUgPSBzb3VyY2UubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgaWYgKCFwYXRobmFtZSAmJiBocmVmICYmIGNhblVzZURPTSkge1xuICAgIHZhciB1cmwgPSBuZXcgVVJMKGhyZWYpO1xuICAgIHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogZW5jb2RlVVJJKGRlY29kZVVSSShwYXRobmFtZSkpLFxuICAgIHNlYXJjaDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2gsXG4gICAgaHJlZjogaHJlZixcbiAgICBvcmlnaW46IG9yaWdpbixcbiAgICBwcm90b2NvbDogcHJvdG9jb2wsXG4gICAgaG9zdDogaG9zdCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUsXG4gICAgcG9ydDogcG9ydCxcbiAgICBzdGF0ZTogc291cmNlLmhpc3Rvcnkuc3RhdGUsXG4gICAga2V5OiBzb3VyY2UuaGlzdG9yeS5zdGF0ZSAmJiBzb3VyY2UuaGlzdG9yeS5zdGF0ZS5rZXkgfHwgXCJpbml0aWFsXCJcbiAgfTtcbn07XG5cbnZhciBjcmVhdGVIaXN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICB2YXIgdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gIHZhciByZXNvbHZlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uKCkge307XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfSxcblxuICAgIGdldCB0cmFuc2l0aW9uaW5nKCkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25pbmc7XG4gICAgfSxcblxuICAgIF9vblRyYW5zaXRpb25Db21wbGV0ZTogZnVuY3Rpb24gX29uVHJhbnNpdGlvbkNvbXBsZXRlKCkge1xuICAgICAgdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIGxpc3RlbjogZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgIHZhciBwb3BzdGF0ZUxpc3RlbmVyID0gZnVuY3Rpb24gcG9wc3RhdGVMaXN0ZW5lcigpIHtcbiAgICAgICAgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihzb3VyY2UpO1xuICAgICAgICBsaXN0ZW5lcih7XG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICAgIGFjdGlvbjogXCJQT1BcIlxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgcG9wc3RhdGVMaXN0ZW5lcik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHBvcHN0YXRlTGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIHJldHVybiBmbiAhPT0gbGlzdGVuZXI7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSh0bykge1xuICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgICAgICBfcmVmJHJlcGxhY2UgPSBfcmVmLnJlcGxhY2UsXG4gICAgICAgICAgcmVwbGFjZSA9IF9yZWYkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHJlcGxhY2U7XG5cbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgc291cmNlLmhpc3RvcnkuZ28odG8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUgPSBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBrZXk6IERhdGUubm93KCkgKyBcIlwiXG4gICAgICAgIH0pOyAvLyB0cnkuLi5jYXRjaCBpT1MgU2FmYXJpIGxpbWl0cyB0byAxMDAgcHVzaFN0YXRlIGNhbGxzXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHJhbnNpdGlvbmluZyB8fCByZXBsYWNlKSB7XG4gICAgICAgICAgICBzb3VyY2UuaGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIG51bGwsIHRvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc291cmNlLmhpc3RvcnkucHVzaFN0YXRlKHN0YXRlLCBudWxsLCB0byk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc291cmNlLmxvY2F0aW9uW3JlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwiYXNzaWduXCJdKHRvKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2NhdGlvbiA9IGdldExvY2F0aW9uKHNvdXJjZSk7XG4gICAgICB0cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zaXRpb24gPSByZXM7XG4gICAgICB9KTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXIoe1xuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBhY3Rpb246IFwiUFVTSFwiXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvbjtcbiAgICB9XG4gIH07XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU3RvcmVzIGhpc3RvcnkgZW50cmllcyBpbiBtZW1vcnkgZm9yIHRlc3Rpbmcgb3Igb3RoZXIgcGxhdGZvcm1zIGxpa2UgTmF0aXZlXG5cblxudmFyIGNyZWF0ZU1lbW9yeVNvdXJjZSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNvdXJjZSgpIHtcbiAgdmFyIGluaXRpYWxQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBcIi9cIjtcbiAgdmFyIHNlYXJjaEluZGV4ID0gaW5pdGlhbFBhdGguaW5kZXhPZihcIj9cIik7XG4gIHZhciBpbml0aWFsTG9jYXRpb24gPSB7XG4gICAgcGF0aG5hbWU6IHNlYXJjaEluZGV4ID4gLTEgPyBpbml0aWFsUGF0aC5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpIDogaW5pdGlhbFBhdGgsXG4gICAgc2VhcmNoOiBzZWFyY2hJbmRleCA+IC0xID8gaW5pdGlhbFBhdGguc3Vic3RyKHNlYXJjaEluZGV4KSA6IFwiXCJcbiAgfTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHN0YWNrID0gW2luaXRpYWxMb2NhdGlvbl07XG4gIHZhciBzdGF0ZXMgPSBbbnVsbF07XG4gIHJldHVybiB7XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0YWNrW2luZGV4XTtcbiAgICB9LFxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmbikge30sXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmbikge30sXG4gICAgaGlzdG9yeToge1xuICAgICAgZ2V0IGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfSxcblxuICAgICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4gc3RhdGVzW2luZGV4XTtcbiAgICAgIH0sXG5cbiAgICAgIHB1c2hTdGF0ZTogZnVuY3Rpb24gcHVzaFN0YXRlKHN0YXRlLCBfLCB1cmkpIHtcbiAgICAgICAgdmFyIF91cmkkc3BsaXQgPSB1cmkuc3BsaXQoXCI/XCIpLFxuICAgICAgICAgICAgcGF0aG5hbWUgPSBfdXJpJHNwbGl0WzBdLFxuICAgICAgICAgICAgX3VyaSRzcGxpdCQgPSBfdXJpJHNwbGl0WzFdLFxuICAgICAgICAgICAgc2VhcmNoID0gX3VyaSRzcGxpdCQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfdXJpJHNwbGl0JDtcblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBzZWFyY2gubGVuZ3RoID8gXCI/XCIgKyBzZWFyY2ggOiBzZWFyY2hcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZShzdGF0ZSwgXywgdXJpKSB7XG4gICAgICAgIHZhciBfdXJpJHNwbGl0MiA9IHVyaS5zcGxpdChcIj9cIiksXG4gICAgICAgICAgICBwYXRobmFtZSA9IF91cmkkc3BsaXQyWzBdLFxuICAgICAgICAgICAgX3VyaSRzcGxpdDIkID0gX3VyaSRzcGxpdDJbMV0sXG4gICAgICAgICAgICBzZWFyY2ggPSBfdXJpJHNwbGl0MiQgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfdXJpJHNwbGl0MiQ7XG5cbiAgICAgICAgc3RhY2tbaW5kZXhdID0ge1xuICAgICAgICAgIHBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IHNlYXJjaFxuICAgICAgICB9O1xuICAgICAgICBzdGF0ZXNbaW5kZXhdID0gc3RhdGU7XG4gICAgICB9LFxuICAgICAgZ286IGZ1bmN0aW9uIGdvKHRvKSB7XG4gICAgICAgIHZhciBuZXdJbmRleCA9IGluZGV4ICsgdG87XG5cbiAgICAgICAgaWYgKG5ld0luZGV4IDwgMCB8fCBuZXdJbmRleCA+IHN0YXRlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBuZXdJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gZ2xvYmFsIGhpc3RvcnkgLSB1c2VzIHdpbmRvdy5oaXN0b3J5IGFzIHRoZSBzb3VyY2UgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgYVxuLy8gbWVtb3J5IGhpc3RvcnlcblxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG52YXIgZ2V0U291cmNlID0gZnVuY3Rpb24gZ2V0U291cmNlKCkge1xuICByZXR1cm4gY2FuVXNlRE9NID8gd2luZG93IDogY3JlYXRlTWVtb3J5U291cmNlKCk7XG59O1xuXG52YXIgZ2xvYmFsSGlzdG9yeSA9IGNyZWF0ZUhpc3RvcnkoZ2V0U291cmNlKCkpO1xudmFyIG5hdmlnYXRlID0gZ2xvYmFsSGlzdG9yeS5uYXZpZ2F0ZTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHsgZ2xvYmFsSGlzdG9yeSwgbmF2aWdhdGUsIGNyZWF0ZUhpc3RvcnksIGNyZWF0ZU1lbW9yeVNvdXJjZSB9OyIsInZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYW5jaG9yLWhhcy1jb250ZW50ICovXG5cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSBcImludmFyaWFudFwiO1xuaW1wb3J0IHsgcG9seWZpbGwgfSBmcm9tIFwicmVhY3QtbGlmZWN5Y2xlcy1jb21wYXRcIjtcbmltcG9ydCB7IHN0YXJ0c1dpdGgsIHBpY2ssIHJlc29sdmUsIG1hdGNoLCBpbnNlcnRQYXJhbXMsIHZhbGlkYXRlUmVkaXJlY3QsIHNoYWxsb3dDb21wYXJlIH0gZnJvbSBcIi4vbGliL3V0aWxzXCI7XG5pbXBvcnQgeyBnbG9iYWxIaXN0b3J5LCBuYXZpZ2F0ZSwgY3JlYXRlSGlzdG9yeSwgY3JlYXRlTWVtb3J5U291cmNlIH0gZnJvbSBcIi4vbGliL2hpc3RvcnlcIjsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIGNyZWF0ZU5hbWVkQ29udGV4dCA9IGZ1bmN0aW9uIGNyZWF0ZU5hbWVkQ29udGV4dChuYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIEN0eCA9IGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKTtcbiAgQ3R4LmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgcmV0dXJuIEN0eDtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMb2NhdGlvbiBDb250ZXh0L1Byb3ZpZGVyXG5cblxudmFyIExvY2F0aW9uQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dChcIkxvY2F0aW9uXCIpOyAvLyBzZXRzIHVwIGEgbGlzdGVuZXIgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkgc28gYXBwcyBkb24ndCBuZWVkIHRvIGJlXG4vLyB3cmFwcGVkIGluIHNvbWUgdG9wIGxldmVsIHByb3ZpZGVyXG5cbnZhciBMb2NhdGlvbiA9IGZ1bmN0aW9uIExvY2F0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb25Db250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiBjb250ZXh0ID8gY2hpbGRyZW4oY29udGV4dCkgOiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uUHJvdmlkZXIsIG51bGwsIGNoaWxkcmVuKTtcbiAgfSk7XG59O1xuXG52YXIgTG9jYXRpb25Qcm92aWRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMb2NhdGlvblByb3ZpZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMb2NhdGlvblByb3ZpZGVyKCkge1xuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9jYXRpb25Qcm92aWRlcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjb250ZXh0OiBfdGhpcy5nZXRDb250ZXh0KCksXG4gICAgICByZWZzOiB7XG4gICAgICAgIHVubGlzdGVuOiBudWxsXG4gICAgICB9XG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBMb2NhdGlvblByb3ZpZGVyLnByb3RvdHlwZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgICB2YXIgX3Byb3BzJGhpc3RvcnkgPSB0aGlzLnByb3BzLmhpc3RvcnksXG4gICAgICAgIG5hdmlnYXRlID0gX3Byb3BzJGhpc3RvcnkubmF2aWdhdGUsXG4gICAgICAgIGxvY2F0aW9uID0gX3Byb3BzJGhpc3RvcnkubG9jYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hdmlnYXRlOiBuYXZpZ2F0ZSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgIH07XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50RGlkQ2F0Y2ggPSBmdW5jdGlvbiBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgIGlmIChpc1JlZGlyZWN0KGVycm9yKSkge1xuICAgICAgdmFyIF9uYXZpZ2F0ZSA9IHRoaXMucHJvcHMuaGlzdG9yeS5uYXZpZ2F0ZTtcblxuICAgICAgX25hdmlnYXRlKGVycm9yLnVyaSwge1xuICAgICAgICByZXBsYWNlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmIChwcmV2U3RhdGUuY29udGV4dC5sb2NhdGlvbiAhPT0gdGhpcy5zdGF0ZS5jb250ZXh0LmxvY2F0aW9uKSB7XG4gICAgICB0aGlzLnByb3BzLmhpc3RvcnkuX29uVHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgcmVmcyA9IHRoaXMuc3RhdGUucmVmcyxcbiAgICAgICAgaGlzdG9yeSA9IHRoaXMucHJvcHMuaGlzdG9yeTtcblxuICAgIGhpc3RvcnkuX29uVHJhbnNpdGlvbkNvbXBsZXRlKCk7XG5cbiAgICByZWZzLnVubGlzdGVuID0gaGlzdG9yeS5saXN0ZW4oZnVuY3Rpb24gKCkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRPRE86IHJlcGxhY2UgckFGIHdpdGggcmVhY3QgZGVmZXJyZWQgdXBkYXRlIEFQSSB3aGVuIGl0J3MgcmVhZHkgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzMwNlxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghX3RoaXMyLnVubW91bnRlZCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBfdGhpczIuZ2V0Q29udGV4dCgpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTG9jYXRpb25Qcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB2YXIgcmVmcyA9IHRoaXMuc3RhdGUucmVmcztcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgcmVmcy51bmxpc3RlbigpO1xuICB9O1xuXG4gIExvY2F0aW9uUHJvdmlkZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuc3RhdGUuY29udGV4dCxcbiAgICAgICAgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRcbiAgICB9LCB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKGNvbnRleHQpIDogY2hpbGRyZW4gfHwgbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIExvY2F0aW9uUHJvdmlkZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuTG9jYXRpb25Qcm92aWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGhpc3Rvcnk6IGdsb2JhbEhpc3Rvcnlcbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB2b2lkIDAgOiB2b2lkIDA7XG5cbnZhciBTZXJ2ZXJMb2NhdGlvbiA9IGZ1bmN0aW9uIFNlcnZlckxvY2F0aW9uKF9yZWYyKSB7XG4gIHZhciB1cmwgPSBfcmVmMi51cmwsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuO1xuICB2YXIgc2VhcmNoSW5kZXggPSB1cmwuaW5kZXhPZihcIj9cIik7XG4gIHZhciBzZWFyY2hFeGlzdHMgPSBzZWFyY2hJbmRleCA+IC0xO1xuICB2YXIgcGF0aG5hbWUgPSB2b2lkIDA7XG4gIHZhciBzZWFyY2ggPSBcIlwiO1xuICB2YXIgaGFzaCA9IFwiXCI7XG5cbiAgaWYgKHNlYXJjaEV4aXN0cykge1xuICAgIHBhdGhuYW1lID0gdXJsLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gICAgc2VhcmNoID0gdXJsLnN1YnN0cmluZyhzZWFyY2hJbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgcGF0aG5hbWUgPSB1cmw7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IHNlYXJjaCxcbiAgICAgICAgaGFzaDogaGFzaFxuICAgICAgfSxcbiAgICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IGNhbGwgbmF2aWdhdGUgb24gdGhlIHNlcnZlci5cIik7XG4gICAgICB9XG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gU2V0cyBiYXNldXJpIGFuZCBiYXNlcGF0aCBmb3IgbmVzdGVkIHJvdXRlcnMgYW5kIGxpbmtzXG5cblxudmFyIEJhc2VDb250ZXh0ID0gY3JlYXRlTmFtZWRDb250ZXh0KFwiQmFzZVwiLCB7XG4gIGJhc2V1cmk6IFwiL1wiLFxuICBiYXNlcGF0aDogXCIvXCIsXG4gIG5hdmlnYXRlOiBnbG9iYWxIaXN0b3J5Lm5hdmlnYXRlXG59KTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFRoZSBtYWluIGV2ZW50LCB3ZWxjb21lIHRvIHRoZSBzaG93IGV2ZXJ5Ym9keS5cblxudmFyIFJvdXRlciA9IGZ1bmN0aW9uIFJvdXRlcihwcm9wcykge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGJhc2VDb250ZXh0KSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChsb2NhdGlvbkNvbnRleHQpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlckltcGwsIF9leHRlbmRzKHt9LCBiYXNlQ29udGV4dCwgbG9jYXRpb25Db250ZXh0LCBwcm9wcykpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbnZhciBSb3V0ZXJJbXBsID0gZnVuY3Rpb24gKF9SZWFjdCRQdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3V0ZXJJbXBsLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUm91dGVySW1wbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm91dGVySW1wbCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JFB1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBSb3V0ZXJJbXBsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGxvY2F0aW9uID0gX3Byb3BzLmxvY2F0aW9uLFxuICAgICAgICBfbmF2aWdhdGUyID0gX3Byb3BzLm5hdmlnYXRlLFxuICAgICAgICBiYXNlcGF0aCA9IF9wcm9wcy5iYXNlcGF0aCxcbiAgICAgICAgcHJpbWFyeSA9IF9wcm9wcy5wcmltYXJ5LFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgYmFzZXVyaSA9IF9wcm9wcy5iYXNldXJpLFxuICAgICAgICBfcHJvcHMkY29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudCxcbiAgICAgICAgY29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkID8gXCJkaXZcIiA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICAgIGRvbVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wibG9jYXRpb25cIiwgXCJuYXZpZ2F0ZVwiLCBcImJhc2VwYXRoXCIsIFwicHJpbWFyeVwiLCBcImNoaWxkcmVuXCIsIFwiYmFzZXVyaVwiLCBcImNvbXBvbmVudFwiXSk7XG5cbiAgICB2YXIgcm91dGVzID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikucmVkdWNlKGZ1bmN0aW9uIChhcnJheSwgY2hpbGQpIHtcbiAgICAgIHZhciByb3V0ZXMgPSBjcmVhdGVSb3V0ZShiYXNlcGF0aCkoY2hpbGQpO1xuICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdChyb3V0ZXMpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICB2YXIgbWF0Y2ggPSBwaWNrKHJvdXRlcywgcGF0aG5hbWUpO1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gbWF0Y2gucGFyYW1zLFxuICAgICAgICAgIHVyaSA9IG1hdGNoLnVyaSxcbiAgICAgICAgICByb3V0ZSA9IG1hdGNoLnJvdXRlLFxuICAgICAgICAgIGVsZW1lbnQgPSBtYXRjaC5yb3V0ZS52YWx1ZTsgLy8gcmVtb3ZlIHRoZSAvKiBmcm9tIHRoZSBlbmQgZm9yIGNoaWxkIHJvdXRlcyByZWxhdGl2ZSBwYXRoc1xuXG4gICAgICBiYXNlcGF0aCA9IHJvdXRlLmRlZmF1bHQgPyBiYXNlcGF0aCA6IHJvdXRlLnBhdGgucmVwbGFjZSgvXFwqJC8sIFwiXCIpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgcGFyYW1zLCB7XG4gICAgICAgIHVyaTogdXJpLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIG5hdmlnYXRlOiBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBfbmF2aWdhdGUyKHJlc29sdmUodG8sIHVyaSksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNsb25lID0gUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuID8gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBwcmltYXJ5OiBwcmltYXJ5XG4gICAgICB9LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKSA6IHVuZGVmaW5lZCk7IC8vIHVzaW5nICdkaXYnIGZvciA8IDE2LjMgc3VwcG9ydFxuXG4gICAgICB2YXIgRm9jdXNXcmFwcGVyID0gcHJpbWFyeSA/IEZvY3VzSGFuZGxlciA6IGNvbXBvbmVudDsgLy8gZG9uJ3QgcGFzcyBhbnkgcHJvcHMgdG8gJ2RpdidcblxuICAgICAgdmFyIHdyYXBwZXJQcm9wcyA9IHByaW1hcnkgPyBfZXh0ZW5kcyh7XG4gICAgICAgIHVyaTogdXJpLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50XG4gICAgICB9LCBkb21Qcm9wcykgOiBkb21Qcm9wcztcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmFzZXVyaTogdXJpLFxuICAgICAgICAgIGJhc2VwYXRoOiBiYXNlcGF0aCxcbiAgICAgICAgICBuYXZpZ2F0ZTogcHJvcHMubmF2aWdhdGVcbiAgICAgICAgfVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c1dyYXBwZXIsIHdyYXBwZXJQcm9wcywgY2xvbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm90IHN1cmUgaWYgd2Ugd2FudCB0aGlzLCB3b3VsZCByZXF1aXJlIGluZGV4IHJvdXRlcyBhdCBldmVyeSBsZXZlbFxuICAgICAgLy8gd2FybmluZyhcbiAgICAgIC8vICAgZmFsc2UsXG4gICAgICAvLyAgIGA8Um91dGVyIGJhc2VwYXRoPVwiJHtiYXNlcGF0aH1cIj5cXG5cXG5Ob3RoaW5nIG1hdGNoZWQ6XFxuXFx0JHtcbiAgICAgIC8vICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgLy8gICB9XFxuXFxuUGF0aHMgY2hlY2tlZDogXFxuXFx0JHtyb3V0ZXNcbiAgICAgIC8vICAgICAubWFwKHJvdXRlID0+IHJvdXRlLnBhdGgpXG4gICAgICAvLyAgICAgLmpvaW4oXG4gICAgICAvLyAgICAgICBcIlxcblxcdFwiXG4gICAgICAvLyAgICAgKX1cXG5cXG5UbyBnZXQgcmlkIG9mIHRoaXMgd2FybmluZywgYWRkIGEgZGVmYXVsdCBOb3RGb3VuZCBjb21wb25lbnQgYXMgY2hpbGQgb2YgUm91dGVyOlxuICAgICAgLy8gICBcXG5cXHRsZXQgTm90Rm91bmQgPSAoKSA9PiA8ZGl2Pk5vdCBGb3VuZCE8L2Rpdj5cbiAgICAgIC8vICAgXFxuXFx0PFJvdXRlcj5cXG5cXHQgIDxOb3RGb3VuZCBkZWZhdWx0Lz5cXG5cXHQgIHsvKiAuLi4gKi99XFxuXFx0PC9Sb3V0ZXI+YFxuICAgICAgLy8gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUm91dGVySW1wbDtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCk7XG5cblJvdXRlckltcGwuZGVmYXVsdFByb3BzID0ge1xuICBwcmltYXJ5OiB0cnVlXG59O1xudmFyIEZvY3VzQ29udGV4dCA9IGNyZWF0ZU5hbWVkQ29udGV4dChcIkZvY3VzXCIpO1xuXG52YXIgRm9jdXNIYW5kbGVyID0gZnVuY3Rpb24gRm9jdXNIYW5kbGVyKF9yZWYzKSB7XG4gIHZhciB1cmkgPSBfcmVmMy51cmksXG4gICAgICBsb2NhdGlvbiA9IF9yZWYzLmxvY2F0aW9uLFxuICAgICAgY29tcG9uZW50ID0gX3JlZjMuY29tcG9uZW50LFxuICAgICAgZG9tUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIFtcInVyaVwiLCBcImxvY2F0aW9uXCIsIFwiY29tcG9uZW50XCJdKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0NvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0hhbmRsZXJJbXBsLCBfZXh0ZW5kcyh7fSwgZG9tUHJvcHMsIHtcbiAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgcmVxdWVzdEZvY3VzOiByZXF1ZXN0Rm9jdXMsXG4gICAgICB1cmk6IHVyaSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgIH0pKTtcbiAgfSk7XG59OyAvLyBkb24ndCBmb2N1cyBvbiBpbml0aWFsIHJlbmRlclxuXG5cbnZhciBpbml0aWFsUmVuZGVyID0gdHJ1ZTtcbnZhciBmb2N1c0hhbmRsZXJDb3VudCA9IDA7XG5cbnZhciBGb2N1c0hhbmRsZXJJbXBsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gIF9pbmhlcml0cyhGb2N1c0hhbmRsZXJJbXBsLCBfUmVhY3QkQ29tcG9uZW50Mik7XG5cbiAgZnVuY3Rpb24gRm9jdXNIYW5kbGVySW1wbCgpIHtcbiAgICB2YXIgX3RlbXAyLCBfdGhpczQsIF9yZXQyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZvY3VzSGFuZGxlckltcGwpO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldDIgPSAoX3RlbXAyID0gKF90aGlzNCA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQyLmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudDIsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXM0KSwgX3RoaXM0LnN0YXRlID0ge30sIF90aGlzNC5yZXF1ZXN0Rm9jdXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCFfdGhpczQuc3RhdGUuc2hvdWxkRm9jdXMgJiYgbm9kZSkge1xuICAgICAgICBub2RlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgX3RlbXAyKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXM0LCBfcmV0Mik7XG4gIH1cblxuICBGb2N1c0hhbmRsZXJJbXBsLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHZhciBpbml0aWFsID0gcHJldlN0YXRlLnVyaSA9PSBudWxsO1xuXG4gICAgaWYgKGluaXRpYWwpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHNob3VsZEZvY3VzOiB0cnVlXG4gICAgICB9LCBuZXh0UHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbXlVUklDaGFuZ2VkID0gbmV4dFByb3BzLnVyaSAhPT0gcHJldlN0YXRlLnVyaTtcbiAgICAgIHZhciBuYXZpZ2F0ZWRVcFRvTWUgPSBwcmV2U3RhdGUubG9jYXRpb24ucGF0aG5hbWUgIT09IG5leHRQcm9wcy5sb2NhdGlvbi5wYXRobmFtZSAmJiBuZXh0UHJvcHMubG9jYXRpb24ucGF0aG5hbWUgPT09IG5leHRQcm9wcy51cmk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzaG91bGRGb2N1czogbXlVUklDaGFuZ2VkIHx8IG5hdmlnYXRlZFVwVG9NZVxuICAgICAgfSwgbmV4dFByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBmb2N1c0hhbmRsZXJDb3VudCsrO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfTtcblxuICBGb2N1c0hhbmRsZXJJbXBsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGZvY3VzSGFuZGxlckNvdW50LS07XG5cbiAgICBpZiAoZm9jdXNIYW5kbGVyQ291bnQgPT09IDApIHtcbiAgICAgIGluaXRpYWxSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBGb2N1c0hhbmRsZXJJbXBsLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBpZiAocHJldlByb3BzLmxvY2F0aW9uICE9PSB0aGlzLnByb3BzLmxvY2F0aW9uICYmIHRoaXMuc3RhdGUuc2hvdWxkRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyBnZXR0aW5nIGNhbm5vdCByZWFkIHByb3BlcnR5IGZvY3VzIG9mIG51bGwgaW4gdGhlIHRlc3RzXG4gICAgICAvLyBhbmQgdGhhdCBiaXQgb2YgZ2xvYmFsIGBpbml0aWFsUmVuZGVyYCBzdGF0ZSBjYXVzZXMgcHJvYmxlbXNcbiAgICAgIC8vIHNob3VsZCBwcm9iYWJseSBmaWd1cmUgaXQgb3V0IVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByZXF1ZXN0Rm9jdXMgPSB0aGlzLnByb3BzLnJlcXVlc3RGb2N1cztcblxuICAgIGlmIChyZXF1ZXN0Rm9jdXMpIHtcbiAgICAgIHJlcXVlc3RGb2N1cyh0aGlzLm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW5pdGlhbFJlbmRlcikge1xuICAgICAgICBpbml0aWFsUmVuZGVyID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAvLyBSZWFjdCBwb2x5ZmlsbHMgW2F1dG9mb2N1c10gYW5kIGl0IGZpcmVzIGVhcmxpZXIgdGhhbiBjRE0sXG4gICAgICAgIC8vIHNvIHdlIHdlcmUgc3RlYWxpbmcgZm9jdXMgYXdheSwgdGhpcyBsaW5lIHByZXZlbnRzIHRoYXQuXG4gICAgICAgIGlmICghdGhpcy5ub2RlLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgdGhpcy5ub2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRm9jdXNIYW5kbGVySW1wbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sXG4gICAgICAgIHN0eWxlID0gX3Byb3BzMi5zdHlsZSxcbiAgICAgICAgcmVxdWVzdEZvY3VzID0gX3Byb3BzMi5yZXF1ZXN0Rm9jdXMsXG4gICAgICAgIF9wcm9wczIkY29tcG9uZW50ID0gX3Byb3BzMi5jb21wb25lbnQsXG4gICAgICAgIENvbXAgPSBfcHJvcHMyJGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkID8gXCJkaXZcIiA6IF9wcm9wczIkY29tcG9uZW50LFxuICAgICAgICB1cmkgPSBfcHJvcHMyLnVyaSxcbiAgICAgICAgbG9jYXRpb24gPSBfcHJvcHMyLmxvY2F0aW9uLFxuICAgICAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMyLCBbXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwicmVxdWVzdEZvY3VzXCIsIFwiY29tcG9uZW50XCIsIFwidXJpXCIsIFwibG9jYXRpb25cIl0pO1xuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcCwgX2V4dGVuZHMoe1xuICAgICAgc3R5bGU6IF9leHRlbmRzKHtcbiAgICAgICAgb3V0bGluZTogXCJub25lXCJcbiAgICAgIH0sIHN0eWxlKSxcbiAgICAgIHRhYkluZGV4OiBcIi0xXCIsXG4gICAgICByZWY6IGZ1bmN0aW9uIHJlZihuKSB7XG4gICAgICAgIHJldHVybiBfdGhpczUubm9kZSA9IG47XG4gICAgICB9XG4gICAgfSwgZG9tUHJvcHMpLCBSZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHRoaXMucmVxdWVzdEZvY3VzXG4gICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikpO1xuICB9O1xuXG4gIHJldHVybiBGb2N1c0hhbmRsZXJJbXBsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5wb2x5ZmlsbChGb2N1c0hhbmRsZXJJbXBsKTtcblxudmFyIGsgPSBmdW5jdGlvbiBrKCkge307IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxudmFyIGZvcndhcmRSZWYgPSBSZWFjdC5mb3J3YXJkUmVmO1xuXG5pZiAodHlwZW9mIGZvcndhcmRSZWYgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgZm9yd2FyZFJlZiA9IGZ1bmN0aW9uIGZvcndhcmRSZWYoQykge1xuICAgIHJldHVybiBDO1xuICB9O1xufVxuXG52YXIgTGluayA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWY0LCByZWYpIHtcbiAgdmFyIGlubmVyUmVmID0gX3JlZjQuaW5uZXJSZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNCwgW1wiaW5uZXJSZWZcIl0pO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICB2YXIgYmFzZXBhdGggPSBfcmVmNS5iYXNlcGF0aCxcbiAgICAgICAgYmFzZXVyaSA9IF9yZWY1LmJhc2V1cmk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYXRpb24sIG51bGwsIGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGxvY2F0aW9uID0gX3JlZjYubG9jYXRpb24sXG4gICAgICAgICAgbmF2aWdhdGUgPSBfcmVmNi5uYXZpZ2F0ZTtcblxuICAgICAgdmFyIHRvID0gcHJvcHMudG8sXG4gICAgICAgICAgc3RhdGUgPSBwcm9wcy5zdGF0ZSxcbiAgICAgICAgICByZXBsYWNlID0gcHJvcHMucmVwbGFjZSxcbiAgICAgICAgICBfcHJvcHMkZ2V0UHJvcHMgPSBwcm9wcy5nZXRQcm9wcyxcbiAgICAgICAgICBnZXRQcm9wcyA9IF9wcm9wcyRnZXRQcm9wcyA9PT0gdW5kZWZpbmVkID8gayA6IF9wcm9wcyRnZXRQcm9wcyxcbiAgICAgICAgICBhbmNob3JQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1widG9cIiwgXCJzdGF0ZVwiLCBcInJlcGxhY2VcIiwgXCJnZXRQcm9wc1wiXSk7XG5cbiAgICAgIHZhciBocmVmID0gcmVzb2x2ZSh0bywgYmFzZXVyaSk7XG4gICAgICB2YXIgZW5jb2RlZEhyZWYgPSBlbmNvZGVVUkkoaHJlZik7XG4gICAgICB2YXIgaXNDdXJyZW50ID0gbG9jYXRpb24ucGF0aG5hbWUgPT09IGVuY29kZWRIcmVmO1xuICAgICAgdmFyIGlzUGFydGlhbGx5Q3VycmVudCA9IHN0YXJ0c1dpdGgobG9jYXRpb24ucGF0aG5hbWUsIGVuY29kZWRIcmVmKTtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBfZXh0ZW5kcyh7XG4gICAgICAgIHJlZjogcmVmIHx8IGlubmVyUmVmLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBpc0N1cnJlbnQgPyBcInBhZ2VcIiA6IHVuZGVmaW5lZFxuICAgICAgfSwgYW5jaG9yUHJvcHMsIGdldFByb3BzKHtcbiAgICAgICAgaXNDdXJyZW50OiBpc0N1cnJlbnQsXG4gICAgICAgIGlzUGFydGlhbGx5Q3VycmVudDogaXNQYXJ0aWFsbHlDdXJyZW50LFxuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25cbiAgICAgIH0pLCB7XG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgICBpZiAoYW5jaG9yUHJvcHMub25DbGljaykgYW5jaG9yUHJvcHMub25DbGljayhldmVudCk7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkTmF2aWdhdGUoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIHNob3VsZFJlcGxhY2UgPSByZXBsYWNlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2UgIT09IFwiYm9vbGVhblwiICYmIGlzQ3VycmVudCkge1xuICAgICAgICAgICAgICB2YXIgX2xvY2F0aW9uJHN0YXRlID0gX2V4dGVuZHMoe30sIGxvY2F0aW9uLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGtleSA9IF9sb2NhdGlvbiRzdGF0ZS5rZXksXG4gICAgICAgICAgICAgICAgICByZXN0U3RhdGUgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX2xvY2F0aW9uJHN0YXRlLCBbXCJrZXlcIl0pO1xuXG4gICAgICAgICAgICAgIHNob3VsZFJlcGxhY2UgPSBzaGFsbG93Q29tcGFyZShfZXh0ZW5kcyh7fSwgc3RhdGUpLCByZXN0U3RhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZpZ2F0ZShocmVmLCB7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgcmVwbGFjZTogc2hvdWxkUmVwbGFjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5MaW5rLmRpc3BsYXlOYW1lID0gXCJMaW5rXCI7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB2b2lkIDAgOiB2b2lkIDA7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIFJlZGlyZWN0UmVxdWVzdCh1cmkpIHtcbiAgdGhpcy51cmkgPSB1cmk7XG59XG5cbnZhciBpc1JlZGlyZWN0ID0gZnVuY3Rpb24gaXNSZWRpcmVjdChvKSB7XG4gIHJldHVybiBvIGluc3RhbmNlb2YgUmVkaXJlY3RSZXF1ZXN0O1xufTtcblxudmFyIHJlZGlyZWN0VG8gPSBmdW5jdGlvbiByZWRpcmVjdFRvKHRvKSB7XG4gIHRocm93IG5ldyBSZWRpcmVjdFJlcXVlc3QodG8pO1xufTtcblxudmFyIFJlZGlyZWN0SW1wbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mykge1xuICBfaW5oZXJpdHMoUmVkaXJlY3RJbXBsLCBfUmVhY3QkQ29tcG9uZW50Myk7XG5cbiAgZnVuY3Rpb24gUmVkaXJlY3RJbXBsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWRpcmVjdEltcGwpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9IC8vIFN1cHBvcnQgUmVhY3QgPCAxNiB3aXRoIHRoaXMgaG9va1xuXG5cbiAgUmVkaXJlY3RJbXBsLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbmF2aWdhdGUgPSBfcHJvcHMzLm5hdmlnYXRlLFxuICAgICAgICB0byA9IF9wcm9wczMudG8sXG4gICAgICAgIGZyb20gPSBfcHJvcHMzLmZyb20sXG4gICAgICAgIF9wcm9wczMkcmVwbGFjZSA9IF9wcm9wczMucmVwbGFjZSxcbiAgICAgICAgcmVwbGFjZSA9IF9wcm9wczMkcmVwbGFjZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9wcm9wczMkcmVwbGFjZSxcbiAgICAgICAgc3RhdGUgPSBfcHJvcHMzLnN0YXRlLFxuICAgICAgICBub1Rocm93ID0gX3Byb3BzMy5ub1Rocm93LFxuICAgICAgICBiYXNldXJpID0gX3Byb3BzMy5iYXNldXJpLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMzLCBbXCJuYXZpZ2F0ZVwiLCBcInRvXCIsIFwiZnJvbVwiLCBcInJlcGxhY2VcIiwgXCJzdGF0ZVwiLCBcIm5vVGhyb3dcIiwgXCJiYXNldXJpXCJdKTtcblxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlKHRvLCBiYXNldXJpKTtcbiAgICAgIG5hdmlnYXRlKGluc2VydFBhcmFtcyhyZXNvbHZlZFRvLCBwcm9wcyksIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBSZWRpcmVjdEltcGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIG5hdmlnYXRlID0gX3Byb3BzNC5uYXZpZ2F0ZSxcbiAgICAgICAgdG8gPSBfcHJvcHM0LnRvLFxuICAgICAgICBmcm9tID0gX3Byb3BzNC5mcm9tLFxuICAgICAgICByZXBsYWNlID0gX3Byb3BzNC5yZXBsYWNlLFxuICAgICAgICBzdGF0ZSA9IF9wcm9wczQuc3RhdGUsXG4gICAgICAgIG5vVGhyb3cgPSBfcHJvcHM0Lm5vVGhyb3csXG4gICAgICAgIGJhc2V1cmkgPSBfcHJvcHM0LmJhc2V1cmksXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wczQsIFtcIm5hdmlnYXRlXCIsIFwidG9cIiwgXCJmcm9tXCIsIFwicmVwbGFjZVwiLCBcInN0YXRlXCIsIFwibm9UaHJvd1wiLCBcImJhc2V1cmlcIl0pO1xuXG4gICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlKHRvLCBiYXNldXJpKTtcbiAgICBpZiAoIW5vVGhyb3cpIHJlZGlyZWN0VG8oaW5zZXJ0UGFyYW1zKHJlc29sdmVkVG8sIHByb3BzKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlZGlyZWN0SW1wbDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFJlZGlyZWN0ID0gZnVuY3Rpb24gUmVkaXJlY3QocHJvcHMpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChfcmVmNykge1xuICAgIHZhciBiYXNldXJpID0gX3JlZjcuYmFzZXVyaTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhdGlvbiwgbnVsbCwgZnVuY3Rpb24gKGxvY2F0aW9uQ29udGV4dCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVkaXJlY3RJbXBsLCBfZXh0ZW5kcyh7fSwgbG9jYXRpb25Db250ZXh0LCB7XG4gICAgICAgIGJhc2V1cmk6IGJhc2V1cmlcbiAgICAgIH0sIHByb3BzKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gdm9pZCAwIDogdm9pZCAwOyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgTWF0Y2ggPSBmdW5jdGlvbiBNYXRjaChfcmVmOCkge1xuICB2YXIgcGF0aCA9IF9yZWY4LnBhdGgsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWY5KSB7XG4gICAgdmFyIGJhc2V1cmkgPSBfcmVmOS5iYXNldXJpO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2F0aW9uLCBudWxsLCBmdW5jdGlvbiAoX3JlZjEwKSB7XG4gICAgICB2YXIgbmF2aWdhdGUgPSBfcmVmMTAubmF2aWdhdGUsXG4gICAgICAgICAgbG9jYXRpb24gPSBfcmVmMTAubG9jYXRpb247XG4gICAgICB2YXIgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShwYXRoLCBiYXNldXJpKTtcbiAgICAgIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbih7XG4gICAgICAgIG5hdmlnYXRlOiBuYXZpZ2F0ZSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBtYXRjaDogcmVzdWx0ID8gX2V4dGVuZHMoe30sIHJlc3VsdC5wYXJhbXMsIHtcbiAgICAgICAgICB1cmk6IHJlc3VsdC51cmksXG4gICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9KSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBIb29rc1xuXG5cbnZhciB1c2VMb2NhdGlvbiA9IGZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VMb2NhdGlvbiBob29rIHdhcyB1c2VkIGJ1dCBhIExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciB3YXMgbm90IGZvdW5kIGluIHRoZSBwYXJlbnQgdHJlZS4gTWFrZSBzdXJlIHRoaXMgaXMgdXNlZCBpbiBhIGNvbXBvbmVudCB0aGF0IGlzIGEgY2hpbGQgb2YgUm91dGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQubG9jYXRpb247XG59O1xuXG52YXIgdXNlTmF2aWdhdGUgPSBmdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KEJhc2VDb250ZXh0KTtcblxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VOYXZpZ2F0ZSBob29rIHdhcyB1c2VkIGJ1dCBhIEJhc2VDb250ZXh0LlByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdGhlIHBhcmVudCB0cmVlLiBNYWtlIHN1cmUgdGhpcyBpcyB1c2VkIGluIGEgY29tcG9uZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBSb3V0ZXJcIik7XG4gIH1cblxuICByZXR1cm4gY29udGV4dC5uYXZpZ2F0ZTtcbn07XG5cbnZhciB1c2VQYXJhbXMgPSBmdW5jdGlvbiB1c2VQYXJhbXMoKSB7XG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChCYXNlQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUGFyYW1zIGhvb2sgd2FzIHVzZWQgYnV0IGEgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdGhlIHBhcmVudCB0cmVlLiBNYWtlIHN1cmUgdGhpcyBpcyB1c2VkIGluIGEgY29tcG9uZW50IHRoYXQgaXMgYSBjaGlsZCBvZiBSb3V0ZXJcIik7XG4gIH1cblxuICB2YXIgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICB2YXIgcmVzdWx0cyA9IG1hdGNoKGNvbnRleHQuYmFzZXBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgcmV0dXJuIHJlc3VsdHMgPyByZXN1bHRzLnBhcmFtcyA6IG51bGw7XG59O1xuXG52YXIgdXNlTWF0Y2ggPSBmdW5jdGlvbiB1c2VNYXRjaChwYXRoKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1hdGNoKHBhdGg6IHN0cmluZykgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgYSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFwiKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChCYXNlQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlTWF0Y2ggaG9vayB3YXMgdXNlZCBidXQgYSBMb2NhdGlvbkNvbnRleHQuUHJvdmlkZXIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFyZW50IHRyZWUuIE1ha2Ugc3VyZSB0aGlzIGlzIHVzZWQgaW4gYSBjb21wb25lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIFJvdXRlclwiKTtcbiAgfVxuXG4gIHZhciBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIHZhciByZXNvbHZlZFBhdGggPSByZXNvbHZlKHBhdGgsIGNvbnRleHQuYmFzZXVyaSk7XG4gIHZhciByZXN1bHQgPSBtYXRjaChyZXNvbHZlZFBhdGgsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgcmV0dXJuIHJlc3VsdCA/IF9leHRlbmRzKHt9LCByZXN1bHQucGFyYW1zLCB7XG4gICAgdXJpOiByZXN1bHQudXJpLFxuICAgIHBhdGg6IHBhdGhcbiAgfSkgOiBudWxsO1xufTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEp1bmtcblxuXG52YXIgc3RyaXBTbGFzaGVzID0gZnVuY3Rpb24gc3RyaXBTbGFzaGVzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyheXFwvK3xcXC8rJCkvZywgXCJcIik7XG59O1xuXG52YXIgY3JlYXRlUm91dGUgPSBmdW5jdGlvbiBjcmVhdGVSb3V0ZShiYXNlcGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJlYWN0LkZyYWdtZW50ICYmIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBSZWFjdC5DaGlsZHJlbi5tYXAoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgY3JlYXRlUm91dGUoYmFzZXBhdGgpKTtcbiAgICB9XG5cbiAgICAhKGVsZW1lbnQucHJvcHMucGF0aCB8fCBlbGVtZW50LnByb3BzLmRlZmF1bHQgfHwgZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJvdXRlcj46IENoaWxkcmVuIG9mIDxSb3V0ZXI+IG11c3QgaGF2ZSBhIGBwYXRoYCBvciBgZGVmYXVsdGAgcHJvcCwgb3IgYmUgYSBgPFJlZGlyZWN0PmAuIE5vbmUgZm91bmQgb24gZWxlbWVudCB0eXBlIGBcIiArIGVsZW1lbnQudHlwZSArIFwiYFwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgISEoZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCAmJiAoIWVsZW1lbnQucHJvcHMuZnJvbSB8fCAhZWxlbWVudC5wcm9wcy50bykpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIjxSZWRpcmVjdCBmcm9tPVxcXCJcIiArIGVsZW1lbnQucHJvcHMuZnJvbSArIFwiXFxcIiB0bz1cXFwiXCIgKyBlbGVtZW50LnByb3BzLnRvICsgXCJcXFwiLz4gcmVxdWlyZXMgYm90aCBcXFwiZnJvbVxcXCIgYW5kIFxcXCJ0b1xcXCIgcHJvcHMgd2hlbiBpbnNpZGUgYSA8Um91dGVyPi5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICEhKGVsZW1lbnQudHlwZSA9PT0gUmVkaXJlY3QgJiYgIXZhbGlkYXRlUmVkaXJlY3QoZWxlbWVudC5wcm9wcy5mcm9tLCBlbGVtZW50LnByb3BzLnRvKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiPFJlZGlyZWN0IGZyb209XFxcIlwiICsgZWxlbWVudC5wcm9wcy5mcm9tICsgXCIgdG89XFxcIlwiICsgZWxlbWVudC5wcm9wcy50byArIFwiXFxcIi8+IGhhcyBtaXNtYXRjaGVkIGR5bmFtaWMgc2VnbWVudHMsIGVuc3VyZSBib3RoIHBhdGhzIGhhdmUgdGhlIGV4YWN0IHNhbWUgZHluYW1pYyBzZWdtZW50cy5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICAgaWYgKGVsZW1lbnQucHJvcHMuZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRQYXRoID0gZWxlbWVudC50eXBlID09PSBSZWRpcmVjdCA/IGVsZW1lbnQucHJvcHMuZnJvbSA6IGVsZW1lbnQucHJvcHMucGF0aDtcbiAgICB2YXIgcGF0aCA9IGVsZW1lbnRQYXRoID09PSBcIi9cIiA/IGJhc2VwYXRoIDogc3RyaXBTbGFzaGVzKGJhc2VwYXRoKSArIFwiL1wiICsgc3RyaXBTbGFzaGVzKGVsZW1lbnRQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICBkZWZhdWx0OiBlbGVtZW50LnByb3BzLmRlZmF1bHQsXG4gICAgICBwYXRoOiBlbGVtZW50LnByb3BzLmNoaWxkcmVuID8gc3RyaXBTbGFzaGVzKHBhdGgpICsgXCIvKlwiIDogcGF0aFxuICAgIH07XG4gIH07XG59O1xuXG52YXIgc2hvdWxkTmF2aWdhdGUgPSBmdW5jdGlvbiBzaG91bGROYXZpZ2F0ZShldmVudCkge1xuICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmICEoZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG5leHBvcnQgeyAgTGluaywgTG9jYXRpb24sIExvY2F0aW9uUHJvdmlkZXIsIE1hdGNoLCBSZWRpcmVjdCwgUm91dGVyLCBTZXJ2ZXJMb2NhdGlvbiwgY3JlYXRlSGlzdG9yeSwgY3JlYXRlTWVtb3J5U291cmNlLCBpc1JlZGlyZWN0LCBuYXZpZ2F0ZSwgcmVkaXJlY3RUbywgZ2xvYmFsSGlzdG9yeSwgbWF0Y2ggYXMgbWF0Y2hQYXRoLCB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUsIHVzZVBhcmFtcywgdXNlTWF0Y2ggLCBCYXNlQ29udGV4dCB9OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9499\n')},1143:function(module){"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {}\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9pbnZhcmlhbnQvYnJvd3Nlci5qcz80MGI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBcUMsRUFBRSxFQUkxQzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5QkFBeUIsRUFBRTtBQUNyRTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxMTQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1143\n")}},function(n){"use strict";n.O(0,[532,774,349],(function(){return I=2871,n(n.s=I);var I}));n.O()}]); \ No newline at end of file diff --git a/803-0bf34ac/cejst/index.html b/803-0bf34ac/cejst/index.html new file mode 100644 index 00000000..934894fe --- /dev/null +++ b/803-0bf34ac/cejst/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/chunk-map.json b/803-0bf34ac/chunk-map.json new file mode 100644 index 00000000..b422b1d6 --- /dev/null +++ b/803-0bf34ac/chunk-map.json @@ -0,0 +1 @@ +{"polyfill":["/polyfill-6ed6bf3e44ff10cfb669.js"],"app":["/app-174f0e3664b4ba1c5eea.js"],"component---src-pages-404-tsx":["/component---src-pages-404-tsx-72a295bef8763296f309.js"],"component---src-pages-cejst-tsx":["/component---src-pages-cejst-tsx-94f624af453524017476.js"],"component---src-pages-contact-tsx":["/component---src-pages-contact-tsx-7f940e0ac0afa9fe32d0.js"],"component---src-pages-index-tsx":["/component---src-pages-index-tsx-d55ad365a816e2b3c6fc.js"],"component---src-pages-methodology-tsx":["/component---src-pages-methodology-tsx-4a1498992efe94aa545e.js"]} \ No newline at end of file diff --git a/803-0bf34ac/commons-9eacb4ad8514df39f59c.js b/803-0bf34ac/commons-9eacb4ad8514df39f59c.js new file mode 100644 index 00000000..126b1a2e --- /dev/null +++ b/803-0bf34ac/commons-9eacb4ad8514df39f59c.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[351],{2858:function(module){eval("function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzP2MxMzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMjg1OC5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2858\n")},9713:function(module){eval("function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzPzk1MjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6Ijk3MTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9713\n")},862:function(module,__unused_webpack_exports,__webpack_require__){eval('var _typeof = __webpack_require__(8).default;\n\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== "function") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\n\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n\n if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {\n return {\n "default": obj\n };\n }\n\n var cache = _getRequireWildcardCache(nodeInterop);\n\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n\n newObj["default"] = obj;\n\n if (cache) {\n cache.set(obj, newObj);\n }\n\n return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmQuanM/ZGJjZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUFtRDs7QUFFakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiI4NjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKVtcImRlZmF1bHRcIl07XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkge1xuICBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gIHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgICByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7XG4gIH0pKG5vZGVJbnRlcm9wKTtcbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkge1xuICBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJkZWZhdWx0XCI6IG9ialxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuXG4gIGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgfVxuXG4gIHZhciBuZXdPYmogPSB7fTtcbiAgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDtcblxuICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqO1xuXG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7XG4gIH1cblxuICByZXR1cm4gbmV3T2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///862\n')},3884:function(module){eval('function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzPzliNDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBeUIsbUJBQW1CLHlCQUF5QiIsImZpbGUiOiIzODg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3884\n')},521:function(module){eval('function _nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableRest;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcz9jMjQwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjUyMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///521\n')},3038:function(module,__unused_webpack_exports,__webpack_require__){eval("var arrayWithHoles = __webpack_require__(2858);\n\nvar iterableToArrayLimit = __webpack_require__(3884);\n\nvar unsupportedIterableToArray = __webpack_require__(379);\n\nvar nonIterableRest = __webpack_require__(521);\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanM/Mjc4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFbEQsMkJBQTJCLG1CQUFPLENBQUMsSUFBMkI7O0FBRTlELGlDQUFpQyxtQkFBTyxDQUFDLEdBQWlDOztBQUUxRSxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFzQjs7QUFFcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXlCLG1CQUFtQix5QkFBeUIiLCJmaWxlIjoiMzAzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3038\n")},8:function(module){eval('function _typeof(obj) {\n "@babel/helpers - typeof";\n\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n\n module.exports.default = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports.default = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcz83MDM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxzQkFBeUIsbUJBQW1CLHlCQUF5QjtBQUN6RSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLElBQUksc0JBQXlCLG1CQUFtQix5QkFBeUI7QUFDekU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUF5QixtQkFBbUIseUJBQXlCIiwiZmlsZSI6IjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG5cbiAgICBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG5cbiAgICBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n')},7091:function(module){"use strict";eval("\n\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n try {\n // Try to decode the entire string first\n return decodeURIComponent(components.join(''));\n } catch (err) {// Do nothing\n }\n\n if (components.length === 1) {\n return components;\n }\n\n split = split || 1; // Split the array in 2 parts\n\n var left = components.slice(0, split);\n var right = components.slice(split);\n return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n try {\n return decodeURIComponent(input);\n } catch (err) {\n var tokens = input.match(singleMatcher);\n\n for (var i = 1; i < tokens.length; i++) {\n input = decodeComponents(tokens, i).join('');\n tokens = input.match(singleMatcher);\n }\n\n return input;\n }\n}\n\nfunction customDecodeURIComponent(input) {\n // Keep track of all the replacements and prefill the map with the `BOM`\n var replaceMap = {\n '%FE%FF': \"\\uFFFD\\uFFFD\",\n '%FF%FE': \"\\uFFFD\\uFFFD\"\n };\n var match = multiMatcher.exec(input);\n\n while (match) {\n try {\n // Decode as big chunks as possible\n replaceMap[match[0]] = decodeURIComponent(match[0]);\n } catch (err) {\n var result = decode(match[0]);\n\n if (result !== match[0]) {\n replaceMap[match[0]] = result;\n }\n }\n\n match = multiMatcher.exec(input);\n } // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\n\n replaceMap['%C2'] = \"\\uFFFD\";\n var entries = Object.keys(replaceMap);\n\n for (var i = 0; i < entries.length; i++) {\n // Replace all decoded components\n var key = entries[i];\n input = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n }\n\n return input;\n}\n\nmodule.exports = function (encodedURI) {\n if (typeof encodedURI !== 'string') {\n throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n }\n\n try {\n encodedURI = encodedURI.replace(/\\+/g, ' '); // Try the built in decoder first\n\n return decodeURIComponent(encodedURI);\n } catch (err) {\n // Fallback to a more advanced decoder\n return customDecodeURIComponent(encodedURI);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9kZWNvZGUtdXJpLWNvbXBvbmVudC9pbmRleC5qcz8yYWYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGNBQWM7QUFDakI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUEsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI3MDkxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9rZW4gPSAnJVthLWYwLTldezJ9JztcbnZhciBzaW5nbGVNYXRjaGVyID0gbmV3IFJlZ0V4cCh0b2tlbiwgJ2dpJyk7XG52YXIgbXVsdGlNYXRjaGVyID0gbmV3IFJlZ0V4cCgnKCcgKyB0b2tlbiArICcpKycsICdnaScpO1xuXG5mdW5jdGlvbiBkZWNvZGVDb21wb25lbnRzKGNvbXBvbmVudHMsIHNwbGl0KSB7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGRlY29kZSB0aGUgZW50aXJlIHN0cmluZyBmaXJzdFxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29tcG9uZW50cy5qb2luKCcnKSk7XG4gIH0gY2F0Y2ggKGVycikgey8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9XG5cbiAgc3BsaXQgPSBzcGxpdCB8fCAxOyAvLyBTcGxpdCB0aGUgYXJyYXkgaW4gMiBwYXJ0c1xuXG4gIHZhciBsZWZ0ID0gY29tcG9uZW50cy5zbGljZSgwLCBzcGxpdCk7XG4gIHZhciByaWdodCA9IGNvbXBvbmVudHMuc2xpY2Uoc3BsaXQpO1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5jYWxsKFtdLCBkZWNvZGVDb21wb25lbnRzKGxlZnQpLCBkZWNvZGVDb21wb25lbnRzKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB2YXIgdG9rZW5zID0gaW5wdXQubWF0Y2goc2luZ2xlTWF0Y2hlcik7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgaW5wdXQgPSBkZWNvZGVDb21wb25lbnRzKHRva2VucywgaSkuam9pbignJyk7XG4gICAgICB0b2tlbnMgPSBpbnB1dC5tYXRjaChzaW5nbGVNYXRjaGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3VzdG9tRGVjb2RlVVJJQ29tcG9uZW50KGlucHV0KSB7XG4gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSByZXBsYWNlbWVudHMgYW5kIHByZWZpbGwgdGhlIG1hcCB3aXRoIHRoZSBgQk9NYFxuICB2YXIgcmVwbGFjZU1hcCA9IHtcbiAgICAnJUZFJUZGJzogXCJcXHVGRkZEXFx1RkZGRFwiLFxuICAgICclRkYlRkUnOiBcIlxcdUZGRkRcXHVGRkZEXCJcbiAgfTtcbiAgdmFyIG1hdGNoID0gbXVsdGlNYXRjaGVyLmV4ZWMoaW5wdXQpO1xuXG4gIHdoaWxlIChtYXRjaCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWNvZGUgYXMgYmlnIGNodW5rcyBhcyBwb3NzaWJsZVxuICAgICAgcmVwbGFjZU1hcFttYXRjaFswXV0gPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdmFyIHJlc3VsdCA9IGRlY29kZShtYXRjaFswXSk7XG5cbiAgICAgIGlmIChyZXN1bHQgIT09IG1hdGNoWzBdKSB7XG4gICAgICAgIHJlcGxhY2VNYXBbbWF0Y2hbMF1dID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIG1hdGNoID0gbXVsdGlNYXRjaGVyLmV4ZWMoaW5wdXQpO1xuICB9IC8vIEFkZCBgJUMyYCBhdCB0aGUgZW5kIG9mIHRoZSBtYXAgdG8gbWFrZSBzdXJlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIGNvbWJpbmF0b3IgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZVxuXG5cbiAgcmVwbGFjZU1hcFsnJUMyJ10gPSBcIlxcdUZGRkRcIjtcbiAgdmFyIGVudHJpZXMgPSBPYmplY3Qua2V5cyhyZXBsYWNlTWFwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBSZXBsYWNlIGFsbCBkZWNvZGVkIGNvbXBvbmVudHNcbiAgICB2YXIga2V5ID0gZW50cmllc1tpXTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UobmV3IFJlZ0V4cChrZXksICdnJyksIHJlcGxhY2VNYXBba2V5XSk7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGVuY29kZWRVUkkpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGVkVVJJICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBlbmNvZGVkVVJJYCB0byBiZSBvZiB0eXBlIGBzdHJpbmdgLCBnb3QgYCcgKyB0eXBlb2YgZW5jb2RlZFVSSSArICdgJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGVuY29kZWRVUkkgPSBlbmNvZGVkVVJJLnJlcGxhY2UoL1xcKy9nLCAnICcpOyAvLyBUcnkgdGhlIGJ1aWx0IGluIGRlY29kZXIgZmlyc3RcblxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIEZhbGxiYWNrIHRvIGEgbW9yZSBhZHZhbmNlZCBkZWNvZGVyXG4gICAgcmV0dXJuIGN1c3RvbURlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkVVJJKTtcbiAgfVxufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7091\n")},8616:function(module){"use strict";eval("\n\nmodule.exports = function (obj, predicate) {\n var ret = {};\n var keys = Object.keys(obj);\n var isArr = Array.isArray(predicate);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var val = obj[key];\n\n if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n ret[key] = val;\n }\n }\n\n return ret;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9maWx0ZXItb2JqL2luZGV4LmpzPzI5Y2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiODYxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJldCA9IHt9O1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIHZhciBpc0FyciA9IEFycmF5LmlzQXJyYXkocHJlZGljYXRlKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsID0gb2JqW2tleV07XG5cbiAgICBpZiAoaXNBcnIgPyBwcmVkaWNhdGUuaW5kZXhPZihrZXkpICE9PSAtMSA6IHByZWRpY2F0ZShrZXksIHZhbCwgb2JqKSkge1xuICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8616\n")},2203:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval("\n\nvar _defineProperty = __webpack_require__(9713);\n\nvar _slicedToArray = __webpack_require__(3038);\n\nvar _toConsumableArray = __webpack_require__(319);\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar strictUriEncode = __webpack_require__(8936);\n\nvar decodeComponent = __webpack_require__(7091);\n\nvar splitOnFirst = __webpack_require__(4734);\n\nvar filterObject = __webpack_require__(8616);\n\nvar isNullOrUndefined = function isNullOrUndefined(value) {\n return value === null || value === undefined;\n};\n\nvar encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n switch (options.arrayFormat) {\n case 'index':\n return function (key) {\n return function (result, value) {\n var index = result.length;\n\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', index, ']'].join('')]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')]);\n };\n };\n\n case 'bracket':\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]'].join('')]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]=', encode(value, options)].join('')]);\n };\n };\n\n case 'comma':\n case 'separator':\n case 'bracket-separator':\n {\n var keyValueSep = options.arrayFormat === 'bracket-separator' ? '[]=' : '=';\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n } // Translate null to an empty string so that it doesn't serialize as 'null'\n\n\n value = value === null ? '' : value;\n\n if (result.length === 0) {\n return [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n }\n\n return [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n };\n };\n }\n\n default:\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [].concat(_toConsumableArray(result), [encode(key, options)]);\n }\n\n return [].concat(_toConsumableArray(result), [[encode(key, options), '=', encode(value, options)].join('')]);\n };\n };\n }\n}\n\nfunction parserForArrayFormat(options) {\n var result;\n\n switch (options.arrayFormat) {\n case 'index':\n return function (key, value, accumulator) {\n result = /\\[(\\d*)\\]$/.exec(key);\n key = key.replace(/\\[\\d*\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = {};\n }\n\n accumulator[key][result[1]] = value;\n };\n\n case 'bracket':\n return function (key, value, accumulator) {\n result = /(\\[\\])$/.exec(key);\n key = key.replace(/\\[\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = [value];\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n\n case 'comma':\n case 'separator':\n return function (key, value, accumulator) {\n var isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n var isEncodedArray = typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator);\n value = isEncodedArray ? decode(value, options) : value;\n var newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(function (item) {\n return decode(item, options);\n }) : value === null ? value : decode(value, options);\n accumulator[key] = newValue;\n };\n\n case 'bracket-separator':\n return function (key, value, accumulator) {\n var isArray = /(\\[\\])$/.test(key);\n key = key.replace(/\\[\\]$/, '');\n\n if (!isArray) {\n accumulator[key] = value ? decode(value, options) : value;\n return;\n }\n\n var arrayValue = value === null ? [] : value.split(options.arrayFormatSeparator).map(function (item) {\n return decode(item, options);\n });\n\n if (accumulator[key] === undefined) {\n accumulator[key] = arrayValue;\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], arrayValue);\n };\n\n default:\n return function (key, value, accumulator) {\n if (accumulator[key] === undefined) {\n accumulator[key] = value;\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n }\n}\n\nfunction validateArrayFormatSeparator(value) {\n if (typeof value !== 'string' || value.length !== 1) {\n throw new TypeError('arrayFormatSeparator must be single character string');\n }\n}\n\nfunction encode(value, options) {\n if (options.encode) {\n return options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n }\n\n return value;\n}\n\nfunction decode(value, options) {\n if (options.decode) {\n return decodeComponent(value);\n }\n\n return value;\n}\n\nfunction keysSorter(input) {\n if (Array.isArray(input)) {\n return input.sort();\n }\n\n if (typeof input === 'object') {\n return keysSorter(Object.keys(input)).sort(function (a, b) {\n return Number(a) - Number(b);\n }).map(function (key) {\n return input[key];\n });\n }\n\n return input;\n}\n\nfunction removeHash(input) {\n var hashStart = input.indexOf('#');\n\n if (hashStart !== -1) {\n input = input.slice(0, hashStart);\n }\n\n return input;\n}\n\nfunction getHash(url) {\n var hash = '';\n var hashStart = url.indexOf('#');\n\n if (hashStart !== -1) {\n hash = url.slice(hashStart);\n }\n\n return hash;\n}\n\nfunction extract(input) {\n input = removeHash(input);\n var queryStart = input.indexOf('?');\n\n if (queryStart === -1) {\n return '';\n }\n\n return input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n if (options.parseNumbers && !Number.isNaN(Number(value)) && typeof value === 'string' && value.trim() !== '') {\n value = Number(value);\n } else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n value = value.toLowerCase() === 'true';\n }\n\n return value;\n}\n\nfunction parse(query, options) {\n options = Object.assign({\n decode: true,\n sort: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ',',\n parseNumbers: false,\n parseBooleans: false\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n var formatter = parserForArrayFormat(options); // Create an object with no prototype\n\n var ret = Object.create(null);\n\n if (typeof query !== 'string') {\n return ret;\n }\n\n query = query.trim().replace(/^[?#&]/, '');\n\n if (!query) {\n return ret;\n }\n\n var _iterator = _createForOfIteratorHelper(query.split('&')),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var param = _step.value;\n\n if (param === '') {\n continue;\n }\n\n var _splitOnFirst = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '='),\n _splitOnFirst2 = _slicedToArray(_splitOnFirst, 2),\n _key = _splitOnFirst2[0],\n _value = _splitOnFirst2[1]; // Missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\n\n _value = _value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? _value : decode(_value, options);\n formatter(decode(_key, options), _value, ret);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n for (var _i = 0, _Object$keys = Object.keys(ret); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n var value = ret[key];\n\n if (typeof value === 'object' && value !== null) {\n for (var _i2 = 0, _Object$keys2 = Object.keys(value); _i2 < _Object$keys2.length; _i2++) {\n var k = _Object$keys2[_i2];\n value[k] = parseValue(value[k], options);\n }\n } else {\n ret[key] = parseValue(value, options);\n }\n }\n\n if (options.sort === false) {\n return ret;\n }\n\n return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce(function (result, key) {\n var value = ret[key];\n\n if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n // Sort object keys, not values\n result[key] = keysSorter(value);\n } else {\n result[key] = value;\n }\n\n return result;\n }, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = function (object, options) {\n if (!object) {\n return '';\n }\n\n options = Object.assign({\n encode: true,\n strict: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ','\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n\n var shouldFilter = function shouldFilter(key) {\n return options.skipNull && isNullOrUndefined(object[key]) || options.skipEmptyString && object[key] === '';\n };\n\n var formatter = encoderForArrayFormat(options);\n var objectCopy = {};\n\n for (var _i3 = 0, _Object$keys3 = Object.keys(object); _i3 < _Object$keys3.length; _i3++) {\n var key = _Object$keys3[_i3];\n\n if (!shouldFilter(key)) {\n objectCopy[key] = object[key];\n }\n }\n\n var keys = Object.keys(objectCopy);\n\n if (options.sort !== false) {\n keys.sort(options.sort);\n }\n\n return keys.map(function (key) {\n var value = object[key];\n\n if (value === undefined) {\n return '';\n }\n\n if (value === null) {\n return encode(key, options);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n return encode(key, options) + '[]';\n }\n\n return value.reduce(formatter(key), []).join('&');\n }\n\n return encode(key, options) + '=' + encode(value, options);\n }).filter(function (x) {\n return x.length > 0;\n }).join('&');\n};\n\nexports.parseUrl = function (url, options) {\n options = Object.assign({\n decode: true\n }, options);\n\n var _splitOnFirst3 = splitOnFirst(url, '#'),\n _splitOnFirst4 = _slicedToArray(_splitOnFirst3, 2),\n url_ = _splitOnFirst4[0],\n hash = _splitOnFirst4[1];\n\n return Object.assign({\n url: url_.split('?')[0] || '',\n query: parse(extract(url), options)\n }, options && options.parseFragmentIdentifier && hash ? {\n fragmentIdentifier: decode(hash, options)\n } : {});\n};\n\nexports.stringifyUrl = function (object, options) {\n options = Object.assign(_defineProperty({\n encode: true,\n strict: true\n }, encodeFragmentIdentifier, true), options);\n var url = removeHash(object.url).split('?')[0] || '';\n var queryFromUrl = exports.extract(object.url);\n var parsedQueryFromUrl = exports.parse(queryFromUrl, {\n sort: false\n });\n var query = Object.assign(parsedQueryFromUrl, object.query);\n var queryString = exports.stringify(query, options);\n\n if (queryString) {\n queryString = \"?\".concat(queryString);\n }\n\n var hash = getHash(object.url);\n\n if (object.fragmentIdentifier) {\n hash = \"#\".concat(options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier);\n }\n\n return \"\".concat(url).concat(queryString).concat(hash);\n};\n\nexports.pick = function (input, filter, options) {\n options = Object.assign(_defineProperty({\n parseFragmentIdentifier: true\n }, encodeFragmentIdentifier, false), options);\n\n var _exports$parseUrl = exports.parseUrl(input, options),\n url = _exports$parseUrl.url,\n query = _exports$parseUrl.query,\n fragmentIdentifier = _exports$parseUrl.fragmentIdentifier;\n\n return exports.stringifyUrl({\n url: url,\n query: filterObject(query, filter),\n fragmentIdentifier: fragmentIdentifier\n }, options);\n};\n\nexports.exclude = function (input, filter, options) {\n var exclusionFilter = Array.isArray(filter) ? function (key) {\n return !filter.includes(key);\n } : function (key, value) {\n return !filter(key, value);\n };\n return exports.pick(input, exclusionFilter, options);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9xdWVyeS1zdHJpbmcvaW5kZXguanM/MDIxMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixzQkFBc0IsbUJBQU8sQ0FBQyxJQUEyRzs7QUFFekkscUJBQXFCLG1CQUFPLENBQUMsSUFBMEc7O0FBRXZJLHlCQUF5QixtQkFBTyxDQUFDLEdBQThHOztBQUUvSSx3REFBd0QsaUZBQWlGLFdBQVcsd0hBQXdILGdCQUFnQixXQUFXLHlCQUF5QixTQUFTLHdCQUF3Qiw0QkFBNEIsY0FBYyxTQUFTLDhCQUE4QixFQUFFLHFCQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLDhKQUE4SixFQUFFLGtEQUFrRCxTQUFTLGtCQUFrQixpQkFBaUIsRUFBRSxtQkFBbUIsc0JBQXNCLDhCQUE4QixhQUFhLEVBQUUsc0JBQXNCLGVBQWUsV0FBVyxFQUFFLG1CQUFtQixNQUFNLHlEQUF5RCxFQUFFLFVBQVUsdUJBQXVCLEVBQUUsRUFBRSxHQUFHOztBQUVwK0IsaURBQWlELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Qsa0hBQWtIOztBQUU5WixzQ0FBc0MsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sa0JBQWtCLEVBQUUsYUFBYTs7QUFFckwsc0JBQXNCLG1CQUFPLENBQUMsSUFBbUI7O0FBRWpELHNCQUFzQixtQkFBTyxDQUFDLElBQXNCOztBQUVwRCxtQkFBbUIsbUJBQU8sQ0FBQyxJQUFnQjs7QUFFM0MsbUJBQW1CLG1CQUFPLENBQUMsSUFBWTs7QUFFdkM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG1EQUFtRCwwQkFBMEI7QUFDN0U7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRCw0QkFBNEI7QUFDdkY7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxlQUFlO0FBQ2YsYUFBYTs7QUFFYixpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0RBQXdELDRCQUE0QjtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUcsS0FBSztBQUNSOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjIyMDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7XG5cbnZhciBfdG9Db25zdW1hYmxlQXJyYXkgPSByZXF1aXJlKFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBzdHJpY3RVcmlFbmNvZGUgPSByZXF1aXJlKCdzdHJpY3QtdXJpLWVuY29kZScpO1xuXG52YXIgZGVjb2RlQ29tcG9uZW50ID0gcmVxdWlyZSgnZGVjb2RlLXVyaS1jb21wb25lbnQnKTtcblxudmFyIHNwbGl0T25GaXJzdCA9IHJlcXVpcmUoJ3NwbGl0LW9uLWZpcnN0Jyk7XG5cbnZhciBmaWx0ZXJPYmplY3QgPSByZXF1aXJlKCdmaWx0ZXItb2JqJyk7XG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufTtcblxudmFyIGVuY29kZUZyYWdtZW50SWRlbnRpZmllciA9IFN5bWJvbCgnZW5jb2RlRnJhZ21lbnRJZGVudGlmaWVyJyk7XG5cbmZ1bmN0aW9uIGVuY29kZXJGb3JBcnJheUZvcm1hdChvcHRpb25zKSB7XG4gIHN3aXRjaCAob3B0aW9ucy5hcnJheUZvcm1hdCkge1xuICAgIGNhc2UgJ2luZGV4JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVzdWx0LCB2YWx1ZSkge1xuICAgICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICdbJywgaW5kZXgsICddJ10uam9pbignJyldKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyZXN1bHQpLCBbW2VuY29kZShrZXksIG9wdGlvbnMpLCAnWycsIGVuY29kZShpbmRleCwgb3B0aW9ucyksICddPScsIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyldLmpvaW4oJycpXSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgY2FzZSAnYnJhY2tldCc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICdbXSddLmpvaW4oJycpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzdWx0KSwgW1tlbmNvZGUoa2V5LCBvcHRpb25zKSwgJ1tdPScsIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyldLmpvaW4oJycpXSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgY2FzZSAnY29tbWEnOlxuICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgY2FzZSAnYnJhY2tldC1zZXBhcmF0b3InOlxuICAgICAge1xuICAgICAgICB2YXIga2V5VmFsdWVTZXAgPSBvcHRpb25zLmFycmF5Rm9ybWF0ID09PSAnYnJhY2tldC1zZXBhcmF0b3InID8gJ1tdPScgOiAnPSc7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXN1bHQsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSAvLyBUcmFuc2xhdGUgbnVsbCB0byBhbiBlbXB0eSBzdHJpbmcgc28gdGhhdCBpdCBkb2Vzbid0IHNlcmlhbGl6ZSBhcyAnbnVsbCdcblxuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gJycgOiB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksIGtleVZhbHVlU2VwLCBlbmNvZGUodmFsdWUsIG9wdGlvbnMpXS5qb2luKCcnKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbW3Jlc3VsdCwgZW5jb2RlKHZhbHVlLCBvcHRpb25zKV0uam9pbihvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKV07XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnNraXBOdWxsICYmIHZhbHVlID09PSBudWxsIHx8IG9wdGlvbnMuc2tpcEVtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtlbmNvZGUoa2V5LCBvcHRpb25zKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3VsdCksIFtbZW5jb2RlKGtleSwgb3B0aW9ucyksICc9JywgZW5jb2RlKHZhbHVlLCBvcHRpb25zKV0uam9pbignJyldKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuXG4gIHN3aXRjaCAob3B0aW9ucy5hcnJheUZvcm1hdCkge1xuICAgIGNhc2UgJ2luZGV4JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgcmVzdWx0ID0gL1xcWyhcXGQqKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcW1xcZCpcXF0kLywgJycpO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvcltrZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1bXVsYXRvcltrZXldW3Jlc3VsdFsxXV0gPSB2YWx1ZTtcbiAgICAgIH07XG5cbiAgICBjYXNlICdicmFja2V0JzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgcmVzdWx0ID0gLyhcXFtcXF0pJC8uZXhlYyhrZXkpO1xuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxdJC8sICcnKTtcblxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFt2YWx1ZV07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCB2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgY2FzZSAnY29tbWEnOlxuICAgIGNhc2UgJ3NlcGFyYXRvcic6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICAgIHZhciBpc0FycmF5ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5pbmNsdWRlcyhvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKTtcbiAgICAgICAgdmFyIGlzRW5jb2RlZEFycmF5ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNBcnJheSAmJiBkZWNvZGUodmFsdWUsIG9wdGlvbnMpLmluY2x1ZGVzKG9wdGlvbnMuYXJyYXlGb3JtYXRTZXBhcmF0b3IpO1xuICAgICAgICB2YWx1ZSA9IGlzRW5jb2RlZEFycmF5ID8gZGVjb2RlKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBpc0FycmF5IHx8IGlzRW5jb2RlZEFycmF5ID8gdmFsdWUuc3BsaXQob3B0aW9ucy5hcnJheUZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZShpdGVtLCBvcHRpb25zKTtcbiAgICAgICAgfSkgOiB2YWx1ZSA9PT0gbnVsbCA/IHZhbHVlIDogZGVjb2RlKHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgfTtcblxuICAgIGNhc2UgJ2JyYWNrZXQtc2VwYXJhdG9yJzpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgICAgdmFyIGlzQXJyYXkgPSAvKFxcW1xcXSkkLy50ZXN0KGtleSk7XG4gICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG4gICAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZSA/IGRlY29kZSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJyYXlWYWx1ZSA9IHZhbHVlID09PSBudWxsID8gW10gOiB2YWx1ZS5zcGxpdChvcHRpb25zLmFycmF5Rm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlKGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IGFycmF5VmFsdWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCBhcnJheVZhbHVlKTtcbiAgICAgIH07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgICBpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5Rm9ybWF0U2VwYXJhdG9yKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FycmF5Rm9ybWF0U2VwYXJhdG9yIG11c3QgYmUgc2luZ2xlIGNoYXJhY3RlciBzdHJpbmcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZW5jb2RlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGRlY29kZSh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5kZWNvZGUpIHtcbiAgICByZXR1cm4gZGVjb2RlQ29tcG9uZW50KHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24ga2V5c1NvcnRlcihpbnB1dCkge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQuc29ydCgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ga2V5c1NvcnRlcihPYmplY3Qua2V5cyhpbnB1dCkpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBOdW1iZXIoYSkgLSBOdW1iZXIoYik7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBpbnB1dFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGlucHV0O1xufVxuXG5mdW5jdGlvbiByZW1vdmVIYXNoKGlucHV0KSB7XG4gIHZhciBoYXNoU3RhcnQgPSBpbnB1dC5pbmRleE9mKCcjJyk7XG5cbiAgaWYgKGhhc2hTdGFydCAhPT0gLTEpIHtcbiAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDAsIGhhc2hTdGFydCk7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbmZ1bmN0aW9uIGdldEhhc2godXJsKSB7XG4gIHZhciBoYXNoID0gJyc7XG4gIHZhciBoYXNoU3RhcnQgPSB1cmwuaW5kZXhPZignIycpO1xuXG4gIGlmIChoYXNoU3RhcnQgIT09IC0xKSB7XG4gICAgaGFzaCA9IHVybC5zbGljZShoYXNoU3RhcnQpO1xuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3QoaW5wdXQpIHtcbiAgaW5wdXQgPSByZW1vdmVIYXNoKGlucHV0KTtcbiAgdmFyIHF1ZXJ5U3RhcnQgPSBpbnB1dC5pbmRleE9mKCc/Jyk7XG5cbiAgaWYgKHF1ZXJ5U3RhcnQgPT09IC0xKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGlucHV0LnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5wYXJzZU51bWJlcnMgJiYgIU51bWJlci5pc05hTihOdW1iZXIodmFsdWUpKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJzZUJvb2xlYW5zICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2UocXVlcnksIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGRlY29kZTogdHJ1ZSxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGFycmF5Rm9ybWF0OiAnbm9uZScsXG4gICAgYXJyYXlGb3JtYXRTZXBhcmF0b3I6ICcsJyxcbiAgICBwYXJzZU51bWJlcnM6IGZhbHNlLFxuICAgIHBhcnNlQm9vbGVhbnM6IGZhbHNlXG4gIH0sIG9wdGlvbnMpO1xuICB2YWxpZGF0ZUFycmF5Rm9ybWF0U2VwYXJhdG9yKG9wdGlvbnMuYXJyYXlGb3JtYXRTZXBhcmF0b3IpO1xuICB2YXIgZm9ybWF0dGVyID0gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0aW9ucyk7IC8vIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGVcblxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBpZiAodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJyk7XG5cbiAgaWYgKCFxdWVyeSkge1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocXVlcnkuc3BsaXQoJyYnKSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgcGFyYW0gPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHBhcmFtID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9zcGxpdE9uRmlyc3QgPSBzcGxpdE9uRmlyc3Qob3B0aW9ucy5kZWNvZGUgPyBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKSA6IHBhcmFtLCAnPScpLFxuICAgICAgICAgIF9zcGxpdE9uRmlyc3QyID0gX3NsaWNlZFRvQXJyYXkoX3NwbGl0T25GaXJzdCwgMiksXG4gICAgICAgICAgX2tleSA9IF9zcGxpdE9uRmlyc3QyWzBdLFxuICAgICAgICAgIF92YWx1ZSA9IF9zcGxpdE9uRmlyc3QyWzFdOyAvLyBNaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuICAgICAgLy8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuXG5cbiAgICAgIF92YWx1ZSA9IF92YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFsnY29tbWEnLCAnc2VwYXJhdG9yJywgJ2JyYWNrZXQtc2VwYXJhdG9yJ10uaW5jbHVkZXMob3B0aW9ucy5hcnJheUZvcm1hdCkgPyBfdmFsdWUgOiBkZWNvZGUoX3ZhbHVlLCBvcHRpb25zKTtcbiAgICAgIGZvcm1hdHRlcihkZWNvZGUoX2tleSwgb3B0aW9ucyksIF92YWx1ZSwgcmV0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMCwgX09iamVjdCRrZXlzID0gT2JqZWN0LmtleXMocmV0KTsgX2kgPCBfT2JqZWN0JGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGtleSA9IF9PYmplY3Qka2V5c1tfaV07XG4gICAgdmFyIHZhbHVlID0gcmV0W2tleV07XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMCwgX09iamVjdCRrZXlzMiA9IE9iamVjdC5rZXlzKHZhbHVlKTsgX2kyIDwgX09iamVjdCRrZXlzMi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBrID0gX09iamVjdCRrZXlzMltfaTJdO1xuICAgICAgICB2YWx1ZVtrXSA9IHBhcnNlVmFsdWUodmFsdWVba10sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXRba2V5XSA9IHBhcnNlVmFsdWUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnNvcnQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHJldHVybiAob3B0aW9ucy5zb3J0ID09PSB0cnVlID8gT2JqZWN0LmtleXMocmV0KS5zb3J0KCkgOiBPYmplY3Qua2V5cyhyZXQpLnNvcnQob3B0aW9ucy5zb3J0KSkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHJldFtrZXldO1xuXG4gICAgaWYgKEJvb2xlYW4odmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBTb3J0IG9iamVjdCBrZXlzLCBub3QgdmFsdWVzXG4gICAgICByZXN1bHRba2V5XSA9IGtleXNTb3J0ZXIodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuXG5leHBvcnRzLmV4dHJhY3QgPSBleHRyYWN0O1xuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdGlvbnMpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBhcnJheUZvcm1hdDogJ25vbmUnLFxuICAgIGFycmF5Rm9ybWF0U2VwYXJhdG9yOiAnLCdcbiAgfSwgb3B0aW9ucyk7XG4gIHZhbGlkYXRlQXJyYXlGb3JtYXRTZXBhcmF0b3Iob3B0aW9ucy5hcnJheUZvcm1hdFNlcGFyYXRvcik7XG5cbiAgdmFyIHNob3VsZEZpbHRlciA9IGZ1bmN0aW9uIHNob3VsZEZpbHRlcihrZXkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5za2lwTnVsbCAmJiBpc051bGxPclVuZGVmaW5lZChvYmplY3Rba2V5XSkgfHwgb3B0aW9ucy5za2lwRW1wdHlTdHJpbmcgJiYgb2JqZWN0W2tleV0gPT09ICcnO1xuICB9O1xuXG4gIHZhciBmb3JtYXR0ZXIgPSBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0aW9ucyk7XG4gIHZhciBvYmplY3RDb3B5ID0ge307XG5cbiAgZm9yICh2YXIgX2kzID0gMCwgX09iamVjdCRrZXlzMyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IF9pMyA8IF9PYmplY3Qka2V5czMubGVuZ3RoOyBfaTMrKykge1xuICAgIHZhciBrZXkgPSBfT2JqZWN0JGtleXMzW19pM107XG5cbiAgICBpZiAoIXNob3VsZEZpbHRlcihrZXkpKSB7XG4gICAgICBvYmplY3RDb3B5W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdENvcHkpO1xuXG4gIGlmIChvcHRpb25zLnNvcnQgIT09IGZhbHNlKSB7XG4gICAga2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICByZXR1cm4ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGUoa2V5LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDAgJiYgb3B0aW9ucy5hcnJheUZvcm1hdCA9PT0gJ2JyYWNrZXQtc2VwYXJhdG9yJykge1xuICAgICAgICByZXR1cm4gZW5jb2RlKGtleSwgb3B0aW9ucykgKyAnW10nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUucmVkdWNlKGZvcm1hdHRlcihrZXkpLCBbXSkuam9pbignJicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNvZGUoa2V5LCBvcHRpb25zKSArICc9JyArIGVuY29kZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB4Lmxlbmd0aCA+IDA7XG4gIH0pLmpvaW4oJyYnKTtcbn07XG5cbmV4cG9ydHMucGFyc2VVcmwgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBkZWNvZGU6IHRydWVcbiAgfSwgb3B0aW9ucyk7XG5cbiAgdmFyIF9zcGxpdE9uRmlyc3QzID0gc3BsaXRPbkZpcnN0KHVybCwgJyMnKSxcbiAgICAgIF9zcGxpdE9uRmlyc3Q0ID0gX3NsaWNlZFRvQXJyYXkoX3NwbGl0T25GaXJzdDMsIDIpLFxuICAgICAgdXJsXyA9IF9zcGxpdE9uRmlyc3Q0WzBdLFxuICAgICAgaGFzaCA9IF9zcGxpdE9uRmlyc3Q0WzFdO1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB1cmw6IHVybF8uc3BsaXQoJz8nKVswXSB8fCAnJyxcbiAgICBxdWVyeTogcGFyc2UoZXh0cmFjdCh1cmwpLCBvcHRpb25zKVxuICB9LCBvcHRpb25zICYmIG9wdGlvbnMucGFyc2VGcmFnbWVudElkZW50aWZpZXIgJiYgaGFzaCA/IHtcbiAgICBmcmFnbWVudElkZW50aWZpZXI6IGRlY29kZShoYXNoLCBvcHRpb25zKVxuICB9IDoge30pO1xufTtcblxuZXhwb3J0cy5zdHJpbmdpZnlVcmwgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZVxuICB9LCBlbmNvZGVGcmFnbWVudElkZW50aWZpZXIsIHRydWUpLCBvcHRpb25zKTtcbiAgdmFyIHVybCA9IHJlbW92ZUhhc2gob2JqZWN0LnVybCkuc3BsaXQoJz8nKVswXSB8fCAnJztcbiAgdmFyIHF1ZXJ5RnJvbVVybCA9IGV4cG9ydHMuZXh0cmFjdChvYmplY3QudXJsKTtcbiAgdmFyIHBhcnNlZFF1ZXJ5RnJvbVVybCA9IGV4cG9ydHMucGFyc2UocXVlcnlGcm9tVXJsLCB7XG4gICAgc29ydDogZmFsc2VcbiAgfSk7XG4gIHZhciBxdWVyeSA9IE9iamVjdC5hc3NpZ24ocGFyc2VkUXVlcnlGcm9tVXJsLCBvYmplY3QucXVlcnkpO1xuICB2YXIgcXVlcnlTdHJpbmcgPSBleHBvcnRzLnN0cmluZ2lmeShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgaWYgKHF1ZXJ5U3RyaW5nKSB7XG4gICAgcXVlcnlTdHJpbmcgPSBcIj9cIi5jb25jYXQocXVlcnlTdHJpbmcpO1xuICB9XG5cbiAgdmFyIGhhc2ggPSBnZXRIYXNoKG9iamVjdC51cmwpO1xuXG4gIGlmIChvYmplY3QuZnJhZ21lbnRJZGVudGlmaWVyKSB7XG4gICAgaGFzaCA9IFwiI1wiLmNvbmNhdChvcHRpb25zW2VuY29kZUZyYWdtZW50SWRlbnRpZmllcl0gPyBlbmNvZGUob2JqZWN0LmZyYWdtZW50SWRlbnRpZmllciwgb3B0aW9ucykgOiBvYmplY3QuZnJhZ21lbnRJZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh1cmwpLmNvbmNhdChxdWVyeVN0cmluZykuY29uY2F0KGhhc2gpO1xufTtcblxuZXhwb3J0cy5waWNrID0gZnVuY3Rpb24gKGlucHV0LCBmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oX2RlZmluZVByb3BlcnR5KHtcbiAgICBwYXJzZUZyYWdtZW50SWRlbnRpZmllcjogdHJ1ZVxuICB9LCBlbmNvZGVGcmFnbWVudElkZW50aWZpZXIsIGZhbHNlKSwgb3B0aW9ucyk7XG5cbiAgdmFyIF9leHBvcnRzJHBhcnNlVXJsID0gZXhwb3J0cy5wYXJzZVVybChpbnB1dCwgb3B0aW9ucyksXG4gICAgICB1cmwgPSBfZXhwb3J0cyRwYXJzZVVybC51cmwsXG4gICAgICBxdWVyeSA9IF9leHBvcnRzJHBhcnNlVXJsLnF1ZXJ5LFxuICAgICAgZnJhZ21lbnRJZGVudGlmaWVyID0gX2V4cG9ydHMkcGFyc2VVcmwuZnJhZ21lbnRJZGVudGlmaWVyO1xuXG4gIHJldHVybiBleHBvcnRzLnN0cmluZ2lmeVVybCh7XG4gICAgdXJsOiB1cmwsXG4gICAgcXVlcnk6IGZpbHRlck9iamVjdChxdWVyeSwgZmlsdGVyKSxcbiAgICBmcmFnbWVudElkZW50aWZpZXI6IGZyYWdtZW50SWRlbnRpZmllclxuICB9LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydHMuZXhjbHVkZSA9IGZ1bmN0aW9uIChpbnB1dCwgZmlsdGVyLCBvcHRpb25zKSB7XG4gIHZhciBleGNsdXNpb25GaWx0ZXIgPSBBcnJheS5pc0FycmF5KGZpbHRlcikgPyBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICFmaWx0ZXIuaW5jbHVkZXMoa2V5KTtcbiAgfSA6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuICFmaWx0ZXIoa2V5LCB2YWx1ZSk7XG4gIH07XG4gIHJldHVybiBleHBvcnRzLnBpY2soaW5wdXQsIGV4Y2x1c2lvbkZpbHRlciwgb3B0aW9ucyk7XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2203\n")},2993:function(module){eval("/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView; // Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n var length, i, keys;\n\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!equal(a[i], b[i])) return false;\n }\n\n return true;\n } // START: Modifications:\n // 1. Extra `has &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n\n\n var it;\n\n if (hasMap && a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!b.has(i.value[0])) return false;\n }\n\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n }\n\n return true;\n }\n\n if (hasSet && a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) {\n if (!b.has(i.value[0])) return false;\n }\n\n return true;\n } // END: Modifications\n\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n } // END: fast-deep-equal\n // START: react-fast-compare\n // custom handling for DOM elements\n\n\n if (hasElementType && a instanceof Element) return false; // custom handling for React/Preact\n\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n continue;\n } // all other properties should be traversed as usual\n\n\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n } // END: react-fast-compare\n // START: fast-deep-equal\n\n\n return true;\n }\n\n return a !== a && b !== b;\n} // end fast-deep-equal\n\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if ((error.message || '').match(/stack|recursion/i)) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n } // some other error. we should definitely know about these\n\n\n throw error;\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanM/MWMyNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTs7QUFFL0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFdBQVc7QUFDakM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFdBQVc7QUFDL0I7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0EsNkRBQTZEOztBQUU3RCxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBIiwiZmlsZSI6IjI5OTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG52YXIgaGFzRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICEhQXJyYXlCdWZmZXIuaXNWaWV3OyAvLyBOb3RlOiBXZSAqKmRvbid0KiogbmVlZCBgZW52SGFzQmlnSW50NjRBcnJheWAgaW4gZmRlIGVzNi9pbmRleC5qc1xuXG5mdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWwgZXM2L2luZGV4LmpzIDMuMS4xXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cblxuXG4gICAgdmFyIGl0O1xuXG4gICAgaWYgKGhhc01hcCAmJiBhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcblxuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG5cbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiBhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcblxuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cblxuICAgIGlmIChoYXNBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIC8vIFNUQVJUOiByZWFjdC1mYXN0LWNvbXBhcmVcbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIERPTSBlbGVtZW50c1xuXG5cbiAgICBpZiAoaGFzRWxlbWVudFR5cGUgJiYgYSBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBmYWxzZTsgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBSZWFjdC9QcmVhY3RcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgYXMgdXN1YWxcblxuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWxcblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufSAvLyBlbmQgZmFzdC1kZWVwLWVxdWFsXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvci5tZXNzYWdlIHx8ICcnKS5tYXRjaCgvc3RhY2t8cmVjdXJzaW9uL2kpKSB7XG4gICAgICAvLyB3YXJuIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGRvbid0IGNyYXNoXG4gICAgICAvLyBicm93c2VycyBnaXZlIHRoaXMgZGlmZmVyZW50IGVycm9ycyBuYW1lIGFuZCBtZXNzYWdlczpcbiAgICAgIC8vIGNocm9tZS9zYWZhcmk6IFwiUmFuZ2VFcnJvclwiLCBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCJcbiAgICAgIC8vIGZpcmVmb3g6IFwiSW50ZXJuYWxFcnJvclwiLCB0b28gbXVjaCByZWN1cnNpb25cIlxuICAgICAgLy8gZWRnZTogXCJFcnJvclwiLCBcIk91dCBvZiBzdGFjayBzcGFjZVwiXG4gICAgICBjb25zb2xlLndhcm4oJ3JlYWN0LWZhc3QtY29tcGFyZSBjYW5ub3QgaGFuZGxlIGNpcmN1bGFyIHJlZnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIHNvbWUgb3RoZXIgZXJyb3IuIHdlIHNob3VsZCBkZWZpbml0ZWx5IGtub3cgYWJvdXQgdGhlc2VcblxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2993\n")},4424:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "vU": function() { return /* binding */ defineMessages; }\n});\n\n// UNUSED EXPORTS: FormattedDate, FormattedDateParts, FormattedDateTimeRange, FormattedDisplayName, FormattedList, FormattedListParts, FormattedMessage, FormattedNumber, FormattedNumberParts, FormattedPlural, FormattedRelativeTime, FormattedTime, FormattedTimeParts, IntlContext, IntlProvider, InvalidConfigError, MessageFormatError, MissingDataError, MissingTranslationError, RawIntlProvider, ReactIntlError, ReactIntlErrorCode, UnsupportedFormatterError, createIntl, createIntlCache, defineMessage, injectIntl, useIntl\n\n;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return _assign.apply(this, arguments);\n};\n\n\nfunction tslib_es6_rest(s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n }\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function (target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator["throw"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function sent() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n },\n f,\n y,\n t,\n g;\n return g = {\n next: verb(0),\n "throw": verb(1),\n "return": verb(2)\n }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {\n return this;\n }), g;\n\n function verb(n) {\n return function (v) {\n return step([n, v]);\n };\n }\n\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n\n while (_) {\n try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n\n switch (op[0]) {\n case 0:\n case 1:\n t = op;\n break;\n\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n\n case 5:\n _.label++;\n y = op[1];\n op = [0];\n continue;\n\n case 7:\n op = _.ops.pop();\n\n _.trys.pop();\n\n continue;\n\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n\n if (t && _.label < t[2]) {\n _.label = t[2];\n\n _.ops.push(op);\n\n break;\n }\n\n if (t[2]) _.ops.pop();\n\n _.trys.pop();\n\n continue;\n }\n\n op = body.call(thisArg, _);\n } catch (e) {\n op = [6, e];\n y = 0;\n } finally {\n f = t = 0;\n }\n }\n\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nvar __createBinding = Object.create ? function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, {\n enumerable: true,\n get: function get() {\n return m[k];\n }\n });\n} : function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n};\nfunction __exportStar(m, o) {\n for (var p in m) {\n if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n }\n}\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function next() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n ar.push(r.value);\n }\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n\n return ar;\n}\n/** @deprecated */\n\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++) {\n ar = ar.concat(__read(arguments[i]));\n }\n\n return ar;\n}\n/** @deprecated */\n\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) {\n s += arguments[i].length;\n }\n\n for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) {\n r[k] = a[j];\n }\n }\n\n return r;\n}\nfunction tslib_es6_spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || from);\n}\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []),\n i,\n q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i;\n\n function verb(n) {\n if (g[n]) i[n] = function (v) {\n return new Promise(function (a, b) {\n q.push([n, v, a, b]) > 1 || resume(n, v);\n });\n };\n }\n\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n\n function fulfill(value) {\n resume("next", value);\n }\n\n function reject(value) {\n resume("throw", value);\n }\n\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) {\n throw e;\n }), verb("return"), i[Symbol.iterator] = function () {\n return this;\n }, i;\n\n function verb(n, f) {\n i[n] = o[n] ? function (v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: n === "return"\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator],\n i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {\n return this;\n }, i);\n\n function verb(n) {\n i[n] = o[n] && function (v) {\n return new Promise(function (resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function (v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, "raw", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n\n return cooked;\n}\n;\n\nvar __setModuleDefault = Object.create ? function (o, v) {\n Object.defineProperty(o, "default", {\n enumerable: true,\n value: v\n });\n} : function (o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n }\n\n __setModuleDefault(result, mod);\n\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n}\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(5706);\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/injectIntl.js\n\n\n\n\n\nfunction getDisplayName(Component) {\n return Component.displayName || Component.name || \'Component\';\n} // TODO: We should provide initial value here\n\n\nvar IntlContext = react.createContext(null);\nvar IntlConsumer = IntlContext.Consumer,\n IntlProvider = IntlContext.Provider;\nvar Provider = (/* unused pure expression or super */ null && (IntlProvider));\nvar Context = IntlContext;\nfunction injectIntl(WrappedComponent, options) {\n var _a = options || {},\n _b = _a.intlPropName,\n intlPropName = _b === void 0 ? \'intl\' : _b,\n _c = _a.forwardRef,\n forwardRef = _c === void 0 ? false : _c,\n _d = _a.enforceContext,\n enforceContext = _d === void 0 ? true : _d;\n\n var WithIntl = function WithIntl(props) {\n return React.createElement(IntlConsumer, null, function (intl) {\n var _a;\n\n if (enforceContext) {\n invariantIntlContext(intl);\n }\n\n var intlProp = (_a = {}, _a[intlPropName] = intl, _a);\n return React.createElement(WrappedComponent, __assign({}, props, intlProp, {\n ref: forwardRef ? props.forwardedRef : null\n }));\n });\n };\n\n WithIntl.displayName = "injectIntl(" + getDisplayName(WrappedComponent) + ")";\n WithIntl.WrappedComponent = WrappedComponent;\n\n if (forwardRef) {\n return hoistNonReactStatics(React.forwardRef(function (props, ref) {\n return React.createElement(WithIntl, __assign({}, props, {\n forwardedRef: ref\n }));\n }), WrappedComponent);\n }\n\n return hoistNonReactStatics(WithIntl, WrappedComponent);\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/ecma402-abstract/lib/utils.js\n/**\n * Cannot do Math.log(x) / Math.log(10) bc if IEEE floating point issue\n * @param x number\n */\nfunction getMagnitude(x) {\n // Cannot count string length via Number.toString because it may use scientific notation\n // for very small or very large numbers.\n return Math.floor(Math.log(x) * Math.LOG10E);\n}\nfunction repeat(s, times) {\n if (typeof s.repeat === \'function\') {\n return s.repeat(times);\n }\n\n var arr = new Array(times);\n\n for (var i = 0; i < arr.length; i++) {\n arr[i] = s;\n }\n\n return arr.join(\'\');\n}\nfunction setInternalSlot(map, pl, field, value) {\n if (!map.get(pl)) {\n map.set(pl, Object.create(null));\n }\n\n var slots = map.get(pl);\n slots[field] = value;\n}\nfunction setMultiInternalSlots(map, pl, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var k = _a[_i];\n setInternalSlot(map, pl, k, props[k]);\n }\n}\nfunction getInternalSlot(map, pl, field) {\n return getMultiInternalSlots(map, pl, field)[field];\n}\nfunction getMultiInternalSlots(map, pl) {\n var fields = [];\n\n for (var _i = 2; _i < arguments.length; _i++) {\n fields[_i - 2] = arguments[_i];\n }\n\n var slots = map.get(pl);\n\n if (!slots) {\n throw new TypeError(pl + " InternalSlot has not been initialized");\n }\n\n return fields.reduce(function (all, f) {\n all[f] = slots[f];\n return all;\n }, Object.create(null));\n}\nfunction isLiteralPart(patternPart) {\n return patternPart.type === \'literal\';\n}\n/*\n 17 ECMAScript Standard Built-in Objects:\n Every built-in Function object, including constructors, that is not\n identified as an anonymous function has a name property whose value\n is a String.\n\n Unless otherwise specified, the name property of a built-in Function\n object, if it exists, has the attributes { [[Writable]]: false,\n [[Enumerable]]: false, [[Configurable]]: true }.\n*/\n\nfunction defineProperty(target, name, _a) {\n var value = _a.value;\n Object.defineProperty(target, name, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: value\n });\n}\nvar UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\nfunction invariant(condition, message, Err) {\n if (Err === void 0) {\n Err = Error;\n }\n\n if (!condition) {\n throw new Err(message);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@formatjs/fast-memoize/lib/index.js\n//\n// Main\n//\nfunction lib_memoize(fn, options) {\n var cache = options && options.cache ? options.cache : cacheDefault;\n var serializer = options && options.serializer ? options.serializer : serializerDefault;\n var strategy = options && options.strategy ? options.strategy : strategyDefault;\n return strategy(fn, {\n cache: cache,\n serializer: serializer\n });\n} //\n// Strategy\n//\n\nfunction isPrimitive(value) {\n return value == null || typeof value === \'number\' || typeof value === \'boolean\'; // || typeof value === "string" \'unsafe\' primitive for our needs\n}\n\nfunction monadic(fn, cache, serializer, arg) {\n var cacheKey = isPrimitive(arg) ? arg : serializer(arg);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.call(this, arg);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction variadic(fn, cache, serializer) {\n var args = Array.prototype.slice.call(arguments, 3);\n var cacheKey = serializer(args);\n var computedValue = cache.get(cacheKey);\n\n if (typeof computedValue === \'undefined\') {\n computedValue = fn.apply(this, args);\n cache.set(cacheKey, computedValue);\n }\n\n return computedValue;\n}\n\nfunction assemble(fn, context, strategy, cache, serialize) {\n return strategy.bind(context, fn, cache, serialize);\n}\n\nfunction strategyDefault(fn, options) {\n var strategy = fn.length === 1 ? monadic : variadic;\n return assemble(fn, this, strategy, options.cache.create(), options.serializer);\n}\n\nfunction strategyVariadic(fn, options) {\n return assemble(fn, this, variadic, options.cache.create(), options.serializer);\n}\n\nfunction strategyMonadic(fn, options) {\n return assemble(fn, this, monadic, options.cache.create(), options.serializer);\n} //\n// Serializer\n//\n\n\nvar serializerDefault = function serializerDefault() {\n return JSON.stringify(arguments);\n}; //\n// Cache\n//\n\n\nfunction ObjectWithoutPrototypeCache() {\n this.cache = Object.create(null);\n}\n\nObjectWithoutPrototypeCache.prototype.has = function (key) {\n return key in this.cache;\n};\n\nObjectWithoutPrototypeCache.prototype.get = function (key) {\n return this.cache[key];\n};\n\nObjectWithoutPrototypeCache.prototype.set = function (key, value) {\n this.cache[key] = value;\n};\n\nvar cacheDefault = {\n create: function create() {\n // @ts-ignore\n return new ObjectWithoutPrototypeCache();\n }\n};\nvar lib_strategies = {\n variadic: strategyVariadic,\n monadic: strategyMonadic\n};\n;// CONCATENATED MODULE: ./node_modules/@formatjs/intl/lib/src/utils.js\n\n\n\n\nfunction filterProps(props, whitelist, defaults) {\n if (defaults === void 0) {\n defaults = {};\n }\n\n return whitelist.reduce(function (filtered, name) {\n if (name in props) {\n filtered[name] = props[name];\n } else if (name in defaults) {\n filtered[name] = defaults[name];\n }\n\n return filtered;\n }, {});\n}\n\nvar defaultErrorHandler = function defaultErrorHandler(error) {\n if (false) {}\n};\n\nvar DEFAULT_INTL_CONFIG = {\n formats: {},\n messages: {},\n timeZone: undefined,\n defaultLocale: \'en\',\n defaultFormats: {},\n onError: defaultErrorHandler\n};\nfunction createIntlCache() {\n return {\n dateTime: {},\n number: {},\n message: {},\n relativeTime: {},\n pluralRules: {},\n list: {},\n displayNames: {}\n };\n}\n\nfunction createFastMemoizeCache(store) {\n return {\n create: function create() {\n return {\n has: function has(key) {\n return key in store;\n },\n get: function get(key) {\n return store[key];\n },\n set: function set(key, value) {\n store[key] = value;\n }\n };\n }\n };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\n\n\nfunction createFormatters(cache) {\n if (cache === void 0) {\n cache = createIntlCache();\n }\n\n var RelativeTimeFormat = Intl.RelativeTimeFormat;\n var ListFormat = Intl.ListFormat;\n var DisplayNames = Intl.DisplayNames;\n var getDateTimeFormat = memoize(function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.dateTime),\n strategy: strategies.variadic\n });\n var getNumberFormat = memoize(function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.number),\n strategy: strategies.variadic\n });\n var getPluralRules = memoize(function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.pluralRules),\n strategy: strategies.variadic\n });\n return {\n getDateTimeFormat: getDateTimeFormat,\n getNumberFormat: getNumberFormat,\n getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n return new IntlMessageFormat(message, locales, overrideFormats, __assign({\n formatters: {\n getNumberFormat: getNumberFormat,\n getDateTimeFormat: getDateTimeFormat,\n getPluralRules: getPluralRules\n }\n }, opts || {}));\n }, {\n cache: createFastMemoizeCache(cache.message),\n strategy: strategies.variadic\n }),\n getRelativeTimeFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.relativeTime),\n strategy: strategies.variadic\n }),\n getPluralRules: getPluralRules,\n getListFormat: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.list),\n strategy: strategies.variadic\n }),\n getDisplayNames: memoize(function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args)))();\n }, {\n cache: createFastMemoizeCache(cache.displayNames),\n strategy: strategies.variadic\n })\n };\n}\nfunction getNamedFormat(formats, type, name, onError) {\n var formatType = formats && formats[type];\n var format;\n\n if (formatType) {\n format = formatType[name];\n }\n\n if (format) {\n return format;\n }\n\n onError(new UnsupportedFormatterError("No " + type + " format named: " + name));\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/utils.js\n\n\n\n\nfunction utils_invariantIntlContext(intl) {\n invariant(intl, \'[React Intl] Could not find required `intl` object. \' + \' needs to exist in the component ancestry.\');\n}\nvar utils_DEFAULT_INTL_CONFIG = _assign(_assign({}, DEFAULT_INTL_CONFIG), {\n textComponent: react.Fragment\n});\n/**\n * Takes a `formatXMLElementFn`, and composes it in function, which passes\n * argument `parts` through, assigning unique key to each part, to prevent\n * "Each child in a list should have a unique "key"" React error.\n * @param formatXMLElementFn\n */\n\nfunction assignUniqueKeysToParts(formatXMLElementFn) {\n return function (parts) {\n // eslint-disable-next-line prefer-rest-params\n return formatXMLElementFn(React.Children.toArray(parts));\n };\n}\nfunction shallowEqual(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key] || !Object.prototype.hasOwnProperty.call(objB, key)) {\n return false;\n }\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/useIntl.js\n\n\n\nfunction useIntl_useIntl() {\n var intl = react.useContext(Context);\n utils_invariantIntlContext(intl);\n return intl;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/src/components/createFormattedComponent.js\n\n\n\nvar DisplayName;\n\n(function (DisplayName) {\n DisplayName["formatDate"] = "FormattedDate";\n DisplayName["formatTime"] = "FormattedTime";\n DisplayName["formatNumber"] = "FormattedNumber";\n DisplayName["formatList"] = "FormattedList"; // Note that this DisplayName is the locale display name, not to be confused with\n // the name of the enum, which is for React component display name in dev tools.\n\n DisplayName["formatDisplayName"] = "FormattedDisplayName";\n})(DisplayName || (DisplayName = {}));\n\nvar DisplayNameParts;\n\n(function (DisplayNameParts) {\n DisplayNameParts["formatDate"] = "FormattedDateParts";\n DisplayNameParts["formatTime"] = "FormattedTimeParts";\n DisplayNameParts["formatNumber"] = "FormattedNumberParts";\n DisplayNameParts["formatList"] = "FormattedListParts";\n})(DisplayNameParts || (DisplayNameParts = {}));\n\nvar FormattedNumberParts = function FormattedNumberParts(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props, ["value", "children"]);\n\n return children(intl.formatNumberToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nvar FormattedListParts = function FormattedListParts(props) {\n var intl = useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = __rest(props, ["value", "children"]);\n\n return children(intl.formatListToParts(value, formatProps));\n};\nFormattedNumberParts.displayName = \'FormattedNumberParts\';\nfunction createFormattedDateTimePartsComponent(name) {\n var ComponentParts = function ComponentParts(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props, ["value", "children"]);\n\n var date = typeof value === \'string\' ? new Date(value || 0) : value;\n var formattedParts = name === \'formatDate\' ? intl.formatDateToParts(date, formatProps) : intl.formatTimeToParts(date, formatProps);\n return children(formattedParts);\n };\n\n ComponentParts.displayName = DisplayNameParts[name];\n return ComponentParts;\n}\nfunction createFormattedComponent(name) {\n var Component = function Component(props) {\n var intl = useIntl_useIntl();\n\n var value = props.value,\n children = props.children,\n formatProps = tslib_es6_rest(props // TODO: fix TS type definition for localeMatcher upstream\n , ["value", "children"]); // TODO: fix TS type definition for localeMatcher upstream\n\n\n var formattedValue = intl[name](value, formatProps);\n\n if (typeof children === \'function\') {\n return children(formattedValue);\n }\n\n var Text = intl.textComponent || react.Fragment;\n return react.createElement(Text, null, formattedValue);\n };\n\n Component.displayName = DisplayName[name];\n return Component;\n}\n;// CONCATENATED MODULE: ./node_modules/react-intl/lib/index.js\n\n\nfunction defineMessages(msgs) {\n return msgs;\n}\nfunction defineMessage(msg) {\n return msg;\n}\n\n\n // IMPORTANT: Explicit here to prevent api-extractor from outputing `import(\'./src/types\').CustomFormatConfig`\n\nvar FormattedDate = createFormattedComponent(\'formatDate\');\nvar FormattedTime = createFormattedComponent(\'formatTime\');\nvar FormattedNumber = createFormattedComponent(\'formatNumber\');\nvar FormattedList = createFormattedComponent(\'formatList\');\nvar FormattedDisplayName = createFormattedComponent(\'formatDisplayName\');\nvar FormattedDateParts = createFormattedDateTimePartsComponent(\'formatDate\');\nvar FormattedTimeParts = createFormattedDateTimePartsComponent(\'formatTime\');\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/YjA1NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9zcmMvY29tcG9uZW50cy9pbmplY3RJbnRsLmpzP2RlYTkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2VjbWE0MDItYWJzdHJhY3QvbGliL3V0aWxzLmpzPzFjNjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGZvcm1hdGpzL2Zhc3QtbWVtb2l6ZS9saWIvaW5kZXguanM/NzRiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AZm9ybWF0anMvaW50bC9saWIvc3JjL3V0aWxzLmpzPzQzZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL3V0aWxzLmpzPzlkMjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaW50bC9saWIvc3JjL2NvbXBvbmVudHMvdXNlSW50bC5qcz9mODUzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudC5qcz83YTUyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbGliL2luZGV4LmpzPzUzZmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7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QTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGVBQU87O0FBRXRCO0FBQ0E7QUFDQSxzQkFBc0IsY0FBTTtBQUM1Qiw2QkFBNkI7OztBQUc3Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLGNBQWM7QUFDbkQsV0FBVyxtQkFBbUI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBLEM7O0FDbEY0SDtBQUNxRztBQUMxTjtBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDeUg7QUFDM0Q7QUFDa0I7O0FBRXpFLG9CQUFvQix3QkFBd0I7QUFDNUMsb0JBQW9CLHdCQUF3QjtBQUM1QyxzQkFBc0Isd0JBQXdCO0FBQzlDLG9CQUFvQix3QkFBd0I7QUFDNUMsMkJBQTJCLHdCQUF3QjtBQUNuRCx5QkFBeUIscUNBQXFDO0FBQzlELHlCQUF5QixxQ0FBcUM7QUFDZ0M7QUFDeEI7QUFDUjtBQUNFIiwiZmlsZSI6IjQ0MjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xudmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICBfX3Byb3RvX186IFtdXG4gIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGQuX19wcm90b19fID0gYjtcbiAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cblxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbnZhciBfYXNzaWduID0gZnVuY3Rpb24gX19hc3NpZ24oKSB7XG4gIF9hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IHsgX2Fzc2lnbiBhcyBfX2Fzc2lnbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgfVxuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYyxcbiAgICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7ZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIH1cbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7XG4gICAgbGFiZWw6IDAsXG4gICAgc2VudDogZnVuY3Rpb24gc2VudCgpIHtcbiAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTtcbiAgICAgIHJldHVybiB0WzFdO1xuICAgIH0sXG4gICAgdHJ5czogW10sXG4gICAgb3BzOiBbXVxuICB9LFxuICAgICAgZixcbiAgICAgIHksXG4gICAgICB0LFxuICAgICAgZztcbiAgcmV0dXJuIGcgPSB7XG4gICAgbmV4dDogdmVyYigwKSxcbiAgICBcInRocm93XCI6IHZlcmIoMSksXG4gICAgXCJyZXR1cm5cIjogdmVyYigyKVxuICB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGc7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gc3RlcChbbiwgdl0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuXG4gICAgd2hpbGUgKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuXG4gICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfLmxhYmVsKys7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sXG4gICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgICAgeSA9IG9wWzFdO1xuICAgICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7XG5cbiAgICAgICAgICAgIF8udHJ5cy5wb3AoKTtcblxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHtcbiAgICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7XG4gICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTtcbiAgICAgICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07XG5cbiAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcblxuICAgICAgICAgICAgXy50cnlzLnBvcCgpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvcCA9IFs2LCBlXTtcbiAgICAgICAgeSA9IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmID0gdCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IGZ1bmN0aW9uIChvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG1ba107XG4gICAgfVxuICB9KTtcbn0gOiBmdW5jdGlvbiAobywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIHtcbiAgICBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsXG4gICAgICBtID0gcyAmJiBvW3NdLFxuICAgICAgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbyAmJiBvW2krK10sXG4gICAgICAgIGRvbmU6ICFvXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksXG4gICAgICByLFxuICAgICAgYXIgPSBbXSxcbiAgICAgIGU7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkge1xuICAgICAgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHtcbiAgICAgIGVycm9yOiBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXI7XG59XG4vKiogQGRlcHJlY2F0ZWQgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgfVxuXG4gIHJldHVybiBhcjtcbn1cbi8qKiBAZGVwcmVjYXRlZCAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykge1xuICAgIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykge1xuICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKSB7XG4gICAgICByW2tdID0gYVtqXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBmcm9tKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksXG4gICAgICBpLFxuICAgICAgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaTtcblxuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUobiwgdikge1xuICAgIHRyeSB7XG4gICAgICBzdGVwKGdbbl0odikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldHRsZShxWzBdWzNdLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkge1xuICAgIHJlc3VtZShcInRocm93XCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkge1xuICAgIHRocm93IGU7XG4gIH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGk7XG5cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7XG4gICAgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIChwID0gIXApID8ge1xuICAgICAgICB2YWx1ZTogX19hd2FpdChvW25dKHYpKSxcbiAgICAgICAgZG9uZTogbiA9PT0gXCJyZXR1cm5cIlxuICAgICAgfSA6IGYgPyBmKHYpIDogdjtcbiAgICB9IDogZjtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLFxuICAgICAgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG5cbiAgZnVuY3Rpb24gdmVyYihuKSB7XG4gICAgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbiAodikge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBkb25lOiBkXG4gICAgICB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHtcbiAgICAgIHZhbHVlOiByYXdcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb29rZWQucmF3ID0gcmF3O1xuICB9XG5cbiAgcmV0dXJuIGNvb2tlZDtcbn1cbjtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyBmdW5jdGlvbiAobywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2XG4gIH0pO1xufSA6IGZ1bmN0aW9uIChvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkge1xuICAgIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgfVxuXG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7XG4gICAgZGVmYXVsdDogbW9kXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpLCB2YWx1ZTtcbn0iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IGludmFyaWFudEludGxDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jztcbn0gLy8gVE9ETzogV2Ugc2hvdWxkIHByb3ZpZGUgaW5pdGlhbCB2YWx1ZSBoZXJlXG5cblxudmFyIEludGxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbnZhciBJbnRsQ29uc3VtZXIgPSBJbnRsQ29udGV4dC5Db25zdW1lcixcbiAgICBJbnRsUHJvdmlkZXIgPSBJbnRsQ29udGV4dC5Qcm92aWRlcjtcbmV4cG9ydCB2YXIgUHJvdmlkZXIgPSBJbnRsUHJvdmlkZXI7XG5leHBvcnQgdmFyIENvbnRleHQgPSBJbnRsQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluamVjdEludGwoV3JhcHBlZENvbXBvbmVudCwgb3B0aW9ucykge1xuICB2YXIgX2EgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgX2IgPSBfYS5pbnRsUHJvcE5hbWUsXG4gICAgICBpbnRsUHJvcE5hbWUgPSBfYiA9PT0gdm9pZCAwID8gJ2ludGwnIDogX2IsXG4gICAgICBfYyA9IF9hLmZvcndhcmRSZWYsXG4gICAgICBmb3J3YXJkUmVmID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsXG4gICAgICBfZCA9IF9hLmVuZm9yY2VDb250ZXh0LFxuICAgICAgZW5mb3JjZUNvbnRleHQgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kO1xuXG4gIHZhciBXaXRoSW50bCA9IGZ1bmN0aW9uIFdpdGhJbnRsKHByb3BzKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW50bENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoZW5mb3JjZUNvbnRleHQpIHtcbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoaW50bCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnRsUHJvcCA9IChfYSA9IHt9LCBfYVtpbnRsUHJvcE5hbWVdID0gaW50bCwgX2EpO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgX19hc3NpZ24oe30sIHByb3BzLCBpbnRsUHJvcCwge1xuICAgICAgICByZWY6IGZvcndhcmRSZWYgPyBwcm9wcy5mb3J3YXJkZWRSZWYgOiBudWxsXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH07XG5cbiAgV2l0aEludGwuZGlzcGxheU5hbWUgPSBcImluamVjdEludGwoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiO1xuICBXaXRoSW50bC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcblxuICBpZiAoZm9yd2FyZFJlZikge1xuICAgIHJldHVybiBob2lzdE5vblJlYWN0U3RhdGljcyhSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXaXRoSW50bCwgX19hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGZvcndhcmRlZFJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSksIFdyYXBwZWRDb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKFdpdGhJbnRsLCBXcmFwcGVkQ29tcG9uZW50KTtcbn0iLCIvKipcbiAqIENhbm5vdCBkbyBNYXRoLmxvZyh4KSAvIE1hdGgubG9nKDEwKSBiYyBpZiBJRUVFIGZsb2F0aW5nIHBvaW50IGlzc3VlXG4gKiBAcGFyYW0geCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hZ25pdHVkZSh4KSB7XG4gIC8vIENhbm5vdCBjb3VudCBzdHJpbmcgbGVuZ3RoIHZpYSBOdW1iZXIudG9TdHJpbmcgYmVjYXVzZSBpdCBtYXkgdXNlIHNjaWVudGlmaWMgbm90YXRpb25cbiAgLy8gZm9yIHZlcnkgc21hbGwgb3IgdmVyeSBsYXJnZSBudW1iZXJzLlxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXBlYXQocywgdGltZXMpIHtcbiAgaWYgKHR5cGVvZiBzLnJlcGVhdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzLnJlcGVhdCh0aW1lcyk7XG4gIH1cblxuICB2YXIgYXJyID0gbmV3IEFycmF5KHRpbWVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IHM7XG4gIH1cblxuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBmaWVsZCwgdmFsdWUpIHtcbiAgaWYgKCFtYXAuZ2V0KHBsKSkge1xuICAgIG1hcC5zZXQocGwsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICB9XG5cbiAgdmFyIHNsb3RzID0gbWFwLmdldChwbCk7XG4gIHNsb3RzW2ZpZWxkXSA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBwcm9wcykge1xuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMocHJvcHMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBrID0gX2FbX2ldO1xuICAgIHNldEludGVybmFsU2xvdChtYXAsIHBsLCBrLCBwcm9wc1trXSk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbFNsb3QobWFwLCBwbCwgZmllbGQpIHtcbiAgcmV0dXJuIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsLCBmaWVsZClbZmllbGRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpSW50ZXJuYWxTbG90cyhtYXAsIHBsKSB7XG4gIHZhciBmaWVsZHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGZpZWxkc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHZhciBzbG90cyA9IG1hcC5nZXQocGwpO1xuXG4gIGlmICghc2xvdHMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHBsICsgXCIgSW50ZXJuYWxTbG90IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgfVxuXG4gIHJldHVybiBmaWVsZHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGYpIHtcbiAgICBhbGxbZl0gPSBzbG90c1tmXTtcbiAgICByZXR1cm4gYWxsO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWxQYXJ0KHBhdHRlcm5QYXJ0KSB7XG4gIHJldHVybiBwYXR0ZXJuUGFydC50eXBlID09PSAnbGl0ZXJhbCc7XG59XG4vKlxuICAxNyBFQ01BU2NyaXB0IFN0YW5kYXJkIEJ1aWx0LWluIE9iamVjdHM6XG4gICAgRXZlcnkgYnVpbHQtaW4gRnVuY3Rpb24gb2JqZWN0LCBpbmNsdWRpbmcgY29uc3RydWN0b3JzLCB0aGF0IGlzIG5vdFxuICAgIGlkZW50aWZpZWQgYXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIGhhcyBhIG5hbWUgcHJvcGVydHkgd2hvc2UgdmFsdWVcbiAgICBpcyBhIFN0cmluZy5cblxuICAgIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgbmFtZSBwcm9wZXJ0eSBvZiBhIGJ1aWx0LWluIEZ1bmN0aW9uXG4gICAgb2JqZWN0LCBpZiBpdCBleGlzdHMsIGhhcyB0aGUgYXR0cmlidXRlcyB7IFtbV3JpdGFibGVdXTogZmFsc2UsXG4gICAgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiB0cnVlIH0uXG4qL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBfYSkge1xuICB2YXIgdmFsdWUgPSBfYS52YWx1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5leHBvcnQgdmFyIFVOSUNPREVfRVhURU5TSU9OX1NFUVVFTkNFX1JFR0VYID0gLy11KD86LVswLTlhLXpdezIsOH0pKy9naTtcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlLCBFcnIpIHtcbiAgaWYgKEVyciA9PT0gdm9pZCAwKSB7XG4gICAgRXJyID0gRXJyb3I7XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnIobWVzc2FnZSk7XG4gIH1cbn0iLCIvL1xuLy8gTWFpblxuLy9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lbW9pemUoZm4sIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlID0gb3B0aW9ucyAmJiBvcHRpb25zLmNhY2hlID8gb3B0aW9ucy5jYWNoZSA6IGNhY2hlRGVmYXVsdDtcbiAgdmFyIHNlcmlhbGl6ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplciA/IG9wdGlvbnMuc2VyaWFsaXplciA6IHNlcmlhbGl6ZXJEZWZhdWx0O1xuICB2YXIgc3RyYXRlZ3kgPSBvcHRpb25zICYmIG9wdGlvbnMuc3RyYXRlZ3kgPyBvcHRpb25zLnN0cmF0ZWd5IDogc3RyYXRlZ3lEZWZhdWx0O1xuICByZXR1cm4gc3RyYXRlZ3koZm4sIHtcbiAgICBjYWNoZTogY2FjaGUsXG4gICAgc2VyaWFsaXplcjogc2VyaWFsaXplclxuICB9KTtcbn0gLy9cbi8vIFN0cmF0ZWd5XG4vL1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nOyAvLyB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJ3Vuc2FmZScgcHJpbWl0aXZlIGZvciBvdXIgbmVlZHNcbn1cblxuZnVuY3Rpb24gbW9uYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIsIGFyZykge1xuICB2YXIgY2FjaGVLZXkgPSBpc1ByaW1pdGl2ZShhcmcpID8gYXJnIDogc2VyaWFsaXplcihhcmcpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5jYWxsKHRoaXMsIGFyZyk7XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjb21wdXRlZFZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YXJpYWRpYyhmbiwgY2FjaGUsIHNlcmlhbGl6ZXIpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemVyKGFyZ3MpO1xuICB2YXIgY29tcHV0ZWRWYWx1ZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgaWYgKHR5cGVvZiBjb21wdXRlZFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbXB1dGVkVmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjYWNoZS5zZXQoY2FjaGVLZXksIGNvbXB1dGVkVmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzc2VtYmxlKGZuLCBjb250ZXh0LCBzdHJhdGVneSwgY2FjaGUsIHNlcmlhbGl6ZSkge1xuICByZXR1cm4gc3RyYXRlZ3kuYmluZChjb250ZXh0LCBmbiwgY2FjaGUsIHNlcmlhbGl6ZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5RGVmYXVsdChmbiwgb3B0aW9ucykge1xuICB2YXIgc3RyYXRlZ3kgPSBmbi5sZW5ndGggPT09IDEgPyBtb25hZGljIDogdmFyaWFkaWM7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgc3RyYXRlZ3ksIG9wdGlvbnMuY2FjaGUuY3JlYXRlKCksIG9wdGlvbnMuc2VyaWFsaXplcik7XG59XG5cbmZ1bmN0aW9uIHN0cmF0ZWd5VmFyaWFkaWMoZm4sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzc2VtYmxlKGZuLCB0aGlzLCB2YXJpYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn1cblxuZnVuY3Rpb24gc3RyYXRlZ3lNb25hZGljKGZuLCBvcHRpb25zKSB7XG4gIHJldHVybiBhc3NlbWJsZShmbiwgdGhpcywgbW9uYWRpYywgb3B0aW9ucy5jYWNoZS5jcmVhdGUoKSwgb3B0aW9ucy5zZXJpYWxpemVyKTtcbn0gLy9cbi8vIFNlcmlhbGl6ZXJcbi8vXG5cblxudmFyIHNlcmlhbGl6ZXJEZWZhdWx0ID0gZnVuY3Rpb24gc2VyaWFsaXplckRlZmF1bHQoKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmd1bWVudHMpO1xufTsgLy9cbi8vIENhY2hlXG4vL1xuXG5cbmZ1bmN0aW9uIE9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZSgpIHtcbiAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5IGluIHRoaXMuY2FjaGU7XG59O1xuXG5PYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbn07XG5cbk9iamVjdFdpdGhvdXRQcm90b3R5cGVDYWNoZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5jYWNoZVtrZXldID0gdmFsdWU7XG59O1xuXG52YXIgY2FjaGVEZWZhdWx0ID0ge1xuICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5ldyBPYmplY3RXaXRob3V0UHJvdG90eXBlQ2FjaGUoKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgc3RyYXRlZ2llcyA9IHtcbiAgdmFyaWFkaWM6IHN0cmF0ZWd5VmFyaWFkaWMsXG4gIG1vbmFkaWM6IHN0cmF0ZWd5TW9uYWRpY1xufTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IG1lbW9pemUsIHsgc3RyYXRlZ2llcyB9IGZyb20gJ0Bmb3JtYXRqcy9mYXN0LW1lbW9pemUnO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRGb3JtYXR0ZXJFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclByb3BzKHByb3BzLCB3aGl0ZWxpc3QsIGRlZmF1bHRzKSB7XG4gIGlmIChkZWZhdWx0cyA9PT0gdm9pZCAwKSB7XG4gICAgZGVmYXVsdHMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiB3aGl0ZWxpc3QucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZCwgbmFtZSkge1xuICAgIGlmIChuYW1lIGluIHByb3BzKSB7XG4gICAgICBmaWx0ZXJlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgIH0gZWxzZSBpZiAobmFtZSBpbiBkZWZhdWx0cykge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH0sIHt9KTtcbn1cblxudmFyIGRlZmF1bHRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycm9yKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IHtcbiAgZm9ybWF0czoge30sXG4gIG1lc3NhZ2VzOiB7fSxcbiAgdGltZVpvbmU6IHVuZGVmaW5lZCxcbiAgZGVmYXVsdExvY2FsZTogJ2VuJyxcbiAgZGVmYXVsdEZvcm1hdHM6IHt9LFxuICBvbkVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGxDYWNoZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRlVGltZToge30sXG4gICAgbnVtYmVyOiB7fSxcbiAgICBtZXNzYWdlOiB7fSxcbiAgICByZWxhdGl2ZVRpbWU6IHt9LFxuICAgIHBsdXJhbFJ1bGVzOiB7fSxcbiAgICBsaXN0OiB7fSxcbiAgICBkaXNwbGF5TmFtZXM6IHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoc3RvcmUpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICAgIHJldHVybiBrZXkgaW4gc3RvcmU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICAgIHJldHVybiBzdG9yZVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgc3RvcmVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGludGwgZm9ybWF0dGVycyBhbmQgcG9wdWxhdGUgY2FjaGVcbiAqIEBwYXJhbSBjYWNoZSBleHBsaWNpdCBjYWNoZSB0byBwcmV2ZW50IGxlYWtpbmcgbWVtb3J5XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVycyhjYWNoZSkge1xuICBpZiAoY2FjaGUgPT09IHZvaWQgMCkge1xuICAgIGNhY2hlID0gY3JlYXRlSW50bENhY2hlKCk7XG4gIH1cblxuICB2YXIgUmVsYXRpdmVUaW1lRm9ybWF0ID0gSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIHZhciBMaXN0Rm9ybWF0ID0gSW50bC5MaXN0Rm9ybWF0O1xuICB2YXIgRGlzcGxheU5hbWVzID0gSW50bC5EaXNwbGF5TmFtZXM7XG4gIHZhciBnZXREYXRlVGltZUZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuRGF0ZVRpbWVGb3JtYXQpLmJpbmQuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgfSwge1xuICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRhdGVUaW1lKSxcbiAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICB9KTtcbiAgdmFyIGdldE51bWJlckZvcm1hdCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKChfYSA9IEludGwuTnVtYmVyRm9ybWF0KS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5udW1iZXIpLFxuICAgIHN0cmF0ZWd5OiBzdHJhdGVnaWVzLnZhcmlhZGljXG4gIH0pO1xuICB2YXIgZ2V0UGx1cmFsUnVsZXMgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3ICgoX2EgPSBJbnRsLlBsdXJhbFJ1bGVzKS5iaW5kLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gIH0sIHtcbiAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5wbHVyYWxSdWxlcyksXG4gICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgZ2V0RGF0ZVRpbWVGb3JtYXQ6IGdldERhdGVUaW1lRm9ybWF0LFxuICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgIGdldE1lc3NhZ2VGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKG1lc3NhZ2UsIGxvY2FsZXMsIG92ZXJyaWRlRm9ybWF0cywgb3B0cykge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTWVzc2FnZUZvcm1hdChtZXNzYWdlLCBsb2NhbGVzLCBvdmVycmlkZUZvcm1hdHMsIF9fYXNzaWduKHtcbiAgICAgICAgZm9ybWF0dGVyczoge1xuICAgICAgICAgIGdldE51bWJlckZvcm1hdDogZ2V0TnVtYmVyRm9ybWF0LFxuICAgICAgICAgIGdldERhdGVUaW1lRm9ybWF0OiBnZXREYXRlVGltZUZvcm1hdCxcbiAgICAgICAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXNcbiAgICAgICAgfVxuICAgICAgfSwgb3B0cyB8fCB7fSkpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLm1lc3NhZ2UpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRSZWxhdGl2ZVRpbWVGb3JtYXQ6IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IChSZWxhdGl2ZVRpbWVGb3JtYXQuYmluZC5hcHBseShSZWxhdGl2ZVRpbWVGb3JtYXQsIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICB9LCB7XG4gICAgICBjYWNoZTogY3JlYXRlRmFzdE1lbW9pemVDYWNoZShjYWNoZS5yZWxhdGl2ZVRpbWUpLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWdpZXMudmFyaWFkaWNcbiAgICB9KSxcbiAgICBnZXRQbHVyYWxSdWxlczogZ2V0UGx1cmFsUnVsZXMsXG4gICAgZ2V0TGlzdEZvcm1hdDogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKExpc3RGb3JtYXQuYmluZC5hcHBseShMaXN0Rm9ybWF0LCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcmdzKSkpKCk7XG4gICAgfSwge1xuICAgICAgY2FjaGU6IGNyZWF0ZUZhc3RNZW1vaXplQ2FjaGUoY2FjaGUubGlzdCksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pLFxuICAgIGdldERpc3BsYXlOYW1lczogbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgKERpc3BsYXlOYW1lcy5iaW5kLmFwcGx5KERpc3BsYXlOYW1lcywgX19zcHJlYWRBcnJheShbdm9pZCAwXSwgYXJncykpKSgpO1xuICAgIH0sIHtcbiAgICAgIGNhY2hlOiBjcmVhdGVGYXN0TWVtb2l6ZUNhY2hlKGNhY2hlLmRpc3BsYXlOYW1lcyksXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ2llcy52YXJpYWRpY1xuICAgIH0pXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgbmFtZSwgb25FcnJvcikge1xuICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdHMgJiYgZm9ybWF0c1t0eXBlXTtcbiAgdmFyIGZvcm1hdDtcblxuICBpZiAoZm9ybWF0VHlwZSkge1xuICAgIGZvcm1hdCA9IGZvcm1hdFR5cGVbbmFtZV07XG4gIH1cblxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIG9uRXJyb3IobmV3IFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IoXCJObyBcIiArIHR5cGUgKyBcIiBmb3JtYXQgbmFtZWQ6IFwiICsgbmFtZSkpO1xufSIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAZm9ybWF0anMvZWNtYTQwMi1hYnN0cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX0lOVExfQ09ORklHIGFzIENPUkVfREVGQVVMVF9JTlRMX0NPTkZJRyB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnRJbnRsQ29udGV4dChpbnRsKSB7XG4gIGludmFyaWFudChpbnRsLCAnW1JlYWN0IEludGxdIENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGBpbnRsYCBvYmplY3QuICcgKyAnPEludGxQcm92aWRlcj4gbmVlZHMgdG8gZXhpc3QgaW4gdGhlIGNvbXBvbmVudCBhbmNlc3RyeS4nKTtcbn1cbmV4cG9ydCB2YXIgREVGQVVMVF9JTlRMX0NPTkZJRyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBDT1JFX0RFRkFVTFRfSU5UTF9DT05GSUcpLCB7XG4gIHRleHRDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50XG59KTtcbi8qKlxuICogVGFrZXMgYSBgZm9ybWF0WE1MRWxlbWVudEZuYCwgYW5kIGNvbXBvc2VzIGl0IGluIGZ1bmN0aW9uLCB3aGljaCBwYXNzZXNcbiAqIGFyZ3VtZW50IGBwYXJ0c2AgdGhyb3VnaCwgYXNzaWduaW5nIHVuaXF1ZSBrZXkgdG8gZWFjaCBwYXJ0LCB0byBwcmV2ZW50XG4gKiBcIkVhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCJcIiBSZWFjdCBlcnJvci5cbiAqIEBwYXJhbSBmb3JtYXRYTUxFbGVtZW50Rm5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVW5pcXVlS2V5c1RvUGFydHMoZm9ybWF0WE1MRWxlbWVudEZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFydHMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgcmV0dXJuIGZvcm1hdFhNTEVsZW1lbnRGbihSZWFjdC5DaGlsZHJlbi50b0FycmF5KHBhcnRzKSk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghb2JqQSB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgdmFyIGxlbiA9IGFLZXlzLmxlbmd0aDtcblxuICBpZiAoYktleXMubGVuZ3RoICE9PSBsZW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGFLZXlzW2ldO1xuXG4gICAgaWYgKG9iakFba2V5XSAhPT0gb2JqQltrZXldIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2luamVjdEludGwnO1xuaW1wb3J0IHsgaW52YXJpYW50SW50bENvbnRleHQgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJbnRsKCkge1xuICB2YXIgaW50bCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gIGludmFyaWFudEludGxDb250ZXh0KGludGwpO1xuICByZXR1cm4gaW50bDtcbn0iLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VJbnRsIGZyb20gJy4vdXNlSW50bCc7XG52YXIgRGlzcGxheU5hbWU7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWUpIHtcbiAgRGlzcGxheU5hbWVbXCJmb3JtYXREYXRlXCJdID0gXCJGb3JtYXR0ZWREYXRlXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0VGltZVwiXSA9IFwiRm9ybWF0dGVkVGltZVwiO1xuICBEaXNwbGF5TmFtZVtcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyXCI7XG4gIERpc3BsYXlOYW1lW1wiZm9ybWF0TGlzdFwiXSA9IFwiRm9ybWF0dGVkTGlzdFwiOyAvLyBOb3RlIHRoYXQgdGhpcyBEaXNwbGF5TmFtZSBpcyB0aGUgbG9jYWxlIGRpc3BsYXkgbmFtZSwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGhcbiAgLy8gdGhlIG5hbWUgb2YgdGhlIGVudW0sIHdoaWNoIGlzIGZvciBSZWFjdCBjb21wb25lbnQgZGlzcGxheSBuYW1lIGluIGRldiB0b29scy5cblxuICBEaXNwbGF5TmFtZVtcImZvcm1hdERpc3BsYXlOYW1lXCJdID0gXCJGb3JtYXR0ZWREaXNwbGF5TmFtZVwiO1xufSkoRGlzcGxheU5hbWUgfHwgKERpc3BsYXlOYW1lID0ge30pKTtcblxudmFyIERpc3BsYXlOYW1lUGFydHM7XG5cbihmdW5jdGlvbiAoRGlzcGxheU5hbWVQYXJ0cykge1xuICBEaXNwbGF5TmFtZVBhcnRzW1wiZm9ybWF0RGF0ZVwiXSA9IFwiRm9ybWF0dGVkRGF0ZVBhcnRzXCI7XG4gIERpc3BsYXlOYW1lUGFydHNbXCJmb3JtYXRUaW1lXCJdID0gXCJGb3JtYXR0ZWRUaW1lUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdE51bWJlclwiXSA9IFwiRm9ybWF0dGVkTnVtYmVyUGFydHNcIjtcbiAgRGlzcGxheU5hbWVQYXJ0c1tcImZvcm1hdExpc3RcIl0gPSBcIkZvcm1hdHRlZExpc3RQYXJ0c1wiO1xufSkoRGlzcGxheU5hbWVQYXJ0cyB8fCAoRGlzcGxheU5hbWVQYXJ0cyA9IHt9KSk7XG5cbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyUGFydHMgPSBmdW5jdGlvbiBGb3JtYXR0ZWROdW1iZXJQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TnVtYmVyVG9QYXJ0cyh2YWx1ZSwgZm9ybWF0UHJvcHMpKTtcbn07XG5Gb3JtYXR0ZWROdW1iZXJQYXJ0cy5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWROdW1iZXJQYXJ0cyc7XG5leHBvcnQgdmFyIEZvcm1hdHRlZExpc3RQYXJ0cyA9IGZ1bmN0aW9uIEZvcm1hdHRlZExpc3RQYXJ0cyhwcm9wcykge1xuICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcywgW1widmFsdWVcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuKGludGwuZm9ybWF0TGlzdFRvUGFydHModmFsdWUsIGZvcm1hdFByb3BzKSk7XG59O1xuRm9ybWF0dGVkTnVtYmVyUGFydHMuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTnVtYmVyUGFydHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQobmFtZSkge1xuICB2YXIgQ29tcG9uZW50UGFydHMgPSBmdW5jdGlvbiBDb21wb25lbnRQYXJ0cyhwcm9wcykge1xuICAgIHZhciBpbnRsID0gdXNlSW50bCgpO1xuXG4gICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGZvcm1hdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTtcblxuICAgIHZhciBkYXRlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKHZhbHVlIHx8IDApIDogdmFsdWU7XG4gICAgdmFyIGZvcm1hdHRlZFBhcnRzID0gbmFtZSA9PT0gJ2Zvcm1hdERhdGUnID8gaW50bC5mb3JtYXREYXRlVG9QYXJ0cyhkYXRlLCBmb3JtYXRQcm9wcykgOiBpbnRsLmZvcm1hdFRpbWVUb1BhcnRzKGRhdGUsIGZvcm1hdFByb3BzKTtcbiAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUGFydHMpO1xuICB9O1xuXG4gIENvbXBvbmVudFBhcnRzLmRpc3BsYXlOYW1lID0gRGlzcGxheU5hbWVQYXJ0c1tuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudFBhcnRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudChuYW1lKSB7XG4gIHZhciBDb21wb25lbnQgPSBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMpIHtcbiAgICB2YXIgaW50bCA9IHVzZUludGwoKTtcblxuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBmb3JtYXRQcm9wcyA9IF9fcmVzdChwcm9wcyAvLyBUT0RPOiBmaXggVFMgdHlwZSBkZWZpbml0aW9uIGZvciBsb2NhbGVNYXRjaGVyIHVwc3RyZWFtXG4gICAgLCBbXCJ2YWx1ZVwiLCBcImNoaWxkcmVuXCJdKTsgLy8gVE9ETzogZml4IFRTIHR5cGUgZGVmaW5pdGlvbiBmb3IgbG9jYWxlTWF0Y2hlciB1cHN0cmVhbVxuXG5cbiAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBpbnRsW25hbWVdKHZhbHVlLCBmb3JtYXRQcm9wcyk7XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHZhciBUZXh0ID0gaW50bC50ZXh0Q29tcG9uZW50IHx8IFJlYWN0LkZyYWdtZW50O1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRleHQsIG51bGwsIGZvcm1hdHRlZFZhbHVlKTtcbiAgfTtcblxuICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBEaXNwbGF5TmFtZVtuYW1lXTtcbiAgcmV0dXJuIENvbXBvbmVudDtcbn0iLCJpbXBvcnQgeyBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQsIGNyZWF0ZUZvcm1hdHRlZERhdGVUaW1lUGFydHNDb21wb25lbnQgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL2NyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCc7XG5leHBvcnQgeyBjcmVhdGVJbnRsQ2FjaGUsIFVuc3VwcG9ydGVkRm9ybWF0dGVyRXJyb3IsIEludmFsaWRDb25maWdFcnJvciwgTWlzc2luZ0RhdGFFcnJvciwgTWVzc2FnZUZvcm1hdEVycm9yLCBNaXNzaW5nVHJhbnNsYXRpb25FcnJvciwgSW50bEVycm9yQ29kZSBhcyBSZWFjdEludGxFcnJvckNvZGUsIEludGxFcnJvciBhcyBSZWFjdEludGxFcnJvciB9IGZyb20gJ0Bmb3JtYXRqcy9pbnRsJztcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVNZXNzYWdlcyhtc2dzKSB7XG4gIHJldHVybiBtc2dzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU1lc3NhZ2UobXNnKSB7XG4gIHJldHVybiBtc2c7XG59XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluamVjdEludGwsIFByb3ZpZGVyIGFzIFJhd0ludGxQcm92aWRlciwgQ29udGV4dCBhcyBJbnRsQ29udGV4dCB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvaW5qZWN0SW50bCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3VzZUludGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnRsUHJvdmlkZXIsIGNyZWF0ZUludGwgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3Byb3ZpZGVyJzsgLy8gSU1QT1JUQU5UOiBFeHBsaWNpdCBoZXJlIHRvIHByZXZlbnQgYXBpLWV4dHJhY3RvciBmcm9tIG91dHB1dGluZyBgaW1wb3J0KCcuL3NyYy90eXBlcycpLkN1c3RvbUZvcm1hdENvbmZpZ2BcblxuZXhwb3J0IHZhciBGb3JtYXR0ZWREYXRlID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXREYXRlJyk7XG5leHBvcnQgdmFyIEZvcm1hdHRlZFRpbWUgPSBjcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQoJ2Zvcm1hdFRpbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTnVtYmVyID0gY3JlYXRlRm9ybWF0dGVkQ29tcG9uZW50KCdmb3JtYXROdW1iZXInKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkTGlzdCA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0TGlzdCcpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWREaXNwbGF5TmFtZSA9IGNyZWF0ZUZvcm1hdHRlZENvbXBvbmVudCgnZm9ybWF0RGlzcGxheU5hbWUnKTtcbmV4cG9ydCB2YXIgRm9ybWF0dGVkRGF0ZVBhcnRzID0gY3JlYXRlRm9ybWF0dGVkRGF0ZVRpbWVQYXJ0c0NvbXBvbmVudCgnZm9ybWF0RGF0ZScpO1xuZXhwb3J0IHZhciBGb3JtYXR0ZWRUaW1lUGFydHMgPSBjcmVhdGVGb3JtYXR0ZWREYXRlVGltZVBhcnRzQ29tcG9uZW50KCdmb3JtYXRUaW1lJyk7XG5leHBvcnQgeyBGb3JtYXR0ZWROdW1iZXJQYXJ0cywgRm9ybWF0dGVkTGlzdFBhcnRzIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9jcmVhdGVGb3JtYXR0ZWRDb21wb25lbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRSZWxhdGl2ZVRpbWUgfSBmcm9tICcuL3NyYy9jb21wb25lbnRzL3JlbGF0aXZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkUGx1cmFsIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9wbHVyYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAnLi9zcmMvY29tcG9uZW50cy9tZXNzYWdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybWF0dGVkRGF0ZVRpbWVSYW5nZSB9IGZyb20gJy4vc3JjL2NvbXBvbmVudHMvZGF0ZVRpbWVSYW5nZSc7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4424\n')},4839:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;\n}\n\nvar React = __webpack_require__(7294);\n\nvar React__default = _interopDefault(React);\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect = /*#__PURE__*/function (_PureComponent) {\n _inheritsLoose(SideEffect, _PureComponent);\n\n function SideEffect() {\n return _PureComponent.apply(this, arguments) || this;\n } // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n\n\n SideEffect.peek = function peek() {\n return state;\n };\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n var _proto = SideEffect.prototype;\n\n _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.PureComponent);\n\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWRlLWVmZmVjdC9saWIvaW5kZXguanM/YjBkYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLElBQU87O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0ODM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQoZXgpIHtcbiAgcmV0dXJuIGV4ICYmIHR5cGVvZiBleCA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGV4ID8gZXhbJ2RlZmF1bHQnXSA6IGV4O1xufVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxuZnVuY3Rpb24gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50LCBtYXBTdGF0ZU9uU2VydmVyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWR1Y2VQcm9wc1RvU3RhdGUgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtYXBTdGF0ZU9uU2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbWFwU3RhdGVPblNlcnZlciB0byBlaXRoZXIgYmUgdW5kZWZpbmVkIG9yIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAobWFwU3RhdGVPblNlcnZlcikge1xuICAgICAgICBzdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfSAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICAvLyBFeHBvc2UgY2FuVXNlRE9NIHNvIHRlc3RzIGNhbiBtb25rZXlwYXRjaCBpdFxuXG5cbiAgICAgIFNpZGVFZmZlY3QucGVlayA9IGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIFNpZGVFZmZlY3QucmV3aW5kID0gZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgICAgICBpZiAoU2lkZUVmZmVjdC5jYW5Vc2VET00pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgb25seSBjYWxsIHJld2luZCgpIG9uIHRoZSBzZXJ2ZXIuIENhbGwgcGVlaygpIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVjb3JkZWRTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBzdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgICAgICByZXR1cm4gcmVjb3JkZWRTdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBfcHJvdG8gPSBTaWRlRWZmZWN0LnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnB1c2godGhpcyk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgaW5kZXggPSBtb3VudGVkSW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShSZWFjdC5QdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiY2FuVXNlRE9NXCIsIGNhblVzZURPTSk7XG5cbiAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aXRoU2lkZUVmZmVjdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4839\n")},4734:function(module){"use strict";eval("\n\nmodule.exports = function (string, separator) {\n if (!(typeof string === 'string' && typeof separator === 'string')) {\n throw new TypeError('Expected the arguments to be of type `string`');\n }\n\n if (separator === '') {\n return [string];\n }\n\n var separatorIndex = string.indexOf(separator);\n\n if (separatorIndex === -1) {\n return [string];\n }\n\n return [string.slice(0, separatorIndex), string.slice(separatorIndex + separator.length)];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zcGxpdC1vbi1maXJzdC9pbmRleC5qcz8wMGI4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0NzM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHJpbmcsIHNlcGFyYXRvcikge1xuICBpZiAoISh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygc2VwYXJhdG9yID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgYXJndW1lbnRzIHRvIGJlIG9mIHR5cGUgYHN0cmluZ2AnKTtcbiAgfVxuXG4gIGlmIChzZXBhcmF0b3IgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtzdHJpbmddO1xuICB9XG5cbiAgdmFyIHNlcGFyYXRvckluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc2VwYXJhdG9yKTtcblxuICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtzdHJpbmddO1xuICB9XG5cbiAgcmV0dXJuIFtzdHJpbmcuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBzdHJpbmcuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKV07XG59OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4734\n")},8936:function(module){"use strict";eval('\n\nmodule.exports = function (str) {\n return encodeURIComponent(str).replace(/[!\'()*]/g, function (x) {\n return "%".concat(x.charCodeAt(0).toString(16).toUpperCase());\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zdHJpY3QtdXJpLWVuY29kZS9pbmRleC5qcz9jMWRmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI4OTM2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gXCIlXCIuY29uY2F0KHguY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSk7XG4gIH0pO1xufTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8936\n')},6445:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n// Trussworks GridContainer won't allow it to span 100% of the page, so\n// this works around it and tries to hide the complexity in component\nvar J40MainGridContainer=function J40MainGridContainer(_ref){var children=_ref.children,_ref$fullWidth=_ref.fullWidth,fullWidth=_ref$fullWidth===void 0?false:_ref$fullWidth,_ref$blueBackground=_ref.blueBackground,blueBackground=_ref$blueBackground===void 0?false:_ref$blueBackground,_ref$className=_ref.className,className=_ref$className===void 0?'':_ref$className,dataCy=_ref.dataCy;// is it a blue background strip?\nclassName+=blueBackground?'j40-main-grid-blue-bk ':'';return fullWidth?/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\",{className:className},children):/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.GridContainer,{containerSize:'desktop-lg',className:className,\"data-cy\":dataCy},children);};/* harmony default export */ __webpack_exports__[\"Z\"] = (J40MainGridContainer);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyLnRzeD84ODk4Il0sIm5hbWVzIjpbIko0ME1haW5HcmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJmdWxsV2lkdGgiLCJibHVlQmFja2dyb3VuZCIsImNsYXNzTmFtZSIsImRhdGFDeSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQVlBLEdBQU1BLHFCQUFvQixDQUFHLFFBQXZCQSxxQkFBdUIsTUFNQSxJQUwzQkMsU0FLMkIsTUFMM0JBLFFBSzJCLHFCQUozQkMsU0FJMkIsQ0FKM0JBLFNBSTJCLHlCQUpmLEtBSWUseUNBSDNCQyxjQUcyQixDQUgzQkEsY0FHMkIsOEJBSFYsS0FHVSx5Q0FGM0JDLFNBRTJCLENBRjNCQSxTQUUyQix5QkFGZixFQUVlLGdCQUQzQkMsTUFDMkIsTUFEM0JBLE1BQzJCLENBQzNCO0FBQ0FELFNBQVMsRUFBS0QsY0FBYyxDQUFHLHdCQUFILENBQThCLEVBQTFELENBQ0EsTUFBT0QsVUFBUyxjQUNkLHdEQUNFLFNBQVMsQ0FBRUUsU0FEYixFQUVHSCxRQUZILENBRGMsY0FNZCxpREFBQyxrRUFBRCxFQUNFLGFBQWEsQ0FBRSxZQURqQixDQUVFLFNBQVMsQ0FBRUcsU0FGYixDQUdFLFVBQVNDLE1BSFgsRUFJR0osUUFKSCxDQU5GLENBYUQsQ0F0QkQsQ0F3QkEseURBQWVELG9CQUFmIiwiZmlsZSI6IjY0NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUcnVzc3dvcmtzIEdyaWRDb250YWluZXIgd29uJ3QgYWxsb3cgaXQgdG8gc3BhbiAxMDAlIG9mIHRoZSBwYWdlLCBzb1xuLy8gdGhpcyB3b3JrcyBhcm91bmQgaXQgYW5kIHRyaWVzIHRvIGhpZGUgdGhlIGNvbXBsZXhpdHkgaW4gY29tcG9uZW50XG5pbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZENvbnRhaW5lcn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbnRlcmZhY2UgSUo0ME1haW5HcmlkQ29udGFpbmVyIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZSxcbiAgZnVsbFdpZHRoPzogYm9vbGVhbixcbiAgYmx1ZUJhY2tncm91bmQ/OiBib29sZWFuLFxuICBjbGFzc05hbWU/OiBzdHJpbmcsXG4gIGRhdGFDeT86IHN0cmluZyxcbn1cblxuY29uc3QgSjQwTWFpbkdyaWRDb250YWluZXIgPSAoe1xuICBjaGlsZHJlbixcbiAgZnVsbFdpZHRoID0gZmFsc2UsXG4gIGJsdWVCYWNrZ3JvdW5kID0gZmFsc2UsXG4gIGNsYXNzTmFtZSA9ICcnLFxuICBkYXRhQ3ksXG59OiBJSjQwTWFpbkdyaWRDb250YWluZXIpID0+IHtcbiAgLy8gaXMgaXQgYSBibHVlIGJhY2tncm91bmQgc3RyaXA/XG4gIGNsYXNzTmFtZSArPSAoYmx1ZUJhY2tncm91bmQgPyAnajQwLW1haW4tZ3JpZC1ibHVlLWJrICcgOiAnJyk7XG4gIHJldHVybiBmdWxsV2lkdGggPyAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApIDogKFxuICAgIDxHcmlkQ29udGFpbmVyXG4gICAgICBjb250YWluZXJTaXplPXsnZGVza3RvcC1sZyd9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgIGRhdGEtY3k9e2RhdGFDeX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9HcmlkQ29udGFpbmVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSjQwTWFpbkdyaWRDb250YWluZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6445\n")},5614:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ layout; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/images/icon.png\n/* harmony default export */ var icon = ("data:image/png;base64,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");\n// EXTERNAL MODULE: ./src/data/copy/common.tsx\nvar common = __webpack_require__(4489);\n;// CONCATENATED MODULE: ./src/components/J40Header.tsx\n// @ts-ignore\nvar J40Header=function J40Header(){var intl=(0,gatsby_plugin_intl.useIntl)();var _useState=(0,react.useState)(false),mobileNavOpen=_useState[0],setMobileNavOpen=_useState[1];var titleL1=intl.formatMessage(common/* HEADER.TITLE_LINE_1 */.yf.TITLE_LINE_1);var titleL2=intl.formatMessage(common/* HEADER.TITLE_LINE_2 */.yf.TITLE_LINE_2);var toggleMobileNav=function toggleMobileNav(){return setMobileNavOpen(function(prevOpen){return!prevOpen;});};var headerLinks=function headerLinks(){// static map of all possible menu items. Originally, it was all strings,\n// but we need to handle both onsite and offsite links.\nvar menuData=new Map([[\'about\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/\',key:\'about\',activeClassName:"usa-current",className:\'j40-header\',"data-cy":\'nav-link-about\'},intl.formatMessage(common/* HEADER.ABOUT */.yf.ABOUT))],[\'cejst\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/cejst\',key:\'cejst\',activeClassName:"usa-current",className:\'j40-header\',"data-cy":\'nav-link-explore-the-tool\'},intl.formatMessage(common/* HEADER.EXPLORE */.yf.EXPLORE))],[\'methodology\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/methodology\',key:\'methodology\',activeClassName:"usa-current",className:\'j40-header\',"data-cy":\'nav-link-methodology\'},intl.formatMessage(common/* HEADER.METHODOLOGY */.yf.METHODOLOGY))],[\'contact\',/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\'/contact\',key:\'contact\',activeClassName:"usa-current",className:\'j40-header\',"data-cy":\'nav-link-contact\'},intl.formatMessage(common/* HEADER.CONTACT */.yf.CONTACT))]]);var menu=[\'about\',\'cejst\',\'methodology\',\'contact\'];return menu.map(function(key){return menuData.get(key);});};return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Header,{basic:true,role:\'banner\',className:\'usa-header j40-header\'},/*#__PURE__*/react.createElement(lib.GovBanner,null),/*#__PURE__*/react.createElement("div",{className:"usa-nav-container"},/*#__PURE__*/react.createElement("div",{className:"usa-navbar"},/*#__PURE__*/react.createElement("div",{className:"usa-logo"},/*#__PURE__*/react.createElement("img",{className:"j40-sitelogo",src:icon,alt:titleL1+" "+titleL2}),/*#__PURE__*/react.createElement("span",{className:\'usa-logo__text j40-title\'},/*#__PURE__*/react.createElement("span",{className:\'j40-title-line1\'},titleL1),/*#__PURE__*/react.createElement("br",null),/*#__PURE__*/react.createElement("span",{className:\'j40-title-line2\'},titleL2),/*#__PURE__*/react.createElement(lib.Tag,{className:\'j40\'},"Beta"))),/*#__PURE__*/react.createElement(lib.NavMenuButton,{key:\'mobileMenuButton\',onClick:toggleMobileNav,label:"Menu"})),/*#__PURE__*/react.createElement(lib.PrimaryNav,{items:headerLinks(),mobileExpanded:mobileNavOpen,onToggleMobileNav:toggleMobileNav,className:\'j40-header\'}))));};/* harmony default export */ var components_J40Header = (J40Header);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./cypress/integration/common/helpers.js\nvar helpers = __webpack_require__(2900);\n;// CONCATENATED MODULE: ./src/images/eop-seal.svg\n/* harmony default export */ var eop_seal = (__webpack_require__.p + "static/eop-seal-12e5dcc4453cb3321515f50874d1f1f6.svg");\n;// CONCATENATED MODULE: ./src/components/J40Footer.tsx\n// @ts-ignore\nvar J40Footer=function J40Footer(){var intl=(0,gatsby_plugin_intl.useIntl)();var NAVLINKS=[[intl.formatMessage(common/* FOOTER.CONTACT */.lW.CONTACT),/*#__PURE__*/react.createElement(lib.Address,{key:\'footeraddress\',className:\'j40-footer-address\',size:\'big\',items:[common/* FOOTER_CEQ_ADDRESS.NAME */.cP.NAME,common/* FOOTER_CEQ_ADDRESS.STREET */.cP.STREET,common/* FOOTER_CEQ_ADDRESS.CITY_STATE */.cP.CITY_STATE,common/* FOOTER_CEQ_ADDRESS.PHONE */.cP.PHONE]})],[intl.formatMessage(common/* FOOTER.MORE_INFO */.lW.MORE_INFO),/*#__PURE__*/react.createElement("a",{className:\'footer-link-first-child\',key:\'whitehouselink2\',href:\'https://www.whitehouse.gov/\',target:\'_blank\',rel:\'noreferrer\',"data-cy":(0,helpers/* hyphenizeString */.d)(common/* FOOTER.WHITEHOUSE.defaultMessage */.lW.WHITEHOUSE.defaultMessage)},intl.formatMessage(common/* FOOTER.WHITEHOUSE */.lW.WHITEHOUSE)),/*#__PURE__*/react.createElement("a",{key:"foialink",target:\'_blank\',rel:\'noreferrer\',href:\'https://www.whitehouse.gov/ceq/foia\',"data-cy":(0,helpers/* hyphenizeString */.d)(common/* FOOTER.FOIA.defaultMessage */.lW.FOIA.defaultMessage)},intl.formatMessage(common/* FOOTER.FOIA */.lW.FOIA)),/*#__PURE__*/react.createElement("a",{key:\'privacylink\',target:\'_blank\',rel:\'noreferrer\',href:\'https://www.whitehouse.gov/privacy/\',"data-cy":(0,helpers/* hyphenizeString */.d)(common/* FOOTER.PRIVACY.defaultMessage */.lW.PRIVACY.defaultMessage)},intl.formatMessage(common/* FOOTER.PRIVACY */.lW.PRIVACY))],[intl.formatMessage(common/* FOOTER.QUESTIONS */.lW.QUESTIONS),/*#__PURE__*/react.createElement("a",{className:\'footer-link-first-child\',key:\'contactlink\',href:\'https://www.usa.gov/\',"data-cy":(0,helpers/* hyphenizeString */.d)(common/* FOOTER.CONTACT_LINK.defaultMessage */.lW.CONTACT_LINK.defaultMessage)},intl.formatMessage(common/* FOOTER.CONTACT_LINK */.lW.CONTACT_LINK))]];// see https://designsystem.digital.gov/components/footer/\nreturn/*#__PURE__*/ (// we cannot use trussworks Footer because it doesn\'t layout correct\n// and there\'s no easy way to override. It comes down to the\n// `className="mobile-lg:grid-col-6 desktop:grid-col-3">` needs to be\n// `className="mobile-lg:grid-col-12 desktop:grid-col-4">` ugh.\nreact.createElement("footer",{className:\'j40-footer\'},/*#__PURE__*/react.createElement("div",{className:"usa-footer__primary-section pb2","data-cy":"footer-primary-block"},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement("div",{className:\'grid-row tablet-lg:grid-col4\'},NAVLINKS.map(function(links,i){return/*#__PURE__*/react.createElement("div",{key:"linkSection-"+i,className:"mobile-lg:grid-col-12 desktop:grid-col-4"},/*#__PURE__*/react.createElement(NavSection,{links:links}));})))),/*#__PURE__*/react.createElement("div",{className:"usa-footer__secondary-section"},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Logo,{size:"medium",key:\'logoimg\',image:/*#__PURE__*/react.createElement("img",{className:\'usa-footer__logo-img\',src:eop_seal,alt:intl.formatMessage(common/* FOOTER.LOGO_ALT */.lW.LOGO_ALT)}),heading:/*#__PURE__*/react.createElement("div",{className:\'j40-footer-ceq-font\'},intl.formatMessage(common/* FOOTER.TITLE */.lW.TITLE))})))));};var NavSection=function NavSection(_ref){var links=_ref.links;var primaryLinkOrHeading=links[0],secondaryLinks=links.slice(1);return/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("div",{className:"j40-h4"},primaryLinkOrHeading),/*#__PURE__*/react.createElement(lib.NavList,{type:"footerSecondary",items:secondaryLinks}));};/* harmony default export */ var components_J40Footer = (J40Footer);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: ./node_modules/react-side-effect/lib/index.js\nvar react_side_effect_lib = __webpack_require__(4839);\nvar react_side_effect_lib_default = /*#__PURE__*/__webpack_require__.n(react_side_effect_lib);\n// EXTERNAL MODULE: ./node_modules/react-fast-compare/index.js\nvar react_fast_compare = __webpack_require__(2993);\nvar react_fast_compare_default = /*#__PURE__*/__webpack_require__.n(react_fast_compare);\n// EXTERNAL MODULE: ./node_modules/gatsby/dist/internal-plugins/bundle-optimisations/polyfills/object-assign.js\nvar object_assign = __webpack_require__(6494);\nvar object_assign_default = /*#__PURE__*/__webpack_require__.n(object_assign);\n;// CONCATENATED MODULE: ./node_modules/react-helmet/es/Helmet.js\n\n\n\n\n\nvar ATTRIBUTE_NAMES = {\n BODY: "bodyAttributes",\n HTML: "htmlAttributes",\n TITLE: "titleAttributes"\n};\nvar TAG_NAMES = {\n BASE: "base",\n BODY: "body",\n HEAD: "head",\n HTML: "html",\n LINK: "link",\n META: "meta",\n NOSCRIPT: "noscript",\n SCRIPT: "script",\n STYLE: "style",\n TITLE: "title"\n};\nvar VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\nvar TAG_PROPERTIES = {\n CHARSET: "charset",\n CSS_TEXT: "cssText",\n HREF: "href",\n HTTPEQUIV: "http-equiv",\n INNER_HTML: "innerHTML",\n ITEM_PROP: "itemprop",\n NAME: "name",\n PROPERTY: "property",\n REL: "rel",\n SRC: "src",\n TARGET: "target"\n};\nvar REACT_TAG_MAP = {\n accesskey: "accessKey",\n charset: "charSet",\n class: "className",\n contenteditable: "contentEditable",\n contextmenu: "contextMenu",\n "http-equiv": "httpEquiv",\n itemprop: "itemProp",\n tabindex: "tabIndex"\n};\nvar HELMET_PROPS = {\n DEFAULT_TITLE: "defaultTitle",\n DEFER: "defer",\n ENCODE_SPECIAL_CHARACTERS: "encodeSpecialCharacters",\n ON_CHANGE_CLIENT_STATE: "onChangeClientState",\n TITLE_TEMPLATE: "titleTemplate"\n};\nvar HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\nvar SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\nvar HELMET_ATTRIBUTE = "data-react-helmet";\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n};\n\nvar classCallCheck = function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n};\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/\'/g, "'");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return Array.isArray(innermostTitle) ? innermostTitle.join("") : innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, HELMET_PROPS.DEFAULT_TITLE);\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== "undefined";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[TAG_NAMES.BASE] !== "undefined";\n }).map(function (props) {\n return props[TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n\n if (typeof props[tagName] !== "undefined") {\n warn("Helmet: " + tagName + " should be of type \\"Array\\". Instead found type \\"" + _typeof(props[tagName]) + "\\"");\n }\n\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase(); // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === "canonical") && !(lowerCaseAttributeKey === TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === "stylesheet")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n } // Special case for innerHTML which doesn\'t work lowercased\n\n\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === TAG_PROPERTIES.INNER_HTML || attributeKey === TAG_PROPERTIES.CSS_TEXT || attributeKey === TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n }); // Update seen tags with tags from this instance\n\n var keys = Object.keys(instanceSeenTags);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = object_assign_default()({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([TAG_PROPERTIES.HREF, TAG_PROPERTIES.TARGET], propsList),\n bodyAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(TAG_NAMES.LINK, [TAG_PROPERTIES.REL, TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(TAG_NAMES.META, [TAG_PROPERTIES.NAME, TAG_PROPERTIES.CHARSET, TAG_PROPERTIES.HTTPEQUIV, TAG_PROPERTIES.PROPERTY, TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(TAG_NAMES.NOSCRIPT, [TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(TAG_NAMES.SCRIPT, [TAG_PROPERTIES.SRC, TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(TAG_NAMES.STYLE, [TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== "undefined" ? window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : __webpack_require__.g.requestAnimationFrame || rafPolyfill;\nvar cancelAnimationFrame = typeof window !== "undefined" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : __webpack_require__.g.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === "function" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n updateAttributes(TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(TAG_NAMES.HTML, htmlAttributes);\n updateTitle(title, titleAttributes);\n var tagUpdates = {\n baseTag: updateTags(TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(TAG_NAMES.STYLE, styleTags)\n };\n var addedTags = {};\n var removedTags = {};\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n cb && cb();\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join("") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== "undefined" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(",") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || "";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(HELMET_ATTRIBUTE) !== attributeKeys.join(",")) {\n elementTag.setAttribute(HELMET_ATTRIBUTE, attributeKeys.join(","));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + "[" + HELMET_ATTRIBUTE + "]");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === "undefined" ? "" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(HELMET_ATTRIBUTE, "true"); // Remove a duplicate tag from domTagstoRemove, so it isn\'t cleared.\n\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== "undefined" ? key + "=\\"" + attributes[key] + "\\"" : "" + key;\n return str ? str + " " + attr : attr;\n }, "");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\" " + attributeString + ">" + encodeSpecialCharacters(flattenedTitle, encode) + "" : "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\">" + encodeSpecialCharacters(flattenedTitle, encode) + "";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === TAG_PROPERTIES.INNER_HTML || attribute === TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === "undefined" ? attribute : attribute + "=\\"" + encodeSpecialCharacters(tag[attribute], encode) + "\\"";\n return string ? string + " " + attr : attr;\n }, "");\n var tagContent = tag.innerHTML || tag.cssText || "";\n var isSelfClosing = SELF_CLOSING_TAGS.indexOf(type) === -1;\n return str + "<" + type + " " + HELMET_ATTRIBUTE + "=\\"true\\" " + attributeHtml + (isSelfClosing ? "/>" : ">" + tagContent + "");\n }, "");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(props).reduce(function (obj, key) {\n obj[HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps; // assigning into an array to define toString function on it\n\n\n var initProps = (_initProps = {\n key: title\n }, _initProps[HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n return [react.createElement(TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[HELMET_ATTRIBUTE] = true, _mappedTag);\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === TAG_PROPERTIES.INNER_HTML || mappedAttribute === TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = {\n __html: content\n };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n return react.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n\n case ATTRIBUTE_NAMES.BODY:\n case ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? "" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(TAG_NAMES.TITLE, {\n title: title,\n titleAttributes: titleAttributes\n }, encode)\n };\n};\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n classCallCheck(this, HelmetWrapper);\n return possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !react_fast_compare_default()(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error("<" + child.type + " /> elements are self-closing and can not contain children. Refer to our API for more information.");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _babelHelpers$extends;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n return _extends({}, arrayTypeChildren, (_babelHelpers$extends = {}, _babelHelpers$extends[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _babelHelpers$extends));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _babelHelpers$extends2, _babelHelpers$extends3;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case TAG_NAMES.TITLE:\n return _extends({}, newProps, (_babelHelpers$extends2 = {}, _babelHelpers$extends2[child.type] = nestedChildren, _babelHelpers$extends2.titleAttributes = _extends({}, newChildProps), _babelHelpers$extends2));\n\n case TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_babelHelpers$extends3 = {}, _babelHelpers$extends3[child.type] = _extends({}, newChildProps), _babelHelpers$extends3));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _babelHelpers$extends4;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_babelHelpers$extends4 = {}, _babelHelpers$extends4[arrayChildName] = arrayTypeChildren[arrayChildName], _babelHelpers$extends4));\n });\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (false) {}\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n react.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = objectWithoutProperties(_child$props, ["children"]);\n var newChildProps = convertReactPropstoHtmlAttributes(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case TAG_NAMES.LINK:\n case TAG_NAMES.META:\n case TAG_NAMES.NOSCRIPT:\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = objectWithoutProperties(_props, ["children"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return react.createElement(Component, newProps);\n };\n\n createClass(HelmetWrapper, null, [{\n key: "canUseDOM",\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {"target": "_blank", "href": "http://mysite.com/"}\n * @param {Object} bodyAttributes: {"className": "root"}\n * @param {String} defaultTitle: "Default Title"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {"lang": "en", "amp": undefined}\n * @param {Array} link: [{"rel": "canonical", "href": "http://mysite.com/example"}]\n * @param {Array} meta: [{"name": "description", "content": "Test description"}]\n * @param {Array} noscript: [{"innerHTML": " console.log(newState)"\n * @param {Array} script: [{"type": "text/javascript", "src": "http://mysite.com/js/test.js"}]\n * @param {Array} style: [{"type": "text/css", "cssText": "div { display: block; color: blue; }"}]\n * @param {String} title: "Title"\n * @param {Object} titleAttributes: {"itemprop": "name"}\n * @param {String} titleTemplate: "MySite.com - %s"\n */\n set: function set$$1(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(react.Component), _class.propTypes = {\n base: (prop_types_default()).object,\n bodyAttributes: (prop_types_default()).object,\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n defaultTitle: (prop_types_default()).string,\n defer: (prop_types_default()).bool,\n encodeSpecialCharacters: (prop_types_default()).bool,\n htmlAttributes: (prop_types_default()).object,\n link: prop_types_default().arrayOf((prop_types_default()).object),\n meta: prop_types_default().arrayOf((prop_types_default()).object),\n noscript: prop_types_default().arrayOf((prop_types_default()).object),\n onChangeClientState: (prop_types_default()).func,\n script: prop_types_default().arrayOf((prop_types_default()).object),\n style: prop_types_default().arrayOf((prop_types_default()).object),\n title: (prop_types_default()).string,\n titleAttributes: (prop_types_default()).object,\n titleTemplate: (prop_types_default()).string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = mapStateOnServer({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: "",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = react_side_effect_lib_default()(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\n/* harmony default export */ var es_Helmet = ((/* unused pure expression or super */ null && (HelmetExport)));\n\n;// CONCATENATED MODULE: ./src/components/layout.tsx\nvar Layout=function Layout(_ref){var children=_ref.children,location=_ref.location,title=_ref.title;// @ts-ignore\nreturn/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(HelmetExport,{defer:false},/*#__PURE__*/react.createElement("html",{lang:"en"}),/*#__PURE__*/react.createElement("title",null,title),/*#__PURE__*/react.createElement("script",{async:true,type:"text/javascript",id:"_fed_an_ua_tag",src:"https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency=DOI&sitetopic=cejst&enhlink=true"})),/*#__PURE__*/react.createElement(FlagContext/* URLFlagProvider */.RE,{location:location},/*#__PURE__*/react.createElement(components_J40Header,null),/*#__PURE__*/react.createElement("main",{id:\'main-content\'},children),/*#__PURE__*/react.createElement(components_J40Footer,null)));};/* harmony default export */ var layout = (Layout);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvaWNvbi5wbmc/NWJiYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0o0MEhlYWRlci50c3g/ZmI1ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9pbWFnZXMvZW9wLXNlYWwuc3ZnP2UyNDQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBGb290ZXIudHN4P2RkNzkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtaGVsbWV0L2VzL0hlbG1ldC5qcz8xZjBmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvbGF5b3V0LnRzeD9mNDM4Il0sIm5hbWVzIjpbIko0MEhlYWRlciIsImludGwiLCJ1c2VJbnRsIiwidXNlU3RhdGUiLCJtb2JpbGVOYXZPcGVuIiwic2V0TW9iaWxlTmF2T3BlbiIsInRpdGxlTDEiLCJmb3JtYXRNZXNzYWdlIiwiQ09NTU9OX0NPUFkiLCJ0aXRsZUwyIiwidG9nZ2xlTW9iaWxlTmF2IiwicHJldk9wZW4iLCJoZWFkZXJMaW5rcyIsIm1lbnVEYXRhIiwiTWFwIiwibWVudSIsIm1hcCIsImtleSIsImdldCIsInNpdGVMb2dvIiwiSjQwRm9vdGVyIiwiTkFWTElOS1MiLCJoeXBoZW5pemVTdHJpbmciLCJsaW5rcyIsImkiLCJ3aGl0ZWhvdXNlSWNvbiIsIk5hdlNlY3Rpb24iLCJwcmltYXJ5TGlua09ySGVhZGluZyIsInNlY29uZGFyeUxpbmtzIiwiTGF5b3V0IiwiY2hpbGRyZW4iLCJsb2NhdGlvbiIsInRpdGxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEseUNBQWUsZ0JBQWdCLDRqRzs7OztBQ1UvQjtBQUlBLEdBQU1BLFVBQVMsQ0FBRyxRQUFaQSxVQUFZLEVBQU0sQ0FDdEIsR0FBTUMsS0FBSSxD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O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDLFNBQVM7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxpQkFBaUI7OztBQUdqQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsVUFBVSxtQkFBbUI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsV0FBVyxtQkFBbUI7QUFDOUIsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsNEJBQU87QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdEQUFnRCxpR0FBaUc7QUFDeks7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCLHdDQUF3QywyR0FBMkc7O0FBRS9LO0FBQ0EsNEJBQTRCO0FBQzVCLHVDQUF1QztBQUN2QyxXQUFXOztBQUVYO0FBQ0EsNEJBQTRCO0FBQzVCLHVDQUF1QztBQUN2QyxXQUFXO0FBQ1g7O0FBRUEsd0JBQXdCLHdDQUF3QyxrREFBa0Q7QUFDbEg7O0FBRUE7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7O0FBRUEsdUNBQXVDLGlEQUFpRDtBQUN4RixPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLFVBQVUsS0FBcUMsRUFBRSxFQWdCMUM7O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxzQkFBc0I7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBOztBQUVBLGFBQWEsbUJBQW1CO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsaUJBQWlCLE9BQU8sa0JBQWtCO0FBQzFDLGlCQUFpQixPQUFPO0FBQ3hCLGlCQUFpQixRQUFRO0FBQ3pCLGlCQUFpQixRQUFRO0FBQ3pCLGlCQUFpQixPQUFPLGtCQUFrQjtBQUMxQyxpQkFBaUIsTUFBTSxTQUFTLHdEQUF3RDtBQUN4RixpQkFBaUIsTUFBTSxTQUFTLHFEQUFxRDtBQUNyRixpQkFBaUIsTUFBTSxhQUFhLHVEQUF1RDtBQUMzRixpQkFBaUIsU0FBUztBQUMxQixpQkFBaUIsTUFBTSxXQUFXLGlFQUFpRTtBQUNuRyxpQkFBaUIsTUFBTSxVQUFVLHFDQUFxQyxnQkFBZ0IsYUFBYSxFQUFFLEVBQUU7QUFDdkcsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU8sbUJBQW1CO0FBQzNDLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRyxDQUFDLGVBQWU7QUFDbkIsVUFBVSw2QkFBZ0I7QUFDMUIsb0JBQW9CLDZCQUFnQjtBQUNwQyxjQUFjLDhCQUFtQixFQUFFLDRCQUFpQixDQUFDLDJCQUFjLEdBQUcsMkJBQWM7QUFDcEYsa0JBQWtCLDZCQUFnQjtBQUNsQyxXQUFXLDJCQUFjO0FBQ3pCLDZCQUE2QiwyQkFBYztBQUMzQyxvQkFBb0IsNkJBQWdCO0FBQ3BDLFVBQVUsNEJBQWlCLENBQUMsNkJBQWdCO0FBQzVDLFVBQVUsNEJBQWlCLENBQUMsNkJBQWdCO0FBQzVDLGNBQWMsNEJBQWlCLENBQUMsNkJBQWdCO0FBQ2hELHlCQUF5QiwyQkFBYztBQUN2QyxZQUFZLDRCQUFpQixDQUFDLDZCQUFnQjtBQUM5QyxXQUFXLDRCQUFpQixDQUFDLDZCQUFnQjtBQUM3QyxXQUFXLDZCQUFnQjtBQUMzQixxQkFBcUIsNkJBQWdCO0FBQ3JDLG1CQUFtQiw2QkFBZ0I7QUFDbkMsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QiwrQkFBYztBQUN0QztBQUNBO0FBQ0EsOENBQWUsNERBQVksSUFBQzs7O0FDeDJCNUIsR0FBTVMsT0FBTSxDQUFHLFFBQVRBLE9BQVMsTUFBK0MsSUFBN0NDLFNBQTZDLE1BQTdDQSxRQUE2QyxDQUFuQ0MsUUFBbUMsTUFBbkNBLFFBQW1DLENBQXpCQyxLQUF5QixNQUF6QkEsS0FBeUIsQ0FDNUQ7QUFDQSxtQkFDRSxxREFDRSxvQkFBQyxZQUFELEVBQVEsS0FBSyxDQUFFLEtBQWYsZUFDRSw0QkFBTSxJQUFJLENBQUMsSUFBWCxFQURGLGNBRUUsaUNBQVFBLEtBQVIsQ0FGRixjQUdFLDhCQUFRLEtBQUssS0FBYixDQUNFLElBQUksQ0FBQyxpQkFEUCxDQUVFLEVBQUUsQ0FBQyxnQkFGTCxDQUdFLEdBQUcsQ0FBQyx5R0FITixFQUhGLENBREYsY0FVRSxvQkFBQyxtQ0FBRCxFQUFpQixRQUFRLENBQUVELFFBQTNCLGVBQ0Usb0JBQUMsb0JBQUQsTUFERixjQUVFLDRCQUFNLEVBQUUsQ0FBRSxjQUFWLEVBQ0dELFFBREgsQ0FGRixjQUtFLG9CQUFDLG9CQUFELE1BTEYsQ0FWRixDQURGLENBb0JELENBdEJELENBd0JBLDJDQUFlRCxNQUFmIiwiZmlsZSI6IjU2MTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSElBQUFCSENBWUFBQURiYWhOakFBQUFDWEJJV1hNQUFCWWxBQUFXSlFGSlVpVHdBQUFJMlVsRVFWUjRuTzFkdTNJaVJ4VHQzVkl1VEVpeStBdk1acE9ZWlltaHJDL0FPRE9SRVJIWlNoa1JaaU5DQTErQUMySU1SSk1adnNBaUlhVEVGNnlycDA3THJXRWUvUmFET1ZYVWFuZEhtcGsrMDdmdlBmZE02OTIzYjkrSUNlVExyUndocElRUC9icUlENDluUXNnR2Y2ZC9QaDNXdzQyUkM3aFE3UDBhSGNNMnhwWGlpUkF5TFhqektYL0h5a1NDdUR0Q1NBV2ZEeHBEdVNLRUxPbm5zQjR1WFZLeTkydDNFWVAwN1BJYTRyRDNhd05DeUc4eC83Mmw0ODZ1VlpySWZMbEZiN3hKQ1BuSjB2VWY2V0FTUWdZMlp5c0lITVE4Z0Y4TDNyeHQ2OXhwMlBzMU9rbEdBbVA4UXFZd2tmbHlpNUwzb0RuelpMR2o1enlzaHlPVFAzVHYxK2k5L0pGeTJLc24zaFgyZnEwRUVuOFFQT1c0NE0yYnFVUmlCc1k5dWE1d3hBeDkwRDBmMXB4L0JBOTNTdWJlcjdVeFdXNGx2dTFZOE9hNVdDS3hCb3BNYjVlZ003UjlXQStucXVmYyt6VjZUejlMZkFzbHMxbnc1amJEZkJGai9VbnhSM3lPSkJLemNDVDVaTGdFVFk2YWgvWHdTZmFjZTcrMmtRaGJERUZFS0hoejdZZ1F1cFlpWnFETWd4V0ZVeUx6NVJhZDNyK2J2R0JMT0dKMlNxMmZlNyttVTIvdE1QQmFtUzBTclRzREJESjhmRVZrdnR5U0RUdm5nREVJRlJyWXZWOTdNckRlczh3NktKa0szand4TW1EbXNUTHR6bkNrMnhXOGVmR0Z5SXlTeUJBa0pTSmtLcXlSb2xqRkhLZTY3b25pdnVETkJ3R1IrWEtMaG9zdmxrOW9HMGVRbVppVTdQMGFuUlYvWmZ4ZUdZTFNnMzc5N3JzZmY1Vkp4ODhkb21RbUtTWlp3UXVKRkRlSTJhYXhndHdWWGp1WUhsdTBWSmZlb3VhdEpCMUVWUnVvSjFsZFNvSnd5djhEblpGVEE3WGlEb3YvU0ZSV3k1ZGJOaE9BanlMWFlYRzl0QVVhY2U0SzN2eEVqNlpFTGpVV1pDTVNHaWZBdHhWcXZDamNIOWJEZ2NpQlVGT3lVRzZ0UUdKa1FuZURkcElza1VjUUtEUllhVUMyU1IrR1ViN2NxaUE4NmhDYUV6MlFoaWlJQk5NekZVQ0NzUTZIMGpEZW94YVNBVXYxalpBWUJtMWpIZFpEdW83ZTR5WlVJRldzSTFUUlVQK25qWHZTQUsyUmkya2tFdGJHeXBkYm91RlZ1RjR6QVlUY3FVTEUrRjVGdmlQL2xTZTZFVUVYWTh4QzRYdGdST1l3TTVNdTNpbUpQQ1RyM05WaFBVek1Xa1dBVmxmVFFVSFBjTVR5TXBBaGtJRlhkbko0RXNOWm5MRVdrZzdRRDAzcklkSnJMWnA4Mk5BZmJGdklyQWtuOVoxWU4yUVJKWnJuT09zRGNXMjlTRUsrM0NyaHhxTnEwQ0Nyc3hreFFDcXp0NVFVaUQwaXVXUWFyYkd4TldhK2NnbTAyVXJjS2FkdlllS0NHRjdraEk0b2JKanB6R2FET3BORVhuR0s5OWN4dVF4Y2lid1EzSmk4RGFneXZERzVGRkpaMk9MK3pCbVVsZXE5L3d2cVBiK0lNb2lWVklFS05ldDZyeElsWFlNeUU3eExHZ1UweStTbU1DZzdUVnJxUGI4U0dxVGxyT3VkaFVHNTN2T1QybTFCbHM2dVZjV2dYTUVUWXF0cklOMUpVUUVJSEVXVU1rSGRQT3Q2YjFZMzEzdCtYRTBmUmlEU1VETFAzYUM4aFJoaDFLQmM3L2tpNHNKNDF2V2FLY2NZQjBMcFZDTENmWjExdmJhSVFUbnV5WFVKWTQ1ekROUkdzSmluSW5yVFZhaXQ5M3dWRytweDF2VXlhVkJ1NnFoTktldE9GTFpZaTZ3bFpYaTRCaHBqSFd0UXJweHhmNDZ3bWFJaXg5Vjd2cXBCK1dIVzlZeTI3ckFXdGcwWTN5SU55aUxyeHpuZ0NES2x4T1o2ejljMktNKzZubGFJci9kOEpzUmZEY29jeG9mMVVEZ3BxZmQ4a3dibHFVaTVncG5IKzVOTTVodTdXZGNydmdnQ0dUWW8vNHl1aUdpdmRHTmdJRzh4VnNGNDFYditqbk1NYnJnM3RvbGlsMFFHUVhTNEpJUHlEbTJzeE5vVDllUEZHSlJaaVhTSkJ1VlNtdXhYNy9sWmZqMkM0VldkYTh1Z3ZFV29DYzhPcHNQYUNqZTNDRFdKVmc4NkFQV2VUekpNNW1OWWVUSmxVR1orazZsb2pjY1psTzhzMUtwQ0J1VU16c3dqQklxVFRQM2NETXFtSkVCaGczSzk1MmNsUDFpQnhNaGxneEtwOGtLTE5VT1dJVTMzVWViYUZLVXhWeEFTSTNRTXlsYTZBM1IySDliRG9rdURNa0xWMlJxVVJSUWxWbjZJeWxhdURjcXFteVFJclpGUlNHaHZ1Y1FZczFEYW9DelNFWGhMZzdKTStEZGlVRWFyeTJYYmpxbEZVZ1F5Q0J1VXNTYStXZWRjd3FDY1drZktBRE8wYWNtZ1RCRE9wN0J2S0k5djFnektTV0ZQZWNzV1VTQXBZdVprMVV4L3hWbEt0TnpsUEs0R1pRMmdpNUdMTUpueFlHOXVQOW5zYVY0TnloZUNxNi8xUW1EYTE4cHY5aERlZEplQmVWcWZyNXZ1cHFNenFUTFZpNDBuSGI5cHY3RjRGYWExUWl2ckEzSWZsYXh1eTk1T2dxL1ZhV2JjbVZUNWgrNjUzMWljemNQVm1WU1Rkb3NNZHZ6cU54Ykt2dFlpOTc2Z2pScHJ5L1lUc0VscVoxSXRvYXdLWjUrQmZ0eHZMSXhhTUdYUm1WUkZCUDF0djdFSWtqNFpYMnNGQkxwMDFZMUJxTkVTQ0NRdVV5TEl1TjlZT1BlMUlwVEt1QmNmKzQzRmc0aXZWWGN2VVJOWW9jdWlUU2dHNmtsd0dYQktabWRTVlpFSGovM0dJdDdYU3VUZjNYZUJGWGFDVkY3SE9wT3E3RDBGMWt1MkZ0a0FIcTRIalczVlBrYVdIelNKZ1pCK2JuMDZHaFgrcHRvck1tUVZ5T3F3Tk1SdE9wT3FEU2NGSmJHSkNLR3pOOTdwak16QTdza01TcTd6enFTcW80Q3NrQWhwaFhoa3lrM2tIQ2JHK1hQWTE1b1ZjeklQcVNaeVoxSjlOakI0TzJTOFM5RnlCUWtXRStCTjd1RVRySkc4cnpXTEpGSjhRVDByK2dyQjBrRG0vWUh0WDllWlZFbkNicGhNZzdXWktBWk41NERJREpQSVFJbFowaEpKZ0V3VFpyTXdQcjFSVnI5bFJGTFBqa3c2ZnU0UWFuNTNKbFViWkxwR2NLOHNtNzVCekxaQll0d2UzN1kyM1NWWWUwWUNYdDJtd0padDU0eVQrdGFVcjVWd25lNWxXbk9YRTlkWm85YjBnS1p1S29qYUxZdGszdmNiaXhNemxxNnYxWWdOaE5OdlRVV0hYMFM5dG9LYTVqa2dlTGNsTGt0K0g1RnBpZUlyTnZCNzBCVzM2ZXc1cklkdGhOMUhEUnNrUTF3TDdRUUlVZmVhNTdNTk90YWxwRktIemtqWmpQV0l0NTZzZVhrUWVuVWtLMkduT1FQcVBKbmZFdWNDSzdTcVVtdFZab2NVZmZsekN4S2RiSEtVc2h0a0VwUjlyU2s5UUZlUVZwQVlrU0p0blRmeHRTYllOT09nN1d0Rkl0UTJLS0dKZ2lhTUF4VUprUGUxeGpWYWllenZuN0lCd1U2TTBDOXdrUUZFYlpzN0tiTkcrb2w5UXdaUm9qblRCSmxRa0ZwT3VBSVVxRUhNTEJGNlkxa1ZFTG9yWE1ta09sTjMzT2E3V3VUeHlKd2RFcUcyR2ZHd09iVm1jRjRmcHFkR2JiNGIza1J4WTZXdlNRajVGMElsbE5MUTIwY1pBQUFBQUVsRlRrU3VRbUNDXCIiLCJpbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rLCB1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtcbiAgSGVhZGVyLFxuICBOYXZNZW51QnV0dG9uLFxuICBQcmltYXJ5TmF2LFxuICBHb3ZCYW5uZXIsXG4gIFRhZyxcbn0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgc2l0ZUxvZ28gZnJvbSAnLi4vLi4vc3JjL2ltYWdlcy9pY29uLnBuZyc7XG5pbXBvcnQgKiBhcyBDT01NT05fQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvY29tbW9uJztcblxuY29uc3QgSjQwSGVhZGVyID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBbbW9iaWxlTmF2T3Blbiwgc2V0TW9iaWxlTmF2T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgdGl0bGVMMSA9IGludGwuZm9ybWF0TWVzc2FnZShDT01NT05fQ09QWS5IRUFERVIuVElUTEVfTElORV8xKTtcbiAgY29uc3QgdGl0bGVMMiA9IGludGwuZm9ybWF0TWVzc2FnZShDT01NT05fQ09QWS5IRUFERVIuVElUTEVfTElORV8yKTtcblxuICBjb25zdCB0b2dnbGVNb2JpbGVOYXYgPSAoKTogdm9pZCA9PlxuICAgIHNldE1vYmlsZU5hdk9wZW4oKHByZXZPcGVuKSA9PiAhcHJldk9wZW4pO1xuXG4gIGNvbnN0IGhlYWRlckxpbmtzID0gKCkgPT4ge1xuICAgIC8vIHN0YXRpYyBtYXAgb2YgYWxsIHBvc3NpYmxlIG1lbnUgaXRlbXMuIE9yaWdpbmFsbHksIGl0IHdhcyBhbGwgc3RyaW5ncyxcbiAgICAvLyBidXQgd2UgbmVlZCB0byBoYW5kbGUgYm90aCBvbnNpdGUgYW5kIG9mZnNpdGUgbGlua3MuXG4gICAgY29uc3QgbWVudURhdGEgPSBuZXcgTWFwPHN0cmluZywgSlNYLkVsZW1lbnQ+KFtcbiAgICAgIFsnYWJvdXQnLFxuICAgICAgICA8TGlua1xuICAgICAgICAgIHRvPXsnLyd9XG4gICAgICAgICAga2V5PXsnYWJvdXQnfVxuICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cInVzYS1jdXJyZW50XCJcbiAgICAgICAgICBjbGFzc05hbWU9eydqNDAtaGVhZGVyJ31cbiAgICAgICAgICBkYXRhLWN5PXsnbmF2LWxpbmstYWJvdXQnfT5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkhFQURFUi5BQk9VVCl9XG4gICAgICAgIDwvTGluaz4sXG4gICAgICBdLFxuICAgICAgWydjZWpzdCcsXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgdG89eycvY2Vqc3QnfVxuICAgICAgICAgIGtleT17J2NlanN0J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9XG4gICAgICAgICAgZGF0YS1jeT17J25hdi1saW5rLWV4cGxvcmUtdGhlLXRvb2wnfT5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkhFQURFUi5FWFBMT1JFKX1cbiAgICAgICAgPC9MaW5rPixcbiAgICAgIF0sXG4gICAgICBbJ21ldGhvZG9sb2d5JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy9tZXRob2RvbG9neSd9XG4gICAgICAgICAga2V5PXsnbWV0aG9kb2xvZ3knfVxuICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZT1cInVzYS1jdXJyZW50XCJcbiAgICAgICAgICBjbGFzc05hbWU9eydqNDAtaGVhZGVyJ31cbiAgICAgICAgICBkYXRhLWN5PXsnbmF2LWxpbmstbWV0aG9kb2xvZ3knfT5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkhFQURFUi5NRVRIT0RPTE9HWSl9XG4gICAgICAgIDwvTGluaz4sXG4gICAgICBdLFxuICAgICAgWydjb250YWN0JyxcbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz17Jy9jb250YWN0J31cbiAgICAgICAgICBrZXk9eydjb250YWN0J31cbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWU9XCJ1c2EtY3VycmVudFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9XG4gICAgICAgICAgZGF0YS1jeT17J25hdi1saW5rLWNvbnRhY3QnfT5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkhFQURFUi5DT05UQUNUKX1cbiAgICAgICAgPC9MaW5rPixcbiAgICAgIF0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBtZW51ID1bJ2Fib3V0JywgJ2NlanN0JywgJ21ldGhvZG9sb2d5JywgJ2NvbnRhY3QnXTtcbiAgICByZXR1cm4gbWVudS5tYXAoKGtleSkgPT4gbWVudURhdGEuZ2V0KGtleSkpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxIZWFkZXJcbiAgICAgICAgYmFzaWM9e3RydWV9IHJvbGU9eydiYW5uZXInfVxuICAgICAgICBjbGFzc05hbWU9eyd1c2EtaGVhZGVyIGo0MC1oZWFkZXInfT5cbiAgICAgICAgPEdvdkJhbm5lci8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhLW5hdi1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYS1uYXZiYXJcIj5cbiAgICAgICAgICAgIHsvKiBSZW1vdmluZyBoMSBmcm9tIGxvZ28gZWFzZSB0cmFuc2l0aW9uIHRvIFVTV0RTIHRva2VucyBpbiBoZWFkZXJzICovfVxuICAgICAgICAgICAgey8qIGh0dHBzOi8vd2VoYXZlemVhbC5jb20vYmxvZy93ZWItZGV2ZWxvcG1lbnQvMjAxNi8wMS8xMi9zaG91bGQtaS11c2UtdGhlLWgxLXRhZy1mb3ItbXktd2Vic2l0ZS1sb2dvICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1c2EtbG9nb1wiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImo0MC1zaXRlbG9nb1wiIHNyYz17c2l0ZUxvZ299IGFsdD17YCR7dGl0bGVMMX0gJHt0aXRsZUwyfWB9IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J3VzYS1sb2dvX190ZXh0IGo0MC10aXRsZSd9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC10aXRsZS1saW5lMSd9Pnt0aXRsZUwxfTwvc3Bhbj48YnIvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2o0MC10aXRsZS1saW5lMid9Pnt0aXRsZUwyfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8VGFnIGNsYXNzTmFtZT17J2o0MCd9PkJldGE8L1RhZz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8TmF2TWVudUJ1dHRvblxuICAgICAgICAgICAgICBrZXk9eydtb2JpbGVNZW51QnV0dG9uJ31cbiAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlTW9iaWxlTmF2fVxuICAgICAgICAgICAgICBsYWJlbD1cIk1lbnVcIi8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPFByaW1hcnlOYXZcbiAgICAgICAgICAgIGl0ZW1zPXtoZWFkZXJMaW5rcygpfVxuICAgICAgICAgICAgbW9iaWxlRXhwYW5kZWQ9e21vYmlsZU5hdk9wZW59XG4gICAgICAgICAgICBvblRvZ2dsZU1vYmlsZU5hdj17dG9nZ2xlTW9iaWxlTmF2fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWhlYWRlcid9XG4gICAgICAgICAgPlxuICAgICAgICAgIDwvUHJpbWFyeU5hdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0hlYWRlcj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEo0MEhlYWRlcjtcbiIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvZW9wLXNlYWwtMTJlNWRjYzQ0NTNjYjMzMjE1MTVmNTA4NzRkMWYxZjYuc3ZnXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIExvZ28sXG59IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbmltcG9ydCB7TmF2TGlzdH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgSjQwTWFpbkdyaWRDb250YWluZXIgZnJvbSAnLi9KNDBNYWluR3JpZENvbnRhaW5lcic7XG5pbXBvcnQge2h5cGhlbml6ZVN0cmluZ30gZnJvbSAnLi4vLi4vY3lwcmVzcy9pbnRlZ3JhdGlvbi9jb21tb24vaGVscGVycyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aGl0ZWhvdXNlSWNvbiBmcm9tICcuLi9pbWFnZXMvZW9wLXNlYWwuc3ZnJztcbmltcG9ydCAqIGFzIENPTU1PTl9DT1BZIGZyb20gJy4uL2RhdGEvY29weS9jb21tb24nO1xuXG5jb25zdCBKNDBGb290ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG5cbiAgY29uc3QgTkFWTElOS1MgPSBbXG4gICAgW1xuICAgICAgaW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5DT05UQUNUKSxcbiAgICAgIDxBZGRyZXNzXG4gICAgICAgIGtleT17J2Zvb3RlcmFkZHJlc3MnfVxuICAgICAgICBjbGFzc05hbWU9eydqNDAtZm9vdGVyLWFkZHJlc3MnfVxuICAgICAgICBzaXplPXsnYmlnJ31cbiAgICAgICAgaXRlbXM9e1tcbiAgICAgICAgICBDT01NT05fQ09QWS5GT09URVJfQ0VRX0FERFJFU1MuTkFNRSxcbiAgICAgICAgICBDT01NT05fQ09QWS5GT09URVJfQ0VRX0FERFJFU1MuU1RSRUVULFxuICAgICAgICAgIENPTU1PTl9DT1BZLkZPT1RFUl9DRVFfQUREUkVTUy5DSVRZX1NUQVRFLFxuICAgICAgICAgIENPTU1PTl9DT1BZLkZPT1RFUl9DRVFfQUREUkVTUy5QSE9ORSxcbiAgICAgICAgXX1cbiAgICAgIC8+LFxuICAgIF0sXG4gICAgW1xuICAgICAgaW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5NT1JFX0lORk8pLFxuICAgICAgPGFcbiAgICAgICAgY2xhc3NOYW1lPXsnZm9vdGVyLWxpbmstZmlyc3QtY2hpbGQnfVxuICAgICAgICBrZXk9eyd3aGl0ZWhvdXNlbGluazInfVxuICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvJ31cbiAgICAgICAgdGFyZ2V0PXsnX2JsYW5rJ31cbiAgICAgICAgcmVsPXsnbm9yZWZlcnJlcid9XG4gICAgICAgIGRhdGEtY3k9e2h5cGhlbml6ZVN0cmluZyhDT01NT05fQ09QWS5GT09URVIuV0hJVEVIT1VTRS5kZWZhdWx0TWVzc2FnZSl9PlxuICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5XSElURUhPVVNFKX1cbiAgICAgIDwvYT4sXG4gICAgICA8YVxuICAgICAgICBrZXk9XCJmb2lhbGlua1wiXG4gICAgICAgIHRhcmdldD17J19ibGFuayd9XG4gICAgICAgIHJlbD17J25vcmVmZXJyZXInfVxuICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cud2hpdGVob3VzZS5nb3YvY2VxL2ZvaWEnfVxuICAgICAgICBkYXRhLWN5PXtoeXBoZW5pemVTdHJpbmcoQ09NTU9OX0NPUFkuRk9PVEVSLkZPSUEuZGVmYXVsdE1lc3NhZ2UpfT5cbiAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShDT01NT05fQ09QWS5GT09URVIuRk9JQSl9XG4gICAgICA8L2E+LFxuICAgICAgPGFcbiAgICAgICAga2V5PXsncHJpdmFjeWxpbmsnfVxuICAgICAgICB0YXJnZXQ9eydfYmxhbmsnfVxuICAgICAgICByZWw9eydub3JlZmVycmVyJ31cbiAgICAgICAgaHJlZj17J2h0dHBzOi8vd3d3LndoaXRlaG91c2UuZ292L3ByaXZhY3kvJ31cbiAgICAgICAgZGF0YS1jeT17aHlwaGVuaXplU3RyaW5nKENPTU1PTl9DT1BZLkZPT1RFUi5QUklWQUNZLmRlZmF1bHRNZXNzYWdlKX0+XG4gICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuRk9PVEVSLlBSSVZBQ1kpfVxuICAgICAgPC9hPixcbiAgICBdLFxuICAgIFtcbiAgICAgIGludGwuZm9ybWF0TWVzc2FnZShDT01NT05fQ09QWS5GT09URVIuUVVFU1RJT05TKSxcbiAgICAgIDxhXG4gICAgICAgIGNsYXNzTmFtZT17J2Zvb3Rlci1saW5rLWZpcnN0LWNoaWxkJ31cbiAgICAgICAga2V5PXsnY29udGFjdGxpbmsnfVxuICAgICAgICBocmVmPXsnaHR0cHM6Ly93d3cudXNhLmdvdi8nfVxuICAgICAgICBkYXRhLWN5PXtoeXBoZW5pemVTdHJpbmcoQ09NTU9OX0NPUFkuRk9PVEVSLkNPTlRBQ1RfTElOSy5kZWZhdWx0TWVzc2FnZSl9PlxuICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5DT05UQUNUX0xJTkspfVxuICAgICAgPC9hPixcbiAgICBdLFxuICBdO1xuXG4gIC8vIHNlZSBodHRwczovL2Rlc2lnbnN5c3RlbS5kaWdpdGFsLmdvdi9jb21wb25lbnRzL2Zvb3Rlci9cbiAgcmV0dXJuIChcbiAgICAvLyB3ZSBjYW5ub3QgdXNlIHRydXNzd29ya3MgRm9vdGVyIGJlY2F1c2UgaXQgZG9lc24ndCBsYXlvdXQgY29ycmVjdFxuICAgIC8vIGFuZCB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIG92ZXJyaWRlLiBJdCBjb21lcyBkb3duIHRvIHRoZVxuICAgIC8vIGBjbGFzc05hbWU9XCJtb2JpbGUtbGc6Z3JpZC1jb2wtNiBkZXNrdG9wOmdyaWQtY29sLTNcIj5gIG5lZWRzIHRvIGJlXG4gICAgLy8gYGNsYXNzTmFtZT1cIm1vYmlsZS1sZzpncmlkLWNvbC0xMiBkZXNrdG9wOmdyaWQtY29sLTRcIj5gIHVnaC5cbiAgICA8Zm9vdGVyIGNsYXNzTmFtZT17J2o0MC1mb290ZXInfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhLWZvb3Rlcl9fcHJpbWFyeS1zZWN0aW9uIHBiMlwiIGRhdGEtY3k9e2Bmb290ZXItcHJpbWFyeS1ibG9ja2B9PlxuICAgICAgICA8SjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9eydncmlkLXJvdyB0YWJsZXQtbGc6Z3JpZC1jb2w0J30+XG4gICAgICAgICAgICB7TkFWTElOS1MubWFwKChsaW5rcywgaSkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAga2V5PXtgbGlua1NlY3Rpb24tJHtpfWB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibW9iaWxlLWxnOmdyaWQtY29sLTEyIGRlc2t0b3A6Z3JpZC1jb2wtNFwiPlxuICAgICAgICAgICAgICAgIDxOYXZTZWN0aW9uIGxpbmtzPXtsaW5rc30gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYS1mb290ZXJfX3NlY29uZGFyeS1zZWN0aW9uXCI+XG4gICAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgICA8TG9nb1xuICAgICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgICAgICBrZXk9eydsb2dvaW1nJ31cbiAgICAgICAgICAgIGltYWdlPXtcbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J3VzYS1mb290ZXJfX2xvZ28taW1nJ31cbiAgICAgICAgICAgICAgICBzcmM9e3doaXRlaG91c2VJY29ufVxuICAgICAgICAgICAgICAgIGFsdD17aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5MT0dPX0FMVCl9Lz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRpbmc9e1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1mb290ZXItY2VxLWZvbnQnfT5cbiAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKENPTU1PTl9DT1BZLkZPT1RFUi5USVRMRSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvb3Rlcj5cbiAgKTtcbn07XG5cbmNvbnN0IE5hdlNlY3Rpb24gPSAoe1xuICBsaW5rcyxcbn06IHtcbiAgbGlua3M6IFJlYWN0LlJlYWN0Tm9kZVtdXG59KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgY29uc3QgW3ByaW1hcnlMaW5rT3JIZWFkaW5nLCAuLi5zZWNvbmRhcnlMaW5rc10gPSBsaW5rcztcbiAgcmV0dXJuIChcbiAgICA8c2VjdGlvbj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiajQwLWg0XCI+e3ByaW1hcnlMaW5rT3JIZWFkaW5nfTwvZGl2PlxuICAgICAgPE5hdkxpc3QgdHlwZT1cImZvb3RlclNlY29uZGFyeVwiIGl0ZW1zPXtzZWNvbmRhcnlMaW5rc30gLz5cbiAgICA8L3NlY3Rpb24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBGb290ZXI7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTaWRlRWZmZWN0IGZyb20gJ3JlYWN0LXNpZGUtZWZmZWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ3JlYWN0LWZhc3QtY29tcGFyZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG9iamVjdEFzc2lnbiBmcm9tICdvYmplY3QtYXNzaWduJztcbnZhciBBVFRSSUJVVEVfTkFNRVMgPSB7XG4gIEJPRFk6IFwiYm9keUF0dHJpYnV0ZXNcIixcbiAgSFRNTDogXCJodG1sQXR0cmlidXRlc1wiLFxuICBUSVRMRTogXCJ0aXRsZUF0dHJpYnV0ZXNcIlxufTtcbnZhciBUQUdfTkFNRVMgPSB7XG4gIEJBU0U6IFwiYmFzZVwiLFxuICBCT0RZOiBcImJvZHlcIixcbiAgSEVBRDogXCJoZWFkXCIsXG4gIEhUTUw6IFwiaHRtbFwiLFxuICBMSU5LOiBcImxpbmtcIixcbiAgTUVUQTogXCJtZXRhXCIsXG4gIE5PU0NSSVBUOiBcIm5vc2NyaXB0XCIsXG4gIFNDUklQVDogXCJzY3JpcHRcIixcbiAgU1RZTEU6IFwic3R5bGVcIixcbiAgVElUTEU6IFwidGl0bGVcIlxufTtcbnZhciBWQUxJRF9UQUdfTkFNRVMgPSBPYmplY3Qua2V5cyhUQUdfTkFNRVMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gVEFHX05BTUVTW25hbWVdO1xufSk7XG52YXIgVEFHX1BST1BFUlRJRVMgPSB7XG4gIENIQVJTRVQ6IFwiY2hhcnNldFwiLFxuICBDU1NfVEVYVDogXCJjc3NUZXh0XCIsXG4gIEhSRUY6IFwiaHJlZlwiLFxuICBIVFRQRVFVSVY6IFwiaHR0cC1lcXVpdlwiLFxuICBJTk5FUl9IVE1MOiBcImlubmVySFRNTFwiLFxuICBJVEVNX1BST1A6IFwiaXRlbXByb3BcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIFBST1BFUlRZOiBcInByb3BlcnR5XCIsXG4gIFJFTDogXCJyZWxcIixcbiAgU1JDOiBcInNyY1wiLFxuICBUQVJHRVQ6IFwidGFyZ2V0XCJcbn07XG52YXIgUkVBQ1RfVEFHX01BUCA9IHtcbiAgYWNjZXNza2V5OiBcImFjY2Vzc0tleVwiLFxuICBjaGFyc2V0OiBcImNoYXJTZXRcIixcbiAgY2xhc3M6IFwiY2xhc3NOYW1lXCIsXG4gIGNvbnRlbnRlZGl0YWJsZTogXCJjb250ZW50RWRpdGFibGVcIixcbiAgY29udGV4dG1lbnU6IFwiY29udGV4dE1lbnVcIixcbiAgXCJodHRwLWVxdWl2XCI6IFwiaHR0cEVxdWl2XCIsXG4gIGl0ZW1wcm9wOiBcIml0ZW1Qcm9wXCIsXG4gIHRhYmluZGV4OiBcInRhYkluZGV4XCJcbn07XG52YXIgSEVMTUVUX1BST1BTID0ge1xuICBERUZBVUxUX1RJVExFOiBcImRlZmF1bHRUaXRsZVwiLFxuICBERUZFUjogXCJkZWZlclwiLFxuICBFTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTOiBcImVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzXCIsXG4gIE9OX0NIQU5HRV9DTElFTlRfU1RBVEU6IFwib25DaGFuZ2VDbGllbnRTdGF0ZVwiLFxuICBUSVRMRV9URU1QTEFURTogXCJ0aXRsZVRlbXBsYXRlXCJcbn07XG52YXIgSFRNTF9UQUdfTUFQID0gT2JqZWN0LmtleXMoUkVBQ1RfVEFHX01BUCkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldXSA9IGtleTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcbnZhciBTRUxGX0NMT1NJTkdfVEFHUyA9IFtUQUdfTkFNRVMuTk9TQ1JJUFQsIFRBR19OQU1FUy5TQ1JJUFQsIFRBR19OQU1FUy5TVFlMRV07XG52YXIgSEVMTUVUX0FUVFJJQlVURSA9IFwiZGF0YS1yZWFjdC1oZWxtZXRcIjtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIGNsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxudmFyIG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxudmFyIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzID0gZnVuY3Rpb24gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoc3RyKSB7XG4gIHZhciBlbmNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgaWYgKGVuY29kZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImI3gyNztcIik7XG59O1xuXG52YXIgZ2V0VGl0bGVGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCkge1xuICB2YXIgaW5uZXJtb3N0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIFRBR19OQU1FUy5USVRMRSk7XG4gIHZhciBpbm5lcm1vc3RUZW1wbGF0ZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLlRJVExFX1RFTVBMQVRFKTtcblxuICBpZiAoaW5uZXJtb3N0VGVtcGxhdGUgJiYgaW5uZXJtb3N0VGl0bGUpIHtcbiAgICAvLyB1c2UgZnVuY3Rpb24gYXJnIHRvIGF2b2lkIG5lZWQgdG8gZXNjYXBlICQgY2hhcmFjdGVyc1xuICAgIHJldHVybiBpbm5lcm1vc3RUZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShpbm5lcm1vc3RUaXRsZSkgPyBpbm5lcm1vc3RUaXRsZS5qb2luKFwiXCIpIDogaW5uZXJtb3N0VGl0bGU7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaW5uZXJtb3N0RGVmYXVsdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGQVVMVF9USVRMRSk7XG4gIHJldHVybiBpbm5lcm1vc3RUaXRsZSB8fCBpbm5lcm1vc3REZWZhdWx0VGl0bGUgfHwgdW5kZWZpbmVkO1xufTtcblxudmFyIGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBmdW5jdGlvbiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuT05fQ0hBTkdFX0NMSUVOVF9TVEFURSkgfHwgZnVuY3Rpb24gKCkge307XG59O1xuXG52YXIgZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCh0YWdUeXBlLCBwcm9wc0xpc3QpIHtcbiAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wc1t0YWdUeXBlXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBwcm9wc1t0YWdUeXBlXTtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uICh0YWdBdHRycywgY3VycmVudCkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgdGFnQXR0cnMsIGN1cnJlbnQpO1xuICB9LCB7fSk7XG59O1xuXG52YXIgZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdChwcmltYXJ5QXR0cmlidXRlcywgcHJvcHNMaXN0KSB7XG4gIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHNbVEFHX05BTUVTLkJBU0VdICE9PSBcInVuZGVmaW5lZFwiO1xuICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzW1RBR19OQU1FUy5CQVNFXTtcbiAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoaW5uZXJtb3N0QmFzZVRhZywgdGFnKSB7XG4gICAgaWYgKCFpbm5lcm1vc3RCYXNlVGFnLmxlbmd0aCkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnLmNvbmNhdCh0YWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWc7XG4gIH0sIFtdKTtcbn07XG5cbnZhciBnZXRUYWdzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRhZ3NGcm9tUHJvcHNMaXN0KHRhZ05hbWUsIHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgLy8gQ2FsY3VsYXRlIGxpc3Qgb2YgdGFncywgZ2l2aW5nIHByaW9yaXR5IGlubmVybW9zdCBjb21wb25lbnQgKGVuZCBvZiB0aGUgcHJvcHNsaXN0KVxuICB2YXIgYXBwcm92ZWRTZWVuVGFncyA9IHt9O1xuICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wc1t0YWdOYW1lXSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHNbdGFnTmFtZV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdhcm4oXCJIZWxtZXQ6IFwiICsgdGFnTmFtZSArIFwiIHNob3VsZCBiZSBvZiB0eXBlIFxcXCJBcnJheVxcXCIuIEluc3RlYWQgZm91bmQgdHlwZSBcXFwiXCIgKyBfdHlwZW9mKHByb3BzW3RhZ05hbWVdKSArIFwiXFxcIlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHNbdGFnTmFtZV07XG4gIH0pLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGFwcHJvdmVkVGFncywgaW5zdGFuY2VUYWdzKSB7XG4gICAgdmFyIGluc3RhbmNlU2VlblRhZ3MgPSB7fTtcbiAgICBpbnN0YW5jZVRhZ3MuZmlsdGVyKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgIHZhciBwcmltYXJ5QXR0cmlidXRlS2V5ID0gdm9pZCAwO1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTsgLy8gU3BlY2lhbCBydWxlIHdpdGggbGluayB0YWdzLCBzaW5jZSByZWwgYW5kIGhyZWYgYXJlIGJvdGggcHJpbWFyeSB0YWdzLCByZWwgdGFrZXMgcHJpb3JpdHlcblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAhKHByaW1hcnlBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKSA9PT0gXCJjYW5vbmljYWxcIikgJiYgIShsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikpIHtcbiAgICAgICAgICBwcmltYXJ5QXR0cmlidXRlS2V5ID0gbG93ZXJDYXNlQXR0cmlidXRlS2V5O1xuICAgICAgICB9IC8vIFNwZWNpYWwgY2FzZSBmb3IgaW5uZXJIVE1MIHdoaWNoIGRvZXNuJ3Qgd29yayBsb3dlcmNhc2VkXG5cblxuICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAoYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1ApKSB7XG4gICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXByaW1hcnlBdHRyaWJ1dGVLZXkgfHwgIXRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IHRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdKSB7XG4gICAgICAgIGluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICByZXR1cm4gYXBwcm92ZWRUYWdzLnB1c2godGFnKTtcbiAgICB9KTsgLy8gVXBkYXRlIHNlZW4gdGFncyB3aXRoIHRhZ3MgZnJvbSB0aGlzIGluc3RhbmNlXG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlU2VlblRhZ3MpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciB0YWdVbmlvbiA9IG9iamVjdEFzc2lnbih7fSwgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldLCBpbnN0YW5jZVNlZW5UYWdzW2F0dHJpYnV0ZUtleV0pO1xuICAgICAgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldID0gdGFnVW5pb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcHJvdmVkVGFncztcbiAgfSwgW10pLnJldmVyc2UoKTtcbn07XG5cbnZhciBnZXRJbm5lcm1vc3RQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgcHJvcGVydHkpIHtcbiAgZm9yICh2YXIgaSA9IHByb3BzTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBwcm9wcyA9IHByb3BzTGlzdFtpXTtcblxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgIHJldHVybiBwcm9wc1twcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcmVkdWNlUHJvcHNUb1N0YXRlID0gZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4ge1xuICAgIGJhc2VUYWc6IGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KFtUQUdfUFJPUEVSVElFUy5IUkVGLCBUQUdfUFJPUEVSVElFUy5UQVJHRVRdLCBwcm9wc0xpc3QpLFxuICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuQk9EWSwgcHJvcHNMaXN0KSxcbiAgICBkZWZlcjogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGRVIpLFxuICAgIGVuY29kZTogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUyksXG4gICAgaHRtbEF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5IVE1MLCBwcm9wc0xpc3QpLFxuICAgIGxpbmtUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTElOSywgW1RBR19QUk9QRVJUSUVTLlJFTCwgVEFHX1BST1BFUlRJRVMuSFJFRl0sIHByb3BzTGlzdCksXG4gICAgbWV0YVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5NRVRBLCBbVEFHX1BST1BFUlRJRVMuTkFNRSwgVEFHX1BST1BFUlRJRVMuQ0hBUlNFVCwgVEFHX1BST1BFUlRJRVMuSFRUUEVRVUlWLCBUQUdfUFJPUEVSVElFUy5QUk9QRVJUWSwgVEFHX1BST1BFUlRJRVMuSVRFTV9QUk9QXSwgcHJvcHNMaXN0KSxcbiAgICBub3NjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5OT1NDUklQVCwgW1RBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGU6IGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUocHJvcHNMaXN0KSxcbiAgICBzY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU0NSSVBULCBbVEFHX1BST1BFUlRJRVMuU1JDLCBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICBzdHlsZVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TVFlMRSwgW1RBR19QUk9QRVJUSUVTLkNTU19URVhUXSwgcHJvcHNMaXN0KSxcbiAgICB0aXRsZTogZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCksXG4gICAgdGl0bGVBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuVElUTEUsIHByb3BzTGlzdClcbiAgfTtcbn07XG5cbnZhciByYWZQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNsb2NrID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHZhciBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY3VycmVudFRpbWUgLSBjbG9jayA+IDE2KSB7XG4gICAgICBjbG9jayA9IGN1cnJlbnRUaW1lO1xuICAgICAgY2FsbGJhY2soY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmFmUG9seWZpbGwoY2FsbGJhY2spO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgY2FmUG9seWZpbGwgPSBmdW5jdGlvbiBjYWZQb2x5ZmlsbChpZCkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn07XG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGwgOiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJhZlBvbHlmaWxsO1xudmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsIDogZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsO1xuXG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIHJldHVybiBjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIiAmJiBjb25zb2xlLndhcm4obXNnKTtcbn07XG5cbnZhciBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuXG52YXIgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZShuZXdTdGF0ZSkge1xuICBpZiAoX2hlbG1ldENhbGxiYWNrKSB7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX2hlbG1ldENhbGxiYWNrKTtcbiAgfVxuXG4gIGlmIChuZXdTdGF0ZS5kZWZlcikge1xuICAgIF9oZWxtZXRDYWxsYmFjayA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlKTtcbiAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICB9XG59O1xuXG52YXIgY29tbWl0VGFnQ2hhbmdlcyA9IGZ1bmN0aW9uIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGNiKSB7XG4gIHZhciBiYXNlVGFnID0gbmV3U3RhdGUuYmFzZVRhZyxcbiAgICAgIGJvZHlBdHRyaWJ1dGVzID0gbmV3U3RhdGUuYm9keUF0dHJpYnV0ZXMsXG4gICAgICBodG1sQXR0cmlidXRlcyA9IG5ld1N0YXRlLmh0bWxBdHRyaWJ1dGVzLFxuICAgICAgbGlua1RhZ3MgPSBuZXdTdGF0ZS5saW5rVGFncyxcbiAgICAgIG1ldGFUYWdzID0gbmV3U3RhdGUubWV0YVRhZ3MsXG4gICAgICBub3NjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5ub3NjcmlwdFRhZ3MsXG4gICAgICBvbkNoYW5nZUNsaWVudFN0YXRlID0gbmV3U3RhdGUub25DaGFuZ2VDbGllbnRTdGF0ZSxcbiAgICAgIHNjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5zY3JpcHRUYWdzLFxuICAgICAgc3R5bGVUYWdzID0gbmV3U3RhdGUuc3R5bGVUYWdzLFxuICAgICAgdGl0bGUgPSBuZXdTdGF0ZS50aXRsZSxcbiAgICAgIHRpdGxlQXR0cmlidXRlcyA9IG5ld1N0YXRlLnRpdGxlQXR0cmlidXRlcztcbiAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMpO1xuICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcyk7XG4gIHVwZGF0ZVRpdGxlKHRpdGxlLCB0aXRsZUF0dHJpYnV0ZXMpO1xuICB2YXIgdGFnVXBkYXRlcyA9IHtcbiAgICBiYXNlVGFnOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnKSxcbiAgICBsaW5rVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTElOSywgbGlua1RhZ3MpLFxuICAgIG1ldGFUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5NRVRBLCBtZXRhVGFncyksXG4gICAgbm9zY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzKSxcbiAgICBzY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5TQ1JJUFQsIHNjcmlwdFRhZ3MpLFxuICAgIHN0eWxlVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU1RZTEUsIHN0eWxlVGFncylcbiAgfTtcbiAgdmFyIGFkZGVkVGFncyA9IHt9O1xuICB2YXIgcmVtb3ZlZFRhZ3MgPSB7fTtcbiAgT2JqZWN0LmtleXModGFnVXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbiAodGFnVHlwZSkge1xuICAgIHZhciBfdGFnVXBkYXRlcyR0YWdUeXBlID0gdGFnVXBkYXRlc1t0YWdUeXBlXSxcbiAgICAgICAgbmV3VGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUubmV3VGFncyxcbiAgICAgICAgb2xkVGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUub2xkVGFncztcblxuICAgIGlmIChuZXdUYWdzLmxlbmd0aCkge1xuICAgICAgYWRkZWRUYWdzW3RhZ1R5cGVdID0gbmV3VGFncztcbiAgICB9XG5cbiAgICBpZiAob2xkVGFncy5sZW5ndGgpIHtcbiAgICAgIHJlbW92ZWRUYWdzW3RhZ1R5cGVdID0gdGFnVXBkYXRlc1t0YWdUeXBlXS5vbGRUYWdzO1xuICAgIH1cbiAgfSk7XG4gIGNiICYmIGNiKCk7XG4gIG9uQ2hhbmdlQ2xpZW50U3RhdGUobmV3U3RhdGUsIGFkZGVkVGFncywgcmVtb3ZlZFRhZ3MpO1xufTtcblxudmFyIGZsYXR0ZW5BcnJheSA9IGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShwb3NzaWJsZUFycmF5KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQXJyYXkpID8gcG9zc2libGVBcnJheS5qb2luKFwiXCIpIDogcG9zc2libGVBcnJheTtcbn07XG5cbnZhciB1cGRhdGVUaXRsZSA9IGZ1bmN0aW9uIHVwZGF0ZVRpdGxlKHRpdGxlLCBhdHRyaWJ1dGVzKSB7XG4gIGlmICh0eXBlb2YgdGl0bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQudGl0bGUgIT09IHRpdGxlKSB7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuVElUTEUsIGF0dHJpYnV0ZXMpO1xufTtcblxudmFyIHVwZGF0ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKHRhZ05hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGVsZW1lbnRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKVswXTtcblxuICBpZiAoIWVsZW1lbnRUYWcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGVsbWV0QXR0cmlidXRlU3RyaW5nID0gZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gIHZhciBoZWxtZXRBdHRyaWJ1dGVzID0gaGVsbWV0QXR0cmlidXRlU3RyaW5nID8gaGVsbWV0QXR0cmlidXRlU3RyaW5nLnNwbGl0KFwiLFwiKSA6IFtdO1xuICB2YXIgYXR0cmlidXRlc1RvUmVtb3ZlID0gW10uY29uY2F0KGhlbG1ldEF0dHJpYnV0ZXMpO1xuICB2YXIgYXR0cmlidXRlS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVLZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXSB8fCBcIlwiO1xuXG4gICAgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKSB7XG4gICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZSkgPT09IC0xKSB7XG4gICAgICBoZWxtZXRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhUb1NhdmUgPSBhdHRyaWJ1dGVzVG9SZW1vdmUuaW5kZXhPZihhdHRyaWJ1dGUpO1xuXG4gICAgaWYgKGluZGV4VG9TYXZlICE9PSAtMSkge1xuICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLnNwbGljZShpbmRleFRvU2F2ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kgPSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgIGVsZW1lbnRUYWcucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZXNUb1JlbW92ZVtfaV0pO1xuICB9XG5cbiAgaWYgKGhlbG1ldEF0dHJpYnV0ZXMubGVuZ3RoID09PSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgZWxlbWVudFRhZy5yZW1vdmVBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSkgIT09IGF0dHJpYnV0ZUtleXMuam9pbihcIixcIikpIHtcbiAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFLCBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKTtcbiAgfVxufTtcblxudmFyIHVwZGF0ZVRhZ3MgPSBmdW5jdGlvbiB1cGRhdGVUYWdzKHR5cGUsIHRhZ3MpIHtcbiAgdmFyIGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFRBR19OQU1FUy5IRUFEKTtcbiAgdmFyIHRhZ05vZGVzID0gaGVhZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0eXBlICsgXCJbXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCJdXCIpO1xuICB2YXIgb2xkVGFncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhZ05vZGVzKTtcbiAgdmFyIG5ld1RhZ3MgPSBbXTtcbiAgdmFyIGluZGV4VG9EZWxldGUgPSB2b2lkIDA7XG5cbiAgaWYgKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICB0YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gdGFnKSB7XG4gICAgICAgIGlmICh0YWcuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlKSkge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gdGFnLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSB0YWcuY3NzVGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGFnLmNzc1RleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gXCJcIiA6IHRhZ1thdHRyaWJ1dGVdO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIFwidHJ1ZVwiKTsgLy8gUmVtb3ZlIGEgZHVwbGljYXRlIHRhZyBmcm9tIGRvbVRhZ3N0b1JlbW92ZSwgc28gaXQgaXNuJ3QgY2xlYXJlZC5cblxuICAgICAgaWYgKG9sZFRhZ3Muc29tZShmdW5jdGlvbiAoZXhpc3RpbmdUYWcsIGluZGV4KSB7XG4gICAgICAgIGluZGV4VG9EZWxldGUgPSBpbmRleDtcbiAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQuaXNFcXVhbE5vZGUoZXhpc3RpbmdUYWcpO1xuICAgICAgfSkpIHtcbiAgICAgICAgb2xkVGFncy5zcGxpY2UoaW5kZXhUb0RlbGV0ZSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdUYWdzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbGRUYWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgIHJldHVybiB0YWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcpO1xuICB9KTtcbiAgbmV3VGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICByZXR1cm4gaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQodGFnKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgb2xkVGFnczogb2xkVGFncyxcbiAgICBuZXdUYWdzOiBuZXdUYWdzXG4gIH07XG59O1xuXG52YXIgZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBrZXkpIHtcbiAgICB2YXIgYXR0ciA9IHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09IFwidW5kZWZpbmVkXCIgPyBrZXkgKyBcIj1cXFwiXCIgKyBhdHRyaWJ1dGVzW2tleV0gKyBcIlxcXCJcIiA6IFwiXCIgKyBrZXk7XG4gICAgcmV0dXJuIHN0ciA/IHN0ciArIFwiIFwiICsgYXR0ciA6IGF0dHI7XG4gIH0sIFwiXCIpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcywgZW5jb2RlKSB7XG4gIHZhciBhdHRyaWJ1dGVTdHJpbmcgPSBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcoYXR0cmlidXRlcyk7XG4gIHZhciBmbGF0dGVuZWRUaXRsZSA9IGZsYXR0ZW5BcnJheSh0aXRsZSk7XG4gIHJldHVybiBhdHRyaWJ1dGVTdHJpbmcgPyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVTdHJpbmcgKyBcIj5cIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKGZsYXR0ZW5lZFRpdGxlLCBlbmNvZGUpICsgXCI8L1wiICsgdHlwZSArIFwiPlwiIDogXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCI7XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1N0cmluZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgcmV0dXJuIHRhZ3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIHRhZykge1xuICAgIHZhciBhdHRyaWJ1dGVIdG1sID0gT2JqZWN0LmtleXModGFnKS5maWx0ZXIoZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuICEoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoc3RyaW5nLCBhdHRyaWJ1dGUpIHtcbiAgICAgIHZhciBhdHRyID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gYXR0cmlidXRlIDogYXR0cmlidXRlICsgXCI9XFxcIlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnModGFnW2F0dHJpYnV0ZV0sIGVuY29kZSkgKyBcIlxcXCJcIjtcbiAgICAgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgIH0sIFwiXCIpO1xuICAgIHZhciB0YWdDb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dCB8fCBcIlwiO1xuICAgIHZhciBpc1NlbGZDbG9zaW5nID0gU0VMRl9DTE9TSU5HX1RBR1MuaW5kZXhPZih0eXBlKSA9PT0gLTE7XG4gICAgcmV0dXJuIHN0ciArIFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIiBcIiArIGF0dHJpYnV0ZUh0bWwgKyAoaXNTZWxmQ2xvc2luZyA/IFwiLz5cIiA6IFwiPlwiICsgdGFnQ29udGVudCArIFwiPC9cIiArIHR5cGUgKyBcIj5cIik7XG4gIH0sIFwiXCIpO1xufTtcblxudmFyIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzKSB7XG4gIHZhciBpbml0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgIG9ialtSRUFDVF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCBpbml0UHJvcHMpO1xufTtcblxudmFyIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyA9IGZ1bmN0aW9uIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyhwcm9wcykge1xuICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBvYmpbSFRNTF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IHByb3BzW2tleV07XG4gICAgcmV0dXJuIG9iajtcbiAgfSwgaW5pdEF0dHJpYnV0ZXMpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQodHlwZSwgdGl0bGUsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIF9pbml0UHJvcHM7IC8vIGFzc2lnbmluZyBpbnRvIGFuIGFycmF5IHRvIGRlZmluZSB0b1N0cmluZyBmdW5jdGlvbiBvbiBpdFxuXG5cbiAgdmFyIGluaXRQcm9wcyA9IChfaW5pdFByb3BzID0ge1xuICAgIGtleTogdGl0bGVcbiAgfSwgX2luaXRQcm9wc1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9pbml0UHJvcHMpO1xuICB2YXIgcHJvcHMgPSBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcywgaW5pdFByb3BzKTtcbiAgcmV0dXJuIFtSZWFjdC5jcmVhdGVFbGVtZW50KFRBR19OQU1FUy5USVRMRSwgcHJvcHMsIHRpdGxlKV07XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncykge1xuICByZXR1cm4gdGFncy5tYXAoZnVuY3Rpb24gKHRhZywgaSkge1xuICAgIHZhciBfbWFwcGVkVGFnO1xuXG4gICAgdmFyIG1hcHBlZFRhZyA9IChfbWFwcGVkVGFnID0ge1xuICAgICAga2V5OiBpXG4gICAgfSwgX21hcHBlZFRhZ1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9tYXBwZWRUYWcpO1xuICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICB2YXIgbWFwcGVkQXR0cmlidXRlID0gUkVBQ1RfVEFHX01BUFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTtcblxuICAgICAgaWYgKG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBtYXBwZWRBdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dDtcbiAgICAgICAgbWFwcGVkVGFnLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID0ge1xuICAgICAgICAgIF9faHRtbDogY29udGVudFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkVGFnW21hcHBlZEF0dHJpYnV0ZV0gPSB0YWdbYXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBtYXBwZWRUYWcpO1xuICB9KTtcbn07XG5cbnZhciBnZXRNZXRob2RzRm9yVGFnID0gZnVuY3Rpb24gZ2V0TWV0aG9kc0ZvclRhZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkJPRFk6XG4gICAgY2FzZSBBVFRSSUJVVEVfTkFNRVMuSFRNTDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICByZXR1cm4gY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzKHRhZ3MpO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyh0YWdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNTdHJpbmcodHlwZSwgdGFncywgZW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIG1hcFN0YXRlT25TZXJ2ZXIgPSBmdW5jdGlvbiBtYXBTdGF0ZU9uU2VydmVyKF9yZWYpIHtcbiAgdmFyIGJhc2VUYWcgPSBfcmVmLmJhc2VUYWcsXG4gICAgICBib2R5QXR0cmlidXRlcyA9IF9yZWYuYm9keUF0dHJpYnV0ZXMsXG4gICAgICBlbmNvZGUgPSBfcmVmLmVuY29kZSxcbiAgICAgIGh0bWxBdHRyaWJ1dGVzID0gX3JlZi5odG1sQXR0cmlidXRlcyxcbiAgICAgIGxpbmtUYWdzID0gX3JlZi5saW5rVGFncyxcbiAgICAgIG1ldGFUYWdzID0gX3JlZi5tZXRhVGFncyxcbiAgICAgIG5vc2NyaXB0VGFncyA9IF9yZWYubm9zY3JpcHRUYWdzLFxuICAgICAgc2NyaXB0VGFncyA9IF9yZWYuc2NyaXB0VGFncyxcbiAgICAgIHN0eWxlVGFncyA9IF9yZWYuc3R5bGVUYWdzLFxuICAgICAgX3JlZiR0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgICB0aXRsZSA9IF9yZWYkdGl0bGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmJHRpdGxlLFxuICAgICAgdGl0bGVBdHRyaWJ1dGVzID0gX3JlZi50aXRsZUF0dHJpYnV0ZXM7XG4gIHJldHVybiB7XG4gICAgYmFzZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuQkFTRSwgYmFzZVRhZywgZW5jb2RlKSxcbiAgICBib2R5QXR0cmlidXRlczogZ2V0TWV0aG9kc0ZvclRhZyhBVFRSSUJVVEVfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMsIGVuY29kZSksXG4gICAgaHRtbEF0dHJpYnV0ZXM6IGdldE1ldGhvZHNGb3JUYWcoQVRUUklCVVRFX05BTUVTLkhUTUwsIGh0bWxBdHRyaWJ1dGVzLCBlbmNvZGUpLFxuICAgIGxpbms6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLkxJTkssIGxpbmtUYWdzLCBlbmNvZGUpLFxuICAgIG1ldGE6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzLCBlbmNvZGUpLFxuICAgIG5vc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgIHNjcmlwdDogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuU0NSSVBULCBzY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgIHN0eWxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzLCBlbmNvZGUpLFxuICAgIHRpdGxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5USVRMRSwge1xuICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgdGl0bGVBdHRyaWJ1dGVzOiB0aXRsZUF0dHJpYnV0ZXNcbiAgICB9LCBlbmNvZGUpXG4gIH07XG59O1xuXG52YXIgSGVsbWV0ID0gZnVuY3Rpb24gSGVsbWV0KENvbXBvbmVudCkge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEhlbG1ldFdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gSGVsbWV0V3JhcHBlcigpIHtcbiAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEhlbG1ldFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKTtcbiAgICB9O1xuXG4gICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgaWYgKCFuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlubmVySFRNTDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3NUZXh0OiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIjxcIiArIGNoaWxkLnR5cGUgKyBcIiAvPiBlbGVtZW50cyBhcmUgc2VsZi1jbG9zaW5nIGFuZCBjYW4gbm90IGNvbnRhaW4gY2hpbGRyZW4uIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4gPSBmdW5jdGlvbiBmbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oX3JlZikge1xuICAgICAgdmFyIF9iYWJlbEhlbHBlcnMkZXh0ZW5kcztcblxuICAgICAgdmFyIGNoaWxkID0gX3JlZi5jaGlsZCxcbiAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF9yZWYuYXJyYXlUeXBlQ2hpbGRyZW4sXG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcyA9IF9yZWYubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYubmVzdGVkQ2hpbGRyZW47XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFycmF5VHlwZUNoaWxkcmVuLCAoX2JhYmVsSGVscGVycyRleHRlbmRzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kc1tjaGlsZC50eXBlXSA9IFtdLmNvbmNhdChhcnJheVR5cGVDaGlsZHJlbltjaGlsZC50eXBlXSB8fCBbXSwgW19leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzLCB0aGlzLm1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyhjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pKV0pLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMpKTtcbiAgICB9O1xuXG4gICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwT2JqZWN0VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gbWFwT2JqZWN0VHlwZUNoaWxkcmVuKF9yZWYyKSB7XG4gICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzMiwgX2JhYmVsSGVscGVycyRleHRlbmRzMztcblxuICAgICAgdmFyIGNoaWxkID0gX3JlZjIuY2hpbGQsXG4gICAgICAgICAgbmV3UHJvcHMgPSBfcmVmMi5uZXdQcm9wcyxcbiAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZjIubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYyLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzMltjaGlsZC50eXBlXSA9IG5lc3RlZENoaWxkcmVuLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLnRpdGxlQXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMikpO1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLkJPRFk6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgVEFHX05BTUVTLkhUTUw6XG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzMyA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzW2NoaWxkLnR5cGVdID0gX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzKSk7XG4gICAgfTtcblxuICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdQcm9wcyk7XG5cbiAgICAgIE9iamVjdC5rZXlzKGFycmF5VHlwZUNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUNoaWxkTmFtZSkge1xuICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzNDtcblxuICAgICAgICBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdGbGF0dGVuZWRQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzNFthcnJheUNoaWxkTmFtZV0gPSBhcnJheVR5cGVDaGlsZHJlblthcnJheUNoaWxkTmFtZV0sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld0ZsYXR0ZW5lZFByb3BzO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS53YXJuT25JbnZhbGlkQ2hpbGRyZW4gPSBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2hpbGRyZW4oY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICghVkFMSURfVEFHX05BTUVTLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQudHlwZSA9PT0gbmFtZTtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHdhcm4oXCJZb3UgbWF5IGJlIGF0dGVtcHRpbmcgdG8gbmVzdCA8SGVsbWV0PiBjb21wb25lbnRzIHdpdGhpbiBlYWNoIG90aGVyLCB3aGljaCBpcyBub3QgYWxsb3dlZC4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdhcm4oXCJPbmx5IGVsZW1lbnRzIHR5cGVzIFwiICsgVkFMSURfVEFHX05BTUVTLmpvaW4oXCIsIFwiKSArIFwiIGFyZSBhbGxvd2VkLiBIZWxtZXQgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgPFwiICsgY2hpbGQudHlwZSArIFwiPiBlbGVtZW50cy4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVzdGVkQ2hpbGRyZW4gJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuICE9PSBcInN0cmluZ1wiICYmICghQXJyYXkuaXNBcnJheShuZXN0ZWRDaGlsZHJlbikgfHwgbmVzdGVkQ2hpbGRyZW4uc29tZShmdW5jdGlvbiAobmVzdGVkQ2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZENoaWxkICE9PSBcInN0cmluZ1wiO1xuICAgICAgICB9KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWxtZXQgZXhwZWN0cyBhIHN0cmluZyBhcyBhIGNoaWxkIG9mIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4uIERpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBjaGlsZHJlbiBpbiBicmFjZXM/ICggPFwiICsgY2hpbGQudHlwZSArIFwiPntgYH08L1wiICsgY2hpbGQudHlwZSArIFwiPiApIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBDaGlsZHJlblRvUHJvcHMoY2hpbGRyZW4sIG5ld1Byb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFycmF5VHlwZUNoaWxkcmVuID0ge307XG4gICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFjaGlsZCB8fCAhY2hpbGQucHJvcHMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9jaGlsZCRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkUHJvcHMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfY2hpbGQkcHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcbiAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMoY2hpbGRQcm9wcyk7XG5cbiAgICAgICAgX3RoaXMyLndhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pO1xuXG4gICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkxJTks6XG4gICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTUVUQTpcbiAgICAgICAgICBjYXNlIFRBR19OQU1FUy5OT1NDUklQVDpcbiAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU1RZTEU6XG4gICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF90aGlzMi5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICBjaGlsZDogY2hpbGQsXG4gICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuOiBhcnJheVR5cGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW46IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG5ld1Byb3BzID0gX3RoaXMyLm1hcE9iamVjdFR5cGVDaGlsZHJlbih7XG4gICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgbmV3UHJvcHM6IG5ld1Byb3BzLFxuICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzOiBuZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgIH07XG5cbiAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBwcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICB2YXIgbmV3UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xuXG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcENoaWxkcmVuVG9Qcm9wcyhjaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIG5ld1Byb3BzKTtcbiAgICB9O1xuXG4gICAgY3JlYXRlQ2xhc3MoSGVsbWV0V3JhcHBlciwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJjYW5Vc2VET01cIixcbiAgICAgIC8vIENvbXBvbmVudC5wZWVrIGNvbWVzIGZyb20gcmVhY3Qtc2lkZS1lZmZlY3Q6XG4gICAgICAvLyBGb3IgdGVzdGluZywgeW91IG1heSB1c2UgYSBzdGF0aWMgcGVlaygpIG1ldGhvZCBhdmFpbGFibGUgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudC5cbiAgICAgIC8vIEl0IGxldHMgeW91IGdldCB0aGUgY3VycmVudCBzdGF0ZSB3aXRob3V0IHJlc2V0dGluZyB0aGUgbW91bnRlZCBpbnN0YW5jZSBzdGFjay5cbiAgICAgIC8vIERvbuKAmXQgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuIHRlc3RpbmcuXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGJhc2U6IHtcInRhcmdldFwiOiBcIl9ibGFua1wiLCBcImhyZWZcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9cIn1cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBib2R5QXR0cmlidXRlczoge1wiY2xhc3NOYW1lXCI6IFwicm9vdFwifVxuICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGRlZmF1bHRUaXRsZTogXCJEZWZhdWx0IFRpdGxlXCJcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVmZXI6IHRydWVcbiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWVcbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBodG1sQXR0cmlidXRlczoge1wibGFuZ1wiOiBcImVuXCIsIFwiYW1wXCI6IHVuZGVmaW5lZH1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbms6IFt7XCJyZWxcIjogXCJjYW5vbmljYWxcIiwgXCJocmVmXCI6IFwiaHR0cDovL215c2l0ZS5jb20vZXhhbXBsZVwifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1ldGE6IFt7XCJuYW1lXCI6IFwiZGVzY3JpcHRpb25cIiwgXCJjb250ZW50XCI6IFwiVGVzdCBkZXNjcmlwdGlvblwifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG5vc2NyaXB0OiBbe1wiaW5uZXJIVE1MXCI6IFwiPGltZyBzcmM9J2h0dHA6Ly9teXNpdGUuY29tL2pzL3Rlc3QuanMnXCJ9XVxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25DaGFuZ2VDbGllbnRTdGF0ZTogXCIobmV3U3RhdGUpID0+IGNvbnNvbGUubG9nKG5ld1N0YXRlKVwiXG4gICAgICAgKiBAcGFyYW0ge0FycmF5fSBzY3JpcHQ6IFt7XCJ0eXBlXCI6IFwidGV4dC9qYXZhc2NyaXB0XCIsIFwic3JjXCI6IFwiaHR0cDovL215c2l0ZS5jb20vanMvdGVzdC5qc1wifV1cbiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0eWxlOiBbe1widHlwZVwiOiBcInRleHQvY3NzXCIsIFwiY3NzVGV4dFwiOiBcImRpdiB7IGRpc3BsYXk6IGJsb2NrOyBjb2xvcjogYmx1ZTsgfVwifV1cbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZTogXCJUaXRsZVwiXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGl0bGVBdHRyaWJ1dGVzOiB7XCJpdGVtcHJvcFwiOiBcIm5hbWVcIn1cbiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVRlbXBsYXRlOiBcIk15U2l0ZS5jb20gLSAlc1wiXG4gICAgICAgKi9cbiAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKGNhblVzZURPTSkge1xuICAgICAgICBDb21wb25lbnQuY2FuVXNlRE9NID0gY2FuVXNlRE9NO1xuICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gSGVsbWV0V3JhcHBlcjtcbiAgfShSZWFjdC5Db21wb25lbnQpLCBfY2xhc3MucHJvcFR5cGVzID0ge1xuICAgIGJhc2U6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgYm9keUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICBkZWZhdWx0VGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVmZXI6IFByb3BUeXBlcy5ib29sLFxuICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsaW5rOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBtZXRhOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBub3NjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2NyaXB0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICBzdHlsZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGl0bGVBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHRpdGxlVGVtcGxhdGU6IFByb3BUeXBlcy5zdHJpbmdcbiAgfSwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBkZWZlcjogdHJ1ZSxcbiAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICB9LCBfY2xhc3MucGVlayA9IENvbXBvbmVudC5wZWVrLCBfY2xhc3MucmV3aW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXBwZWRTdGF0ZSA9IENvbXBvbmVudC5yZXdpbmQoKTtcblxuICAgIGlmICghbWFwcGVkU3RhdGUpIHtcbiAgICAgIC8vIHByb3ZpZGUgZmFsbGJhY2sgaWYgbWFwcGVkU3RhdGUgaXMgdW5kZWZpbmVkXG4gICAgICBtYXBwZWRTdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoe1xuICAgICAgICBiYXNlVGFnOiBbXSxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICBsaW5rVGFnczogW10sXG4gICAgICAgIG1ldGFUYWdzOiBbXSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiBbXSxcbiAgICAgICAgc2NyaXB0VGFnczogW10sXG4gICAgICAgIHN0eWxlVGFnczogW10sXG4gICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGVkU3RhdGU7XG4gIH0sIF90ZW1wO1xufTtcblxudmFyIE51bGxDb21wb25lbnQgPSBmdW5jdGlvbiBOdWxsQ29tcG9uZW50KCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBIZWxtZXRTaWRlRWZmZWN0cyA9IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UsIG1hcFN0YXRlT25TZXJ2ZXIpKE51bGxDb21wb25lbnQpO1xudmFyIEhlbG1ldEV4cG9ydCA9IEhlbG1ldChIZWxtZXRTaWRlRWZmZWN0cyk7XG5IZWxtZXRFeHBvcnQucmVuZGVyU3RhdGljID0gSGVsbWV0RXhwb3J0LnJld2luZDtcbmV4cG9ydCBkZWZhdWx0IEhlbG1ldEV4cG9ydDtcbmV4cG9ydCB7IEhlbG1ldEV4cG9ydCBhcyBIZWxtZXQgfTsiLCJpbXBvcnQgUmVhY3QsIHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKNDBIZWFkZXIgZnJvbSAnLi9KNDBIZWFkZXInO1xuaW1wb3J0IEo0MEZvb3RlciBmcm9tICcuL0o0MEZvb3Rlcic7XG5pbXBvcnQge1VSTEZsYWdQcm92aWRlcn0gZnJvbSAnLi4vY29udGV4dHMvRmxhZ0NvbnRleHQnO1xuaW1wb3J0IHtIZWxtZXR9IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5cbmludGVyZmFjZSBJTGF5b3V0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlLFxuICBsb2NhdGlvbjogTG9jYXRpb24sXG4gIHRpdGxlOiBzdHJpbmcsXG59XG5cbmNvbnN0IExheW91dCA9ICh7Y2hpbGRyZW4sIGxvY2F0aW9uLCB0aXRsZX06IElMYXlvdXRQcm9wcykgPT4ge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxIZWxtZXQgZGVmZXI9e2ZhbHNlfT5cbiAgICAgICAgPGh0bWwgbGFuZz1cImVuXCIvPlxuICAgICAgICA8dGl0bGU+e3RpdGxlfTwvdGl0bGU+XG4gICAgICAgIDxzY3JpcHQgYXN5bmNcbiAgICAgICAgICB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICAgICAgICBpZD1cIl9mZWRfYW5fdWFfdGFnXCJcbiAgICAgICAgICBzcmM9XCJodHRwczovL2RhcC5kaWdpdGFsZ292Lmdvdi9Vbml2ZXJzYWwtRmVkZXJhdGVkLUFuYWx5dGljcy1NaW4uanM/YWdlbmN5PURPSSZzaXRldG9waWM9Y2Vqc3QmZW5obGluaz10cnVlXCI+XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgPC9IZWxtZXQ+XG4gICAgICA8VVJMRmxhZ1Byb3ZpZGVyIGxvY2F0aW9uPXtsb2NhdGlvbn0+XG4gICAgICAgIDxKNDBIZWFkZXIgLz5cbiAgICAgICAgPG1haW4gaWQ9eydtYWluLWNvbnRlbnQnfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvbWFpbj5cbiAgICAgICAgPEo0MEZvb3Rlci8+XG4gICAgICA8L1VSTEZsYWdQcm92aWRlcj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheW91dDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5614\n')},774:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "RE": function() { return /* binding */ URLFlagProvider; },\n/* harmony export */ "Vb": function() { return /* binding */ useFlags; }\n/* harmony export */ });\n/* unused harmony export FlagContext */\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2203);\nfunction _createForOfIteratorHelperLoose(o,allowArrayLike){var it=typeof Symbol!=="undefined"&&o[Symbol.iterator]||o["@@iterator"];if(it)return(it=it.call(o)).next.bind(it);if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;return function(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]};};}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen);}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i whitehouse-gov\n * Privacy Policy => privacy-policy\n *\n * @param {string} string\n * @return {string}\n */var hyphenizeString=function hyphenizeString(string){return string.split(/\\.| /).join('-').toLowerCase();};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL2N5cHJlc3MvaW50ZWdyYXRpb24vY29tbW9uL2hlbHBlcnMuanM/OTBkZCJdLCJuYW1lcyI6WyJoeXBoZW5pemVTdHJpbmciLCJzdHJpbmciLCJzcGxpdCIsImpvaW4iLCJ0b0xvd2VyQ2FzZSJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUNPLEdBQU1BLGdCQUFlLENBQUcsUUFBbEJBLGdCQUFrQixDQUFDQyxNQUFELENBQVksQ0FDekMsTUFBT0EsT0FBTSxDQUFDQyxLQUFQLENBQWEsTUFBYixFQUFxQkMsSUFBckIsQ0FBMEIsR0FBMUIsRUFBK0JDLFdBQS9CLEVBQVAsQ0FDRCxDQUZNIiwiZmlsZSI6IjI5MDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBIZWxwZXIgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBzaGFyZWQgYmV0d2VlbiBib3RoIHRoZSBzcmMgY29kZWJhc2Vcbi8vIGFuZCB0aGUgY3lwcmVzcyB0ZXN0c1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIGEgc3RyaW5nIGFuZCBoeXBoZW5pemUgaXQuXG4gKiBGb3IgZXhhbXBsZTpcbiAqIFdoaXRlaG91c2UuZ292ID0+IHdoaXRlaG91c2UtZ292XG4gKiBQcml2YWN5IFBvbGljeSA9PiBwcml2YWN5LXBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGh5cGhlbml6ZVN0cmluZyA9IChzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdCgvXFwufCAvKS5qb2luKCctJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2900\n")},9703:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);var _interopRequireWildcard=__webpack_require__(862);exports.__esModule=true;var _exportNames={Link:true,withIntl:true,navigate:true,changeLocale:true,IntlContextProvider:true,IntlContextConsumer:true};exports.IntlContextConsumer=exports.IntlContextProvider=exports.changeLocale=exports.navigate=exports.withIntl=exports.Link=void 0;var _reactIntl=__webpack_require__(7060);Object.keys(_reactIntl).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;exports[key]=_reactIntl[key];});var _link=_interopRequireWildcard(__webpack_require__(4687));exports.Link=_link.default;exports.navigate=_link.navigate;exports.changeLocale=_link.changeLocale;var _withIntl=_interopRequireDefault(__webpack_require__(8770));exports.withIntl=_withIntl.default;var _intlContext=__webpack_require__(8368);exports.IntlContextProvider=_intlContext.IntlContextProvider;exports.IntlContextConsumer=_intlContext.IntlContextConsumer;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvaW5kZXguanM/OTAyMiJdLCJuYW1lcyI6WyJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiZXhwb3J0cyIsIl9leHBvcnROYW1lcyIsIkxpbmsiLCJ3aXRoSW50bCIsIm5hdmlnYXRlIiwiY2hhbmdlTG9jYWxlIiwiSW50bENvbnRleHRQcm92aWRlciIsIkludGxDb250ZXh0Q29uc3VtZXIiLCJfcmVhY3RJbnRsIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfbGluayIsImRlZmF1bHQiLCJfd2l0aEludGwiLCJfaW50bENvbnRleHQiXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQSxHQUFJQyx3QkFBdUIsQ0FBR0QsbUJBQU8sQ0FBQyxHQUFELENBQXJDLENBRUFFLGtCQUFBLENBQXFCLElBQXJCLENBQ0EsR0FBSUMsYUFBWSxDQUFHLENBQ2pCQyxJQUFJLENBQUUsSUFEVyxDQUVqQkMsUUFBUSxDQUFFLElBRk8sQ0FHakJDLFFBQVEsQ0FBRSxJQUhPLENBSWpCQyxZQUFZLENBQUUsSUFKRyxDQUtqQkMsbUJBQW1CLENBQUUsSUFMSixDQU1qQkMsbUJBQW1CLENBQUUsSUFOSixDQUFuQixDQVFBUCwyQkFBQSxDQUE4QkEsMkJBQUEsQ0FBOEJBLG9CQUFBLENBQXVCQSxnQkFBQSxDQUFtQkEsZ0JBQUEsQ0FBbUJBLFlBQUEsQ0FBZSxJQUFLLEVBQTdJLENBRUEsR0FBSVEsV0FBVSxDQUFHVixtQkFBTyxDQUFDLElBQUQsQ0FBeEIsQ0FFQVcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLFVBQVosRUFBd0JHLE9BQXhCLENBQWdDLFNBQVVDLEdBQVYsQ0FBZSxDQUM3QyxHQUFJQSxHQUFHLEdBQUssU0FBUixFQUFxQkEsR0FBRyxHQUFLLFlBQWpDLENBQStDLE9BQy9DLEdBQUlILE1BQU0sQ0FBQ0ksU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDZCxZQUFyQyxDQUFtRFcsR0FBbkQsQ0FBSixDQUE2RCxPQUM3RFosT0FBTyxDQUFDWSxHQUFELENBQVAsQ0FBZUosVUFBVSxDQUFDSSxHQUFELENBQXpCLENBQ0QsQ0FKRCxFQU1BLEdBQUlJLE1BQUssQ0FBR2pCLHVCQUF1QixDQUFDRCxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBRSxZQUFBLENBQWVnQixLQUFLLENBQUNDLE9BQXJCLENBQ0FqQixnQkFBQSxDQUFtQmdCLEtBQUssQ0FBQ1osUUFBekIsQ0FDQUosb0JBQUEsQ0FBdUJnQixLQUFLLENBQUNYLFlBQTdCLENBRUEsR0FBSWEsVUFBUyxDQUFHckIsc0JBQXNCLENBQUNDLG1CQUFPLENBQUMsSUFBRCxDQUFSLENBQXRDLENBRUFFLGdCQUFBLENBQW1Ca0IsU0FBUyxDQUFDRCxPQUE3QixDQUVBLEdBQUlFLGFBQVksQ0FBR3JCLG1CQUFPLENBQUMsSUFBRCxDQUExQixDQUVBRSwyQkFBQSxDQUE4Qm1CLFlBQVksQ0FBQ2IsbUJBQTNDLENBQ0FOLDJCQUFBLENBQThCbUIsWUFBWSxDQUFDWixtQkFBM0MiLCJmaWxlIjoiOTcwMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBfZXhwb3J0TmFtZXMgPSB7XG4gIExpbms6IHRydWUsXG4gIHdpdGhJbnRsOiB0cnVlLFxuICBuYXZpZ2F0ZTogdHJ1ZSxcbiAgY2hhbmdlTG9jYWxlOiB0cnVlLFxuICBJbnRsQ29udGV4dFByb3ZpZGVyOiB0cnVlLFxuICBJbnRsQ29udGV4dENvbnN1bWVyOiB0cnVlXG59O1xuZXhwb3J0cy5JbnRsQ29udGV4dENvbnN1bWVyID0gZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBleHBvcnRzLm5hdmlnYXRlID0gZXhwb3J0cy53aXRoSW50bCA9IGV4cG9ydHMuTGluayA9IHZvaWQgMDtcblxudmFyIF9yZWFjdEludGwgPSByZXF1aXJlKFwicmVhY3QtaW50bFwiKTtcblxuT2JqZWN0LmtleXMoX3JlYWN0SW50bCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfZXhwb3J0TmFtZXMsIGtleSkpIHJldHVybjtcbiAgZXhwb3J0c1trZXldID0gX3JlYWN0SW50bFtrZXldO1xufSk7XG5cbnZhciBfbGluayA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2xpbmtcIikpO1xuXG5leHBvcnRzLkxpbmsgPSBfbGluay5kZWZhdWx0O1xuZXhwb3J0cy5uYXZpZ2F0ZSA9IF9saW5rLm5hdmlnYXRlO1xuZXhwb3J0cy5jaGFuZ2VMb2NhbGUgPSBfbGluay5jaGFuZ2VMb2NhbGU7XG5cbnZhciBfd2l0aEludGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3dpdGgtaW50bFwiKSk7XG5cbmV4cG9ydHMud2l0aEludGwgPSBfd2l0aEludGwuZGVmYXVsdDtcblxudmFyIF9pbnRsQ29udGV4dCA9IHJlcXVpcmUoXCIuL2ludGwtY29udGV4dFwiKTtcblxuZXhwb3J0cy5JbnRsQ29udGV4dFByb3ZpZGVyID0gX2ludGxDb250ZXh0LkludGxDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkludGxDb250ZXh0Q29uc3VtZXIgPSBfaW50bENvbnRleHQuSW50bENvbnRleHRDb25zdW1lcjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9703\n')},4687:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.changeLocale=exports.navigate=exports.default=void 0;var _extends2=_interopRequireDefault(__webpack_require__(7154));var _objectWithoutPropertiesLoose2=_interopRequireDefault(__webpack_require__(7316));var _react=_interopRequireDefault(__webpack_require__(7294));var _propTypes=_interopRequireDefault(__webpack_require__(5697));var _gatsby=__webpack_require__(5444);var _intlContext=__webpack_require__(8368);var Link=function Link(_ref){var to=_ref.to,language=_ref.language,children=_ref.children,onClick=_ref.onClick,rest=(0,_objectWithoutPropertiesLoose2.default)(_ref,["to","language","children","onClick"]);return _react.default.createElement(_intlContext.IntlContextConsumer,null,function(intl){var languageLink=language||intl.language;var link=intl.routed||language?"/"+languageLink+to:""+to;var handleClick=function handleClick(e){if(language){localStorage.setItem("gatsby-intl-language",language);}if(onClick){onClick(e);}};return _react.default.createElement(_gatsby.Link,(0,_extends2.default)({},rest,{to:link,onClick:handleClick}),children);});};Link.propTypes={children:_propTypes.default.node.isRequired,to:_propTypes.default.string,language:_propTypes.default.string};Link.defaultProps={to:""};var _default=Link;exports.default=_default;var navigate=function navigate(to,options){if(typeof window==="undefined"){return;}var _window$___gatsbyIntl=window.___gatsbyIntl,language=_window$___gatsbyIntl.language,routed=_window$___gatsbyIntl.routed;var link=routed?"/"+language+to:""+to;(0,_gatsby.navigate)(link,options);};exports.navigate=navigate;var changeLocale=function changeLocale(language,to){if(typeof window==="undefined"){return;}var routed=window.___gatsbyIntl.routed;var removePrefix=function removePrefix(pathname){var base= true?"/justice40-tool/803-0bf34ac":0;if(base&&pathname.indexOf(base)===0){pathname=pathname.slice(base.length);}return pathname;};var removeLocalePart=function removeLocalePart(pathname){if(!routed){return pathname;}var i=pathname.indexOf("/",1);return pathname.substring(i);};var pathname=to||removeLocalePart(removePrefix(window.location.pathname));// TODO: check slash\nvar link="/"+language+pathname+window.location.search;localStorage.setItem("gatsby-intl-language",language);(0,_gatsby.navigate)(link);};exports.changeLocale=changeLocale;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvbGluay5qcz8xODJiIl0sIm5hbWVzIjpbIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZXhwb3J0cyIsIl9leHRlbmRzMiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlMiIsIl9yZWFjdCIsIl9wcm9wVHlwZXMiLCJfZ2F0c2J5IiwiX2ludGxDb250ZXh0IiwiTGluayIsIl9yZWYiLCJ0byIsImxhbmd1YWdlIiwiY2hpbGRyZW4iLCJvbkNsaWNrIiwicmVzdCIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiSW50bENvbnRleHRDb25zdW1lciIsImludGwiLCJsYW5ndWFnZUxpbmsiLCJsaW5rIiwicm91dGVkIiwiaGFuZGxlQ2xpY2siLCJlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInByb3BUeXBlcyIsIm5vZGUiLCJpc1JlcXVpcmVkIiwic3RyaW5nIiwiZGVmYXVsdFByb3BzIiwiX2RlZmF1bHQiLCJuYXZpZ2F0ZSIsIm9wdGlvbnMiLCJ3aW5kb3ciLCJfd2luZG93JF9fX2dhdHNieUludGwiLCJfX19nYXRzYnlJbnRsIiwiY2hhbmdlTG9jYWxlIiwicmVtb3ZlUHJlZml4IiwicGF0aG5hbWUiLCJiYXNlIiwiX19CQVNFX1BBVEhfXyIsIl9fUEFUSF9QUkVGSVhfXyIsImluZGV4T2YiLCJzbGljZSIsImxlbmd0aCIsInJlbW92ZUxvY2FsZVBhcnQiLCJpIiwic3Vic3RyaW5nIiwibG9jYXRpb24iLCJzZWFyY2giXSwibWFwcGluZ3MiOiJBQUVBLEdBQUlBLHVCQUFzQixDQUFHQyxtQkFBTyxDQUFDLElBQUQsQ0FBcEMsQ0FFQUMsa0JBQUEsQ0FBcUIsSUFBckIsQ0FDQUEsb0JBQUEsQ0FBdUJBLGdCQUFBLENBQW1CQSxlQUFBLENBQWtCLElBQUssRUFBakUsQ0FFQSxHQUFJQyxVQUFTLENBQUdILHNCQUFzQixD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Q0osTUFBTSxDQUFDZSxRQUFQLENBQWdCVixRQUFqQixDQUFiLENBQXJDLENBQStFO0FBRS9FLEdBQUluQixLQUFJLENBQUcsSUFBTVQsUUFBTixDQUFpQjRCLFFBQWpCLENBQTRCTCxNQUFNLENBQUNlLFFBQVAsQ0FBZ0JDLE1BQXZELENBQ0ExQixZQUFZLENBQUNDLE9BQWIsQ0FBcUIsc0JBQXJCLENBQTZDZCxRQUE3QyxFQUNBLENBQUMsRUFBR0wsT0FBTyxDQUFDMEIsUUFBWixFQUFzQlosSUFBdEIsRUFDRCxDQS9CRCxDQWlDQW5CLG9CQUFBLENBQXVCb0MsWUFBdkIiLCJmaWxlIjoiNDY4Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY2hhbmdlTG9jYWxlID0gZXhwb3J0cy5uYXZpZ2F0ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9leHRlbmRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiKSk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX2dhdHNieSA9IHJlcXVpcmUoXCJnYXRzYnlcIik7XG5cbnZhciBfaW50bENvbnRleHQgPSByZXF1aXJlKFwiLi9pbnRsLWNvbnRleHRcIik7XG5cbnZhciBMaW5rID0gZnVuY3Rpb24gTGluayhfcmVmKSB7XG4gIHZhciB0byA9IF9yZWYudG8sXG4gICAgICBsYW5ndWFnZSA9IF9yZWYubGFuZ3VhZ2UsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgcmVzdCA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTIuZGVmYXVsdCkoX3JlZiwgW1widG9cIiwgXCJsYW5ndWFnZVwiLCBcImNoaWxkcmVuXCIsIFwib25DbGlja1wiXSk7XG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9pbnRsQ29udGV4dC5JbnRsQ29udGV4dENvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoaW50bCkge1xuICAgIHZhciBsYW5ndWFnZUxpbmsgPSBsYW5ndWFnZSB8fCBpbnRsLmxhbmd1YWdlO1xuICAgIHZhciBsaW5rID0gaW50bC5yb3V0ZWQgfHwgbGFuZ3VhZ2UgPyBcIi9cIiArIGxhbmd1YWdlTGluayArIHRvIDogXCJcIiArIHRvO1xuXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DbGljaykge1xuICAgICAgICBvbkNsaWNrKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfZ2F0c2J5LkxpbmssICgwLCBfZXh0ZW5kczIuZGVmYXVsdCkoe30sIHJlc3QsIHtcbiAgICAgIHRvOiBsaW5rLFxuICAgICAgb25DbGljazogaGFuZGxlQ2xpY2tcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9KTtcbn07XG5cbkxpbmsucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgdG86IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGxhbmd1YWdlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXG59O1xuTGluay5kZWZhdWx0UHJvcHMgPSB7XG4gIHRvOiBcIlwiXG59O1xudmFyIF9kZWZhdWx0ID0gTGluaztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG52YXIgbmF2aWdhdGUgPSBmdW5jdGlvbiBuYXZpZ2F0ZSh0bywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfd2luZG93JF9fX2dhdHNieUludGwgPSB3aW5kb3cuX19fZ2F0c2J5SW50bCxcbiAgICAgIGxhbmd1YWdlID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLmxhbmd1YWdlLFxuICAgICAgcm91dGVkID0gX3dpbmRvdyRfX19nYXRzYnlJbnRsLnJvdXRlZDtcbiAgdmFyIGxpbmsgPSByb3V0ZWQgPyBcIi9cIiArIGxhbmd1YWdlICsgdG8gOiBcIlwiICsgdG87XG4gICgwLCBfZ2F0c2J5Lm5hdmlnYXRlKShsaW5rLCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydHMubmF2aWdhdGUgPSBuYXZpZ2F0ZTtcblxudmFyIGNoYW5nZUxvY2FsZSA9IGZ1bmN0aW9uIGNoYW5nZUxvY2FsZShsYW5ndWFnZSwgdG8pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcm91dGVkID0gd2luZG93Ll9fX2dhdHNieUludGwucm91dGVkO1xuXG4gIHZhciByZW1vdmVQcmVmaXggPSBmdW5jdGlvbiByZW1vdmVQcmVmaXgocGF0aG5hbWUpIHtcbiAgICB2YXIgYmFzZSA9IHR5cGVvZiBfX0JBU0VfUEFUSF9fICE9PSBcInVuZGVmaW5lZFwiID8gX19CQVNFX1BBVEhfXyA6IF9fUEFUSF9QUkVGSVhfXztcblxuICAgIGlmIChiYXNlICYmIHBhdGhuYW1lLmluZGV4T2YoYmFzZSkgPT09IDApIHtcbiAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc2xpY2UoYmFzZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRobmFtZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlTG9jYWxlUGFydCA9IGZ1bmN0aW9uIHJlbW92ZUxvY2FsZVBhcnQocGF0aG5hbWUpIHtcbiAgICBpZiAoIXJvdXRlZCkge1xuICAgICAgcmV0dXJuIHBhdGhuYW1lO1xuICAgIH1cblxuICAgIHZhciBpID0gcGF0aG5hbWUuaW5kZXhPZihcIi9cIiwgMSk7XG4gICAgcmV0dXJuIHBhdGhuYW1lLnN1YnN0cmluZyhpKTtcbiAgfTtcblxuICB2YXIgcGF0aG5hbWUgPSB0byB8fCByZW1vdmVMb2NhbGVQYXJ0KHJlbW92ZVByZWZpeCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpKTsgLy8gVE9ETzogY2hlY2sgc2xhc2hcblxuICB2YXIgbGluayA9IFwiL1wiICsgbGFuZ3VhZ2UgKyBwYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZ2F0c2J5LWludGwtbGFuZ3VhZ2VcIiwgbGFuZ3VhZ2UpO1xuICAoMCwgX2dhdHNieS5uYXZpZ2F0ZSkobGluayk7XG59O1xuXG5leHBvcnRzLmNoYW5nZUxvY2FsZSA9IGNoYW5nZUxvY2FsZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4687\n')},8770:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var _interopRequireDefault=__webpack_require__(5318);exports.__esModule=true;exports.default=void 0;var _react=_interopRequireDefault(__webpack_require__(7294));var _reactIntl=__webpack_require__(7060);var _default=function _default(Component){return function(props){console.warn("withIntl is deprecated. Please use injectIntl instead.");return _react.default.createElement((0,_reactIntl.injectIntl)(Component),props);};};exports.default=_default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nYXRzYnktcGx1Z2luLWludGwvd2l0aC1pbnRsLmpzPzdiNjgiXSwibmFtZXMiOlsiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJleHBvcnRzIiwiX3JlYWN0IiwiX3JlYWN0SW50bCIsIl9kZWZhdWx0IiwiQ29tcG9uZW50IiwicHJvcHMiLCJjb25zb2xlIiwid2FybiIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiaW5qZWN0SW50bCJdLCJtYXBwaW5ncyI6IkFBRUEsR0FBSUEsdUJBQXNCLENBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUFwQyxDQUVBQyxrQkFBQSxDQUFxQixJQUFyQixDQUNBQSxlQUFBLENBQWtCLElBQUssRUFBdkIsQ0FFQSxHQUFJQyxPQUFNLENBQUdILHNCQUFzQixDQUFDQyxtQkFBTyxDQUFDLElBQUQsQ0FBUixDQUFuQyxDQUVBLEdBQUlHLFdBQVUsQ0FBR0gsbUJBQU8sQ0FBQyxJQUFELENBQXhCLENBRUEsR0FBSUksU0FBUSxDQUFHLFFBQVNBLFNBQVQsQ0FBa0JDLFNBQWxCLENBQTZCLENBQzFDLE1BQU8sVUFBVUMsS0FBVixDQUFpQixDQUN0QkMsT0FBTyxDQUFDQyxJQUFSLENBQWEsd0RBQWIsRUFDQSxNQUFPTixPQUFNLENBQUNPLE9BQVAsQ0FBZUMsYUFBZixDQUE2QixDQUFDLEVBQUdQLFVBQVUsQ0FBQ1EsVUFBZixFQUEyQk4sU0FBM0IsQ0FBN0IsQ0FBb0VDLEtBQXBFLENBQVAsQ0FDRCxDQUhELENBSUQsQ0FMRCxDQU9BTCxlQUFBLENBQWtCRyxRQUFsQiIsImZpbGUiOiI4NzcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0SW50bCA9IHJlcXVpcmUoXCJyZWFjdC1pbnRsXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBmdW5jdGlvbiBfZGVmYXVsdChDb21wb25lbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykge1xuICAgIGNvbnNvbGUud2FybihcIndpdGhJbnRsIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgaW5qZWN0SW50bCBpbnN0ZWFkLlwiKTtcbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudCgoMCwgX3JlYWN0SW50bC5pbmplY3RJbnRsKShDb21wb25lbnQpLCBwcm9wcyk7XG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8770\n')}}]); \ No newline at end of file diff --git a/803-0bf34ac/component---src-pages-404-tsx-72a295bef8763296f309.js b/803-0bf34ac/component---src-pages-404-tsx-72a295bef8763296f309.js new file mode 100644 index 00000000..12855171 --- /dev/null +++ b/803-0bf34ac/component---src-pages-404-tsx-72a295bef8763296f309.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[218],{9458:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ _404; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 5 modules\nvar layout = __webpack_require__(5614);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/data/copy/404.tsx\nvar PAGE=(0,react_intl_lib/* defineMessages */.vU)({TITLE:{id:'pageNotFound.title.text',defaultMessage:'Page not found',description:'page not found title text'},HEADING:{id:'pageNotFound.heading.text',defaultMessage:'Page not found',description:'page not found heading text'},APOLOGY:{id:'pageNotFound.apology.text',defaultMessage:'Sorry',description:'page not found apology text'},APOLOGY_INFO:{id:'pageNotFound.apology.description.text',defaultMessage:'we couldn’t find what you were looking for.',description:'page not found apology description text'},GUIDANCE:{id:'pageNotFound.Guidance.text',defaultMessage:'Try creating a page in',description:'page not found guidance text'},LINK_HOME:{id:'pageNotFound.link.to.go.home.text',defaultMessage:'Go home',description:'page not found link to go home text'}});\n;// CONCATENATED MODULE: ./src/pages/404.tsx\nvar codeStyles={color:'#8A6534',padding:4,backgroundColor:'#FFF4DB',fontSize:'1.25rem',borderRadius:4};// markup\nvar NotFoundPage=function NotFoundPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location,title:intl.formatMessage(PAGE.TITLE)},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h1\",null,intl.formatMessage(PAGE.HEADING))),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(PAGE.APOLOGY),' ',/*#__PURE__*/react.createElement(\"span\",{role:\"img\",\"aria-label\":\"Pensive emoji\"},\"\\uD83D\\uDE14\"),' ',intl.formatMessage(PAGE.APOLOGY_INFO))),/*#__PURE__*/react.createElement(lib.Grid,{row:true}, false?/*#__PURE__*/0:null),/*#__PURE__*/react.createElement(lib.Grid,null,/*#__PURE__*/react.createElement(\"p\",null,/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\"/\"},intl.formatMessage(PAGE.LINK_HOME)),\".\"))));};/* harmony default export */ var _404 = (NotFoundPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvNDA0LnRzeD8zMTJiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL3BhZ2VzLzQwNC50c3g/OGJhZiJdLCJuYW1lcyI6WyJQQUdFIiwiZGVmaW5lTWVzc2FnZXMiLCJUSVRMRSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsIkhFQURJTkciLCJBUE9MT0dZIiwiQVBPTE9HWV9JTkZPIiwiR1VJREFOQ0UiLCJMSU5LX0hPTUUiLCJjb2RlU3R5bGVzIiwiY29sb3IiLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiZm9udFNpemUiLCJib3JkZXJSYWRpdXMiLCJOb3RGb3VuZFBhZ2UiLCJsb2NhdGlvbiIsImludGwiLCJ1c2VJbnRsIiwiZm9ybWF0TWVzc2FnZSIsIlBBR0VfTk9UX0ZPVU5EX0NPUFkiLCJwcm9jZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFTyxHQUFNQSxLQUFJLENBQUdDLHlDQUFjLENBQUMsQ0FDakNDLEtBQUssQ0FBRSxDQUNMQyxFQUFFLENBQUUseUJBREMsQ0FFTEMsY0FBYyxDQUFFLGdCQUZYLENBR0xDLFdBQVcsQ0FBRSwyQkFIUixDQUQwQixDQU1qQ0MsT0FBTyxDQUFFLENBQ1BILEVBQUUsQ0FBRSwyQkFERyxDQUVQQyxjQUFjLENBQUUsZ0JBRlQsQ0FHUEMsV0FBVyxDQUFFLDZCQUhOLENBTndCLENBV2pDRSxPQUFPLENBQUUsQ0FDUEosRUFBRSxDQUFFLDJCQURHLENBRVBDLGNBQWMsQ0FBRSxPQUZULENBR1BDLFdBQVcsQ0FBRSw2QkFITixDQVh3QixDQWdCakNHLFlBQVksQ0FBRSxDQUNaTCxFQUFFLENBQUUsdUNBRFEsQ0FFWkMsY0FBYyxDQUFFLDZDQUZKLENBR1pDLFdBQVcsQ0FBRSx5Q0FIRCxDQWhCbUIsQ0FxQmpDSSxRQUFRLENBQUUsQ0FDUk4sRUFBRSxDQUFFLDRCQURJLENBRVJDLGNBQWMsQ0FBRSx3QkFGUixDQUdSQyxXQUFXLENBQUUsOEJBSEwsQ0FyQnVCLENBMEJqQ0ssU0FBUyxDQUFFLENBQ1RQLEVBQUUsQ0FBRSxtQ0FESyxDQUVUQyxjQUFjLENBQUUsU0FGUCxDQUdUQyxXQUFXLENBQUUscUNBSEosQ0ExQnNCLENBQUQsQ0FBM0IsQzs7QUNPUCxHQUFNTSxXQUFVLENBQUcsQ0FDakJDLEtBQUssQ0FBRSxTQURVLENBRWpCQyxPQUFPLENBQUUsQ0FGUSxDQUdqQkMsZUFBZSxDQUFFLFNBSEEsQ0FJakJDLFFBQVEsQ0FBRSxTQUpPLENBS2pCQyxZQUFZLENBQUUsQ0FMRyxDQUFuQixDQVlBO0FBQ0EsR0FBTUMsYUFBWSxDQUFFLFFBQWRBLGFBQWMsTUFBK0IsSUFBN0JDLFNBQTZCLE1BQTdCQSxRQUE2QixDQUNqRCxHQUFNQyxLQUFJLENBQUdDLDhCQUFPLEVBQXBCLENBRUEsbUJBQ0Usb0JBQUMscUJBQUQsRUFBUSxRQUFRLENBQUVGLFFBQWxCLENBQTRCLEtBQUssQ0FBRUMsSUFBSSxDQUFDRSxhQUFMLENBQW1CQyxVQUFuQixDQUFuQyxlQUNFLG9CQUFDLG1DQUFELG1CQUVFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFDRSw4QkFBS0gsSUFBSSxDQUFDRSxhQUFMLENBQW1CQyxZQUFuQixDQUFMLENBREYsQ0FGRixjQU1FLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsZUFDRSw2QkFDR0gsSUFBSSxDQUFDRSxhQUFMLENBQW1CQyxZQUFuQixDQURILENBRUcsR0FGSCxjQUdFLDRCQUFNLElBQUksQ0FBQyxLQUFYLENBQWlCLGFBQVcsZUFBNUIsaUJBSEYsQ0FLVSxHQUxWLENBTUdILElBQUksQ0FBQ0UsYUFBTCxDQUFtQkMsaUJBQW5CLENBTkgsQ0FERixDQU5GLGNBaUJFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLEtBQVQsRUFDR0MsTUFBQSxjQUNHLENBREgsQ0FLSyxJQU5SLENBakJGLGNBMEJFLG9CQUFDLFFBQUQsbUJBQ0UsMENBQ0Usb0JBQUMsdUJBQUQsRUFBTSxFQUFFLENBQUMsR0FBVCxFQUFjSixJQUFJLENBQUNFLGFBQUwsQ0FBbUJDLGNBQW5CLENBQWQsQ0FERixLQURGLENBMUJGLENBREYsQ0FERixDQXFDRCxDQXhDRCxDQTBDQSx5Q0FBZUwsWUFBZiIsImZpbGUiOiI5NDU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmV4cG9ydCBjb25zdCBQQUdFID0gZGVmaW5lTWVzc2FnZXMoe1xuICBUSVRMRToge1xuICAgIGlkOiAncGFnZU5vdEZvdW5kLnRpdGxlLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUGFnZSBub3QgZm91bmQnLFxuICAgIGRlc2NyaXB0aW9uOiAncGFnZSBub3QgZm91bmQgdGl0bGUgdGV4dCcsXG4gIH0sXG4gIEhFQURJTkc6IHtcbiAgICBpZDogJ3BhZ2VOb3RGb3VuZC5oZWFkaW5nLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUGFnZSBub3QgZm91bmQnLFxuICAgIGRlc2NyaXB0aW9uOiAncGFnZSBub3QgZm91bmQgaGVhZGluZyB0ZXh0JyxcbiAgfSxcbiAgQVBPTE9HWToge1xuICAgIGlkOiAncGFnZU5vdEZvdW5kLmFwb2xvZ3kudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdTb3JyeScsXG4gICAgZGVzY3JpcHRpb246ICdwYWdlIG5vdCBmb3VuZCBhcG9sb2d5IHRleHQnLFxuICB9LFxuICBBUE9MT0dZX0lORk86IHtcbiAgICBpZDogJ3BhZ2VOb3RGb3VuZC5hcG9sb2d5LmRlc2NyaXB0aW9uLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnd2UgY291bGRu4oCZdCBmaW5kIHdoYXQgeW91IHdlcmUgbG9va2luZyBmb3IuJyxcbiAgICBkZXNjcmlwdGlvbjogJ3BhZ2Ugbm90IGZvdW5kIGFwb2xvZ3kgZGVzY3JpcHRpb24gdGV4dCcsXG4gIH0sXG4gIEdVSURBTkNFOiB7XG4gICAgaWQ6ICdwYWdlTm90Rm91bmQuR3VpZGFuY2UudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUcnkgY3JlYXRpbmcgYSBwYWdlIGluJyxcbiAgICBkZXNjcmlwdGlvbjogJ3BhZ2Ugbm90IGZvdW5kIGd1aWRhbmNlIHRleHQnLFxuICB9LFxuICBMSU5LX0hPTUU6IHtcbiAgICBpZDogJ3BhZ2VOb3RGb3VuZC5saW5rLnRvLmdvLmhvbWUudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdHbyBob21lJyxcbiAgICBkZXNjcmlwdGlvbjogJ3BhZ2Ugbm90IGZvdW5kIGxpbmsgdG8gZ28gaG9tZSB0ZXh0JyxcbiAgfSxcbn0pO1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtMaW5rfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuaW1wb3J0ICogYXMgUEFHRV9OT1RfRk9VTkRfQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvNDA0JztcblxuY29uc3QgY29kZVN0eWxlcyA9IHtcbiAgY29sb3I6ICcjOEE2NTM0JyxcbiAgcGFkZGluZzogNCxcbiAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRjREQicsXG4gIGZvbnRTaXplOiAnMS4yNXJlbScsXG4gIGJvcmRlclJhZGl1czogNCxcbn07XG5cbmludGVyZmFjZSBJNDA0UGFnZVByb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufVxuXG4vLyBtYXJrdXBcbmNvbnN0IE5vdEZvdW5kUGFnZSA9KHtsb2NhdGlvbn06IEk0MDRQYWdlUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuICByZXR1cm4gKFxuICAgIDxMYXlvdXQgbG9jYXRpb249e2xvY2F0aW9ufSB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKFBBR0VfTk9UX0ZPVU5EX0NPUFkuUEFHRS5USVRMRSl9PlxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICA8aDE+e2ludGwuZm9ybWF0TWVzc2FnZShQQUdFX05PVF9GT1VORF9DT1BZLlBBR0UuSEVBRElORyl9PC9oMT5cbiAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoUEFHRV9OT1RfRk9VTkRfQ09QWS5QQUdFLkFQT0xPR1kpfVxuICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgIDxzcGFuIHJvbGU9XCJpbWdcIiBhcmlhLWxhYmVsPVwiUGVuc2l2ZSBlbW9qaVwiPlxuICAgICAgICAgICAg8J+YlFxuICAgICAgICAgICAgPC9zcGFuPnsnICd9XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKFBBR0VfTk9UX0ZPVU5EX0NPUFkuUEFHRS5BUE9MT0dZX0lORk8pfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICB7cHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgPyAoXG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoUEFHRV9OT1RfRk9VTkRfQ09QWS5QQUdFLkdVSURBTkNFKX1cbiAgICAgICAgICAgICAgICA8Y29kZSBzdHlsZT17Y29kZVN0eWxlc30+c3JjL3BhZ2VzLzwvY29kZT4uXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgPEdyaWQ+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8TGluayB0bz1cIi9cIj57aW50bC5mb3JtYXRNZXNzYWdlKFBBR0VfTk9UX0ZPVU5EX0NPUFkuUEFHRS5MSU5LX0hPTUUpfTwvTGluaz4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L0dyaWQ+XG5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgPC9MYXlvdXQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOb3RGb3VuZFBhZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9458\n")}}]); \ No newline at end of file diff --git a/803-0bf34ac/component---src-pages-cejst-tsx-94f624af453524017476.js b/803-0bf34ac/component---src-pages-cejst-tsx-94f624af453524017476.js new file mode 100644 index 00000000..d2d9d9c2 --- /dev/null +++ b/803-0bf34ac/component---src-pages-cejst-tsx-94f624af453524017476.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[281],{3873:function(module){eval("/**\n * chroma.js - JavaScript library for color conversions\n *\n * Copyright (c) 2011-2019, Gregor Aisch\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. The name Gregor Aisch may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * -------------------------------------------------------\n *\n * chroma.js includes colors from colorbrewer2.org, which are released under\n * the following license:\n *\n * Copyright (c) 2002 Cynthia Brewer, Mark Harrower,\n * and The Pennsylvania State University.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n * either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n *\n * ------------------------------------------------------\n *\n * Named colors are taken from X11 Color Names.\n * http://www.w3.org/TR/css3-color/#svg-color\n *\n * @preserve\n */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n 'use strict';\n\n var limit = function limit(x, min, max) {\n if (min === void 0) min = 0;\n if (max === void 0) max = 1;\n return x < min ? min : x > max ? max : x;\n };\n\n var clip_rgb = function clip_rgb(rgb) {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n\n for (var i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) {\n rgb._clipped = true;\n }\n\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n\n return rgb;\n }; // ported from jQuery's $.type\n\n\n var classToType = {};\n\n for (var i = 0, list = ['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Undefined', 'Null']; i < list.length; i += 1) {\n var name = list[i];\n classToType[\"[object \" + name + \"]\"] = name.toLowerCase();\n }\n\n var type = function type(obj) {\n return classToType[Object.prototype.toString.call(obj)] || \"object\";\n };\n\n var unpack = function unpack(args, keyOrder) {\n if (keyOrder === void 0) keyOrder = null; // if called with more than 3 arguments, we return the arguments\n\n if (args.length >= 3) {\n return Array.prototype.slice.call(args);\n } // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n\n\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder.split('').filter(function (k) {\n return args[0][k] !== undefined;\n }).map(function (k) {\n return args[0][k];\n });\n } // otherwise we just return the first argument\n // (which we suppose is an array of args)\n\n\n return args[0];\n };\n\n var last = function last(args) {\n if (args.length < 2) {\n return null;\n }\n\n var l = args.length - 1;\n\n if (type(args[l]) == 'string') {\n return args[l].toLowerCase();\n }\n\n return null;\n };\n\n var PI = Math.PI;\n var utils = {\n clip_rgb: clip_rgb,\n limit: limit,\n type: type,\n unpack: unpack,\n last: last,\n PI: PI,\n TWOPI: PI * 2,\n PITHIRD: PI / 3,\n DEG2RAD: PI / 180,\n RAD2DEG: 180 / PI\n };\n var input = {\n format: {},\n autodetect: []\n };\n var last$1 = utils.last;\n var clip_rgb$1 = utils.clip_rgb;\n var type$1 = utils.type;\n\n var Color = function Color() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var me = this;\n\n if (type$1(args[0]) === 'object' && args[0].constructor && args[0].constructor === this.constructor) {\n // the argument is already a Color instance\n return args[0];\n } // last argument could be the mode\n\n\n var mode = last$1(args);\n var autodetect = false;\n\n if (!mode) {\n autodetect = true;\n\n if (!input.sorted) {\n input.autodetect = input.autodetect.sort(function (a, b) {\n return b.p - a.p;\n });\n input.sorted = true;\n } // auto-detect format\n\n\n for (var i = 0, list = input.autodetect; i < list.length; i += 1) {\n var chk = list[i];\n mode = chk.test.apply(chk, args);\n\n if (mode) {\n break;\n }\n }\n }\n\n if (input.format[mode]) {\n var rgb = input.format[mode].apply(null, autodetect ? args : args.slice(0, -1));\n me._rgb = clip_rgb$1(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n } // add alpha channel\n\n\n if (me._rgb.length === 3) {\n me._rgb.push(1);\n }\n };\n\n Color.prototype.toString = function toString() {\n if (type$1(this.hex) == 'function') {\n return this.hex();\n }\n\n return \"[\" + this._rgb.join(',') + \"]\";\n };\n\n var Color_1 = Color;\n\n var chroma = function chroma() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(chroma.Color, [null].concat(args)))();\n };\n\n chroma.Color = Color_1;\n chroma.version = '2.1.2';\n var chroma_1 = chroma;\n var unpack$1 = utils.unpack;\n var max = Math.max;\n\n var rgb2cmyk = function rgb2cmyk() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$1(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n r = r / 255;\n g = g / 255;\n b = b / 255;\n var k = 1 - max(r, max(g, b));\n var f = k < 1 ? 1 / (1 - k) : 0;\n var c = (1 - r - k) * f;\n var m = (1 - g - k) * f;\n var y = (1 - b - k) * f;\n return [c, m, y, k];\n };\n\n var rgb2cmyk_1 = rgb2cmyk;\n var unpack$2 = utils.unpack;\n\n var cmyk2rgb = function cmyk2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$2(args, 'cmyk');\n var c = args[0];\n var m = args[1];\n var y = args[2];\n var k = args[3];\n var alpha = args.length > 4 ? args[4] : 1;\n\n if (k === 1) {\n return [0, 0, 0, alpha];\n }\n\n return [c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha];\n };\n\n var cmyk2rgb_1 = cmyk2rgb;\n var unpack$3 = utils.unpack;\n var type$2 = utils.type;\n\n Color_1.prototype.cmyk = function () {\n return rgb2cmyk_1(this._rgb);\n };\n\n chroma_1.cmyk = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['cmyk'])))();\n };\n\n input.format.cmyk = cmyk2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$3(args, 'cmyk');\n\n if (type$2(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n });\n var unpack$4 = utils.unpack;\n var last$2 = utils.last;\n\n var rnd = function rnd(a) {\n return Math.round(a * 100) / 100;\n };\n /*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\n\n\n var hsl2css = function hsl2css() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var hsla = unpack$4(args, 'hsla');\n var mode = last$2(args) || 'lsa';\n hsla[0] = rnd(hsla[0] || 0);\n hsla[1] = rnd(hsla[1] * 100) + '%';\n hsla[2] = rnd(hsla[2] * 100) + '%';\n\n if (mode === 'hsla' || hsla.length > 3 && hsla[3] < 1) {\n hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n\n return mode + \"(\" + hsla.join(',') + \")\";\n };\n\n var hsl2css_1 = hsl2css;\n var unpack$5 = utils.unpack;\n /*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\n\n var rgb2hsl = function rgb2hsl() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$5(args, 'rgba');\n var r = args[0];\n var g = args[1];\n var b = args[2];\n r /= 255;\n g /= 255;\n b /= 255;\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var l = (max + min) / 2;\n var s, h;\n\n if (max === min) {\n s = 0;\n h = Number.NaN;\n } else {\n s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n }\n\n if (r == max) {\n h = (g - b) / (max - min);\n } else if (g == max) {\n h = 2 + (b - r) / (max - min);\n } else if (b == max) {\n h = 4 + (r - g) / (max - min);\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n\n if (args.length > 3 && args[3] !== undefined) {\n return [h, s, l, args[3]];\n }\n\n return [h, s, l];\n };\n\n var rgb2hsl_1 = rgb2hsl;\n var unpack$6 = utils.unpack;\n var last$3 = utils.last;\n var round = Math.round;\n /*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\n\n var rgb2css = function rgb2css() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgba = unpack$6(args, 'rgba');\n var mode = last$3(args) || 'rgb';\n\n if (mode.substr(0, 3) == 'hsl') {\n return hsl2css_1(rgb2hsl_1(rgba), mode);\n }\n\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n\n if (mode === 'rgba' || rgba.length > 3 && rgba[3] < 1) {\n rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n mode = 'rgba';\n }\n\n return mode + \"(\" + rgba.slice(0, mode === 'rgb' ? 3 : 4).join(',') + \")\";\n };\n\n var rgb2css_1 = rgb2css;\n var unpack$7 = utils.unpack;\n var round$1 = Math.round;\n\n var hsl2rgb = function hsl2rgb() {\n var assign;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$7(args, 'hsl');\n var h = args[0];\n var s = args[1];\n var l = args[2];\n var r, g, b;\n\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n var t3 = [0, 0, 0];\n var c = [0, 0, 0];\n var t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var t1 = 2 * l - t2;\n var h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n\n for (var i = 0; i < 3; i++) {\n if (t3[i] < 0) {\n t3[i] += 1;\n }\n\n if (t3[i] > 1) {\n t3[i] -= 1;\n }\n\n if (6 * t3[i] < 1) {\n c[i] = t1 + (t2 - t1) * 6 * t3[i];\n } else if (2 * t3[i] < 1) {\n c[i] = t2;\n } else if (3 * t3[i] < 2) {\n c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n } else {\n c[i] = t1;\n }\n }\n\n assign = [round$1(c[0] * 255), round$1(c[1] * 255), round$1(c[2] * 255)], r = assign[0], g = assign[1], b = assign[2];\n }\n\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n\n return [r, g, b, 1];\n };\n\n var hsl2rgb_1 = hsl2rgb;\n var RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\n var RE_RGBA = /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var RE_RGB_PCT = /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n var RE_RGBA_PCT = /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var RE_HSL = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\n var RE_HSLA = /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n var round$2 = Math.round;\n\n var css2rgb = function css2rgb(css) {\n css = css.toLowerCase().trim();\n var m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n } catch (e) {// eslint-disable-next-line\n }\n } // rgb(250,20,0)\n\n\n if (m = css.match(RE_RGB)) {\n var rgb = m.slice(1, 4);\n\n for (var i = 0; i < 3; i++) {\n rgb[i] = +rgb[i];\n }\n\n rgb[3] = 1; // default alpha\n\n return rgb;\n } // rgba(250,20,0,0.4)\n\n\n if (m = css.match(RE_RGBA)) {\n var rgb$1 = m.slice(1, 5);\n\n for (var i$1 = 0; i$1 < 4; i$1++) {\n rgb$1[i$1] = +rgb$1[i$1];\n }\n\n return rgb$1;\n } // rgb(100%,0%,0%)\n\n\n if (m = css.match(RE_RGB_PCT)) {\n var rgb$2 = m.slice(1, 4);\n\n for (var i$2 = 0; i$2 < 3; i$2++) {\n rgb$2[i$2] = round$2(rgb$2[i$2] * 2.55);\n }\n\n rgb$2[3] = 1; // default alpha\n\n return rgb$2;\n } // rgba(100%,0%,0%,0.4)\n\n\n if (m = css.match(RE_RGBA_PCT)) {\n var rgb$3 = m.slice(1, 5);\n\n for (var i$3 = 0; i$3 < 3; i$3++) {\n rgb$3[i$3] = round$2(rgb$3[i$3] * 2.55);\n }\n\n rgb$3[3] = +rgb$3[3];\n return rgb$3;\n } // hsl(0,100%,50%)\n\n\n if (m = css.match(RE_HSL)) {\n var hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n var rgb$4 = hsl2rgb_1(hsl);\n rgb$4[3] = 1;\n return rgb$4;\n } // hsla(0,100%,50%,0.5)\n\n\n if (m = css.match(RE_HSLA)) {\n var hsl$1 = m.slice(1, 4);\n hsl$1[1] *= 0.01;\n hsl$1[2] *= 0.01;\n var rgb$5 = hsl2rgb_1(hsl$1);\n rgb$5[3] = +m[4]; // default alpha = 1\n\n return rgb$5;\n }\n };\n\n css2rgb.test = function (s) {\n return RE_RGB.test(s) || RE_RGBA.test(s) || RE_RGB_PCT.test(s) || RE_RGBA_PCT.test(s) || RE_HSL.test(s) || RE_HSLA.test(s);\n };\n\n var css2rgb_1 = css2rgb;\n var type$3 = utils.type;\n\n Color_1.prototype.css = function (mode) {\n return rgb2css_1(this._rgb, mode);\n };\n\n chroma_1.css = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['css'])))();\n };\n\n input.format.css = css2rgb_1;\n input.autodetect.push({\n p: 5,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$3(h) === 'string' && css2rgb_1.test(h)) {\n return 'css';\n }\n }\n });\n var unpack$8 = utils.unpack;\n\n input.format.gl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgb = unpack$8(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n };\n\n chroma_1.gl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['gl'])))();\n };\n\n Color_1.prototype.gl = function () {\n var rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n };\n\n var unpack$9 = utils.unpack;\n\n var rgb2hcg = function rgb2hcg() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$9(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var c = delta * 100 / 255;\n\n var _g = min / (255 - delta) * 100;\n\n var h;\n\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === max) {\n h = (g - b) / delta;\n }\n\n if (g === max) {\n h = 2 + (b - r) / delta;\n }\n\n if (b === max) {\n h = 4 + (r - g) / delta;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return [h, c, _g];\n };\n\n var rgb2hcg_1 = rgb2hcg;\n var unpack$a = utils.unpack;\n var floor = Math.floor;\n /*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\n var hcg2rgb = function hcg2rgb() {\n var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$a(args, 'hcg');\n var h = args[0];\n var c = args[1];\n var _g = args[2];\n var r, g, b;\n _g = _g * 255;\n\n var _c = c * 255;\n\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) {\n h = 0;\n }\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 60;\n var i = floor(h);\n var f = h - i;\n var p = _g * (1 - c);\n var q = p + _c * (1 - f);\n var t = p + _c * f;\n var v = p + _c;\n\n switch (i) {\n case 0:\n assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2];\n break;\n\n case 1:\n assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2];\n break;\n\n case 2:\n assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2];\n break;\n\n case 3:\n assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2];\n break;\n\n case 4:\n assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2];\n break;\n\n case 5:\n assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2];\n break;\n }\n }\n\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var hcg2rgb_1 = hcg2rgb;\n var unpack$b = utils.unpack;\n var type$4 = utils.type;\n\n Color_1.prototype.hcg = function () {\n return rgb2hcg_1(this._rgb);\n };\n\n chroma_1.hcg = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hcg'])))();\n };\n\n input.format.hcg = hcg2rgb_1;\n input.autodetect.push({\n p: 1,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$b(args, 'hcg');\n\n if (type$4(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n });\n var unpack$c = utils.unpack;\n var last$4 = utils.last;\n var round$3 = Math.round;\n\n var rgb2hex = function rgb2hex() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$c(args, 'rgba');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var a = ref[3];\n var mode = last$4(args) || 'auto';\n\n if (a === undefined) {\n a = 1;\n }\n\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n\n r = round$3(r);\n g = round$3(g);\n b = round$3(b);\n var u = r << 16 | g << 8 | b;\n var str = \"000000\" + u.toString(16); //#.toUpperCase();\n\n str = str.substr(str.length - 6);\n var hxa = '0' + round$3(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n\n switch (mode.toLowerCase()) {\n case 'rgba':\n return \"#\" + str + hxa;\n\n case 'argb':\n return \"#\" + hxa + str;\n\n default:\n return \"#\" + str;\n }\n };\n\n var rgb2hex_1 = rgb2hex;\n var RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n var RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\n var hex2rgb = function hex2rgb(hex) {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n } // expand short-notation to full six-digit\n\n\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n var u = parseInt(hex, 16);\n var r = u >> 16;\n var g = u >> 8 & 0xFF;\n var b = u & 0xFF;\n return [r, g, b, 1];\n } // match rgba hex format, eg #FF000077\n\n\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n } // expand short-notation to full eight-digit\n\n\n if (hex.length === 4) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];\n }\n\n var u$1 = parseInt(hex, 16);\n var r$1 = u$1 >> 24 & 0xFF;\n var g$1 = u$1 >> 16 & 0xFF;\n var b$1 = u$1 >> 8 & 0xFF;\n var a = Math.round((u$1 & 0xFF) / 0xFF * 100) / 100;\n return [r$1, g$1, b$1, a];\n } // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n\n throw new Error(\"unknown hex color: \" + hex);\n };\n\n var hex2rgb_1 = hex2rgb;\n var type$5 = utils.type;\n\n Color_1.prototype.hex = function (mode) {\n return rgb2hex_1(this._rgb, mode);\n };\n\n chroma_1.hex = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hex'])))();\n };\n\n input.format.hex = hex2rgb_1;\n input.autodetect.push({\n p: 4,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$5(h) === 'string' && [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0) {\n return 'hex';\n }\n }\n });\n var unpack$d = utils.unpack;\n var TWOPI = utils.TWOPI;\n var min = Math.min;\n var sqrt = Math.sqrt;\n var acos = Math.acos;\n\n var rgb2hsi = function rgb2hsi() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n\n\n var ref = unpack$d(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n r /= 255;\n g /= 255;\n b /= 255;\n var h;\n var min_ = min(r, g, b);\n var i = (r + g + b) / 3;\n var s = i > 0 ? 1 - min_ / i : 0;\n\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n\n if (b > g) {\n h = TWOPI - h;\n }\n\n h /= TWOPI;\n }\n\n return [h * 360, s, i];\n };\n\n var rgb2hsi_1 = rgb2hsi;\n var unpack$e = utils.unpack;\n var limit$1 = utils.limit;\n var TWOPI$1 = utils.TWOPI;\n var PITHIRD = utils.PITHIRD;\n var cos = Math.cos;\n /*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\n\n var hsi2rgb = function hsi2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n\n\n args = unpack$e(args, 'hsi');\n var h = args[0];\n var s = args[1];\n var i = args[2];\n var r, g, b;\n\n if (isNaN(h)) {\n h = 0;\n }\n\n if (isNaN(s)) {\n s = 0;\n } // normalize hue\n\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 360;\n\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + s * cos(TWOPI$1 * h) / cos(PITHIRD - TWOPI$1 * h)) / 3;\n r = 1 - (g + b);\n }\n\n r = limit$1(i * r * 3);\n g = limit$1(i * g * 3);\n b = limit$1(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n };\n\n var hsi2rgb_1 = hsi2rgb;\n var unpack$f = utils.unpack;\n var type$6 = utils.type;\n\n Color_1.prototype.hsi = function () {\n return rgb2hsi_1(this._rgb);\n };\n\n chroma_1.hsi = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsi'])))();\n };\n\n input.format.hsi = hsi2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$f(args, 'hsi');\n\n if (type$6(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n });\n var unpack$g = utils.unpack;\n var type$7 = utils.type;\n\n Color_1.prototype.hsl = function () {\n return rgb2hsl_1(this._rgb);\n };\n\n chroma_1.hsl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsl'])))();\n };\n\n input.format.hsl = hsl2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$g(args, 'hsl');\n\n if (type$7(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n });\n var unpack$h = utils.unpack;\n var min$1 = Math.min;\n var max$1 = Math.max;\n /*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\n\n var rgb2hsl$1 = function rgb2hsl$1() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$h(args, 'rgb');\n var r = args[0];\n var g = args[1];\n var b = args[2];\n var min_ = min$1(r, g, b);\n var max_ = max$1(r, g, b);\n var delta = max_ - min_;\n var h, s, v;\n v = max_ / 255.0;\n\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n\n if (r === max_) {\n h = (g - b) / delta;\n }\n\n if (g === max_) {\n h = 2 + (b - r) / delta;\n }\n\n if (b === max_) {\n h = 4 + (r - g) / delta;\n }\n\n h *= 60;\n\n if (h < 0) {\n h += 360;\n }\n }\n\n return [h, s, v];\n };\n\n var rgb2hsv = rgb2hsl$1;\n var unpack$i = utils.unpack;\n var floor$1 = Math.floor;\n\n var hsv2rgb = function hsv2rgb() {\n var assign, assign$1, assign$2, assign$3, assign$4, assign$5;\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$i(args, 'hsv');\n var h = args[0];\n var s = args[1];\n var v = args[2];\n var r, g, b;\n v *= 255;\n\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) {\n h = 0;\n }\n\n if (h > 360) {\n h -= 360;\n }\n\n if (h < 0) {\n h += 360;\n }\n\n h /= 60;\n var i = floor$1(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - s * f);\n var t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n assign = [v, t, p], r = assign[0], g = assign[1], b = assign[2];\n break;\n\n case 1:\n assign$1 = [q, v, p], r = assign$1[0], g = assign$1[1], b = assign$1[2];\n break;\n\n case 2:\n assign$2 = [p, v, t], r = assign$2[0], g = assign$2[1], b = assign$2[2];\n break;\n\n case 3:\n assign$3 = [p, q, v], r = assign$3[0], g = assign$3[1], b = assign$3[2];\n break;\n\n case 4:\n assign$4 = [t, p, v], r = assign$4[0], g = assign$4[1], b = assign$4[2];\n break;\n\n case 5:\n assign$5 = [v, p, q], r = assign$5[0], g = assign$5[1], b = assign$5[2];\n break;\n }\n }\n\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var hsv2rgb_1 = hsv2rgb;\n var unpack$j = utils.unpack;\n var type$8 = utils.type;\n\n Color_1.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n };\n\n chroma_1.hsv = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hsv'])))();\n };\n\n input.format.hsv = hsv2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$j(args, 'hsv');\n\n if (type$8(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n });\n var labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n // D65 standard referent\n Xn: 0.950470,\n Yn: 1,\n Zn: 1.088830,\n t0: 0.137931034,\n // 4 / 29\n t1: 0.206896552,\n // 6 / 29\n t2: 0.12841855,\n // 3 * t1 * t1\n t3: 0.008856452 // t1 * t1 * t1\n\n };\n var unpack$k = utils.unpack;\n var pow = Math.pow;\n\n var rgb2lab = function rgb2lab() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$k(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var ref$1 = rgb2xyz(r, g, b);\n var x = ref$1[0];\n var y = ref$1[1];\n var z = ref$1[2];\n var l = 116 * y - 16;\n return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n };\n\n var rgb_xyz = function rgb_xyz(r) {\n if ((r /= 255) <= 0.04045) {\n return r / 12.92;\n }\n\n return pow((r + 0.055) / 1.055, 2.4);\n };\n\n var xyz_lab = function xyz_lab(t) {\n if (t > labConstants.t3) {\n return pow(t, 1 / 3);\n }\n\n return t / labConstants.t2 + labConstants.t0;\n };\n\n var rgb2xyz = function rgb2xyz(r, g, b) {\n r = rgb_xyz(r);\n g = rgb_xyz(g);\n b = rgb_xyz(b);\n var x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / labConstants.Xn);\n var y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / labConstants.Yn);\n var z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / labConstants.Zn);\n return [x, y, z];\n };\n\n var rgb2lab_1 = rgb2lab;\n var unpack$l = utils.unpack;\n var pow$1 = Math.pow;\n /*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\n\n var lab2rgb = function lab2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$l(args, 'lab');\n var l = args[0];\n var a = args[1];\n var b = args[2];\n var x, y, z, r, g, b_;\n y = (l + 16) / 116;\n x = isNaN(a) ? y : y + a / 500;\n z = isNaN(b) ? y : y - b / 200;\n y = labConstants.Yn * lab_xyz(y);\n x = labConstants.Xn * lab_xyz(x);\n z = labConstants.Zn * lab_xyz(z);\n r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); // D65 -> sRGB\n\n g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n };\n\n var xyz_rgb = function xyz_rgb(r) {\n return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow$1(r, 1 / 2.4) - 0.055);\n };\n\n var lab_xyz = function lab_xyz(t) {\n return t > labConstants.t1 ? t * t * t : labConstants.t2 * (t - labConstants.t0);\n };\n\n var lab2rgb_1 = lab2rgb;\n var unpack$m = utils.unpack;\n var type$9 = utils.type;\n\n Color_1.prototype.lab = function () {\n return rgb2lab_1(this._rgb);\n };\n\n chroma_1.lab = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['lab'])))();\n };\n\n input.format.lab = lab2rgb_1;\n input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$m(args, 'lab');\n\n if (type$9(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n });\n var unpack$n = utils.unpack;\n var RAD2DEG = utils.RAD2DEG;\n var sqrt$1 = Math.sqrt;\n var atan2 = Math.atan2;\n var round$4 = Math.round;\n\n var lab2lch = function lab2lch() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$n(args, 'lab');\n var l = ref[0];\n var a = ref[1];\n var b = ref[2];\n var c = sqrt$1(a * a + b * b);\n var h = (atan2(b, a) * RAD2DEG + 360) % 360;\n\n if (round$4(c * 10000) === 0) {\n h = Number.NaN;\n }\n\n return [l, c, h];\n };\n\n var lab2lch_1 = lab2lch;\n var unpack$o = utils.unpack;\n\n var rgb2lch = function rgb2lch() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$o(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n var ref$1 = rgb2lab_1(r, g, b);\n var l = ref$1[0];\n var a = ref$1[1];\n var b_ = ref$1[2];\n return lab2lch_1(l, a, b_);\n };\n\n var rgb2lch_1 = rgb2lch;\n var unpack$p = utils.unpack;\n var DEG2RAD = utils.DEG2RAD;\n var sin = Math.sin;\n var cos$1 = Math.cos;\n\n var lch2lab = function lch2lab() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n A saturation multiplier was added by Gregor Aisch\n */\n\n\n var ref = unpack$p(args, 'lch');\n var l = ref[0];\n var c = ref[1];\n var h = ref[2];\n\n if (isNaN(h)) {\n h = 0;\n }\n\n h = h * DEG2RAD;\n return [l, cos$1(h) * c, sin(h) * c];\n };\n\n var lch2lab_1 = lch2lab;\n var unpack$q = utils.unpack;\n\n var lch2rgb = function lch2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$q(args, 'lch');\n var l = args[0];\n var c = args[1];\n var h = args[2];\n var ref = lch2lab_1(l, c, h);\n var L = ref[0];\n var a = ref[1];\n var b_ = ref[2];\n var ref$1 = lab2rgb_1(L, a, b_);\n var r = ref$1[0];\n var g = ref$1[1];\n var b = ref$1[2];\n return [r, g, b, args.length > 3 ? args[3] : 1];\n };\n\n var lch2rgb_1 = lch2rgb;\n var unpack$r = utils.unpack;\n\n var hcl2rgb = function hcl2rgb() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var hcl = unpack$r(args, 'hcl').reverse();\n return lch2rgb_1.apply(void 0, hcl);\n };\n\n var hcl2rgb_1 = hcl2rgb;\n var unpack$s = utils.unpack;\n var type$a = utils.type;\n\n Color_1.prototype.lch = function () {\n return rgb2lch_1(this._rgb);\n };\n\n Color_1.prototype.hcl = function () {\n return rgb2lch_1(this._rgb).reverse();\n };\n\n chroma_1.lch = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['lch'])))();\n };\n\n chroma_1.hcl = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['hcl'])))();\n };\n\n input.format.lch = lch2rgb_1;\n input.format.hcl = hcl2rgb_1;\n ['lch', 'hcl'].forEach(function (m) {\n return input.autodetect.push({\n p: 2,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$s(args, m);\n\n if (type$a(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n });\n });\n /**\n \tX11 color names\n \thttp://www.w3.org/TR/css3-color/#svg-color\n */\n\n var w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflower: '#6495ed',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n };\n var w3cx11_1 = w3cx11;\n var type$b = utils.type;\n\n Color_1.prototype.name = function () {\n var hex = rgb2hex_1(this._rgb, 'rgb');\n\n for (var i = 0, list = Object.keys(w3cx11_1); i < list.length; i += 1) {\n var n = list[i];\n\n if (w3cx11_1[n] === hex) {\n return n.toLowerCase();\n }\n }\n\n return hex;\n };\n\n input.format.named = function (name) {\n name = name.toLowerCase();\n\n if (w3cx11_1[name]) {\n return hex2rgb_1(w3cx11_1[name]);\n }\n\n throw new Error('unknown color name: ' + name);\n };\n\n input.autodetect.push({\n p: 5,\n test: function test(h) {\n var rest = [],\n len = arguments.length - 1;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 1];\n }\n\n if (!rest.length && type$b(h) === 'string' && w3cx11_1[h.toLowerCase()]) {\n return 'named';\n }\n }\n });\n var unpack$t = utils.unpack;\n\n var rgb2num = function rgb2num() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var ref = unpack$t(args, 'rgb');\n var r = ref[0];\n var g = ref[1];\n var b = ref[2];\n return (r << 16) + (g << 8) + b;\n };\n\n var rgb2num_1 = rgb2num;\n var type$c = utils.type;\n\n var num2rgb = function num2rgb(num) {\n if (type$c(num) == \"number\" && num >= 0 && num <= 0xFFFFFF) {\n var r = num >> 16;\n var g = num >> 8 & 0xFF;\n var b = num & 0xFF;\n return [r, g, b, 1];\n }\n\n throw new Error(\"unknown num color: \" + num);\n };\n\n var num2rgb_1 = num2rgb;\n var type$d = utils.type;\n\n Color_1.prototype.num = function () {\n return rgb2num_1(this._rgb);\n };\n\n chroma_1.num = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['num'])))();\n };\n\n input.format.num = num2rgb_1;\n input.autodetect.push({\n p: 5,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n if (args.length === 1 && type$d(args[0]) === 'number' && args[0] >= 0 && args[0] <= 0xFFFFFF) {\n return 'num';\n }\n }\n });\n var unpack$u = utils.unpack;\n var type$e = utils.type;\n var round$5 = Math.round;\n\n Color_1.prototype.rgb = function (rnd) {\n if (rnd === void 0) rnd = true;\n\n if (rnd === false) {\n return this._rgb.slice(0, 3);\n }\n\n return this._rgb.slice(0, 3).map(round$5);\n };\n\n Color_1.prototype.rgba = function (rnd) {\n if (rnd === void 0) rnd = true;\n return this._rgb.slice(0, 4).map(function (v, i) {\n return i < 3 ? rnd === false ? v : round$5(v) : v;\n });\n };\n\n chroma_1.rgb = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['rgb'])))();\n };\n\n input.format.rgb = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgba = unpack$u(args, 'rgba');\n\n if (rgba[3] === undefined) {\n rgba[3] = 1;\n }\n\n return rgba;\n };\n\n input.autodetect.push({\n p: 3,\n test: function test() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n args = unpack$u(args, 'rgba');\n\n if (type$e(args) === 'array' && (args.length === 3 || args.length === 4 && type$e(args[3]) == 'number' && args[3] >= 0 && args[3] <= 1)) {\n return 'rgb';\n }\n }\n });\n /*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\n var log = Math.log;\n\n var temperature2rgb = function temperature2rgb(kelvin) {\n var temp = kelvin / 100;\n var r, g, b;\n\n if (temp < 66) {\n r = 255;\n g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g);\n b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b);\n } else {\n r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r);\n g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g);\n b = 255;\n }\n\n return [r, g, b, 1];\n };\n\n var temperature2rgb_1 = temperature2rgb;\n /*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\n var unpack$v = utils.unpack;\n var round$6 = Math.round;\n\n var rgb2temperature = function rgb2temperature() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n var rgb = unpack$v(args, 'rgb');\n var r = rgb[0],\n b = rgb[2];\n var minTemp = 1000;\n var maxTemp = 40000;\n var eps = 0.4;\n var temp;\n\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n var rgb$1 = temperature2rgb_1(temp);\n\n if (rgb$1[2] / rgb$1[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n\n return round$6(temp);\n };\n\n var rgb2temperature_1 = rgb2temperature;\n\n Color_1.prototype.temp = Color_1.prototype.kelvin = Color_1.prototype.temperature = function () {\n return rgb2temperature_1(this._rgb);\n };\n\n chroma_1.temp = chroma_1.kelvin = chroma_1.temperature = function () {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n return new (Function.prototype.bind.apply(Color_1, [null].concat(args, ['temp'])))();\n };\n\n input.format.temp = input.format.kelvin = input.format.temperature = temperature2rgb_1;\n var type$f = utils.type;\n\n Color_1.prototype.alpha = function (a, mutate) {\n if (mutate === void 0) mutate = false;\n\n if (a !== undefined && type$f(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n\n return new Color_1([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n\n return this._rgb[3];\n };\n\n Color_1.prototype.clipped = function () {\n return this._rgb._clipped || false;\n };\n\n Color_1.prototype.darken = function (amount) {\n if (amount === void 0) amount = 1;\n var me = this;\n var lab = me.lab();\n lab[0] -= labConstants.Kn * amount;\n return new Color_1(lab, 'lab').alpha(me.alpha(), true);\n };\n\n Color_1.prototype.brighten = function (amount) {\n if (amount === void 0) amount = 1;\n return this.darken(-amount);\n };\n\n Color_1.prototype.darker = Color_1.prototype.darken;\n Color_1.prototype.brighter = Color_1.prototype.brighten;\n\n Color_1.prototype.get = function (mc) {\n var ref = mc.split('.');\n var mode = ref[0];\n var channel = ref[1];\n var src = this[mode]();\n\n if (channel) {\n var i = mode.indexOf(channel);\n\n if (i > -1) {\n return src[i];\n }\n\n throw new Error(\"unknown channel \" + channel + \" in mode \" + mode);\n } else {\n return src;\n }\n };\n\n var type$g = utils.type;\n var pow$2 = Math.pow;\n var EPS = 1e-7;\n var MAX_ITER = 20;\n\n Color_1.prototype.luminance = function (lum) {\n if (lum !== undefined && type$g(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color_1([0, 0, 0, this._rgb[3]], 'rgb');\n }\n\n if (lum === 1) {\n // return pure white\n return new Color_1([255, 255, 255, this._rgb[3]], 'rgb');\n } // compute new color using...\n\n\n var cur_lum = this.luminance();\n var mode = 'rgb';\n var max_iter = MAX_ITER;\n\n var test = function test(low, high) {\n var mid = low.interpolate(high, 0.5, mode);\n var lm = mid.luminance();\n\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n var rgb = (cur_lum > lum ? test(new Color_1([0, 0, 0]), this) : test(this, new Color_1([255, 255, 255]))).rgb();\n return new Color_1(rgb.concat([this._rgb[3]]));\n }\n\n return rgb2luminance.apply(void 0, this._rgb.slice(0, 3));\n };\n\n var rgb2luminance = function rgb2luminance(r, g, b) {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n };\n\n var luminance_x = function luminance_x(x) {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow$2((x + 0.055) / 1.055, 2.4);\n };\n\n var interpolator = {};\n var type$h = utils.type;\n\n var mix = function mix(col1, col2, f) {\n if (f === void 0) f = 0.5;\n var rest = [],\n len = arguments.length - 3;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 3];\n }\n\n var mode = rest[0] || 'lrgb';\n\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n\n if (!interpolator[mode]) {\n throw new Error(\"interpolation mode \" + mode + \" is not defined\");\n }\n\n if (type$h(col1) !== 'object') {\n col1 = new Color_1(col1);\n }\n\n if (type$h(col2) !== 'object') {\n col2 = new Color_1(col2);\n }\n\n return interpolator[mode](col1, col2, f).alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n };\n\n Color_1.prototype.mix = Color_1.prototype.interpolate = function (col2, f) {\n if (f === void 0) f = 0.5;\n var rest = [],\n len = arguments.length - 2;\n\n while (len-- > 0) {\n rest[len] = arguments[len + 2];\n }\n\n return mix.apply(void 0, [this, col2, f].concat(rest));\n };\n\n Color_1.prototype.premultiply = function (mutate) {\n if (mutate === void 0) mutate = false;\n var rgb = this._rgb;\n var a = rgb[3];\n\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color_1([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n };\n\n Color_1.prototype.saturate = function (amount) {\n if (amount === void 0) amount = 1;\n var me = this;\n var lch = me.lch();\n lch[1] += labConstants.Kn * amount;\n\n if (lch[1] < 0) {\n lch[1] = 0;\n }\n\n return new Color_1(lch, 'lch').alpha(me.alpha(), true);\n };\n\n Color_1.prototype.desaturate = function (amount) {\n if (amount === void 0) amount = 1;\n return this.saturate(-amount);\n };\n\n var type$i = utils.type;\n\n Color_1.prototype.set = function (mc, value, mutate) {\n if (mutate === void 0) mutate = false;\n var ref = mc.split('.');\n var mode = ref[0];\n var channel = ref[1];\n var src = this[mode]();\n\n if (channel) {\n var i = mode.indexOf(channel);\n\n if (i > -1) {\n if (type$i(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n\n case '-':\n src[i] += +value;\n break;\n\n case '*':\n src[i] *= +value.substr(1);\n break;\n\n case '/':\n src[i] /= +value.substr(1);\n break;\n\n default:\n src[i] = +value;\n }\n } else if (type$i(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(\"unsupported value for Color.set\");\n }\n\n var out = new Color_1(src, mode);\n\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n\n return out;\n }\n\n throw new Error(\"unknown channel \" + channel + \" in mode \" + mode);\n } else {\n return src;\n }\n };\n\n var rgb$1 = function rgb$1(col1, col2, f) {\n var xyz0 = col1._rgb;\n var xyz1 = col2._rgb;\n return new Color_1(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), 'rgb');\n }; // register interpolator\n\n\n interpolator.rgb = rgb$1;\n var sqrt$2 = Math.sqrt;\n var pow$3 = Math.pow;\n\n var lrgb = function lrgb(col1, col2, f) {\n var ref = col1._rgb;\n var x1 = ref[0];\n var y1 = ref[1];\n var z1 = ref[2];\n var ref$1 = col2._rgb;\n var x2 = ref$1[0];\n var y2 = ref$1[1];\n var z2 = ref$1[2];\n return new Color_1(sqrt$2(pow$3(x1, 2) * (1 - f) + pow$3(x2, 2) * f), sqrt$2(pow$3(y1, 2) * (1 - f) + pow$3(y2, 2) * f), sqrt$2(pow$3(z1, 2) * (1 - f) + pow$3(z2, 2) * f), 'rgb');\n }; // register interpolator\n\n\n interpolator.lrgb = lrgb;\n\n var lab$1 = function lab$1(col1, col2, f) {\n var xyz0 = col1.lab();\n var xyz1 = col2.lab();\n return new Color_1(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), 'lab');\n }; // register interpolator\n\n\n interpolator.lab = lab$1;\n\n var _hsx = function _hsx(col1, col2, f, m) {\n var assign, assign$1;\n var xyz0, xyz1;\n\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n }\n\n var hue0, hue1, sat0, sat1, lbv0, lbv1;\n\n if (m.substr(0, 1) === 'h') {\n assign = xyz0, hue0 = assign[0], sat0 = assign[1], lbv0 = assign[2];\n assign$1 = xyz1, hue1 = assign$1[0], sat1 = assign$1[1], lbv1 = assign$1[2];\n }\n\n var sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') {\n sat = sat0;\n }\n } else if (!isNaN(hue1)) {\n hue = hue1;\n\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') {\n sat = sat1;\n }\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) {\n sat = sat0 + f * (sat1 - sat0);\n }\n\n lbv = lbv0 + f * (lbv1 - lbv0);\n return new Color_1([hue, sat, lbv], m);\n };\n\n var lch$1 = function lch$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'lch');\n }; // register interpolator\n\n\n interpolator.lch = lch$1;\n interpolator.hcl = lch$1;\n\n var num$1 = function num$1(col1, col2, f) {\n var c1 = col1.num();\n var c2 = col2.num();\n return new Color_1(c1 + f * (c2 - c1), 'num');\n }; // register interpolator\n\n\n interpolator.num = num$1;\n\n var hcg$1 = function hcg$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hcg');\n }; // register interpolator\n\n\n interpolator.hcg = hcg$1;\n\n var hsi$1 = function hsi$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsi');\n }; // register interpolator\n\n\n interpolator.hsi = hsi$1;\n\n var hsl$1 = function hsl$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsl');\n }; // register interpolator\n\n\n interpolator.hsl = hsl$1;\n\n var hsv$1 = function hsv$1(col1, col2, f) {\n return _hsx(col1, col2, f, 'hsv');\n }; // register interpolator\n\n\n interpolator.hsv = hsv$1;\n var clip_rgb$2 = utils.clip_rgb;\n var pow$4 = Math.pow;\n var sqrt$3 = Math.sqrt;\n var PI$1 = Math.PI;\n var cos$2 = Math.cos;\n var sin$1 = Math.sin;\n var atan2$1 = Math.atan2;\n\n var average = function average(colors, mode, weights) {\n if (mode === void 0) mode = 'lrgb';\n if (weights === void 0) weights = null;\n var l = colors.length;\n\n if (!weights) {\n weights = Array.from(new Array(l)).map(function () {\n return 1;\n });\n } // normalize weights\n\n\n var k = l / weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach(function (w, i) {\n weights[i] *= k;\n }); // convert colors to Color objects\n\n colors = colors.map(function (c) {\n return new Color_1(c);\n });\n\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n\n var first = colors.shift();\n var xyz = first.get(mode);\n var cnt = [];\n var dx = 0;\n var dy = 0; // initial color\n\n for (var i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n var A = xyz[i] / 180 * PI$1;\n dx += cos$2(A) * weights[0];\n dy += sin$1(A) * weights[0];\n }\n }\n\n var alpha = first.alpha() * weights[0];\n colors.forEach(function (c, ci) {\n var xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n\n for (var i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n\n if (mode.charAt(i) === 'h') {\n var A = xyz2[i] / 180 * PI$1;\n dx += cos$2(A) * weights[ci + 1];\n dy += sin$1(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (var i$1 = 0; i$1 < xyz.length; i$1++) {\n if (mode.charAt(i$1) === 'h') {\n var A$1 = atan2$1(dy / cnt[i$1], dx / cnt[i$1]) / PI$1 * 180;\n\n while (A$1 < 0) {\n A$1 += 360;\n }\n\n while (A$1 >= 360) {\n A$1 -= 360;\n }\n\n xyz[i$1] = A$1;\n } else {\n xyz[i$1] = xyz[i$1] / cnt[i$1];\n }\n }\n\n alpha /= l;\n return new Color_1(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n };\n\n var _average_lrgb = function _average_lrgb(colors, weights) {\n var l = colors.length;\n var xyz = [0, 0, 0, 0];\n\n for (var i = 0; i < colors.length; i++) {\n var col = colors[i];\n var f = weights[i] / l;\n var rgb = col._rgb;\n xyz[0] += pow$4(rgb[0], 2) * f;\n xyz[1] += pow$4(rgb[1], 2) * f;\n xyz[2] += pow$4(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n\n xyz[0] = sqrt$3(xyz[0]);\n xyz[1] = sqrt$3(xyz[1]);\n xyz[2] = sqrt$3(xyz[2]);\n\n if (xyz[3] > 0.9999999) {\n xyz[3] = 1;\n }\n\n return new Color_1(clip_rgb$2(xyz));\n }; // minimal multi-purpose interface\n // @requires utils color analyze\n\n\n var type$j = utils.type;\n var pow$5 = Math.pow;\n\n var scale = function scale(colors) {\n // constructor\n var _mode = 'rgb';\n\n var _nacol = chroma_1('#ccc');\n\n var _spread = 0; // const _fixed = false;\n\n var _domain = [0, 1];\n var _pos = [];\n var _padding = [0, 0];\n var _classes = false;\n var _colors = [];\n var _out = false;\n var _min = 0;\n var _max = 1;\n var _correctLightness = false;\n var _colorCache = {};\n var _useCache = true;\n var _gamma = 1; // private methods\n\n var setColors = function setColors(colors) {\n colors = colors || ['#fff', '#000'];\n\n if (colors && type$j(colors) === 'string' && chroma_1.brewer && chroma_1.brewer[colors.toLowerCase()]) {\n colors = chroma_1.brewer[colors.toLowerCase()];\n }\n\n if (type$j(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n } // make a copy of the colors\n\n\n colors = colors.slice(0); // convert to chroma classes\n\n for (var c = 0; c < colors.length; c++) {\n colors[c] = chroma_1(colors[c]);\n } // auto-fill color position\n\n\n _pos.length = 0;\n\n for (var c$1 = 0; c$1 < colors.length; c$1++) {\n _pos.push(c$1 / (colors.length - 1));\n }\n }\n\n resetCache();\n return _colors = colors;\n };\n\n var getClass = function getClass(value) {\n if (_classes != null) {\n var n = _classes.length - 1;\n var i = 0;\n\n while (i < n && value >= _classes[i]) {\n i++;\n }\n\n return i - 1;\n }\n\n return 0;\n };\n\n var tMapLightness = function tMapLightness(t) {\n return t;\n };\n\n var tMapDomain = function tMapDomain(t) {\n return t;\n }; // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n\n var getColor = function getColor(val, bypassMap) {\n var col, t;\n\n if (bypassMap == null) {\n bypassMap = false;\n }\n\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n var c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n } // domain map\n\n\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow$5(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n t = Math.min(1, Math.max(0, t));\n var k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type$j(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (var i = 0; i < _pos.length; i++) {\n var p = _pos[i];\n\n if (t <= p) {\n col = _colors[i];\n break;\n }\n\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma_1.interpolate(_colors[i], _colors[i + 1], t, _mode);\n break;\n }\n }\n } else if (type$j(_colors) === 'function') {\n col = _colors(t);\n }\n\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n\n return col;\n };\n\n var resetCache = function resetCache() {\n return _colorCache = {};\n };\n\n setColors(colors); // public interface\n\n var f = function f(v) {\n var c = chroma_1(getColor(v));\n\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type$j(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n var d = chroma_1.analyze(_domain);\n\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma_1.limits(d, 'e', classes);\n }\n }\n\n return f;\n }\n\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n var k = _colors.length;\n\n if (domain.length === k && _min !== _max) {\n // update positions\n for (var i = 0, list = Array.from(domain); i < list.length; i += 1) {\n var d = list[i];\n\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (var c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n\n if (domain.length > 2) {\n // set domain map\n var tOut = domain.map(function (d, i) {\n return i / (domain.length - 1);\n });\n var tBreaks = domain.map(function (d) {\n return (d - _min) / (_max - _min);\n });\n\n if (!tBreaks.every(function (val, i) {\n return tOut[i] === val;\n })) {\n tMapDomain = function tMapDomain(t) {\n if (t <= 0 || t >= 1) {\n return t;\n }\n\n var i = 0;\n\n while (t >= tBreaks[i + 1]) {\n i++;\n }\n\n var f = (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n var out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n\n _correctLightness = v;\n resetCache();\n\n if (_correctLightness) {\n tMapLightness = function tMapLightness(t) {\n var L0 = getColor(0, true).lab()[0];\n var L1 = getColor(1, true).lab()[0];\n var pol = L0 > L1;\n var L_actual = getColor(t, true).lab()[0];\n var L_ideal = L0 + (L1 - L0) * t;\n var L_diff = L_actual - L_ideal;\n var t0 = 0;\n var t1 = 1;\n var max_iter = 20;\n\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n\n L_actual = getColor(t, true).lab()[0];\n return L_diff = L_actual - L_ideal;\n })();\n }\n\n return t;\n };\n } else {\n tMapLightness = function tMapLightness(t) {\n return t;\n };\n }\n\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type$j(p) === 'number') {\n p = [p, p];\n }\n\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n\n var result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n var dm = _domain[0];\n var dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map(function (i) {\n return f(dm + i / (numColors - 1) * dd);\n });\n } else {\n // returns all colors based on the defined classes\n colors = [];\n var samples = [];\n\n if (_classes && _classes.length > 2) {\n for (var i = 1, end = _classes.length, asc = 1 <= end; asc ? i < end : i > end; asc ? i++ : i--) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n\n result = samples.map(function (v) {\n return f(v);\n });\n }\n\n if (chroma_1[out]) {\n result = result.map(function (c) {\n return c[out]();\n });\n }\n\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma_1(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n };\n\n function __range__(left, right, inclusive) {\n var range = [];\n var ascending = left < right;\n var end = !inclusive ? right : ascending ? right + 1 : right - 1;\n\n for (var i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n\n return range;\n } //\n // interpolates between a set of colors uzing a bezier spline\n //\n // @requires utils lab\n\n\n var bezier = function bezier(colors) {\n var assign, assign$1, assign$2;\n var I, lab0, lab1, lab2;\n colors = colors.map(function (c) {\n return new Color_1(c);\n });\n\n if (colors.length === 2) {\n // linear interpolation\n assign = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign[0], lab1 = assign[1];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return lab0[i] + t * (lab1[i] - lab0[i]);\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n assign$1 = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign$1[0], lab1 = assign$1[1], lab2 = assign$1[2];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return (1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i];\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n var lab3;\n assign$2 = colors.map(function (c) {\n return c.lab();\n }), lab0 = assign$2[0], lab1 = assign$2[1], lab2 = assign$2[2], lab3 = assign$2[3];\n\n I = function I(t) {\n var lab = [0, 1, 2].map(function (i) {\n return (1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i];\n });\n return new Color_1(lab, 'lab');\n };\n } else if (colors.length === 5) {\n var I0 = bezier(colors.slice(0, 3));\n var I1 = bezier(colors.slice(2, 5));\n\n I = function I(t) {\n if (t < 0.5) {\n return I0(t * 2);\n } else {\n return I1((t - 0.5) * 2);\n }\n };\n }\n\n return I;\n };\n\n var bezier_1 = function bezier_1(colors) {\n var f = bezier(colors);\n\n f.scale = function () {\n return scale(f);\n };\n\n return f;\n };\n /*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\n\n var blend = function blend(bottom, top, mode) {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n\n return blend[mode](bottom, top);\n };\n\n var blend_f = function blend_f(f) {\n return function (bottom, top) {\n var c0 = chroma_1(top).rgb();\n var c1 = chroma_1(bottom).rgb();\n return chroma_1.rgb(f(c0, c1));\n };\n };\n\n var each = function each(f) {\n return function (c0, c1) {\n var out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n };\n };\n\n var normal = function normal(a) {\n return a;\n };\n\n var multiply = function multiply(a, b) {\n return a * b / 255;\n };\n\n var darken$1 = function darken$1(a, b) {\n return a > b ? b : a;\n };\n\n var lighten = function lighten(a, b) {\n return a > b ? a : b;\n };\n\n var screen = function screen(a, b) {\n return 255 * (1 - (1 - a / 255) * (1 - b / 255));\n };\n\n var overlay = function overlay(a, b) {\n return b < 128 ? 2 * a * b / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\n };\n\n var burn = function burn(a, b) {\n return 255 * (1 - (1 - b / 255) / (a / 255));\n };\n\n var dodge = function dodge(a, b) {\n if (a === 255) {\n return 255;\n }\n\n a = 255 * (b / 255) / (1 - a / 255);\n return a > 255 ? 255 : a;\n }; // # add = (a,b) ->\n // # if (a + b > 255) then 255 else a + b\n\n\n blend.normal = blend_f(each(normal));\n blend.multiply = blend_f(each(multiply));\n blend.screen = blend_f(each(screen));\n blend.overlay = blend_f(each(overlay));\n blend.darken = blend_f(each(darken$1));\n blend.lighten = blend_f(each(lighten));\n blend.dodge = blend_f(each(dodge));\n blend.burn = blend_f(each(burn)); // blend.add = blend_f(each(add));\n\n var blend_1 = blend; // cubehelix interpolation\n // based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n // http://astron-soc.in/bulletin/11June/289392011.pdf\n\n var type$k = utils.type;\n var clip_rgb$3 = utils.clip_rgb;\n var TWOPI$2 = utils.TWOPI;\n var pow$6 = Math.pow;\n var sin$2 = Math.sin;\n var cos$3 = Math.cos;\n\n var cubehelix = function cubehelix(start, rotations, hue, gamma, lightness) {\n if (start === void 0) start = 300;\n if (rotations === void 0) rotations = -1.5;\n if (hue === void 0) hue = 1;\n if (gamma === void 0) gamma = 1;\n if (lightness === void 0) lightness = [0, 1];\n var dh = 0,\n dl;\n\n if (type$k(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n\n var f = function f(fract) {\n var a = TWOPI$2 * ((start + 120) / 360 + rotations * fract);\n var l = pow$6(lightness[0] + dl * fract, gamma);\n var h = dh !== 0 ? hue[0] + fract * dh : hue;\n var amp = h * l * (1 - l) / 2;\n var cos_a = cos$3(a);\n var sin_a = sin$2(a);\n var r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n var g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n var b = l + amp * (+1.97294 * cos_a);\n return chroma_1(clip_rgb$3([r * 255, g * 255, b * 255, 1]));\n };\n\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n\n start = s;\n return f;\n };\n\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n\n rotations = r;\n return f;\n };\n\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n\n gamma = g;\n return f;\n };\n\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n\n hue = h;\n\n if (type$k(hue) === 'array') {\n dh = hue[1] - hue[0];\n\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n\n return f;\n };\n\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n\n if (type$k(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n\n return f;\n };\n\n f.scale = function () {\n return chroma_1.scale(f);\n };\n\n f.hue(hue);\n return f;\n };\n\n var digits = '0123456789abcdef';\n var floor$2 = Math.floor;\n var random = Math.random;\n\n var random_1 = function random_1() {\n var code = '#';\n\n for (var i = 0; i < 6; i++) {\n code += digits.charAt(floor$2(random() * 16));\n }\n\n return new Color_1(code, 'hex');\n };\n\n var log$1 = Math.log;\n var pow$7 = Math.pow;\n var floor$3 = Math.floor;\n var abs = Math.abs;\n\n var analyze = function analyze(data, key) {\n if (key === void 0) key = null;\n var r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n\n data.forEach(function (val) {\n if (key && type(val) === 'object') {\n val = val[key];\n }\n\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n\n if (val < r.min) {\n r.min = val;\n }\n\n if (val > r.max) {\n r.max = val;\n }\n\n r.count += 1;\n }\n });\n r.domain = [r.min, r.max];\n\n r.limits = function (mode, num) {\n return limits(r, mode, num);\n };\n\n return r;\n };\n\n var limits = function limits(data, mode, num) {\n if (mode === void 0) mode = 'equal';\n if (num === void 0) num = 7;\n\n if (type(data) == 'array') {\n data = analyze(data);\n }\n\n var min = data.min;\n var max = data.max;\n var values = data.values.sort(function (a, b) {\n return a - b;\n });\n\n if (num === 1) {\n return [min, max];\n }\n\n var limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n\n for (var i = 1; i < num; i++) {\n limits.push(min + i / num * (max - min));\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error('Logarithmic scales are only possible for values > 0');\n }\n\n var min_log = Math.LOG10E * log$1(min);\n var max_log = Math.LOG10E * log$1(max);\n limits.push(min);\n\n for (var i$1 = 1; i$1 < num; i$1++) {\n limits.push(pow$7(10, min_log + i$1 / num * (max_log - min_log)));\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n\n for (var i$2 = 1; i$2 < num; i$2++) {\n var p = (values.length - 1) * i$2 / num;\n var pb = floor$3(p);\n\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n var pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n var cluster;\n var n = values.length;\n var assignments = new Array(n);\n var clusterSizes = new Array(num);\n var repeat = true;\n var nb_iters = 0;\n var centroids = null; // get seed values\n\n centroids = [];\n centroids.push(min);\n\n for (var i$3 = 1; i$3 < num; i$3++) {\n centroids.push(min + i$3 / num * (max - min));\n }\n\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (var j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n\n for (var i$4 = 0; i$4 < n; i$4++) {\n var value = values[i$4];\n var mindist = Number.MAX_VALUE;\n var best = void 0;\n\n for (var j$1 = 0; j$1 < num; j$1++) {\n var dist = abs(centroids[j$1] - value);\n\n if (dist < mindist) {\n mindist = dist;\n best = j$1;\n }\n\n clusterSizes[best]++;\n assignments[i$4] = best;\n }\n } // update centroids step\n\n\n var newCentroids = new Array(num);\n\n for (var j$2 = 0; j$2 < num; j$2++) {\n newCentroids[j$2] = null;\n }\n\n for (var i$5 = 0; i$5 < n; i$5++) {\n cluster = assignments[i$5];\n\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i$5];\n } else {\n newCentroids[cluster] += values[i$5];\n }\n }\n\n for (var j$3 = 0; j$3 < num; j$3++) {\n newCentroids[j$3] *= 1 / clusterSizes[j$3];\n } // check convergence\n\n\n repeat = false;\n\n for (var j$4 = 0; j$4 < num; j$4++) {\n if (newCentroids[j$4] !== centroids[j$4]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n } // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n\n\n var kClusters = {};\n\n for (var j$5 = 0; j$5 < num; j$5++) {\n kClusters[j$5] = [];\n }\n\n for (var i$6 = 0; i$6 < n; i$6++) {\n cluster = assignments[i$6];\n kClusters[cluster].push(values[i$6]);\n }\n\n var tmpKMeansBreaks = [];\n\n for (var j$6 = 0; j$6 < num; j$6++) {\n tmpKMeansBreaks.push(kClusters[j$6][0]);\n tmpKMeansBreaks.push(kClusters[j$6][kClusters[j$6].length - 1]);\n }\n\n tmpKMeansBreaks = tmpKMeansBreaks.sort(function (a, b) {\n return a - b;\n });\n limits.push(tmpKMeansBreaks[0]);\n\n for (var i$7 = 1; i$7 < tmpKMeansBreaks.length; i$7 += 2) {\n var v = tmpKMeansBreaks[i$7];\n\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n\n return limits;\n };\n\n var analyze_1 = {\n analyze: analyze,\n limits: limits\n };\n\n var contrast = function contrast(a, b) {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color_1(a);\n b = new Color_1(b);\n var l1 = a.luminance();\n var l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n };\n\n var sqrt$4 = Math.sqrt;\n var atan2$2 = Math.atan2;\n var abs$1 = Math.abs;\n var cos$4 = Math.cos;\n var PI$2 = Math.PI;\n\n var deltaE = function deltaE(a, b, L, C) {\n if (L === void 0) L = 1;\n if (C === void 0) C = 1; // Delta E (CMC)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CMC.html\n\n a = new Color_1(a);\n b = new Color_1(b);\n var ref = Array.from(a.lab());\n var L1 = ref[0];\n var a1 = ref[1];\n var b1 = ref[2];\n var ref$1 = Array.from(b.lab());\n var L2 = ref$1[0];\n var a2 = ref$1[1];\n var b2 = ref$1[2];\n var c1 = sqrt$4(a1 * a1 + b1 * b1);\n var c2 = sqrt$4(a2 * a2 + b2 * b2);\n var sl = L1 < 16.0 ? 0.511 : 0.040975 * L1 / (1.0 + 0.01765 * L1);\n var sc = 0.0638 * c1 / (1.0 + 0.0131 * c1) + 0.638;\n var h1 = c1 < 0.000001 ? 0.0 : atan2$2(b1, a1) * 180.0 / PI$2;\n\n while (h1 < 0) {\n h1 += 360;\n }\n\n while (h1 >= 360) {\n h1 -= 360;\n }\n\n var t = h1 >= 164.0 && h1 <= 345.0 ? 0.56 + abs$1(0.2 * cos$4(PI$2 * (h1 + 168.0) / 180.0)) : 0.36 + abs$1(0.4 * cos$4(PI$2 * (h1 + 35.0) / 180.0));\n var c4 = c1 * c1 * c1 * c1;\n var f = sqrt$4(c4 / (c4 + 1900.0));\n var sh = sc * (f * t + 1.0 - f);\n var delL = L1 - L2;\n var delC = c1 - c2;\n var delA = a1 - a2;\n var delB = b1 - b2;\n var dH2 = delA * delA + delB * delB - delC * delC;\n var v1 = delL / (L * sl);\n var v2 = delC / (C * sc);\n var v3 = sh;\n return sqrt$4(v1 * v1 + v2 * v2 + dH2 / (v3 * v3));\n }; // simple Euclidean distance\n\n\n var distance = function distance(a, b, mode) {\n if (mode === void 0) mode = 'lab'; // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n\n a = new Color_1(a);\n b = new Color_1(b);\n var l1 = a.get(mode);\n var l2 = b.get(mode);\n var sum_sq = 0;\n\n for (var i in l1) {\n var d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n\n return Math.sqrt(sum_sq);\n };\n\n var valid = function valid() {\n var args = [],\n len = arguments.length;\n\n while (len--) {\n args[len] = arguments[len];\n }\n\n try {\n new (Function.prototype.bind.apply(Color_1, [null].concat(args)))();\n return true;\n } catch (e) {\n return false;\n }\n }; // some pre-defined color scales:\n\n\n var scales = {\n cool: function cool() {\n return scale([chroma_1.hsl(180, 1, .9), chroma_1.hsl(250, .7, .4)]);\n },\n hot: function hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb');\n }\n };\n /**\n ColorBrewer colors for chroma.js\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n */\n\n var colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n }; // add lowercase aliases for case-insensitive matches\n\n for (var i$1 = 0, list$1 = Object.keys(colorbrewer); i$1 < list$1.length; i$1 += 1) {\n var key = list$1[i$1];\n colorbrewer[key.toLowerCase()] = colorbrewer[key];\n }\n\n var colorbrewer_1 = colorbrewer; // feel free to comment out anything to rollup\n // a smaller chroma.js built\n // io --\x3e convert colors\n // operators --\x3e modify existing Colors\n // interpolators\n // generators -- > create new colors\n\n chroma_1.average = average;\n chroma_1.bezier = bezier_1;\n chroma_1.blend = blend_1;\n chroma_1.cubehelix = cubehelix;\n chroma_1.mix = chroma_1.interpolate = mix;\n chroma_1.random = random_1;\n chroma_1.scale = scale; // other utility methods\n\n chroma_1.analyze = analyze_1.analyze;\n chroma_1.contrast = contrast;\n chroma_1.deltaE = deltaE;\n chroma_1.distance = distance;\n chroma_1.limits = analyze_1.limits;\n chroma_1.valid = valid; // scale\n\n chroma_1.scales = scales; // colors\n\n chroma_1.colors = w3cx11_1;\n chroma_1.brewer = colorbrewer_1;\n var chroma_js = chroma_1;\n return chroma_js;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jaHJvbWEtanMvY2hyb21hLmpzP2JmNDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBNEQsZ0NBQWdDLENBQXdGO0FBQ3RMLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQSxxSEFBcUgsaUJBQWlCO0FBQ3RJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87OztBQUdQLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLE9BQU87QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQSxxQkFBcUIsT0FBTztBQUM1QjtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakI7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQjtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxFQUFFLGFBQWEsRUFBRTtBQUNqRCxpQ0FBaUMsRUFBRSxhQUFhLEVBQUU7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxpQkFBaUI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FB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OztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkMsc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsV0FBVztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDs7QUFFQSx5QkFBeUIsV0FBVztBQUNwQztBQUNBOztBQUVBLHlCQUF5QixTQUFTO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUEseUJBQXlCLFdBQVc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0E7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTs7QUFFQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsdUJBQXVCLDhCQUE4QjtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLHNEQUFzRCxxQkFBcUI7QUFDM0U7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekIsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiMzg3My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hyb21hLmpzIC0gSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBjb2xvciBjb252ZXJzaW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE5LCBHcmVnb3IgQWlzY2hcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIFRoZSBuYW1lIEdyZWdvciBBaXNjaCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzXG4gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHUkVHT1IgQUlTQ0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCxcbiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBjaHJvbWEuanMgaW5jbHVkZXMgY29sb3JzIGZyb20gY29sb3JicmV3ZXIyLm9yZywgd2hpY2ggYXJlIHJlbGVhc2VkIHVuZGVyXG4gKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDAyIEN5bnRoaWEgQnJld2VyLCBNYXJrIEhhcnJvd2VyLFxuICogYW5kIFRoZSBQZW5uc3lsdmFuaWEgU3RhdGUgVW5pdmVyc2l0eS5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCxcbiAqIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljXG4gKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIE5hbWVkIGNvbG9ycyBhcmUgdGFrZW4gZnJvbSBYMTEgQ29sb3IgTmFtZXMuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbiAqXG4gKiBAcHJlc2VydmVcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiBnbG9iYWwuY2hyb21hID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxpbWl0ID0gZnVuY3Rpb24gbGltaXQoeCwgbWluLCBtYXgpIHtcbiAgICBpZiAobWluID09PSB2b2lkIDApIG1pbiA9IDA7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKSBtYXggPSAxO1xuICAgIHJldHVybiB4IDwgbWluID8gbWluIDogeCA+IG1heCA/IG1heCA6IHg7XG4gIH07XG5cbiAgdmFyIGNsaXBfcmdiID0gZnVuY3Rpb24gY2xpcF9yZ2IocmdiKSB7XG4gICAgcmdiLl9jbGlwcGVkID0gZmFsc2U7XG4gICAgcmdiLl91bmNsaXBwZWQgPSByZ2Iuc2xpY2UoMCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAzOyBpKyspIHtcbiAgICAgIGlmIChpIDwgMykge1xuICAgICAgICBpZiAocmdiW2ldIDwgMCB8fCByZ2JbaV0gPiAyNTUpIHtcbiAgICAgICAgICByZ2IuX2NsaXBwZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmdiW2ldID0gbGltaXQocmdiW2ldLCAwLCAyNTUpO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAzKSB7XG4gICAgICAgIHJnYltpXSA9IGxpbWl0KHJnYltpXSwgMCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYjtcbiAgfTsgLy8gcG9ydGVkIGZyb20galF1ZXJ5J3MgJC50eXBlXG5cblxuICB2YXIgY2xhc3NUb1R5cGUgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IFsnQm9vbGVhbicsICdOdW1iZXInLCAnU3RyaW5nJywgJ0Z1bmN0aW9uJywgJ0FycmF5JywgJ0RhdGUnLCAnUmVnRXhwJywgJ1VuZGVmaW5lZCcsICdOdWxsJ107IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuICAgIGNsYXNzVG9UeXBlW1wiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIl0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgdHlwZSA9IGZ1bmN0aW9uIHR5cGUob2JqKSB7XG4gICAgcmV0dXJuIGNsYXNzVG9UeXBlW09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopXSB8fCBcIm9iamVjdFwiO1xuICB9O1xuXG4gIHZhciB1bnBhY2sgPSBmdW5jdGlvbiB1bnBhY2soYXJncywga2V5T3JkZXIpIHtcbiAgICBpZiAoa2V5T3JkZXIgPT09IHZvaWQgMCkga2V5T3JkZXIgPSBudWxsOyAvLyBpZiBjYWxsZWQgd2l0aCBtb3JlIHRoYW4gMyBhcmd1bWVudHMsIHdlIHJldHVybiB0aGUgYXJndW1lbnRzXG5cbiAgICBpZiAoYXJncy5sZW5ndGggPj0gMykge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuICAgIH0gLy8gd2l0aCBsZXNzIHRoYW4gMyBhcmdzIHdlIGNoZWNrIGlmIGZpcnN0IGFyZyBpcyBvYmplY3RcbiAgICAvLyBhbmQgdXNlIHRoZSBrZXlPcmRlciBzdHJpbmcgdG8gZXh0cmFjdCBhbmQgc29ydCBwcm9wZXJ0aWVzXG5cblxuICAgIGlmICh0eXBlKGFyZ3NbMF0pID09ICdvYmplY3QnICYmIGtleU9yZGVyKSB7XG4gICAgICByZXR1cm4ga2V5T3JkZXIuc3BsaXQoJycpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gYXJnc1swXVtrXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBhcmdzWzBdW2tdO1xuICAgICAgfSk7XG4gICAgfSAvLyBvdGhlcndpc2Ugd2UganVzdCByZXR1cm4gdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgLy8gKHdoaWNoIHdlIHN1cHBvc2UgaXMgYW4gYXJyYXkgb2YgYXJncylcblxuXG4gICAgcmV0dXJuIGFyZ3NbMF07XG4gIH07XG5cbiAgdmFyIGxhc3QgPSBmdW5jdGlvbiBsYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGFyZ3MubGVuZ3RoIC0gMTtcblxuICAgIGlmICh0eXBlKGFyZ3NbbF0pID09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYXJnc1tsXS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBQSSA9IE1hdGguUEk7XG4gIHZhciB1dGlscyA9IHtcbiAgICBjbGlwX3JnYjogY2xpcF9yZ2IsXG4gICAgbGltaXQ6IGxpbWl0LFxuICAgIHR5cGU6IHR5cGUsXG4gICAgdW5wYWNrOiB1bnBhY2ssXG4gICAgbGFzdDogbGFzdCxcbiAgICBQSTogUEksXG4gICAgVFdPUEk6IFBJICogMixcbiAgICBQSVRISVJEOiBQSSAvIDMsXG4gICAgREVHMlJBRDogUEkgLyAxODAsXG4gICAgUkFEMkRFRzogMTgwIC8gUElcbiAgfTtcbiAgdmFyIGlucHV0ID0ge1xuICAgIGZvcm1hdDoge30sXG4gICAgYXV0b2RldGVjdDogW11cbiAgfTtcbiAgdmFyIGxhc3QkMSA9IHV0aWxzLmxhc3Q7XG4gIHZhciBjbGlwX3JnYiQxID0gdXRpbHMuY2xpcF9yZ2I7XG4gIHZhciB0eXBlJDEgPSB1dGlscy50eXBlO1xuXG4gIHZhciBDb2xvciA9IGZ1bmN0aW9uIENvbG9yKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciBtZSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZSQxKGFyZ3NbMF0pID09PSAnb2JqZWN0JyAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yICYmIGFyZ3NbMF0uY29uc3RydWN0b3IgPT09IHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIC8vIHRoZSBhcmd1bWVudCBpcyBhbHJlYWR5IGEgQ29sb3IgaW5zdGFuY2VcbiAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgIH0gLy8gbGFzdCBhcmd1bWVudCBjb3VsZCBiZSB0aGUgbW9kZVxuXG5cbiAgICB2YXIgbW9kZSA9IGxhc3QkMShhcmdzKTtcbiAgICB2YXIgYXV0b2RldGVjdCA9IGZhbHNlO1xuXG4gICAgaWYgKCFtb2RlKSB7XG4gICAgICBhdXRvZGV0ZWN0ID0gdHJ1ZTtcblxuICAgICAgaWYgKCFpbnB1dC5zb3J0ZWQpIHtcbiAgICAgICAgaW5wdXQuYXV0b2RldGVjdCA9IGlucHV0LmF1dG9kZXRlY3Quc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBiLnAgLSBhLnA7XG4gICAgICAgIH0pO1xuICAgICAgICBpbnB1dC5zb3J0ZWQgPSB0cnVlO1xuICAgICAgfSAvLyBhdXRvLWRldGVjdCBmb3JtYXRcblxuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IGlucHV0LmF1dG9kZXRlY3Q7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGsgPSBsaXN0W2ldO1xuICAgICAgICBtb2RlID0gY2hrLnRlc3QuYXBwbHkoY2hrLCBhcmdzKTtcblxuICAgICAgICBpZiAobW9kZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmZvcm1hdFttb2RlXSkge1xuICAgICAgdmFyIHJnYiA9IGlucHV0LmZvcm1hdFttb2RlXS5hcHBseShudWxsLCBhdXRvZGV0ZWN0ID8gYXJncyA6IGFyZ3Muc2xpY2UoMCwgLTEpKTtcbiAgICAgIG1lLl9yZ2IgPSBjbGlwX3JnYiQxKHJnYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBmb3JtYXQ6ICcgKyBhcmdzKTtcbiAgICB9IC8vIGFkZCBhbHBoYSBjaGFubmVsXG5cblxuICAgIGlmIChtZS5fcmdiLmxlbmd0aCA9PT0gMykge1xuICAgICAgbWUuX3JnYi5wdXNoKDEpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICBpZiAodHlwZSQxKHRoaXMuaGV4KSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZXgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJbXCIgKyB0aGlzLl9yZ2Iuam9pbignLCcpICsgXCJdXCI7XG4gIH07XG5cbiAgdmFyIENvbG9yXzEgPSBDb2xvcjtcblxuICB2YXIgY2hyb21hID0gZnVuY3Rpb24gY2hyb21hKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGNocm9tYS5Db2xvciwgW251bGxdLmNvbmNhdChhcmdzKSkpKCk7XG4gIH07XG5cbiAgY2hyb21hLkNvbG9yID0gQ29sb3JfMTtcbiAgY2hyb21hLnZlcnNpb24gPSAnMi4xLjInO1xuICB2YXIgY2hyb21hXzEgPSBjaHJvbWE7XG4gIHZhciB1bnBhY2skMSA9IHV0aWxzLnVucGFjaztcbiAgdmFyIG1heCA9IE1hdGgubWF4O1xuXG4gIHZhciByZ2IyY215ayA9IGZ1bmN0aW9uIHJnYjJjbXlrKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciByZWYgPSB1bnBhY2skMShhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgciA9IHIgLyAyNTU7XG4gICAgZyA9IGcgLyAyNTU7XG4gICAgYiA9IGIgLyAyNTU7XG4gICAgdmFyIGsgPSAxIC0gbWF4KHIsIG1heChnLCBiKSk7XG4gICAgdmFyIGYgPSBrIDwgMSA/IDEgLyAoMSAtIGspIDogMDtcbiAgICB2YXIgYyA9ICgxIC0gciAtIGspICogZjtcbiAgICB2YXIgbSA9ICgxIC0gZyAtIGspICogZjtcbiAgICB2YXIgeSA9ICgxIC0gYiAtIGspICogZjtcbiAgICByZXR1cm4gW2MsIG0sIHksIGtdO1xuICB9O1xuXG4gIHZhciByZ2IyY215a18xID0gcmdiMmNteWs7XG4gIHZhciB1bnBhY2skMiA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgY215azJyZ2IgPSBmdW5jdGlvbiBjbXlrMnJnYigpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDIoYXJncywgJ2NteWsnKTtcbiAgICB2YXIgYyA9IGFyZ3NbMF07XG4gICAgdmFyIG0gPSBhcmdzWzFdO1xuICAgIHZhciB5ID0gYXJnc1syXTtcbiAgICB2YXIgayA9IGFyZ3NbM107XG4gICAgdmFyIGFscGhhID0gYXJncy5sZW5ndGggPiA0ID8gYXJnc1s0XSA6IDE7XG5cbiAgICBpZiAoayA9PT0gMSkge1xuICAgICAgcmV0dXJuIFswLCAwLCAwLCBhbHBoYV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtjID49IDEgPyAwIDogMjU1ICogKDEgLSBjKSAqICgxIC0gayksIC8vIHJcbiAgICBtID49IDEgPyAwIDogMjU1ICogKDEgLSBtKSAqICgxIC0gayksIC8vIGdcbiAgICB5ID49IDEgPyAwIDogMjU1ICogKDEgLSB5KSAqICgxIC0gayksIC8vIGJcbiAgICBhbHBoYV07XG4gIH07XG5cbiAgdmFyIGNteWsycmdiXzEgPSBjbXlrMnJnYjtcbiAgdmFyIHVucGFjayQzID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSQyID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5jbXlrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyY215a18xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuY215ayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnY215ayddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmNteWsgPSBjbXlrMnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDIsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBhcmdzID0gdW5wYWNrJDMoYXJncywgJ2NteWsnKTtcblxuICAgICAgaWYgKHR5cGUkMihhcmdzKSA9PT0gJ2FycmF5JyAmJiBhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICByZXR1cm4gJ2NteWsnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skNCA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGxhc3QkMiA9IHV0aWxzLmxhc3Q7XG5cbiAgdmFyIHJuZCA9IGZ1bmN0aW9uIHJuZChhKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYSAqIDEwMCkgLyAxMDA7XG4gIH07XG4gIC8qXG4gICAqIHN1cHBvcnRlZCBhcmd1bWVudHM6XG4gICAqIC0gaHNsMmNzcyhoLHMsbClcbiAgICogLSBoc2wyY3NzKGgscyxsLGEpXG4gICAqIC0gaHNsMmNzcyhbaCxzLGxdLCBtb2RlKVxuICAgKiAtIGhzbDJjc3MoW2gscyxsLGFdLCBtb2RlKVxuICAgKiAtIGhzbDJjc3Moe2gscyxsLGF9LCBtb2RlKVxuICAgKi9cblxuXG4gIHZhciBoc2wyY3NzID0gZnVuY3Rpb24gaHNsMmNzcygpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgaHNsYSA9IHVucGFjayQ0KGFyZ3MsICdoc2xhJyk7XG4gICAgdmFyIG1vZGUgPSBsYXN0JDIoYXJncykgfHwgJ2xzYSc7XG4gICAgaHNsYVswXSA9IHJuZChoc2xhWzBdIHx8IDApO1xuICAgIGhzbGFbMV0gPSBybmQoaHNsYVsxXSAqIDEwMCkgKyAnJSc7XG4gICAgaHNsYVsyXSA9IHJuZChoc2xhWzJdICogMTAwKSArICclJztcblxuICAgIGlmIChtb2RlID09PSAnaHNsYScgfHwgaHNsYS5sZW5ndGggPiAzICYmIGhzbGFbM10gPCAxKSB7XG4gICAgICBoc2xhWzNdID0gaHNsYS5sZW5ndGggPiAzID8gaHNsYVszXSA6IDE7XG4gICAgICBtb2RlID0gJ2hzbGEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBoc2xhLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGUgKyBcIihcIiArIGhzbGEuam9pbignLCcpICsgXCIpXCI7XG4gIH07XG5cbiAgdmFyIGhzbDJjc3NfMSA9IGhzbDJjc3M7XG4gIHZhciB1bnBhY2skNSA9IHV0aWxzLnVucGFjaztcbiAgLypcbiAgICogc3VwcG9ydGVkIGFyZ3VtZW50czpcbiAgICogLSByZ2IyaHNsKHIsZyxiKVxuICAgKiAtIHJnYjJoc2wocixnLGIsYSlcbiAgICogLSByZ2IyaHNsKFtyLGcsYl0pXG4gICAqIC0gcmdiMmhzbChbcixnLGIsYV0pXG4gICAqIC0gcmdiMmhzbCh7cixnLGIsYX0pXG4gICAqL1xuXG4gIHZhciByZ2IyaHNsID0gZnVuY3Rpb24gcmdiMmhzbCgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDUoYXJncywgJ3JnYmEnKTtcbiAgICB2YXIgciA9IGFyZ3NbMF07XG4gICAgdmFyIGcgPSBhcmdzWzFdO1xuICAgIHZhciBiID0gYXJnc1syXTtcbiAgICByIC89IDI1NTtcbiAgICBnIC89IDI1NTtcbiAgICBiIC89IDI1NTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIHZhciBzLCBoO1xuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBzID0gMDtcbiAgICAgIGggPSBOdW1iZXIuTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICBzID0gbCA8IDAuNSA/IChtYXggLSBtaW4pIC8gKG1heCArIG1pbikgOiAobWF4IC0gbWluKSAvICgyIC0gbWF4IC0gbWluKTtcbiAgICB9XG5cbiAgICBpZiAociA9PSBtYXgpIHtcbiAgICAgIGggPSAoZyAtIGIpIC8gKG1heCAtIG1pbik7XG4gICAgfSBlbHNlIGlmIChnID09IG1heCkge1xuICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gKG1heCAtIG1pbik7XG4gICAgfSBlbHNlIGlmIChiID09IG1heCkge1xuICAgICAgaCA9IDQgKyAociAtIGcpIC8gKG1heCAtIG1pbik7XG4gICAgfVxuXG4gICAgaCAqPSA2MDtcblxuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCArPSAzNjA7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMyAmJiBhcmdzWzNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbaCwgcywgbCwgYXJnc1szXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzLCBsXTtcbiAgfTtcblxuICB2YXIgcmdiMmhzbF8xID0gcmdiMmhzbDtcbiAgdmFyIHVucGFjayQ2ID0gdXRpbHMudW5wYWNrO1xuICB2YXIgbGFzdCQzID0gdXRpbHMubGFzdDtcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgLypcbiAgICogc3VwcG9ydGVkIGFyZ3VtZW50czpcbiAgICogLSByZ2IyY3NzKHIsZyxiKVxuICAgKiAtIHJnYjJjc3MocixnLGIsYSlcbiAgICogLSByZ2IyY3NzKFtyLGcsYl0sIG1vZGUpXG4gICAqIC0gcmdiMmNzcyhbcixnLGIsYV0sIG1vZGUpXG4gICAqIC0gcmdiMmNzcyh7cixnLGIsYX0sIG1vZGUpXG4gICAqL1xuXG4gIHZhciByZ2IyY3NzID0gZnVuY3Rpb24gcmdiMmNzcygpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgcmdiYSA9IHVucGFjayQ2KGFyZ3MsICdyZ2JhJyk7XG4gICAgdmFyIG1vZGUgPSBsYXN0JDMoYXJncykgfHwgJ3JnYic7XG5cbiAgICBpZiAobW9kZS5zdWJzdHIoMCwgMykgPT0gJ2hzbCcpIHtcbiAgICAgIHJldHVybiBoc2wyY3NzXzEocmdiMmhzbF8xKHJnYmEpLCBtb2RlKTtcbiAgICB9XG5cbiAgICByZ2JhWzBdID0gcm91bmQocmdiYVswXSk7XG4gICAgcmdiYVsxXSA9IHJvdW5kKHJnYmFbMV0pO1xuICAgIHJnYmFbMl0gPSByb3VuZChyZ2JhWzJdKTtcblxuICAgIGlmIChtb2RlID09PSAncmdiYScgfHwgcmdiYS5sZW5ndGggPiAzICYmIHJnYmFbM10gPCAxKSB7XG4gICAgICByZ2JhWzNdID0gcmdiYS5sZW5ndGggPiAzID8gcmdiYVszXSA6IDE7XG4gICAgICBtb2RlID0gJ3JnYmEnO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlICsgXCIoXCIgKyByZ2JhLnNsaWNlKDAsIG1vZGUgPT09ICdyZ2InID8gMyA6IDQpLmpvaW4oJywnKSArIFwiKVwiO1xuICB9O1xuXG4gIHZhciByZ2IyY3NzXzEgPSByZ2IyY3NzO1xuICB2YXIgdW5wYWNrJDcgPSB1dGlscy51bnBhY2s7XG4gIHZhciByb3VuZCQxID0gTWF0aC5yb3VuZDtcblxuICB2YXIgaHNsMnJnYiA9IGZ1bmN0aW9uIGhzbDJyZ2IoKSB7XG4gICAgdmFyIGFzc2lnbjtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJDcoYXJncywgJ2hzbCcpO1xuICAgIHZhciBoID0gYXJnc1swXTtcbiAgICB2YXIgcyA9IGFyZ3NbMV07XG4gICAgdmFyIGwgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IGwgKiAyNTU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0MyA9IFswLCAwLCAwXTtcbiAgICAgIHZhciBjID0gWzAsIDAsIDBdO1xuICAgICAgdmFyIHQyID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICAgIHZhciB0MSA9IDIgKiBsIC0gdDI7XG4gICAgICB2YXIgaF8gPSBoIC8gMzYwO1xuICAgICAgdDNbMF0gPSBoXyArIDEgLyAzO1xuICAgICAgdDNbMV0gPSBoXztcbiAgICAgIHQzWzJdID0gaF8gLSAxIC8gMztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKHQzW2ldIDwgMCkge1xuICAgICAgICAgIHQzW2ldICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodDNbaV0gPiAxKSB7XG4gICAgICAgICAgdDNbaV0gLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICg2ICogdDNbaV0gPCAxKSB7XG4gICAgICAgICAgY1tpXSA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzW2ldO1xuICAgICAgICB9IGVsc2UgaWYgKDIgKiB0M1tpXSA8IDEpIHtcbiAgICAgICAgICBjW2ldID0gdDI7XG4gICAgICAgIH0gZWxzZSBpZiAoMyAqIHQzW2ldIDwgMikge1xuICAgICAgICAgIGNbaV0gPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzW2ldKSAqIDY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY1tpXSA9IHQxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzc2lnbiA9IFtyb3VuZCQxKGNbMF0gKiAyNTUpLCByb3VuZCQxKGNbMV0gKiAyNTUpLCByb3VuZCQxKGNbMl0gKiAyNTUpXSwgciA9IGFzc2lnblswXSwgZyA9IGFzc2lnblsxXSwgYiA9IGFzc2lnblsyXTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPiAzKSB7XG4gICAgICAvLyBrZWVwIGFscGhhIGNoYW5uZWxcbiAgICAgIHJldHVybiBbciwgZywgYiwgYXJnc1szXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyLCBnLCBiLCAxXTtcbiAgfTtcblxuICB2YXIgaHNsMnJnYl8xID0gaHNsMnJnYjtcbiAgdmFyIFJFX1JHQiA9IC9ecmdiXFwoXFxzKigtP1xcZCspLFxccyooLT9cXGQrKVxccyosXFxzKigtP1xcZCspXFxzKlxcKSQvO1xuICB2YXIgUkVfUkdCQSA9IC9ecmdiYVxcKFxccyooLT9cXGQrKSxcXHMqKC0/XFxkKylcXHMqLFxccyooLT9cXGQrKVxccyosXFxzKihbMDFdfFswMV0/XFwuXFxkKylcXCkkLztcbiAgdmFyIFJFX1JHQl9QQ1QgPSAvXnJnYlxcKFxccyooLT9cXGQrKD86XFwuXFxkKyk/KSUsXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccypcXCkkLztcbiAgdmFyIFJFX1JHQkFfUENUID0gL15yZ2JhXFwoXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJSxcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyklXFxzKixcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyklXFxzKixcXHMqKFswMV18WzAxXT9cXC5cXGQrKVxcKSQvO1xuICB2YXIgUkVfSFNMID0gL15oc2xcXChcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyksXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccypcXCkkLztcbiAgdmFyIFJFX0hTTEEgPSAvXmhzbGFcXChcXHMqKC0/XFxkKyg/OlxcLlxcZCspPyksXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKigtP1xcZCsoPzpcXC5cXGQrKT8pJVxccyosXFxzKihbMDFdfFswMV0/XFwuXFxkKylcXCkkLztcbiAgdmFyIHJvdW5kJDIgPSBNYXRoLnJvdW5kO1xuXG4gIHZhciBjc3MycmdiID0gZnVuY3Rpb24gY3NzMnJnYihjc3MpIHtcbiAgICBjc3MgPSBjc3MudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgdmFyIG07XG5cbiAgICBpZiAoaW5wdXQuZm9ybWF0Lm5hbWVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gaW5wdXQuZm9ybWF0Lm5hbWVkKGNzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICB9XG4gICAgfSAvLyByZ2IoMjUwLDIwLDApXG5cblxuICAgIGlmIChtID0gY3NzLm1hdGNoKFJFX1JHQikpIHtcbiAgICAgIHZhciByZ2IgPSBtLnNsaWNlKDEsIDQpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICByZ2JbaV0gPSArcmdiW2ldO1xuICAgICAgfVxuXG4gICAgICByZ2JbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG5cbiAgICAgIHJldHVybiByZ2I7XG4gICAgfSAvLyByZ2JhKDI1MCwyMCwwLDAuNClcblxuXG4gICAgaWYgKG0gPSBjc3MubWF0Y2goUkVfUkdCQSkpIHtcbiAgICAgIHZhciByZ2IkMSA9IG0uc2xpY2UoMSwgNSk7XG5cbiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IDQ7IGkkMSsrKSB7XG4gICAgICAgIHJnYiQxW2kkMV0gPSArcmdiJDFbaSQxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJnYiQxO1xuICAgIH0gLy8gcmdiKDEwMCUsMCUsMCUpXG5cblxuICAgIGlmIChtID0gY3NzLm1hdGNoKFJFX1JHQl9QQ1QpKSB7XG4gICAgICB2YXIgcmdiJDIgPSBtLnNsaWNlKDEsIDQpO1xuXG4gICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCAzOyBpJDIrKykge1xuICAgICAgICByZ2IkMltpJDJdID0gcm91bmQkMihyZ2IkMltpJDJdICogMi41NSk7XG4gICAgICB9XG5cbiAgICAgIHJnYiQyWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuXG4gICAgICByZXR1cm4gcmdiJDI7XG4gICAgfSAvLyByZ2JhKDEwMCUsMCUsMCUsMC40KVxuXG5cbiAgICBpZiAobSA9IGNzcy5tYXRjaChSRV9SR0JBX1BDVCkpIHtcbiAgICAgIHZhciByZ2IkMyA9IG0uc2xpY2UoMSwgNSk7XG5cbiAgICAgIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IDM7IGkkMysrKSB7XG4gICAgICAgIHJnYiQzW2kkM10gPSByb3VuZCQyKHJnYiQzW2kkM10gKiAyLjU1KTtcbiAgICAgIH1cblxuICAgICAgcmdiJDNbM10gPSArcmdiJDNbM107XG4gICAgICByZXR1cm4gcmdiJDM7XG4gICAgfSAvLyBoc2woMCwxMDAlLDUwJSlcblxuXG4gICAgaWYgKG0gPSBjc3MubWF0Y2goUkVfSFNMKSkge1xuICAgICAgdmFyIGhzbCA9IG0uc2xpY2UoMSwgNCk7XG4gICAgICBoc2xbMV0gKj0gMC4wMTtcbiAgICAgIGhzbFsyXSAqPSAwLjAxO1xuICAgICAgdmFyIHJnYiQ0ID0gaHNsMnJnYl8xKGhzbCk7XG4gICAgICByZ2IkNFszXSA9IDE7XG4gICAgICByZXR1cm4gcmdiJDQ7XG4gICAgfSAvLyBoc2xhKDAsMTAwJSw1MCUsMC41KVxuXG5cbiAgICBpZiAobSA9IGNzcy5tYXRjaChSRV9IU0xBKSkge1xuICAgICAgdmFyIGhzbCQxID0gbS5zbGljZSgxLCA0KTtcbiAgICAgIGhzbCQxWzFdICo9IDAuMDE7XG4gICAgICBoc2wkMVsyXSAqPSAwLjAxO1xuICAgICAgdmFyIHJnYiQ1ID0gaHNsMnJnYl8xKGhzbCQxKTtcbiAgICAgIHJnYiQ1WzNdID0gK21bNF07IC8vIGRlZmF1bHQgYWxwaGEgPSAxXG5cbiAgICAgIHJldHVybiByZ2IkNTtcbiAgICB9XG4gIH07XG5cbiAgY3NzMnJnYi50ZXN0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gUkVfUkdCLnRlc3QocykgfHwgUkVfUkdCQS50ZXN0KHMpIHx8IFJFX1JHQl9QQ1QudGVzdChzKSB8fCBSRV9SR0JBX1BDVC50ZXN0KHMpIHx8IFJFX0hTTC50ZXN0KHMpIHx8IFJFX0hTTEEudGVzdChzKTtcbiAgfTtcblxuICB2YXIgY3NzMnJnYl8xID0gY3NzMnJnYjtcbiAgdmFyIHR5cGUkMyA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuY3NzID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICByZXR1cm4gcmdiMmNzc18xKHRoaXMuX3JnYiwgbW9kZSk7XG4gIH07XG5cbiAgY2hyb21hXzEuY3NzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydjc3MnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5jc3MgPSBjc3MycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogNSxcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KGgpIHtcbiAgICAgIHZhciByZXN0ID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW4tLSA+IDApIHtcbiAgICAgICAgcmVzdFtsZW5dID0gYXJndW1lbnRzW2xlbiArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3QubGVuZ3RoICYmIHR5cGUkMyhoKSA9PT0gJ3N0cmluZycgJiYgY3NzMnJnYl8xLnRlc3QoaCkpIHtcbiAgICAgICAgcmV0dXJuICdjc3MnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skOCA9IHV0aWxzLnVucGFjaztcblxuICBpbnB1dC5mb3JtYXQuZ2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJnYiA9IHVucGFjayQ4KGFyZ3MsICdyZ2JhJyk7XG4gICAgcmdiWzBdICo9IDI1NTtcbiAgICByZ2JbMV0gKj0gMjU1O1xuICAgIHJnYlsyXSAqPSAyNTU7XG4gICAgcmV0dXJuIHJnYjtcbiAgfTtcblxuICBjaHJvbWFfMS5nbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnZ2wnXSkpKSgpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmdsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmV0dXJuIFtyZ2JbMF0gLyAyNTUsIHJnYlsxXSAvIDI1NSwgcmdiWzJdIC8gMjU1LCByZ2JbM11dO1xuICB9O1xuXG4gIHZhciB1bnBhY2skOSA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMmhjZyA9IGZ1bmN0aW9uIHJnYjJoY2coKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayQ5KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBkZWx0YSA9IG1heCAtIG1pbjtcbiAgICB2YXIgYyA9IGRlbHRhICogMTAwIC8gMjU1O1xuXG4gICAgdmFyIF9nID0gbWluIC8gKDI1NSAtIGRlbHRhKSAqIDEwMDtcblxuICAgIHZhciBoO1xuXG4gICAgaWYgKGRlbHRhID09PSAwKSB7XG4gICAgICBoID0gTnVtYmVyLk5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHIgPT09IG1heCkge1xuICAgICAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoZyA9PT0gbWF4KSB7XG4gICAgICAgIGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBpZiAoYiA9PT0gbWF4KSB7XG4gICAgICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBoICo9IDYwO1xuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBjLCBfZ107XG4gIH07XG5cbiAgdmFyIHJnYjJoY2dfMSA9IHJnYjJoY2c7XG4gIHZhciB1bnBhY2skYSA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgLypcbiAgICogdGhpcyBpcyBiYXNpY2FsbHkganVzdCBIU1Ygd2l0aCBzb21lIG1pbm9yIHR3ZWFrc1xuICAgKlxuICAgKiBodWUuLiBbMC4uMzYwXVxuICAgKiBjaHJvbWEgLi4gWzAuLjFdXG4gICAqIGdyYXluZXNzIC4uIFswLi4xXVxuICAgKi9cblxuICB2YXIgaGNnMnJnYiA9IGZ1bmN0aW9uIGhjZzJyZ2IoKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDEsIGFzc2lnbiQyLCBhc3NpZ24kMywgYXNzaWduJDQsIGFzc2lnbiQ1O1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skYShhcmdzLCAnaGNnJyk7XG4gICAgdmFyIGggPSBhcmdzWzBdO1xuICAgIHZhciBjID0gYXJnc1sxXTtcbiAgICB2YXIgX2cgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuICAgIF9nID0gX2cgKiAyNTU7XG5cbiAgICB2YXIgX2MgPSBjICogMjU1O1xuXG4gICAgaWYgKGMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IF9nO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaCA9PT0gMzYwKSB7XG4gICAgICAgIGggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCA+IDM2MCkge1xuICAgICAgICBoIC09IDM2MDtcbiAgICAgIH1cblxuICAgICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMzYwO1xuICAgICAgfVxuXG4gICAgICBoIC89IDYwO1xuICAgICAgdmFyIGkgPSBmbG9vcihoKTtcbiAgICAgIHZhciBmID0gaCAtIGk7XG4gICAgICB2YXIgcCA9IF9nICogKDEgLSBjKTtcbiAgICAgIHZhciBxID0gcCArIF9jICogKDEgLSBmKTtcbiAgICAgIHZhciB0ID0gcCArIF9jICogZjtcbiAgICAgIHZhciB2ID0gcCArIF9jO1xuXG4gICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGFzc2lnbiA9IFt2LCB0LCBwXSwgciA9IGFzc2lnblswXSwgZyA9IGFzc2lnblsxXSwgYiA9IGFzc2lnblsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgYXNzaWduJDEgPSBbcSwgdiwgcF0sIHIgPSBhc3NpZ24kMVswXSwgZyA9IGFzc2lnbiQxWzFdLCBiID0gYXNzaWduJDFbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGFzc2lnbiQyID0gW3AsIHYsIHRdLCByID0gYXNzaWduJDJbMF0sIGcgPSBhc3NpZ24kMlsxXSwgYiA9IGFzc2lnbiQyWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBhc3NpZ24kMyA9IFtwLCBxLCB2XSwgciA9IGFzc2lnbiQzWzBdLCBnID0gYXNzaWduJDNbMV0sIGIgPSBhc3NpZ24kM1syXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgYXNzaWduJDQgPSBbdCwgcCwgdl0sIHIgPSBhc3NpZ24kNFswXSwgZyA9IGFzc2lnbiQ0WzFdLCBiID0gYXNzaWduJDRbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGFzc2lnbiQ1ID0gW3YsIHAsIHFdLCByID0gYXNzaWduJDVbMF0sIGcgPSBhc3NpZ24kNVsxXSwgYiA9IGFzc2lnbiQ1WzJdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbciwgZywgYiwgYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6IDFdO1xuICB9O1xuXG4gIHZhciBoY2cycmdiXzEgPSBoY2cycmdiO1xuICB2YXIgdW5wYWNrJGIgPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDQgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhjZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmhjZ18xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaGNnID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoY2cnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oY2cgPSBoY2cycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMSxcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skYihhcmdzLCAnaGNnJyk7XG5cbiAgICAgIGlmICh0eXBlJDQoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoY2cnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skYyA9IHV0aWxzLnVucGFjaztcbiAgdmFyIGxhc3QkNCA9IHV0aWxzLmxhc3Q7XG4gIHZhciByb3VuZCQzID0gTWF0aC5yb3VuZDtcblxuICB2YXIgcmdiMmhleCA9IGZ1bmN0aW9uIHJnYjJoZXgoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRjKGFyZ3MsICdyZ2JhJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgdmFyIGEgPSByZWZbM107XG4gICAgdmFyIG1vZGUgPSBsYXN0JDQoYXJncykgfHwgJ2F1dG8nO1xuXG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG1vZGUgPT09ICdhdXRvJykge1xuICAgICAgbW9kZSA9IGEgPCAxID8gJ3JnYmEnIDogJ3JnYic7XG4gICAgfVxuXG4gICAgciA9IHJvdW5kJDMocik7XG4gICAgZyA9IHJvdW5kJDMoZyk7XG4gICAgYiA9IHJvdW5kJDMoYik7XG4gICAgdmFyIHUgPSByIDw8IDE2IHwgZyA8PCA4IHwgYjtcbiAgICB2YXIgc3RyID0gXCIwMDAwMDBcIiArIHUudG9TdHJpbmcoMTYpOyAvLyMudG9VcHBlckNhc2UoKTtcblxuICAgIHN0ciA9IHN0ci5zdWJzdHIoc3RyLmxlbmd0aCAtIDYpO1xuICAgIHZhciBoeGEgPSAnMCcgKyByb3VuZCQzKGEgKiAyNTUpLnRvU3RyaW5nKDE2KTtcbiAgICBoeGEgPSBoeGEuc3Vic3RyKGh4YS5sZW5ndGggLSAyKTtcblxuICAgIHN3aXRjaCAobW9kZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgc3RyICsgaHhhO1xuXG4gICAgICBjYXNlICdhcmdiJzpcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgaHhhICsgc3RyO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCIjXCIgKyBzdHI7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZ2IyaGV4XzEgPSByZ2IyaGV4O1xuICB2YXIgUkVfSEVYID0gL14jPyhbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszfSkkLztcbiAgdmFyIFJFX0hFWEEgPSAvXiM/KFtBLUZhLWYwLTldezh9fFtBLUZhLWYwLTldezR9KSQvO1xuXG4gIHZhciBoZXgycmdiID0gZnVuY3Rpb24gaGV4MnJnYihoZXgpIHtcbiAgICBpZiAoaGV4Lm1hdGNoKFJFX0hFWCkpIHtcbiAgICAgIC8vIHJlbW92ZSBvcHRpb25hbCBsZWFkaW5nICNcbiAgICAgIGlmIChoZXgubGVuZ3RoID09PSA0IHx8IGhleC5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgaGV4ID0gaGV4LnN1YnN0cigxKTtcbiAgICAgIH0gLy8gZXhwYW5kIHNob3J0LW5vdGF0aW9uIHRvIGZ1bGwgc2l4LWRpZ2l0XG5cblxuICAgICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgaGV4ID0gaGV4LnNwbGl0KCcnKTtcbiAgICAgICAgaGV4ID0gaGV4WzBdICsgaGV4WzBdICsgaGV4WzFdICsgaGV4WzFdICsgaGV4WzJdICsgaGV4WzJdO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IHBhcnNlSW50KGhleCwgMTYpO1xuICAgICAgdmFyIHIgPSB1ID4+IDE2O1xuICAgICAgdmFyIGcgPSB1ID4+IDggJiAweEZGO1xuICAgICAgdmFyIGIgPSB1ICYgMHhGRjtcbiAgICAgIHJldHVybiBbciwgZywgYiwgMV07XG4gICAgfSAvLyBtYXRjaCByZ2JhIGhleCBmb3JtYXQsIGVnICNGRjAwMDA3N1xuXG5cbiAgICBpZiAoaGV4Lm1hdGNoKFJFX0hFWEEpKSB7XG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gNSB8fCBoZXgubGVuZ3RoID09PSA5KSB7XG4gICAgICAgIC8vIHJlbW92ZSBvcHRpb25hbCBsZWFkaW5nICNcbiAgICAgICAgaGV4ID0gaGV4LnN1YnN0cigxKTtcbiAgICAgIH0gLy8gZXhwYW5kIHNob3J0LW5vdGF0aW9uIHRvIGZ1bGwgZWlnaHQtZGlnaXRcblxuXG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICBoZXggPSBoZXguc3BsaXQoJycpO1xuICAgICAgICBoZXggPSBoZXhbMF0gKyBoZXhbMF0gKyBoZXhbMV0gKyBoZXhbMV0gKyBoZXhbMl0gKyBoZXhbMl0gKyBoZXhbM10gKyBoZXhbM107XG4gICAgICB9XG5cbiAgICAgIHZhciB1JDEgPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICAgIHZhciByJDEgPSB1JDEgPj4gMjQgJiAweEZGO1xuICAgICAgdmFyIGckMSA9IHUkMSA+PiAxNiAmIDB4RkY7XG4gICAgICB2YXIgYiQxID0gdSQxID4+IDggJiAweEZGO1xuICAgICAgdmFyIGEgPSBNYXRoLnJvdW5kKCh1JDEgJiAweEZGKSAvIDB4RkYgKiAxMDApIC8gMTAwO1xuICAgICAgcmV0dXJuIFtyJDEsIGckMSwgYiQxLCBhXTtcbiAgICB9IC8vIHdlIHVzZWQgdG8gY2hlY2sgZm9yIGNzcyBjb2xvcnMgaGVyZVxuICAgIC8vIGlmIF9pbnB1dC5jc3M/IGFuZCByZ2IgPSBfaW5wdXQuY3NzIGhleFxuICAgIC8vICAgICByZXR1cm4gcmdiXG5cblxuICAgIHRocm93IG5ldyBFcnJvcihcInVua25vd24gaGV4IGNvbG9yOiBcIiArIGhleCk7XG4gIH07XG5cbiAgdmFyIGhleDJyZ2JfMSA9IGhleDJyZ2I7XG4gIHZhciB0eXBlJDUgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhleCA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgcmV0dXJuIHJnYjJoZXhfMSh0aGlzLl9yZ2IsIG1vZGUpO1xuICB9O1xuXG4gIGNocm9tYV8xLmhleCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnaGV4J10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQuaGV4ID0gaGV4MnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDQsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdChoKSB7XG4gICAgICB2YXIgcmVzdCA9IFtdLFxuICAgICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAobGVuLS0gPiAwKSB7XG4gICAgICAgIHJlc3RbbGVuXSA9IGFyZ3VtZW50c1tsZW4gKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXN0Lmxlbmd0aCAmJiB0eXBlJDUoaCkgPT09ICdzdHJpbmcnICYmIFszLCA0LCA1LCA2LCA3LCA4LCA5XS5pbmRleE9mKGgubGVuZ3RoKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnaGV4JztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgdW5wYWNrJGQgPSB1dGlscy51bnBhY2s7XG4gIHZhciBUV09QSSA9IHV0aWxzLlRXT1BJO1xuICB2YXIgbWluID0gTWF0aC5taW47XG4gIHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuICB2YXIgYWNvcyA9IE1hdGguYWNvcztcblxuICB2YXIgcmdiMmhzaSA9IGZ1bmN0aW9uIHJnYjJoc2koKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgYm9ycm93ZWQgZnJvbSBoZXJlOlxuICAgIGh0dHA6Ly9odW1tZXIuc3RhbmZvcmQuZWR1L211c2VpbmZvL2RvYy9leGFtcGxlcy9odW1kcnVtL2tleXNjYXBlMi9yZ2IyaHNpLmNwcFxuICAgICovXG5cblxuICAgIHZhciByZWYgPSB1bnBhY2skZChhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSByZWZbMF07XG4gICAgdmFyIGcgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgciAvPSAyNTU7XG4gICAgZyAvPSAyNTU7XG4gICAgYiAvPSAyNTU7XG4gICAgdmFyIGg7XG4gICAgdmFyIG1pbl8gPSBtaW4ociwgZywgYik7XG4gICAgdmFyIGkgPSAociArIGcgKyBiKSAvIDM7XG4gICAgdmFyIHMgPSBpID4gMCA/IDEgLSBtaW5fIC8gaSA6IDA7XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgaCA9IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IChyIC0gZyArIChyIC0gYikpIC8gMjtcbiAgICAgIGggLz0gc3FydCgociAtIGcpICogKHIgLSBnKSArIChyIC0gYikgKiAoZyAtIGIpKTtcbiAgICAgIGggPSBhY29zKGgpO1xuXG4gICAgICBpZiAoYiA+IGcpIHtcbiAgICAgICAgaCA9IFRXT1BJIC0gaDtcbiAgICAgIH1cblxuICAgICAgaCAvPSBUV09QSTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2ggKiAzNjAsIHMsIGldO1xuICB9O1xuXG4gIHZhciByZ2IyaHNpXzEgPSByZ2IyaHNpO1xuICB2YXIgdW5wYWNrJGUgPSB1dGlscy51bnBhY2s7XG4gIHZhciBsaW1pdCQxID0gdXRpbHMubGltaXQ7XG4gIHZhciBUV09QSSQxID0gdXRpbHMuVFdPUEk7XG4gIHZhciBQSVRISVJEID0gdXRpbHMuUElUSElSRDtcbiAgdmFyIGNvcyA9IE1hdGguY29zO1xuICAvKlxuICAgKiBodWUgWzAuLjM2MF1cbiAgICogc2F0dXJhdGlvbiBbMC4uMV1cbiAgICogaW50ZW5zaXR5IFswLi4xXVxuICAgKi9cblxuICB2YXIgaHNpMnJnYiA9IGZ1bmN0aW9uIGhzaTJyZ2IoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgYm9ycm93ZWQgZnJvbSBoZXJlOlxuICAgIGh0dHA6Ly9odW1tZXIuc3RhbmZvcmQuZWR1L211c2VpbmZvL2RvYy9leGFtcGxlcy9odW1kcnVtL2tleXNjYXBlMi9oc2kycmdiLmNwcFxuICAgICovXG5cblxuICAgIGFyZ3MgPSB1bnBhY2skZShhcmdzLCAnaHNpJyk7XG4gICAgdmFyIGggPSBhcmdzWzBdO1xuICAgIHZhciBzID0gYXJnc1sxXTtcbiAgICB2YXIgaSA9IGFyZ3NbMl07XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBpZiAoaXNOYU4oaCkpIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIGlmIChpc05hTihzKSkge1xuICAgICAgcyA9IDA7XG4gICAgfSAvLyBub3JtYWxpemUgaHVlXG5cblxuICAgIGlmIChoID4gMzYwKSB7XG4gICAgICBoIC09IDM2MDtcbiAgICB9XG5cbiAgICBpZiAoaCA8IDApIHtcbiAgICAgIGggKz0gMzYwO1xuICAgIH1cblxuICAgIGggLz0gMzYwO1xuXG4gICAgaWYgKGggPCAxIC8gMykge1xuICAgICAgYiA9ICgxIC0gcykgLyAzO1xuICAgICAgciA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgZyA9IDEgLSAoYiArIHIpO1xuICAgIH0gZWxzZSBpZiAoaCA8IDIgLyAzKSB7XG4gICAgICBoIC09IDEgLyAzO1xuICAgICAgciA9ICgxIC0gcykgLyAzO1xuICAgICAgZyA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgYiA9IDEgLSAociArIGcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoIC09IDIgLyAzO1xuICAgICAgZyA9ICgxIC0gcykgLyAzO1xuICAgICAgYiA9ICgxICsgcyAqIGNvcyhUV09QSSQxICogaCkgLyBjb3MoUElUSElSRCAtIFRXT1BJJDEgKiBoKSkgLyAzO1xuICAgICAgciA9IDEgLSAoZyArIGIpO1xuICAgIH1cblxuICAgIHIgPSBsaW1pdCQxKGkgKiByICogMyk7XG4gICAgZyA9IGxpbWl0JDEoaSAqIGcgKiAzKTtcbiAgICBiID0gbGltaXQkMShpICogYiAqIDMpO1xuICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NSwgYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6IDFdO1xuICB9O1xuXG4gIHZhciBoc2kycmdiXzEgPSBoc2kycmdiO1xuICB2YXIgdW5wYWNrJGYgPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDYgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhzaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmhzaV8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaHNpID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoc2knXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oc2kgPSBoc2kycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skZihhcmdzLCAnaHNpJyk7XG5cbiAgICAgIGlmICh0eXBlJDYoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoc2knO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skZyA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHR5cGUkNyA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuaHNsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyaHNsXzEodGhpcy5fcmdiKTtcbiAgfTtcblxuICBjaHJvbWFfMS5oc2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ2hzbCddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmhzbCA9IGhzbDJyZ2JfMTtcbiAgaW5wdXQuYXV0b2RldGVjdC5wdXNoKHtcbiAgICBwOiAyLFxuICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICAgIH1cblxuICAgICAgYXJncyA9IHVucGFjayRnKGFyZ3MsICdoc2wnKTtcblxuICAgICAgaWYgKHR5cGUkNyhhcmdzKSA9PT0gJ2FycmF5JyAmJiBhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gJ2hzbCc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIHVucGFjayRoID0gdXRpbHMudW5wYWNrO1xuICB2YXIgbWluJDEgPSBNYXRoLm1pbjtcbiAgdmFyIG1heCQxID0gTWF0aC5tYXg7XG4gIC8qXG4gICAqIHN1cHBvcnRlZCBhcmd1bWVudHM6XG4gICAqIC0gcmdiMmhzdihyLGcsYilcbiAgICogLSByZ2IyaHN2KFtyLGcsYl0pXG4gICAqIC0gcmdiMmhzdih7cixnLGJ9KVxuICAgKi9cblxuICB2YXIgcmdiMmhzbCQxID0gZnVuY3Rpb24gcmdiMmhzbCQxKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skaChhcmdzLCAncmdiJyk7XG4gICAgdmFyIHIgPSBhcmdzWzBdO1xuICAgIHZhciBnID0gYXJnc1sxXTtcbiAgICB2YXIgYiA9IGFyZ3NbMl07XG4gICAgdmFyIG1pbl8gPSBtaW4kMShyLCBnLCBiKTtcbiAgICB2YXIgbWF4XyA9IG1heCQxKHIsIGcsIGIpO1xuICAgIHZhciBkZWx0YSA9IG1heF8gLSBtaW5fO1xuICAgIHZhciBoLCBzLCB2O1xuICAgIHYgPSBtYXhfIC8gMjU1LjA7XG5cbiAgICBpZiAobWF4XyA9PT0gMCkge1xuICAgICAgaCA9IE51bWJlci5OYU47XG4gICAgICBzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyA9IGRlbHRhIC8gbWF4XztcblxuICAgICAgaWYgKHIgPT09IG1heF8pIHtcbiAgICAgICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKGcgPT09IG1heF8pIHtcbiAgICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgICB9XG5cbiAgICAgIGlmIChiID09PSBtYXhfKSB7XG4gICAgICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuICAgICAgfVxuXG4gICAgICBoICo9IDYwO1xuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzLCB2XTtcbiAgfTtcblxuICB2YXIgcmdiMmhzdiA9IHJnYjJoc2wkMTtcbiAgdmFyIHVucGFjayRpID0gdXRpbHMudW5wYWNrO1xuICB2YXIgZmxvb3IkMSA9IE1hdGguZmxvb3I7XG5cbiAgdmFyIGhzdjJyZ2IgPSBmdW5jdGlvbiBoc3YycmdiKCkge1xuICAgIHZhciBhc3NpZ24sIGFzc2lnbiQxLCBhc3NpZ24kMiwgYXNzaWduJDMsIGFzc2lnbiQ0LCBhc3NpZ24kNTtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICBhcmdzID0gdW5wYWNrJGkoYXJncywgJ2hzdicpO1xuICAgIHZhciBoID0gYXJnc1swXTtcbiAgICB2YXIgcyA9IGFyZ3NbMV07XG4gICAgdmFyIHYgPSBhcmdzWzJdO1xuICAgIHZhciByLCBnLCBiO1xuICAgIHYgKj0gMjU1O1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoID09PSAzNjApIHtcbiAgICAgICAgaCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChoID4gMzYwKSB7XG4gICAgICAgIGggLT0gMzYwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAzNjA7XG4gICAgICB9XG5cbiAgICAgIGggLz0gNjA7XG4gICAgICB2YXIgaSA9IGZsb29yJDEoaCk7XG4gICAgICB2YXIgZiA9IGggLSBpO1xuICAgICAgdmFyIHAgPSB2ICogKDEgLSBzKTtcbiAgICAgIHZhciBxID0gdiAqICgxIC0gcyAqIGYpO1xuICAgICAgdmFyIHQgPSB2ICogKDEgLSBzICogKDEgLSBmKSk7XG5cbiAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgYXNzaWduID0gW3YsIHQsIHBdLCByID0gYXNzaWduWzBdLCBnID0gYXNzaWduWzFdLCBiID0gYXNzaWduWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBhc3NpZ24kMSA9IFtxLCB2LCBwXSwgciA9IGFzc2lnbiQxWzBdLCBnID0gYXNzaWduJDFbMV0sIGIgPSBhc3NpZ24kMVsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgYXNzaWduJDIgPSBbcCwgdiwgdF0sIHIgPSBhc3NpZ24kMlswXSwgZyA9IGFzc2lnbiQyWzFdLCBiID0gYXNzaWduJDJbMl07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGFzc2lnbiQzID0gW3AsIHEsIHZdLCByID0gYXNzaWduJDNbMF0sIGcgPSBhc3NpZ24kM1sxXSwgYiA9IGFzc2lnbiQzWzJdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBhc3NpZ24kNCA9IFt0LCBwLCB2XSwgciA9IGFzc2lnbiQ0WzBdLCBnID0gYXNzaWduJDRbMV0sIGIgPSBhc3NpZ24kNFsyXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgYXNzaWduJDUgPSBbdiwgcCwgcV0sIHIgPSBhc3NpZ24kNVswXSwgZyA9IGFzc2lnbiQ1WzFdLCBiID0gYXNzaWduJDVbMl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyLCBnLCBiLCBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogMV07XG4gIH07XG5cbiAgdmFyIGhzdjJyZ2JfMSA9IGhzdjJyZ2I7XG4gIHZhciB1bnBhY2skaiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHR5cGUkOCA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuaHN2ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZ2IyaHN2KHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEuaHN2ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydoc3YnXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5oc3YgPSBoc3YycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skaihhcmdzLCAnaHN2Jyk7XG5cbiAgICAgIGlmICh0eXBlJDgoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdoc3YnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciBsYWJDb25zdGFudHMgPSB7XG4gICAgLy8gQ29ycmVzcG9uZHMgcm91Z2hseSB0byBSR0IgYnJpZ2h0ZXIvZGFya2VyXG4gICAgS246IDE4LFxuICAgIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFhuOiAwLjk1MDQ3MCxcbiAgICBZbjogMSxcbiAgICBabjogMS4wODg4MzAsXG4gICAgdDA6IDAuMTM3OTMxMDM0LFxuICAgIC8vIDQgLyAyOVxuICAgIHQxOiAwLjIwNjg5NjU1MixcbiAgICAvLyA2IC8gMjlcbiAgICB0MjogMC4xMjg0MTg1NSxcbiAgICAvLyAzICogdDEgKiB0MVxuICAgIHQzOiAwLjAwODg1NjQ1MiAvLyB0MSAqIHQxICogdDFcblxuICB9O1xuICB2YXIgdW5wYWNrJGsgPSB1dGlscy51bnBhY2s7XG4gIHZhciBwb3cgPSBNYXRoLnBvdztcblxuICB2YXIgcmdiMmxhYiA9IGZ1bmN0aW9uIHJnYjJsYWIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRrKGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSByZ2IyeHl6KHIsIGcsIGIpO1xuICAgIHZhciB4ID0gcmVmJDFbMF07XG4gICAgdmFyIHkgPSByZWYkMVsxXTtcbiAgICB2YXIgeiA9IHJlZiQxWzJdO1xuICAgIHZhciBsID0gMTE2ICogeSAtIDE2O1xuICAgIHJldHVybiBbbCA8IDAgPyAwIDogbCwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KV07XG4gIH07XG5cbiAgdmFyIHJnYl94eXogPSBmdW5jdGlvbiByZ2JfeHl6KHIpIHtcbiAgICBpZiAoKHIgLz0gMjU1KSA8PSAwLjA0MDQ1KSB7XG4gICAgICByZXR1cm4gciAvIDEyLjkyO1xuICAgIH1cblxuICAgIHJldHVybiBwb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgfTtcblxuICB2YXIgeHl6X2xhYiA9IGZ1bmN0aW9uIHh5el9sYWIodCkge1xuICAgIGlmICh0ID4gbGFiQ29uc3RhbnRzLnQzKSB7XG4gICAgICByZXR1cm4gcG93KHQsIDEgLyAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdCAvIGxhYkNvbnN0YW50cy50MiArIGxhYkNvbnN0YW50cy50MDtcbiAgfTtcblxuICB2YXIgcmdiMnh5eiA9IGZ1bmN0aW9uIHJnYjJ4eXoociwgZywgYikge1xuICAgIHIgPSByZ2JfeHl6KHIpO1xuICAgIGcgPSByZ2JfeHl6KGcpO1xuICAgIGIgPSByZ2JfeHl6KGIpO1xuICAgIHZhciB4ID0geHl6X2xhYigoMC40MTI0NTY0ICogciArIDAuMzU3NTc2MSAqIGcgKyAwLjE4MDQzNzUgKiBiKSAvIGxhYkNvbnN0YW50cy5Ybik7XG4gICAgdmFyIHkgPSB4eXpfbGFiKCgwLjIxMjY3MjkgKiByICsgMC43MTUxNTIyICogZyArIDAuMDcyMTc1MCAqIGIpIC8gbGFiQ29uc3RhbnRzLlluKTtcbiAgICB2YXIgeiA9IHh5el9sYWIoKDAuMDE5MzMzOSAqIHIgKyAwLjExOTE5MjAgKiBnICsgMC45NTAzMDQxICogYikgLyBsYWJDb25zdGFudHMuWm4pO1xuICAgIHJldHVybiBbeCwgeSwgel07XG4gIH07XG5cbiAgdmFyIHJnYjJsYWJfMSA9IHJnYjJsYWI7XG4gIHZhciB1bnBhY2skbCA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHBvdyQxID0gTWF0aC5wb3c7XG4gIC8qXG4gICAqIEwqIFswLi4xMDBdXG4gICAqIGEgWy0xMDAuLjEwMF1cbiAgICogYiBbLTEwMC4uMTAwXVxuICAgKi9cblxuICB2YXIgbGFiMnJnYiA9IGZ1bmN0aW9uIGxhYjJyZ2IoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgYXJncyA9IHVucGFjayRsKGFyZ3MsICdsYWInKTtcbiAgICB2YXIgbCA9IGFyZ3NbMF07XG4gICAgdmFyIGEgPSBhcmdzWzFdO1xuICAgIHZhciBiID0gYXJnc1syXTtcbiAgICB2YXIgeCwgeSwgeiwgciwgZywgYl87XG4gICAgeSA9IChsICsgMTYpIC8gMTE2O1xuICAgIHggPSBpc05hTihhKSA/IHkgOiB5ICsgYSAvIDUwMDtcbiAgICB6ID0gaXNOYU4oYikgPyB5IDogeSAtIGIgLyAyMDA7XG4gICAgeSA9IGxhYkNvbnN0YW50cy5ZbiAqIGxhYl94eXooeSk7XG4gICAgeCA9IGxhYkNvbnN0YW50cy5YbiAqIGxhYl94eXooeCk7XG4gICAgeiA9IGxhYkNvbnN0YW50cy5abiAqIGxhYl94eXooeik7XG4gICAgciA9IHh5el9yZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAwLjQ5ODUzMTQgKiB6KTsgLy8gRDY1IC0+IHNSR0JcblxuICAgIGcgPSB4eXpfcmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopO1xuICAgIGJfID0geHl6X3JnYigwLjA1NTY0MzQgKiB4IC0gMC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopO1xuICAgIHJldHVybiBbciwgZywgYl8sIGFyZ3MubGVuZ3RoID4gMyA/IGFyZ3NbM10gOiAxXTtcbiAgfTtcblxuICB2YXIgeHl6X3JnYiA9IGZ1bmN0aW9uIHh5el9yZ2Iocikge1xuICAgIHJldHVybiAyNTUgKiAociA8PSAwLjAwMzA0ID8gMTIuOTIgKiByIDogMS4wNTUgKiBwb3ckMShyLCAxIC8gMi40KSAtIDAuMDU1KTtcbiAgfTtcblxuICB2YXIgbGFiX3h5eiA9IGZ1bmN0aW9uIGxhYl94eXoodCkge1xuICAgIHJldHVybiB0ID4gbGFiQ29uc3RhbnRzLnQxID8gdCAqIHQgKiB0IDogbGFiQ29uc3RhbnRzLnQyICogKHQgLSBsYWJDb25zdGFudHMudDApO1xuICB9O1xuXG4gIHZhciBsYWIycmdiXzEgPSBsYWIycmdiO1xuICB2YXIgdW5wYWNrJG0gPSB1dGlscy51bnBhY2s7XG4gIHZhciB0eXBlJDkgPSB1dGlscy50eXBlO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmxhYiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmxhYl8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEubGFiID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWydsYWInXSkpKSgpO1xuICB9O1xuXG4gIGlucHV0LmZvcm1hdC5sYWIgPSBsYWIycmdiXzE7XG4gIGlucHV0LmF1dG9kZXRlY3QucHVzaCh7XG4gICAgcDogMixcbiAgICB0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgICB9XG5cbiAgICAgIGFyZ3MgPSB1bnBhY2skbShhcmdzLCAnbGFiJyk7XG5cbiAgICAgIGlmICh0eXBlJDkoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuICdsYWInO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skbiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIFJBRDJERUcgPSB1dGlscy5SQUQyREVHO1xuICB2YXIgc3FydCQxID0gTWF0aC5zcXJ0O1xuICB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuICB2YXIgcm91bmQkNCA9IE1hdGgucm91bmQ7XG5cbiAgdmFyIGxhYjJsY2ggPSBmdW5jdGlvbiBsYWIybGNoKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHZhciByZWYgPSB1bnBhY2skbihhcmdzLCAnbGFiJyk7XG4gICAgdmFyIGwgPSByZWZbMF07XG4gICAgdmFyIGEgPSByZWZbMV07XG4gICAgdmFyIGIgPSByZWZbMl07XG4gICAgdmFyIGMgPSBzcXJ0JDEoYSAqIGEgKyBiICogYik7XG4gICAgdmFyIGggPSAoYXRhbjIoYiwgYSkgKiBSQUQyREVHICsgMzYwKSAlIDM2MDtcblxuICAgIGlmIChyb3VuZCQ0KGMgKiAxMDAwMCkgPT09IDApIHtcbiAgICAgIGggPSBOdW1iZXIuTmFOO1xuICAgIH1cblxuICAgIHJldHVybiBbbCwgYywgaF07XG4gIH07XG5cbiAgdmFyIGxhYjJsY2hfMSA9IGxhYjJsY2g7XG4gIHZhciB1bnBhY2skbyA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMmxjaCA9IGZ1bmN0aW9uIHJnYjJsY2goKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayRvKGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSByZ2IybGFiXzEociwgZywgYik7XG4gICAgdmFyIGwgPSByZWYkMVswXTtcbiAgICB2YXIgYSA9IHJlZiQxWzFdO1xuICAgIHZhciBiXyA9IHJlZiQxWzJdO1xuICAgIHJldHVybiBsYWIybGNoXzEobCwgYSwgYl8pO1xuICB9O1xuXG4gIHZhciByZ2IybGNoXzEgPSByZ2IybGNoO1xuICB2YXIgdW5wYWNrJHAgPSB1dGlscy51bnBhY2s7XG4gIHZhciBERUcyUkFEID0gdXRpbHMuREVHMlJBRDtcbiAgdmFyIHNpbiA9IE1hdGguc2luO1xuICB2YXIgY29zJDEgPSBNYXRoLmNvcztcblxuICB2YXIgbGNoMmxhYiA9IGZ1bmN0aW9uIGxjaDJsYWIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuICAgIC8qXG4gICAgQ29udmVydCBmcm9tIGEgcXVhbGl0YXRpdmUgcGFyYW1ldGVyIGggYW5kIGEgcXVhbnRpdGF0aXZlIHBhcmFtZXRlciBsIHRvIGEgMjQtYml0IHBpeGVsLlxuICAgIFRoZXNlIGZvcm11bGFzIHdlcmUgaW52ZW50ZWQgYnkgRGF2aWQgRGFscnltcGxlIHRvIG9idGFpbiBtYXhpbXVtIGNvbnRyYXN0IHdpdGhvdXQgZ29pbmdcbiAgICBvdXQgb2YgZ2FtdXQgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIGluIHRoZSByYW5nZSAwLTEuXG4gICAgIEEgc2F0dXJhdGlvbiBtdWx0aXBsaWVyIHdhcyBhZGRlZCBieSBHcmVnb3IgQWlzY2hcbiAgICAqL1xuXG5cbiAgICB2YXIgcmVmID0gdW5wYWNrJHAoYXJncywgJ2xjaCcpO1xuICAgIHZhciBsID0gcmVmWzBdO1xuICAgIHZhciBjID0gcmVmWzFdO1xuICAgIHZhciBoID0gcmVmWzJdO1xuXG4gICAgaWYgKGlzTmFOKGgpKSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICBoID0gaCAqIERFRzJSQUQ7XG4gICAgcmV0dXJuIFtsLCBjb3MkMShoKSAqIGMsIHNpbihoKSAqIGNdO1xuICB9O1xuXG4gIHZhciBsY2gybGFiXzEgPSBsY2gybGFiO1xuICB2YXIgdW5wYWNrJHEgPSB1dGlscy51bnBhY2s7XG5cbiAgdmFyIGxjaDJyZ2IgPSBmdW5jdGlvbiBsY2gycmdiKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIGFyZ3MgPSB1bnBhY2skcShhcmdzLCAnbGNoJyk7XG4gICAgdmFyIGwgPSBhcmdzWzBdO1xuICAgIHZhciBjID0gYXJnc1sxXTtcbiAgICB2YXIgaCA9IGFyZ3NbMl07XG4gICAgdmFyIHJlZiA9IGxjaDJsYWJfMShsLCBjLCBoKTtcbiAgICB2YXIgTCA9IHJlZlswXTtcbiAgICB2YXIgYSA9IHJlZlsxXTtcbiAgICB2YXIgYl8gPSByZWZbMl07XG4gICAgdmFyIHJlZiQxID0gbGFiMnJnYl8xKEwsIGEsIGJfKTtcbiAgICB2YXIgciA9IHJlZiQxWzBdO1xuICAgIHZhciBnID0gcmVmJDFbMV07XG4gICAgdmFyIGIgPSByZWYkMVsyXTtcbiAgICByZXR1cm4gW3IsIGcsIGIsIGFyZ3MubGVuZ3RoID4gMyA/IGFyZ3NbM10gOiAxXTtcbiAgfTtcblxuICB2YXIgbGNoMnJnYl8xID0gbGNoMnJnYjtcbiAgdmFyIHVucGFjayRyID0gdXRpbHMudW5wYWNrO1xuXG4gIHZhciBoY2wycmdiID0gZnVuY3Rpb24gaGNsMnJnYigpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgaGNsID0gdW5wYWNrJHIoYXJncywgJ2hjbCcpLnJldmVyc2UoKTtcbiAgICByZXR1cm4gbGNoMnJnYl8xLmFwcGx5KHZvaWQgMCwgaGNsKTtcbiAgfTtcblxuICB2YXIgaGNsMnJnYl8xID0gaGNsMnJnYjtcbiAgdmFyIHVucGFjayRzID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSRhID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5sY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJsY2hfMSh0aGlzLl9yZ2IpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmhjbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmdiMmxjaF8xKHRoaXMuX3JnYikucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNocm9tYV8xLmxjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnbGNoJ10pKSkoKTtcbiAgfTtcblxuICBjaHJvbWFfMS5oY2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ2hjbCddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LmxjaCA9IGxjaDJyZ2JfMTtcbiAgaW5wdXQuZm9ybWF0LmhjbCA9IGhjbDJyZ2JfMTtcbiAgWydsY2gnLCAnaGNsJ10uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgICAgcDogMixcbiAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncyA9IHVucGFjayRzKGFyZ3MsIG0pO1xuXG4gICAgICAgIGlmICh0eXBlJGEoYXJncykgPT09ICdhcnJheScgJiYgYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgLyoqXG4gIFx0WDExIGNvbG9yIG5hbWVzXG4gICBcdGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI3N2Zy1jb2xvclxuICAqL1xuXG4gIHZhciB3M2N4MTEgPSB7XG4gICAgYWxpY2VibHVlOiAnI2YwZjhmZicsXG4gICAgYW50aXF1ZXdoaXRlOiAnI2ZhZWJkNycsXG4gICAgYXF1YTogJyMwMGZmZmYnLFxuICAgIGFxdWFtYXJpbmU6ICcjN2ZmZmQ0JyxcbiAgICBhenVyZTogJyNmMGZmZmYnLFxuICAgIGJlaWdlOiAnI2Y1ZjVkYycsXG4gICAgYmlzcXVlOiAnI2ZmZTRjNCcsXG4gICAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgICBibGFuY2hlZGFsbW9uZDogJyNmZmViY2QnLFxuICAgIGJsdWU6ICcjMDAwMGZmJyxcbiAgICBibHVldmlvbGV0OiAnIzhhMmJlMicsXG4gICAgYnJvd246ICcjYTUyYTJhJyxcbiAgICBidXJseXdvb2Q6ICcjZGViODg3JyxcbiAgICBjYWRldGJsdWU6ICcjNWY5ZWEwJyxcbiAgICBjaGFydHJldXNlOiAnIzdmZmYwMCcsXG4gICAgY2hvY29sYXRlOiAnI2QyNjkxZScsXG4gICAgY29yYWw6ICcjZmY3ZjUwJyxcbiAgICBjb3JuZmxvd2VyOiAnIzY0OTVlZCcsXG4gICAgY29ybmZsb3dlcmJsdWU6ICcjNjQ5NWVkJyxcbiAgICBjb3Juc2lsazogJyNmZmY4ZGMnLFxuICAgIGNyaW1zb246ICcjZGMxNDNjJyxcbiAgICBjeWFuOiAnIzAwZmZmZicsXG4gICAgZGFya2JsdWU6ICcjMDAwMDhiJyxcbiAgICBkYXJrY3lhbjogJyMwMDhiOGInLFxuICAgIGRhcmtnb2xkZW5yb2Q6ICcjYjg4NjBiJyxcbiAgICBkYXJrZ3JheTogJyNhOWE5YTknLFxuICAgIGRhcmtncmVlbjogJyMwMDY0MDAnLFxuICAgIGRhcmtncmV5OiAnI2E5YTlhOScsXG4gICAgZGFya2toYWtpOiAnI2JkYjc2YicsXG4gICAgZGFya21hZ2VudGE6ICcjOGIwMDhiJyxcbiAgICBkYXJrb2xpdmVncmVlbjogJyM1NTZiMmYnLFxuICAgIGRhcmtvcmFuZ2U6ICcjZmY4YzAwJyxcbiAgICBkYXJrb3JjaGlkOiAnIzk5MzJjYycsXG4gICAgZGFya3JlZDogJyM4YjAwMDAnLFxuICAgIGRhcmtzYWxtb246ICcjZTk5NjdhJyxcbiAgICBkYXJrc2VhZ3JlZW46ICcjOGZiYzhmJyxcbiAgICBkYXJrc2xhdGVibHVlOiAnIzQ4M2Q4YicsXG4gICAgZGFya3NsYXRlZ3JheTogJyMyZjRmNGYnLFxuICAgIGRhcmtzbGF0ZWdyZXk6ICcjMmY0ZjRmJyxcbiAgICBkYXJrdHVycXVvaXNlOiAnIzAwY2VkMScsXG4gICAgZGFya3Zpb2xldDogJyM5NDAwZDMnLFxuICAgIGRlZXBwaW5rOiAnI2ZmMTQ5MycsXG4gICAgZGVlcHNreWJsdWU6ICcjMDBiZmZmJyxcbiAgICBkaW1ncmF5OiAnIzY5Njk2OScsXG4gICAgZGltZ3JleTogJyM2OTY5NjknLFxuICAgIGRvZGdlcmJsdWU6ICcjMWU5MGZmJyxcbiAgICBmaXJlYnJpY2s6ICcjYjIyMjIyJyxcbiAgICBmbG9yYWx3aGl0ZTogJyNmZmZhZjAnLFxuICAgIGZvcmVzdGdyZWVuOiAnIzIyOGIyMicsXG4gICAgZnVjaHNpYTogJyNmZjAwZmYnLFxuICAgIGdhaW5zYm9ybzogJyNkY2RjZGMnLFxuICAgIGdob3N0d2hpdGU6ICcjZjhmOGZmJyxcbiAgICBnb2xkOiAnI2ZmZDcwMCcsXG4gICAgZ29sZGVucm9kOiAnI2RhYTUyMCcsXG4gICAgZ3JheTogJyM4MDgwODAnLFxuICAgIGdyZWVuOiAnIzAwODAwMCcsXG4gICAgZ3JlZW55ZWxsb3c6ICcjYWRmZjJmJyxcbiAgICBncmV5OiAnIzgwODA4MCcsXG4gICAgaG9uZXlkZXc6ICcjZjBmZmYwJyxcbiAgICBob3RwaW5rOiAnI2ZmNjliNCcsXG4gICAgaW5kaWFucmVkOiAnI2NkNWM1YycsXG4gICAgaW5kaWdvOiAnIzRiMDA4MicsXG4gICAgaXZvcnk6ICcjZmZmZmYwJyxcbiAgICBraGFraTogJyNmMGU2OGMnLFxuICAgIGxhc2VybGVtb246ICcjZmZmZjU0JyxcbiAgICBsYXZlbmRlcjogJyNlNmU2ZmEnLFxuICAgIGxhdmVuZGVyYmx1c2g6ICcjZmZmMGY1JyxcbiAgICBsYXduZ3JlZW46ICcjN2NmYzAwJyxcbiAgICBsZW1vbmNoaWZmb246ICcjZmZmYWNkJyxcbiAgICBsaWdodGJsdWU6ICcjYWRkOGU2JyxcbiAgICBsaWdodGNvcmFsOiAnI2YwODA4MCcsXG4gICAgbGlnaHRjeWFuOiAnI2UwZmZmZicsXG4gICAgbGlnaHRnb2xkZW5yb2Q6ICcjZmFmYWQyJyxcbiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogJyNmYWZhZDInLFxuICAgIGxpZ2h0Z3JheTogJyNkM2QzZDMnLFxuICAgIGxpZ2h0Z3JlZW46ICcjOTBlZTkwJyxcbiAgICBsaWdodGdyZXk6ICcjZDNkM2QzJyxcbiAgICBsaWdodHBpbms6ICcjZmZiNmMxJyxcbiAgICBsaWdodHNhbG1vbjogJyNmZmEwN2EnLFxuICAgIGxpZ2h0c2VhZ3JlZW46ICcjMjBiMmFhJyxcbiAgICBsaWdodHNreWJsdWU6ICcjODdjZWZhJyxcbiAgICBsaWdodHNsYXRlZ3JheTogJyM3Nzg4OTknLFxuICAgIGxpZ2h0c2xhdGVncmV5OiAnIzc3ODg5OScsXG4gICAgbGlnaHRzdGVlbGJsdWU6ICcjYjBjNGRlJyxcbiAgICBsaWdodHllbGxvdzogJyNmZmZmZTAnLFxuICAgIGxpbWU6ICcjMDBmZjAwJyxcbiAgICBsaW1lZ3JlZW46ICcjMzJjZDMyJyxcbiAgICBsaW5lbjogJyNmYWYwZTYnLFxuICAgIG1hZ2VudGE6ICcjZmYwMGZmJyxcbiAgICBtYXJvb246ICcjODAwMDAwJyxcbiAgICBtYXJvb24yOiAnIzdmMDAwMCcsXG4gICAgbWFyb29uMzogJyNiMDMwNjAnLFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6ICcjNjZjZGFhJyxcbiAgICBtZWRpdW1ibHVlOiAnIzAwMDBjZCcsXG4gICAgbWVkaXVtb3JjaGlkOiAnI2JhNTVkMycsXG4gICAgbWVkaXVtcHVycGxlOiAnIzkzNzBkYicsXG4gICAgbWVkaXVtc2VhZ3JlZW46ICcjM2NiMzcxJyxcbiAgICBtZWRpdW1zbGF0ZWJsdWU6ICcjN2I2OGVlJyxcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogJyMwMGZhOWEnLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogJyM0OGQxY2MnLFxuICAgIG1lZGl1bXZpb2xldHJlZDogJyNjNzE1ODUnLFxuICAgIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLFxuICAgIG1pbnRjcmVhbTogJyNmNWZmZmEnLFxuICAgIG1pc3R5cm9zZTogJyNmZmU0ZTEnLFxuICAgIG1vY2Nhc2luOiAnI2ZmZTRiNScsXG4gICAgbmF2YWpvd2hpdGU6ICcjZmZkZWFkJyxcbiAgICBuYXZ5OiAnIzAwMDA4MCcsXG4gICAgb2xkbGFjZTogJyNmZGY1ZTYnLFxuICAgIG9saXZlOiAnIzgwODAwMCcsXG4gICAgb2xpdmVkcmFiOiAnIzZiOGUyMycsXG4gICAgb3JhbmdlOiAnI2ZmYTUwMCcsXG4gICAgb3JhbmdlcmVkOiAnI2ZmNDUwMCcsXG4gICAgb3JjaGlkOiAnI2RhNzBkNicsXG4gICAgcGFsZWdvbGRlbnJvZDogJyNlZWU4YWEnLFxuICAgIHBhbGVncmVlbjogJyM5OGZiOTgnLFxuICAgIHBhbGV0dXJxdW9pc2U6ICcjYWZlZWVlJyxcbiAgICBwYWxldmlvbGV0cmVkOiAnI2RiNzA5MycsXG4gICAgcGFwYXlhd2hpcDogJyNmZmVmZDUnLFxuICAgIHBlYWNocHVmZjogJyNmZmRhYjknLFxuICAgIHBlcnU6ICcjY2Q4NTNmJyxcbiAgICBwaW5rOiAnI2ZmYzBjYicsXG4gICAgcGx1bTogJyNkZGEwZGQnLFxuICAgIHBvd2RlcmJsdWU6ICcjYjBlMGU2JyxcbiAgICBwdXJwbGU6ICcjODAwMDgwJyxcbiAgICBwdXJwbGUyOiAnIzdmMDA3ZicsXG4gICAgcHVycGxlMzogJyNhMDIwZjAnLFxuICAgIHJlYmVjY2FwdXJwbGU6ICcjNjYzMzk5JyxcbiAgICByZWQ6ICcjZmYwMDAwJyxcbiAgICByb3N5YnJvd246ICcjYmM4ZjhmJyxcbiAgICByb3lhbGJsdWU6ICcjNDE2OWUxJyxcbiAgICBzYWRkbGVicm93bjogJyM4YjQ1MTMnLFxuICAgIHNhbG1vbjogJyNmYTgwNzInLFxuICAgIHNhbmR5YnJvd246ICcjZjRhNDYwJyxcbiAgICBzZWFncmVlbjogJyMyZThiNTcnLFxuICAgIHNlYXNoZWxsOiAnI2ZmZjVlZScsXG4gICAgc2llbm5hOiAnI2EwNTIyZCcsXG4gICAgc2lsdmVyOiAnI2MwYzBjMCcsXG4gICAgc2t5Ymx1ZTogJyM4N2NlZWInLFxuICAgIHNsYXRlYmx1ZTogJyM2YTVhY2QnLFxuICAgIHNsYXRlZ3JheTogJyM3MDgwOTAnLFxuICAgIHNsYXRlZ3JleTogJyM3MDgwOTAnLFxuICAgIHNub3c6ICcjZmZmYWZhJyxcbiAgICBzcHJpbmdncmVlbjogJyMwMGZmN2YnLFxuICAgIHN0ZWVsYmx1ZTogJyM0NjgyYjQnLFxuICAgIHRhbjogJyNkMmI0OGMnLFxuICAgIHRlYWw6ICcjMDA4MDgwJyxcbiAgICB0aGlzdGxlOiAnI2Q4YmZkOCcsXG4gICAgdG9tYXRvOiAnI2ZmNjM0NycsXG4gICAgdHVycXVvaXNlOiAnIzQwZTBkMCcsXG4gICAgdmlvbGV0OiAnI2VlODJlZScsXG4gICAgd2hlYXQ6ICcjZjVkZWIzJyxcbiAgICB3aGl0ZTogJyNmZmZmZmYnLFxuICAgIHdoaXRlc21va2U6ICcjZjVmNWY1JyxcbiAgICB5ZWxsb3c6ICcjZmZmZjAwJyxcbiAgICB5ZWxsb3dncmVlbjogJyM5YWNkMzInXG4gIH07XG4gIHZhciB3M2N4MTFfMSA9IHczY3gxMTtcbiAgdmFyIHR5cGUkYiA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGV4ID0gcmdiMmhleF8xKHRoaXMuX3JnYiwgJ3JnYicpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBPYmplY3Qua2V5cyh3M2N4MTFfMSk7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbiA9IGxpc3RbaV07XG5cbiAgICAgIGlmICh3M2N4MTFfMVtuXSA9PT0gaGV4KSB7XG4gICAgICAgIHJldHVybiBuLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleDtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQubmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAodzNjeDExXzFbbmFtZV0pIHtcbiAgICAgIHJldHVybiBoZXgycmdiXzEodzNjeDExXzFbbmFtZV0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb2xvciBuYW1lOiAnICsgbmFtZSk7XG4gIH07XG5cbiAgaW5wdXQuYXV0b2RldGVjdC5wdXNoKHtcbiAgICBwOiA1LFxuICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoaCkge1xuICAgICAgdmFyIHJlc3QgPSBbXSxcbiAgICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbi0tID4gMCkge1xuICAgICAgICByZXN0W2xlbl0gPSBhcmd1bWVudHNbbGVuICsgMV07XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzdC5sZW5ndGggJiYgdHlwZSRiKGgpID09PSAnc3RyaW5nJyAmJiB3M2N4MTFfMVtoLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIHJldHVybiAnbmFtZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHZhciB1bnBhY2skdCA9IHV0aWxzLnVucGFjaztcblxuICB2YXIgcmdiMm51bSA9IGZ1bmN0aW9uIHJnYjJudW0oKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJlZiA9IHVucGFjayR0KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJlZlswXTtcbiAgICB2YXIgZyA9IHJlZlsxXTtcbiAgICB2YXIgYiA9IHJlZlsyXTtcbiAgICByZXR1cm4gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiO1xuICB9O1xuXG4gIHZhciByZ2IybnVtXzEgPSByZ2IybnVtO1xuICB2YXIgdHlwZSRjID0gdXRpbHMudHlwZTtcblxuICB2YXIgbnVtMnJnYiA9IGZ1bmN0aW9uIG51bTJyZ2IobnVtKSB7XG4gICAgaWYgKHR5cGUkYyhudW0pID09IFwibnVtYmVyXCIgJiYgbnVtID49IDAgJiYgbnVtIDw9IDB4RkZGRkZGKSB7XG4gICAgICB2YXIgciA9IG51bSA+PiAxNjtcbiAgICAgIHZhciBnID0gbnVtID4+IDggJiAweEZGO1xuICAgICAgdmFyIGIgPSBudW0gJiAweEZGO1xuICAgICAgcmV0dXJuIFtyLCBnLCBiLCAxXTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIG51bSBjb2xvcjogXCIgKyBudW0pO1xuICB9O1xuXG4gIHZhciBudW0ycmdiXzEgPSBudW0ycmdiO1xuICB2YXIgdHlwZSRkID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5udW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJudW1fMSh0aGlzLl9yZ2IpO1xuICB9O1xuXG4gIGNocm9tYV8xLm51bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShDb2xvcl8xLCBbbnVsbF0uY29uY2F0KGFyZ3MsIFsnbnVtJ10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQubnVtID0gbnVtMnJnYl8xO1xuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDUsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZSRkKGFyZ3NbMF0pID09PSAnbnVtYmVyJyAmJiBhcmdzWzBdID49IDAgJiYgYXJnc1swXSA8PSAweEZGRkZGRikge1xuICAgICAgICByZXR1cm4gJ251bSc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIHVucGFjayR1ID0gdXRpbHMudW5wYWNrO1xuICB2YXIgdHlwZSRlID0gdXRpbHMudHlwZTtcbiAgdmFyIHJvdW5kJDUgPSBNYXRoLnJvdW5kO1xuXG4gIENvbG9yXzEucHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uIChybmQpIHtcbiAgICBpZiAocm5kID09PSB2b2lkIDApIHJuZCA9IHRydWU7XG5cbiAgICBpZiAocm5kID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JnYi5zbGljZSgwLCAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmdiLnNsaWNlKDAsIDMpLm1hcChyb3VuZCQ1KTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5yZ2JhID0gZnVuY3Rpb24gKHJuZCkge1xuICAgIGlmIChybmQgPT09IHZvaWQgMCkgcm5kID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fcmdiLnNsaWNlKDAsIDQpLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgcmV0dXJuIGkgPCAzID8gcm5kID09PSBmYWxzZSA/IHYgOiByb3VuZCQ1KHYpIDogdjtcbiAgICB9KTtcbiAgfTtcblxuICBjaHJvbWFfMS5yZ2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoQ29sb3JfMSwgW251bGxdLmNvbmNhdChhcmdzLCBbJ3JnYiddKSkpKCk7XG4gIH07XG5cbiAgaW5wdXQuZm9ybWF0LnJnYiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICBhcmdzW2xlbl0gPSBhcmd1bWVudHNbbGVuXTtcbiAgICB9XG5cbiAgICB2YXIgcmdiYSA9IHVucGFjayR1KGFyZ3MsICdyZ2JhJyk7XG5cbiAgICBpZiAocmdiYVszXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZ2JhWzNdID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmdiYTtcbiAgfTtcblxuICBpbnB1dC5hdXRvZGV0ZWN0LnB1c2goe1xuICAgIHA6IDMsXG4gICAgdGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbi0tKSB7XG4gICAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgICAgfVxuXG4gICAgICBhcmdzID0gdW5wYWNrJHUoYXJncywgJ3JnYmEnKTtcblxuICAgICAgaWYgKHR5cGUkZShhcmdzKSA9PT0gJ2FycmF5JyAmJiAoYXJncy5sZW5ndGggPT09IDMgfHwgYXJncy5sZW5ndGggPT09IDQgJiYgdHlwZSRlKGFyZ3NbM10pID09ICdudW1iZXInICYmIGFyZ3NbM10gPj0gMCAmJiBhcmdzWzNdIDw9IDEpKSB7XG4gICAgICAgIHJldHVybiAncmdiJztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKlxuICAgKiBCYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBOZWlsIEJhcnRsZXR0XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWlsYmFydGxldHQvY29sb3ItdGVtcGVyYXR1cmVcbiAgICovXG5cbiAgdmFyIGxvZyA9IE1hdGgubG9nO1xuXG4gIHZhciB0ZW1wZXJhdHVyZTJyZ2IgPSBmdW5jdGlvbiB0ZW1wZXJhdHVyZTJyZ2Ioa2VsdmluKSB7XG4gICAgdmFyIHRlbXAgPSBrZWx2aW4gLyAxMDA7XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBpZiAodGVtcCA8IDY2KSB7XG4gICAgICByID0gMjU1O1xuICAgICAgZyA9IC0xNTUuMjU0ODU1NjI3MDkxNzkgLSAwLjQ0NTk2OTUwNDY5NTc5MTMzICogKGcgPSB0ZW1wIC0gMikgKyAxMDQuNDkyMTYxOTkzOTM4ODggKiBsb2coZyk7XG4gICAgICBiID0gdGVtcCA8IDIwID8gMCA6IC0yNTQuNzY5MzUxODQxMjA5MDIgKyAwLjgyNzQwOTYwNjQwMDczOTUgKiAoYiA9IHRlbXAgLSAxMCkgKyAxMTUuNjc5OTQ0MDEwNjYxNDcgKiBsb2coYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIgPSAzNTEuOTc2OTA1NjY4MDU2OTMgKyAwLjExNDIwNjQ1Mzc4NDE2NSAqIChyID0gdGVtcCAtIDU1KSAtIDQwLjI1MzY2MzA5MzMyMTI3ICogbG9nKHIpO1xuICAgICAgZyA9IDMyNS40NDk0MTI1NzExOTc0ICsgMC4wNzk0MzQ1NjUzNjY2MjM0MiAqIChnID0gdGVtcCAtIDUwKSAtIDI4LjA4NTI5NjM1MDc5NTcgKiBsb2coZyk7XG4gICAgICBiID0gMjU1O1xuICAgIH1cblxuICAgIHJldHVybiBbciwgZywgYiwgMV07XG4gIH07XG5cbiAgdmFyIHRlbXBlcmF0dXJlMnJnYl8xID0gdGVtcGVyYXR1cmUycmdiO1xuICAvKlxuICAgKiBCYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBOZWlsIEJhcnRsZXR0XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWlsYmFydGxldHQvY29sb3ItdGVtcGVyYXR1cmVcbiAgICoqL1xuXG4gIHZhciB1bnBhY2skdiA9IHV0aWxzLnVucGFjaztcbiAgdmFyIHJvdW5kJDYgPSBNYXRoLnJvdW5kO1xuXG4gIHZhciByZ2IydGVtcGVyYXR1cmUgPSBmdW5jdGlvbiByZ2IydGVtcGVyYXR1cmUoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW4tLSkge1xuICAgICAgYXJnc1tsZW5dID0gYXJndW1lbnRzW2xlbl07XG4gICAgfVxuXG4gICAgdmFyIHJnYiA9IHVucGFjayR2KGFyZ3MsICdyZ2InKTtcbiAgICB2YXIgciA9IHJnYlswXSxcbiAgICAgICAgYiA9IHJnYlsyXTtcbiAgICB2YXIgbWluVGVtcCA9IDEwMDA7XG4gICAgdmFyIG1heFRlbXAgPSA0MDAwMDtcbiAgICB2YXIgZXBzID0gMC40O1xuICAgIHZhciB0ZW1wO1xuXG4gICAgd2hpbGUgKG1heFRlbXAgLSBtaW5UZW1wID4gZXBzKSB7XG4gICAgICB0ZW1wID0gKG1heFRlbXAgKyBtaW5UZW1wKSAqIDAuNTtcbiAgICAgIHZhciByZ2IkMSA9IHRlbXBlcmF0dXJlMnJnYl8xKHRlbXApO1xuXG4gICAgICBpZiAocmdiJDFbMl0gLyByZ2IkMVswXSA+PSBiIC8gcikge1xuICAgICAgICBtYXhUZW1wID0gdGVtcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pblRlbXAgPSB0ZW1wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3VuZCQ2KHRlbXApO1xuICB9O1xuXG4gIHZhciByZ2IydGVtcGVyYXR1cmVfMSA9IHJnYjJ0ZW1wZXJhdHVyZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS50ZW1wID0gQ29sb3JfMS5wcm90b3R5cGUua2VsdmluID0gQ29sb3JfMS5wcm90b3R5cGUudGVtcGVyYXR1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJnYjJ0ZW1wZXJhdHVyZV8xKHRoaXMuX3JnYik7XG4gIH07XG5cbiAgY2hyb21hXzEudGVtcCA9IGNocm9tYV8xLmtlbHZpbiA9IGNocm9tYV8xLnRlbXBlcmF0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncywgWyd0ZW1wJ10pKSkoKTtcbiAgfTtcblxuICBpbnB1dC5mb3JtYXQudGVtcCA9IGlucHV0LmZvcm1hdC5rZWx2aW4gPSBpbnB1dC5mb3JtYXQudGVtcGVyYXR1cmUgPSB0ZW1wZXJhdHVyZTJyZ2JfMTtcbiAgdmFyIHR5cGUkZiA9IHV0aWxzLnR5cGU7XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuYWxwaGEgPSBmdW5jdGlvbiAoYSwgbXV0YXRlKSB7XG4gICAgaWYgKG11dGF0ZSA9PT0gdm9pZCAwKSBtdXRhdGUgPSBmYWxzZTtcblxuICAgIGlmIChhICE9PSB1bmRlZmluZWQgJiYgdHlwZSRmKGEpID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKG11dGF0ZSkge1xuICAgICAgICB0aGlzLl9yZ2JbM10gPSBhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKFt0aGlzLl9yZ2JbMF0sIHRoaXMuX3JnYlsxXSwgdGhpcy5fcmdiWzJdLCBhXSwgJ3JnYicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZ2JbM107XG4gIH07XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuY2xpcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmdiLl9jbGlwcGVkIHx8IGZhbHNlO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLmRhcmtlbiA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIGFtb3VudCA9IDE7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgbGFiID0gbWUubGFiKCk7XG4gICAgbGFiWzBdIC09IGxhYkNvbnN0YW50cy5LbiAqIGFtb3VudDtcbiAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJykuYWxwaGEobWUuYWxwaGEoKSwgdHJ1ZSk7XG4gIH07XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuYnJpZ2h0ZW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSBhbW91bnQgPSAxO1xuICAgIHJldHVybiB0aGlzLmRhcmtlbigtYW1vdW50KTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5kYXJrZXIgPSBDb2xvcl8xLnByb3RvdHlwZS5kYXJrZW47XG4gIENvbG9yXzEucHJvdG90eXBlLmJyaWdodGVyID0gQ29sb3JfMS5wcm90b3R5cGUuYnJpZ2h0ZW47XG5cbiAgQ29sb3JfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG1jKSB7XG4gICAgdmFyIHJlZiA9IG1jLnNwbGl0KCcuJyk7XG4gICAgdmFyIG1vZGUgPSByZWZbMF07XG4gICAgdmFyIGNoYW5uZWwgPSByZWZbMV07XG4gICAgdmFyIHNyYyA9IHRoaXNbbW9kZV0oKTtcblxuICAgIGlmIChjaGFubmVsKSB7XG4gICAgICB2YXIgaSA9IG1vZGUuaW5kZXhPZihjaGFubmVsKTtcblxuICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICByZXR1cm4gc3JjW2ldO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNoYW5uZWwgXCIgKyBjaGFubmVsICsgXCIgaW4gbW9kZSBcIiArIG1vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3JjO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdHlwZSRnID0gdXRpbHMudHlwZTtcbiAgdmFyIHBvdyQyID0gTWF0aC5wb3c7XG4gIHZhciBFUFMgPSAxZS03O1xuICB2YXIgTUFYX0lURVIgPSAyMDtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5sdW1pbmFuY2UgPSBmdW5jdGlvbiAobHVtKSB7XG4gICAgaWYgKGx1bSAhPT0gdW5kZWZpbmVkICYmIHR5cGUkZyhsdW0pID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGx1bSA9PT0gMCkge1xuICAgICAgICAvLyByZXR1cm4gcHVyZSBibGFja1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEoWzAsIDAsIDAsIHRoaXMuX3JnYlszXV0sICdyZ2InKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGx1bSA9PT0gMSkge1xuICAgICAgICAvLyByZXR1cm4gcHVyZSB3aGl0ZVxuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEoWzI1NSwgMjU1LCAyNTUsIHRoaXMuX3JnYlszXV0sICdyZ2InKTtcbiAgICAgIH0gLy8gY29tcHV0ZSBuZXcgY29sb3IgdXNpbmcuLi5cblxuXG4gICAgICB2YXIgY3VyX2x1bSA9IHRoaXMubHVtaW5hbmNlKCk7XG4gICAgICB2YXIgbW9kZSA9ICdyZ2InO1xuICAgICAgdmFyIG1heF9pdGVyID0gTUFYX0lURVI7XG5cbiAgICAgIHZhciB0ZXN0ID0gZnVuY3Rpb24gdGVzdChsb3csIGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IGxvdy5pbnRlcnBvbGF0ZShoaWdoLCAwLjUsIG1vZGUpO1xuICAgICAgICB2YXIgbG0gPSBtaWQubHVtaW5hbmNlKCk7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGx1bSAtIGxtKSA8IEVQUyB8fCAhbWF4X2l0ZXItLSkge1xuICAgICAgICAgIC8vIGNsb3NlIGVub3VnaFxuICAgICAgICAgIHJldHVybiBtaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG0gPiBsdW0gPyB0ZXN0KGxvdywgbWlkKSA6IHRlc3QobWlkLCBoaWdoKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZ2IgPSAoY3VyX2x1bSA+IGx1bSA/IHRlc3QobmV3IENvbG9yXzEoWzAsIDAsIDBdKSwgdGhpcykgOiB0ZXN0KHRoaXMsIG5ldyBDb2xvcl8xKFsyNTUsIDI1NSwgMjU1XSkpKS5yZ2IoKTtcbiAgICAgIHJldHVybiBuZXcgQ29sb3JfMShyZ2IuY29uY2F0KFt0aGlzLl9yZ2JbM11dKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYjJsdW1pbmFuY2UuYXBwbHkodm9pZCAwLCB0aGlzLl9yZ2Iuc2xpY2UoMCwgMykpO1xuICB9O1xuXG4gIHZhciByZ2IybHVtaW5hbmNlID0gZnVuY3Rpb24gcmdiMmx1bWluYW5jZShyLCBnLCBiKSB7XG4gICAgLy8gcmVsYXRpdmUgbHVtaW5hbmNlXG4gICAgLy8gc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDgvUkVDLVdDQUcyMC0yMDA4MTIxMS8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICByID0gbHVtaW5hbmNlX3gocik7XG4gICAgZyA9IGx1bWluYW5jZV94KGcpO1xuICAgIGIgPSBsdW1pbmFuY2VfeChiKTtcbiAgICByZXR1cm4gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICB9O1xuXG4gIHZhciBsdW1pbmFuY2VfeCA9IGZ1bmN0aW9uIGx1bWluYW5jZV94KHgpIHtcbiAgICB4IC89IDI1NTtcbiAgICByZXR1cm4geCA8PSAwLjAzOTI4ID8geCAvIDEyLjkyIDogcG93JDIoKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgfTtcblxuICB2YXIgaW50ZXJwb2xhdG9yID0ge307XG4gIHZhciB0eXBlJGggPSB1dGlscy50eXBlO1xuXG4gIHZhciBtaXggPSBmdW5jdGlvbiBtaXgoY29sMSwgY29sMiwgZikge1xuICAgIGlmIChmID09PSB2b2lkIDApIGYgPSAwLjU7XG4gICAgdmFyIHJlc3QgPSBbXSxcbiAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7XG5cbiAgICB3aGlsZSAobGVuLS0gPiAwKSB7XG4gICAgICByZXN0W2xlbl0gPSBhcmd1bWVudHNbbGVuICsgM107XG4gICAgfVxuXG4gICAgdmFyIG1vZGUgPSByZXN0WzBdIHx8ICdscmdiJztcblxuICAgIGlmICghaW50ZXJwb2xhdG9yW21vZGVdICYmICFyZXN0Lmxlbmd0aCkge1xuICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBzdXBwb3J0ZWQgbW9kZVxuICAgICAgbW9kZSA9IE9iamVjdC5rZXlzKGludGVycG9sYXRvcilbMF07XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnBvbGF0b3JbbW9kZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludGVycG9sYXRpb24gbW9kZSBcIiArIG1vZGUgKyBcIiBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSRoKGNvbDEpICE9PSAnb2JqZWN0Jykge1xuICAgICAgY29sMSA9IG5ldyBDb2xvcl8xKGNvbDEpO1xuICAgIH1cblxuICAgIGlmICh0eXBlJGgoY29sMikgIT09ICdvYmplY3QnKSB7XG4gICAgICBjb2wyID0gbmV3IENvbG9yXzEoY29sMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVycG9sYXRvclttb2RlXShjb2wxLCBjb2wyLCBmKS5hbHBoYShjb2wxLmFscGhhKCkgKyBmICogKGNvbDIuYWxwaGEoKSAtIGNvbDEuYWxwaGEoKSkpO1xuICB9O1xuXG4gIENvbG9yXzEucHJvdG90eXBlLm1peCA9IENvbG9yXzEucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKGNvbDIsIGYpIHtcbiAgICBpZiAoZiA9PT0gdm9pZCAwKSBmID0gMC41O1xuICAgIHZhciByZXN0ID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gICAgd2hpbGUgKGxlbi0tID4gMCkge1xuICAgICAgcmVzdFtsZW5dID0gYXJndW1lbnRzW2xlbiArIDJdO1xuICAgIH1cblxuICAgIHJldHVybiBtaXguYXBwbHkodm9pZCAwLCBbdGhpcywgY29sMiwgZl0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5wcmVtdWx0aXBseSA9IGZ1bmN0aW9uIChtdXRhdGUpIHtcbiAgICBpZiAobXV0YXRlID09PSB2b2lkIDApIG11dGF0ZSA9IGZhbHNlO1xuICAgIHZhciByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgdmFyIGEgPSByZ2JbM107XG5cbiAgICBpZiAobXV0YXRlKSB7XG4gICAgICB0aGlzLl9yZ2IgPSBbcmdiWzBdICogYSwgcmdiWzFdICogYSwgcmdiWzJdICogYSwgYV07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKFtyZ2JbMF0gKiBhLCByZ2JbMV0gKiBhLCByZ2JbMl0gKiBhLCBhXSwgJ3JnYicpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5zYXR1cmF0ZSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIGFtb3VudCA9IDE7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgbGNoID0gbWUubGNoKCk7XG4gICAgbGNoWzFdICs9IGxhYkNvbnN0YW50cy5LbiAqIGFtb3VudDtcblxuICAgIGlmIChsY2hbMV0gPCAwKSB7XG4gICAgICBsY2hbMV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29sb3JfMShsY2gsICdsY2gnKS5hbHBoYShtZS5hbHBoYSgpLCB0cnVlKTtcbiAgfTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5kZXNhdHVyYXRlID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgYW1vdW50ID0gMTtcbiAgICByZXR1cm4gdGhpcy5zYXR1cmF0ZSgtYW1vdW50KTtcbiAgfTtcblxuICB2YXIgdHlwZSRpID0gdXRpbHMudHlwZTtcblxuICBDb2xvcl8xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobWMsIHZhbHVlLCBtdXRhdGUpIHtcbiAgICBpZiAobXV0YXRlID09PSB2b2lkIDApIG11dGF0ZSA9IGZhbHNlO1xuICAgIHZhciByZWYgPSBtYy5zcGxpdCgnLicpO1xuICAgIHZhciBtb2RlID0gcmVmWzBdO1xuICAgIHZhciBjaGFubmVsID0gcmVmWzFdO1xuICAgIHZhciBzcmMgPSB0aGlzW21vZGVdKCk7XG5cbiAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgdmFyIGkgPSBtb2RlLmluZGV4T2YoY2hhbm5lbCk7XG5cbiAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUkaSh2YWx1ZSkgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzd2l0Y2ggKHZhbHVlLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgIHNyY1tpXSArPSArdmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgc3JjW2ldICs9ICt2YWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICBzcmNbaV0gKj0gK3ZhbHVlLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICBzcmNbaV0gLz0gK3ZhbHVlLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHNyY1tpXSA9ICt2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSRpKHZhbHVlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzcmNbaV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgQ29sb3Iuc2V0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dCA9IG5ldyBDb2xvcl8xKHNyYywgbW9kZSk7XG5cbiAgICAgICAgaWYgKG11dGF0ZSkge1xuICAgICAgICAgIHRoaXMuX3JnYiA9IG91dC5fcmdiO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjaGFubmVsIFwiICsgY2hhbm5lbCArIFwiIGluIG1vZGUgXCIgKyBtb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNyYztcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJnYiQxID0gZnVuY3Rpb24gcmdiJDEoY29sMSwgY29sMiwgZikge1xuICAgIHZhciB4eXowID0gY29sMS5fcmdiO1xuICAgIHZhciB4eXoxID0gY29sMi5fcmdiO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMSh4eXowWzBdICsgZiAqICh4eXoxWzBdIC0geHl6MFswXSksIHh5ejBbMV0gKyBmICogKHh5ejFbMV0gLSB4eXowWzFdKSwgeHl6MFsyXSArIGYgKiAoeHl6MVsyXSAtIHh5ejBbMl0pLCAncmdiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLnJnYiA9IHJnYiQxO1xuICB2YXIgc3FydCQyID0gTWF0aC5zcXJ0O1xuICB2YXIgcG93JDMgPSBNYXRoLnBvdztcblxuICB2YXIgbHJnYiA9IGZ1bmN0aW9uIGxyZ2IoY29sMSwgY29sMiwgZikge1xuICAgIHZhciByZWYgPSBjb2wxLl9yZ2I7XG4gICAgdmFyIHgxID0gcmVmWzBdO1xuICAgIHZhciB5MSA9IHJlZlsxXTtcbiAgICB2YXIgejEgPSByZWZbMl07XG4gICAgdmFyIHJlZiQxID0gY29sMi5fcmdiO1xuICAgIHZhciB4MiA9IHJlZiQxWzBdO1xuICAgIHZhciB5MiA9IHJlZiQxWzFdO1xuICAgIHZhciB6MiA9IHJlZiQxWzJdO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMShzcXJ0JDIocG93JDMoeDEsIDIpICogKDEgLSBmKSArIHBvdyQzKHgyLCAyKSAqIGYpLCBzcXJ0JDIocG93JDMoeTEsIDIpICogKDEgLSBmKSArIHBvdyQzKHkyLCAyKSAqIGYpLCBzcXJ0JDIocG93JDMoejEsIDIpICogKDEgLSBmKSArIHBvdyQzKHoyLCAyKSAqIGYpLCAncmdiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLmxyZ2IgPSBscmdiO1xuXG4gIHZhciBsYWIkMSA9IGZ1bmN0aW9uIGxhYiQxKGNvbDEsIGNvbDIsIGYpIHtcbiAgICB2YXIgeHl6MCA9IGNvbDEubGFiKCk7XG4gICAgdmFyIHh5ejEgPSBjb2wyLmxhYigpO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMSh4eXowWzBdICsgZiAqICh4eXoxWzBdIC0geHl6MFswXSksIHh5ejBbMV0gKyBmICogKHh5ejFbMV0gLSB4eXowWzFdKSwgeHl6MFsyXSArIGYgKiAoeHl6MVsyXSAtIHh5ejBbMl0pLCAnbGFiJyk7XG4gIH07IC8vIHJlZ2lzdGVyIGludGVycG9sYXRvclxuXG5cbiAgaW50ZXJwb2xhdG9yLmxhYiA9IGxhYiQxO1xuXG4gIHZhciBfaHN4ID0gZnVuY3Rpb24gX2hzeChjb2wxLCBjb2wyLCBmLCBtKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDE7XG4gICAgdmFyIHh5ejAsIHh5ejE7XG5cbiAgICBpZiAobSA9PT0gJ2hzbCcpIHtcbiAgICAgIHh5ejAgPSBjb2wxLmhzbCgpO1xuICAgICAgeHl6MSA9IGNvbDIuaHNsKCk7XG4gICAgfSBlbHNlIGlmIChtID09PSAnaHN2Jykge1xuICAgICAgeHl6MCA9IGNvbDEuaHN2KCk7XG4gICAgICB4eXoxID0gY29sMi5oc3YoKTtcbiAgICB9IGVsc2UgaWYgKG0gPT09ICdoY2cnKSB7XG4gICAgICB4eXowID0gY29sMS5oY2coKTtcbiAgICAgIHh5ejEgPSBjb2wyLmhjZygpO1xuICAgIH0gZWxzZSBpZiAobSA9PT0gJ2hzaScpIHtcbiAgICAgIHh5ejAgPSBjb2wxLmhzaSgpO1xuICAgICAgeHl6MSA9IGNvbDIuaHNpKCk7XG4gICAgfSBlbHNlIGlmIChtID09PSAnbGNoJyB8fCBtID09PSAnaGNsJykge1xuICAgICAgbSA9ICdoY2wnO1xuICAgICAgeHl6MCA9IGNvbDEuaGNsKCk7XG4gICAgICB4eXoxID0gY29sMi5oY2woKTtcbiAgICB9XG5cbiAgICB2YXIgaHVlMCwgaHVlMSwgc2F0MCwgc2F0MSwgbGJ2MCwgbGJ2MTtcblxuICAgIGlmIChtLnN1YnN0cigwLCAxKSA9PT0gJ2gnKSB7XG4gICAgICBhc3NpZ24gPSB4eXowLCBodWUwID0gYXNzaWduWzBdLCBzYXQwID0gYXNzaWduWzFdLCBsYnYwID0gYXNzaWduWzJdO1xuICAgICAgYXNzaWduJDEgPSB4eXoxLCBodWUxID0gYXNzaWduJDFbMF0sIHNhdDEgPSBhc3NpZ24kMVsxXSwgbGJ2MSA9IGFzc2lnbiQxWzJdO1xuICAgIH1cblxuICAgIHZhciBzYXQsIGh1ZSwgbGJ2LCBkaDtcblxuICAgIGlmICghaXNOYU4oaHVlMCkgJiYgIWlzTmFOKGh1ZTEpKSB7XG4gICAgICAvLyBib3RoIGNvbG9ycyBoYXZlIGh1ZVxuICAgICAgaWYgKGh1ZTEgPiBodWUwICYmIGh1ZTEgLSBodWUwID4gMTgwKSB7XG4gICAgICAgIGRoID0gaHVlMSAtIChodWUwICsgMzYwKTtcbiAgICAgIH0gZWxzZSBpZiAoaHVlMSA8IGh1ZTAgJiYgaHVlMCAtIGh1ZTEgPiAxODApIHtcbiAgICAgICAgZGggPSBodWUxICsgMzYwIC0gaHVlMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRoID0gaHVlMSAtIGh1ZTA7XG4gICAgICB9XG5cbiAgICAgIGh1ZSA9IGh1ZTAgKyBmICogZGg7XG4gICAgfSBlbHNlIGlmICghaXNOYU4oaHVlMCkpIHtcbiAgICAgIGh1ZSA9IGh1ZTA7XG5cbiAgICAgIGlmICgobGJ2MSA9PSAxIHx8IGxidjEgPT0gMCkgJiYgbSAhPSAnaHN2Jykge1xuICAgICAgICBzYXQgPSBzYXQwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzTmFOKGh1ZTEpKSB7XG4gICAgICBodWUgPSBodWUxO1xuXG4gICAgICBpZiAoKGxidjAgPT0gMSB8fCBsYnYwID09IDApICYmIG0gIT0gJ2hzdicpIHtcbiAgICAgICAgc2F0ID0gc2F0MTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaHVlID0gTnVtYmVyLk5hTjtcbiAgICB9XG5cbiAgICBpZiAoc2F0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhdCA9IHNhdDAgKyBmICogKHNhdDEgLSBzYXQwKTtcbiAgICB9XG5cbiAgICBsYnYgPSBsYnYwICsgZiAqIChsYnYxIC0gbGJ2MCk7XG4gICAgcmV0dXJuIG5ldyBDb2xvcl8xKFtodWUsIHNhdCwgbGJ2XSwgbSk7XG4gIH07XG5cbiAgdmFyIGxjaCQxID0gZnVuY3Rpb24gbGNoJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdsY2gnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IubGNoID0gbGNoJDE7XG4gIGludGVycG9sYXRvci5oY2wgPSBsY2gkMTtcblxuICB2YXIgbnVtJDEgPSBmdW5jdGlvbiBudW0kMShjb2wxLCBjb2wyLCBmKSB7XG4gICAgdmFyIGMxID0gY29sMS5udW0oKTtcbiAgICB2YXIgYzIgPSBjb2wyLm51bSgpO1xuICAgIHJldHVybiBuZXcgQ29sb3JfMShjMSArIGYgKiAoYzIgLSBjMSksICdudW0nKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IubnVtID0gbnVtJDE7XG5cbiAgdmFyIGhjZyQxID0gZnVuY3Rpb24gaGNnJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoY2cnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaGNnID0gaGNnJDE7XG5cbiAgdmFyIGhzaSQxID0gZnVuY3Rpb24gaHNpJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc2knKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHNpID0gaHNpJDE7XG5cbiAgdmFyIGhzbCQxID0gZnVuY3Rpb24gaHNsJDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc2wnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHNsID0gaHNsJDE7XG5cbiAgdmFyIGhzdiQxID0gZnVuY3Rpb24gaHN2JDEoY29sMSwgY29sMiwgZikge1xuICAgIHJldHVybiBfaHN4KGNvbDEsIGNvbDIsIGYsICdoc3YnKTtcbiAgfTsgLy8gcmVnaXN0ZXIgaW50ZXJwb2xhdG9yXG5cblxuICBpbnRlcnBvbGF0b3IuaHN2ID0gaHN2JDE7XG4gIHZhciBjbGlwX3JnYiQyID0gdXRpbHMuY2xpcF9yZ2I7XG4gIHZhciBwb3ckNCA9IE1hdGgucG93O1xuICB2YXIgc3FydCQzID0gTWF0aC5zcXJ0O1xuICB2YXIgUEkkMSA9IE1hdGguUEk7XG4gIHZhciBjb3MkMiA9IE1hdGguY29zO1xuICB2YXIgc2luJDEgPSBNYXRoLnNpbjtcbiAgdmFyIGF0YW4yJDEgPSBNYXRoLmF0YW4yO1xuXG4gIHZhciBhdmVyYWdlID0gZnVuY3Rpb24gYXZlcmFnZShjb2xvcnMsIG1vZGUsIHdlaWdodHMpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSBtb2RlID0gJ2xyZ2InO1xuICAgIGlmICh3ZWlnaHRzID09PSB2b2lkIDApIHdlaWdodHMgPSBudWxsO1xuICAgIHZhciBsID0gY29sb3JzLmxlbmd0aDtcblxuICAgIGlmICghd2VpZ2h0cykge1xuICAgICAgd2VpZ2h0cyA9IEFycmF5LmZyb20obmV3IEFycmF5KGwpKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0pO1xuICAgIH0gLy8gbm9ybWFsaXplIHdlaWdodHNcblxuXG4gICAgdmFyIGsgPSBsIC8gd2VpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9KTtcbiAgICB3ZWlnaHRzLmZvckVhY2goZnVuY3Rpb24gKHcsIGkpIHtcbiAgICAgIHdlaWdodHNbaV0gKj0gaztcbiAgICB9KTsgLy8gY29udmVydCBjb2xvcnMgdG8gQ29sb3Igb2JqZWN0c1xuXG4gICAgY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIG5ldyBDb2xvcl8xKGMpO1xuICAgIH0pO1xuXG4gICAgaWYgKG1vZGUgPT09ICdscmdiJykge1xuICAgICAgcmV0dXJuIF9hdmVyYWdlX2xyZ2IoY29sb3JzLCB3ZWlnaHRzKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3QgPSBjb2xvcnMuc2hpZnQoKTtcbiAgICB2YXIgeHl6ID0gZmlyc3QuZ2V0KG1vZGUpO1xuICAgIHZhciBjbnQgPSBbXTtcbiAgICB2YXIgZHggPSAwO1xuICAgIHZhciBkeSA9IDA7IC8vIGluaXRpYWwgY29sb3JcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHl6Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB4eXpbaV0gPSAoeHl6W2ldIHx8IDApICogd2VpZ2h0c1swXTtcbiAgICAgIGNudC5wdXNoKGlzTmFOKHh5eltpXSkgPyAwIDogd2VpZ2h0c1swXSk7XG5cbiAgICAgIGlmIChtb2RlLmNoYXJBdChpKSA9PT0gJ2gnICYmICFpc05hTih4eXpbaV0pKSB7XG4gICAgICAgIHZhciBBID0geHl6W2ldIC8gMTgwICogUEkkMTtcbiAgICAgICAgZHggKz0gY29zJDIoQSkgKiB3ZWlnaHRzWzBdO1xuICAgICAgICBkeSArPSBzaW4kMShBKSAqIHdlaWdodHNbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFscGhhID0gZmlyc3QuYWxwaGEoKSAqIHdlaWdodHNbMF07XG4gICAgY29sb3JzLmZvckVhY2goZnVuY3Rpb24gKGMsIGNpKSB7XG4gICAgICB2YXIgeHl6MiA9IGMuZ2V0KG1vZGUpO1xuICAgICAgYWxwaGEgKz0gYy5hbHBoYSgpICogd2VpZ2h0c1tjaSArIDFdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHh5ei5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzTmFOKHh5ejJbaV0pKSB7XG4gICAgICAgICAgY250W2ldICs9IHdlaWdodHNbY2kgKyAxXTtcblxuICAgICAgICAgIGlmIChtb2RlLmNoYXJBdChpKSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICB2YXIgQSA9IHh5ejJbaV0gLyAxODAgKiBQSSQxO1xuICAgICAgICAgICAgZHggKz0gY29zJDIoQSkgKiB3ZWlnaHRzW2NpICsgMV07XG4gICAgICAgICAgICBkeSArPSBzaW4kMShBKSAqIHdlaWdodHNbY2kgKyAxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHl6W2ldICs9IHh5ejJbaV0gKiB3ZWlnaHRzW2NpICsgMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB4eXoubGVuZ3RoOyBpJDErKykge1xuICAgICAgaWYgKG1vZGUuY2hhckF0KGkkMSkgPT09ICdoJykge1xuICAgICAgICB2YXIgQSQxID0gYXRhbjIkMShkeSAvIGNudFtpJDFdLCBkeCAvIGNudFtpJDFdKSAvIFBJJDEgKiAxODA7XG5cbiAgICAgICAgd2hpbGUgKEEkMSA8IDApIHtcbiAgICAgICAgICBBJDEgKz0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKEEkMSA+PSAzNjApIHtcbiAgICAgICAgICBBJDEgLT0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgeHl6W2kkMV0gPSBBJDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4eXpbaSQxXSA9IHh5eltpJDFdIC8gY250W2kkMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWxwaGEgLz0gbDtcbiAgICByZXR1cm4gbmV3IENvbG9yXzEoeHl6LCBtb2RlKS5hbHBoYShhbHBoYSA+IDAuOTk5OTkgPyAxIDogYWxwaGEsIHRydWUpO1xuICB9O1xuXG4gIHZhciBfYXZlcmFnZV9scmdiID0gZnVuY3Rpb24gX2F2ZXJhZ2VfbHJnYihjb2xvcnMsIHdlaWdodHMpIHtcbiAgICB2YXIgbCA9IGNvbG9ycy5sZW5ndGg7XG4gICAgdmFyIHh5eiA9IFswLCAwLCAwLCAwXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29sID0gY29sb3JzW2ldO1xuICAgICAgdmFyIGYgPSB3ZWlnaHRzW2ldIC8gbDtcbiAgICAgIHZhciByZ2IgPSBjb2wuX3JnYjtcbiAgICAgIHh5elswXSArPSBwb3ckNChyZ2JbMF0sIDIpICogZjtcbiAgICAgIHh5elsxXSArPSBwb3ckNChyZ2JbMV0sIDIpICogZjtcbiAgICAgIHh5elsyXSArPSBwb3ckNChyZ2JbMl0sIDIpICogZjtcbiAgICAgIHh5elszXSArPSByZ2JbM10gKiBmO1xuICAgIH1cblxuICAgIHh5elswXSA9IHNxcnQkMyh4eXpbMF0pO1xuICAgIHh5elsxXSA9IHNxcnQkMyh4eXpbMV0pO1xuICAgIHh5elsyXSA9IHNxcnQkMyh4eXpbMl0pO1xuXG4gICAgaWYgKHh5elszXSA+IDAuOTk5OTk5OSkge1xuICAgICAgeHl6WzNdID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbG9yXzEoY2xpcF9yZ2IkMih4eXopKTtcbiAgfTsgLy8gbWluaW1hbCBtdWx0aS1wdXJwb3NlIGludGVyZmFjZVxuICAvLyBAcmVxdWlyZXMgdXRpbHMgY29sb3IgYW5hbHl6ZVxuXG5cbiAgdmFyIHR5cGUkaiA9IHV0aWxzLnR5cGU7XG4gIHZhciBwb3ckNSA9IE1hdGgucG93O1xuXG4gIHZhciBzY2FsZSA9IGZ1bmN0aW9uIHNjYWxlKGNvbG9ycykge1xuICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgdmFyIF9tb2RlID0gJ3JnYic7XG5cbiAgICB2YXIgX25hY29sID0gY2hyb21hXzEoJyNjY2MnKTtcblxuICAgIHZhciBfc3ByZWFkID0gMDsgLy8gY29uc3QgX2ZpeGVkID0gZmFsc2U7XG5cbiAgICB2YXIgX2RvbWFpbiA9IFswLCAxXTtcbiAgICB2YXIgX3BvcyA9IFtdO1xuICAgIHZhciBfcGFkZGluZyA9IFswLCAwXTtcbiAgICB2YXIgX2NsYXNzZXMgPSBmYWxzZTtcbiAgICB2YXIgX2NvbG9ycyA9IFtdO1xuICAgIHZhciBfb3V0ID0gZmFsc2U7XG4gICAgdmFyIF9taW4gPSAwO1xuICAgIHZhciBfbWF4ID0gMTtcbiAgICB2YXIgX2NvcnJlY3RMaWdodG5lc3MgPSBmYWxzZTtcbiAgICB2YXIgX2NvbG9yQ2FjaGUgPSB7fTtcbiAgICB2YXIgX3VzZUNhY2hlID0gdHJ1ZTtcbiAgICB2YXIgX2dhbW1hID0gMTsgLy8gcHJpdmF0ZSBtZXRob2RzXG5cbiAgICB2YXIgc2V0Q29sb3JzID0gZnVuY3Rpb24gc2V0Q29sb3JzKGNvbG9ycykge1xuICAgICAgY29sb3JzID0gY29sb3JzIHx8IFsnI2ZmZicsICcjMDAwJ107XG5cbiAgICAgIGlmIChjb2xvcnMgJiYgdHlwZSRqKGNvbG9ycykgPT09ICdzdHJpbmcnICYmIGNocm9tYV8xLmJyZXdlciAmJiBjaHJvbWFfMS5icmV3ZXJbY29sb3JzLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGNvbG9ycyA9IGNocm9tYV8xLmJyZXdlcltjb2xvcnMudG9Mb3dlckNhc2UoKV07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlJGooY29sb3JzKSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAvLyBoYW5kbGUgc2luZ2xlIGNvbG9yXG4gICAgICAgIGlmIChjb2xvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29sb3JzID0gW2NvbG9yc1swXSwgY29sb3JzWzBdXTtcbiAgICAgICAgfSAvLyBtYWtlIGEgY29weSBvZiB0aGUgY29sb3JzXG5cblxuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuc2xpY2UoMCk7IC8vIGNvbnZlcnQgdG8gY2hyb21hIGNsYXNzZXNcblxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbG9ycy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgIGNvbG9yc1tjXSA9IGNocm9tYV8xKGNvbG9yc1tjXSk7XG4gICAgICAgIH0gLy8gYXV0by1maWxsIGNvbG9yIHBvc2l0aW9uXG5cblxuICAgICAgICBfcG9zLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgYyQxID0gMDsgYyQxIDwgY29sb3JzLmxlbmd0aDsgYyQxKyspIHtcbiAgICAgICAgICBfcG9zLnB1c2goYyQxIC8gKGNvbG9ycy5sZW5ndGggLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzZXRDYWNoZSgpO1xuICAgICAgcmV0dXJuIF9jb2xvcnMgPSBjb2xvcnM7XG4gICAgfTtcblxuICAgIHZhciBnZXRDbGFzcyA9IGZ1bmN0aW9uIGdldENsYXNzKHZhbHVlKSB7XG4gICAgICBpZiAoX2NsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbiA9IF9jbGFzc2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IG4gJiYgdmFsdWUgPj0gX2NsYXNzZXNbaV0pIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaSAtIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICB2YXIgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciB0TWFwRG9tYWluID0gZnVuY3Rpb24gdE1hcERvbWFpbih0KSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9OyAvLyBjb25zdCBjbGFzc2lmeVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyAgICAgbGV0IHZhbCA9IHZhbHVlO1xuICAgIC8vICAgICBpZiAoX2NsYXNzZXMubGVuZ3RoID4gMikge1xuICAgIC8vICAgICAgICAgY29uc3QgbiA9IF9jbGFzc2VzLmxlbmd0aC0xO1xuICAgIC8vICAgICAgICAgY29uc3QgaSA9IGdldENsYXNzKHZhbHVlKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IG1pbmMgPSBfY2xhc3Nlc1swXSArICgoX2NsYXNzZXNbMV0tX2NsYXNzZXNbMF0pICogKDAgKyAoX3NwcmVhZCAqIDAuNSkpKTsgIC8vIGNlbnRlciBvZiAxc3QgY2xhc3NcbiAgICAvLyAgICAgICAgIGNvbnN0IG1heGMgPSBfY2xhc3Nlc1tuLTFdICsgKChfY2xhc3Nlc1tuXS1fY2xhc3Nlc1tuLTFdKSAqICgxIC0gKF9zcHJlYWQgKiAwLjUpKSk7ICAvLyBjZW50ZXIgb2YgbGFzdCBjbGFzc1xuICAgIC8vICAgICAgICAgdmFsID0gX21pbiArICgoKChfY2xhc3Nlc1tpXSArICgoX2NsYXNzZXNbaSsxXSAtIF9jbGFzc2VzW2ldKSAqIDAuNSkpIC0gbWluYykgLyAobWF4Yy1taW5jKSkgKiAoX21heCAtIF9taW4pKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdmFsO1xuICAgIC8vIH07XG5cblxuICAgIHZhciBnZXRDb2xvciA9IGZ1bmN0aW9uIGdldENvbG9yKHZhbCwgYnlwYXNzTWFwKSB7XG4gICAgICB2YXIgY29sLCB0O1xuXG4gICAgICBpZiAoYnlwYXNzTWFwID09IG51bGwpIHtcbiAgICAgICAgYnlwYXNzTWFwID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih2YWwpIHx8IHZhbCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX25hY29sO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWJ5cGFzc01hcCkge1xuICAgICAgICBpZiAoX2NsYXNzZXMgJiYgX2NsYXNzZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgIC8vIGZpbmQgdGhlIGNsYXNzXG4gICAgICAgICAgdmFyIGMgPSBnZXRDbGFzcyh2YWwpO1xuICAgICAgICAgIHQgPSBjIC8gKF9jbGFzc2VzLmxlbmd0aCAtIDIpO1xuICAgICAgICB9IGVsc2UgaWYgKF9tYXggIT09IF9taW4pIHtcbiAgICAgICAgICAvLyBqdXN0IGludGVycG9sYXRlIGJldHdlZW4gbWluL21heFxuICAgICAgICAgIHQgPSAodmFsIC0gX21pbikgLyAoX21heCAtIF9taW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHQgPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ID0gdmFsO1xuICAgICAgfSAvLyBkb21haW4gbWFwXG5cblxuICAgICAgdCA9IHRNYXBEb21haW4odCk7XG5cbiAgICAgIGlmICghYnlwYXNzTWFwKSB7XG4gICAgICAgIHQgPSB0TWFwTGlnaHRuZXNzKHQpOyAvLyBsaWdodG5lc3MgY29ycmVjdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoX2dhbW1hICE9PSAxKSB7XG4gICAgICAgIHQgPSBwb3ckNSh0LCBfZ2FtbWEpO1xuICAgICAgfVxuXG4gICAgICB0ID0gX3BhZGRpbmdbMF0gKyB0ICogKDEgLSBfcGFkZGluZ1swXSAtIF9wYWRkaW5nWzFdKTtcbiAgICAgIHQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCB0KSk7XG4gICAgICB2YXIgayA9IE1hdGguZmxvb3IodCAqIDEwMDAwKTtcblxuICAgICAgaWYgKF91c2VDYWNoZSAmJiBfY29sb3JDYWNoZVtrXSkge1xuICAgICAgICBjb2wgPSBfY29sb3JDYWNoZVtrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlJGooX2NvbG9ycykgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAvL2ZvciBpIGluIFswLi5fcG9zLmxlbmd0aC0xXVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Bvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSBfcG9zW2ldO1xuXG4gICAgICAgICAgICBpZiAodCA8PSBwKSB7XG4gICAgICAgICAgICAgIGNvbCA9IF9jb2xvcnNbaV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodCA+PSBwICYmIGkgPT09IF9wb3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBjb2wgPSBfY29sb3JzW2ldO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHQgPiBwICYmIHQgPCBfcG9zW2kgKyAxXSkge1xuICAgICAgICAgICAgICB0ID0gKHQgLSBwKSAvIChfcG9zW2kgKyAxXSAtIHApO1xuICAgICAgICAgICAgICBjb2wgPSBjaHJvbWFfMS5pbnRlcnBvbGF0ZShfY29sb3JzW2ldLCBfY29sb3JzW2kgKyAxXSwgdCwgX21vZGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSRqKF9jb2xvcnMpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29sID0gX2NvbG9ycyh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdXNlQ2FjaGUpIHtcbiAgICAgICAgICBfY29sb3JDYWNoZVtrXSA9IGNvbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sO1xuICAgIH07XG5cbiAgICB2YXIgcmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgICByZXR1cm4gX2NvbG9yQ2FjaGUgPSB7fTtcbiAgICB9O1xuXG4gICAgc2V0Q29sb3JzKGNvbG9ycyk7IC8vIHB1YmxpYyBpbnRlcmZhY2VcblxuICAgIHZhciBmID0gZnVuY3Rpb24gZih2KSB7XG4gICAgICB2YXIgYyA9IGNocm9tYV8xKGdldENvbG9yKHYpKTtcblxuICAgICAgaWYgKF9vdXQgJiYgY1tfb3V0XSkge1xuICAgICAgICByZXR1cm4gY1tfb3V0XSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGYuY2xhc3NlcyA9IGZ1bmN0aW9uIChjbGFzc2VzKSB7XG4gICAgICBpZiAoY2xhc3NlcyAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlJGooY2xhc3NlcykgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBfY2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgICAgICAgX2RvbWFpbiA9IFtjbGFzc2VzWzBdLCBjbGFzc2VzW2NsYXNzZXMubGVuZ3RoIC0gMV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBkID0gY2hyb21hXzEuYW5hbHl6ZShfZG9tYWluKTtcblxuICAgICAgICAgIGlmIChjbGFzc2VzID09PSAwKSB7XG4gICAgICAgICAgICBfY2xhc3NlcyA9IFtkLm1pbiwgZC5tYXhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfY2xhc3NlcyA9IGNocm9tYV8xLmxpbWl0cyhkLCAnZScsIGNsYXNzZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2NsYXNzZXM7XG4gICAgfTtcblxuICAgIGYuZG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfZG9tYWluO1xuICAgICAgfVxuXG4gICAgICBfbWluID0gZG9tYWluWzBdO1xuICAgICAgX21heCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07XG4gICAgICBfcG9zID0gW107XG4gICAgICB2YXIgayA9IF9jb2xvcnMubGVuZ3RoO1xuXG4gICAgICBpZiAoZG9tYWluLmxlbmd0aCA9PT0gayAmJiBfbWluICE9PSBfbWF4KSB7XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBBcnJheS5mcm9tKGRvbWFpbik7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIGQgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgX3Bvcy5wdXNoKChkIC0gX21pbikgLyAoX21heCAtIF9taW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICAgICAgICBfcG9zLnB1c2goYyAvIChrIC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvbWFpbi5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgLy8gc2V0IGRvbWFpbiBtYXBcbiAgICAgICAgICB2YXIgdE91dCA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpIC8gKGRvbWFpbi5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgdEJyZWFrcyA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiAoZCAtIF9taW4pIC8gKF9tYXggLSBfbWluKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghdEJyZWFrcy5ldmVyeShmdW5jdGlvbiAodmFsLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdE91dFtpXSA9PT0gdmFsO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICB0TWFwRG9tYWluID0gZnVuY3Rpb24gdE1hcERvbWFpbih0KSB7XG4gICAgICAgICAgICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaSA9IDA7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHQgPj0gdEJyZWFrc1tpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgZiA9ICh0IC0gdEJyZWFrc1tpXSkgLyAodEJyZWFrc1tpICsgMV0gLSB0QnJlYWtzW2ldKTtcbiAgICAgICAgICAgICAgdmFyIG91dCA9IHRPdXRbaV0gKyBmICogKHRPdXRbaSArIDFdIC0gdE91dFtpXSk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZG9tYWluID0gW19taW4sIF9tYXhdO1xuICAgICAgcmV0dXJuIGY7XG4gICAgfTtcblxuICAgIGYubW9kZSA9IGZ1bmN0aW9uIChfbSkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfbW9kZTtcbiAgICAgIH1cblxuICAgICAgX21vZGUgPSBfbTtcbiAgICAgIHJlc2V0Q2FjaGUoKTtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLnJhbmdlID0gZnVuY3Rpb24gKGNvbG9ycywgX3Bvcykge1xuICAgICAgc2V0Q29sb3JzKGNvbG9ycywgX3Bvcyk7XG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5vdXQgPSBmdW5jdGlvbiAoX28pIHtcbiAgICAgIF9vdXQgPSBfbztcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLnNwcmVhZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gX3NwcmVhZDtcbiAgICAgIH1cblxuICAgICAgX3NwcmVhZCA9IHZhbDtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmNvcnJlY3RMaWdodG5lc3MgPSBmdW5jdGlvbiAodikge1xuICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICB2ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgX2NvcnJlY3RMaWdodG5lc3MgPSB2O1xuICAgICAgcmVzZXRDYWNoZSgpO1xuXG4gICAgICBpZiAoX2NvcnJlY3RMaWdodG5lc3MpIHtcbiAgICAgICAgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgICAgIHZhciBMMCA9IGdldENvbG9yKDAsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBMMSA9IGdldENvbG9yKDEsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBwb2wgPSBMMCA+IEwxO1xuICAgICAgICAgIHZhciBMX2FjdHVhbCA9IGdldENvbG9yKHQsIHRydWUpLmxhYigpWzBdO1xuICAgICAgICAgIHZhciBMX2lkZWFsID0gTDAgKyAoTDEgLSBMMCkgKiB0O1xuICAgICAgICAgIHZhciBMX2RpZmYgPSBMX2FjdHVhbCAtIExfaWRlYWw7XG4gICAgICAgICAgdmFyIHQwID0gMDtcbiAgICAgICAgICB2YXIgdDEgPSAxO1xuICAgICAgICAgIHZhciBtYXhfaXRlciA9IDIwO1xuXG4gICAgICAgICAgd2hpbGUgKE1hdGguYWJzKExfZGlmZikgPiAxZS0yICYmIG1heF9pdGVyLS0gPiAwKSB7XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAocG9sKSB7XG4gICAgICAgICAgICAgICAgTF9kaWZmICo9IC0xO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKExfZGlmZiA8IDApIHtcbiAgICAgICAgICAgICAgICB0MCA9IHQ7XG4gICAgICAgICAgICAgICAgdCArPSAodDEgLSB0KSAqIDAuNTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0MSA9IHQ7XG4gICAgICAgICAgICAgICAgdCArPSAodDAgLSB0KSAqIDAuNTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIExfYWN0dWFsID0gZ2V0Q29sb3IodCwgdHJ1ZSkubGFiKClbMF07XG4gICAgICAgICAgICAgIHJldHVybiBMX2RpZmYgPSBMX2FjdHVhbCAtIExfaWRlYWw7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdE1hcExpZ2h0bmVzcyA9IGZ1bmN0aW9uIHRNYXBMaWdodG5lc3ModCkge1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5wYWRkaW5nID0gZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGUkaihwKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBwID0gW3AsIHBdO1xuICAgICAgICB9XG5cbiAgICAgICAgX3BhZGRpbmcgPSBwO1xuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfcGFkZGluZztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5jb2xvcnMgPSBmdW5jdGlvbiAobnVtQ29sb3JzLCBvdXQpIHtcbiAgICAgIC8vIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybiB0aGUgb3JpZ2luYWwgY29sb3JzIHRoYXQgd2VyZSBwcm92aWRlZFxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIG91dCA9ICdoZXgnO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IF9jb2xvcnMuc2xpY2UoMCk7XG4gICAgICB9IGVsc2UgaWYgKG51bUNvbG9ycyA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSBbZigwLjUpXTtcbiAgICAgIH0gZWxzZSBpZiAobnVtQ29sb3JzID4gMSkge1xuICAgICAgICB2YXIgZG0gPSBfZG9tYWluWzBdO1xuICAgICAgICB2YXIgZGQgPSBfZG9tYWluWzFdIC0gZG07XG4gICAgICAgIHJlc3VsdCA9IF9fcmFuZ2VfXygwLCBudW1Db2xvcnMsIGZhbHNlKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gZihkbSArIGkgLyAobnVtQ29sb3JzIC0gMSkgKiBkZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmV0dXJucyBhbGwgY29sb3JzIGJhc2VkIG9uIHRoZSBkZWZpbmVkIGNsYXNzZXNcbiAgICAgICAgY29sb3JzID0gW107XG4gICAgICAgIHZhciBzYW1wbGVzID0gW107XG5cbiAgICAgICAgaWYgKF9jbGFzc2VzICYmIF9jbGFzc2VzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMSwgZW5kID0gX2NsYXNzZXMubGVuZ3RoLCBhc2MgPSAxIDw9IGVuZDsgYXNjID8gaSA8IGVuZCA6IGkgPiBlbmQ7IGFzYyA/IGkrKyA6IGktLSkge1xuICAgICAgICAgICAgc2FtcGxlcy5wdXNoKChfY2xhc3Nlc1tpIC0gMV0gKyBfY2xhc3Nlc1tpXSkgKiAwLjUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYW1wbGVzID0gX2RvbWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHNhbXBsZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuIGYodik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hyb21hXzFbb3V0XSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgcmV0dXJuIGNbb3V0XSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZi5jYWNoZSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYyAhPSBudWxsKSB7XG4gICAgICAgIF91c2VDYWNoZSA9IGM7XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF91c2VDYWNoZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5nYW1tYSA9IGZ1bmN0aW9uIChnKSB7XG4gICAgICBpZiAoZyAhPSBudWxsKSB7XG4gICAgICAgIF9nYW1tYSA9IGc7XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9nYW1tYTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZi5ub2RhdGEgPSBmdW5jdGlvbiAoZCkge1xuICAgICAgaWYgKGQgIT0gbnVsbCkge1xuICAgICAgICBfbmFjb2wgPSBjaHJvbWFfMShkKTtcbiAgICAgICAgcmV0dXJuIGY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX25hY29sO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gZjtcbiAgfTtcblxuICBmdW5jdGlvbiBfX3JhbmdlX18obGVmdCwgcmlnaHQsIGluY2x1c2l2ZSkge1xuICAgIHZhciByYW5nZSA9IFtdO1xuICAgIHZhciBhc2NlbmRpbmcgPSBsZWZ0IDwgcmlnaHQ7XG4gICAgdmFyIGVuZCA9ICFpbmNsdXNpdmUgPyByaWdodCA6IGFzY2VuZGluZyA/IHJpZ2h0ICsgMSA6IHJpZ2h0IC0gMTtcblxuICAgIGZvciAodmFyIGkgPSBsZWZ0OyBhc2NlbmRpbmcgPyBpIDwgZW5kIDogaSA+IGVuZDsgYXNjZW5kaW5nID8gaSsrIDogaS0tKSB7XG4gICAgICByYW5nZS5wdXNoKGkpO1xuICAgIH1cblxuICAgIHJldHVybiByYW5nZTtcbiAgfSAvL1xuICAvLyBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBhIHNldCBvZiBjb2xvcnMgdXppbmcgYSBiZXppZXIgc3BsaW5lXG4gIC8vXG4gIC8vIEByZXF1aXJlcyB1dGlscyBsYWJcblxuXG4gIHZhciBiZXppZXIgPSBmdW5jdGlvbiBiZXppZXIoY29sb3JzKSB7XG4gICAgdmFyIGFzc2lnbiwgYXNzaWduJDEsIGFzc2lnbiQyO1xuICAgIHZhciBJLCBsYWIwLCBsYWIxLCBsYWIyO1xuICAgIGNvbG9ycyA9IGNvbG9ycy5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBuZXcgQ29sb3JfMShjKTtcbiAgICB9KTtcblxuICAgIGlmIChjb2xvcnMubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgYXNzaWduID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5sYWIoKTtcbiAgICAgIH0pLCBsYWIwID0gYXNzaWduWzBdLCBsYWIxID0gYXNzaWduWzFdO1xuXG4gICAgICBJID0gZnVuY3Rpb24gSSh0KSB7XG4gICAgICAgIHZhciBsYWIgPSBbMCwgMSwgMl0ubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYjBbaV0gKyB0ICogKGxhYjFbaV0gLSBsYWIwW2ldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JfMShsYWIsICdsYWInKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBxdWFkcmF0aWMgYmV6aWVyIGludGVycG9sYXRpb25cbiAgICAgIGFzc2lnbiQxID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5sYWIoKTtcbiAgICAgIH0pLCBsYWIwID0gYXNzaWduJDFbMF0sIGxhYjEgPSBhc3NpZ24kMVsxXSwgbGFiMiA9IGFzc2lnbiQxWzJdO1xuXG4gICAgICBJID0gZnVuY3Rpb24gSSh0KSB7XG4gICAgICAgIHZhciBsYWIgPSBbMCwgMSwgMl0ubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpICogbGFiMFtpXSArIDIgKiAoMSAtIHQpICogdCAqIGxhYjFbaV0gKyB0ICogdCAqIGxhYjJbaV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgLy8gY3ViaWMgYmV6aWVyIGludGVycG9sYXRpb25cbiAgICAgIHZhciBsYWIzO1xuICAgICAgYXNzaWduJDIgPSBjb2xvcnMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmxhYigpO1xuICAgICAgfSksIGxhYjAgPSBhc3NpZ24kMlswXSwgbGFiMSA9IGFzc2lnbiQyWzFdLCBsYWIyID0gYXNzaWduJDJbMl0sIGxhYjMgPSBhc3NpZ24kMlszXTtcblxuICAgICAgSSA9IGZ1bmN0aW9uIEkodCkge1xuICAgICAgICB2YXIgbGFiID0gWzAsIDEsIDJdLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiAoMSAtIHQpICogKDEgLSB0KSAqICgxIC0gdCkgKiBsYWIwW2ldICsgMyAqICgxIC0gdCkgKiAoMSAtIHQpICogdCAqIGxhYjFbaV0gKyAzICogKDEgLSB0KSAqIHQgKiB0ICogbGFiMltpXSArIHQgKiB0ICogdCAqIGxhYjNbaV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yXzEobGFiLCAnbGFiJyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PT0gNSkge1xuICAgICAgdmFyIEkwID0gYmV6aWVyKGNvbG9ycy5zbGljZSgwLCAzKSk7XG4gICAgICB2YXIgSTEgPSBiZXppZXIoY29sb3JzLnNsaWNlKDIsIDUpKTtcblxuICAgICAgSSA9IGZ1bmN0aW9uIEkodCkge1xuICAgICAgICBpZiAodCA8IDAuNSkge1xuICAgICAgICAgIHJldHVybiBJMCh0ICogMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEkxKCh0IC0gMC41KSAqIDIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBJO1xuICB9O1xuXG4gIHZhciBiZXppZXJfMSA9IGZ1bmN0aW9uIGJlemllcl8xKGNvbG9ycykge1xuICAgIHZhciBmID0gYmV6aWVyKGNvbG9ycyk7XG5cbiAgICBmLnNjYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNjYWxlKGYpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZjtcbiAgfTtcbiAgLypcbiAgICogaW50ZXJwb2xhdGVzIGJldHdlZW4gYSBzZXQgb2YgY29sb3JzIHV6aW5nIGEgYmV6aWVyIHNwbGluZVxuICAgKiBibGVuZCBtb2RlIGZvcm11bGFzIHRha2VuIGZyb20gaHR0cDovL3d3dy52ZW50dXJlLXdhcmUuY29tL2tldmluL2NvZGluZy9sZXRzLWxlYXJuLW1hdGgtcGhvdG9zaG9wLWJsZW5kLW1vZGVzL1xuICAgKi9cblxuXG4gIHZhciBibGVuZCA9IGZ1bmN0aW9uIGJsZW5kKGJvdHRvbSwgdG9wLCBtb2RlKSB7XG4gICAgaWYgKCFibGVuZFttb2RlXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGJsZW5kIG1vZGUgJyArIG1vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBibGVuZFttb2RlXShib3R0b20sIHRvcCk7XG4gIH07XG5cbiAgdmFyIGJsZW5kX2YgPSBmdW5jdGlvbiBibGVuZF9mKGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGJvdHRvbSwgdG9wKSB7XG4gICAgICB2YXIgYzAgPSBjaHJvbWFfMSh0b3ApLnJnYigpO1xuICAgICAgdmFyIGMxID0gY2hyb21hXzEoYm90dG9tKS5yZ2IoKTtcbiAgICAgIHJldHVybiBjaHJvbWFfMS5yZ2IoZihjMCwgYzEpKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBlYWNoID0gZnVuY3Rpb24gZWFjaChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjMCwgYzEpIHtcbiAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgIG91dFswXSA9IGYoYzBbMF0sIGMxWzBdKTtcbiAgICAgIG91dFsxXSA9IGYoYzBbMV0sIGMxWzFdKTtcbiAgICAgIG91dFsyXSA9IGYoYzBbMl0sIGMxWzJdKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgbm9ybWFsID0gZnVuY3Rpb24gbm9ybWFsKGEpIHtcbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICB2YXIgbXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShhLCBiKSB7XG4gICAgcmV0dXJuIGEgKiBiIC8gMjU1O1xuICB9O1xuXG4gIHZhciBkYXJrZW4kMSA9IGZ1bmN0aW9uIGRhcmtlbiQxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA+IGIgPyBiIDogYTtcbiAgfTtcblxuICB2YXIgbGlnaHRlbiA9IGZ1bmN0aW9uIGxpZ2h0ZW4oYSwgYikge1xuICAgIHJldHVybiBhID4gYiA/IGEgOiBiO1xuICB9O1xuXG4gIHZhciBzY3JlZW4gPSBmdW5jdGlvbiBzY3JlZW4oYSwgYikge1xuICAgIHJldHVybiAyNTUgKiAoMSAtICgxIC0gYSAvIDI1NSkgKiAoMSAtIGIgLyAyNTUpKTtcbiAgfTtcblxuICB2YXIgb3ZlcmxheSA9IGZ1bmN0aW9uIG92ZXJsYXkoYSwgYikge1xuICAgIHJldHVybiBiIDwgMTI4ID8gMiAqIGEgKiBiIC8gMjU1IDogMjU1ICogKDEgLSAyICogKDEgLSBhIC8gMjU1KSAqICgxIC0gYiAvIDI1NSkpO1xuICB9O1xuXG4gIHZhciBidXJuID0gZnVuY3Rpb24gYnVybihhLCBiKSB7XG4gICAgcmV0dXJuIDI1NSAqICgxIC0gKDEgLSBiIC8gMjU1KSAvIChhIC8gMjU1KSk7XG4gIH07XG5cbiAgdmFyIGRvZGdlID0gZnVuY3Rpb24gZG9kZ2UoYSwgYikge1xuICAgIGlmIChhID09PSAyNTUpIHtcbiAgICAgIHJldHVybiAyNTU7XG4gICAgfVxuXG4gICAgYSA9IDI1NSAqIChiIC8gMjU1KSAvICgxIC0gYSAvIDI1NSk7XG4gICAgcmV0dXJuIGEgPiAyNTUgPyAyNTUgOiBhO1xuICB9OyAvLyAjIGFkZCA9IChhLGIpIC0+XG4gIC8vICMgICAgIGlmIChhICsgYiA+IDI1NSkgdGhlbiAyNTUgZWxzZSBhICsgYlxuXG5cbiAgYmxlbmQubm9ybWFsID0gYmxlbmRfZihlYWNoKG5vcm1hbCkpO1xuICBibGVuZC5tdWx0aXBseSA9IGJsZW5kX2YoZWFjaChtdWx0aXBseSkpO1xuICBibGVuZC5zY3JlZW4gPSBibGVuZF9mKGVhY2goc2NyZWVuKSk7XG4gIGJsZW5kLm92ZXJsYXkgPSBibGVuZF9mKGVhY2gob3ZlcmxheSkpO1xuICBibGVuZC5kYXJrZW4gPSBibGVuZF9mKGVhY2goZGFya2VuJDEpKTtcbiAgYmxlbmQubGlnaHRlbiA9IGJsZW5kX2YoZWFjaChsaWdodGVuKSk7XG4gIGJsZW5kLmRvZGdlID0gYmxlbmRfZihlYWNoKGRvZGdlKSk7XG4gIGJsZW5kLmJ1cm4gPSBibGVuZF9mKGVhY2goYnVybikpOyAvLyBibGVuZC5hZGQgPSBibGVuZF9mKGVhY2goYWRkKSk7XG5cbiAgdmFyIGJsZW5kXzEgPSBibGVuZDsgLy8gY3ViZWhlbGl4IGludGVycG9sYXRpb25cbiAgLy8gYmFzZWQgb24gRC5BLiBHcmVlbiBcIkEgY29sb3VyIHNjaGVtZSBmb3IgdGhlIGRpc3BsYXkgb2YgYXN0cm9ub21pY2FsIGludGVuc2l0eSBpbWFnZXNcIlxuICAvLyBodHRwOi8vYXN0cm9uLXNvYy5pbi9idWxsZXRpbi8xMUp1bmUvMjg5MzkyMDExLnBkZlxuXG4gIHZhciB0eXBlJGsgPSB1dGlscy50eXBlO1xuICB2YXIgY2xpcF9yZ2IkMyA9IHV0aWxzLmNsaXBfcmdiO1xuICB2YXIgVFdPUEkkMiA9IHV0aWxzLlRXT1BJO1xuICB2YXIgcG93JDYgPSBNYXRoLnBvdztcbiAgdmFyIHNpbiQyID0gTWF0aC5zaW47XG4gIHZhciBjb3MkMyA9IE1hdGguY29zO1xuXG4gIHZhciBjdWJlaGVsaXggPSBmdW5jdGlvbiBjdWJlaGVsaXgoc3RhcnQsIHJvdGF0aW9ucywgaHVlLCBnYW1tYSwgbGlnaHRuZXNzKSB7XG4gICAgaWYgKHN0YXJ0ID09PSB2b2lkIDApIHN0YXJ0ID0gMzAwO1xuICAgIGlmIChyb3RhdGlvbnMgPT09IHZvaWQgMCkgcm90YXRpb25zID0gLTEuNTtcbiAgICBpZiAoaHVlID09PSB2b2lkIDApIGh1ZSA9IDE7XG4gICAgaWYgKGdhbW1hID09PSB2b2lkIDApIGdhbW1hID0gMTtcbiAgICBpZiAobGlnaHRuZXNzID09PSB2b2lkIDApIGxpZ2h0bmVzcyA9IFswLCAxXTtcbiAgICB2YXIgZGggPSAwLFxuICAgICAgICBkbDtcblxuICAgIGlmICh0eXBlJGsobGlnaHRuZXNzKSA9PT0gJ2FycmF5Jykge1xuICAgICAgZGwgPSBsaWdodG5lc3NbMV0gLSBsaWdodG5lc3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRsID0gMDtcbiAgICAgIGxpZ2h0bmVzcyA9IFtsaWdodG5lc3MsIGxpZ2h0bmVzc107XG4gICAgfVxuXG4gICAgdmFyIGYgPSBmdW5jdGlvbiBmKGZyYWN0KSB7XG4gICAgICB2YXIgYSA9IFRXT1BJJDIgKiAoKHN0YXJ0ICsgMTIwKSAvIDM2MCArIHJvdGF0aW9ucyAqIGZyYWN0KTtcbiAgICAgIHZhciBsID0gcG93JDYobGlnaHRuZXNzWzBdICsgZGwgKiBmcmFjdCwgZ2FtbWEpO1xuICAgICAgdmFyIGggPSBkaCAhPT0gMCA/IGh1ZVswXSArIGZyYWN0ICogZGggOiBodWU7XG4gICAgICB2YXIgYW1wID0gaCAqIGwgKiAoMSAtIGwpIC8gMjtcbiAgICAgIHZhciBjb3NfYSA9IGNvcyQzKGEpO1xuICAgICAgdmFyIHNpbl9hID0gc2luJDIoYSk7XG4gICAgICB2YXIgciA9IGwgKyBhbXAgKiAoLTAuMTQ4NjEgKiBjb3NfYSArIDEuNzgyNzcgKiBzaW5fYSk7XG4gICAgICB2YXIgZyA9IGwgKyBhbXAgKiAoLTAuMjkyMjcgKiBjb3NfYSAtIDAuOTA2NDkgKiBzaW5fYSk7XG4gICAgICB2YXIgYiA9IGwgKyBhbXAgKiAoKzEuOTcyOTQgKiBjb3NfYSk7XG4gICAgICByZXR1cm4gY2hyb21hXzEoY2xpcF9yZ2IkMyhbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NSwgMV0pKTtcbiAgICB9O1xuXG4gICAgZi5zdGFydCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICBpZiAocyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGFydDtcbiAgICAgIH1cblxuICAgICAgc3RhcnQgPSBzO1xuICAgICAgcmV0dXJuIGY7XG4gICAgfTtcblxuICAgIGYucm90YXRpb25zID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgIGlmIChyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJvdGF0aW9ucztcbiAgICAgIH1cblxuICAgICAgcm90YXRpb25zID0gcjtcbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmdhbW1hID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgIGlmIChnID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdhbW1hO1xuICAgICAgfVxuXG4gICAgICBnYW1tYSA9IGc7XG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5odWUgPSBmdW5jdGlvbiAoaCkge1xuICAgICAgaWYgKGggPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaHVlO1xuICAgICAgfVxuXG4gICAgICBodWUgPSBoO1xuXG4gICAgICBpZiAodHlwZSRrKGh1ZSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgZGggPSBodWVbMV0gLSBodWVbMF07XG5cbiAgICAgICAgaWYgKGRoID09PSAwKSB7XG4gICAgICAgICAgaHVlID0gaHVlWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmO1xuICAgIH07XG5cbiAgICBmLmxpZ2h0bmVzcyA9IGZ1bmN0aW9uIChoKSB7XG4gICAgICBpZiAoaCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsaWdodG5lc3M7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlJGsoaCkgPT09ICdhcnJheScpIHtcbiAgICAgICAgbGlnaHRuZXNzID0gaDtcbiAgICAgICAgZGwgPSBoWzFdIC0gaFswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpZ2h0bmVzcyA9IFtoLCBoXTtcbiAgICAgICAgZGwgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZjtcbiAgICB9O1xuXG4gICAgZi5zY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjaHJvbWFfMS5zY2FsZShmKTtcbiAgICB9O1xuXG4gICAgZi5odWUoaHVlKTtcbiAgICByZXR1cm4gZjtcbiAgfTtcblxuICB2YXIgZGlnaXRzID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICB2YXIgZmxvb3IkMiA9IE1hdGguZmxvb3I7XG4gIHZhciByYW5kb20gPSBNYXRoLnJhbmRvbTtcblxuICB2YXIgcmFuZG9tXzEgPSBmdW5jdGlvbiByYW5kb21fMSgpIHtcbiAgICB2YXIgY29kZSA9ICcjJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICBjb2RlICs9IGRpZ2l0cy5jaGFyQXQoZmxvb3IkMihyYW5kb20oKSAqIDE2KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb2xvcl8xKGNvZGUsICdoZXgnKTtcbiAgfTtcblxuICB2YXIgbG9nJDEgPSBNYXRoLmxvZztcbiAgdmFyIHBvdyQ3ID0gTWF0aC5wb3c7XG4gIHZhciBmbG9vciQzID0gTWF0aC5mbG9vcjtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuXG4gIHZhciBhbmFseXplID0gZnVuY3Rpb24gYW5hbHl6ZShkYXRhLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIGtleSA9IG51bGw7XG4gICAgdmFyIHIgPSB7XG4gICAgICBtaW46IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUgKiAtMSxcbiAgICAgIHN1bTogMCxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBjb3VudDogMFxuICAgIH07XG5cbiAgICBpZiAodHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBPYmplY3QudmFsdWVzKGRhdGEpO1xuICAgIH1cblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgICBpZiAoa2V5ICYmIHR5cGUodmFsKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsID0gdmFsW2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgJiYgIWlzTmFOKHZhbCkpIHtcbiAgICAgICAgci52YWx1ZXMucHVzaCh2YWwpO1xuICAgICAgICByLnN1bSArPSB2YWw7XG5cbiAgICAgICAgaWYgKHZhbCA8IHIubWluKSB7XG4gICAgICAgICAgci5taW4gPSB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsID4gci5tYXgpIHtcbiAgICAgICAgICByLm1heCA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHIuY291bnQgKz0gMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByLmRvbWFpbiA9IFtyLm1pbiwgci5tYXhdO1xuXG4gICAgci5saW1pdHMgPSBmdW5jdGlvbiAobW9kZSwgbnVtKSB7XG4gICAgICByZXR1cm4gbGltaXRzKHIsIG1vZGUsIG51bSk7XG4gICAgfTtcblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIHZhciBsaW1pdHMgPSBmdW5jdGlvbiBsaW1pdHMoZGF0YSwgbW9kZSwgbnVtKSB7XG4gICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgbW9kZSA9ICdlcXVhbCc7XG4gICAgaWYgKG51bSA9PT0gdm9pZCAwKSBudW0gPSA3O1xuXG4gICAgaWYgKHR5cGUoZGF0YSkgPT0gJ2FycmF5Jykge1xuICAgICAgZGF0YSA9IGFuYWx5emUoZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIG1pbiA9IGRhdGEubWluO1xuICAgIHZhciBtYXggPSBkYXRhLm1heDtcbiAgICB2YXIgdmFsdWVzID0gZGF0YS52YWx1ZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuXG4gICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgcmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgdmFyIGxpbWl0cyA9IFtdO1xuXG4gICAgaWYgKG1vZGUuc3Vic3RyKDAsIDEpID09PSAnYycpIHtcbiAgICAgIC8vIGNvbnRpbnVvdXNcbiAgICAgIGxpbWl0cy5wdXNoKG1pbik7XG4gICAgICBsaW1pdHMucHVzaChtYXgpO1xuICAgIH1cblxuICAgIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ2UnKSB7XG4gICAgICAvLyBlcXVhbCBpbnRlcnZhbFxuICAgICAgbGltaXRzLnB1c2gobWluKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBudW07IGkrKykge1xuICAgICAgICBsaW1pdHMucHVzaChtaW4gKyBpIC8gbnVtICogKG1heCAtIG1pbikpO1xuICAgICAgfVxuXG4gICAgICBsaW1pdHMucHVzaChtYXgpO1xuICAgIH0gZWxzZSBpZiAobW9kZS5zdWJzdHIoMCwgMSkgPT09ICdsJykge1xuICAgICAgLy8gbG9nIHNjYWxlXG4gICAgICBpZiAobWluIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2dhcml0aG1pYyBzY2FsZXMgYXJlIG9ubHkgcG9zc2libGUgZm9yIHZhbHVlcyA+IDAnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1pbl9sb2cgPSBNYXRoLkxPRzEwRSAqIGxvZyQxKG1pbik7XG4gICAgICB2YXIgbWF4X2xvZyA9IE1hdGguTE9HMTBFICogbG9nJDEobWF4KTtcbiAgICAgIGxpbWl0cy5wdXNoKG1pbik7XG5cbiAgICAgIGZvciAodmFyIGkkMSA9IDE7IGkkMSA8IG51bTsgaSQxKyspIHtcbiAgICAgICAgbGltaXRzLnB1c2gocG93JDcoMTAsIG1pbl9sb2cgKyBpJDEgLyBudW0gKiAobWF4X2xvZyAtIG1pbl9sb2cpKSk7XG4gICAgICB9XG5cbiAgICAgIGxpbWl0cy5wdXNoKG1heCk7XG4gICAgfSBlbHNlIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ3EnKSB7XG4gICAgICAvLyBxdWFudGlsZSBzY2FsZVxuICAgICAgbGltaXRzLnB1c2gobWluKTtcblxuICAgICAgZm9yICh2YXIgaSQyID0gMTsgaSQyIDwgbnVtOyBpJDIrKykge1xuICAgICAgICB2YXIgcCA9ICh2YWx1ZXMubGVuZ3RoIC0gMSkgKiBpJDIgLyBudW07XG4gICAgICAgIHZhciBwYiA9IGZsb29yJDMocCk7XG5cbiAgICAgICAgaWYgKHBiID09PSBwKSB7XG4gICAgICAgICAgbGltaXRzLnB1c2godmFsdWVzW3BiXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcCA+IHBiXG4gICAgICAgICAgdmFyIHByID0gcCAtIHBiO1xuICAgICAgICAgIGxpbWl0cy5wdXNoKHZhbHVlc1twYl0gKiAoMSAtIHByKSArIHZhbHVlc1twYiArIDFdICogcHIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpbWl0cy5wdXNoKG1heCk7XG4gICAgfSBlbHNlIGlmIChtb2RlLnN1YnN0cigwLCAxKSA9PT0gJ2snKSB7XG4gICAgICAvLyBrLW1lYW5zIGNsdXN0ZXJpbmdcblxuICAgICAgLypcbiAgICAgIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uXG4gICAgICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZmlndWUvc291cmNlL2Jyb3dzZS90cnVuay9maWd1ZS5qcyMzMzZcbiAgICAgIHNpbXBsaWZpZWQgZm9yIDEtZCBpbnB1dCB2YWx1ZXNcbiAgICAgICovXG4gICAgICB2YXIgY2x1c3RlcjtcbiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgICAgIHZhciBhc3NpZ25tZW50cyA9IG5ldyBBcnJheShuKTtcbiAgICAgIHZhciBjbHVzdGVyU2l6ZXMgPSBuZXcgQXJyYXkobnVtKTtcbiAgICAgIHZhciByZXBlYXQgPSB0cnVlO1xuICAgICAgdmFyIG5iX2l0ZXJzID0gMDtcbiAgICAgIHZhciBjZW50cm9pZHMgPSBudWxsOyAvLyBnZXQgc2VlZCB2YWx1ZXNcblxuICAgICAgY2VudHJvaWRzID0gW107XG4gICAgICBjZW50cm9pZHMucHVzaChtaW4pO1xuXG4gICAgICBmb3IgKHZhciBpJDMgPSAxOyBpJDMgPCBudW07IGkkMysrKSB7XG4gICAgICAgIGNlbnRyb2lkcy5wdXNoKG1pbiArIGkkMyAvIG51bSAqIChtYXggLSBtaW4pKTtcbiAgICAgIH1cblxuICAgICAgY2VudHJvaWRzLnB1c2gobWF4KTtcblxuICAgICAgd2hpbGUgKHJlcGVhdCkge1xuICAgICAgICAvLyBhc3NpZ25tZW50IHN0ZXBcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW07IGorKykge1xuICAgICAgICAgIGNsdXN0ZXJTaXplc1tqXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBuOyBpJDQrKykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpJDRdO1xuICAgICAgICAgIHZhciBtaW5kaXN0ID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICB2YXIgYmVzdCA9IHZvaWQgMDtcblxuICAgICAgICAgIGZvciAodmFyIGokMSA9IDA7IGokMSA8IG51bTsgaiQxKyspIHtcbiAgICAgICAgICAgIHZhciBkaXN0ID0gYWJzKGNlbnRyb2lkc1tqJDFdIC0gdmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoZGlzdCA8IG1pbmRpc3QpIHtcbiAgICAgICAgICAgICAgbWluZGlzdCA9IGRpc3Q7XG4gICAgICAgICAgICAgIGJlc3QgPSBqJDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsdXN0ZXJTaXplc1tiZXN0XSsrO1xuICAgICAgICAgICAgYXNzaWdubWVudHNbaSQ0XSA9IGJlc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHVwZGF0ZSBjZW50cm9pZHMgc3RlcFxuXG5cbiAgICAgICAgdmFyIG5ld0NlbnRyb2lkcyA9IG5ldyBBcnJheShudW0pO1xuXG4gICAgICAgIGZvciAodmFyIGokMiA9IDA7IGokMiA8IG51bTsgaiQyKyspIHtcbiAgICAgICAgICBuZXdDZW50cm9pZHNbaiQyXSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpJDUgPSAwOyBpJDUgPCBuOyBpJDUrKykge1xuICAgICAgICAgIGNsdXN0ZXIgPSBhc3NpZ25tZW50c1tpJDVdO1xuXG4gICAgICAgICAgaWYgKG5ld0NlbnRyb2lkc1tjbHVzdGVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Q2VudHJvaWRzW2NsdXN0ZXJdID0gdmFsdWVzW2kkNV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0NlbnRyb2lkc1tjbHVzdGVyXSArPSB2YWx1ZXNbaSQ1XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqJDMgPSAwOyBqJDMgPCBudW07IGokMysrKSB7XG4gICAgICAgICAgbmV3Q2VudHJvaWRzW2okM10gKj0gMSAvIGNsdXN0ZXJTaXplc1tqJDNdO1xuICAgICAgICB9IC8vIGNoZWNrIGNvbnZlcmdlbmNlXG5cblxuICAgICAgICByZXBlYXQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBqJDQgPSAwOyBqJDQgPCBudW07IGokNCsrKSB7XG4gICAgICAgICAgaWYgKG5ld0NlbnRyb2lkc1tqJDRdICE9PSBjZW50cm9pZHNbaiQ0XSkge1xuICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNlbnRyb2lkcyA9IG5ld0NlbnRyb2lkcztcbiAgICAgICAgbmJfaXRlcnMrKztcblxuICAgICAgICBpZiAobmJfaXRlcnMgPiAyMDApIHtcbiAgICAgICAgICByZXBlYXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmaW5pc2hlZCBrLW1lYW5zIGNsdXN0ZXJpbmdcbiAgICAgIC8vIHRoZSBuZXh0IHBhcnQgaXMgYm9ycm93ZWQgZnJvbSBnYWJyaWVsZmxvci5pdFxuXG5cbiAgICAgIHZhciBrQ2x1c3RlcnMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaiQ1ID0gMDsgaiQ1IDwgbnVtOyBqJDUrKykge1xuICAgICAgICBrQ2x1c3RlcnNbaiQ1XSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpJDYgPSAwOyBpJDYgPCBuOyBpJDYrKykge1xuICAgICAgICBjbHVzdGVyID0gYXNzaWdubWVudHNbaSQ2XTtcbiAgICAgICAga0NsdXN0ZXJzW2NsdXN0ZXJdLnB1c2godmFsdWVzW2kkNl0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG1wS01lYW5zQnJlYWtzID0gW107XG5cbiAgICAgIGZvciAodmFyIGokNiA9IDA7IGokNiA8IG51bTsgaiQ2KyspIHtcbiAgICAgICAgdG1wS01lYW5zQnJlYWtzLnB1c2goa0NsdXN0ZXJzW2okNl1bMF0pO1xuICAgICAgICB0bXBLTWVhbnNCcmVha3MucHVzaChrQ2x1c3RlcnNbaiQ2XVtrQ2x1c3RlcnNbaiQ2XS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG5cbiAgICAgIHRtcEtNZWFuc0JyZWFrcyA9IHRtcEtNZWFuc0JyZWFrcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgICAgbGltaXRzLnB1c2godG1wS01lYW5zQnJlYWtzWzBdKTtcblxuICAgICAgZm9yICh2YXIgaSQ3ID0gMTsgaSQ3IDwgdG1wS01lYW5zQnJlYWtzLmxlbmd0aDsgaSQ3ICs9IDIpIHtcbiAgICAgICAgdmFyIHYgPSB0bXBLTWVhbnNCcmVha3NbaSQ3XTtcblxuICAgICAgICBpZiAoIWlzTmFOKHYpICYmIGxpbWl0cy5pbmRleE9mKHYpID09PSAtMSkge1xuICAgICAgICAgIGxpbWl0cy5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbWl0cztcbiAgfTtcblxuICB2YXIgYW5hbHl6ZV8xID0ge1xuICAgIGFuYWx5emU6IGFuYWx5emUsXG4gICAgbGltaXRzOiBsaW1pdHNcbiAgfTtcblxuICB2YXIgY29udHJhc3QgPSBmdW5jdGlvbiBjb250cmFzdChhLCBiKSB7XG4gICAgLy8gV0NBRyBjb250cmFzdCByYXRpb1xuICAgIC8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA4L1JFQy1XQ0FHMjAtMjAwODEyMTEvI2NvbnRyYXN0LXJhdGlvZGVmXG4gICAgYSA9IG5ldyBDb2xvcl8xKGEpO1xuICAgIGIgPSBuZXcgQ29sb3JfMShiKTtcbiAgICB2YXIgbDEgPSBhLmx1bWluYW5jZSgpO1xuICAgIHZhciBsMiA9IGIubHVtaW5hbmNlKCk7XG4gICAgcmV0dXJuIGwxID4gbDIgPyAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpIDogKGwyICsgMC4wNSkgLyAobDEgKyAwLjA1KTtcbiAgfTtcblxuICB2YXIgc3FydCQ0ID0gTWF0aC5zcXJ0O1xuICB2YXIgYXRhbjIkMiA9IE1hdGguYXRhbjI7XG4gIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuICB2YXIgY29zJDQgPSBNYXRoLmNvcztcbiAgdmFyIFBJJDIgPSBNYXRoLlBJO1xuXG4gIHZhciBkZWx0YUUgPSBmdW5jdGlvbiBkZWx0YUUoYSwgYiwgTCwgQykge1xuICAgIGlmIChMID09PSB2b2lkIDApIEwgPSAxO1xuICAgIGlmIChDID09PSB2b2lkIDApIEMgPSAxOyAvLyBEZWx0YSBFIChDTUMpXG4gICAgLy8gc2VlIGh0dHA6Ly93d3cuYnJ1Y2VsaW5kYmxvb20uY29tL2luZGV4Lmh0bWw/RXFuX0RlbHRhRV9DTUMuaHRtbFxuXG4gICAgYSA9IG5ldyBDb2xvcl8xKGEpO1xuICAgIGIgPSBuZXcgQ29sb3JfMShiKTtcbiAgICB2YXIgcmVmID0gQXJyYXkuZnJvbShhLmxhYigpKTtcbiAgICB2YXIgTDEgPSByZWZbMF07XG4gICAgdmFyIGExID0gcmVmWzFdO1xuICAgIHZhciBiMSA9IHJlZlsyXTtcbiAgICB2YXIgcmVmJDEgPSBBcnJheS5mcm9tKGIubGFiKCkpO1xuICAgIHZhciBMMiA9IHJlZiQxWzBdO1xuICAgIHZhciBhMiA9IHJlZiQxWzFdO1xuICAgIHZhciBiMiA9IHJlZiQxWzJdO1xuICAgIHZhciBjMSA9IHNxcnQkNChhMSAqIGExICsgYjEgKiBiMSk7XG4gICAgdmFyIGMyID0gc3FydCQ0KGEyICogYTIgKyBiMiAqIGIyKTtcbiAgICB2YXIgc2wgPSBMMSA8IDE2LjAgPyAwLjUxMSA6IDAuMDQwOTc1ICogTDEgLyAoMS4wICsgMC4wMTc2NSAqIEwxKTtcbiAgICB2YXIgc2MgPSAwLjA2MzggKiBjMSAvICgxLjAgKyAwLjAxMzEgKiBjMSkgKyAwLjYzODtcbiAgICB2YXIgaDEgPSBjMSA8IDAuMDAwMDAxID8gMC4wIDogYXRhbjIkMihiMSwgYTEpICogMTgwLjAgLyBQSSQyO1xuXG4gICAgd2hpbGUgKGgxIDwgMCkge1xuICAgICAgaDEgKz0gMzYwO1xuICAgIH1cblxuICAgIHdoaWxlIChoMSA+PSAzNjApIHtcbiAgICAgIGgxIC09IDM2MDtcbiAgICB9XG5cbiAgICB2YXIgdCA9IGgxID49IDE2NC4wICYmIGgxIDw9IDM0NS4wID8gMC41NiArIGFicyQxKDAuMiAqIGNvcyQ0KFBJJDIgKiAoaDEgKyAxNjguMCkgLyAxODAuMCkpIDogMC4zNiArIGFicyQxKDAuNCAqIGNvcyQ0KFBJJDIgKiAoaDEgKyAzNS4wKSAvIDE4MC4wKSk7XG4gICAgdmFyIGM0ID0gYzEgKiBjMSAqIGMxICogYzE7XG4gICAgdmFyIGYgPSBzcXJ0JDQoYzQgLyAoYzQgKyAxOTAwLjApKTtcbiAgICB2YXIgc2ggPSBzYyAqIChmICogdCArIDEuMCAtIGYpO1xuICAgIHZhciBkZWxMID0gTDEgLSBMMjtcbiAgICB2YXIgZGVsQyA9IGMxIC0gYzI7XG4gICAgdmFyIGRlbEEgPSBhMSAtIGEyO1xuICAgIHZhciBkZWxCID0gYjEgLSBiMjtcbiAgICB2YXIgZEgyID0gZGVsQSAqIGRlbEEgKyBkZWxCICogZGVsQiAtIGRlbEMgKiBkZWxDO1xuICAgIHZhciB2MSA9IGRlbEwgLyAoTCAqIHNsKTtcbiAgICB2YXIgdjIgPSBkZWxDIC8gKEMgKiBzYyk7XG4gICAgdmFyIHYzID0gc2g7XG4gICAgcmV0dXJuIHNxcnQkNCh2MSAqIHYxICsgdjIgKiB2MiArIGRIMiAvICh2MyAqIHYzKSk7XG4gIH07IC8vIHNpbXBsZSBFdWNsaWRlYW4gZGlzdGFuY2VcblxuXG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIsIG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSBtb2RlID0gJ2xhYic7IC8vIERlbHRhIEUgKENJRSAxOTc2KVxuICAgIC8vIHNlZSBodHRwOi8vd3d3LmJydWNlbGluZGJsb29tLmNvbS9pbmRleC5odG1sP0VxdWF0aW9ucy5odG1sXG5cbiAgICBhID0gbmV3IENvbG9yXzEoYSk7XG4gICAgYiA9IG5ldyBDb2xvcl8xKGIpO1xuICAgIHZhciBsMSA9IGEuZ2V0KG1vZGUpO1xuICAgIHZhciBsMiA9IGIuZ2V0KG1vZGUpO1xuICAgIHZhciBzdW1fc3EgPSAwO1xuXG4gICAgZm9yICh2YXIgaSBpbiBsMSkge1xuICAgICAgdmFyIGQgPSAobDFbaV0gfHwgMCkgLSAobDJbaV0gfHwgMCk7XG4gICAgICBzdW1fc3EgKz0gZCAqIGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguc3FydChzdW1fc3EpO1xuICB9O1xuXG4gIHZhciB2YWxpZCA9IGZ1bmN0aW9uIHZhbGlkKCkge1xuICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuLS0pIHtcbiAgICAgIGFyZ3NbbGVuXSA9IGFyZ3VtZW50c1tsZW5dO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KENvbG9yXzEsIFtudWxsXS5jb25jYXQoYXJncykpKSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTsgLy8gc29tZSBwcmUtZGVmaW5lZCBjb2xvciBzY2FsZXM6XG5cblxuICB2YXIgc2NhbGVzID0ge1xuICAgIGNvb2w6IGZ1bmN0aW9uIGNvb2woKSB7XG4gICAgICByZXR1cm4gc2NhbGUoW2Nocm9tYV8xLmhzbCgxODAsIDEsIC45KSwgY2hyb21hXzEuaHNsKDI1MCwgLjcsIC40KV0pO1xuICAgIH0sXG4gICAgaG90OiBmdW5jdGlvbiBob3QoKSB7XG4gICAgICByZXR1cm4gc2NhbGUoWycjMDAwJywgJyNmMDAnLCAnI2ZmMCcsICcjZmZmJ10sIFswLCAuMjUsIC43NSwgMV0pLm1vZGUoJ3JnYicpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAgICBDb2xvckJyZXdlciBjb2xvcnMgZm9yIGNocm9tYS5qc1xuICAgICAgIENvcHlyaWdodCAoYykgMjAwMiBDeW50aGlhIEJyZXdlciwgTWFyayBIYXJyb3dlciwgYW5kIFRoZVxuICAgICAgUGVubnN5bHZhbmlhIFN0YXRlIFVuaXZlcnNpdHkuXG4gICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZFxuICAgICAgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1JcbiAgICAgIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAqL1xuXG4gIHZhciBjb2xvcmJyZXdlciA9IHtcbiAgICAvLyBzZXF1ZW50aWFsXG4gICAgT3JSZDogWycjZmZmN2VjJywgJyNmZWU4YzgnLCAnI2ZkZDQ5ZScsICcjZmRiYjg0JywgJyNmYzhkNTknLCAnI2VmNjU0OCcsICcjZDczMDFmJywgJyNiMzAwMDAnLCAnIzdmMDAwMCddLFxuICAgIFB1QnU6IFsnI2ZmZjdmYicsICcjZWNlN2YyJywgJyNkMGQxZTYnLCAnI2E2YmRkYicsICcjNzRhOWNmJywgJyMzNjkwYzAnLCAnIzA1NzBiMCcsICcjMDQ1YThkJywgJyMwMjM4NTgnXSxcbiAgICBCdVB1OiBbJyNmN2ZjZmQnLCAnI2UwZWNmNCcsICcjYmZkM2U2JywgJyM5ZWJjZGEnLCAnIzhjOTZjNicsICcjOGM2YmIxJywgJyM4ODQxOWQnLCAnIzgxMGY3YycsICcjNGQwMDRiJ10sXG4gICAgT3JhbmdlczogWycjZmZmNWViJywgJyNmZWU2Y2UnLCAnI2ZkZDBhMicsICcjZmRhZTZiJywgJyNmZDhkM2MnLCAnI2YxNjkxMycsICcjZDk0ODAxJywgJyNhNjM2MDMnLCAnIzdmMjcwNCddLFxuICAgIEJ1R246IFsnI2Y3ZmNmZCcsICcjZTVmNWY5JywgJyNjY2VjZTYnLCAnIzk5ZDhjOScsICcjNjZjMmE0JywgJyM0MWFlNzYnLCAnIzIzOGI0NScsICcjMDA2ZDJjJywgJyMwMDQ0MWInXSxcbiAgICBZbE9yQnI6IFsnI2ZmZmZlNScsICcjZmZmN2JjJywgJyNmZWUzOTEnLCAnI2ZlYzQ0ZicsICcjZmU5OTI5JywgJyNlYzcwMTQnLCAnI2NjNGMwMicsICcjOTkzNDA0JywgJyM2NjI1MDYnXSxcbiAgICBZbEduOiBbJyNmZmZmZTUnLCAnI2Y3ZmNiOScsICcjZDlmMGEzJywgJyNhZGRkOGUnLCAnIzc4YzY3OScsICcjNDFhYjVkJywgJyMyMzg0NDMnLCAnIzAwNjgzNycsICcjMDA0NTI5J10sXG4gICAgUmVkczogWycjZmZmNWYwJywgJyNmZWUwZDInLCAnI2ZjYmJhMScsICcjZmM5MjcyJywgJyNmYjZhNGEnLCAnI2VmM2IyYycsICcjY2IxODFkJywgJyNhNTBmMTUnLCAnIzY3MDAwZCddLFxuICAgIFJkUHU6IFsnI2ZmZjdmMycsICcjZmRlMGRkJywgJyNmY2M1YzAnLCAnI2ZhOWZiNScsICcjZjc2OGExJywgJyNkZDM0OTcnLCAnI2FlMDE3ZScsICcjN2EwMTc3JywgJyM0OTAwNmEnXSxcbiAgICBHcmVlbnM6IFsnI2Y3ZmNmNScsICcjZTVmNWUwJywgJyNjN2U5YzAnLCAnI2ExZDk5YicsICcjNzRjNDc2JywgJyM0MWFiNWQnLCAnIzIzOGI0NScsICcjMDA2ZDJjJywgJyMwMDQ0MWInXSxcbiAgICBZbEduQnU6IFsnI2ZmZmZkOScsICcjZWRmOGIxJywgJyNjN2U5YjQnLCAnIzdmY2RiYicsICcjNDFiNmM0JywgJyMxZDkxYzAnLCAnIzIyNWVhOCcsICcjMjUzNDk0JywgJyMwODFkNTgnXSxcbiAgICBQdXJwbGVzOiBbJyNmY2ZiZmQnLCAnI2VmZWRmNScsICcjZGFkYWViJywgJyNiY2JkZGMnLCAnIzllOWFjOCcsICcjODA3ZGJhJywgJyM2YTUxYTMnLCAnIzU0Mjc4ZicsICcjM2YwMDdkJ10sXG4gICAgR25CdTogWycjZjdmY2YwJywgJyNlMGYzZGInLCAnI2NjZWJjNScsICcjYThkZGI1JywgJyM3YmNjYzQnLCAnIzRlYjNkMycsICcjMmI4Y2JlJywgJyMwODY4YWMnLCAnIzA4NDA4MSddLFxuICAgIEdyZXlzOiBbJyNmZmZmZmYnLCAnI2YwZjBmMCcsICcjZDlkOWQ5JywgJyNiZGJkYmQnLCAnIzk2OTY5NicsICcjNzM3MzczJywgJyM1MjUyNTInLCAnIzI1MjUyNScsICcjMDAwMDAwJ10sXG4gICAgWWxPclJkOiBbJyNmZmZmY2MnLCAnI2ZmZWRhMCcsICcjZmVkOTc2JywgJyNmZWIyNGMnLCAnI2ZkOGQzYycsICcjZmM0ZTJhJywgJyNlMzFhMWMnLCAnI2JkMDAyNicsICcjODAwMDI2J10sXG4gICAgUHVSZDogWycjZjdmNGY5JywgJyNlN2UxZWYnLCAnI2Q0YjlkYScsICcjYzk5NGM3JywgJyNkZjY1YjAnLCAnI2U3Mjk4YScsICcjY2UxMjU2JywgJyM5ODAwNDMnLCAnIzY3MDAxZiddLFxuICAgIEJsdWVzOiBbJyNmN2ZiZmYnLCAnI2RlZWJmNycsICcjYzZkYmVmJywgJyM5ZWNhZTEnLCAnIzZiYWVkNicsICcjNDI5MmM2JywgJyMyMTcxYjUnLCAnIzA4NTE5YycsICcjMDgzMDZiJ10sXG4gICAgUHVCdUduOiBbJyNmZmY3ZmInLCAnI2VjZTJmMCcsICcjZDBkMWU2JywgJyNhNmJkZGInLCAnIzY3YTljZicsICcjMzY5MGMwJywgJyMwMjgxOGEnLCAnIzAxNmM1OScsICcjMDE0NjM2J10sXG4gICAgVmlyaWRpczogWycjNDQwMTU0JywgJyM0ODI3NzcnLCAnIzNmNGE4YScsICcjMzE2NzhlJywgJyMyNjgzOGYnLCAnIzFmOWQ4YScsICcjNmNjZTVhJywgJyNiNmRlMmInLCAnI2ZlZTgyNSddLFxuICAgIC8vIGRpdmVyZ2luZ1xuICAgIFNwZWN0cmFsOiBbJyM5ZTAxNDInLCAnI2Q1M2U0ZicsICcjZjQ2ZDQzJywgJyNmZGFlNjEnLCAnI2ZlZTA4YicsICcjZmZmZmJmJywgJyNlNmY1OTgnLCAnI2FiZGRhNCcsICcjNjZjMmE1JywgJyMzMjg4YmQnLCAnIzVlNGZhMiddLFxuICAgIFJkWWxHbjogWycjYTUwMDI2JywgJyNkNzMwMjcnLCAnI2Y0NmQ0MycsICcjZmRhZTYxJywgJyNmZWUwOGInLCAnI2ZmZmZiZicsICcjZDllZjhiJywgJyNhNmQ5NmEnLCAnIzY2YmQ2MycsICcjMWE5ODUwJywgJyMwMDY4MzcnXSxcbiAgICBSZEJ1OiBbJyM2NzAwMWYnLCAnI2IyMTgyYicsICcjZDY2MDRkJywgJyNmNGE1ODInLCAnI2ZkZGJjNycsICcjZjdmN2Y3JywgJyNkMWU1ZjAnLCAnIzkyYzVkZScsICcjNDM5M2MzJywgJyMyMTY2YWMnLCAnIzA1MzA2MSddLFxuICAgIFBpWUc6IFsnIzhlMDE1MicsICcjYzUxYjdkJywgJyNkZTc3YWUnLCAnI2YxYjZkYScsICcjZmRlMGVmJywgJyNmN2Y3ZjcnLCAnI2U2ZjVkMCcsICcjYjhlMTg2JywgJyM3ZmJjNDEnLCAnIzRkOTIyMScsICcjMjc2NDE5J10sXG4gICAgUFJHbjogWycjNDAwMDRiJywgJyM3NjJhODMnLCAnIzk5NzBhYicsICcjYzJhNWNmJywgJyNlN2Q0ZTgnLCAnI2Y3ZjdmNycsICcjZDlmMGQzJywgJyNhNmRiYTAnLCAnIzVhYWU2MScsICcjMWI3ODM3JywgJyMwMDQ0MWInXSxcbiAgICBSZFlsQnU6IFsnI2E1MDAyNicsICcjZDczMDI3JywgJyNmNDZkNDMnLCAnI2ZkYWU2MScsICcjZmVlMDkwJywgJyNmZmZmYmYnLCAnI2UwZjNmOCcsICcjYWJkOWU5JywgJyM3NGFkZDEnLCAnIzQ1NzViNCcsICcjMzEzNjk1J10sXG4gICAgQnJCRzogWycjNTQzMDA1JywgJyM4YzUxMGEnLCAnI2JmODEyZCcsICcjZGZjMjdkJywgJyNmNmU4YzMnLCAnI2Y1ZjVmNScsICcjYzdlYWU1JywgJyM4MGNkYzEnLCAnIzM1OTc4ZicsICcjMDE2NjVlJywgJyMwMDNjMzAnXSxcbiAgICBSZEd5OiBbJyM2NzAwMWYnLCAnI2IyMTgyYicsICcjZDY2MDRkJywgJyNmNGE1ODInLCAnI2ZkZGJjNycsICcjZmZmZmZmJywgJyNlMGUwZTAnLCAnI2JhYmFiYScsICcjODc4Nzg3JywgJyM0ZDRkNGQnLCAnIzFhMWExYSddLFxuICAgIFB1T3I6IFsnIzdmM2IwOCcsICcjYjM1ODA2JywgJyNlMDgyMTQnLCAnI2ZkYjg2MycsICcjZmVlMGI2JywgJyNmN2Y3ZjcnLCAnI2Q4ZGFlYicsICcjYjJhYmQyJywgJyM4MDczYWMnLCAnIzU0Mjc4OCcsICcjMmQwMDRiJ10sXG4gICAgLy8gcXVhbGl0YXRpdmVcbiAgICBTZXQyOiBbJyM2NmMyYTUnLCAnI2ZjOGQ2MicsICcjOGRhMGNiJywgJyNlNzhhYzMnLCAnI2E2ZDg1NCcsICcjZmZkOTJmJywgJyNlNWM0OTQnLCAnI2IzYjNiMyddLFxuICAgIEFjY2VudDogWycjN2ZjOTdmJywgJyNiZWFlZDQnLCAnI2ZkYzA4NicsICcjZmZmZjk5JywgJyMzODZjYjAnLCAnI2YwMDI3ZicsICcjYmY1YjE3JywgJyM2NjY2NjYnXSxcbiAgICBTZXQxOiBbJyNlNDFhMWMnLCAnIzM3N2ViOCcsICcjNGRhZjRhJywgJyM5ODRlYTMnLCAnI2ZmN2YwMCcsICcjZmZmZjMzJywgJyNhNjU2MjgnLCAnI2Y3ODFiZicsICcjOTk5OTk5J10sXG4gICAgU2V0MzogWycjOGRkM2M3JywgJyNmZmZmYjMnLCAnI2JlYmFkYScsICcjZmI4MDcyJywgJyM4MGIxZDMnLCAnI2ZkYjQ2MicsICcjYjNkZTY5JywgJyNmY2NkZTUnLCAnI2Q5ZDlkOScsICcjYmM4MGJkJywgJyNjY2ViYzUnLCAnI2ZmZWQ2ZiddLFxuICAgIERhcmsyOiBbJyMxYjllNzcnLCAnI2Q5NWYwMicsICcjNzU3MGIzJywgJyNlNzI5OGEnLCAnIzY2YTYxZScsICcjZTZhYjAyJywgJyNhNjc2MWQnLCAnIzY2NjY2NiddLFxuICAgIFBhaXJlZDogWycjYTZjZWUzJywgJyMxZjc4YjQnLCAnI2IyZGY4YScsICcjMzNhMDJjJywgJyNmYjlhOTknLCAnI2UzMWExYycsICcjZmRiZjZmJywgJyNmZjdmMDAnLCAnI2NhYjJkNicsICcjNmEzZDlhJywgJyNmZmZmOTknLCAnI2IxNTkyOCddLFxuICAgIFBhc3RlbDI6IFsnI2IzZTJjZCcsICcjZmRjZGFjJywgJyNjYmQ1ZTgnLCAnI2Y0Y2FlNCcsICcjZTZmNWM5JywgJyNmZmYyYWUnLCAnI2YxZTJjYycsICcjY2NjY2NjJ10sXG4gICAgUGFzdGVsMTogWycjZmJiNGFlJywgJyNiM2NkZTMnLCAnI2NjZWJjNScsICcjZGVjYmU0JywgJyNmZWQ5YTYnLCAnI2ZmZmZjYycsICcjZTVkOGJkJywgJyNmZGRhZWMnLCAnI2YyZjJmMiddXG4gIH07IC8vIGFkZCBsb3dlcmNhc2UgYWxpYXNlcyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGVzXG5cbiAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCQxID0gT2JqZWN0LmtleXMoY29sb3JicmV3ZXIpOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgIHZhciBrZXkgPSBsaXN0JDFbaSQxXTtcbiAgICBjb2xvcmJyZXdlcltrZXkudG9Mb3dlckNhc2UoKV0gPSBjb2xvcmJyZXdlcltrZXldO1xuICB9XG5cbiAgdmFyIGNvbG9yYnJld2VyXzEgPSBjb2xvcmJyZXdlcjsgLy8gZmVlbCBmcmVlIHRvIGNvbW1lbnQgb3V0IGFueXRoaW5nIHRvIHJvbGx1cFxuICAvLyBhIHNtYWxsZXIgY2hyb21hLmpzIGJ1aWx0XG4gIC8vIGlvIC0tPiBjb252ZXJ0IGNvbG9yc1xuICAvLyBvcGVyYXRvcnMgLS0+IG1vZGlmeSBleGlzdGluZyBDb2xvcnNcbiAgLy8gaW50ZXJwb2xhdG9yc1xuICAvLyBnZW5lcmF0b3JzIC0tID4gY3JlYXRlIG5ldyBjb2xvcnNcblxuICBjaHJvbWFfMS5hdmVyYWdlID0gYXZlcmFnZTtcbiAgY2hyb21hXzEuYmV6aWVyID0gYmV6aWVyXzE7XG4gIGNocm9tYV8xLmJsZW5kID0gYmxlbmRfMTtcbiAgY2hyb21hXzEuY3ViZWhlbGl4ID0gY3ViZWhlbGl4O1xuICBjaHJvbWFfMS5taXggPSBjaHJvbWFfMS5pbnRlcnBvbGF0ZSA9IG1peDtcbiAgY2hyb21hXzEucmFuZG9tID0gcmFuZG9tXzE7XG4gIGNocm9tYV8xLnNjYWxlID0gc2NhbGU7IC8vIG90aGVyIHV0aWxpdHkgbWV0aG9kc1xuXG4gIGNocm9tYV8xLmFuYWx5emUgPSBhbmFseXplXzEuYW5hbHl6ZTtcbiAgY2hyb21hXzEuY29udHJhc3QgPSBjb250cmFzdDtcbiAgY2hyb21hXzEuZGVsdGFFID0gZGVsdGFFO1xuICBjaHJvbWFfMS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICBjaHJvbWFfMS5saW1pdHMgPSBhbmFseXplXzEubGltaXRzO1xuICBjaHJvbWFfMS52YWxpZCA9IHZhbGlkOyAvLyBzY2FsZVxuXG4gIGNocm9tYV8xLnNjYWxlcyA9IHNjYWxlczsgLy8gY29sb3JzXG5cbiAgY2hyb21hXzEuY29sb3JzID0gdzNjeDExXzE7XG4gIGNocm9tYV8xLmJyZXdlciA9IGNvbG9yYnJld2VyXzE7XG4gIHZhciBjaHJvbWFfanMgPSBjaHJvbWFfMTtcbiAgcmV0dXJuIGNocm9tYV9qcztcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3873\n")},5087:function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function (window, document, exportName, undefined) {\n 'use strict';\n\n var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n var TEST_ELEMENT = document.createElement('div');\n var TYPE_FUNCTION = 'function';\n var round = Math.round;\n var abs = Math.abs;\n var now = Date.now;\n /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\n\n function setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n }\n /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\n\n\n function invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n\n return false;\n }\n /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\n\n\n function each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n }\n /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\n\n\n function deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function () {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '').replace(/^\\s+at\\s+/gm, '').replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n var log = window.console && (window.console.warn || window.console.log);\n\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n\n return method.apply(this, arguments);\n };\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\n\n\n var assign;\n\n if (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n\n return output;\n };\n } else {\n assign = Object.assign;\n }\n /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\n\n\n var extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n\n while (i < keys.length) {\n if (!merge || merge && dest[keys[i]] === undefined) {\n dest[keys[i]] = src[keys[i]];\n }\n\n i++;\n }\n\n return dest;\n }, 'extend', 'Use `assign`.');\n /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\n\n var merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n }, 'merge', 'Use `assign`.');\n /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\n\n function inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n }\n /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\n\n\n function bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n }\n /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\n\n\n function boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n\n return val;\n }\n /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\n\n\n function ifUndefined(val1, val2) {\n return val1 === undefined ? val2 : val1;\n }\n /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function addEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.addEventListener(type, handler, false);\n });\n }\n /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\n\n\n function removeEventListeners(target, types, handler) {\n each(splitStr(types), function (type) {\n target.removeEventListener(type, handler, false);\n });\n }\n /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\n\n\n function hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n\n node = node.parentNode;\n }\n\n return false;\n }\n /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\n\n\n function inStr(str, find) {\n return str.indexOf(find) > -1;\n }\n /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\n\n\n function splitStr(str) {\n return str.trim().split(/\\s+/g);\n }\n /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\n\n\n function inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n\n while (i < src.length) {\n if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {\n return i;\n }\n\n i++;\n }\n\n return -1;\n }\n }\n /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\n\n\n function toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n }\n /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\n\n\n function uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n }\n /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\n\n\n function prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n var i = 0;\n\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = prefix ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n\n i++;\n }\n\n return undefined;\n }\n /**\n * get a unique id\n * @returns {number} uniqueId\n */\n\n\n var _uniqueId = 1;\n\n function uniqueId() {\n return _uniqueId++;\n }\n /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\n\n\n function getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return doc.defaultView || doc.parentWindow || window;\n }\n\n var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n var SUPPORT_TOUCH = ('ontouchstart' in window);\n var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n var INPUT_TYPE_TOUCH = 'touch';\n var INPUT_TYPE_PEN = 'pen';\n var INPUT_TYPE_MOUSE = 'mouse';\n var INPUT_TYPE_KINECT = 'kinect';\n var COMPUTE_INTERVAL = 25;\n var INPUT_START = 1;\n var INPUT_MOVE = 2;\n var INPUT_END = 4;\n var INPUT_CANCEL = 8;\n var DIRECTION_NONE = 1;\n var DIRECTION_LEFT = 2;\n var DIRECTION_RIGHT = 4;\n var DIRECTION_UP = 8;\n var DIRECTION_DOWN = 16;\n var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n var PROPS_XY = ['x', 'y'];\n var PROPS_CLIENT_XY = ['clientX', 'clientY'];\n /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\n\n function Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n\n this.domHandler = function (ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n }\n\n Input.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function handler() {},\n\n /**\n * bind the events\n */\n init: function init() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function destroy() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n };\n /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\n\n function createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n\n return new Type(manager, inputHandler);\n }\n /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\n\n\n function inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n } // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n\n\n input.eventType = eventType; // compute scale, rotation etc\n\n computeInputData(manager, input); // emit secret event\n\n manager.emit('hammer.input', input);\n manager.recognize(input);\n manager.session.prevInput = input;\n }\n /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\n\n\n function computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length; // store the first input to calculate the distance and direction\n\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n } // to compute scale and rotation we need to store the multiple touches\n\n\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n computeIntervalInputData(session, input); // find the correct target\n\n var target = manager.element;\n\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n\n input.target = target;\n }\n\n function computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n }\n /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\n\n\n function computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity,\n velocityX,\n velocityY,\n direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n }\n /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\n\n\n function simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n }\n /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\n\n\n function getCenter(pointers) {\n var pointersLength = pointers.length; // no need to loop when only one touch\n\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0,\n y = 0,\n i = 0;\n\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n }\n /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\n\n\n function getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n }\n /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\n\n\n function getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n }\n /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\n\n\n function getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.sqrt(x * x + y * y);\n }\n /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\n\n\n function getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n }\n /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\n\n\n function getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n }\n /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\n\n\n function getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n }\n\n var MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n };\n var MOUSE_ELEMENT_EVENTS = 'mousedown';\n var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n /**\n * Mouse events input\n * @constructor\n * @extends Input\n */\n\n function MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n }\n\n inherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down\n\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n } // mouse must be down\n\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n });\n var POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n }; // in IE10 the pointer types is defined as an enum\n\n var IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\n };\n var POINTER_ELEMENT_EVENTS = 'pointerdown';\n var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive\n\n if (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n }\n /**\n * Pointer events input\n * @constructor\n * @extends Input\n */\n\n\n function PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n Input.apply(this, arguments);\n this.store = this.manager.session.pointerEvents = [];\n }\n\n inherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store\n\n var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down\n\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n } // it not found, so the pointer hasn't been down (so it's probably a hover)\n\n\n if (storeIndex < 0) {\n return;\n } // update the event in the store\n\n\n store[storeIndex] = ev;\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n });\n var SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Touch events input\n * @constructor\n * @extends Input\n */\n\n function SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n Input.apply(this, arguments);\n }\n\n inherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?\n\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state\n\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n }\n\n var TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n };\n var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\n\n function TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n Input.apply(this, arguments);\n }\n\n inherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n });\n /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\n\n function getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds; // when there is only one touch, the process can be simplified\n\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target; // get target touches from touches\n\n targetTouches = allTouches.filter(function (touch) {\n return hasParent(touch.target, target);\n }); // collect touches\n\n if (type === INPUT_START) {\n i = 0;\n\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n } // filter changed touches to only contain touches that exist in the collected target ids\n\n\n i = 0;\n\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n } // cleanup removed touches\n\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];\n }\n /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\n\n var DEDUP_TIMEOUT = 2500;\n var DEDUP_DISTANCE = 25;\n\n function TouchMouseInput() {\n Input.apply(this, arguments);\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n this.primaryTouch = null;\n this.lastTouches = [];\n }\n\n inherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,\n isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n } // when we're in a touch event, record touches to de-dupe synthetic mouse event\n\n\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n });\n\n function recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n }\n\n function setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {\n x: touch.clientX,\n y: touch.clientY\n };\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n\n var removeLastTouch = function removeLastTouch() {\n var i = lts.indexOf(lastTouch);\n\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n }\n\n function isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX,\n y = eventData.srcEvent.clientY;\n\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x),\n dy = Math.abs(y - t.y);\n\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n\n return false;\n }\n\n var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value\n\n var TOUCH_ACTION_COMPUTE = 'compute';\n var TOUCH_ACTION_AUTO = 'auto';\n var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\n var TOUCH_ACTION_NONE = 'none';\n var TOUCH_ACTION_PAN_X = 'pan-x';\n var TOUCH_ACTION_PAN_Y = 'pan-y';\n var TOUCH_ACTION_MAP = getTouchActionProps();\n /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\n\n function TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n }\n\n TouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function set(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function update() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function compute() {\n var actions = [];\n each(this.manager.recognizers, function (recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function preventDefaults(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection; // if the touch action did prevented once this session\n\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function preventSrc(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n };\n /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\n\n function cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n } // pan-x OR pan-y\n\n\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n } // manipulation\n\n\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n }\n\n function getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n }\n /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\n\n\n var STATE_POSSIBLE = 1;\n var STATE_BEGAN = 2;\n var STATE_CHANGED = 4;\n var STATE_ENDED = 8;\n var STATE_RECOGNIZED = STATE_ENDED;\n var STATE_CANCELLED = 16;\n var STATE_FAILED = 32;\n /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\n\n function Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n this.id = uniqueId();\n this.manager = null; // default is enable true\n\n this.options.enable = ifUndefined(this.options.enable, true);\n this.state = STATE_POSSIBLE;\n this.simultaneous = {};\n this.requireFail = [];\n }\n\n Recognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function set(options) {\n assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state\n\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function recognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function dropRecognizeWith(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function requireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function dropRequireFailure(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function hasRequireFailures() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function canRecognizeWith(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function emit(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n } // 'panstart' and 'panmove'\n\n\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) {\n // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n } // panend and pancancel\n\n\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function tryEmit(input) {\n if (this.canEmit()) {\n return this.emit(input);\n } // it's failing anyway\n\n\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function canEmit() {\n var i = 0;\n\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n\n i++;\n }\n\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?\n\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n } // reset when we've reached the end\n\n\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone); // the recognizer has recognized a gesture\n // so trigger an event\n\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function process(inputData) {},\n // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function getTouchAction() {},\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function reset() {}\n };\n /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\n\n function stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n\n return '';\n }\n /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\n\n\n function directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n\n return '';\n }\n /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\n\n\n function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n\n if (manager) {\n return manager.get(otherRecognizer);\n }\n\n return otherRecognizer;\n }\n /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\n\n\n function AttrRecognizer() {\n Recognizer.apply(this, arguments);\n }\n\n inherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function attrTest(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function process(input) {\n var state = this.state;\n var eventType = input.eventType;\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED\n\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n\n return state | STATE_CHANGED;\n }\n\n return STATE_FAILED;\n }\n });\n /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n this.pX = null;\n this.pY = null;\n }\n\n inherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n getTouchAction: function getTouchAction() {\n var direction = this.options.direction;\n var actions = [];\n\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n\n return actions;\n },\n directionTest: function directionTest(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY; // lock to axis?\n\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n attrTest: function attrTest(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n },\n emit: function emit(input) {\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\n\n function PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n emit: function emit(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n\n this._super.emit.call(this, input);\n }\n });\n /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\n\n function PressRecognizer() {\n Recognizer.apply(this, arguments);\n this._timer = null;\n this._input = null;\n }\n\n inherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251,\n // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_AUTO];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n this._input = input; // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && input.eventType & INPUT_END) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_NONE];\n },\n attrTest: function attrTest(input) {\n return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n });\n /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\n\n function SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n }\n\n inherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n getTouchAction: function getTouchAction() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n attrTest: function attrTest(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n emit: function emit(input) {\n var direction = directionStr(input.offsetDirection);\n\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n });\n /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\n\n function TapRecognizer() {\n Recognizer.apply(this, arguments); // previous time and center,\n // used for tap counting\n\n this.pTime = false;\n this.pCenter = false;\n this._timer = null;\n this._input = null;\n this.count = 0;\n }\n\n inherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300,\n // max time between the multi-tap taps\n time: 250,\n // max time of the pointer to be down (like finger on the screen)\n threshold: 9,\n // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n\n },\n getTouchAction: function getTouchAction() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n process: function process(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n this.reset();\n\n if (input.eventType & INPUT_START && this.count === 0) {\n return this.failTimeout();\n } // we only allow little movement\n // and we've reached an end event, so a tap is possible\n\n\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input; // if tap count matches we have recognized it,\n // else it has began recognizing...\n\n var tapCount = this.count % options.taps;\n\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n\n return STATE_FAILED;\n },\n failTimeout: function failTimeout() {\n this._timer = setTimeoutContext(function () {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n reset: function reset() {\n clearTimeout(this._timer);\n },\n emit: function emit() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n });\n /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n }\n /**\n * @const {string}\n */\n\n\n Hammer.VERSION = '2.0.7';\n /**\n * default settings\n * @namespace\n */\n\n Hammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {\n enable: false\n }], [PinchRecognizer, {\n enable: false\n }, ['rotate']], [SwipeRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }], [PanRecognizer, {\n direction: DIRECTION_HORIZONTAL\n }, ['swipe']], [TapRecognizer], [TapRecognizer, {\n event: 'doubletap',\n taps: 2\n }, ['tap']], [PressRecognizer]],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n };\n var STOP = 1;\n var FORCED_STOP = 2;\n /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\n\n function Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n this.options.inputTarget = this.options.inputTarget || element;\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n toggleCssProps(this, true);\n each(this.options.recognizers, function (item) {\n var recognizer = this.add(new item[0](item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n }\n\n Manager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function set(options) {\n assign(this.options, options); // Options that need a little more setup\n\n if (options.touchAction) {\n this.touchAction.update();\n }\n\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function stop(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function recognize(inputData) {\n var session = this.session;\n\n if (session.stopped) {\n return;\n } // run the touch-action polyfill\n\n\n this.touchAction.preventDefaults(inputData);\n var recognizer;\n var recognizers = this.recognizers; // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n\n var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized\n // or when we're in a new session\n\n if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n\n while (i < recognizers.length) {\n recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) {\n // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n\n\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function get(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function add(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n } // remove existing\n\n\n var existing = this.get(recognizer.options.event);\n\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function remove(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer); // let's make sure this recognizer exists\n\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function on(events, handler) {\n if (events === undefined) {\n return;\n }\n\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function off(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function (event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function emit(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n } // no handlers, so skip it all\n\n\n var handlers = this.handlers[event] && this.handlers[event].slice();\n\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n\n data.preventDefault = function () {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function destroy() {\n this.element && toggleCssProps(this, false);\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n };\n /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\n\n function toggleCssProps(manager, add) {\n var element = manager.element;\n\n if (!element.style) {\n return;\n }\n\n var prop;\n each(manager.options.cssProps, function (value, name) {\n prop = prefixed(element.style, name);\n\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n\n if (!add) {\n manager.oldCssProps = {};\n }\n }\n /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\n\n\n function triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n }\n\n assign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n }); // this prevents errors when Hammer is loaded in the presence of an AMD\n // style loader but by script tag, not by the loader.\n\n var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line\n\n freeGlobal.Hammer = Hammer;\n\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return Hammer;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n})(window, document, 'Hammer');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9oYW1tZXJqcy9oYW1tZXIuanM/ZWJmYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsU0FBUztBQUN0QixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMklBQTJJLFVBQVU7QUFDcko7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsZUFBZSxPQUFPO0FBQ3RCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlCQUF5QiwwQkFBMEI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEs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QUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQSxvR0FBb0c7O0FBRXBHOztBQUVBLE1BQU0sSUFBMEM7QUFDaEQsSUFBSSxtQ0FBTztBQUNYO0FBQ0EsS0FBSztBQUFBLGtHQUFDO0FBQ04sR0FBRyxNQUFNLEVBSU47QUFDSCxDQUFDIiwiZmlsZSI6IjUwODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIGV4cG9ydE5hbWUsIHVuZGVmaW5lZCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xuICB2YXIgVEVTVF9FTEVNRU5UID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBUWVBFX0ZVTkNUSU9OID0gJ2Z1bmN0aW9uJztcbiAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuICB2YXIgbm93ID0gRGF0ZS5ub3c7XG4gIC8qKlxuICAgKiBzZXQgYSB0aW1lb3V0IHdpdGggYSBnaXZlbiBzY29wZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBmdW5jdGlvbiBzZXRUaW1lb3V0Q29udGV4dChmbiwgdGltZW91dCwgY29udGV4dCkge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGJpbmRGbihmbiwgY29udGV4dCksIHRpbWVvdXQpO1xuICB9XG4gIC8qKlxuICAgKiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgZm4gb24gZWFjaCBlbnRyeVxuICAgKiBpZiBpdCBhaW50IGFuIGFycmF5IHdlIGRvbid0IHdhbnQgdG8gZG8gYSB0aGluZy5cbiAgICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gICAqIEBwYXJhbSB7KnxBcnJheX0gYXJnXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBlYWNoKGFyZywgY29udGV4dFtmbl0sIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBvYmoubGVuZ3RoKSB7XG4gICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgdGhlIHN1cHBsaWVkIG1ldGhvZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gICAgdmFyIGRlcHJlY2F0aW9uTWVzc2FnZSA9ICdERVBSRUNBVEVEIE1FVEhPRDogJyArIG5hbWUgKyAnXFxuJyArIG1lc3NhZ2UgKyAnIEFUIFxcbic7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgIHZhciBzdGFjayA9IGUgJiYgZS5zdGFjayA/IGUuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLCAnJykucmVwbGFjZSgvXlxccythdFxccysvZ20sICcnKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG4gICAgICB2YXIgbG9nID0gd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLndhcm4gfHwgd2luZG93LmNvbnNvbGUubG9nKTtcblxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBsb2cuY2FsbCh3aW5kb3cuY29uc29sZSwgZGVwcmVjYXRpb25NZXNzYWdlLCBzdGFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAgICogQHJldHVybnMge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuXG5cbiAgdmFyIGFzc2lnbjtcblxuICBpZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuICB9XG4gIC8qKlxuICAgKiBleHRlbmQgb2JqZWN0LlxuICAgKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgaW4gZGVzdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBvbmVzIGluIHNyYy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV1cbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuXG4gIHZhciBleHRlbmQgPSBkZXByZWNhdGUoZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHNyYyk7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKCFtZXJnZSB8fCBtZXJnZSAmJiBkZXN0W2tleXNbaV1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVzdFtrZXlzW2ldXSA9IHNyY1trZXlzW2ldXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9LCAnZXh0ZW5kJywgJ1VzZSBgYXNzaWduYC4nKTtcbiAgLyoqXG4gICAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gICAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyB0aGF0IGV4aXN0IGluIGRlc3Qgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgc3JjXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAgICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICAgKi9cblxuICB2YXIgbWVyZ2UgPSBkZXByZWNhdGUoZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjKSB7XG4gICAgcmV0dXJuIGV4dGVuZChkZXN0LCBzcmMsIHRydWUpO1xuICB9LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuICAvKipcbiAgICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNoaWxkXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJhc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICAgKi9cblxuICBmdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcbiAgICBjaGlsZFAgPSBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGJhc2VQKTtcbiAgICBjaGlsZFAuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgYXNzaWduKGNoaWxkUCwgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gYmluZEZuKGZuLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kRm4oKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICAgKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufEZ1bmN0aW9ufSB2YWxcbiAgICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGJvb2xPckZuKHZhbCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFRZUEVfRlVOQ1RJT04pIHtcbiAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIC8qKlxuICAgKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0geyp9IHZhbDFcbiAgICogQHBhcmFtIHsqfSB2YWwyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGlmVW5kZWZpbmVkKHZhbDEsIHZhbDIpIHtcbiAgICByZXR1cm4gdmFsMSA9PT0gdW5kZWZpbmVkID8gdmFsMiA6IHZhbDE7XG4gIH1cbiAgLyoqXG4gICAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICovXG5cblxuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBub2RlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnRcbiAgICogQG1ldGhvZCBoYXNQYXJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG5cblxuICBmdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIHNtYWxsIGluZGV4T2Ygd3JhcHBlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBmb3VuZFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xuICB9XG4gIC8qKlxuICAgKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gd29yZHNcbiAgICovXG5cblxuICBmdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbiAgfVxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5RmlsbFxuICAgKiBAcGFyYW0ge0FycmF5fSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtmaW5kQnlLZXldXG4gICAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCB8fCAhZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBjb252ZXJ0IGFycmF5LWxpa2Ugb2JqZWN0cyB0byByZWFsIGFycmF5c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG5cblxuICBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9XG4gIC8qKlxuICAgKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheX0gc3JjIFt7aWQ6MX0se2lkOjJ9LHtpZDoxfV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtrZXldXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gICAqIEByZXR1cm5zIHtBcnJheX0gW3tpZDoxfSx7aWQ6Mn1dXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWwgPSBrZXkgPyBzcmNbaV1ba2V5XSA6IHNyY1tpXTtcblxuICAgICAgaWYgKGluQXJyYXkodmFsdWVzLCB2YWwpIDwgMCkge1xuICAgICAgICByZXN1bHRzLnB1c2goc3JjW2ldKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVzW2ldID0gdmFsO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aGUgcHJlZml4ZWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHJldHVybnMge1N0cmluZ3xVbmRlZmluZWR9IHByZWZpeGVkXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgIHByZWZpeCA9IFZFTkRPUl9QUkVGSVhFU1tpXTtcbiAgICAgIHByb3AgPSBwcmVmaXggPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogZ2V0IGEgdW5pcXVlIGlkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gICAqL1xuXG5cbiAgdmFyIF91bmlxdWVJZCA9IDE7XG5cbiAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIHdpbmRvdyBvYmplY3Qgb2YgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtEb2N1bWVudFZpZXd8V2luZG93fVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFdpbmRvd0ZvckVsZW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93O1xuICB9XG5cbiAgdmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcbiAgdmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbiAgdmFyIFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMgPSBwcmVmaXhlZCh3aW5kb3csICdQb2ludGVyRXZlbnQnKSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgU1VQUE9SVF9PTkxZX1RPVUNIID0gU1VQUE9SVF9UT1VDSCAmJiBNT0JJTEVfUkVHRVgudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgdmFyIElOUFVUX1RZUEVfVE9VQ0ggPSAndG91Y2gnO1xuICB2YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbiAgdmFyIElOUFVUX1RZUEVfTU9VU0UgPSAnbW91c2UnO1xuICB2YXIgSU5QVVRfVFlQRV9LSU5FQ1QgPSAna2luZWN0JztcbiAgdmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcbiAgdmFyIElOUFVUX1NUQVJUID0gMTtcbiAgdmFyIElOUFVUX01PVkUgPSAyO1xuICB2YXIgSU5QVVRfRU5EID0gNDtcbiAgdmFyIElOUFVUX0NBTkNFTCA9IDg7XG4gIHZhciBESVJFQ1RJT05fTk9ORSA9IDE7XG4gIHZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG4gIHZhciBESVJFQ1RJT05fUklHSFQgPSA0O1xuICB2YXIgRElSRUNUSU9OX1VQID0gODtcbiAgdmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG4gIHZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xuICB2YXIgRElSRUNUSU9OX1ZFUlRJQ0FMID0gRElSRUNUSU9OX1VQIHwgRElSRUNUSU9OX0RPV047XG4gIHZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG4gIHZhciBQUk9QU19YWSA9IFsneCcsICd5J107XG4gIHZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDsgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuXG4gICAgdGhpcy5kb21IYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIElucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldlRhcmdldCAmJiBhZGRFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICB0aGlzLmV2VGFyZ2V0ICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMudGFyZ2V0LCB0aGlzLmV2VGFyZ2V0LCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgICAgdGhpcy5ldldpbiAmJiByZW1vdmVFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAgICogY2FsbGVkIGJ5IHRoZSBNYW5hZ2VyIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gICAqIEByZXR1cm5zIHtJbnB1dH1cbiAgICovXG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMpIHtcbiAgICAgIFR5cGUgPSBQb2ludGVyRXZlbnRJbnB1dDtcbiAgICB9IGVsc2UgaWYgKFNVUFBPUlRfT05MWV9UT1VDSCkge1xuICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFR5cGUgPSBUb3VjaE1vdXNlSW5wdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUeXBlKG1hbmFnZXIsIGlucHV0SGFuZGxlcik7XG4gIH1cbiAgLyoqXG4gICAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gaW5wdXRIYW5kbGVyKG1hbmFnZXIsIGV2ZW50VHlwZSwgaW5wdXQpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW4gPSBpbnB1dC5wb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGNoYW5nZWRQb2ludGVyc0xlbiA9IGlucHV0LmNoYW5nZWRQb2ludGVycy5sZW5ndGg7XG4gICAgdmFyIGlzRmlyc3QgPSBldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMDtcbiAgICB2YXIgaXNGaW5hbCA9IGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHBvaW50ZXJzTGVuIC0gY2hhbmdlZFBvaW50ZXJzTGVuID09PSAwO1xuICAgIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gICAgaW5wdXQuaXNGaW5hbCA9ICEhaXNGaW5hbDtcblxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICBtYW5hZ2VyLnNlc3Npb24gPSB7fTtcbiAgICB9IC8vIHNvdXJjZSBldmVudCBpcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgZG9tRXZlbnRzXG4gICAgLy8gbGlrZSAndG91Y2hzdGFydCwgbW91c2V1cCwgcG9pbnRlcmRvd24nXG5cblxuICAgIGlucHV0LmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG5cbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTsgLy8gZW1pdCBzZWNyZXQgZXZlbnRcblxuICAgIG1hbmFnZXIuZW1pdCgnaGFtbWVyLmlucHV0JywgaW5wdXQpO1xuICAgIG1hbmFnZXIucmVjb2duaXplKGlucHV0KTtcbiAgICBtYW5hZ2VyLnNlc3Npb24ucHJldklucHV0ID0gaW5wdXQ7XG4gIH1cbiAgLyoqXG4gICAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hbmFnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDsgLy8gc3RvcmUgdGhlIGZpcnN0IGlucHV0IHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYW5kIGRpcmVjdGlvblxuXG4gICAgaWYgKCFzZXNzaW9uLmZpcnN0SW5wdXQpIHtcbiAgICAgIHNlc3Npb24uZmlyc3RJbnB1dCA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgICB9IC8vIHRvIGNvbXB1dGUgc2NhbGUgYW5kIHJvdGF0aW9uIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG11bHRpcGxlIHRvdWNoZXNcblxuXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID4gMSAmJiAhc2Vzc2lvbi5maXJzdE11bHRpcGxlKSB7XG4gICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgc2Vzc2lvbi5maXJzdE11bHRpcGxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpcnN0SW5wdXQgPSBzZXNzaW9uLmZpcnN0SW5wdXQ7XG4gICAgdmFyIGZpcnN0TXVsdGlwbGUgPSBzZXNzaW9uLmZpcnN0TXVsdGlwbGU7XG4gICAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXIgPSBnZXRDZW50ZXIocG9pbnRlcnMpO1xuICAgIGlucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgIGlucHV0LmRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGZpcnN0SW5wdXQudGltZVN0YW1wO1xuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgICBpbnB1dC5vZmZzZXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICAgIHZhciBvdmVyYWxsVmVsb2NpdHkgPSBnZXRWZWxvY2l0eShpbnB1dC5kZWx0YVRpbWUsIGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYID0gb3ZlcmFsbFZlbG9jaXR5Lng7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WSA9IG92ZXJhbGxWZWxvY2l0eS55O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eSA9IGFicyhvdmVyYWxsVmVsb2NpdHkueCkgPiBhYnMob3ZlcmFsbFZlbG9jaXR5LnkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICAgIGlucHV0LnJvdGF0aW9uID0gZmlyc3RNdWx0aXBsZSA/IGdldFJvdGF0aW9uKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDA7XG4gICAgaW5wdXQubWF4UG9pbnRlcnMgPSAhc2Vzc2lvbi5wcmV2SW5wdXQgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBpbnB1dC5wb2ludGVycy5sZW5ndGggPiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6IHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzO1xuICAgIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCk7IC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG5cbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKGhhc1BhcmVudChpbnB1dC5zcmNFdmVudC50YXJnZXQsIHRhcmdldCkpIHtcbiAgICAgIHRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICBpbnB1dC50YXJnZXQgPSB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgcHJldkRlbHRhID0gc2Vzc2lvbi5wcmV2RGVsdGEgPSB7XG4gICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgeTogcHJldklucHV0LmRlbHRhWSB8fCAwXG4gICAgICB9O1xuICAgICAgb2Zmc2V0ID0gc2Vzc2lvbi5vZmZzZXREZWx0YSA9IHtcbiAgICAgICAgeDogY2VudGVyLngsXG4gICAgICAgIHk6IGNlbnRlci55XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlucHV0LmRlbHRhWCA9IHByZXZEZWx0YS54ICsgKGNlbnRlci54IC0gb2Zmc2V0LngpO1xuICAgIGlucHV0LmRlbHRhWSA9IHByZXZEZWx0YS55ICsgKGNlbnRlci55IC0gb2Zmc2V0LnkpO1xuICB9XG4gIC8qKlxuICAgKiB2ZWxvY2l0eSBpcyBjYWxjdWxhdGVkIGV2ZXJ5IHggbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY29tcHV0ZUludGVydmFsSW5wdXREYXRhKHNlc3Npb24sIGlucHV0KSB7XG4gICAgdmFyIGxhc3QgPSBzZXNzaW9uLmxhc3RJbnRlcnZhbCB8fCBpbnB1dCxcbiAgICAgICAgZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gbGFzdC50aW1lU3RhbXAsXG4gICAgICAgIHZlbG9jaXR5LFxuICAgICAgICB2ZWxvY2l0eVgsXG4gICAgICAgIHZlbG9jaXR5WSxcbiAgICAgICAgZGlyZWN0aW9uO1xuXG4gICAgaWYgKGlucHV0LmV2ZW50VHlwZSAhPSBJTlBVVF9DQU5DRUwgJiYgKGRlbHRhVGltZSA+IENPTVBVVEVfSU5URVJWQUwgfHwgbGFzdC52ZWxvY2l0eSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgdmFyIGRlbHRhWSA9IGlucHV0LmRlbHRhWSAtIGxhc3QuZGVsdGFZO1xuICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgIHZlbG9jaXR5WCA9IHYueDtcbiAgICAgIHZlbG9jaXR5WSA9IHYueTtcbiAgICAgIHZlbG9jaXR5ID0gYWJzKHYueCkgPiBhYnModi55KSA/IHYueCA6IHYueTtcbiAgICAgIGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbihkZWx0YVgsIGRlbHRhWSk7XG4gICAgICBzZXNzaW9uLmxhc3RJbnRlcnZhbCA9IGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2UgbGF0ZXN0IHZlbG9jaXR5IGluZm8gaWYgaXQgZG9lc24ndCBvdmVydGFrZSBhIG1pbmltdW0gcGVyaW9kXG4gICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICAgIHZlbG9jaXR5WSA9IGxhc3QudmVsb2NpdHlZO1xuICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgfVxuICAvKipcbiAgICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICogQHJldHVybnMge09iamVjdH0gY2xvbmVkSW5wdXREYXRhXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2ltcGxlQ2xvbmVJbnB1dERhdGEoaW5wdXQpIHtcbiAgICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2xpZW50WFkgZm9yIHRoZSBjYWxjdWxhdGlvbnNcbiAgICB2YXIgcG9pbnRlcnMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgcG9pbnRlcnNbaV0gPSB7XG4gICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICBjbGllbnRZOiByb3VuZChpbnB1dC5wb2ludGVyc1tpXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVN0YW1wOiBub3coKSxcbiAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgIGNlbnRlcjogZ2V0Q2VudGVyKHBvaW50ZXJzKSxcbiAgICAgIGRlbHRhWDogaW5wdXQuZGVsdGFYLFxuICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gICAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGB4YCBhbmQgYHlgIHByb3BlcnRpZXNcbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7IC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG5cbiAgICBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFgpLFxuICAgICAgICB5OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRZKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgcG9pbnRlcnNMZW5ndGgpIHtcbiAgICAgIHggKz0gcG9pbnRlcnNbaV0uY2xpZW50WDtcbiAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcm91bmQoeCAvIHBvaW50ZXJzTGVuZ3RoKSxcbiAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICB5OiB5IC8gZGVsdGFUaW1lIHx8IDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICogQHJldHVybiB7TnVtYmVyfSBkaXJlY3Rpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICByZXR1cm4gRElSRUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgaWYgKGFicyh4KSA+PSBhYnMoeSkpIHtcbiAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cblxuICAgIHJldHVybiB5IDwgMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICB9XG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDEge3gsIHl9XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwMiB7eCwgeX1cbiAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICAgIGlmICghcHJvcHMpIHtcbiAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuXG4gICAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV0sXG4gICAgICAgIHkgPSBwMltwcm9wc1sxXV0gLSBwMVtwcm9wc1sxXV07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcDFcbiAgICogQHBhcmFtIHtPYmplY3R9IHAyXG4gICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cblxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiBwb2ludGVyc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSwgUFJPUFNfQ0xJRU5UX1hZKSAvIGdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbiAgfVxuXG4gIHZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG4gIH07XG4gIHZhciBNT1VTRV9FTEVNRU5UX0VWRU5UUyA9ICdtb3VzZWRvd24nO1xuICB2YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG4gIC8qKlxuICAgKiBNb3VzZSBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIE1vdXNlSW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IE1PVVNFX1dJTkRPV19FVkVOVFM7XG4gICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7IC8vIG1vdXNlZG93biBzdGF0ZVxuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBvbiBzdGFydCB3ZSB3YW50IHRvIGhhdmUgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd25cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIGV2LmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICBldmVudFR5cGUgPSBJTlBVVF9FTkQ7XG4gICAgICB9IC8vIG1vdXNlIG11c3QgYmUgZG93blxuXG5cbiAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgICBwb2ludGVyczogW2V2XSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB2YXIgUE9JTlRFUl9JTlBVVF9NQVAgPSB7XG4gICAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICAgIHBvaW50ZXJtb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHBvaW50ZXJ1cDogSU5QVVRfRU5ELFxuICAgIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgICBwb2ludGVyb3V0OiBJTlBVVF9DQU5DRUxcbiAgfTsgLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cblxuICB2YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgICAyOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgIDM6IElOUFVUX1RZUEVfUEVOLFxuICAgIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgNTogSU5QVVRfVFlQRV9LSU5FQ1QgLy8gc2VlIGh0dHBzOi8vdHdpdHRlci5jb20vamFjb2Jyb3NzaS9zdGF0dXMvNDgwNTk2NDM4NDg5ODkwODE2XG5cbiAgfTtcbiAgdmFyIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAncG9pbnRlcmRvd24nO1xuICB2YXIgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ3BvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsJzsgLy8gSUUxMCBoYXMgcHJlZml4ZWQgc3VwcG9ydCwgYW5kIGNhc2Utc2Vuc2l0aXZlXG5cbiAgaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCAmJiAhd2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAnTVNQb2ludGVyRG93bic7XG4gICAgUE9JTlRFUl9XSU5ET1dfRVZFTlRTID0gJ01TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsJztcbiAgfVxuICAvKipcbiAgICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5zdG9yZSA9IHRoaXMubWFuYWdlci5zZXNzaW9uLnBvaW50ZXJFdmVudHMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoUG9pbnRlckV2ZW50SW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFBFaGFuZGxlcihldikge1xuICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG4gICAgICB2YXIgZXZlbnRUeXBlTm9ybWFsaXplZCA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdtcycsICcnKTtcbiAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgIHZhciBwb2ludGVyVHlwZSA9IElFMTBfUE9JTlRFUl9UWVBFX0VOVU1bZXYucG9pbnRlclR5cGVdIHx8IGV2LnBvaW50ZXJUeXBlO1xuICAgICAgdmFyIGlzVG91Y2ggPSBwb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIOyAvLyBnZXQgaW5kZXggb2YgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG4gICAgICB2YXIgc3RvcmVJbmRleCA9IGluQXJyYXkoc3RvcmUsIGV2LnBvaW50ZXJJZCwgJ3BvaW50ZXJJZCcpOyAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG5cbiAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICAgIHN0b3JlLnB1c2goZXYpO1xuICAgICAgICAgIHN0b3JlSW5kZXggPSBzdG9yZS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHJlbW92ZVBvaW50ZXIgPSB0cnVlO1xuICAgICAgfSAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcblxuXG4gICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG5cbiAgICAgIHN0b3JlW3N0b3JlSW5kZXhdID0gZXY7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgZXZlbnRUeXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZW1vdmVQb2ludGVyKSB7XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCc7XG4gIHZhciBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBUb3VjaCBldmVudHMgaW5wdXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIElucHV0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNpbmdsZVRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTO1xuICAgIHRoaXMuZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBzaG91bGQgd2UgaGFuZGxlIHRoZSB0b3VjaCBldmVudHM/XG5cbiAgICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTsgLy8gd2hlbiBkb25lLCByZXNldCB0aGUgc3RhcnRlZCBzdGF0ZVxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIHRvdWNoZXNbMF0ubGVuZ3RoIC0gdG91Y2hlc1sxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2luZ2xlVG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGwgPSB0b0FycmF5KGV2LnRvdWNoZXMpO1xuICAgIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBhbGwgPSB1bmlxdWVBcnJheShhbGwuY29uY2F0KGNoYW5nZWQpLCAnaWRlbnRpZmllcicsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBbYWxsLCBjaGFuZ2VkXTtcbiAgfVxuXG4gIHZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxuICB9O1xuICB2YXIgVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4gIC8qKlxuICAgKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICB0aGlzLnRhcmdldElkcyA9IHt9O1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFRvdWNoSW5wdXQsIElucHV0LCB7XG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTVRFaGFuZGxlcihldikge1xuICAgICAgdmFyIHR5cGUgPSBUT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG4gICAgICB2YXIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG5cbiAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBAdGhpcyB7VG91Y2hJbnB1dH1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAgICogQHJldHVybnMge3VuZGVmaW5lZHxBcnJheX0gW2FsbCwgY2hhbmdlZF1cbiAgICovXG5cbiAgZnVuY3Rpb24gZ2V0VG91Y2hlcyhldiwgdHlwZSkge1xuICAgIHZhciBhbGxUb3VjaGVzID0gdG9BcnJheShldi50b3VjaGVzKTtcbiAgICB2YXIgdGFyZ2V0SWRzID0gdGhpcy50YXJnZXRJZHM7IC8vIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgdG91Y2gsIHRoZSBwcm9jZXNzIGNhbiBiZSBzaW1wbGlmaWVkXG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0YXJnZXRJZHNbYWxsVG91Y2hlc1swXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICByZXR1cm4gW2FsbFRvdWNoZXMsIGFsbFRvdWNoZXNdO1xuICAgIH1cblxuICAgIHZhciBpLFxuICAgICAgICB0YXJnZXRUb3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlcyA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpLFxuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcyA9IFtdLFxuICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldDsgLy8gZ2V0IHRhcmdldCB0b3VjaGVzIGZyb20gdG91Y2hlc1xuXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uICh0b3VjaCkge1xuICAgICAgcmV0dXJuIGhhc1BhcmVudCh0b3VjaC50YXJnZXQsIHRhcmdldCk7XG4gICAgfSk7IC8vIGNvbGxlY3QgdG91Y2hlc1xuXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0YXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IC8vIGZpbHRlciBjaGFuZ2VkIHRvdWNoZXMgdG8gb25seSBjb250YWluIHRvdWNoZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGVkIHRhcmdldCBpZHNcblxuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGNoYW5nZWRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBjaGFuZ2VkVGFyZ2V0VG91Y2hlcy5wdXNoKGNoYW5nZWRUb3VjaGVzW2ldKTtcbiAgICAgIH0gLy8gY2xlYW51cCByZW1vdmVkIHRvdWNoZXNcblxuXG4gICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRJZHNbY2hhbmdlZFRvdWNoZXNbaV0uaWRlbnRpZmllcl07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBbLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgdW5pcXVlQXJyYXkodGFyZ2V0VG91Y2hlcy5jb25jYXQoY2hhbmdlZFRhcmdldFRvdWNoZXMpLCAnaWRlbnRpZmllcicsIHRydWUpLCBjaGFuZ2VkVGFyZ2V0VG91Y2hlc107XG4gIH1cbiAgLyoqXG4gICAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICAgKlxuICAgKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAgICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgSW5wdXRcbiAgICovXG5cblxuICB2YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG4gIHZhciBERURVUF9ESVNUQU5DRSA9IDI1O1xuXG4gIGZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dCgpIHtcbiAgICBJbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBoYW5kbGVyID0gYmluZEZuKHRoaXMuaGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy50b3VjaCA9IG5ldyBUb3VjaElucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5tb3VzZSA9IG5ldyBNb3VzZUlucHV0KHRoaXMubWFuYWdlciwgaGFuZGxlcik7XG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbiAgfVxuXG4gIGluaGVyaXQoVG91Y2hNb3VzZUlucHV0LCBJbnB1dCwge1xuICAgIC8qKlxuICAgICAqIGhhbmRsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRFdmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBUTUVoYW5kbGVyKG1hbmFnZXIsIGlucHV0RXZlbnQsIGlucHV0RGF0YSkge1xuICAgICAgdmFyIGlzVG91Y2ggPSBpbnB1dERhdGEucG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgICAgICBpc01vdXNlID0gaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0U7XG5cbiAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gd2hlbiB3ZSdyZSBpbiBhIHRvdWNoIGV2ZW50LCByZWNvcmQgdG91Y2hlcyB0byAgZGUtZHVwZSBzeW50aGV0aWMgbW91c2UgZXZlbnRcblxuXG4gICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICByZWNvcmRUb3VjaGVzLmNhbGwodGhpcywgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2sobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy50b3VjaC5kZXN0cm95KCk7XG4gICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHJlY29yZFRvdWNoZXMoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgIHRoaXMucHJpbWFyeVRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyO1xuICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldExhc3RUb3VjaChldmVudERhdGEpIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudERhdGEuY2hhbmdlZFBvaW50ZXJzWzBdO1xuXG4gICAgaWYgKHRvdWNoLmlkZW50aWZpZXIgPT09IHRoaXMucHJpbWFyeVRvdWNoKSB7XG4gICAgICB2YXIgbGFzdFRvdWNoID0ge1xuICAgICAgICB4OiB0b3VjaC5jbGllbnRYLFxuICAgICAgICB5OiB0b3VjaC5jbGllbnRZXG4gICAgICB9O1xuICAgICAgdGhpcy5sYXN0VG91Y2hlcy5wdXNoKGxhc3RUb3VjaCk7XG4gICAgICB2YXIgbHRzID0gdGhpcy5sYXN0VG91Y2hlcztcblxuICAgICAgdmFyIHJlbW92ZUxhc3RUb3VjaCA9IGZ1bmN0aW9uIHJlbW92ZUxhc3RUb3VjaCgpIHtcbiAgICAgICAgdmFyIGkgPSBsdHMuaW5kZXhPZihsYXN0VG91Y2gpO1xuXG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudChldmVudERhdGEpIHtcbiAgICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYLFxuICAgICAgICB5ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICAgIHZhciBkeCA9IE1hdGguYWJzKHggLSB0LngpLFxuICAgICAgICAgIGR5ID0gTWF0aC5hYnMoeSAtIHQueSk7XG5cbiAgICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgUFJFRklYRURfVE9VQ0hfQUNUSU9OID0gcHJlZml4ZWQoVEVTVF9FTEVNRU5ULnN0eWxlLCAndG91Y2hBY3Rpb24nKTtcbiAgdmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDsgLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxuXG4gIHZhciBUT1VDSF9BQ1RJT05fQ09NUFVURSA9ICdjb21wdXRlJztcbiAgdmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xuICB2YXIgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTiA9ICdtYW5pcHVsYXRpb24nOyAvLyBub3QgaW1wbGVtZW50ZWRcblxuICB2YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG4gIHZhciBUT1VDSF9BQ1RJT05fUEFOX1ggPSAncGFuLXgnO1xuICB2YXIgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcbiAgdmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG4gIC8qKlxuICAgKiBUb3VjaCBBY3Rpb25cbiAgICogc2V0cyB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgb3IgdXNlcyB0aGUganMgYWx0ZXJuYXRpdmVcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG5cbiAgZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIFRvdWNoQWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlIG9uIHRoZSBlbGVtZW50IG9yIGVuYWJsZSB0aGUgcG9seWZpbGxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgLy8gZmluZCBvdXQgdGhlIHRvdWNoLWFjdGlvbiBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGlmICh2YWx1ZSA9PSBUT1VDSF9BQ1RJT05fQ09NUFVURSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtQUkVGSVhFRF9UT1VDSF9BQ1RJT05dID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcmVjb2duaXplcidzIHNldHRpbmdzXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBjb21wdXRlOiBmdW5jdGlvbiBjb21wdXRlKCkge1xuICAgICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbiAocmVjb2duaXplcikge1xuICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBlYWNoIGlucHV0IGN5Y2xlIGFuZCBwcm92aWRlcyB0aGUgcHJldmVudGluZyBvZiB0aGUgYnJvd3NlciBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0czogZnVuY3Rpb24gcHJldmVudERlZmF1bHRzKGlucHV0KSB7XG4gICAgICB2YXIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247IC8vIGlmIHRoZSB0b3VjaCBhY3Rpb24gZGlkIHByZXZlbnRlZCBvbmNlIHRoaXMgc2Vzc2lvblxuXG4gICAgICBpZiAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKSB7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9ZXTtcbiAgICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1hdO1xuXG4gICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAvL2RvIG5vdCBwcmV2ZW50IGRlZmF1bHRzIGlmIHRoaXMgaXMgYSB0YXAgZ2VzdHVyZVxuICAgICAgICB2YXIgaXNUYXBQb2ludGVyID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSAxO1xuICAgICAgICB2YXIgaXNUYXBNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgMjtcbiAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgIGlmIChpc1RhcFBvaW50ZXIgJiYgaXNUYXBNb3ZlbWVudCAmJiBpc1RhcFRvdWNoVGltZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgIC8vIGBwYW4teCBwYW4teWAgbWVhbnMgYnJvd3NlciBoYW5kbGVzIGFsbCBzY3JvbGxpbmcvcGFubmluZywgZG8gbm90IHByZXZlbnRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzTm9uZSB8fCBoYXNQYW5ZICYmIGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMIHx8IGhhc1BhblggJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZlbnRTcmMoc3JjRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbiBwcmV2ZW50U3JjKHNyY0V2ZW50KSB7XG4gICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiB3aGVuIHRoZSB0b3VjaEFjdGlvbnMgYXJlIGNvbGxlY3RlZCB0aGV5IGFyZSBub3QgYSB2YWxpZCB2YWx1ZSwgc28gd2UgbmVlZCB0byBjbGVhbiB0aGluZ3MgdXAuICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgcmV0dXJuIFRPVUNIX0FDVElPTl9OT05FO1xuICAgIH1cblxuICAgIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICB2YXIgaGFzUGFuWSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWSk7IC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG5cbiAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfSAvLyBwYW4teCBPUiBwYW4teVxuXG5cbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgICB9IC8vIG1hbmlwdWxhdGlvblxuXG5cbiAgICBpZiAoaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTikpIHtcbiAgICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OO1xuICAgIH1cblxuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fQVVUTztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAvLyBhbGwgdmFsdWVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBJRSAxMCBhbmQgMTEuXG4gICAgICB0b3VjaE1hcFt2YWxdID0gY3NzU3VwcG9ydHMgPyB3aW5kb3cuQ1NTLnN1cHBvcnRzKCd0b3VjaC1hY3Rpb24nLCB2YWwpIDogdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hNYXA7XG4gIH1cbiAgLyoqXG4gICAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAgICogQWxsIHJlY29nbml6ZXJzIGhhdmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgUE9TU0lCTEUgd2hlbiBhIGlucHV0IHNlc3Npb24gc3RhcnRzLlxuICAgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAgICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gICAqXG4gICAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAgICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAgICpcbiAgICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICAgKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICAgKlxuICAgKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gICAqICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICAgKiAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICB8XG4gICAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAgICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gICAqL1xuXG5cbiAgdmFyIFNUQVRFX1BPU1NJQkxFID0gMTtcbiAgdmFyIFNUQVRFX0JFR0FOID0gMjtcbiAgdmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xuICB2YXIgU1RBVEVfRU5ERUQgPSA4O1xuICB2YXIgU1RBVEVfUkVDT0dOSVpFRCA9IFNUQVRFX0VOREVEO1xuICB2YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG4gIHZhciBTVEFURV9GQUlMRUQgPSAzMjtcbiAgLyoqXG4gICAqIFJlY29nbml6ZXJcbiAgICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cbiAgZnVuY3Rpb24gUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsOyAvLyBkZWZhdWx0IGlzIGVuYWJsZSB0cnVlXG5cbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlID0gaWZVbmRlZmluZWQodGhpcy5vcHRpb25zLmVuYWJsZSwgdHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xuICB9XG5cbiAgUmVjb2duaXplci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIHNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtSZWNvZ25pemVyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBhbHNvIHVwZGF0ZSB0aGUgdG91Y2hBY3Rpb24sIGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgYWJvdXQgdGhlIGRpcmVjdGlvbnMvZW5hYmxlZCBzdGF0ZVxuXG4gICAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICByZWNvZ25pemVXaXRoOiBmdW5jdGlvbiByZWNvZ25pemVXaXRoKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ3JlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVjb2duaXplV2l0aCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24gZHJvcFJlY29nbml6ZVdpdGgob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAnZHJvcFJlY29nbml6ZVdpdGgnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVjb2duaXplciBjYW4gb25seSBydW4gd2hlbiBhbiBvdGhlciBpcyBmYWlsaW5nXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIHJlcXVpcmVGYWlsdXJlOiBmdW5jdGlvbiByZXF1aXJlRmFpbHVyZShvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgb3RoZXJSZWNvZ25pemVyID0gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHRoaXMpO1xuXG4gICAgICBpZiAoaW5BcnJheShyZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKSA9PT0gLTEpIHtcbiAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIucmVxdWlyZUZhaWx1cmUodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24gZHJvcFJlcXVpcmVGYWlsdXJlKG90aGVyUmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHRoaXMucmVxdWlyZUZhaWwsIG90aGVyUmVjb2duaXplcik7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNSZXF1aXJlRmFpbHVyZXM6IGZ1bmN0aW9uIGhhc1JlcXVpcmVGYWlsdXJlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24gY2FuUmVjb2duaXplV2l0aChvdGhlclJlY29nbml6ZXIpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdChldmVudCwgaW5wdXQpO1xuICAgICAgfSAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcblxuXG4gICAgICBpZiAoc3RhdGUgPCBTVEFURV9FTkRFRCkge1xuICAgICAgICBlbWl0KHNlbGYub3B0aW9ucy5ldmVudCArIHN0YXRlU3RyKHN0YXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICBpZiAoaW5wdXQuYWRkaXRpb25hbEV2ZW50KSB7XG4gICAgICAgIC8vIGFkZGl0aW9uYWwgZXZlbnQocGFubGVmdCwgcGFucmlnaHQsIHBpbmNoaW4sIHBpbmNob3V0Li4uKVxuICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICB9IC8vIHBhbmVuZCBhbmQgcGFuY2FuY2VsXG5cblxuICAgICAgaWYgKHN0YXRlID49IFNUQVRFX0VOREVEKSB7XG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmUgZmFpbHVyZSByZWNvZ25pemVycyBoYXMgZmFpbGVkLFxuICAgICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICAgKiBvdGhlcndpc2UsIHNldHVwIHRoZSBzdGF0ZSB0byBGQUlMRUQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgdHJ5RW1pdDogZnVuY3Rpb24gdHJ5RW1pdChpbnB1dCkge1xuICAgICAgaWYgKHRoaXMuY2FuRW1pdCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgfSAvLyBpdCdzIGZhaWxpbmcgYW55d2F5XG5cblxuICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24gY2FuRW1pdCgpIHtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICBpZiAoISh0aGlzLnJlcXVpcmVGYWlsW2ldLnN0YXRlICYgKFNUQVRFX0ZBSUxFRCB8IFNUQVRFX1BPU1NJQkxFKSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbiByZWNvZ25pemUoaW5wdXREYXRhKSB7XG4gICAgICAvLyBtYWtlIGEgbmV3IGNvcHkgb2YgdGhlIGlucHV0RGF0YVxuICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbih7fSwgaW5wdXREYXRhKTsgLy8gaXMgaXMgZW5hYmxlZCBhbmQgYWxsb3cgcmVjb2duaXppbmc/XG5cbiAgICAgIGlmICghYm9vbE9yRm4odGhpcy5vcHRpb25zLmVuYWJsZSwgW3RoaXMsIGlucHV0RGF0YUNsb25lXSkpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIHJlc2V0IHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kXG5cblxuICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlID0gdGhpcy5wcm9jZXNzKGlucHV0RGF0YUNsb25lKTsgLy8gdGhlIHJlY29nbml6ZXIgaGFzIHJlY29nbml6ZWQgYSBnZXN0dXJlXG4gICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICB0aGlzLnRyeUVtaXQoaW5wdXREYXRhQ2xvbmUpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXREYXRhKSB7fSxcbiAgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHt9LFxuXG4gICAgLyoqXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIGdlc3R1cmUgaXNuJ3QgYWxsb3dlZCB0byByZWNvZ25pemVcbiAgICAgKiBsaWtlIHdoZW4gYW5vdGhlciBpcyBiZWluZyByZWNvZ25pemVkIG9yIGl0IGlzIGRpc2FibGVkXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7fVxuICB9O1xuICAvKipcbiAgICogZ2V0IGEgdXNhYmxlIHN0cmluZywgdXNlZCBhcyBldmVudCBwb3N0Zml4XG4gICAqIEBwYXJhbSB7Q29uc3R9IHN0YXRlXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICByZXR1cm4gJ2NhbmNlbCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgICByZXR1cm4gJ2VuZCc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0NIQU5HRUQpIHtcbiAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgLyoqXG4gICAqIGRpcmVjdGlvbiBjb25zIHRvIHN0cmluZ1xuICAgKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXJlY3Rpb25TdHIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTikge1xuICAgICAgcmV0dXJuICdkb3duJztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fVVApIHtcbiAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9SSUdIVCkge1xuICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IG5hbWUgaWYgaXQgaXMgYm91bmQgdG8gYSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IG90aGVyUmVjb2duaXplclxuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICogQHJldHVybnMge1JlY29nbml6ZXJ9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0UmVjb2duaXplckJ5TmFtZUlmTWFuYWdlcihvdGhlclJlY29nbml6ZXIsIHJlY29nbml6ZXIpIHtcbiAgICB2YXIgbWFuYWdlciA9IHJlY29nbml6ZXIubWFuYWdlcjtcblxuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICByZXR1cm4gbWFuYWdlci5nZXQob3RoZXJSZWNvZ25pemVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHJlY29nbml6ZXIgaXMganVzdCB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgcmVjb2duaXplcnMuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gQXR0clJlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChBdHRyUmVjb2duaXplciwgUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBwb2ludGVyczogMVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIGl0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVzIHZhbGlkIGlucHV0LCBsaWtlIGlucHV0LmRpc3RhbmNlID4gMTAuXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHJlY29nbml6ZWRcbiAgICAgKi9cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHZhciBvcHRpb25Qb2ludGVycyA9IHRoaXMub3B0aW9ucy5wb2ludGVycztcbiAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgdmFyIGV2ZW50VHlwZSA9IGlucHV0LmV2ZW50VHlwZTtcbiAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTsgLy8gb24gY2FuY2VsIGlucHV0IGFuZCB3ZSd2ZSByZWNvZ25pemVkIGJlZm9yZSwgcmV0dXJuIFNUQVRFX0NBTkNFTExFRFxuXG4gICAgICBpZiAoaXNSZWNvZ25pemVkICYmIChldmVudFR5cGUgJiBJTlBVVF9DQU5DRUwgfHwgIWlzVmFsaWQpKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0NBTkNFTExFRDtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWNvZ25pemVkIHx8IGlzVmFsaWQpIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICAgIHJldHVybiBzdGF0ZSB8IFNUQVRFX0VOREVEO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQYW5cbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gYW5kIG1vdmVkIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFBhblJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUGFuUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFBhblJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwYW4nLFxuICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fQUxMXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICAgIHZhciBhY3Rpb25zID0gW107XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICBhY3Rpb25zLnB1c2goVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGlvbnM7XG4gICAgfSxcbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbiBkaXJlY3Rpb25UZXN0KGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBpbnB1dC5kaXN0YW5jZTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHZhciB5ID0gaW5wdXQuZGVsdGFZOyAvLyBsb2NrIHRvIGF4aXM/XG5cbiAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHggPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHggPCAwID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgaGFzTW92ZWQgPSB4ICE9IHRoaXMucFg7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHkgPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gICAgICAgICAgaGFzTW92ZWQgPSB5ICE9IHRoaXMucFk7XG4gICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmICh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4gfHwgISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgICAgdGhpcy5wWCA9IGlucHV0LmRlbHRhWDtcbiAgICAgIHRoaXMucFkgPSBpbnB1dC5kZWx0YVk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0LmRpcmVjdGlvbik7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBQaW5jaFxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlcnMgYXJlIG1vdmluZyB0b3dhcmQgKHpvb20taW4pIG9yIGF3YXkgZnJvbSBlYWNoIG90aGVyICh6b29tLW91dCkuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICAgKi9cblxuICBmdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGluaGVyaXQoUGluY2hSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGluY2hSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIGV2ZW50OiAncGluY2gnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LFxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHtcbiAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiYgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGlucHV0KSB7XG4gICAgICBpZiAoaW5wdXQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgdmFyIGluT3V0ID0gaW5wdXQuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnO1xuICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogUHJlc3NcbiAgICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvd24gZm9yIHggbXMgd2l0aG91dCBhbnkgbW92ZW1lbnQuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFByZXNzUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgfVxuXG4gIGluaGVyaXQoUHJlc3NSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQcmVzc1JlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICdwcmVzcycsXG4gICAgICBwb2ludGVyczogMSxcbiAgICAgIHRpbWU6IDI1MSxcbiAgICAgIC8vIG1pbmltYWwgdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBwcmVzc2VkXG4gICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcblxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fQVVUT107XG4gICAgfSxcbiAgICBwcm9jZXNzOiBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgdmFyIHZhbGlkVGltZSA9IGlucHV0LmRlbHRhVGltZSA+IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7IC8vIHdlIG9ubHkgYWxsb3cgbGl0dGxlIG1vdmVtZW50XG4gICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG5cbiAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCBpbnB1dC5ldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiAhdmFsaWRUaW1lKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyAndXAnLCBpbnB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIFJvdGF0ZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdHdvIG9yIG1vcmUgcG9pbnRlciBhcmUgbW92aW5nIGluIGEgY2lyY3VsYXIgbW90aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gUm90YXRlUmVjb2duaXplcigpIHtcbiAgICBBdHRyUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3JvdGF0ZScsXG4gICAgICB0aHJlc2hvbGQ6IDAsXG4gICAgICBwb2ludGVyczogMlxuICAgIH0sXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgfSxcbiAgICBhdHRyVGVzdDogZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbiAgfSk7XG4gIC8qKlxuICAgKiBTd2lwZVxuICAgKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gU3dpcGVSZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBpbmhlcml0KFN3aXBlUmVjb2duaXplciwgQXR0clJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFN3aXBlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICB2ZWxvY2l0eTogMC4zLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIGF0dHJUZXN0OiBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9WRVJUSUNBTCkge1xuICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiYgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmIGlucHV0Lm1heFBvaW50ZXJzID09IHRoaXMub3B0aW9ucy5wb2ludGVycyAmJiBhYnModmVsb2NpdHkpID4gdGhpcy5vcHRpb25zLnZlbG9jaXR5ICYmIGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORDtcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQub2Zmc2V0RGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb24sIGlucHV0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxuICB9KTtcbiAgLyoqXG4gICAqIEEgdGFwIGlzIGVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAgICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gICAqIGEgc2luZ2xlIHRhcC5cbiAgICpcbiAgICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gICAqIG11bHRpLXRhcHMgYmVpbmcgcmVjb2duaXplZC5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHByZXZpb3VzIHRpbWUgYW5kIGNlbnRlcixcbiAgICAvLyB1c2VkIGZvciB0YXAgY291bnRpbmdcblxuICAgIHRoaXMucFRpbWUgPSBmYWxzZTtcbiAgICB0aGlzLnBDZW50ZXIgPSBmYWxzZTtcbiAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHRoaXMuY291bnQgPSAwO1xuICB9XG5cbiAgaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgZXZlbnQ6ICd0YXAnLFxuICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICB0YXBzOiAxLFxuICAgICAgaW50ZXJ2YWw6IDMwMCxcbiAgICAgIC8vIG1heCB0aW1lIGJldHdlZW4gdGhlIG11bHRpLXRhcCB0YXBzXG4gICAgICB0aW1lOiAyNTAsXG4gICAgICAvLyBtYXggdGltZSBvZiB0aGUgcG9pbnRlciB0byBiZSBkb3duIChsaWtlIGZpbmdlciBvbiB0aGUgc2NyZWVuKVxuICAgICAgdGhyZXNob2xkOiA5LFxuICAgICAgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgIHBvc1RocmVzaG9sZDogMTAgLy8gYSBtdWx0aS10YXAgY2FuIGJlIGEgYml0IG9mZiB0aGUgaW5pdGlhbCBwb3NpdGlvblxuXG4gICAgfSxcbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9NQU5JUFVMQVRJT05dO1xuICAgIH0sXG4gICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcyhpbnB1dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgIHZhciB2YWxpZFRvdWNoVGltZSA9IGlucHV0LmRlbHRhVGltZSA8IG9wdGlvbnMudGltZTtcbiAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgaWYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIHRoaXMuY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgIH0gLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAgIC8vIGFuZCB3ZSd2ZSByZWFjaGVkIGFuIGVuZCBldmVudCwgc28gYSB0YXAgaXMgcG9zc2libGVcblxuXG4gICAgICBpZiAodmFsaWRNb3ZlbWVudCAmJiB2YWxpZFRvdWNoVGltZSAmJiB2YWxpZFBvaW50ZXJzKSB7XG4gICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWxpZEludGVydmFsID0gdGhpcy5wVGltZSA/IGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsIDogdHJ1ZTtcbiAgICAgICAgdmFyIHZhbGlkTXVsdGlUYXAgPSAhdGhpcy5wQ2VudGVyIHx8IGdldERpc3RhbmNlKHRoaXMucENlbnRlciwgaW5wdXQuY2VudGVyKSA8IG9wdGlvbnMucG9zVGhyZXNob2xkO1xuICAgICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgaWYgKCF2YWxpZE11bHRpVGFwIHx8ICF2YWxpZEludGVydmFsKSB7XG4gICAgICAgICAgdGhpcy5jb3VudCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsgLy8gaWYgdGFwIGNvdW50IG1hdGNoZXMgd2UgaGF2ZSByZWNvZ25pemVkIGl0LFxuICAgICAgICAvLyBlbHNlIGl0IGhhcyBiZWdhbiByZWNvZ25pemluZy4uLlxuXG4gICAgICAgIHZhciB0YXBDb3VudCA9IHRoaXMuY291bnQgJSBvcHRpb25zLnRhcHM7XG5cbiAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgdGhpcy50cnlFbWl0KCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuICAgIGZhaWxUaW1lb3V0OiBmdW5jdGlvbiBmYWlsVGltZW91dCgpIHtcbiAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dENvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdCgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICB0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsIHRoaXMuX2lucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKipcbiAgICogU2ltcGxlIHdheSB0byBjcmVhdGUgYSBtYW5hZ2VyIHdpdGggYSBkZWZhdWx0IHNldCBvZiByZWNvZ25pemVycy5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVjb2duaXplcnMgPSBpZlVuZGVmaW5lZChvcHRpb25zLnJlY29nbml6ZXJzLCBIYW1tZXIuZGVmYXVsdHMucHJlc2V0KTtcbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEBjb25zdCB7c3RyaW5nfVxuICAgKi9cblxuXG4gIEhhbW1lci5WRVJTSU9OID0gJzIuMC43JztcbiAgLyoqXG4gICAqIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogQG5hbWVzcGFjZVxuICAgKi9cblxuICBIYW1tZXIuZGVmYXVsdHMgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IGlmIERPTSBldmVudHMgYXJlIGJlaW5nIHRyaWdnZXJlZC5cbiAgICAgKiBCdXQgdGhpcyBpcyBzbG93ZXIgYW5kIHVudXNlZCBieSBzaW1wbGUgaW1wbGVtZW50YXRpb25zLCBzbyBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZG9tRXZlbnRzOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5L2ZhbGxiYWNrLlxuICAgICAqIFdoZW4gc2V0IHRvIGBjb21wdXRlYCBpdCB3aWxsIG1hZ2ljYWxseSBzZXQgdGhlIGNvcnJlY3QgdmFsdWUgYmFzZWQgb24gdGhlIGFkZGVkIHJlY29nbml6ZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgY29tcHV0ZVxuICAgICAqL1xuICAgIHRvdWNoQWN0aW9uOiBUT1VDSF9BQ1RJT05fQ09NUFVURSxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAtLSBjYW4gYmUgcmVtb3ZlZC9jaGFuZ2VkXG4gICAgICogQ2hhbmdlIHRoZSBwYXJlbnQgaW5wdXQgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogSWYgTnVsbCwgdGhlbiBpdCBpcyBiZWluZyBzZXQgdGhlIHRvIG1haW4gZWxlbWVudC5cbiAgICAgKiBAdHlwZSB7TnVsbHxFdmVudFRhcmdldH1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRUYXJnZXQ6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBmb3JjZSBhbiBpbnB1dCBjbGFzc1xuICAgICAqIEB0eXBlIHtOdWxsfEZ1bmN0aW9ufVxuICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBpbnB1dENsYXNzOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCByZWNvZ25pemVyIHNldHVwIHdoZW4gY2FsbGluZyBgSGFtbWVyKClgXG4gICAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyIHRoZXNlIHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICovXG4gICAgcHJlc2V0OiBbLy8gUmVjb2duaXplckNsYXNzLCBvcHRpb25zLCBbcmVjb2duaXplV2l0aCwgLi4uXSwgW3JlcXVpcmVGYWlsdXJlLCAuLi5dXG4gICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9XSwgW1BpbmNoUmVjb2duaXplciwge1xuICAgICAgZW5hYmxlOiBmYWxzZVxuICAgIH0sIFsncm90YXRlJ11dLCBbU3dpcGVSZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfV0sIFtQYW5SZWNvZ25pemVyLCB7XG4gICAgICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG4gICAgfSwgWydzd2lwZSddXSwgW1RhcFJlY29nbml6ZXJdLCBbVGFwUmVjb2duaXplciwge1xuICAgICAgZXZlbnQ6ICdkb3VibGV0YXAnLFxuICAgICAgdGFwczogMlxuICAgIH0sIFsndGFwJ11dLCBbUHJlc3NSZWNvZ25pemVyXV0sXG5cbiAgICAvKipcbiAgICAgKiBTb21lIENTUyBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHdvcmtpbmcgb2YgSGFtbWVyLlxuICAgICAqIEFkZCB0aGVtIHRvIHRoaXMgbWV0aG9kIGFuZCB0aGV5IHdpbGwgYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlci5cbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICovXG4gICAgY3NzUHJvcHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSB0aGUgV2luZG93cyBQaG9uZSBncmlwcGVycyB3aGVuIHByZXNzaW5nIGFuIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIHRvdWNoU2VsZWN0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZXMgdGhlIGRlZmF1bHQgY2FsbG91dCBzaG93biB3aGVuIHlvdSB0b3VjaCBhbmQgaG9sZCBhIHRvdWNoIHRhcmdldC5cbiAgICAgICAqIE9uIGlPUywgd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQgc3VjaCBhcyBhIGxpbmssIFNhZmFyaSBkaXNwbGF5c1xuICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAqL1xuICAgICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG5cbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICovXG4gICAgICB1c2VyRHJhZzogJ25vbmUnLFxuXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgKiBjbGlja2FibGUgZWxlbWVudCBpbiBpT1MuIFRoaXMgcHJvcGVydHkgb2JleXMgdGhlIGFscGhhIHZhbHVlLCBpZiBzcGVjaWZpZWQuXG4gICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgKi9cbiAgICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgICB9XG4gIH07XG4gIHZhciBTVE9QID0gMTtcbiAgdmFyIEZPUkNFRF9TVE9QID0gMjtcbiAgLyoqXG4gICAqIE1hbmFnZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKi9cblxuICBmdW5jdGlvbiBNYW5hZ2VyKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIEhhbW1lci5kZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlucHV0ID0gY3JlYXRlSW5wdXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnRvdWNoQWN0aW9uID0gbmV3IFRvdWNoQWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyBpdGVtWzBdKGl0ZW1bMV0pKTtcbiAgICAgIGl0ZW1bMl0gJiYgcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW1bMl0pO1xuICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xuICB9XG5cbiAgTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gc2V0KG9wdGlvbnMpIHtcbiAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOyAvLyBPcHRpb25zIHRoYXQgbmVlZCBhIGxpdHRsZSBtb3JlIHNldHVwXG5cbiAgICAgIGlmIChvcHRpb25zLnRvdWNoQWN0aW9uKSB7XG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmlucHV0VGFyZ2V0KSB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmlucHV0LnRhcmdldCA9IG9wdGlvbnMuaW5wdXRUYXJnZXQ7XG4gICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgICAqIFRoaXMgc2Vzc2lvbiB3aWxsIGJlIGRpc2NhcmRlZCwgd2hlbiBhIG5ldyBbaW5wdXRdc3RhcnQgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogV2hlbiBmb3JjZWQsIHRoZSByZWNvZ25pemVyIGN5Y2xlIGlzIHN0b3BwZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcChmb3JjZSkge1xuICAgICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcnVuIHRoZSByZWNvZ25pemVycyFcbiAgICAgKiBjYWxsZWQgYnkgdGhlIGlucHV0SGFuZGxlciBmdW5jdGlvbiBvbiBldmVyeSBtb3ZlbWVudCBvZiB0aGUgcG9pbnRlcnMgKHRvdWNoZXMpXG4gICAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIHJlY29nbml6ZTogZnVuY3Rpb24gcmVjb2duaXplKGlucHV0RGF0YSkge1xuICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG5cbiAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBydW4gdGhlIHRvdWNoLWFjdGlvbiBwb2x5ZmlsbFxuXG5cbiAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG4gICAgICB2YXIgcmVjb2duaXplcjtcbiAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7IC8vIHRoaXMgaG9sZHMgdGhlIHJlY29nbml6ZXIgdGhhdCBpcyBiZWluZyByZWNvZ25pemVkLlxuICAgICAgLy8gc28gdGhlIHJlY29nbml6ZXIncyBzdGF0ZSBuZWVkcyB0byBiZSBCRUdBTiwgQ0hBTkdFRCwgRU5ERUQgb3IgUkVDT0dOSVpFRFxuICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuXG4gICAgICB2YXIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjsgLy8gcmVzZXQgd2hlbiB0aGUgbGFzdCByZWNvZ25pemVyIGlzIHJlY29nbml6ZWRcbiAgICAgIC8vIG9yIHdoZW4gd2UncmUgaW4gYSBuZXcgc2Vzc2lvblxuXG4gICAgICBpZiAoIWN1clJlY29nbml6ZXIgfHwgY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IHJlY29nbml6ZXJzLmxlbmd0aCkge1xuICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07IC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgLy8gMS4gICBhbGxvdyBpZiB0aGUgc2Vzc2lvbiBpcyBOT1QgZm9yY2VkIHN0b3BwZWQgKHNlZSB0aGUgLnN0b3AoKSBtZXRob2QpXG4gICAgICAgIC8vIDIuICAgYWxsb3cgaWYgd2Ugc3RpbGwgaGF2ZW4ndCByZWNvZ25pemVkIGEgZ2VzdHVyZSBpbiB0aGlzIHNlc3Npb24sIG9yIHRoZSB0aGlzIHJlY29nbml6ZXIgaXMgdGhlIG9uZVxuICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgLy8gMy4gICBhbGxvdyBpZiB0aGUgcmVjb2duaXplciBpcyBhbGxvd2VkIHRvIHJ1biBzaW11bHRhbmVvdXMgd2l0aCB0aGUgY3VycmVudCByZWNvZ25pemVkIHJlY29nbml6ZXIuXG4gICAgICAgIC8vICAgICAgdGhpcyBjYW4gYmUgc2V0dXAgd2l0aCB0aGUgYHJlY29nbml6ZVdpdGgoKWAgbWV0aG9kIG9uIHRoZSByZWNvZ25pemVyLlxuXG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQgIT09IEZPUkNFRF9TVE9QICYmICggLy8gMVxuICAgICAgICAhY3VyUmVjb2duaXplciB8fCByZWNvZ25pemVyID09IGN1clJlY29nbml6ZXIgfHwgLy8gMlxuICAgICAgICByZWNvZ25pemVyLmNhblJlY29nbml6ZVdpdGgoY3VyUmVjb2duaXplcikpKSB7XG4gICAgICAgICAgLy8gM1xuICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplKGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICB9IC8vIGlmIHRoZSByZWNvZ25pemVyIGhhcyBiZWVuIHJlY29nbml6aW5nIHRoZSBpbnB1dCBhcyBhIHZhbGlkIGdlc3R1cmUsIHdlIHdhbnQgdG8gc3RvcmUgdGhpcyBvbmUgYXMgdGhlXG4gICAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuXG5cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyICYmIHJlY29nbml6ZXIuc3RhdGUgJiAoU1RBVEVfQkVHQU4gfCBTVEFURV9DSEFOR0VEIHwgU1RBVEVfRU5ERUQpKSB7XG4gICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IHJlY29nbml6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGdldCBhIHJlY29nbml6ZXIgYnkgaXRzIGV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE51bGx9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQocmVjb2duaXplcikge1xuICAgICAgaWYgKHJlY29nbml6ZXIgaW5zdGFuY2VvZiBSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWNvZ25pemVyc1tpXS5vcHRpb25zLmV2ZW50ID09IHJlY29nbml6ZXIpIHtcbiAgICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGFkZCBhIHJlY29nbml6ZXIgdG8gdGhlIG1hbmFnZXJcbiAgICAgKiBleGlzdGluZyByZWNvZ25pemVycyB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgd2lsbCBiZSByZW1vdmVkXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TWFuYWdlcn1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChyZWNvZ25pemVyKSB7XG4gICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSAvLyByZW1vdmUgZXhpc3RpbmdcblxuXG4gICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoZXhpc3RpbmcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2duaXplcik7XG4gICAgICByZWNvZ25pemVyLm1hbmFnZXIgPSB0aGlzO1xuICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYSByZWNvZ25pemVyIGJ5IG5hbWUgb3IgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUocmVjb2duaXplcikge1xuICAgICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsICdyZW1vdmUnLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmVjb2duaXplciA9IHRoaXMuZ2V0KHJlY29nbml6ZXIpOyAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuXG4gICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgICB2YXIgaW5kZXggPSBpbkFycmF5KHJlY29nbml6ZXJzLCByZWNvZ25pemVyKTtcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBiaW5kIGV2ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSB0aGlzXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdW5iaW5kIGV2ZW50LCBsZWF2ZSBlbWl0IGJsYW5rIHRvIHJlbW92ZSBhbGwgaGFuZGxlcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhbmRsZXJdXG4gICAgICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gdGhpc1xuICAgICAqL1xuICAgIG9mZjogZnVuY3Rpb24gb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFuZGxlcnNbZXZlbnRdICYmIGhhbmRsZXJzW2V2ZW50XS5zcGxpY2UoaW5BcnJheShoYW5kbGVyc1tldmVudF0sIGhhbmRsZXIpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50LCBkYXRhKSB7XG4gICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgfSAvLyBubyBoYW5kbGVycywgc28gc2tpcCBpdCBhbGxcblxuXG4gICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuXG4gICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnR5cGUgPSBldmVudDtcblxuICAgICAgZGF0YS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGF0YS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAgICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZUNzc1Byb3BzKG1hbmFnZXIsIGFkZCkge1xuICAgIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgcHJvcCA9IHByZWZpeGVkKGVsZW1lbnQuc3R5bGUsIG5hbWUpO1xuXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW3Byb3BdO1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghYWRkKSB7XG4gICAgICBtYW5hZ2VyLm9sZENzc1Byb3BzID0ge307XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiB0cmlnZ2VyIGRvbSBldmVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG5cblxuICBmdW5jdGlvbiB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgZ2VzdHVyZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZ2VzdHVyZUV2ZW50LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZ2VzdHVyZUV2ZW50Lmdlc3R1cmUgPSBkYXRhO1xuICAgIGRhdGEudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZ2VzdHVyZUV2ZW50KTtcbiAgfVxuXG4gIGFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcbiAgICBTVEFURV9QT1NTSUJMRTogU1RBVEVfUE9TU0lCTEUsXG4gICAgU1RBVEVfQkVHQU46IFNUQVRFX0JFR0FOLFxuICAgIFNUQVRFX0NIQU5HRUQ6IFNUQVRFX0NIQU5HRUQsXG4gICAgU1RBVEVfRU5ERUQ6IFNUQVRFX0VOREVELFxuICAgIFNUQVRFX1JFQ09HTklaRUQ6IFNUQVRFX1JFQ09HTklaRUQsXG4gICAgU1RBVEVfQ0FOQ0VMTEVEOiBTVEFURV9DQU5DRUxMRUQsXG4gICAgU1RBVEVfRkFJTEVEOiBTVEFURV9GQUlMRUQsXG4gICAgRElSRUNUSU9OX05PTkU6IERJUkVDVElPTl9OT05FLFxuICAgIERJUkVDVElPTl9MRUZUOiBESVJFQ1RJT05fTEVGVCxcbiAgICBESVJFQ1RJT05fUklHSFQ6IERJUkVDVElPTl9SSUdIVCxcbiAgICBESVJFQ1RJT05fVVA6IERJUkVDVElPTl9VUCxcbiAgICBESVJFQ1RJT05fRE9XTjogRElSRUNUSU9OX0RPV04sXG4gICAgRElSRUNUSU9OX0hPUklaT05UQUw6IERJUkVDVElPTl9IT1JJWk9OVEFMLFxuICAgIERJUkVDVElPTl9WRVJUSUNBTDogRElSRUNUSU9OX1ZFUlRJQ0FMLFxuICAgIERJUkVDVElPTl9BTEw6IERJUkVDVElPTl9BTEwsXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuICAgIFRvdWNoSW5wdXQ6IFRvdWNoSW5wdXQsXG4gICAgTW91c2VJbnB1dDogTW91c2VJbnB1dCxcbiAgICBQb2ludGVyRXZlbnRJbnB1dDogUG9pbnRlckV2ZW50SW5wdXQsXG4gICAgVG91Y2hNb3VzZUlucHV0OiBUb3VjaE1vdXNlSW5wdXQsXG4gICAgU2luZ2xlVG91Y2hJbnB1dDogU2luZ2xlVG91Y2hJbnB1dCxcbiAgICBSZWNvZ25pemVyOiBSZWNvZ25pemVyLFxuICAgIEF0dHJSZWNvZ25pemVyOiBBdHRyUmVjb2duaXplcixcbiAgICBUYXA6IFRhcFJlY29nbml6ZXIsXG4gICAgUGFuOiBQYW5SZWNvZ25pemVyLFxuICAgIFN3aXBlOiBTd2lwZVJlY29nbml6ZXIsXG4gICAgUGluY2g6IFBpbmNoUmVjb2duaXplcixcbiAgICBSb3RhdGU6IFJvdGF0ZVJlY29nbml6ZXIsXG4gICAgUHJlc3M6IFByZXNzUmVjb2duaXplcixcbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxuICB9KTsgLy8gdGhpcyBwcmV2ZW50cyBlcnJvcnMgd2hlbiBIYW1tZXIgaXMgbG9hZGVkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTURcbiAgLy8gIHN0eWxlIGxvYWRlciBidXQgYnkgc2NyaXB0IHRhZywgbm90IGJ5IHRoZSBsb2FkZXIuXG5cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgZnJlZUdsb2JhbC5IYW1tZXIgPSBIYW1tZXI7XG5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEhhbW1lcjtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3dbZXhwb3J0TmFtZV0gPSBIYW1tZXI7XG4gIH1cbn0pKHdpbmRvdywgZG9jdW1lbnQsICdIYW1tZXInKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5087\n")},1677:function(__unused_webpack_module,exports,__webpack_require__){"use strict";eval('var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({\n value: true\n});\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === \'object\' && \'default\' in ex ? ex[\'default\'] : ex;\n}\n\nvar React = __webpack_require__(7294);\n\nvar React__default = _interopDefault(React);\n\nvar UAParser = __webpack_require__(4889);\n\nvar UA = new UAParser();\nvar browser = UA.getBrowser();\nvar cpu = UA.getCPU();\nvar device = UA.getDevice();\nvar engine = UA.getEngine();\nvar os = UA.getOS();\nvar ua = UA.getUA();\n\nvar setDefaults = function setDefaults(p) {\n var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'none\';\n return p ? p : d;\n};\n\nvar getNavigatorInstance = function getNavigatorInstance() {\n if (typeof window !== \'undefined\') {\n if (window.navigator || navigator) {\n return window.navigator || navigator;\n }\n }\n\n return false;\n};\n\nvar isIOS13Check = function isIOS13Check(type) {\n var nav = getNavigatorInstance();\n return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1 && !window.MSStream);\n};\n\nfunction _typeof(obj) {\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === "object" || typeof call === "function")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nvar DeviceTypes = {\n Mobile: \'mobile\',\n Tablet: \'tablet\',\n SmartTv: \'smarttv\',\n Console: \'console\',\n Wearable: \'wearable\',\n Browser: undefined\n};\nvar BrowserTypes = {\n Chrome: \'Chrome\',\n Firefox: "Firefox",\n Opera: "Opera",\n Yandex: "Yandex",\n Safari: "Safari",\n InternetExplorer: "Internet Explorer",\n Edge: "Edge",\n Chromium: "Chromium",\n Ie: \'IE\',\n MobileSafari: "Mobile Safari",\n EdgeChromium: "Edge Chromium",\n MIUI: "MIUI Browser",\n SamsungBrowser: \'Samsung Browser\'\n};\nvar OsTypes = {\n IOS: \'iOS\',\n Android: "Android",\n WindowsPhone: "Windows Phone",\n Windows: \'Windows\',\n MAC_OS: \'Mac OS\'\n};\nvar initialData = {\n isMobile: false,\n isTablet: false,\n isBrowser: false,\n isSmartTV: false,\n isConsole: false,\n isWearable: false\n};\n\nvar checkType = function checkType(type) {\n switch (type) {\n case DeviceTypes.Mobile:\n return {\n isMobile: true\n };\n\n case DeviceTypes.Tablet:\n return {\n isTablet: true\n };\n\n case DeviceTypes.SmartTv:\n return {\n isSmartTV: true\n };\n\n case DeviceTypes.Console:\n return {\n isConsole: true\n };\n\n case DeviceTypes.Wearable:\n return {\n isWearable: true\n };\n\n case DeviceTypes.Browser:\n return {\n isBrowser: true\n };\n\n default:\n return initialData;\n }\n};\n\nvar broPayload = function broPayload(isBrowser, browser, engine, os, ua) {\n return {\n isBrowser: isBrowser,\n browserMajorVersion: setDefaults(browser.major),\n browserFullVersion: setDefaults(browser.version),\n browserName: setDefaults(browser.name),\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar mobilePayload = function mobilePayload(type, device, os, ua) {\n return _objectSpread2({}, type, {\n vendor: setDefaults(device.vendor),\n model: setDefaults(device.model),\n os: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n ua: setDefaults(ua)\n });\n};\n\nvar stvPayload = function stvPayload(isSmartTV, engine, os, ua) {\n return {\n isSmartTV: isSmartTV,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar consolePayload = function consolePayload(isConsole, engine, os, ua) {\n return {\n isConsole: isConsole,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar wearPayload = function wearPayload(isWearable, engine, os, ua) {\n return {\n isWearable: isWearable,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nvar type = checkType(device.type);\n\nfunction deviceDetect() {\n var isBrowser = type.isBrowser,\n isMobile = type.isMobile,\n isTablet = type.isTablet,\n isSmartTV = type.isSmartTV,\n isConsole = type.isConsole,\n isWearable = type.isWearable;\n\n if (isBrowser) {\n return broPayload(isBrowser, browser, engine, os, ua);\n }\n\n if (isSmartTV) {\n return stvPayload(isSmartTV, engine, os, ua);\n }\n\n if (isConsole) {\n return consolePayload(isConsole, engine, os, ua);\n }\n\n if (isMobile) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isTablet) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isWearable) {\n return wearPayload(isWearable, engine, os, ua);\n }\n}\n\nvar isMobileType = function isMobileType() {\n return device.type === DeviceTypes.Mobile;\n};\n\nvar isTabletType = function isTabletType() {\n return device.type === DeviceTypes.Tablet;\n};\n\nvar isMobileAndTabletType = function isMobileAndTabletType() {\n switch (device.type) {\n case DeviceTypes.Mobile:\n case DeviceTypes.Tablet:\n return true;\n\n default:\n return false;\n }\n};\n\nvar isEdgeChromiumType = function isEdgeChromiumType() {\n return typeof ua === \'string\' && ua.indexOf(\'Edg/\') !== -1;\n};\n\nvar isSmartTVType = function isSmartTVType() {\n return device.type === DeviceTypes.SmartTv;\n};\n\nvar isBrowserType = function isBrowserType() {\n return device.type === DeviceTypes.Browser;\n};\n\nvar isWearableType = function isWearableType() {\n return device.type === DeviceTypes.Wearable;\n};\n\nvar isConsoleType = function isConsoleType() {\n return device.type === DeviceTypes.Console;\n};\n\nvar isAndroidType = function isAndroidType() {\n return os.name === OsTypes.Android;\n};\n\nvar isWindowsType = function isWindowsType() {\n return os.name === OsTypes.Windows;\n};\n\nvar isMacOsType = function isMacOsType() {\n return os.name === OsTypes.MAC_OS;\n};\n\nvar isWinPhoneType = function isWinPhoneType() {\n return os.name === OsTypes.WindowsPhone;\n};\n\nvar isIOSType = function isIOSType() {\n return os.name === OsTypes.IOS;\n};\n\nvar isChromeType = function isChromeType() {\n return browser.name === BrowserTypes.Chrome;\n};\n\nvar isFirefoxType = function isFirefoxType() {\n return browser.name === BrowserTypes.Firefox;\n};\n\nvar isChromiumType = function isChromiumType() {\n return browser.name === BrowserTypes.Chromium;\n};\n\nvar isEdgeType = function isEdgeType() {\n return browser.name === BrowserTypes.Edge;\n};\n\nvar isYandexType = function isYandexType() {\n return browser.name === BrowserTypes.Yandex;\n};\n\nvar isSafariType = function isSafariType() {\n return browser.name === BrowserTypes.Safari || browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isMobileSafariType = function isMobileSafariType() {\n return browser.name === BrowserTypes.MobileSafari;\n};\n\nvar isOperaType = function isOperaType() {\n return browser.name === BrowserTypes.Opera;\n};\n\nvar isIEType = function isIEType() {\n return browser.name === BrowserTypes.InternetExplorer || browser.name === BrowserTypes.Ie;\n};\n\nvar isMIUIType = function isMIUIType() {\n return browser.name === BrowserTypes.MIUI;\n};\n\nvar isSamsungBrowserType = function isSamsungBrowserType() {\n return browser.name === BrowserTypes.SamsungBrowser;\n};\n\nvar isElectronType = function isElectronType() {\n var nav = getNavigatorInstance();\n var ua = nav && nav.userAgent && nav.userAgent.toLowerCase();\n return typeof ua === \'string\' ? /electron/.test(ua) : false;\n};\n\nvar getIOS13 = function getIOS13() {\n var nav = getNavigatorInstance();\n return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === \'MacIntel\' && nav.maxTouchPoints > 1) && !window.MSStream;\n};\n\nvar getIPad13 = function getIPad13() {\n return isIOS13Check(\'iPad\');\n};\n\nvar getIphone13 = function getIphone13() {\n return isIOS13Check(\'iPhone\');\n};\n\nvar getIPod13 = function getIPod13() {\n return isIOS13Check(\'iPod\');\n};\n\nvar getBrowserFullVersion = function getBrowserFullVersion() {\n return setDefaults(browser.version);\n};\n\nvar getBrowserVersion = function getBrowserVersion() {\n return setDefaults(browser.major);\n};\n\nvar getOsVersion = function getOsVersion() {\n return setDefaults(os.version);\n};\n\nvar getOsName = function getOsName() {\n return setDefaults(os.name);\n};\n\nvar getBrowserName = function getBrowserName() {\n return setDefaults(browser.name);\n};\n\nvar getMobileVendor = function getMobileVendor() {\n return setDefaults(device.vendor);\n};\n\nvar getMobileModel = function getMobileModel() {\n return setDefaults(device.model);\n};\n\nvar getEngineName = function getEngineName() {\n return setDefaults(engine.name);\n};\n\nvar getEngineVersion = function getEngineVersion() {\n return setDefaults(engine.version);\n};\n\nvar getUseragent = function getUseragent() {\n return setDefaults(ua);\n};\n\nvar getDeviceType = function getDeviceType() {\n return setDefaults(device.type, \'browser\');\n};\n\nvar isSmartTV = isSmartTVType();\nvar isConsole = isConsoleType();\nvar isWearable = isWearableType();\nvar isMobileSafari = isMobileSafariType() || getIPad13();\nvar isChromium = isChromiumType();\nvar isMobile = isMobileAndTabletType() || getIPad13();\nvar isMobileOnly = isMobileType();\nvar isTablet = isTabletType() || getIPad13();\nvar isBrowser = isBrowserType();\nvar isDesktop = isBrowserType();\nvar isAndroid = isAndroidType();\nvar isWinPhone = isWinPhoneType();\nvar isIOS = isIOSType() || getIPad13();\nvar isChrome = isChromeType();\nvar isFirefox = isFirefoxType();\nvar isSafari = isSafariType();\nvar isOpera = isOperaType();\nvar isIE = isIEType();\nvar osVersion = getOsVersion();\nvar osName = getOsName();\nvar fullBrowserVersion = getBrowserFullVersion();\nvar browserVersion = getBrowserVersion();\nvar browserName = getBrowserName();\nvar mobileVendor = getMobileVendor();\nvar mobileModel = getMobileModel();\nvar engineName = getEngineName();\nvar engineVersion = getEngineVersion();\nvar getUA = getUseragent();\nvar isEdge = isEdgeType() || isEdgeChromiumType();\nvar isYandex = isYandexType();\nvar deviceType = getDeviceType();\nvar isIOS13 = getIOS13();\nvar isIPad13 = getIPad13();\nvar isIPhone13 = getIphone13();\nvar isIPod13 = getIPod13();\nvar isElectron = isElectronType();\nvar isEdgeChromium = isEdgeChromiumType();\nvar isLegacyEdge = isEdgeType() && !isEdgeChromiumType();\nvar isWindows = isWindowsType();\nvar isMacOs = isMacOsType();\nvar isMIUI = isMIUIType();\nvar isSamsungBrowser = isSamsungBrowserType();\n\nvar AndroidView = function AndroidView(_ref) {\n var renderWithFragment = _ref.renderWithFragment,\n children = _ref.children,\n viewClassName = _ref.viewClassName,\n style = _ref.style,\n props = _objectWithoutProperties(_ref, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar BrowserView = function BrowserView(_ref2) {\n var renderWithFragment = _ref2.renderWithFragment,\n children = _ref2.children,\n viewClassName = _ref2.viewClassName,\n style = _ref2.style,\n props = _objectWithoutProperties(_ref2, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IEView = function IEView(_ref3) {\n var renderWithFragment = _ref3.renderWithFragment,\n children = _ref3.children,\n viewClassName = _ref3.viewClassName,\n style = _ref3.style,\n props = _objectWithoutProperties(_ref3, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar IOSView = function IOSView(_ref4) {\n var renderWithFragment = _ref4.renderWithFragment,\n children = _ref4.children,\n viewClassName = _ref4.viewClassName,\n style = _ref4.style,\n props = _objectWithoutProperties(_ref4, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileView = function MobileView(_ref5) {\n var renderWithFragment = _ref5.renderWithFragment,\n children = _ref5.children,\n viewClassName = _ref5.viewClassName,\n style = _ref5.style,\n props = _objectWithoutProperties(_ref5, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar TabletView = function TabletView(_ref6) {\n var renderWithFragment = _ref6.renderWithFragment,\n children = _ref6.children,\n viewClassName = _ref6.viewClassName,\n style = _ref6.style,\n props = _objectWithoutProperties(_ref6, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WinPhoneView = function WinPhoneView(_ref7) {\n var renderWithFragment = _ref7.renderWithFragment,\n children = _ref7.children,\n viewClassName = _ref7.viewClassName,\n style = _ref7.style,\n props = _objectWithoutProperties(_ref7, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar MobileOnlyView = function MobileOnlyView(_ref8) {\n var renderWithFragment = _ref8.renderWithFragment,\n children = _ref8.children,\n viewClassName = _ref8.viewClassName,\n style = _ref8.style,\n props = _objectWithoutProperties(_ref8, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar SmartTVView = function SmartTVView(_ref9) {\n var renderWithFragment = _ref9.renderWithFragment,\n children = _ref9.children,\n viewClassName = _ref9.viewClassName,\n style = _ref9.style,\n props = _objectWithoutProperties(_ref9, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar ConsoleView = function ConsoleView(_ref10) {\n var renderWithFragment = _ref10.renderWithFragment,\n children = _ref10.children,\n viewClassName = _ref10.viewClassName,\n style = _ref10.style,\n props = _objectWithoutProperties(_ref10, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar WearableView = function WearableView(_ref11) {\n var renderWithFragment = _ref11.renderWithFragment,\n children = _ref11.children,\n viewClassName = _ref11.viewClassName,\n style = _ref11.style,\n props = _objectWithoutProperties(_ref11, ["renderWithFragment", "children", "viewClassName", "style"]);\n\n return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nvar CustomView = function CustomView(_ref12) {\n var renderWithFragment = _ref12.renderWithFragment,\n children = _ref12.children,\n viewClassName = _ref12.viewClassName,\n style = _ref12.style,\n condition = _ref12.condition,\n props = _objectWithoutProperties(_ref12, ["renderWithFragment", "children", "viewClassName", "style", "condition"]);\n\n return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", _extends({\n className: viewClassName,\n style: style\n }, props), children) : null;\n};\n\nfunction withOrientationChange(WrappedComponent) {\n return /*#__PURE__*/function (_React$Component) {\n _inherits(_class, _React$Component);\n\n function _class(props) {\n var _this;\n\n _classCallCheck(this, _class);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));\n _this.isEventListenerAdded = false;\n _this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this));\n _this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this));\n _this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this));\n _this.state = {\n isLandscape: false,\n isPortrait: false\n };\n return _this;\n }\n\n _createClass(_class, [{\n key: "handleOrientationChange",\n value: function handleOrientationChange() {\n if (!this.isEventListenerAdded) {\n this.isEventListenerAdded = true;\n }\n\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n this.setState({\n isPortrait: orientation === 0,\n isLandscape: orientation === 90\n });\n }\n }, {\n key: "onOrientationChange",\n value: function onOrientationChange() {\n this.handleOrientationChange();\n }\n }, {\n key: "onPageLoad",\n value: function onPageLoad() {\n this.handleOrientationChange();\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) {\n if (!this.isEventListenerAdded) {\n this.handleOrientationChange();\n window.addEventListener("load", this.onPageLoad, false);\n } else {\n window.removeEventListener("load", this.onPageLoad, false);\n }\n\n window.addEventListener("resize", this.onOrientationChange, false);\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n window.removeEventListener("resize", this.onOrientationChange, false);\n }\n }, {\n key: "render",\n value: function render() {\n return React__default.createElement(WrappedComponent, _extends({}, this.props, {\n isLandscape: this.state.isLandscape,\n isPortrait: this.state.isPortrait\n }));\n }\n }]);\n\n return _class;\n }(React__default.Component);\n}\n\n__webpack_unused_export__ = AndroidView;\n__webpack_unused_export__ = BrowserTypes;\n__webpack_unused_export__ = BrowserView;\n__webpack_unused_export__ = ConsoleView;\n__webpack_unused_export__ = CustomView;\n__webpack_unused_export__ = IEView;\n__webpack_unused_export__ = IOSView;\n__webpack_unused_export__ = MobileOnlyView;\n__webpack_unused_export__ = MobileView;\n__webpack_unused_export__ = OsTypes;\n__webpack_unused_export__ = SmartTVView;\n__webpack_unused_export__ = TabletView;\n__webpack_unused_export__ = WearableView;\n__webpack_unused_export__ = WinPhoneView;\n__webpack_unused_export__ = browserName;\n__webpack_unused_export__ = browserVersion;\n__webpack_unused_export__ = deviceDetect;\n__webpack_unused_export__ = deviceType;\n__webpack_unused_export__ = engineName;\n__webpack_unused_export__ = engineVersion;\n__webpack_unused_export__ = fullBrowserVersion;\n__webpack_unused_export__ = getUA;\n__webpack_unused_export__ = isAndroid;\n__webpack_unused_export__ = isBrowser;\n__webpack_unused_export__ = isChrome;\n__webpack_unused_export__ = isChromium;\n__webpack_unused_export__ = isConsole;\n__webpack_unused_export__ = isDesktop;\n__webpack_unused_export__ = isEdge;\n__webpack_unused_export__ = isEdgeChromium;\n__webpack_unused_export__ = isElectron;\n__webpack_unused_export__ = isFirefox;\n__webpack_unused_export__ = isIE;\n__webpack_unused_export__ = isIOS;\n__webpack_unused_export__ = isIOS13;\n__webpack_unused_export__ = isIPad13;\n__webpack_unused_export__ = isIPhone13;\n__webpack_unused_export__ = isIPod13;\n__webpack_unused_export__ = isLegacyEdge;\n__webpack_unused_export__ = isMIUI;\n__webpack_unused_export__ = isMacOs;\nexports.tq = isMobile;\n__webpack_unused_export__ = isMobileOnly;\n__webpack_unused_export__ = isMobileSafari;\n__webpack_unused_export__ = isOpera;\n__webpack_unused_export__ = isSafari;\n__webpack_unused_export__ = isSamsungBrowser;\n__webpack_unused_export__ = isSmartTV;\n__webpack_unused_export__ = isTablet;\n__webpack_unused_export__ = isWearable;\n__webpack_unused_export__ = isWinPhone;\n__webpack_unused_export__ = isWindows;\n__webpack_unused_export__ = isYandex;\n__webpack_unused_export__ = mobileModel;\n__webpack_unused_export__ = mobileVendor;\n__webpack_unused_export__ = osName;\n__webpack_unused_export__ = osVersion;\n__webpack_unused_export__ = withOrientationChange;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1kZXZpY2UtZGV0ZWN0L21haW4uanM/N2I2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQWE7O0FBRWIsNkJBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxDQUFDOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsSUFBTzs7QUFFM0I7O0FBRUEsZUFBZSxtQkFBTyxDQUFDLElBQWlDOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGVBQWUsNkJBQTZCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQSx5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBbUI7QUFDbkIseUJBQWtCO0FBQ2xCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZix5QkFBc0I7QUFDdEIseUJBQWtCO0FBQ2xCLHlCQUFlO0FBQ2YseUJBQW1CO0FBQ25CLHlCQUFrQjtBQUNsQix5QkFBb0I7QUFDcEIseUJBQW9CO0FBQ3BCLHlCQUFtQjtBQUNuQix5QkFBc0I7QUFDdEIseUJBQW9CO0FBQ3BCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQXFCO0FBQ3JCLHlCQUEwQjtBQUMxQix5QkFBYTtBQUNiLHlCQUFpQjtBQUNqQix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQWlCO0FBQ2pCLHlCQUFjO0FBQ2QseUJBQXNCO0FBQ3RCLHlCQUFrQjtBQUNsQix5QkFBaUI7QUFDakIseUJBQVk7QUFDWix5QkFBYTtBQUNiLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBZ0I7QUFDaEIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWU7QUFDZixVQUFnQjtBQUNoQix5QkFBb0I7QUFDcEIseUJBQXNCO0FBQ3RCLHlCQUFlO0FBQ2YseUJBQWdCO0FBQ2hCLHlCQUF3QjtBQUN4Qix5QkFBaUI7QUFDakIseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBa0I7QUFDbEIseUJBQWlCO0FBQ2pCLHlCQUFnQjtBQUNoQix5QkFBbUI7QUFDbkIseUJBQW9CO0FBQ3BCLHlCQUFjO0FBQ2QseUJBQWlCO0FBQ2pCLHlCQUE2QiIsImZpbGUiOiIxNjc3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0KGV4KSB7XG4gIHJldHVybiBleCAmJiB0eXBlb2YgZXggPT09ICdvYmplY3QnICYmICdkZWZhdWx0JyBpbiBleCA/IGV4WydkZWZhdWx0J10gOiBleDtcbn1cblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIFJlYWN0X19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0KFJlYWN0KTtcblxudmFyIFVBUGFyc2VyID0gcmVxdWlyZSgndWEtcGFyc2VyLWpzL2Rpc3QvdWEtcGFyc2VyLm1pbicpO1xuXG52YXIgVUEgPSBuZXcgVUFQYXJzZXIoKTtcbnZhciBicm93c2VyID0gVUEuZ2V0QnJvd3NlcigpO1xudmFyIGNwdSA9IFVBLmdldENQVSgpO1xudmFyIGRldmljZSA9IFVBLmdldERldmljZSgpO1xudmFyIGVuZ2luZSA9IFVBLmdldEVuZ2luZSgpO1xudmFyIG9zID0gVUEuZ2V0T1MoKTtcbnZhciB1YSA9IFVBLmdldFVBKCk7XG5cbnZhciBzZXREZWZhdWx0cyA9IGZ1bmN0aW9uIHNldERlZmF1bHRzKHApIHtcbiAgdmFyIGQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdub25lJztcbiAgcmV0dXJuIHAgPyBwIDogZDtcbn07XG5cbnZhciBnZXROYXZpZ2F0b3JJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldE5hdmlnYXRvckluc3RhbmNlKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAod2luZG93Lm5hdmlnYXRvciB8fCBuYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yIHx8IG5hdmlnYXRvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgaXNJT1MxM0NoZWNrID0gZnVuY3Rpb24gaXNJT1MxM0NoZWNrKHR5cGUpIHtcbiAgdmFyIG5hdiA9IGdldE5hdmlnYXRvckluc3RhbmNlKCk7XG4gIHJldHVybiBuYXYgJiYgbmF2LnBsYXRmb3JtICYmIChuYXYucGxhdGZvcm0uaW5kZXhPZih0eXBlKSAhPT0gLTEgfHwgbmF2LnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmIG5hdi5tYXhUb3VjaFBvaW50cyA+IDEgJiYgIXdpbmRvdy5NU1N0cmVhbSk7XG59O1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG5cbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuXG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxudmFyIERldmljZVR5cGVzID0ge1xuICBNb2JpbGU6ICdtb2JpbGUnLFxuICBUYWJsZXQ6ICd0YWJsZXQnLFxuICBTbWFydFR2OiAnc21hcnR0dicsXG4gIENvbnNvbGU6ICdjb25zb2xlJyxcbiAgV2VhcmFibGU6ICd3ZWFyYWJsZScsXG4gIEJyb3dzZXI6IHVuZGVmaW5lZFxufTtcbnZhciBCcm93c2VyVHlwZXMgPSB7XG4gIENocm9tZTogJ0Nocm9tZScsXG4gIEZpcmVmb3g6IFwiRmlyZWZveFwiLFxuICBPcGVyYTogXCJPcGVyYVwiLFxuICBZYW5kZXg6IFwiWWFuZGV4XCIsXG4gIFNhZmFyaTogXCJTYWZhcmlcIixcbiAgSW50ZXJuZXRFeHBsb3JlcjogXCJJbnRlcm5ldCBFeHBsb3JlclwiLFxuICBFZGdlOiBcIkVkZ2VcIixcbiAgQ2hyb21pdW06IFwiQ2hyb21pdW1cIixcbiAgSWU6ICdJRScsXG4gIE1vYmlsZVNhZmFyaTogXCJNb2JpbGUgU2FmYXJpXCIsXG4gIEVkZ2VDaHJvbWl1bTogXCJFZGdlIENocm9taXVtXCIsXG4gIE1JVUk6IFwiTUlVSSBCcm93c2VyXCIsXG4gIFNhbXN1bmdCcm93c2VyOiAnU2Ftc3VuZyBCcm93c2VyJ1xufTtcbnZhciBPc1R5cGVzID0ge1xuICBJT1M6ICdpT1MnLFxuICBBbmRyb2lkOiBcIkFuZHJvaWRcIixcbiAgV2luZG93c1Bob25lOiBcIldpbmRvd3MgUGhvbmVcIixcbiAgV2luZG93czogJ1dpbmRvd3MnLFxuICBNQUNfT1M6ICdNYWMgT1MnXG59O1xudmFyIGluaXRpYWxEYXRhID0ge1xuICBpc01vYmlsZTogZmFsc2UsXG4gIGlzVGFibGV0OiBmYWxzZSxcbiAgaXNCcm93c2VyOiBmYWxzZSxcbiAgaXNTbWFydFRWOiBmYWxzZSxcbiAgaXNDb25zb2xlOiBmYWxzZSxcbiAgaXNXZWFyYWJsZTogZmFsc2Vcbn07XG5cbnZhciBjaGVja1R5cGUgPSBmdW5jdGlvbiBjaGVja1R5cGUodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTW9iaWxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5UYWJsZXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1RhYmxldDogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuU21hcnRUdjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzU21hcnRUVjogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuQ29uc29sZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQ29uc29sZTogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgRGV2aWNlVHlwZXMuV2VhcmFibGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1dlYXJhYmxlOiB0cnVlXG4gICAgICB9O1xuXG4gICAgY2FzZSBEZXZpY2VUeXBlcy5Ccm93c2VyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNCcm93c2VyOiB0cnVlXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpbml0aWFsRGF0YTtcbiAgfVxufTtcblxudmFyIGJyb1BheWxvYWQgPSBmdW5jdGlvbiBicm9QYXlsb2FkKGlzQnJvd3NlciwgYnJvd3NlciwgZW5naW5lLCBvcywgdWEpIHtcbiAgcmV0dXJuIHtcbiAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlcixcbiAgICBicm93c2VyTWFqb3JWZXJzaW9uOiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKSxcbiAgICBicm93c2VyRnVsbFZlcnNpb246IHNldERlZmF1bHRzKGJyb3dzZXIudmVyc2lvbiksXG4gICAgYnJvd3Nlck5hbWU6IHNldERlZmF1bHRzKGJyb3dzZXIubmFtZSksXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciBtb2JpbGVQYXlsb2FkID0gZnVuY3Rpb24gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSkge1xuICByZXR1cm4gX29iamVjdFNwcmVhZDIoe30sIHR5cGUsIHtcbiAgICB2ZW5kb3I6IHNldERlZmF1bHRzKGRldmljZS52ZW5kb3IpLFxuICAgIG1vZGVsOiBzZXREZWZhdWx0cyhkZXZpY2UubW9kZWwpLFxuICAgIG9zOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVhOiBzZXREZWZhdWx0cyh1YSlcbiAgfSk7XG59O1xuXG52YXIgc3R2UGF5bG9hZCA9IGZ1bmN0aW9uIHN0dlBheWxvYWQoaXNTbWFydFRWLCBlbmdpbmUsIG9zLCB1YSkge1xuICByZXR1cm4ge1xuICAgIGlzU21hcnRUVjogaXNTbWFydFRWLFxuICAgIGVuZ2luZU5hbWU6IHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKSxcbiAgICBlbmdpbmVWZXJzaW9uOiBzZXREZWZhdWx0cyhlbmdpbmUudmVyc2lvbiksXG4gICAgb3NOYW1lOiBzZXREZWZhdWx0cyhvcy5uYW1lKSxcbiAgICBvc1ZlcnNpb246IHNldERlZmF1bHRzKG9zLnZlcnNpb24pLFxuICAgIHVzZXJBZ2VudDogc2V0RGVmYXVsdHModWEpXG4gIH07XG59O1xuXG52YXIgY29uc29sZVBheWxvYWQgPSBmdW5jdGlvbiBjb25zb2xlUGF5bG9hZChpc0NvbnNvbGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNDb25zb2xlOiBpc0NvbnNvbGUsXG4gICAgZW5naW5lTmFtZTogc2V0RGVmYXVsdHMoZW5naW5lLm5hbWUpLFxuICAgIGVuZ2luZVZlcnNpb246IHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKSxcbiAgICBvc05hbWU6IHNldERlZmF1bHRzKG9zLm5hbWUpLFxuICAgIG9zVmVyc2lvbjogc2V0RGVmYXVsdHMob3MudmVyc2lvbiksXG4gICAgdXNlckFnZW50OiBzZXREZWZhdWx0cyh1YSlcbiAgfTtcbn07XG5cbnZhciB3ZWFyUGF5bG9hZCA9IGZ1bmN0aW9uIHdlYXJQYXlsb2FkKGlzV2VhcmFibGUsIGVuZ2luZSwgb3MsIHVhKSB7XG4gIHJldHVybiB7XG4gICAgaXNXZWFyYWJsZTogaXNXZWFyYWJsZSxcbiAgICBlbmdpbmVOYW1lOiBzZXREZWZhdWx0cyhlbmdpbmUubmFtZSksXG4gICAgZW5naW5lVmVyc2lvbjogc2V0RGVmYXVsdHMoZW5naW5lLnZlcnNpb24pLFxuICAgIG9zTmFtZTogc2V0RGVmYXVsdHMob3MubmFtZSksXG4gICAgb3NWZXJzaW9uOiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKSxcbiAgICB1c2VyQWdlbnQ6IHNldERlZmF1bHRzKHVhKVxuICB9O1xufTtcblxudmFyIHR5cGUgPSBjaGVja1R5cGUoZGV2aWNlLnR5cGUpO1xuXG5mdW5jdGlvbiBkZXZpY2VEZXRlY3QoKSB7XG4gIHZhciBpc0Jyb3dzZXIgPSB0eXBlLmlzQnJvd3NlcixcbiAgICAgIGlzTW9iaWxlID0gdHlwZS5pc01vYmlsZSxcbiAgICAgIGlzVGFibGV0ID0gdHlwZS5pc1RhYmxldCxcbiAgICAgIGlzU21hcnRUViA9IHR5cGUuaXNTbWFydFRWLFxuICAgICAgaXNDb25zb2xlID0gdHlwZS5pc0NvbnNvbGUsXG4gICAgICBpc1dlYXJhYmxlID0gdHlwZS5pc1dlYXJhYmxlO1xuXG4gIGlmIChpc0Jyb3dzZXIpIHtcbiAgICByZXR1cm4gYnJvUGF5bG9hZChpc0Jyb3dzZXIsIGJyb3dzZXIsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc1NtYXJ0VFYpIHtcbiAgICByZXR1cm4gc3R2UGF5bG9hZChpc1NtYXJ0VFYsIGVuZ2luZSwgb3MsIHVhKTtcbiAgfVxuXG4gIGlmIChpc0NvbnNvbGUpIHtcbiAgICByZXR1cm4gY29uc29sZVBheWxvYWQoaXNDb25zb2xlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNNb2JpbGUpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNUYWJsZXQpIHtcbiAgICByZXR1cm4gbW9iaWxlUGF5bG9hZCh0eXBlLCBkZXZpY2UsIG9zLCB1YSk7XG4gIH1cblxuICBpZiAoaXNXZWFyYWJsZSkge1xuICAgIHJldHVybiB3ZWFyUGF5bG9hZChpc1dlYXJhYmxlLCBlbmdpbmUsIG9zLCB1YSk7XG4gIH1cbn1cblxudmFyIGlzTW9iaWxlVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Nb2JpbGU7XG59O1xuXG52YXIgaXNUYWJsZXRUeXBlID0gZnVuY3Rpb24gaXNUYWJsZXRUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLlRhYmxldDtcbn07XG5cbnZhciBpc01vYmlsZUFuZFRhYmxldFR5cGUgPSBmdW5jdGlvbiBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB7XG4gIHN3aXRjaCAoZGV2aWNlLnR5cGUpIHtcbiAgICBjYXNlIERldmljZVR5cGVzLk1vYmlsZTpcbiAgICBjYXNlIERldmljZVR5cGVzLlRhYmxldDpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzRWRnZUNocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZUNocm9taXVtVHlwZSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB1YSA9PT0gJ3N0cmluZycgJiYgdWEuaW5kZXhPZignRWRnLycpICE9PSAtMTtcbn07XG5cbnZhciBpc1NtYXJ0VFZUeXBlID0gZnVuY3Rpb24gaXNTbWFydFRWVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5TbWFydFR2O1xufTtcblxudmFyIGlzQnJvd3NlclR5cGUgPSBmdW5jdGlvbiBpc0Jyb3dzZXJUeXBlKCkge1xuICByZXR1cm4gZGV2aWNlLnR5cGUgPT09IERldmljZVR5cGVzLkJyb3dzZXI7XG59O1xuXG52YXIgaXNXZWFyYWJsZVR5cGUgPSBmdW5jdGlvbiBpc1dlYXJhYmxlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5XZWFyYWJsZTtcbn07XG5cbnZhciBpc0NvbnNvbGVUeXBlID0gZnVuY3Rpb24gaXNDb25zb2xlVHlwZSgpIHtcbiAgcmV0dXJuIGRldmljZS50eXBlID09PSBEZXZpY2VUeXBlcy5Db25zb2xlO1xufTtcblxudmFyIGlzQW5kcm9pZFR5cGUgPSBmdW5jdGlvbiBpc0FuZHJvaWRUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5BbmRyb2lkO1xufTtcblxudmFyIGlzV2luZG93c1R5cGUgPSBmdW5jdGlvbiBpc1dpbmRvd3NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzO1xufTtcblxudmFyIGlzTWFjT3NUeXBlID0gZnVuY3Rpb24gaXNNYWNPc1R5cGUoKSB7XG4gIHJldHVybiBvcy5uYW1lID09PSBPc1R5cGVzLk1BQ19PUztcbn07XG5cbnZhciBpc1dpblBob25lVHlwZSA9IGZ1bmN0aW9uIGlzV2luUGhvbmVUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5XaW5kb3dzUGhvbmU7XG59O1xuXG52YXIgaXNJT1NUeXBlID0gZnVuY3Rpb24gaXNJT1NUeXBlKCkge1xuICByZXR1cm4gb3MubmFtZSA9PT0gT3NUeXBlcy5JT1M7XG59O1xuXG52YXIgaXNDaHJvbWVUeXBlID0gZnVuY3Rpb24gaXNDaHJvbWVUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21lO1xufTtcblxudmFyIGlzRmlyZWZveFR5cGUgPSBmdW5jdGlvbiBpc0ZpcmVmb3hUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuRmlyZWZveDtcbn07XG5cbnZhciBpc0Nocm9taXVtVHlwZSA9IGZ1bmN0aW9uIGlzQ2hyb21pdW1UeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuQ2hyb21pdW07XG59O1xuXG52YXIgaXNFZGdlVHlwZSA9IGZ1bmN0aW9uIGlzRWRnZVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5FZGdlO1xufTtcblxudmFyIGlzWWFuZGV4VHlwZSA9IGZ1bmN0aW9uIGlzWWFuZGV4VHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLllhbmRleDtcbn07XG5cbnZhciBpc1NhZmFyaVR5cGUgPSBmdW5jdGlvbiBpc1NhZmFyaVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYWZhcmkgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuTW9iaWxlU2FmYXJpO1xufTtcblxudmFyIGlzTW9iaWxlU2FmYXJpVHlwZSA9IGZ1bmN0aW9uIGlzTW9iaWxlU2FmYXJpVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLk1vYmlsZVNhZmFyaTtcbn07XG5cbnZhciBpc09wZXJhVHlwZSA9IGZ1bmN0aW9uIGlzT3BlcmFUeXBlKCkge1xuICByZXR1cm4gYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuT3BlcmE7XG59O1xuXG52YXIgaXNJRVR5cGUgPSBmdW5jdGlvbiBpc0lFVHlwZSgpIHtcbiAgcmV0dXJuIGJyb3dzZXIubmFtZSA9PT0gQnJvd3NlclR5cGVzLkludGVybmV0RXhwbG9yZXIgfHwgYnJvd3Nlci5uYW1lID09PSBCcm93c2VyVHlwZXMuSWU7XG59O1xuXG52YXIgaXNNSVVJVHlwZSA9IGZ1bmN0aW9uIGlzTUlVSVR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5NSVVJO1xufTtcblxudmFyIGlzU2Ftc3VuZ0Jyb3dzZXJUeXBlID0gZnVuY3Rpb24gaXNTYW1zdW5nQnJvd3NlclR5cGUoKSB7XG4gIHJldHVybiBicm93c2VyLm5hbWUgPT09IEJyb3dzZXJUeXBlcy5TYW1zdW5nQnJvd3Nlcjtcbn07XG5cbnZhciBpc0VsZWN0cm9uVHlwZSA9IGZ1bmN0aW9uIGlzRWxlY3Ryb25UeXBlKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgdmFyIHVhID0gbmF2ICYmIG5hdi51c2VyQWdlbnQgJiYgbmF2LnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdHlwZW9mIHVhID09PSAnc3RyaW5nJyA/IC9lbGVjdHJvbi8udGVzdCh1YSkgOiBmYWxzZTtcbn07XG5cbnZhciBnZXRJT1MxMyA9IGZ1bmN0aW9uIGdldElPUzEzKCkge1xuICB2YXIgbmF2ID0gZ2V0TmF2aWdhdG9ySW5zdGFuY2UoKTtcbiAgcmV0dXJuIG5hdiAmJiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2LnBsYXRmb3JtKSB8fCBuYXYucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMSkgJiYgIXdpbmRvdy5NU1N0cmVhbTtcbn07XG5cbnZhciBnZXRJUGFkMTMgPSBmdW5jdGlvbiBnZXRJUGFkMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQYWQnKTtcbn07XG5cbnZhciBnZXRJcGhvbmUxMyA9IGZ1bmN0aW9uIGdldElwaG9uZTEzKCkge1xuICByZXR1cm4gaXNJT1MxM0NoZWNrKCdpUGhvbmUnKTtcbn07XG5cbnZhciBnZXRJUG9kMTMgPSBmdW5jdGlvbiBnZXRJUG9kMTMoKSB7XG4gIHJldHVybiBpc0lPUzEzQ2hlY2soJ2lQb2QnKTtcbn07XG5cbnZhciBnZXRCcm93c2VyRnVsbFZlcnNpb24gPSBmdW5jdGlvbiBnZXRCcm93c2VyRnVsbFZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLnZlcnNpb24pO1xufTtcblxudmFyIGdldEJyb3dzZXJWZXJzaW9uID0gZnVuY3Rpb24gZ2V0QnJvd3NlclZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhicm93c2VyLm1ham9yKTtcbn07XG5cbnZhciBnZXRPc1ZlcnNpb24gPSBmdW5jdGlvbiBnZXRPc1ZlcnNpb24oKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRPc05hbWUgPSBmdW5jdGlvbiBnZXRPc05hbWUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhvcy5uYW1lKTtcbn07XG5cbnZhciBnZXRCcm93c2VyTmFtZSA9IGZ1bmN0aW9uIGdldEJyb3dzZXJOYW1lKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoYnJvd3Nlci5uYW1lKTtcbn07XG5cbnZhciBnZXRNb2JpbGVWZW5kb3IgPSBmdW5jdGlvbiBnZXRNb2JpbGVWZW5kb3IoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudmVuZG9yKTtcbn07XG5cbnZhciBnZXRNb2JpbGVNb2RlbCA9IGZ1bmN0aW9uIGdldE1vYmlsZU1vZGVsKCkge1xuICByZXR1cm4gc2V0RGVmYXVsdHMoZGV2aWNlLm1vZGVsKTtcbn07XG5cbnZhciBnZXRFbmdpbmVOYW1lID0gZnVuY3Rpb24gZ2V0RW5naW5lTmFtZSgpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS5uYW1lKTtcbn07XG5cbnZhciBnZXRFbmdpbmVWZXJzaW9uID0gZnVuY3Rpb24gZ2V0RW5naW5lVmVyc2lvbigpIHtcbiAgcmV0dXJuIHNldERlZmF1bHRzKGVuZ2luZS52ZXJzaW9uKTtcbn07XG5cbnZhciBnZXRVc2VyYWdlbnQgPSBmdW5jdGlvbiBnZXRVc2VyYWdlbnQoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyh1YSk7XG59O1xuXG52YXIgZ2V0RGV2aWNlVHlwZSA9IGZ1bmN0aW9uIGdldERldmljZVR5cGUoKSB7XG4gIHJldHVybiBzZXREZWZhdWx0cyhkZXZpY2UudHlwZSwgJ2Jyb3dzZXInKTtcbn07XG5cbnZhciBpc1NtYXJ0VFYgPSBpc1NtYXJ0VFZUeXBlKCk7XG52YXIgaXNDb25zb2xlID0gaXNDb25zb2xlVHlwZSgpO1xudmFyIGlzV2VhcmFibGUgPSBpc1dlYXJhYmxlVHlwZSgpO1xudmFyIGlzTW9iaWxlU2FmYXJpID0gaXNNb2JpbGVTYWZhcmlUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWl1bSA9IGlzQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNNb2JpbGUgPSBpc01vYmlsZUFuZFRhYmxldFR5cGUoKSB8fCBnZXRJUGFkMTMoKTtcbnZhciBpc01vYmlsZU9ubHkgPSBpc01vYmlsZVR5cGUoKTtcbnZhciBpc1RhYmxldCA9IGlzVGFibGV0VHlwZSgpIHx8IGdldElQYWQxMygpO1xudmFyIGlzQnJvd3NlciA9IGlzQnJvd3NlclR5cGUoKTtcbnZhciBpc0Rlc2t0b3AgPSBpc0Jyb3dzZXJUeXBlKCk7XG52YXIgaXNBbmRyb2lkID0gaXNBbmRyb2lkVHlwZSgpO1xudmFyIGlzV2luUGhvbmUgPSBpc1dpblBob25lVHlwZSgpO1xudmFyIGlzSU9TID0gaXNJT1NUeXBlKCkgfHwgZ2V0SVBhZDEzKCk7XG52YXIgaXNDaHJvbWUgPSBpc0Nocm9tZVR5cGUoKTtcbnZhciBpc0ZpcmVmb3ggPSBpc0ZpcmVmb3hUeXBlKCk7XG52YXIgaXNTYWZhcmkgPSBpc1NhZmFyaVR5cGUoKTtcbnZhciBpc09wZXJhID0gaXNPcGVyYVR5cGUoKTtcbnZhciBpc0lFID0gaXNJRVR5cGUoKTtcbnZhciBvc1ZlcnNpb24gPSBnZXRPc1ZlcnNpb24oKTtcbnZhciBvc05hbWUgPSBnZXRPc05hbWUoKTtcbnZhciBmdWxsQnJvd3NlclZlcnNpb24gPSBnZXRCcm93c2VyRnVsbFZlcnNpb24oKTtcbnZhciBicm93c2VyVmVyc2lvbiA9IGdldEJyb3dzZXJWZXJzaW9uKCk7XG52YXIgYnJvd3Nlck5hbWUgPSBnZXRCcm93c2VyTmFtZSgpO1xudmFyIG1vYmlsZVZlbmRvciA9IGdldE1vYmlsZVZlbmRvcigpO1xudmFyIG1vYmlsZU1vZGVsID0gZ2V0TW9iaWxlTW9kZWwoKTtcbnZhciBlbmdpbmVOYW1lID0gZ2V0RW5naW5lTmFtZSgpO1xudmFyIGVuZ2luZVZlcnNpb24gPSBnZXRFbmdpbmVWZXJzaW9uKCk7XG52YXIgZ2V0VUEgPSBnZXRVc2VyYWdlbnQoKTtcbnZhciBpc0VkZ2UgPSBpc0VkZ2VUeXBlKCkgfHwgaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNZYW5kZXggPSBpc1lhbmRleFR5cGUoKTtcbnZhciBkZXZpY2VUeXBlID0gZ2V0RGV2aWNlVHlwZSgpO1xudmFyIGlzSU9TMTMgPSBnZXRJT1MxMygpO1xudmFyIGlzSVBhZDEzID0gZ2V0SVBhZDEzKCk7XG52YXIgaXNJUGhvbmUxMyA9IGdldElwaG9uZTEzKCk7XG52YXIgaXNJUG9kMTMgPSBnZXRJUG9kMTMoKTtcbnZhciBpc0VsZWN0cm9uID0gaXNFbGVjdHJvblR5cGUoKTtcbnZhciBpc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtVHlwZSgpO1xudmFyIGlzTGVnYWN5RWRnZSA9IGlzRWRnZVR5cGUoKSAmJiAhaXNFZGdlQ2hyb21pdW1UeXBlKCk7XG52YXIgaXNXaW5kb3dzID0gaXNXaW5kb3dzVHlwZSgpO1xudmFyIGlzTWFjT3MgPSBpc01hY09zVHlwZSgpO1xudmFyIGlzTUlVSSA9IGlzTUlVSVR5cGUoKTtcbnZhciBpc1NhbXN1bmdCcm93c2VyID0gaXNTYW1zdW5nQnJvd3NlclR5cGUoKTtcblxudmFyIEFuZHJvaWRWaWV3ID0gZnVuY3Rpb24gQW5kcm9pZFZpZXcoX3JlZikge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZi52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0FuZHJvaWQgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBCcm93c2VyVmlldyA9IGZ1bmN0aW9uIEJyb3dzZXJWaWV3KF9yZWYyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMi5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYyLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNCcm93c2VyID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgSUVWaWV3ID0gZnVuY3Rpb24gSUVWaWV3KF9yZWYzKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMy5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYzLmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWYzLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYzLnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjMsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJRSA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIElPU1ZpZXcgPSBmdW5jdGlvbiBJT1NWaWV3KF9yZWY0KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmNC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY0LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY0LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjQsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNJT1MgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVWaWV3ID0gZnVuY3Rpb24gTW9iaWxlVmlldyhfcmVmNSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjUucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY1LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzTW9iaWxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgVGFibGV0VmlldyA9IGZ1bmN0aW9uIFRhYmxldFZpZXcoX3JlZjYpIHtcbiAgdmFyIHJlbmRlcldpdGhGcmFnbWVudCA9IF9yZWY2LnJlbmRlcldpdGhGcmFnbWVudCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjYuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjYudmlld0NsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gX3JlZjYuc3R5bGUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNiwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1RhYmxldCA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIFdpblBob25lVmlldyA9IGZ1bmN0aW9uIFdpblBob25lVmlldyhfcmVmNykge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjcucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmNy5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmNy52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmNy5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY3LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzV2luUGhvbmUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBNb2JpbGVPbmx5VmlldyA9IGZ1bmN0aW9uIE1vYmlsZU9ubHlWaWV3KF9yZWY4KSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmOC5yZW5kZXJXaXRoRnJhZ21lbnQsXG4gICAgICBjaGlsZHJlbiA9IF9yZWY4LmNoaWxkcmVuLFxuICAgICAgdmlld0NsYXNzTmFtZSA9IF9yZWY4LnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWY4LnN0eWxlLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjgsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcblxuICByZXR1cm4gaXNNb2JpbGVPbmx5ID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgU21hcnRUVlZpZXcgPSBmdW5jdGlvbiBTbWFydFRWVmlldyhfcmVmOSkge1xuICB2YXIgcmVuZGVyV2l0aEZyYWdtZW50ID0gX3JlZjkucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmOS5jaGlsZHJlbixcbiAgICAgIHZpZXdDbGFzc05hbWUgPSBfcmVmOS52aWV3Q2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBfcmVmOS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY5LCBbXCJyZW5kZXJXaXRoRnJhZ21lbnRcIiwgXCJjaGlsZHJlblwiLCBcInZpZXdDbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG5cbiAgcmV0dXJuIGlzU21hcnRUViA/IHJlbmRlcldpdGhGcmFnbWVudCA/IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKSA6IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogdmlld0NsYXNzTmFtZSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMpLCBjaGlsZHJlbikgOiBudWxsO1xufTtcblxudmFyIENvbnNvbGVWaWV3ID0gZnVuY3Rpb24gQ29uc29sZVZpZXcoX3JlZjEwKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTAucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTAuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEwLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMC5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMCwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc0NvbnNvbGUgPyByZW5kZXJXaXRoRnJhZ21lbnQgPyBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbikgOiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzKSwgY2hpbGRyZW4pIDogbnVsbDtcbn07XG5cbnZhciBXZWFyYWJsZVZpZXcgPSBmdW5jdGlvbiBXZWFyYWJsZVZpZXcoX3JlZjExKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTEucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTEuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjExLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMS5zdHlsZSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYxMSwgW1wicmVuZGVyV2l0aEZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJ2aWV3Q2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuXG4gIHJldHVybiBpc1dlYXJhYmxlID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG52YXIgQ3VzdG9tVmlldyA9IGZ1bmN0aW9uIEN1c3RvbVZpZXcoX3JlZjEyKSB7XG4gIHZhciByZW5kZXJXaXRoRnJhZ21lbnQgPSBfcmVmMTIucmVuZGVyV2l0aEZyYWdtZW50LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMTIuY2hpbGRyZW4sXG4gICAgICB2aWV3Q2xhc3NOYW1lID0gX3JlZjEyLnZpZXdDbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYxMi5zdHlsZSxcbiAgICAgIGNvbmRpdGlvbiA9IF9yZWYxMi5jb25kaXRpb24sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMTIsIFtcInJlbmRlcldpdGhGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwidmlld0NsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY29uZGl0aW9uXCJdKTtcblxuICByZXR1cm4gY29uZGl0aW9uID8gcmVuZGVyV2l0aEZyYWdtZW50ID8gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pIDogUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiB2aWV3Q2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcyksIGNoaWxkcmVuKSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB3aXRoT3JpZW50YXRpb25DaGFuZ2UoV3JhcHBlZENvbXBvbmVudCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKF9jbGFzcywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBfY2xhc3MocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7XG5cbiAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKF9jbGFzcykuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgICAgX3RoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMuaGFuZGxlT3JpZW50YXRpb25DaGFuZ2UuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICBfdGhpcy5vbk9yaWVudGF0aW9uQ2hhbmdlID0gX3RoaXMub25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIF90aGlzLm9uUGFnZUxvYWQgPSBfdGhpcy5vblBhZ2VMb2FkLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgaXNQb3J0cmFpdDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKF9jbGFzcywgW3tcbiAgICAgIGtleTogXCJoYW5kbGVPcmllbnRhdGlvbkNoYW5nZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFdmVudExpc3RlbmVyQWRkZWQpIHtcbiAgICAgICAgICB0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoID4gd2luZG93LmlubmVySGVpZ2h0ID8gOTAgOiAwO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc1BvcnRyYWl0OiBvcmllbnRhdGlvbiA9PT0gMCxcbiAgICAgICAgICBpc0xhbmRzY2FwZTogb3JpZW50YXRpb24gPT09IDkwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvbk9yaWVudGF0aW9uQ2hhbmdlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJvblBhZ2VMb2FkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb25QYWdlTG9hZCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAoKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSAhPT0gdW5kZWZpbmVkICYmIGlzTW9iaWxlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzRXZlbnRMaXN0ZW5lckFkZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9yaWVudGF0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5vblBhZ2VMb2FkLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCB0aGlzLm9uUGFnZUxvYWQsIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICAgIGlzTGFuZHNjYXBlOiB0aGlzLnN0YXRlLmlzTGFuZHNjYXBlLFxuICAgICAgICAgIGlzUG9ydHJhaXQ6IHRoaXMuc3RhdGUuaXNQb3J0cmFpdFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIF9jbGFzcztcbiAgfShSZWFjdF9fZGVmYXVsdC5Db21wb25lbnQpO1xufVxuXG5leHBvcnRzLkFuZHJvaWRWaWV3ID0gQW5kcm9pZFZpZXc7XG5leHBvcnRzLkJyb3dzZXJUeXBlcyA9IEJyb3dzZXJUeXBlcztcbmV4cG9ydHMuQnJvd3NlclZpZXcgPSBCcm93c2VyVmlldztcbmV4cG9ydHMuQ29uc29sZVZpZXcgPSBDb25zb2xlVmlldztcbmV4cG9ydHMuQ3VzdG9tVmlldyA9IEN1c3RvbVZpZXc7XG5leHBvcnRzLklFVmlldyA9IElFVmlldztcbmV4cG9ydHMuSU9TVmlldyA9IElPU1ZpZXc7XG5leHBvcnRzLk1vYmlsZU9ubHlWaWV3ID0gTW9iaWxlT25seVZpZXc7XG5leHBvcnRzLk1vYmlsZVZpZXcgPSBNb2JpbGVWaWV3O1xuZXhwb3J0cy5Pc1R5cGVzID0gT3NUeXBlcztcbmV4cG9ydHMuU21hcnRUVlZpZXcgPSBTbWFydFRWVmlldztcbmV4cG9ydHMuVGFibGV0VmlldyA9IFRhYmxldFZpZXc7XG5leHBvcnRzLldlYXJhYmxlVmlldyA9IFdlYXJhYmxlVmlldztcbmV4cG9ydHMuV2luUGhvbmVWaWV3ID0gV2luUGhvbmVWaWV3O1xuZXhwb3J0cy5icm93c2VyTmFtZSA9IGJyb3dzZXJOYW1lO1xuZXhwb3J0cy5icm93c2VyVmVyc2lvbiA9IGJyb3dzZXJWZXJzaW9uO1xuZXhwb3J0cy5kZXZpY2VEZXRlY3QgPSBkZXZpY2VEZXRlY3Q7XG5leHBvcnRzLmRldmljZVR5cGUgPSBkZXZpY2VUeXBlO1xuZXhwb3J0cy5lbmdpbmVOYW1lID0gZW5naW5lTmFtZTtcbmV4cG9ydHMuZW5naW5lVmVyc2lvbiA9IGVuZ2luZVZlcnNpb247XG5leHBvcnRzLmZ1bGxCcm93c2VyVmVyc2lvbiA9IGZ1bGxCcm93c2VyVmVyc2lvbjtcbmV4cG9ydHMuZ2V0VUEgPSBnZXRVQTtcbmV4cG9ydHMuaXNBbmRyb2lkID0gaXNBbmRyb2lkO1xuZXhwb3J0cy5pc0Jyb3dzZXIgPSBpc0Jyb3dzZXI7XG5leHBvcnRzLmlzQ2hyb21lID0gaXNDaHJvbWU7XG5leHBvcnRzLmlzQ2hyb21pdW0gPSBpc0Nocm9taXVtO1xuZXhwb3J0cy5pc0NvbnNvbGUgPSBpc0NvbnNvbGU7XG5leHBvcnRzLmlzRGVza3RvcCA9IGlzRGVza3RvcDtcbmV4cG9ydHMuaXNFZGdlID0gaXNFZGdlO1xuZXhwb3J0cy5pc0VkZ2VDaHJvbWl1bSA9IGlzRWRnZUNocm9taXVtO1xuZXhwb3J0cy5pc0VsZWN0cm9uID0gaXNFbGVjdHJvbjtcbmV4cG9ydHMuaXNGaXJlZm94ID0gaXNGaXJlZm94O1xuZXhwb3J0cy5pc0lFID0gaXNJRTtcbmV4cG9ydHMuaXNJT1MgPSBpc0lPUztcbmV4cG9ydHMuaXNJT1MxMyA9IGlzSU9TMTM7XG5leHBvcnRzLmlzSVBhZDEzID0gaXNJUGFkMTM7XG5leHBvcnRzLmlzSVBob25lMTMgPSBpc0lQaG9uZTEzO1xuZXhwb3J0cy5pc0lQb2QxMyA9IGlzSVBvZDEzO1xuZXhwb3J0cy5pc0xlZ2FjeUVkZ2UgPSBpc0xlZ2FjeUVkZ2U7XG5leHBvcnRzLmlzTUlVSSA9IGlzTUlVSTtcbmV4cG9ydHMuaXNNYWNPcyA9IGlzTWFjT3M7XG5leHBvcnRzLmlzTW9iaWxlID0gaXNNb2JpbGU7XG5leHBvcnRzLmlzTW9iaWxlT25seSA9IGlzTW9iaWxlT25seTtcbmV4cG9ydHMuaXNNb2JpbGVTYWZhcmkgPSBpc01vYmlsZVNhZmFyaTtcbmV4cG9ydHMuaXNPcGVyYSA9IGlzT3BlcmE7XG5leHBvcnRzLmlzU2FmYXJpID0gaXNTYWZhcmk7XG5leHBvcnRzLmlzU2Ftc3VuZ0Jyb3dzZXIgPSBpc1NhbXN1bmdCcm93c2VyO1xuZXhwb3J0cy5pc1NtYXJ0VFYgPSBpc1NtYXJ0VFY7XG5leHBvcnRzLmlzVGFibGV0ID0gaXNUYWJsZXQ7XG5leHBvcnRzLmlzV2VhcmFibGUgPSBpc1dlYXJhYmxlO1xuZXhwb3J0cy5pc1dpblBob25lID0gaXNXaW5QaG9uZTtcbmV4cG9ydHMuaXNXaW5kb3dzID0gaXNXaW5kb3dzO1xuZXhwb3J0cy5pc1lhbmRleCA9IGlzWWFuZGV4O1xuZXhwb3J0cy5tb2JpbGVNb2RlbCA9IG1vYmlsZU1vZGVsO1xuZXhwb3J0cy5tb2JpbGVWZW5kb3IgPSBtb2JpbGVWZW5kb3I7XG5leHBvcnRzLm9zTmFtZSA9IG9zTmFtZTtcbmV4cG9ydHMub3NWZXJzaW9uID0gb3NWZXJzaW9uO1xuZXhwb3J0cy53aXRoT3JpZW50YXRpb25DaGFuZ2UgPSB3aXRoT3JpZW50YXRpb25DaGFuZ2U7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1677\n')},4889:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_RESULT__;/*!@license\n * UAParser.js v0.7.28\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2021 Faisal Salman \n * Licensed under MIT License\n */\n(function (window, undefined) {\n "use strict";\n\n var LIBVERSION = "0.7.28",\n EMPTY = "",\n UNKNOWN = "?",\n FUNC_TYPE = "function",\n UNDEF_TYPE = "undefined",\n OBJ_TYPE = "object",\n STR_TYPE = "string",\n MAJOR = "major",\n MODEL = "model",\n NAME = "name",\n TYPE = "type",\n VENDOR = "vendor",\n VERSION = "version",\n ARCHITECTURE = "architecture",\n CONSOLE = "console",\n MOBILE = "mobile",\n TABLET = "tablet",\n SMARTTV = "smarttv",\n WEARABLE = "wearable",\n EMBEDDED = "embedded",\n UA_MAX_LENGTH = 255;\n var util = {\n extend: function extend(regexes, extensions) {\n var mergedRegexes = {};\n\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n\n return mergedRegexes;\n },\n has: function has(str1, str2) {\n return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;\n },\n lowerize: function lowerize(str) {\n return str.toLowerCase();\n },\n major: function major(version) {\n return typeof version === STR_TYPE ? version.replace(/[^\\d\\.]/g, "").split(".")[0] : undefined;\n },\n trim: function trim(str, len) {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, "");\n return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n var mapper = {\n rgx: function rgx(ua, arrays) {\n var i = 0,\n j,\n k,\n p,\n q,\n matches,\n match;\n\n while (i < arrays.length && !matches) {\n var regex = arrays[i],\n props = arrays[i + 1];\n j = k = 0;\n\n while (j < regex.length && !matches) {\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n this[q[0]] = q[1].call(this, match);\n } else {\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n\n i += 2;\n }\n },\n str: function str(_str, map) {\n for (var i in map) {\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (util.has(map[i][j], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n } else if (util.has(map[i], _str)) {\n return i === UNKNOWN ? undefined : i;\n }\n }\n\n return _str;\n }\n };\n var maps = {\n browser: {\n oldSafari: {\n version: {\n "1.0": "/8",\n 1.2: "/1",\n 1.3: "/3",\n "2.0": "/412",\n "2.0.2": "/416",\n "2.0.3": "/417",\n "2.0.4": "/419",\n "?": "/"\n }\n },\n oldEdge: {\n version: {\n .1: "12.",\n 21: "13.",\n 31: "14.",\n 39: "15.",\n 41: "16.",\n 42: "17.",\n 44: "18."\n }\n }\n },\n os: {\n windows: {\n version: {\n ME: "4.90",\n "NT 3.11": "NT3.51",\n "NT 4.0": "NT4.0",\n 2e3: "NT 5.0",\n XP: ["NT 5.1", "NT 5.2"],\n Vista: "NT 6.0",\n 7: "NT 6.1",\n 8: "NT 6.2",\n 8.1: "NT 6.3",\n 10: ["NT 6.4", "NT 10.0"],\n RT: "ARM"\n }\n }\n }\n };\n var regexes = {\n browser: [[/\\b(?:crmo|crios)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Chrome"]], [/(?:edge|edgios|edga|edg)\\/([\\w\\.]+)/i], [VERSION, [NAME, "Edge"]], [/(opera\\smini)\\/([\\w\\.-]+)/i, /(opera\\s[mobiletab]{3,6})\\b.+version\\/([\\w\\.-]+)/i, /(opera)(?:.+version\\/|[\\/\\s]+)([\\w\\.]+)/i], [NAME, VERSION], [/opios[\\/\\s]+([\\w\\.]+)/i], [VERSION, [NAME, "Opera Mini"]], [/\\sopr\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera"]], [/(kindle)\\/([\\w\\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i, /(avant\\s|iemobile|slim)(?:browser)?[\\/\\s]?([\\w\\.]*)/i, /(ba?idubrowser)[\\/\\s]?([\\w\\.]+)/i, /(?:ms|\\()(ie)\\s([\\w\\.]+)/i, /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i, /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([\\w\\.]+)/i, /(weibo)__([\\d\\.]+)/i], [NAME, VERSION], [/(?:[\\s\\/]uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i], [VERSION, [NAME, "UCBrowser"]], [/(?:windowswechat)?\\sqbcore\\/([\\w\\.]+)\\b.*(?:windowswechat)?/i], [VERSION, [NAME, "WeChat(Win) Desktop"]], [/micromessenger\\/([\\w\\.]+)/i], [VERSION, [NAME, "WeChat"]], [/konqueror\\/([\\w\\.]+)/i], [VERSION, [NAME, "Konqueror"]], [/trident.+rv[:\\s]([\\w\\.]{1,9})\\b.+like\\sgecko/i], [VERSION, [NAME, "IE"]], [/yabrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Yandex"]], [/(avast|avg)\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Secure Browser"], VERSION], [/focus\\/([\\w\\.]+)/i], [VERSION, [NAME, "Firefox Focus"]], [/opt\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Touch"]], [/coc_coc_browser\\/([\\w\\.]+)/i], [VERSION, [NAME, "Coc Coc"]], [/dolfin\\/([\\w\\.]+)/i], [VERSION, [NAME, "Dolphin"]], [/coast\\/([\\w\\.]+)/i], [VERSION, [NAME, "Opera Coast"]], [/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i], [VERSION, [NAME, "MIUI Browser"]], [/fxios\\/([\\w\\.-]+)/i], [VERSION, [NAME, "Firefox"]], [/(qihu|qhbrowser|qihoobrowser|360browser)/i], [[NAME, "360 Browser"]], [/(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i], [[NAME, /(.+)/, "$1 Browser"], VERSION], [/(comodo_dragon)\\/([\\w\\.]+)/i], [[NAME, /_/g, " "], VERSION], [/\\s(electron)\\/([\\w\\.]+)\\ssafari/i, /(tesla)(?:\\sqtcarbrowser|\\/(20[12]\\d\\.[\\w\\.-]+))/i, /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/\\s]?([\\w\\.]+)/i], [NAME, VERSION], [/(MetaSr)[\\/\\s]?([\\w\\.]+)/i, /(LBBROWSER)/i], [NAME], [/;fbav\\/([\\w\\.]+);/i], [VERSION, [NAME, "Facebook"]], [/FBAN\\/FBIOS|FB_IAB\\/FB4A/i], [[NAME, "Facebook"]], [/safari\\s(line)\\/([\\w\\.]+)/i, /\\b(line)\\/([\\w\\.]+)\\/iab/i, /(chromium|instagram)[\\/\\s]([\\w\\.-]+)/i], [NAME, VERSION], [/\\bgsa\\/([\\w\\.]+)\\s.*safari\\//i], [VERSION, [NAME, "GSA"]], [/headlesschrome(?:\\/([\\w\\.]+)|\\s)/i], [VERSION, [NAME, "Chrome Headless"]], [/\\swv\\).+(chrome)\\/([\\w\\.]+)/i], [[NAME, "Chrome WebView"], VERSION], [/droid.+\\sversion\\/([\\w\\.]+)\\b.+(?:mobile\\ssafari|safari)/i], [VERSION, [NAME, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i], [NAME, VERSION], [/version\\/([\\w\\.]+)\\s.*mobile\\/\\w+\\s(safari)/i], [VERSION, [NAME, "Mobile Safari"]], [/version\\/([\\w\\.]+)\\s.*(mobile\\s?safari|safari)/i], [VERSION, NAME], [/webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [/(webkit|khtml)\\/([\\w\\.]+)/i], [NAME, VERSION], [/(navigator|netscape)\\/([\\w\\.-]+)/i], [[NAME, "Netscape"], VERSION], [/ile\\svr;\\srv:([\\w\\.]+)\\).+firefox/i], [VERSION, [NAME, "Firefox Reality"]], [/ekiohf.+(flow)\\/([\\w\\.]+)/i, /(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i, /(firefox)\\/([\\w\\.]+)\\s[\\w\\s\\-]+\\/[\\w\\.]+$/i, /(mozilla)\\/([\\w\\.]+)\\s.+rv\\:.+gecko\\/\\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i, /(links)\\s\\(([\\w\\.]+)/i, /(gobrowser)\\/?([\\w\\.]*)/i, /(ice\\s?browser)\\/v?([\\w\\._]+)/i, /(mosaic)[\\/\\s]([\\w\\.]+)/i], [NAME, VERSION]],\n cpu: [[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i], [[ARCHITECTURE, "amd64"]], [/(ia32(?=;))/i], [[ARCHITECTURE, util.lowerize]], [/((?:i[346]|x)86)[;\\)]/i], [[ARCHITECTURE, "ia32"]], [/\\b(aarch64|armv?8e?l?)\\b/i], [[ARCHITECTURE, "arm64"]], [/\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i], [[ARCHITECTURE, "armhf"]], [/windows\\s(ce|mobile);\\sppc;/i], [[ARCHITECTURE, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i], [[ARCHITECTURE, /ower/, "", util.lowerize]], [/(sun4\\w)[;\\)]/i], [[ARCHITECTURE, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i], [[ARCHITECTURE, util.lowerize]]],\n device: [[/\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus\\s10)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, TABLET]], [/\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy\\snexus)/i, /\\ssamsung[\\s-]([\\w-]+)/i, /sec-(sgh\\w+)/i], [MODEL, [VENDOR, "Samsung"], [TYPE, MOBILE]], [/\\((ip(?:hone|od)[\\s\\w]*);/i], [MODEL, [VENDOR, "Apple"], [TYPE, MOBILE]], [/\\((ipad);[\\w\\s\\),;-]+apple/i, /applecoremedia\\/[\\w\\.]+\\s\\((ipad)/i, /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i], [MODEL, [VENDOR, "Apple"], [TYPE, TABLET]], [/\\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\\d{2})/i], [MODEL, [VENDOR, "Huawei"], [TYPE, TABLET]], [/d\\/huawei([\\w\\s-]+)[;\\)]/i, /\\b(nexus\\s6p|vog-[at]?l\\d\\d|ane-[at]?l[x\\d]\\d|eml-a?l\\d\\da?|lya-[at]?l\\d[\\dc]|clt-a?l\\d\\di?|ele-l\\d\\d)/i, /\\b(\\w{2,4}-[atu][ln][01259][019])[;\\)\\s]/i], [MODEL, [VENDOR, "Huawei"], [TYPE, MOBILE]], [/\\b(poco[\\s\\w]+)(?:\\sbuild|\\))/i, /\\b;\\s(\\w+)\\sbuild\\/hm\\1/i, /\\b(hm[\\s\\-_]?note?[\\s_]?(?:\\d\\w)?)\\sbuild/i, /\\b(redmi[\\s\\-_]?(?:note|k)?[\\w\\s_]+)(?:\\sbuild|\\))/i, /\\b(mi[\\s\\-_]?(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]?(?:\\d?\\w?)[\\s_]?(?:plus)?)\\sbuild/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, MOBILE]], [/\\b(mi[\\s\\-_]?(?:pad)(?:[\\w\\s_]+))(?:\\sbuild|\\))/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, TABLET]], [/;\\s(\\w+)\\sbuild.+\\soppo/i, /\\s(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i], [MODEL, [VENDOR, "OPPO"], [TYPE, MOBILE]], [/\\svivo\\s(\\w+)(?:\\sbuild|\\))/i, /\\s(v[12]\\d{3}\\w?[at])(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]], [/\\s(rmx[12]\\d{3})(?:\\sbuild|;)/i], [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]], [/\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)\\b[\\w\\s]+build\\//i, /\\smot(?:orola)?[\\s-](\\w*)/i, /((?:moto[\\s\\w\\(\\)]+|xt\\d{3,4}|nexus\\s6)(?=\\sbuild|\\)))/i], [MODEL, [VENDOR, "Motorola"], [TYPE, MOBILE]], [/\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i], [MODEL, [VENDOR, "Motorola"], [TYPE, TABLET]], [/((?=lg)?[vl]k\\-?\\d{3})\\sbuild|\\s3\\.[\\s\\w;-]{10}lg?-([06cv9]{3,4})/i], [MODEL, [VENDOR, "LG"], [TYPE, TABLET]], [/(lm-?f100[nv]?|nexus\\s[45])/i, /lg[e;\\s\\/-]+((?!browser|netcast)\\w+)/i, /\\blg(\\-?[\\d\\w]+)\\sbuild/i], [MODEL, [VENDOR, "LG"], [TYPE, MOBILE]], [/(ideatab[\\w\\-\\s]+)/i, /lenovo\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+)|yt[\\d\\w-]{6}|tb[\\d\\w-]{6})/i], [MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET]], [/(?:maemo|nokia).*(n900|lumia\\s\\d+)/i, /nokia[\\s_-]?([\\w\\.-]*)/i], [[MODEL, /_/g, " "], [VENDOR, "Nokia"], [TYPE, MOBILE]], [/droid.+;\\s(pixel\\sc)[\\s)]/i], [MODEL, [VENDOR, "Google"], [TYPE, TABLET]], [/droid.+;\\s(pixel[\\s\\daxl]{0,6})(?:\\sbuild|\\))/i], [MODEL, [VENDOR, "Google"], [TYPE, MOBILE]], [/droid.+\\s([c-g]\\d{4}|so[-l]\\w+|xq-a\\w[4-7][12])(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i], [MODEL, [VENDOR, "Sony"], [TYPE, MOBILE]], [/sony\\stablet\\s[ps]\\sbuild\\//i, /(?:sony)?sgp\\w+(?:\\sbuild\\/|\\))/i], [[MODEL, "Xperia Tablet"], [VENDOR, "Sony"], [TYPE, TABLET]], [/\\s(kb2005|in20[12]5|be20[12][59])\\b/i, /\\ba000(1)\\sbuild/i, /\\boneplus\\s(a\\d{4})[\\s)]/i], [MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE]], [/(alexa)webm/i, /(kf[a-z]{2}wi)(\\sbuild\\/|\\))/i, /(kf[a-z]+)(\\sbuild\\/|\\)).+silk\\//i], [MODEL, [VENDOR, "Amazon"], [TYPE, TABLET]], [/(sd|kf)[0349hijorstuw]+(\\sbuild\\/|\\)).+silk\\//i], [[MODEL, "Fire Phone"], [VENDOR, "Amazon"], [TYPE, MOBILE]], [/\\((playbook);[\\w\\s\\),;-]+(rim)/i], [MODEL, VENDOR, [TYPE, TABLET]], [/((?:bb[a-f]|st[hv])100-\\d)/i, /\\(bb10;\\s(\\w+)/i], [MODEL, [VENDOR, "BlackBerry"], [TYPE, MOBILE]], [/(?:\\b|asus_)(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus\\s7|padfone|p00[cj])/i], [MODEL, [VENDOR, "ASUS"], [TYPE, TABLET]], [/\\s(z[es]6[027][01][km][ls]|zenfone\\s\\d\\w?)\\b/i], [MODEL, [VENDOR, "ASUS"], [TYPE, MOBILE]], [/(nexus\\s9)/i], [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]], [/(htc)[;_\\s-]{1,2}([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i, /(zte)-(\\w*)/i, /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i], [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]], [/droid[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i], [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]], [/droid.+;\\s(m[1-5]\\snote)\\sbuild/i, /\\bmz-([\\w-]{2,})/i], [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]], [/(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i, /(hp)\\s([\\w\\s]+\\w)/i, /(asus)-?(\\w+)/i, /(microsoft);\\s(lumia[\\s\\w]+)/i, /(lenovo)[_\\s-]?([\\w-]+)/i, /linux;.+(jolla);/i, /droid.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(archos)\\s(gamepad2?)/i, /(hp).+(touchpad(?!.+tablet)|tablet)/i, /(kindle)\\/([\\w\\.]+)/i, /\\s(nook)[\\w\\s]+build\\/(\\w+)/i, /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i, /[;\\/]\\s?(le[\\s\\-]+pan)[\\s\\-]+(\\w{1,9})\\sbuild/i, /[;\\/]\\s?(trinity)[\\-\\s]*(t\\d{3})\\sbuild/i, /\\b(gigaset)[\\s\\-]+(q\\w{1,9})\\sbuild/i, /\\b(vodafone)\\s([\\w\\s]+)(?:\\)|\\sbuild)/i], [VENDOR, MODEL, [TYPE, TABLET]], [/\\s(surface\\sduo)\\s/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(fp\\du?)\\sbuild/i], [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]], [/\\s(u304aa)\\sbuild/i], [MODEL, [VENDOR, "AT&T"], [TYPE, MOBILE]], [/sie-(\\w*)/i], [MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE]], [/[;\\/]\\s?(rct\\w+)\\sbuild/i], [MODEL, [VENDOR, "RCA"], [TYPE, TABLET]], [/[;\\/\\s](venue[\\d\\s]{2,7})\\sbuild/i], [MODEL, [VENDOR, "Dell"], [TYPE, TABLET]], [/[;\\/]\\s?(q(?:mv|ta)\\w+)\\sbuild/i], [MODEL, [VENDOR, "Verizon"], [TYPE, TABLET]], [/[;\\/]\\s(?:barnes[&\\s]+noble\\s|bn[rt])([\\w\\s\\+]*)\\sbuild/i], [MODEL, [VENDOR, "Barnes & Noble"], [TYPE, TABLET]], [/[;\\/]\\s(tm\\d{3}\\w+)\\sbuild/i], [MODEL, [VENDOR, "NuVision"], [TYPE, TABLET]], [/;\\s(k88)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, TABLET]], [/;\\s(nx\\d{3}j)\\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, MOBILE]], [/[;\\/]\\s?(gen\\d{3})\\sbuild.*49h/i], [MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE]], [/[;\\/]\\s?(zur\\d{3})\\sbuild/i], [MODEL, [VENDOR, "Swiss"], [TYPE, TABLET]], [/[;\\/]\\s?((zeki)?tb.*\\b)\\sbuild/i], [MODEL, [VENDOR, "Zeki"], [TYPE, TABLET]], [/[;\\/]\\s([yr]\\d{2})\\sbuild/i, /[;\\/]\\s(dragon[\\-\\s]+touch\\s|dt)(\\w{5})\\sbuild/i], [[VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET]], [/[;\\/]\\s?(ns-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "Insignia"], [TYPE, TABLET]], [/[;\\/]\\s?((nxa|Next)-?\\w{0,9})\\sbuild/i], [MODEL, [VENDOR, "NextBook"], [TYPE, TABLET]], [/[;\\/]\\s?(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05]))\\sbuild/i], [[VENDOR, "Voice"], MODEL, [TYPE, MOBILE]], [/[;\\/]\\s?(lvtel\\-)?(v1[12])\\sbuild/i], [[VENDOR, "LvTel"], MODEL, [TYPE, MOBILE]], [/;\\s(ph-1)\\s/i], [MODEL, [VENDOR, "Essential"], [TYPE, MOBILE]], [/[;\\/]\\s?(v(100md|700na|7011|917g).*\\b)\\sbuild/i], [MODEL, [VENDOR, "Envizen"], [TYPE, TABLET]], [/[;\\/]\\s?(trio[\\s\\w\\-\\.]+)\\sbuild/i], [MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET]], [/[;\\/]\\s?tu_(1491)\\sbuild/i], [MODEL, [VENDOR, "Rotor"], [TYPE, TABLET]], [/(shield[\\w\\s]+)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, TABLET]], [/(sprint)\\s(\\w+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kin\\.[onetw]{3})/i], [[MODEL, /\\./g, " "], [VENDOR, "Microsoft"], [TYPE, MOBILE]], [/droid\\s[\\d\\.]+;\\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, TABLET]], [/droid\\s[\\d\\.]+;\\s(ec30|ps20|tc[2-8]\\d[kx])\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, MOBILE]], [/\\s(ouya)\\s/i, /(nintendo)\\s([wids3utch]+)/i], [VENDOR, MODEL, [TYPE, CONSOLE]], [/droid.+;\\s(shield)\\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, CONSOLE]], [/(playstation\\s[345portablevi]+)/i], [MODEL, [VENDOR, "Sony"], [TYPE, CONSOLE]], [/[\\s\\(;](xbox(?:\\sone)?(?!;\\sxbox))[\\s\\);]/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, CONSOLE]], [/smart-tv.+(samsung)/i], [VENDOR, [TYPE, SMARTTV]], [/hbbtv.+maple;(\\d+)/i], [[MODEL, /^/, "SmartTV"], [VENDOR, "Samsung"], [TYPE, SMARTTV]], [/(?:linux;\\snetcast.+smarttv|lg\\snetcast\\.tv-201\\d)/i], [[VENDOR, "LG"], [TYPE, SMARTTV]], [/(apple)\\s?tv/i], [VENDOR, [MODEL, "Apple TV"], [TYPE, SMARTTV]], [/crkey/i], [[MODEL, "Chromecast"], [VENDOR, "Google"], [TYPE, SMARTTV]], [/droid.+aft([\\w])(\\sbuild\\/|\\))/i], [MODEL, [VENDOR, "Amazon"], [TYPE, SMARTTV]], [/\\(dtv[\\);].+(aquos)/i], [MODEL, [VENDOR, "Sharp"], [TYPE, SMARTTV]], [/hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [/[\\s\\/\\(](android\\s|smart[-\\s]?|opera\\s)tv[;\\)\\s]/i], [[TYPE, SMARTTV]], [/((pebble))app\\/[\\d\\.]+\\s/i], [VENDOR, MODEL, [TYPE, WEARABLE]], [/droid.+;\\s(glass)\\s\\d/i], [MODEL, [VENDOR, "Google"], [TYPE, WEARABLE]], [/droid\\s[\\d\\.]+;\\s(wt63?0{2,3})\\)/i], [MODEL, [VENDOR, "Zebra"], [TYPE, WEARABLE]], [/(tesla)(?:\\sqtcarbrowser|\\/20[12]\\d\\.[\\w\\.-]+)/i], [VENDOR, [TYPE, EMBEDDED]], [/droid .+?; ([^;]+?)(?: build|\\) applewebkit).+? mobile safari/i], [MODEL, [TYPE, MOBILE]], [/droid .+?;\\s([^;]+?)(?: build|\\) applewebkit).+?(?! mobile) safari/i], [MODEL, [TYPE, TABLET]], [/\\s(tablet|tab)[;\\/]/i, /\\s(mobile)(?:[;\\/]|\\ssafari)/i], [[TYPE, util.lowerize]], [/(android[\\w\\.\\s\\-]{0,9});.+build/i], [MODEL, [VENDOR, "Generic"]], [/(phone)/i], [[TYPE, MOBILE]]],\n engine: [[/windows.+\\sedge\\/([\\w\\.]+)/i], [VERSION, [NAME, "EdgeHTML"]], [/webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i], [VERSION, [NAME, "Blink"]], [/(presto)\\/([\\w\\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, /ekioh(flow)\\/([\\w\\.]+)/i, /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i, /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i], [NAME, VERSION], [/rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i], [VERSION, NAME]],\n os: [[/microsoft\\s(windows)\\s(vista|xp)/i], [NAME, VERSION], [/(windows)\\snt\\s6\\.2;\\s(arm)/i, /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i, /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)(?!.+xbox)/i], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [/(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i], [[NAME, "Windows"], [VERSION, mapper.str, maps.os.windows.version]], [/ip[honead]{2,4}\\b(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i, /cfnetwork\\/.+darwin/i], [[VERSION, /_/g, "."], [NAME, "iOS"]], [/(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i, /(macintosh|mac(?=_powerpc)\\s)(?!.+haiku)/i], [[NAME, "Mac OS"], [VERSION, /_/g, "."]], [/(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i, /(blackberry)\\w*\\/([\\w\\.]*)/i, /(tizen|kaios)[\\/\\s]([\\w\\.]+)/i, /\\((series40);/i], [NAME, VERSION], [/\\(bb(10);/i], [VERSION, [NAME, "BlackBerry"]], [/(?:symbian\\s?os|symbos|s60(?=;)|series60)[\\/\\s-]?([\\w\\.]*)/i], [VERSION, [NAME, "Symbian"]], [/mozilla.+\\(mobile;.+gecko.+firefox/i], [[NAME, "Firefox OS"]], [/web0s;.+rt(tv)/i, /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i], [VERSION, [NAME, "webOS"]], [/crkey\\/([\\d\\.]+)/i], [VERSION, [NAME, "Chromecast"]], [/(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i], [[NAME, "Chromium OS"], VERSION], [/(nintendo|playstation)\\s([wids345portablevuch]+)/i, /(xbox);\\s+xbox\\s([^\\);]+)/i, /(mint)[\\/\\s\\(\\)]?(\\w*)/i, /(mageia|vectorlinux)[;\\s]/i, /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\\sgnu\\/linux)?(?:\\slinux)?[\\/\\s-]?(?!chrom|package)([\\w\\.-]*)/i, /(hurd|linux)\\s?([\\w\\.]*)/i, /(gnu)\\s?([\\w\\.]*)/i, /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, /(haiku)\\s(\\w+)/i], [NAME, VERSION], [/(sunos)\\s?([\\w\\.\\d]*)/i], [[NAME, "Solaris"], VERSION], [/((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i, /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i, /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i, /(unix)\\s?([\\w\\.]*)/i], [NAME, VERSION]]\n };\n\n var UAParser = function UAParser(ua, extensions) {\n if (typeof ua === "object") {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || (typeof window !== "undefined" && window.navigator && window.navigator.userAgent ? window.navigator.userAgent : EMPTY);\n\n var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_browser, _ua, _rgxmap.browser);\n _browser.major = util.major(_browser.version);\n return _browser;\n };\n\n this.getCPU = function () {\n var _cpu = {\n architecture: undefined\n };\n mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n\n this.getDevice = function () {\n var _device = {\n vendor: undefined,\n model: undefined,\n type: undefined\n };\n mapper.rgx.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n\n this.getEngine = function () {\n var _engine = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n\n this.getOS = function () {\n var _os = {\n name: undefined,\n version: undefined\n };\n mapper.rgx.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n\n this.getResult = function () {\n return {\n ua: this.getUA(),\n browser: this.getBrowser(),\n engine: this.getEngine(),\n os: this.getOS(),\n device: this.getDevice(),\n cpu: this.getCPU()\n };\n };\n\n this.getUA = function () {\n return _ua;\n };\n\n this.setUA = function (ua) {\n _ua = typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH ? util.trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = {\n NAME: NAME,\n MAJOR: MAJOR,\n VERSION: VERSION\n };\n UAParser.CPU = {\n ARCHITECTURE: ARCHITECTURE\n };\n UAParser.DEVICE = {\n MODEL: MODEL,\n VENDOR: VENDOR,\n TYPE: TYPE,\n CONSOLE: CONSOLE,\n MOBILE: MOBILE,\n SMARTTV: SMARTTV,\n TABLET: TABLET,\n WEARABLE: WEARABLE,\n EMBEDDED: EMBEDDED\n };\n UAParser.ENGINE = {\n NAME: NAME,\n VERSION: VERSION\n };\n UAParser.OS = {\n NAME: NAME,\n VERSION: VERSION\n };\n\n if (typeof exports !== UNDEF_TYPE) {\n if ("object" !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n\n exports.UAParser = UAParser;\n } else {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return UAParser;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n }\n\n var $ = typeof window !== "undefined" && (window.jQuery || window.Zepto);\n\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n\n $.ua.get = function () {\n return parser.getUA();\n };\n\n $.ua.set = function (uastring) {\n parser.setUA(uastring);\n var result = parser.getResult();\n\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n})(typeof window === "object" ? window : this);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91YS1wYXJzZXItanMvZGlzdC91YS1wYXJzZXIubWluLmpzP2QxMjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQ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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLFFBQWE7QUFDckI7QUFDQTs7QUFFQSxJQUFJLGdCQUFnQjtBQUNwQixHQUFHO0FBQ0gsUUFBUSxJQUEwQztBQUNsRCxNQUFNLG1DQUFPO0FBQ2I7QUFDQSxPQUFPO0FBQUEsa0dBQUM7QUFDUixLQUFLLE1BQU0sRUFFTjtBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6IjQ4ODkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFAbGljZW5zZVxuICogVUFQYXJzZXIuanMgdjAuNy4yOFxuICogTGlnaHR3ZWlnaHQgSmF2YVNjcmlwdC1iYXNlZCBVc2VyLUFnZW50IHN0cmluZyBwYXJzZXJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWlzYWxtYW4vdWEtcGFyc2VyLWpzXG4gKlxuICogQ29weXJpZ2h0IMKpIDIwMTItMjAyMSBGYWlzYWwgU2FsbWFuIDxmQGZhaXNhbG1hbi5jb20+XG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgTGljZW5zZVxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgdW5kZWZpbmVkKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBMSUJWRVJTSU9OID0gXCIwLjcuMjhcIixcbiAgICAgIEVNUFRZID0gXCJcIixcbiAgICAgIFVOS05PV04gPSBcIj9cIixcbiAgICAgIEZVTkNfVFlQRSA9IFwiZnVuY3Rpb25cIixcbiAgICAgIFVOREVGX1RZUEUgPSBcInVuZGVmaW5lZFwiLFxuICAgICAgT0JKX1RZUEUgPSBcIm9iamVjdFwiLFxuICAgICAgU1RSX1RZUEUgPSBcInN0cmluZ1wiLFxuICAgICAgTUFKT1IgPSBcIm1ham9yXCIsXG4gICAgICBNT0RFTCA9IFwibW9kZWxcIixcbiAgICAgIE5BTUUgPSBcIm5hbWVcIixcbiAgICAgIFRZUEUgPSBcInR5cGVcIixcbiAgICAgIFZFTkRPUiA9IFwidmVuZG9yXCIsXG4gICAgICBWRVJTSU9OID0gXCJ2ZXJzaW9uXCIsXG4gICAgICBBUkNISVRFQ1RVUkUgPSBcImFyY2hpdGVjdHVyZVwiLFxuICAgICAgQ09OU09MRSA9IFwiY29uc29sZVwiLFxuICAgICAgTU9CSUxFID0gXCJtb2JpbGVcIixcbiAgICAgIFRBQkxFVCA9IFwidGFibGV0XCIsXG4gICAgICBTTUFSVFRWID0gXCJzbWFydHR2XCIsXG4gICAgICBXRUFSQUJMRSA9IFwid2VhcmFibGVcIixcbiAgICAgIEVNQkVEREVEID0gXCJlbWJlZGRlZFwiLFxuICAgICAgVUFfTUFYX0xFTkdUSCA9IDI1NTtcbiAgdmFyIHV0aWwgPSB7XG4gICAgZXh0ZW5kOiBmdW5jdGlvbiBleHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykge1xuICAgICAgdmFyIG1lcmdlZFJlZ2V4ZXMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiByZWdleGVzKSB7XG4gICAgICAgIGlmIChleHRlbnNpb25zW2ldICYmIGV4dGVuc2lvbnNbaV0ubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICAgIG1lcmdlZFJlZ2V4ZXNbaV0gPSBleHRlbnNpb25zW2ldLmNvbmNhdChyZWdleGVzW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXJnZWRSZWdleGVzW2ldID0gcmVnZXhlc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUmVnZXhlcztcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKHN0cjEsIHN0cjIpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygc3RyMSA9PT0gU1RSX1RZUEUgPyBzdHIyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzdHIxLnRvTG93ZXJDYXNlKCkpICE9PSAtMSA6IGZhbHNlO1xuICAgIH0sXG4gICAgbG93ZXJpemU6IGZ1bmN0aW9uIGxvd2VyaXplKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH0sXG4gICAgbWFqb3I6IGZ1bmN0aW9uIG1ham9yKHZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gU1RSX1RZUEUgPyB2ZXJzaW9uLnJlcGxhY2UoL1teXFxkXFwuXS9nLCBcIlwiKS5zcGxpdChcIi5cIilbMF0gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICB0cmltOiBmdW5jdGlvbiB0cmltKHN0ciwgbGVuKSB7XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHR5cGVvZiBsZW4gPT09IFVOREVGX1RZUEUgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKDAsIFVBX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHBlciA9IHtcbiAgICByZ3g6IGZ1bmN0aW9uIHJneCh1YSwgYXJyYXlzKSB7XG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgaixcbiAgICAgICAgICBrLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgcSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIG1hdGNoO1xuXG4gICAgICB3aGlsZSAoaSA8IGFycmF5cy5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgdmFyIHJlZ2V4ID0gYXJyYXlzW2ldLFxuICAgICAgICAgICAgcHJvcHMgPSBhcnJheXNbaSArIDFdO1xuICAgICAgICBqID0gayA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCByZWdleC5sZW5ndGggJiYgIW1hdGNoZXMpIHtcbiAgICAgICAgICBtYXRjaGVzID0gcmVnZXhbaisrXS5leGVjKHVhKTtcblxuICAgICAgICAgIGlmICghIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbKytrXTtcbiAgICAgICAgICAgICAgcSA9IHByb3BzW3BdO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgcSA9PT0gT0JKX1RZUEUgJiYgcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PSBGVU5DX1RZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IHFbMV0uY2FsbCh0aGlzLCBtYXRjaCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PT0gRlVOQ19UWVBFICYmICEocVsxXS5leGVjICYmIHFbMV0udGVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1txWzBdXSA9IG1hdGNoID8gcVsxXS5jYWxsKHRoaXMsIG1hdGNoLCBxWzJdKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcVswXV0gPSBtYXRjaCA/IG1hdGNoLnJlcGxhY2UocVsxXSwgcVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzNdLmNhbGwodGhpcywgbWF0Y2gucmVwbGFjZShxWzFdLCBxWzJdKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbcV0gPSBtYXRjaCA/IG1hdGNoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAyO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RyOiBmdW5jdGlvbiBzdHIoX3N0ciwgbWFwKSB7XG4gICAgICBmb3IgKHZhciBpIGluIG1hcCkge1xuICAgICAgICBpZiAodHlwZW9mIG1hcFtpXSA9PT0gT0JKX1RZUEUgJiYgbWFwW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcFtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHV0aWwuaGFzKG1hcFtpXVtqXSwgX3N0cikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmhhcyhtYXBbaV0sIF9zdHIpKSB7XG4gICAgICAgICAgcmV0dXJuIGkgPT09IFVOS05PV04gPyB1bmRlZmluZWQgOiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfc3RyO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1hcHMgPSB7XG4gICAgYnJvd3Nlcjoge1xuICAgICAgb2xkU2FmYXJpOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICBcIjEuMFwiOiBcIi84XCIsXG4gICAgICAgICAgMS4yOiBcIi8xXCIsXG4gICAgICAgICAgMS4zOiBcIi8zXCIsXG4gICAgICAgICAgXCIyLjBcIjogXCIvNDEyXCIsXG4gICAgICAgICAgXCIyLjAuMlwiOiBcIi80MTZcIixcbiAgICAgICAgICBcIjIuMC4zXCI6IFwiLzQxN1wiLFxuICAgICAgICAgIFwiMi4wLjRcIjogXCIvNDE5XCIsXG4gICAgICAgICAgXCI/XCI6IFwiL1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbGRFZGdlOiB7XG4gICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAuMTogXCIxMi5cIixcbiAgICAgICAgICAyMTogXCIxMy5cIixcbiAgICAgICAgICAzMTogXCIxNC5cIixcbiAgICAgICAgICAzOTogXCIxNS5cIixcbiAgICAgICAgICA0MTogXCIxNi5cIixcbiAgICAgICAgICA0MjogXCIxNy5cIixcbiAgICAgICAgICA0NDogXCIxOC5cIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBvczoge1xuICAgICAgd2luZG93czoge1xuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgTUU6IFwiNC45MFwiLFxuICAgICAgICAgIFwiTlQgMy4xMVwiOiBcIk5UMy41MVwiLFxuICAgICAgICAgIFwiTlQgNC4wXCI6IFwiTlQ0LjBcIixcbiAgICAgICAgICAyZTM6IFwiTlQgNS4wXCIsXG4gICAgICAgICAgWFA6IFtcIk5UIDUuMVwiLCBcIk5UIDUuMlwiXSxcbiAgICAgICAgICBWaXN0YTogXCJOVCA2LjBcIixcbiAgICAgICAgICA3OiBcIk5UIDYuMVwiLFxuICAgICAgICAgIDg6IFwiTlQgNi4yXCIsXG4gICAgICAgICAgOC4xOiBcIk5UIDYuM1wiLFxuICAgICAgICAgIDEwOiBbXCJOVCA2LjRcIiwgXCJOVCAxMC4wXCJdLFxuICAgICAgICAgIFJUOiBcIkFSTVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciByZWdleGVzID0ge1xuICAgIGJyb3dzZXI6IFtbL1xcYig/OmNybW98Y3Jpb3MpXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDaHJvbWVcIl1dLCBbLyg/OmVkZ2V8ZWRnaW9zfGVkZ2F8ZWRnKVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZVwiXV0sIFsvKG9wZXJhXFxzbWluaSlcXC8oW1xcd1xcLi1dKykvaSwgLyhvcGVyYVxcc1ttb2JpbGV0YWJdezMsNn0pXFxiLit2ZXJzaW9uXFwvKFtcXHdcXC4tXSspL2ksIC8ob3BlcmEpKD86Lit2ZXJzaW9uXFwvfFtcXC9cXHNdKykoW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL29waW9zW1xcL1xcc10rKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBNaW5pXCJdXSwgWy9cXHNvcHJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk9wZXJhXCJdXSwgWy8oa2luZGxlKVxcLyhbXFx3XFwuXSspL2ksIC8obHVuYXNjYXBlfG1heHRob258bmV0ZnJvbnR8amFzbWluZXxibGF6ZXIpW1xcL1xcc10/KFtcXHdcXC5dKikvaSwgLyhhdmFudFxcc3xpZW1vYmlsZXxzbGltKSg/OmJyb3dzZXIpP1tcXC9cXHNdPyhbXFx3XFwuXSopL2ksIC8oYmE/aWR1YnJvd3NlcilbXFwvXFxzXT8oW1xcd1xcLl0rKS9pLCAvKD86bXN8XFwoKShpZSlcXHMoW1xcd1xcLl0rKS9pLCAvKGZsb2NrfHJvY2ttZWx0fG1pZG9yaXxlcGlwaGFueXxzaWxrfHNreWZpcmV8b3ZpYnJvd3Nlcnxib2x0fGlyb258dml2YWxkaXxpcmlkaXVtfHBoYW50b21qc3xib3dzZXJ8cXVhcmt8cXVwemlsbGF8ZmFsa29uKVxcLyhbXFx3XFwuLV0rKS9pLCAvKHJla29ucXxwdWZmaW58YnJhdmV8d2hhbGV8cXFicm93c2VybGl0ZXxxcSlcXC8oW1xcd1xcLl0rKS9pLCAvKHdlaWJvKV9fKFtcXGRcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oPzpbXFxzXFwvXXVjP1xccz9icm93c2VyfCg/Omp1Yy4rKXVjd2ViKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiVUNCcm93c2VyXCJdXSwgWy8oPzp3aW5kb3dzd2VjaGF0KT9cXHNxYmNvcmVcXC8oW1xcd1xcLl0rKVxcYi4qKD86d2luZG93c3dlY2hhdCk/L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiV2VDaGF0KFdpbikgRGVza3RvcFwiXV0sIFsvbWljcm9tZXNzZW5nZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIldlQ2hhdFwiXV0sIFsva29ucXVlcm9yXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJLb25xdWVyb3JcIl1dLCBbL3RyaWRlbnQuK3J2WzpcXHNdKFtcXHdcXC5dezEsOX0pXFxiLitsaWtlXFxzZ2Vja28vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJJRVwiXV0sIFsveWFicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJZYW5kZXhcIl1dLCBbLyhhdmFzdHxhdmcpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIFNlY3VyZSBCcm93c2VyXCJdLCBWRVJTSU9OXSwgWy9mb2N1c1xcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmlyZWZveCBGb2N1c1wiXV0sIFsvb3B0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBUb3VjaFwiXV0sIFsvY29jX2NvY19icm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJDb2MgQ29jXCJdXSwgWy9kb2xmaW5cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkRvbHBoaW5cIl1dLCBbL2NvYXN0XFwvKFtcXHdcXC5dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJPcGVyYSBDb2FzdFwiXV0sIFsveGlhb21pXFwvbWl1aWJyb3dzZXJcXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIk1JVUkgQnJvd3NlclwiXV0sIFsvZnhpb3NcXC8oW1xcd1xcLi1dKykvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJGaXJlZm94XCJdXSwgWy8ocWlodXxxaGJyb3dzZXJ8cWlob29icm93c2VyfDM2MGJyb3dzZXIpL2ldLCBbW05BTUUsIFwiMzYwIEJyb3dzZXJcIl1dLCBbLyhvY3VsdXN8c2Ftc3VuZ3xzYWlsZmlzaClicm93c2VyXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgLyguKykvLCBcIiQxIEJyb3dzZXJcIl0sIFZFUlNJT05dLCBbLyhjb21vZG9fZHJhZ29uKVxcLyhbXFx3XFwuXSspL2ldLCBbW05BTUUsIC9fL2csIFwiIFwiXSwgVkVSU0lPTl0sIFsvXFxzKGVsZWN0cm9uKVxcLyhbXFx3XFwuXSspXFxzc2FmYXJpL2ksIC8odGVzbGEpKD86XFxzcXRjYXJicm93c2VyfFxcLygyMFsxMl1cXGRcXC5bXFx3XFwuLV0rKSkvaSwgL20/KHFxYnJvd3NlcnxiYWlkdWJveGFwcHwyMzQ1RXhwbG9yZXIpW1xcL1xcc10/KFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8oTWV0YVNyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8oTEJCUk9XU0VSKS9pXSwgW05BTUVdLCBbLztmYmF2XFwvKFtcXHdcXC5dKyk7L2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL0ZCQU5cXC9GQklPU3xGQl9JQUJcXC9GQjRBL2ldLCBbW05BTUUsIFwiRmFjZWJvb2tcIl1dLCBbL3NhZmFyaVxccyhsaW5lKVxcLyhbXFx3XFwuXSspL2ksIC9cXGIobGluZSlcXC8oW1xcd1xcLl0rKVxcL2lhYi9pLCAvKGNocm9taXVtfGluc3RhZ3JhbSlbXFwvXFxzXShbXFx3XFwuLV0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL1xcYmdzYVxcLyhbXFx3XFwuXSspXFxzLipzYWZhcmlcXC8vaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJHU0FcIl1dLCBbL2hlYWRsZXNzY2hyb21lKD86XFwvKFtcXHdcXC5dKyl8XFxzKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkNocm9tZSBIZWFkbGVzc1wiXV0sIFsvXFxzd3ZcXCkuKyhjaHJvbWUpXFwvKFtcXHdcXC5dKykvaV0sIFtbTkFNRSwgXCJDaHJvbWUgV2ViVmlld1wiXSwgVkVSU0lPTl0sIFsvZHJvaWQuK1xcc3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxcYi4rKD86bW9iaWxlXFxzc2FmYXJpfHNhZmFyaSkvaV0sIFtWRVJTSU9OLCBbTkFNRSwgXCJBbmRyb2lkIEJyb3dzZXJcIl1dLCBbLyhjaHJvbWV8b21uaXdlYnxhcm9yYXxbdGl6ZW5va2FdezV9XFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbL3ZlcnNpb25cXC8oW1xcd1xcLl0rKVxccy4qbW9iaWxlXFwvXFx3K1xccyhzYWZhcmkpL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiTW9iaWxlIFNhZmFyaVwiXV0sIFsvdmVyc2lvblxcLyhbXFx3XFwuXSspXFxzLioobW9iaWxlXFxzP3NhZmFyaXxzYWZhcmkpL2ldLCBbVkVSU0lPTiwgTkFNRV0sIFsvd2Via2l0Lis/KG1vYmlsZVxccz9zYWZhcml8c2FmYXJpKShcXC9bXFx3XFwuXSspL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMuYnJvd3Nlci5vbGRTYWZhcmkudmVyc2lvbl1dLCBbLyh3ZWJraXR8a2h0bWwpXFwvKFtcXHdcXC5dKykvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8obmF2aWdhdG9yfG5ldHNjYXBlKVxcLyhbXFx3XFwuLV0rKS9pXSwgW1tOQU1FLCBcIk5ldHNjYXBlXCJdLCBWRVJTSU9OXSwgWy9pbGVcXHN2cjtcXHNydjooW1xcd1xcLl0rKVxcKS4rZmlyZWZveC9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkZpcmVmb3ggUmVhbGl0eVwiXV0sIFsvZWtpb2hmLisoZmxvdylcXC8oW1xcd1xcLl0rKS9pLCAvKHN3aWZ0Zm94KS9pLCAvKGljZWRyYWdvbnxpY2V3ZWFzZWx8Y2FtaW5vfGNoaW1lcmF8ZmVubmVjfG1hZW1vXFxzYnJvd3NlcnxtaW5pbW98Y29ua2Vyb3IpW1xcL1xcc10/KFtcXHdcXC5cXCtdKykvaSwgLyhmaXJlZm94fHNlYW1vbmtleXxrLW1lbGVvbnxpY2VjYXR8aWNlYXBlfGZpcmViaXJkfHBob2VuaXh8cGFsZW1vb258YmFzaWxpc2t8d2F0ZXJmb3gpXFwvKFtcXHdcXC4tXSspJC9pLCAvKGZpcmVmb3gpXFwvKFtcXHdcXC5dKylcXHNbXFx3XFxzXFwtXStcXC9bXFx3XFwuXSskL2ksIC8obW96aWxsYSlcXC8oW1xcd1xcLl0rKVxccy4rcnZcXDouK2dlY2tvXFwvXFxkKy9pLCAvKHBvbGFyaXN8bHlueHxkaWxsb3xpY2FifGRvcmlzfGFtYXlhfHczbXxuZXRzdXJmfHNsZWlwbmlyKVtcXC9cXHNdPyhbXFx3XFwuXSspL2ksIC8obGlua3MpXFxzXFwoKFtcXHdcXC5dKykvaSwgLyhnb2Jyb3dzZXIpXFwvPyhbXFx3XFwuXSopL2ksIC8oaWNlXFxzP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl9dKykvaSwgLyhtb3NhaWMpW1xcL1xcc10oW1xcd1xcLl0rKS9pXSwgW05BTUUsIFZFUlNJT05dXSxcbiAgICBjcHU6IFtbLyg/OihhbWR8eCg/Oig/Ojg2fDY0KVtfLV0pP3x3b3d8d2luKTY0KVs7XFwpXS9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYW1kNjRcIl1dLCBbLyhpYTMyKD89OykpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgdXRpbC5sb3dlcml6ZV1dLCBbLygoPzppWzM0Nl18eCk4NilbO1xcKV0vaV0sIFtbQVJDSElURUNUVVJFLCBcImlhMzJcIl1dLCBbL1xcYihhYXJjaDY0fGFybXY/OGU/bD8pXFxiL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJhcm02NFwiXV0sIFsvXFxiKGFybSg/OnZbNjddKT9odD9uP1tmbF1wPylcXGIvaV0sIFtbQVJDSElURUNUVVJFLCBcImFybWhmXCJdXSwgWy93aW5kb3dzXFxzKGNlfG1vYmlsZSk7XFxzcHBjOy9pXSwgW1tBUkNISVRFQ1RVUkUsIFwiYXJtXCJdXSwgWy8oKD86cHBjfHBvd2VycGMpKD86NjQpPykoPzpcXHNtYWN8O3xcXCkpL2ldLCBbW0FSQ0hJVEVDVFVSRSwgL293ZXIvLCBcIlwiLCB1dGlsLmxvd2VyaXplXV0sIFsvKHN1bjRcXHcpWztcXCldL2ldLCBbW0FSQ0hJVEVDVFVSRSwgXCJzcGFyY1wiXV0sIFsvKCg/OmF2cjMyfGlhNjQoPz07KSl8NjhrKD89XFwpKXxcXGJhcm0oPzo2NHwoPz12KD86WzEtN118WzUtN10xKWw/fDt8ZWFiaSkpfCg/PWF0bWVsXFxzKWF2cnwoPzppcml4fG1pcHN8c3BhcmMpKD86NjQpP1xcYnxwYS1yaXNjKS9pXSwgW1tBUkNISVRFQ1RVUkUsIHV0aWwubG93ZXJpemVdXV0sXG4gICAgZGV2aWNlOiBbWy9cXGIoc2NoLWlbODldMFxcZHxzaHctbTM4MHN8c20tW3B0XVxcd3syLDR9fGd0LVtwbl1cXGR7Miw0fXxzZ2gtdDhbNTZdOXxuZXh1c1xcczEwKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNhbXN1bmdcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9cXGIoKD86c1tjZ3BdaHxndHxzbSktXFx3K3xnYWxheHlcXHNuZXh1cykvaSwgL1xcc3NhbXN1bmdbXFxzLV0oW1xcdy1dKykvaSwgL3NlYy0oc2doXFx3KykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwKD86aG9uZXxvZClbXFxzXFx3XSopOy9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFwcGxlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKGlwYWQpO1tcXHdcXHNcXCksOy1dK2FwcGxlL2ksIC9hcHBsZWNvcmVtZWRpYVxcL1tcXHdcXC5dK1xcc1xcKChpcGFkKS9pLCAvXFxiKGlwYWQpXFxkXFxkPyxcXGRcXGQ/WztcXF1dLitpb3MvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBcHBsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1xcYigoPzphZ3J8YWdzWzIzXXxiYWgyP3xzaHQ/KS1hP1tsd11cXGR7Mn0pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvZFxcL2h1YXdlaShbXFx3XFxzLV0rKVs7XFwpXS9pLCAvXFxiKG5leHVzXFxzNnB8dm9nLVthdF0/bFxcZFxcZHxhbmUtW2F0XT9sW3hcXGRdXFxkfGVtbC1hP2xcXGRcXGRhP3xseWEtW2F0XT9sXFxkW1xcZGNdfGNsdC1hP2xcXGRcXGRpP3xlbGUtbFxcZFxcZCkvaSwgL1xcYihcXHd7Miw0fS1bYXR1XVtsbl1bMDEyNTldWzAxOV0pWztcXClcXHNdL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiSHVhd2VpXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxiKHBvY29bXFxzXFx3XSspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxiO1xccyhcXHcrKVxcc2J1aWxkXFwvaG1cXDEvaSwgL1xcYihobVtcXHNcXC1fXT9ub3RlP1tcXHNfXT8oPzpcXGRcXHcpPylcXHNidWlsZC9pLCAvXFxiKHJlZG1pW1xcc1xcLV9dPyg/Om5vdGV8ayk/W1xcd1xcc19dKykoPzpcXHNidWlsZHxcXCkpL2ksIC9cXGIobWlbXFxzXFwtX10/KD86YVxcZHxvbmV8b25lW1xcc19dcGx1c3xub3RlIGx0ZSk/W1xcc19dPyg/OlxcZD9cXHc/KVtcXHNfXT8oPzpwbHVzKT8pXFxzYnVpbGQvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXGIobWlbXFxzXFwtX10/KD86cGFkKSg/OltcXHdcXHNfXSspKSg/Olxcc2J1aWxkfFxcKSkvaV0sIFtbTU9ERUwsIC9fL2csIFwiIFwiXSwgW1ZFTkRPUiwgXCJYaWFvbWlcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKFxcdyspXFxzYnVpbGQuK1xcc29wcG8vaSwgL1xccyhjcGhbMTJdXFxkezN9fHAoPzphZnxjW2FsXXxkXFx3fGVbYXJdKVttdF1cXGQwfHg5MDA3KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIk9QUE9cIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHN2aXZvXFxzKFxcdyspKD86XFxzYnVpbGR8XFwpKS9pLCAvXFxzKHZbMTJdXFxkezN9XFx3P1thdF0pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWaXZvXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKHJteFsxMl1cXGR7M30pKD86XFxzYnVpbGR8OykvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSZWFsbWVcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobWlsZXN0b25lfGRyb2lkKD86WzItNHhdfFxccyg/OmJpb25pY3x4Mnxwcm98cmF6cikpPzo/KFxcczRnKT8pXFxiW1xcd1xcc10rYnVpbGRcXC8vaSwgL1xcc21vdCg/Om9yb2xhKT9bXFxzLV0oXFx3KikvaSwgLygoPzptb3RvW1xcc1xcd1xcKFxcKV0rfHh0XFxkezMsNH18bmV4dXNcXHM2KSg/PVxcc2J1aWxkfFxcKSkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTW90b3JvbGFcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9cXHMobXo2MFxcZHx4b29tW1xcczJdezAsMn0pXFxzYnVpbGRcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNb3Rvcm9sYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLygoPz1sZyk/W3ZsXWtcXC0/XFxkezN9KVxcc2J1aWxkfFxcczNcXC5bXFxzXFx3Oy1dezEwfWxnPy0oWzA2Y3Y5XXszLDR9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxHXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvKGxtLT9mMTAwW252XT98bmV4dXNcXHNbNDVdKS9pLCAvbGdbZTtcXHNcXC8tXSsoKD8hYnJvd3NlcnxuZXRjYXN0KVxcdyspL2ksIC9cXGJsZyhcXC0/W1xcZFxcd10rKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8oaWRlYXRhYltcXHdcXC1cXHNdKykvaSwgL2xlbm92b1xccz8ocyg/OjUwMDB8NjAwMCkoPzpbXFx3LV0rKXx0YWIoPzpbXFxzXFx3XSspfHl0W1xcZFxcdy1dezZ9fHRiW1xcZFxcdy1dezZ9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkxlbm92b1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyg/Om1hZW1vfG5va2lhKS4qKG45MDB8bHVtaWFcXHNcXGQrKS9pLCAvbm9raWFbXFxzXy1dPyhbXFx3XFwuLV0qKS9pXSwgW1tNT0RFTCwgL18vZywgXCIgXCJdLCBbVkVORE9SLCBcIk5va2lhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuKztcXHMocGl4ZWxcXHNjKVtcXHMpXS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdvb2dsZVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKHBpeGVsW1xcc1xcZGF4bF17MCw2fSkoPzpcXHNidWlsZHxcXCkpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWQuK1xccyhbYy1nXVxcZHs0fXxzb1stbF1cXHcrfHhxLWFcXHdbNC03XVsxMl0pKD89XFxzYnVpbGRcXC98XFwpLitjaHJvbWVcXC8oPyFbMS02XXswLDF9XFxkXFwuKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc29ueVxcc3RhYmxldFxcc1twc11cXHNidWlsZFxcLy9pLCAvKD86c29ueSk/c2dwXFx3Kyg/Olxcc2J1aWxkXFwvfFxcKSkvaV0sIFtbTU9ERUwsIFwiWHBlcmlhIFRhYmxldFwiXSwgW1ZFTkRPUiwgXCJTb255XCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKGtiMjAwNXxpbjIwWzEyXTV8YmUyMFsxMl1bNTldKVxcYi9pLCAvXFxiYTAwMCgxKVxcc2J1aWxkL2ksIC9cXGJvbmVwbHVzXFxzKGFcXGR7NH0pW1xccyldL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiT25lUGx1c1wiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyhhbGV4YSl3ZWJtL2ksIC8oa2ZbYS16XXsyfXdpKShcXHNidWlsZFxcL3xcXCkpL2ksIC8oa2ZbYS16XSspKFxcc2J1aWxkXFwvfFxcKSkuK3NpbGtcXC8vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc2R8a2YpWzAzNDloaWpvcnN0dXddKyhcXHNidWlsZFxcL3xcXCkpLitzaWxrXFwvL2ldLCBbW01PREVMLCBcIkZpcmUgUGhvbmVcIl0sIFtWRU5ET1IsIFwiQW1hem9uXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFwoKHBsYXlib29rKTtbXFx3XFxzXFwpLDstXSsocmltKS9pXSwgW01PREVMLCBWRU5ET1IsIFtUWVBFLCBUQUJMRVRdXSwgWy8oKD86YmJbYS1mXXxzdFtodl0pMTAwLVxcZCkvaSwgL1xcKGJiMTA7XFxzKFxcdyspL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmxhY2tCZXJyeVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbLyg/OlxcYnxhc3VzXykodHJhbnNmb1twcmltZVxcc117NCwxMH1cXHNcXHcrfGVlZXBjfHNsaWRlclxcc1xcdyt8bmV4dXNcXHM3fHBhZGZvbmV8cDAwW2NqXSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBU1VTXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvXFxzKHpbZXNdNlswMjddWzAxXVtrbV1bbHNdfHplbmZvbmVcXHNcXGRcXHc/KVxcYi9pXSwgW01PREVMLCBbVkVORE9SLCBcIkFTVVNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy8obmV4dXNcXHM5KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIkhUQ1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhodGMpWztfXFxzLV17MSwyfShbXFx3XFxzXSsoPz1cXCl8XFxzYnVpbGQpfFxcdyspL2ksIC8oenRlKS0oXFx3KikvaSwgLyhhbGNhdGVsfGdlZWtzcGhvbmV8bmV4aWFufHBhbmFzb25pY3woPz07XFxzKXNvbnkpW19cXHMtXT8oW1xcdy1dKikvaV0sIFtWRU5ET1IsIFtNT0RFTCwgL18vZywgXCIgXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvZHJvaWRbeFxcZFxcLlxccztdK1xccyhbYWJdWzEtN11cXC0/WzAxNzhhXVxcZFxcZD8pL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQWNlclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL2Ryb2lkLis7XFxzKG1bMS01XVxcc25vdGUpXFxzYnVpbGQvaSwgL1xcYm16LShbXFx3LV17Mix9KS9pXSwgW01PREVMLCBbVkVORE9SLCBcIk1laXp1XCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGJsYWNrYmVycnl8YmVucXxwYWxtKD89XFwtKXxzb255ZXJpY3Nzb258YWNlcnxhc3VzfGRlbGx8bWVpenV8bW90b3JvbGF8cG9seXRyb24pW1xcc18tXT8oW1xcdy1dKikvaSwgLyhocClcXHMoW1xcd1xcc10rXFx3KS9pLCAvKGFzdXMpLT8oXFx3KykvaSwgLyhtaWNyb3NvZnQpO1xccyhsdW1pYVtcXHNcXHddKykvaSwgLyhsZW5vdm8pW19cXHMtXT8oW1xcdy1dKykvaSwgL2xpbnV4Oy4rKGpvbGxhKTsvaSwgL2Ryb2lkLis7XFxzKG9wcG8pXFxzPyhbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFsvKGFyY2hvcylcXHMoZ2FtZXBhZDI/KS9pLCAvKGhwKS4rKHRvdWNocGFkKD8hLit0YWJsZXQpfHRhYmxldCkvaSwgLyhraW5kbGUpXFwvKFtcXHdcXC5dKykvaSwgL1xccyhub29rKVtcXHdcXHNdK2J1aWxkXFwvKFxcdyspL2ksIC8oZGVsbClcXHMoc3RyZWFba3ByXFxzXFxkXSpbXFxka29dKS9pLCAvWztcXC9dXFxzPyhsZVtcXHNcXC1dK3BhbilbXFxzXFwtXSsoXFx3ezEsOX0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccz8odHJpbml0eSlbXFwtXFxzXSoodFxcZHszfSlcXHNidWlsZC9pLCAvXFxiKGdpZ2FzZXQpW1xcc1xcLV0rKHFcXHd7MSw5fSlcXHNidWlsZC9pLCAvXFxiKHZvZGFmb25lKVxccyhbXFx3XFxzXSspKD86XFwpfFxcc2J1aWxkKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHMoc3VyZmFjZVxcc2R1bylcXHMvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZnBcXGR1PylcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkZhaXJwaG9uZVwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL1xccyh1MzA0YWEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBVCZUXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvc2llLShcXHcqKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNpZW1lbnNcIl0sIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KHJjdFxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSQ0FcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL1xcc10odmVudWVbXFxkXFxzXXsyLDd9KVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRGVsbFwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8ocSg/Om12fHRhKVxcdyspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJWZXJpem9uXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKD86YmFybmVzWyZcXHNdK25vYmxlXFxzfGJuW3J0XSkoW1xcd1xcc1xcK10qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiQmFybmVzICYgTm9ibGVcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHModG1cXGR7M31cXHcrKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiTnVWaXNpb25cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy87XFxzKGs4OClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlpURVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLztcXHMobnhcXGR7M31qKVxcc2J1aWxkL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWlRFXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyhnZW5cXGR7M30pXFxzYnVpbGQuKjQ5aC9pXSwgW01PREVMLCBbVkVORE9SLCBcIlN3aXNzXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh6dXJcXGR7M30pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJTd2lzc1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKHpla2kpP3RiLipcXGIpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWtpXCJdLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzKFt5cl1cXGR7Mn0pXFxzYnVpbGQvaSwgL1s7XFwvXVxccyhkcmFnb25bXFwtXFxzXSt0b3VjaFxcc3xkdCkoXFx3ezV9KVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJEcmFnb24gVG91Y2hcIl0sIE1PREVMLCBbVFlQRSwgVEFCTEVUXV0sIFsvWztcXC9dXFxzPyhucy0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJJbnNpZ25pYVwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oKG54YXxOZXh0KS0/XFx3ezAsOX0pXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOZXh0Qm9va1wiXSwgW1RZUEUsIFRBQkxFVF1dLCBbL1s7XFwvXVxccz8oeHRyZW1lXFxfKT8odigxWzA0NV18MlswMTVdfFszNDY5XTB8N1swNV0pKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJWb2ljZVwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy9bO1xcL11cXHM/KGx2dGVsXFwtKT8odjFbMTJdKVxcc2J1aWxkL2ldLCBbW1ZFTkRPUiwgXCJMdlRlbFwiXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy87XFxzKHBoLTEpXFxzL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiRXNzZW50aWFsXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvWztcXC9dXFxzPyh2KDEwMG1kfDcwMG5hfDcwMTF8OTE3ZykuKlxcYilcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkVudml6ZW5cIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/KHRyaW9bXFxzXFx3XFwtXFwuXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNYWNoU3BlZWRcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9bO1xcL11cXHM/dHVfKDE0OTEpXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJSb3RvclwiXSwgW1RZUEUsIFRBQkxFVF1dLCBbLyhzaGllbGRbXFx3XFxzXSspXFxzYnVpbGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJOdmlkaWFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy8oc3ByaW50KVxccyhcXHcrKS9pXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgWy8oa2luXFwuW29uZXR3XXszfSkvaV0sIFtbTU9ERUwsIC9cXC4vZywgXCIgXCJdLCBbVkVORE9SLCBcIk1pY3Jvc29mdFwiXSwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyhjYzY2NjY/fGV0NVsxNl18bWNbMjM5XVsyM114P3x2YzhbMDNdeD8pXFwpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiWmVicmFcIl0sIFtUWVBFLCBUQUJMRVRdXSwgWy9kcm9pZFxcc1tcXGRcXC5dKztcXHMoZWMzMHxwczIwfHRjWzItOF1cXGRba3hdKVxcKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlplYnJhXCJdLCBbVFlQRSwgTU9CSUxFXV0sIFsvXFxzKG91eWEpXFxzL2ksIC8obmludGVuZG8pXFxzKFt3aWRzM3V0Y2hdKykvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgQ09OU09MRV1dLCBbL2Ryb2lkLis7XFxzKHNoaWVsZClcXHNidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIk52aWRpYVwiXSwgW1RZUEUsIENPTlNPTEVdXSwgWy8ocGxheXN0YXRpb25cXHNbMzQ1cG9ydGFibGV2aV0rKS9pXSwgW01PREVMLCBbVkVORE9SLCBcIlNvbnlcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvW1xcc1xcKDtdKHhib3goPzpcXHNvbmUpPyg/ITtcXHN4Ym94KSlbXFxzXFwpO10vaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJNaWNyb3NvZnRcIl0sIFtUWVBFLCBDT05TT0xFXV0sIFsvc21hcnQtdHYuKyhzYW1zdW5nKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIFNNQVJUVFZdXSwgWy9oYmJ0di4rbWFwbGU7KFxcZCspL2ldLCBbW01PREVMLCAvXi8sIFwiU21hcnRUVlwiXSwgW1ZFTkRPUiwgXCJTYW1zdW5nXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbLyg/OmxpbnV4O1xcc25ldGNhc3QuK3NtYXJ0dHZ8bGdcXHNuZXRjYXN0XFwudHYtMjAxXFxkKS9pXSwgW1tWRU5ET1IsIFwiTEdcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvKGFwcGxlKVxccz90di9pXSwgW1ZFTkRPUiwgW01PREVMLCBcIkFwcGxlIFRWXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Nya2V5L2ldLCBbW01PREVMLCBcIkNocm9tZWNhc3RcIl0sIFtWRU5ET1IsIFwiR29vZ2xlXCJdLCBbVFlQRSwgU01BUlRUVl1dLCBbL2Ryb2lkLithZnQoW1xcd10pKFxcc2J1aWxkXFwvfFxcKSkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJBbWF6b25cIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvXFwoZHR2W1xcKTtdLisoYXF1b3MpL2ldLCBbTU9ERUwsIFtWRU5ET1IsIFwiU2hhcnBcIl0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvaGJidHZcXC9cXGQrXFwuXFxkK1xcLlxcZCtcXHMrXFwoW1xcd1xcc10qO1xccyooXFx3W147XSopOyhbXjtdKikvaV0sIFtbVkVORE9SLCB1dGlsLnRyaW1dLCBbTU9ERUwsIHV0aWwudHJpbV0sIFtUWVBFLCBTTUFSVFRWXV0sIFsvW1xcc1xcL1xcKF0oYW5kcm9pZFxcc3xzbWFydFstXFxzXT98b3BlcmFcXHMpdHZbO1xcKVxcc10vaV0sIFtbVFlQRSwgU01BUlRUVl1dLCBbLygocGViYmxlKSlhcHBcXC9bXFxkXFwuXStcXHMvaV0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgV0VBUkFCTEVdXSwgWy9kcm9pZC4rO1xccyhnbGFzcylcXHNcXGQvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJHb29nbGVcIl0sIFtUWVBFLCBXRUFSQUJMRV1dLCBbL2Ryb2lkXFxzW1xcZFxcLl0rO1xccyh3dDYzPzB7MiwzfSlcXCkvaV0sIFtNT0RFTCwgW1ZFTkRPUiwgXCJaZWJyYVwiXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFsvKHRlc2xhKSg/Olxcc3F0Y2FyYnJvd3NlcnxcXC8yMFsxMl1cXGRcXC5bXFx3XFwuLV0rKS9pXSwgW1ZFTkRPUiwgW1RZUEUsIEVNQkVEREVEXV0sIFsvZHJvaWQgLis/OyAoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/IG1vYmlsZSBzYWZhcmkvaV0sIFtNT0RFTCwgW1RZUEUsIE1PQklMRV1dLCBbL2Ryb2lkIC4rPztcXHMoW147XSs/KSg/OiBidWlsZHxcXCkgYXBwbGV3ZWJraXQpLis/KD8hIG1vYmlsZSkgc2FmYXJpL2ldLCBbTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgWy9cXHModGFibGV0fHRhYilbO1xcL10vaSwgL1xccyhtb2JpbGUpKD86WztcXC9dfFxcc3NhZmFyaSkvaV0sIFtbVFlQRSwgdXRpbC5sb3dlcml6ZV1dLCBbLyhhbmRyb2lkW1xcd1xcLlxcc1xcLV17MCw5fSk7LitidWlsZC9pXSwgW01PREVMLCBbVkVORE9SLCBcIkdlbmVyaWNcIl1dLCBbLyhwaG9uZSkvaV0sIFtbVFlQRSwgTU9CSUxFXV1dLFxuICAgIGVuZ2luZTogW1svd2luZG93cy4rXFxzZWRnZVxcLyhbXFx3XFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiRWRnZUhUTUxcIl1dLCBbL3dlYmtpdFxcLzUzN1xcLjM2LitjaHJvbWVcXC8oPyEyNykoW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsaW5rXCJdXSwgWy8ocHJlc3RvKVxcLyhbXFx3XFwuXSspL2ksIC8od2Via2l0fHRyaWRlbnR8bmV0ZnJvbnR8bmV0c3VyZnxhbWF5YXxseW54fHczbXxnb2FubmEpXFwvKFtcXHdcXC5dKykvaSwgL2VraW9oKGZsb3cpXFwvKFtcXHdcXC5dKykvaSwgLyhraHRtbHx0YXNtYW58bGlua3MpW1xcL1xcc11cXCg/KFtcXHdcXC5dKykvaSwgLyhpY2FiKVtcXC9cXHNdKFsyM11cXC5bXFxkXFwuXSspL2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvcnZcXDooW1xcd1xcLl17MSw5fSlcXGIuKyhnZWNrbykvaV0sIFtWRVJTSU9OLCBOQU1FXV0sXG4gICAgb3M6IFtbL21pY3Jvc29mdFxccyh3aW5kb3dzKVxccyh2aXN0YXx4cCkvaV0sIFtOQU1FLCBWRVJTSU9OXSwgWy8od2luZG93cylcXHNudFxcczZcXC4yO1xccyhhcm0pL2ksIC8od2luZG93c1xcc3Bob25lKD86XFxzb3MpKilbXFxzXFwvXT8oW1xcZFxcLlxcc1xcd10qKS9pLCAvKHdpbmRvd3NcXHNtb2JpbGV8d2luZG93cylbXFxzXFwvXT8oW250Y2VcXGRcXC5cXHNdK1xcdykoPyEuK3hib3gpL2ldLCBbTkFNRSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvKHdpbig/PTN8OXxuKXx3aW5cXHM5eFxccykoW250XFxkXFwuXSspL2ldLCBbW05BTUUsIFwiV2luZG93c1wiXSwgW1ZFUlNJT04sIG1hcHBlci5zdHIsIG1hcHMub3Mud2luZG93cy52ZXJzaW9uXV0sIFsvaXBbaG9uZWFkXXsyLDR9XFxiKD86Lipvc1xccyhbXFx3XSspXFxzbGlrZVxcc21hY3w7XFxzb3BlcmEpL2ksIC9jZm5ldHdvcmtcXC8uK2Rhcndpbi9pXSwgW1tWRVJTSU9OLCAvXy9nLCBcIi5cIl0sIFtOQU1FLCBcImlPU1wiXV0sIFsvKG1hY1xcc29zXFxzeClcXHM/KFtcXHdcXHNcXC5dKikvaSwgLyhtYWNpbnRvc2h8bWFjKD89X3Bvd2VycGMpXFxzKSg/IS4raGFpa3UpL2ldLCBbW05BTUUsIFwiTWFjIE9TXCJdLCBbVkVSU0lPTiwgL18vZywgXCIuXCJdXSwgWy8oYW5kcm9pZHx3ZWJvc3xwYWxtXFxzb3N8cW54fGJhZGF8cmltXFxzdGFibGV0XFxzb3N8bWVlZ298c2FpbGZpc2h8Y29udGlraSlbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhibGFja2JlcnJ5KVxcdypcXC8oW1xcd1xcLl0qKS9pLCAvKHRpemVufGthaW9zKVtcXC9cXHNdKFtcXHdcXC5dKykvaSwgL1xcKChzZXJpZXM0MCk7L2ldLCBbTkFNRSwgVkVSU0lPTl0sIFsvXFwoYmIoMTApOy9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIkJsYWNrQmVycnlcIl1dLCBbLyg/OnN5bWJpYW5cXHM/b3N8c3ltYm9zfHM2MCg/PTspfHNlcmllczYwKVtcXC9cXHMtXT8oW1xcd1xcLl0qKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIlN5bWJpYW5cIl1dLCBbL21vemlsbGEuK1xcKG1vYmlsZTsuK2dlY2tvLitmaXJlZm94L2ldLCBbW05BTUUsIFwiRmlyZWZveCBPU1wiXV0sIFsvd2ViMHM7LitydCh0dikvaSwgL1xcYig/OmhwKT93b3MoPzpicm93c2VyKT9cXC8oW1xcd1xcLl0rKS9pXSwgW1ZFUlNJT04sIFtOQU1FLCBcIndlYk9TXCJdXSwgWy9jcmtleVxcLyhbXFxkXFwuXSspL2ldLCBbVkVSU0lPTiwgW05BTUUsIFwiQ2hyb21lY2FzdFwiXV0sIFsvKGNyb3MpXFxzW1xcd10rXFxzKFtcXHdcXC5dK1xcdykvaV0sIFtbTkFNRSwgXCJDaHJvbWl1bSBPU1wiXSwgVkVSU0lPTl0sIFsvKG5pbnRlbmRvfHBsYXlzdGF0aW9uKVxccyhbd2lkczM0NXBvcnRhYmxldnVjaF0rKS9pLCAvKHhib3gpO1xccyt4Ym94XFxzKFteXFwpO10rKS9pLCAvKG1pbnQpW1xcL1xcc1xcKFxcKV0/KFxcdyopL2ksIC8obWFnZWlhfHZlY3RvcmxpbnV4KVs7XFxzXS9pLCAvKGpvbGl8W2t4bG5dP3VidW50dXxkZWJpYW58c3VzZXxvcGVuc3VzZXxnZW50b298YXJjaCg/PVxcc2xpbnV4KXxzbGFja3dhcmV8ZmVkb3JhfG1hbmRyaXZhfGNlbnRvc3xwY2xpbnV4b3N8cmVkaGF0fHplbndhbGt8bGlucHVzfHJhc3BiaWFuKSg/Olxcc2dudVxcL2xpbnV4KT8oPzpcXHNsaW51eCk/W1xcL1xccy1dPyg/IWNocm9tfHBhY2thZ2UpKFtcXHdcXC4tXSopL2ksIC8oaHVyZHxsaW51eClcXHM/KFtcXHdcXC5dKikvaSwgLyhnbnUpXFxzPyhbXFx3XFwuXSopL2ksIC9cXHMoW2ZyZW50b3BjLV17MCw0fWJzZHxkcmFnb25mbHkpXFxzPyg/IWFtZHxbaXgzNDZdezEsMn04NikoW1xcd1xcLl0qKS9pLCAvKGhhaWt1KVxccyhcXHcrKS9pXSwgW05BTUUsIFZFUlNJT05dLCBbLyhzdW5vcylcXHM/KFtcXHdcXC5cXGRdKikvaV0sIFtbTkFNRSwgXCJTb2xhcmlzXCJdLCBWRVJTSU9OXSwgWy8oKD86b3Blbik/c29sYXJpcylbXFwvXFxzLV0/KFtcXHdcXC5dKikvaSwgLyhhaXgpXFxzKChcXGQpKD89XFwufFxcKXxcXHMpW1xcd1xcLl0pKi9pLCAvKHBsYW5cXHM5fG1pbml4fGJlb3N8b3NcXC8yfGFtaWdhb3N8bW9ycGhvc3xyaXNjXFxzb3N8b3BlbnZtc3xmdWNoc2lhKS9pLCAvKHVuaXgpXFxzPyhbXFx3XFwuXSopL2ldLCBbTkFNRSwgVkVSU0lPTl1dXG4gIH07XG5cbiAgdmFyIFVBUGFyc2VyID0gZnVuY3Rpb24gVUFQYXJzZXIodWEsIGV4dGVuc2lvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBleHRlbnNpb25zID0gdWE7XG4gICAgICB1YSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVUFQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFVBUGFyc2VyKHVhLCBleHRlbnNpb25zKS5nZXRSZXN1bHQoKTtcbiAgICB9XG5cbiAgICB2YXIgX3VhID0gdWEgfHwgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCA/IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50IDogRU1QVFkpO1xuXG4gICAgdmFyIF9yZ3htYXAgPSBleHRlbnNpb25zID8gdXRpbC5leHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykgOiByZWdleGVzO1xuXG4gICAgdGhpcy5nZXRCcm93c2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9icm93c2VyID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfYnJvd3NlciwgX3VhLCBfcmd4bWFwLmJyb3dzZXIpO1xuICAgICAgX2Jyb3dzZXIubWFqb3IgPSB1dGlsLm1ham9yKF9icm93c2VyLnZlcnNpb24pO1xuICAgICAgcmV0dXJuIF9icm93c2VyO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENQVSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfY3B1ID0ge1xuICAgICAgICBhcmNoaXRlY3R1cmU6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfY3B1LCBfdWEsIF9yZ3htYXAuY3B1KTtcbiAgICAgIHJldHVybiBfY3B1O1xuICAgIH07XG5cbiAgICB0aGlzLmdldERldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZGV2aWNlID0ge1xuICAgICAgICB2ZW5kb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9kZXZpY2UsIF91YSwgX3JneG1hcC5kZXZpY2UpO1xuICAgICAgcmV0dXJuIF9kZXZpY2U7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RW5naW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9lbmdpbmUgPSB7XG4gICAgICAgIG5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgbWFwcGVyLnJneC5jYWxsKF9lbmdpbmUsIF91YSwgX3JneG1hcC5lbmdpbmUpO1xuICAgICAgcmV0dXJuIF9lbmdpbmU7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0T1MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29zID0ge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHZlcnNpb246IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIG1hcHBlci5yZ3guY2FsbChfb3MsIF91YSwgX3JneG1hcC5vcyk7XG4gICAgICByZXR1cm4gX29zO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVhOiB0aGlzLmdldFVBKCksXG4gICAgICAgIGJyb3dzZXI6IHRoaXMuZ2V0QnJvd3NlcigpLFxuICAgICAgICBlbmdpbmU6IHRoaXMuZ2V0RW5naW5lKCksXG4gICAgICAgIG9zOiB0aGlzLmdldE9TKCksXG4gICAgICAgIGRldmljZTogdGhpcy5nZXREZXZpY2UoKSxcbiAgICAgICAgY3B1OiB0aGlzLmdldENQVSgpXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0aGlzLmdldFVBID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF91YTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRVQSA9IGZ1bmN0aW9uICh1YSkge1xuICAgICAgX3VhID0gdHlwZW9mIHVhID09PSBTVFJfVFlQRSAmJiB1YS5sZW5ndGggPiBVQV9NQVhfTEVOR1RIID8gdXRpbC50cmltKHVhLCBVQV9NQVhfTEVOR1RIKSA6IHVhO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0VUEoX3VhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBVQVBhcnNlci5WRVJTSU9OID0gTElCVkVSU0lPTjtcbiAgVUFQYXJzZXIuQlJPV1NFUiA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIE1BSk9SOiBNQUpPUixcbiAgICBWRVJTSU9OOiBWRVJTSU9OXG4gIH07XG4gIFVBUGFyc2VyLkNQVSA9IHtcbiAgICBBUkNISVRFQ1RVUkU6IEFSQ0hJVEVDVFVSRVxuICB9O1xuICBVQVBhcnNlci5ERVZJQ0UgPSB7XG4gICAgTU9ERUw6IE1PREVMLFxuICAgIFZFTkRPUjogVkVORE9SLFxuICAgIFRZUEU6IFRZUEUsXG4gICAgQ09OU09MRTogQ09OU09MRSxcbiAgICBNT0JJTEU6IE1PQklMRSxcbiAgICBTTUFSVFRWOiBTTUFSVFRWLFxuICAgIFRBQkxFVDogVEFCTEVULFxuICAgIFdFQVJBQkxFOiBXRUFSQUJMRSxcbiAgICBFTUJFRERFRDogRU1CRURERURcbiAgfTtcbiAgVUFQYXJzZXIuRU5HSU5FID0ge1xuICAgIE5BTUU6IE5BTUUsXG4gICAgVkVSU0lPTjogVkVSU0lPTlxuICB9O1xuICBVQVBhcnNlci5PUyA9IHtcbiAgICBOQU1FOiBOQU1FLFxuICAgIFZFUlNJT046IFZFUlNJT05cbiAgfTtcblxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFVOREVGX1RZUEUpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gVU5ERUZfVFlQRSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gVUFQYXJzZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5VQVBhcnNlciA9IFVBUGFyc2VyO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFVBUGFyc2VyO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuVUFQYXJzZXIgPSBVQVBhcnNlcjtcbiAgICB9XG4gIH1cblxuICB2YXIgJCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgKHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvKTtcblxuICBpZiAoJCAmJiAhJC51YSkge1xuICAgIHZhciBwYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgICAkLnVhID0gcGFyc2VyLmdldFJlc3VsdCgpO1xuXG4gICAgJC51YS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmdldFVBKCk7XG4gICAgfTtcblxuICAgICQudWEuc2V0ID0gZnVuY3Rpb24gKHVhc3RyaW5nKSB7XG4gICAgICBwYXJzZXIuc2V0VUEodWFzdHJpbmcpO1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHQoKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiByZXN1bHQpIHtcbiAgICAgICAgJC51YVtwcm9wXSA9IHJlc3VsdFtwcm9wXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDogdGhpcyk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4889\n')},5438:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("var $ = __webpack_require__(2109);\n\n// eslint-disable-next-line es/no-math-hypot -- required for testing\nvar $hypot = Math.hypot;\nvar abs = Math.abs;\nvar sqrt = Math.sqrt;\n\n// Chrome 77 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=9546\nvar BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity;\n\n// `Math.hypot` method\n// https://tc39.es/ecma262/#sec-math.hypot\n$({ target: 'Math', stat: true, forced: BUGGY }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n hypot: function hypot(value1, value2) {\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * sqrt(sum);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcz80MDU3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLDRDQUE0QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiNTQzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC1oeXBvdCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyICRoeXBvdCA9IE1hdGguaHlwb3Q7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgc3FydCA9IE1hdGguc3FydDtcblxuLy8gQ2hyb21lIDc3IGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTU0NlxudmFyIEJVR0dZID0gISEkaHlwb3QgJiYgJGh5cG90KEluZmluaXR5LCBOYU4pICE9PSBJbmZpbml0eTtcblxuLy8gYE1hdGguaHlwb3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogQlVHR1kgfSwge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBsYXJnID0gMDtcbiAgICB2YXIgYXJnLCBkaXY7XG4gICAgd2hpbGUgKGkgPCBhTGVuKSB7XG4gICAgICBhcmcgPSBhYnMoYXJndW1lbnRzW2krK10pO1xuICAgICAgaWYgKGxhcmcgPCBhcmcpIHtcbiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkge1xuICAgICAgICBkaXYgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIHNxcnQoc3VtKTtcbiAgfVxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5438\n")},6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ components_AlertWrapper; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = "alertWrapper-module--alertWrapper--blPAc";\nvar alertHide = "alertWrapper-module--alertHide--9Ud1N";\nvar alertWarning = "alertWrapper-module--alertWarning--31gxK";\n// EXTERNAL MODULE: ./src/data/copy/common.tsx\nvar common = __webpack_require__(4489);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement("div",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"info"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.BETA_TITLE */.N$.BETA_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.BETA_BODY */.N$.BETA_BODY)),/*#__PURE__*/react.createElement("br",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"warning"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.LIMITED_TITLE */.N$.LIMITED_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.LIMITED_BODY */.N$.LIMITED_BODY)),/*#__PURE__*/react.createElement("br",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiLCJDT01NT05fQ09QWSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBLDhEOzs7O0FDU1AsR0FBTUEsYUFBWSxDQUFHLFFBQWZBLGFBQWUsTUFHSyw2QkFGeEJDLGFBRXdCLENBRnhCQSxhQUV3Qiw2QkFGUixLQUVRLCtDQUR4QkMsb0JBQ3dCLENBRHhCQSxvQkFDd0IsZ0NBREQsS0FDQyx1QkFDeEIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUdBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRUMsWUFBaEIsRUFDR0osYUFBYSxlQUNaLG9CQUFDLFNBQUQsRUFBTyxTQUFTLENBQUUsZUFBbEIsQ0FBbUMsSUFBSSxDQUFDLE1BQXhDLGVBQ0UsNEJBQU0sU0FBUyxDQUFFLHFCQUFqQixFQUF5Q0UsSUFBSSxDQUFDRyxhQUFMLENBQW1CQywyQ0FBbkIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMseUNBQW5CLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQUZKLENBU0dMLG9CQUFvQixlQUNuQixvQkFBQyxTQUFELEVBQU8sU0FBUyxDQUFFLGVBQWxCLENBQW1DLElBQUksQ0FBQyxTQUF4QyxlQUNFLDRCQUFNLFNBQVMsQ0FBRSxxQkFBakIsRUFBeUNDLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMsaURBQW5CLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDSixJQUFJLENBQUNHLGFBQUwsQ0FBbUJDLCtDQUFuQixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FWSixDQURGLENBbUJELENBMUJELENBNEJBLDREQUFlUCxZQUFmIiwiZmlsZSI6IjY3ODAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgYWxlcnRXcmFwcGVyID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydFdyYXBwZXItLWJsUEFjXCI7XG5leHBvcnQgdmFyIGFsZXJ0SGlkZSA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRIaWRlLS05VWQxTlwiO1xuZXhwb3J0IHZhciBhbGVydFdhcm5pbmcgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V2FybmluZy0tMzFneEtcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtBbGVydH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgQ09NTU9OX0NPUFkgZnJvbSAnLi4vLi4vZGF0YS9jb3B5L2NvbW1vbic7XG5cbmludGVyZmFjZSBJQWxlcnRXcmFwcGVyUHJvcHMge1xuICBzaG93QmV0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2VcbiAgc2hvd0xpbWl0ZWREYXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byBmYWxzZVxufVxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbGVydFdyYXBwZXJ9PlxuICAgICAge3Nob3dCZXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJpbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuXG4gICAgICB7c2hvd0xpbWl0ZWREYXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJ3YXJuaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRXcmFwcGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6780\n')},6183:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fo\": function() { return /* binding */ PAGE_INTRO; },\n/* harmony export */ \"lO\": function() { return /* binding */ CONTACT_VIA_EMAIL; },\n/* harmony export */ \"ap\": function() { return /* binding */ FEEDBACK_EMAIL; }\n/* harmony export */ });\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4424);\nvar PAGE_INTRO=(0,react_intl__WEBPACK_IMPORTED_MODULE_0__/* .defineMessages */ .vU)({PAGE_TILE:{id:'contact.page.title.text',defaultMessage:'Contact',description:'contact page title text'},PAGE_HEADING:{id:'contact.page.header.text',defaultMessage:'Contact',description:'contact page header text'},PAGE_SUB_HEADING:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'},PAGE_DESCRIPTION:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'}});var CONTACT_VIA_EMAIL={ID:'contact.general',DESCRIPTION:'Contact page body text',DEFAULT_MESSAGE:\"For general feedback, email {general_email_address}\"};var FEEDBACK_EMAIL='screeningtool.feedback@usds.gov';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvY29udGFjdC50c3g/ZWJlYiJdLCJuYW1lcyI6WyJQQUdFX0lOVFJPIiwiZGVmaW5lTWVzc2FnZXMiLCJQQUdFX1RJTEUiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJQQUdFX0hFQURJTkciLCJQQUdFX1NVQl9IRUFESU5HIiwiUEFHRV9ERVNDUklQVElPTiIsIkNPTlRBQ1RfVklBX0VNQUlMIiwiSUQiLCJERVNDUklQVElPTiIsIkRFRkFVTFRfTUVTU0FHRSIsIkZFRURCQUNLX0VNQUlMIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFTyxHQUFNQSxXQUFVLENBQUdDLG9FQUFjLENBQUMsQ0FDdkNDLFNBQVMsQ0FBRSxDQUNUQyxFQUFFLENBQUUseUJBREssQ0FFVEMsY0FBYyxDQUFFLFNBRlAsQ0FHVEMsV0FBVyxDQUFFLHlCQUhKLENBRDRCLENBTXZDQyxZQUFZLENBQUUsQ0FDWkgsRUFBRSxDQUFFLDBCQURRLENBRVpDLGNBQWMsQ0FBRSxTQUZKLENBR1pDLFdBQVcsQ0FBRSwwQkFIRCxDQU55QixDQVd2Q0UsZ0JBQWdCLENBQUUsQ0FDaEJKLEVBQUUsQ0FBRSw4QkFEWSxDQUVoQkMsY0FBYyxDQUFFLFVBRkEsQ0FHaEJDLFdBQVcsQ0FBRSw4QkFIRyxDQVhxQixDQWdCdkNHLGdCQUFnQixDQUFFLENBQ2hCTCxFQUFFLENBQUUsOEJBRFksQ0FFaEJDLGNBQWMsQ0FBRSxVQUZBLENBR2hCQyxXQUFXLENBQUUsOEJBSEcsQ0FoQnFCLENBQUQsQ0FBakMsQ0F1QkEsR0FBTUksa0JBQWlCLENBQUcsQ0FDL0JDLEVBQUUsQ0FBRSxpQkFEMkIsQ0FFL0JDLFdBQVcsQ0FBRSx3QkFGa0IsQ0FHL0JDLGVBQWUsc0RBSGdCLENBQTFCLENBTUEsR0FBTUMsZUFBYyxDQUFHLGlDQUF2QiIsImZpbGUiOiI2MTgzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmV4cG9ydCBjb25zdCBQQUdFX0lOVFJPID0gZGVmaW5lTWVzc2FnZXMoe1xuICBQQUdFX1RJTEU6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS50aXRsZS50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NvbnRhY3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHRpdGxlIHRleHQnLFxuICB9LFxuICBQQUdFX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5oZWFkZXIudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb250YWN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ2NvbnRhY3QgcGFnZSBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfU1VCX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfREVTQ1JJUFRJT046IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IENPTlRBQ1RfVklBX0VNQUlMID0ge1xuICBJRDogJ2NvbnRhY3QuZ2VuZXJhbCcsXG4gIERFU0NSSVBUSU9OOiAnQ29udGFjdCBwYWdlIGJvZHkgdGV4dCcsXG4gIERFRkFVTFRfTUVTU0FHRTogYEZvciBnZW5lcmFsIGZlZWRiYWNrLCBlbWFpbCB7Z2VuZXJhbF9lbWFpbF9hZGRyZXNzfWAsXG59O1xuXG5leHBvcnQgY29uc3QgRkVFREJBQ0tfRU1BSUwgPSAnc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdic7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6183\n")},5345:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "qX": function() { return /* binding */ PAGE; },\n/* harmony export */ "Xr": function() { return /* binding */ DOWNLOAD_FILE_SIZE; },\n/* harmony export */ "_f": function() { return /* binding */ DOWNLOAD_LAST_UPDATED; },\n/* harmony export */ "IE": function() { return /* binding */ VERSION_NUMBER; },\n/* harmony export */ "iV": function() { return /* binding */ DOWNLOAD_ZIP_URL; },\n/* harmony export */ "uh": function() { return /* binding */ DOWNLOAD_PACKAGE; },\n/* harmony export */ "mj": function() { return /* binding */ DATASETS; },\n/* harmony export */ "it": function() { return /* binding */ DATASET_CARD_LABELS; },\n/* harmony export */ "_F": function() { return /* binding */ INDICATORS; },\n/* harmony export */ "RN": function() { return /* binding */ ADDITIONAL_INDICATORS; },\n/* harmony export */ "Zr": function() { return /* binding */ METHODOLOGY_STEPS; },\n/* harmony export */ "KZ": function() { return /* binding */ COMPLEX_METH_STEPS; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4424);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__);\nvar PAGE=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({TILE:{id:\'methodology.page.title.text\',defaultMessage:\'Data and Methodology\',description:\'methodology page title text\'},HEADING:{id:\'methodology.page.header.text\',defaultMessage:\'Methodology\',description:\'methodology page header text\'},DESCRIPTION:{id:\'methodology.page.paragraph.first\',defaultMessage:\'The methodology for identifying communities of focus is currently \'+\'in a draft, pre-decisional form that may change over time as more datasets become available.\',description:\'methodology page paragraph 1\'}});// Download Package\nvar DOWNLOAD_FILE_SIZE=\'111MB\';var DOWNLOAD_LAST_UPDATED=\'10/01/21\';var VERSION_NUMBER=\'0.1\';var DOWNLOAD_ZIP_URL=["https://d3jqyw10j8e7p9.cloudfront.net","data-pipeline/data/score","downloadable/Screening_Tool_Data.zip"].join(\'/\');var DOWNLOAD_PACKAGE={TITLE:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.header.text\',defaultMessage:"Draft communities list v{versionNumber} ({downloadFileSize})",description:\'download packet header text\',values:{versionNumber:VERSION_NUMBER,downloadFileSize:DOWNLOAD_FILE_SIZE}}),DESCRIPTION:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.info.text\'// eslint-disable-next-line max-len\n,defaultMessage:"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).",description:\'download packet info text\',values:{versionNumber:VERSION_NUMBER}}),LAST_UPDATED:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.info.last.updated\',defaultMessage:"Last updated: {downloadLastUpdated} ",description:\'download packet info last updated\',values:{downloadLastUpdated:DOWNLOAD_LAST_UPDATED}}),BUTTON_TEXT:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.button.text\',defaultMessage:\'Download package\',description:\'download packet button text\'})};// Dataset section\nvar DATASETS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({HEADING:{id:\'datasetContainer.heading\',defaultMessage:\'Datasets used in methodology\',description:\'section heading of which datasets are used in cumulative score\'},INFO:{id:\'datasetContainer.info\',defaultMessage:\'The datasets come from a variety of sources and were selected\'+\' based on relevance, availability, recency, and quality. The datasets seek to\'+\' identify a range of human health, environmental, climate-related, and other\'+\' cumulative impacts on communities.\',description:\'description of the dataset section\'},ADDITIONAL_HEADING:{id:\'datasetContainer.additional.heading\',defaultMessage:\'Additional Indicators\',description:\'additional indicators heading\'},ADDITIONAL_INFO:{id:\'datasetContainer.additional.info\',defaultMessage:\'These datasets provide additional information about each community.\',description:\'additional indicator info\'}});var DATASET_CARD_LABELS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({RESOLUTION:{id:\'datasetCard.dataResolution\',defaultMessage:\'Data resolution: \',description:\'label associated with explaining the card\'},SOURCE:{id:\'datasetCard.dataSource\',defaultMessage:\'Data source: \',description:\'label associated with explaining the card\'},DATE_RANGE:{id:\'datasetCard.dataDateRange\',defaultMessage:\'Data date range: \',description:\'label associated with explaining the card\'}});var INDICATORS=[{indicator:\'Area Median Income\',description:"Median income of the census block group calculated as a percent \\n of the metropolitan area\\u2019s or state\'s median income.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Poverty\',description:"Percent of a block group\'s population in households where the household income"+" is at or below 100% of the federal poverty level.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Education, less than high school education\',description:"Percent of people ages 25 years or older in a block group whose \\n education level is less than a high school diploma.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"}];var ADDITIONAL_INDICATORS=[{indicator:\'Diabetes\',description:"People ages 18 years and older who report having ever been \\n told by a doctor, nurse, or other health professionals that they have \\n diabetes other than diabetes during pregnancy.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Asthma\',description:"Weighted number of respondents people who answer \\u201Cyes\\u201D both \\n to both of the following questions: \\u201CHave you ever been told by a doctor, \\n nurse, or other health professional that you have asthma?\\u201D and the question \\n \\u201CDo you still have asthma?\\u201D",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Heart disease\',description:"People ages 18 years and older who report ever having been told \\n by a doctor, nurse, or other health professionals that they had angina or \\n coronary heart disease.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Life expectancy\',description:"Estimated years of life expectancy.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) \\n US Small-area Life Expectancy Estimates Project",dataSourceURL:"https://www.cdc.gov/nchs/nvss/usaleep/usaleep.html#data",dataDateRange:"2010-2015"},{indicator:\'Traffic proximity and volume\',description:"Count of vehicles (average annual daily traffic) at major roads \\n within 500 meters, divided by distance in meters (not km).",dataResolution:"Census block group",dataSourceLabel:"Department of Transportation (DOT) traffic data as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2017"},{indicator:\'FEMA Risk Index Expected Annual Loss Score\',description:"Average economic loss in dollars resulting from natural \\n hazards each year. It is calculated for each hazard type and quantifies \\n loss for relevant consequence types: buildings, people, and agriculture.",dataResolution:"Census tract",dataSourceLabel:"Federal Emergency Management Agency (FEMA)",dataSourceURL:"https://hazards.fema.gov/nri/expected-annual-loss",dataDateRange:"2014-2017"},{indicator:\'Energy burden\',description:"Average annual energy cost ($) divided by household income.",dataResolution:"Census tract",dataSourceLabel:"Department of Energy (DOE) LEAD Score",dataSourceURL:"https://www.energy.gov/eere/slsc/low-income-energy-affordability-data-lead-tool",dataDateRange:"2018"},{indicator:\'Housing cost burden\',description:"Households that are low income and spend more than 30% of their \\n income to housing costs.",dataResolution:"Census tract",dataSourceLabel:"Department of Housing & Urban Development\\u2019s \\n (HUD) Comprehensive Housing Affordability Strategy dataset",dataSourceURL:"https://www.huduser.gov/portal/datasets/cp.html",dataDateRange:"2013-2017"},{indicator:\'Wastewater discharge\',description:"RSEI modeled Toxic Concentrations at stream segments within 500 \\n meters, divided by distance in kilometers (km).",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) Risk-Screening \\n Environmental Indicators (RSEI) Model as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2020"},{indicator:\'Lead paint\',description:"Percent of housing units built pre-1960, used as an \\n indicator of potential lead paint exposure in homes.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Diesel particulate matter\',description:"Mixture of particles that is part of diesel exhaust in the air.",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) National Air Toxics Assessment (NATA)\\n as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'PM2.5\',description:"Fine inhalable particles, with diameters that are generally \\n 2.5 micrometers and smaller.",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) Office of Air \\n and Radiation (OAR) fusion of model and monitor data as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2017"}];// Methodology Steps:\nvar METHODOLOGY_STEPS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({HEADING:{id:\'methodology.steps.heading\',defaultMessage:"Methodology",description:\'heading of methodology section\'},DESCRIPTION_1:{id:\'methodology.steps.description.1\',defaultMessage:\'The methodology for identifying communities of focus is\'+\' calculated at the census block group level. Census block geographical boundaries\'+\' are determined by the U.S. Census Bureau once every ten years. This tool utilizes\'+\' the census block boundaries from 2010.\',description:\'first description text \'},DESCRIPTION_2:{id:\'methodology.steps.description.2\',defaultMessage:\'The following describes the process for identifying communities of focus.\',description:\'second description text\'},STEP_1_HEADING:{id:\'methodology.step.1.heading\',defaultMessage:"Gather datasets",description:\'first step heading\'},STEP_1_INFO:{id:\'methodology.step.1.info\',defaultMessage:"The methodology includes the following inputs that are equally weighted.",description:\'first step info\'},STEP_1_A_HEADING:{id:\'methodology.step.1.a.heading\',defaultMessage:"Percent of Area Median Income",description:\'step 1 a heading\'},STEP_1_A_INFO_1:{id:\'methodology.step.1.a.info.1\',defaultMessage:\'If a census block group is in a metropolitan area, this value is the\'+\' median income of the census block group calculated as a percent of\'+\' the metropolitan area’s median income.\',description:\'step 1 a info 1\'},STEP_1_A_INFO_2:{id:\'methodology.step.1.a.info.2\',defaultMessage:\'If a census block group is not in a metropolitan area, this value is the\'+\' median income of the census block group calculated as a percent of the state’s median\'+\' income.\',description:\'step 1 a info 2\'},STEP_1_B_HEADING:{id:\'methodology.step.1.b.heading\',defaultMessage:"Percent of households below or at 100% of the federal poverty line",description:\'step 1 b heading\'},STEP_1_C_HEADING:{id:\'methodology.step.1.c.heading\',defaultMessage:"The high school degree achievement rate for adults 25 years and older",description:\'step 1 a heading\'},STEP_1_C_INFO:{id:\'methodology.step.1.c.info\',defaultMessage:\'The percent of individuals who are 25 or older who have received a high school degree.\',description:\'step 1 c info\'},STEP_2_HEADING:{id:\'methodology.step.2.heading\',defaultMessage:"Determine communites of focus",description:\'second step heading\'},STEP_2_INFO:{id:\'methodology.step.2.info\',defaultMessage:"Under the existing formula, a census block group will be considered a community of focus if:",description:\'second step info\'}});var FED_POVERTY_LINE_URL=\'https://www.census.gov/topics/income-poverty/poverty/guidance/poverty-measures.html\';// Copy that has links or other HTML tags in them\nvar COMPLEX_METH_STEPS={STEP_2_B_INFO:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'methodology.steps.2.b.info\',description:\'Download the draft list of communities of focus and datasets used.\',defaultMessage:"This is the percent of households in a state with a household income \\n below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated \\n based on the composition of each household (e.g., based on household size), but it does not vary geographically.",values:{federalPovertyLine:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("a",{href:FED_POVERTY_LINE_URL,target:"_blank",rel:"noreferrer"},"federal poverty line")}}),FORMULA:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'methodology.steps.2.formula\',description:\'Formala used to calculate communities of focus\',defaultMessage:"{medianIncome} {or} {livingAtPovery} {and} {education}",values:{medianIncome:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",null,"(The median income is less than 80% of the area median income"),or:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"OR"),livingAtPovery:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"households living in poverty (at or below 100% of the federal poverty level) is greater than 20%)"),and:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"AND"),education:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"The high school degree achievement rate for adults 25 years and older is greater than 95%")}})};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvbWV0aG9kb2xvZ3kudHN4P2E0MGYiXSwibmFtZXMiOlsiUEFHRSIsImRlZmluZU1lc3NhZ2VzIiwiVElMRSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsIkhFQURJTkciLCJERVNDUklQVElPTiIsIkRPV05MT0FEX0ZJTEVfU0laRSIsIkRPV05MT0FEX0xBU1RfVVBEQVRFRCIsIlZFUlNJT05fTlVNQkVSIiwiRE9XTkxPQURfWklQX1VSTCIsInByb2Nlc3MiLCJqb2luIiwiRE9XTkxPQURfUEFDS0FHRSIsIlRJVExFIiwidmVyc2lvbk51bWJlciIsImRvd25sb2FkRmlsZVNpemUiLCJMQVNUX1VQREFURUQiLCJkb3dubG9hZExhc3RVcGRhdGVkIiwiQlVUVE9OX1RFWFQiLCJEQVRBU0VUUyIsIklORk8iLCJBRERJVElPTkFMX0hFQURJTkciLCJBRERJVElPTkFMX0lORk8iLCJEQVRBU0VUX0NBUkRfTEFCRUxTIiwiUkVTT0xVVElPTiIsIlNPVVJDRSIsIkRBVEVfUkFOR0UiLCJJTkRJQ0FUT1JTIiwiaW5kaWNhdG9yIiwiZGF0YVJlc29sdXRpb24iLCJkYXRhU291cmNlTGFiZWwiLCJkYXRhU291cmNlVVJMIiwiZGF0YURhdGVSYW5nZSIsIkFERElUSU9OQUxfSU5ESUNBVE9SUyIsIk1FVEhPRE9MT0dZX1NURVBTIiwiREVTQ1JJUFRJT05fMSIsIkRFU0NSSVBUSU9OXzIiLCJTVEVQXzFfSEVBRElORyIsIlNURVBfMV9JTkZPIiwiU1RFUF8xX0FfSEVBRElORyIsIlNURVBfMV9BX0lORk9fMSIsIlNURVBfMV9BX0lORk9fMiIsIlNURVBfMV9CX0hFQURJTkciLCJTVEVQXzFfQ19IRUFESU5HIiwiU1RFUF8xX0NfSU5GTyIsIlNURVBfMl9IRUFESU5HIiwiU1RFUF8yX0lORk8iLCJGRURfUE9WRVJUWV9MSU5FX1VSTCIsIkNPTVBMRVhfTUVUSF9TVEVQUyIsIlNURVBfMl9CX0lORk8iLCJmZWRlcmFsUG92ZXJ0eUxpbmUiLCJGT1JNVUxBIiwibWVkaWFuSW5jb21lIiwib3IiLCJsaXZpbmdBdFBvdmVyeSIsImFuZCIsImVkdWNhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSU8sR0FBTUEsS0FBSSxDQUFHQyxvRUFBYyxDQUFDLENBQ2pDQyxJQUFJLENBQUUsQ0FDSkMsRUFBRSxDQUFFLDZCQURBLENBRUpDLGNBQWMsQ0FBRSxzQkFGWixDQUdKQyxXQUFXLENBQUUsNkJBSFQsQ0FEMkIsQ0FNakNDLE9BQU8sQ0FBRSxDQUNQSCxFQUFFLENBQUUsOEJBREcsQ0FFUEMsY0FBYyxDQUFFLGFBRlQsQ0FHUEMsV0FBVyxDQUFFLDhCQUhOLENBTndCLENBV2pDRSxXQUFXLENBQUUsQ0FDWEosRUFBRSxDQUFFLGtDQURPLENBRVhDLGNBQWMsQ0FBRSxxRUFDZCw4RkFIUyxDQUlYQyxXQUFXLENBQUUsOEJBSkYsQ0FYb0IsQ0FBRCxDQUEzQixDQW9CUDtBQUNPLEdBQU1HLG1CQUFrQixDQUFHLE9BQTNCLENBQ0EsR0FBTUMsc0JBQXFCLENBQUcsVUFBOUIsQ0FDQSxHQUFNQyxlQUFjLENBQUcsS0FBdkIsQ0FFQSxHQUFNQyxpQkFBZ0IsQ0FBRyxDQUM5QkMsdUNBRDhCLENBRTlCQSwwQkFGOEIsQ0FHOUJBLHNDQUg4QixFQUk5QkMsSUFKOEIsQ0FJekIsR0FKeUIsQ0FBekIsQ0FNQSxHQUFNQyxpQkFBZ0IsQ0FBRyxDQUM5QkMsS0FBSyxjQUFFLGlEQUFDLGdFQUFELEVBQ0wsRUFBRSxDQUFFLDRCQURDLENBRUwsY0FBYywrREFGVCxDQUdMLFdBQVcsQ0FBRSw2QkFIUixDQUlMLE1BQU0sQ0FBRyxDQUNQQyxhQUFhLENBQUVOLGNBRFIsQ0FFUE8sZ0JBQWdCLENBQUVULGtCQUZYLENBSkosRUFEdUIsQ0FVOUJELFdBQVcsY0FBRSxpREFBQyxnRUFBRCxFQUNYLEVBQUUsQ0FBRywwQkFDTDtBQUZXLENBR1gsY0FBYyxxSkFISCxDQUlYLFdBQVcsQ0FB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QUErQyxHQUFHLENBQUMsWUFBbkQseUJBRk0sQ0FOSyxFQURpQixDQWNoQ0ksT0FBTyxjQUFFLGlEQUFDLGdFQUFELEVBQ1AsRUFBRSxDQUFFLDZCQURHLENBRVAsV0FBVyxDQUFFLGdEQUZOLENBR1AsY0FBYyx5REFIUCxDQUlQLE1BQU0sQ0FBRSxDQUNOQyxZQUFZLGNBQ1YsMEhBRkksQ0FLTkMsRUFBRSxjQUNBLHNEQUFHLFNBQVMsQ0FBRSxPQUFkLE9BTkksQ0FTTkMsY0FBYyxjQUNaLHNEQUFHLFNBQVMsQ0FBRSxPQUFkLHNHQVZJLENBYU5DLEdBQUcsY0FDRCxzREFBRyxTQUFTLENBQUUsT0FBZCxRQWRJLENBaUJOQyxTQUFTLGNBQ1Asc0RBQUcsU0FBUyxDQUFFLE9BQWQsOEZBbEJJLENBSkQsRUFkdUIsQ0FBM0IiLCJmaWxlIjoiNTM0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuZXhwb3J0IGNvbnN0IFBBR0UgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFRJTEU6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnBhZ2UudGl0bGUudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIGFuZCBNZXRob2RvbG9neScsXG4gICAgZGVzY3JpcHRpb246ICdtZXRob2RvbG9neSBwYWdlIHRpdGxlIHRleHQnLFxuICB9LFxuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5wYWdlLmhlYWRlci50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ01ldGhvZG9sb2d5JyxcbiAgICBkZXNjcmlwdGlvbjogJ21ldGhvZG9sb2d5IHBhZ2UgaGVhZGVyIHRleHQnLFxuICB9LFxuICBERVNDUklQVElPTjoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kucGFnZS5wYXJhZ3JhcGguZmlyc3QnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIG1ldGhvZG9sb2d5IGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cyBpcyBjdXJyZW50bHkgJyArXG4gICAgICAnaW4gYSBkcmFmdCwgcHJlLWRlY2lzaW9uYWwgZm9ybSB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFzIG1vcmUgZGF0YXNldHMgYmVjb21lIGF2YWlsYWJsZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnbWV0aG9kb2xvZ3kgcGFnZSBwYXJhZ3JhcGggMScsXG4gIH0sXG59KTtcblxuXG4vLyBEb3dubG9hZCBQYWNrYWdlXG5leHBvcnQgY29uc3QgRE9XTkxPQURfRklMRV9TSVpFID0gJzExMU1CJztcbmV4cG9ydCBjb25zdCBET1dOTE9BRF9MQVNUX1VQREFURUQgPSAnMTAvMDEvMjEnO1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fTlVNQkVSID0gJzAuMSc7XG5cbmV4cG9ydCBjb25zdCBET1dOTE9BRF9aSVBfVVJMID0gW1xuICBwcm9jZXNzLmVudi5HQVRTQllfQ0ROX1RJTEVTX0JBU0VfVVJMLFxuICBwcm9jZXNzLmVudi5HQVRTQllfREFUQV9QSVBFTElORV9TQ09SRV9QQVRILFxuICBwcm9jZXNzLmVudi5HQVRTQllfU0NPUkVfRE9XTkxPQURfRklMRV9QQVRILFxuXS5qb2luKCcvJyk7XG5cbmV4cG9ydCBjb25zdCBET1dOTE9BRF9QQUNLQUdFID0ge1xuICBUSVRMRTogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17J2Rvd25sb2FkUGFja2V0LmhlYWRlci50ZXh0J31cbiAgICBkZWZhdWx0TWVzc2FnZT17IGBEcmFmdCBjb21tdW5pdGllcyBsaXN0IHZ7dmVyc2lvbk51bWJlcn0gKHtkb3dubG9hZEZpbGVTaXplfSlgfVxuICAgIGRlc2NyaXB0aW9uPXsnZG93bmxvYWQgcGFja2V0IGhlYWRlciB0ZXh0J31cbiAgICB2YWx1ZXM9IHt7XG4gICAgICB2ZXJzaW9uTnVtYmVyOiBWRVJTSU9OX05VTUJFUixcbiAgICAgIGRvd25sb2FkRmlsZVNpemU6IERPV05MT0FEX0ZJTEVfU0laRSxcbiAgICB9fVxuICAvPixcbiAgREVTQ1JJUFRJT046IDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgaWQ9eyAnZG93bmxvYWRQYWNrZXQuaW5mby50ZXh0J31cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGRlZmF1bHRNZXNzYWdlPSB7YFRoZSBwYWNrYWdlIGluY2x1ZGVzIGRyYWZ0IHZ7dmVyc2lvbk51bWJlcn0gb2YgdGhlIGxpc3Qgb2YgY29tbXVuaXRpZXMgb2YgZm9jdXMgKC5jc3YgYW5kIC54bHN4KSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgbGlzdCAoLnBkZikuYH1cbiAgICBkZXNjcmlwdGlvbj0geydkb3dubG9hZCBwYWNrZXQgaW5mbyB0ZXh0J31cbiAgICB2YWx1ZXM9IHt7XG4gICAgICB2ZXJzaW9uTnVtYmVyOiBWRVJTSU9OX05VTUJFUixcbiAgICB9fVxuICAvPixcbiAgTEFTVF9VUERBVEVEOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsgJ2Rvd25sb2FkUGFja2V0LmluZm8ubGFzdC51cGRhdGVkJ31cbiAgICBkZWZhdWx0TWVzc2FnZT0ge2BMYXN0IHVwZGF0ZWQ6IHtkb3dubG9hZExhc3RVcGRhdGVkfSBgfVxuICAgIGRlc2NyaXB0aW9uPSB7J2Rvd25sb2FkIHBhY2tldCBpbmZvIGxhc3QgdXBkYXRlZCd9XG4gICAgdmFsdWVzPSB7e1xuICAgICAgZG93bmxvYWRMYXN0VXBkYXRlZDogRE9XTkxPQURfTEFTVF9VUERBVEVELFxuICAgIH19XG4gIC8+LFxuICBCVVRUT05fVEVYVDogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17ICdkb3dubG9hZFBhY2tldC5idXR0b24udGV4dCd9XG4gICAgZGVmYXVsdE1lc3NhZ2U9IHsnRG93bmxvYWQgcGFja2FnZSd9XG4gICAgZGVzY3JpcHRpb249IHsnZG93bmxvYWQgcGFja2V0IGJ1dHRvbiB0ZXh0J31cbiAgLz4sXG59O1xuXG5cbi8vIERhdGFzZXQgc2VjdGlvblxuZXhwb3J0IGNvbnN0IERBVEFTRVRTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q29udGFpbmVyLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YXNldHMgdXNlZCBpbiBtZXRob2RvbG9neScsXG4gICAgZGVzY3JpcHRpb246ICdzZWN0aW9uIGhlYWRpbmcgb2Ygd2hpY2ggZGF0YXNldHMgYXJlIHVzZWQgaW4gY3VtdWxhdGl2ZSBzY29yZScsXG4gIH0sXG4gIElORk86IHtcbiAgICBpZDogJ2RhdGFzZXRDb250YWluZXIuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgZGF0YXNldHMgY29tZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZCB3ZXJlIHNlbGVjdGVkJyArXG4gICAgJyBiYXNlZCBvbiByZWxldmFuY2UsIGF2YWlsYWJpbGl0eSwgcmVjZW5jeSwgYW5kIHF1YWxpdHkuIFRoZSBkYXRhc2V0cyBzZWVrIHRvJyArXG4gICAgJyBpZGVudGlmeSBhIHJhbmdlIG9mIGh1bWFuIGhlYWx0aCwgZW52aXJvbm1lbnRhbCwgY2xpbWF0ZS1yZWxhdGVkLCBhbmQgb3RoZXInICtcbiAgICAnIGN1bXVsYXRpdmUgaW1wYWN0cyBvbiBjb21tdW5pdGllcy4nLFxuICAgIGRlc2NyaXB0aW9uOiAnZGVzY3JpcHRpb24gb2YgdGhlIGRhdGFzZXQgc2VjdGlvbicsXG4gIH0sXG4gIEFERElUSU9OQUxfSEVBRElORzoge1xuICAgIGlkOiAnZGF0YXNldENvbnRhaW5lci5hZGRpdGlvbmFsLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQWRkaXRpb25hbCBJbmRpY2F0b3JzJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZGl0aW9uYWwgaW5kaWNhdG9ycyBoZWFkaW5nJyxcbiAgfSxcbiAgQURESVRJT05BTF9JTkZPOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q29udGFpbmVyLmFkZGl0aW9uYWwuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGVzZSBkYXRhc2V0cyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb21tdW5pdHkuJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZGl0aW9uYWwgaW5kaWNhdG9yIGluZm8nLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVRBU0VUX0NBUkRfTEFCRUxTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBSRVNPTFVUSU9OOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q2FyZC5kYXRhUmVzb2x1dGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHJlc29sdXRpb246ICcsXG4gICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gIH0sXG4gIFNPVVJDRToge1xuICAgIGlkOiAnZGF0YXNldENhcmQuZGF0YVNvdXJjZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHNvdXJjZTogJyxcbiAgICBkZXNjcmlwdGlvbjogJ2xhYmVsIGFzc29jaWF0ZWQgd2l0aCBleHBsYWluaW5nIHRoZSBjYXJkJyxcbiAgfSxcbiAgREFURV9SQU5HRToge1xuICAgIGlkOiAnZGF0YXNldENhcmQuZGF0YURhdGVSYW5nZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIGRhdGUgcmFuZ2U6ICcsXG4gICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IElORElDQVRPUlMgPSBbXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdBcmVhIE1lZGlhbiBJbmNvbWUnLFxuICAgIGRlc2NyaXB0aW9uOiBgTWVkaWFuIGluY29tZSBvZiB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IFxuICAgIG9mIHRoZSBtZXRyb3BvbGl0YW4gYXJlYeKAmXMgb3Igc3RhdGUncyBtZWRpYW4gaW5jb21lLmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYENlbnN1cydzIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXlgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvYWNzYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ1BvdmVydHknLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVyY2VudCBvZiBhIGJsb2NrIGdyb3VwJ3MgcG9wdWxhdGlvbiBpbiBob3VzZWhvbGRzIHdoZXJlIHRoZSBob3VzZWhvbGQgaW5jb21lYCArXG4gICAgYCBpcyBhdCBvciBiZWxvdyAxMDAlIG9mIHRoZSBmZWRlcmFsIHBvdmVydHkgbGV2ZWwuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2Vuc3VzJ3MgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9hY3NgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnRWR1Y2F0aW9uLCBsZXNzIHRoYW4gaGlnaCBzY2hvb2wgZWR1Y2F0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgcGVvcGxlIGFnZXMgMjUgeWVhcnMgb3Igb2xkZXIgaW4gYSBibG9jayBncm91cCB3aG9zZSBcbiAgICBlZHVjYXRpb24gbGV2ZWwgaXMgbGVzcyB0aGFuIGEgaGlnaCBzY2hvb2wgZGlwbG9tYS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBDZW5zdXMncyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL2Fjc2AsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTUtMjAxOWAsXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgQURESVRJT05BTF9JTkRJQ0FUT1JTID0gW1xuICB7XG4gICAgaW5kaWNhdG9yOiAnRGlhYmV0ZXMnLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVvcGxlIGFnZXMgMTggeWVhcnMgYW5kIG9sZGVyIHdobyByZXBvcnQgaGF2aW5nIGV2ZXIgYmVlbiBcbiAgICB0b2xkIGJ5IGEgZG9jdG9yLCBudXJzZSwgb3Igb3RoZXIgaGVhbHRoIHByb2Zlc3Npb25hbHMgdGhhdCB0aGV5IGhhdmUgXG4gICAgZGlhYmV0ZXMgb3RoZXIgdGhhbiBkaWFiZXRlcyBkdXJpbmcgcHJlZ25hbmN5LmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgdHJhY3RgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYENlbnRlcnMgZm9yIERpc2Vhc2UgQ29udHJvbCBhbmQgUHJldmVudGlvbiAoQ0RDKSBQTEFDRVNgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZGMuZ292L3BsYWNlcy9pbmRleC5odG1sYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNi0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0FzdGhtYScsXG4gICAgZGVzY3JpcHRpb246IGBXZWlnaHRlZCBudW1iZXIgb2YgcmVzcG9uZGVudHMgcGVvcGxlIHdobyBhbnN3ZXIg4oCceWVz4oCdIGJvdGggXG4gICAgdG8gYm90aCBvZiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczog4oCcSGF2ZSB5b3UgZXZlciBiZWVuIHRvbGQgYnkgYSBkb2N0b3IsIFxuICAgIG51cnNlLCBvciBvdGhlciBoZWFsdGggcHJvZmVzc2lvbmFsIHRoYXQgeW91IGhhdmUgYXN0aG1hP+KAnSBhbmQgdGhlIHF1ZXN0aW9uIFxuICAgIOKAnERvIHlvdSBzdGlsbCBoYXZlIGFzdGhtYT/igJ1gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBDZW50ZXJzIGZvciBEaXNlYXNlIENvbnRyb2wgYW5kIFByZXZlbnRpb24gKENEQykgUExBQ0VTYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2RjLmdvdi9wbGFjZXMvaW5kZXguaHRtbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTYtMjAxOWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdIZWFydCBkaXNlYXNlJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlb3BsZSBhZ2VzIDE4IHllYXJzIGFuZCBvbGRlciB3aG8gcmVwb3J0IGV2ZXIgaGF2aW5nIGJlZW4gdG9sZCBcbiAgICBieSBhIGRvY3RvciwgbnVyc2UsIG9yIG90aGVyIGhlYWx0aCBwcm9mZXNzaW9uYWxzIHRoYXQgdGhleSBoYWQgYW5naW5hIG9yIFxuICAgIGNvcm9uYXJ5IGhlYXJ0IGRpc2Vhc2UuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2VudGVycyBmb3IgRGlzZWFzZSBDb250cm9sIGFuZCBQcmV2ZW50aW9uIChDREMpIFBMQUNFU2AsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNkYy5nb3YvcGxhY2VzL2luZGV4Lmh0bWxgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE2LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnTGlmZSBleHBlY3RhbmN5JyxcbiAgICBkZXNjcmlwdGlvbjogYEVzdGltYXRlZCB5ZWFycyBvZiBsaWZlIGV4cGVjdGFuY3kuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2VudGVycyBmb3IgRGlzZWFzZSBDb250cm9sIGFuZCBQcmV2ZW50aW9uIChDREMpIFxuICAgIFVTIFNtYWxsLWFyZWEgTGlmZSBFeHBlY3RhbmN5IEVzdGltYXRlcyBQcm9qZWN0YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdXNhbGVlcC91c2FsZWVwLmh0bWwjZGF0YWAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTAtMjAxNWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdUcmFmZmljIHByb3hpbWl0eSBhbmQgdm9sdW1lJyxcbiAgICBkZXNjcmlwdGlvbjogYENvdW50IG9mIHZlaGljbGVzIChhdmVyYWdlIGFubnVhbCBkYWlseSB0cmFmZmljKSBhdCBtYWpvciByb2FkcyBcbiAgICB3aXRoaW4gNTAwIG1ldGVycywgZGl2aWRlZCBieSBkaXN0YW5jZSBpbiBtZXRlcnMgKG5vdCBrbSkuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgRGVwYXJ0bWVudCBvZiBUcmFuc3BvcnRhdGlvbiAoRE9UKSB0cmFmZmljIGRhdGEgYXMgY29tcGlsZWQgYnkgRVBBJ3MgRUpTQ1JFRU5gLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5lcGEuZ292L2Vqc2NyZWVuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uLWVqc2NyZWVuYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxN2AsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdGRU1BIFJpc2sgSW5kZXggRXhwZWN0ZWQgQW5udWFsIExvc3MgU2NvcmUnLFxuICAgIGRlc2NyaXB0aW9uOiBgQXZlcmFnZSBlY29ub21pYyBsb3NzIGluIGRvbGxhcnMgcmVzdWx0aW5nIGZyb20gbmF0dXJhbCBcbiAgICBoYXphcmRzIGVhY2ggeWVhci4gSXQgaXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBoYXphcmQgdHlwZSBhbmQgcXVhbnRpZmllcyBcbiAgICBsb3NzIGZvciByZWxldmFudCBjb25zZXF1ZW5jZSB0eXBlczogYnVpbGRpbmdzLCBwZW9wbGUsIGFuZCBhZ3JpY3VsdHVyZS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBGZWRlcmFsIEVtZXJnZW5jeSBNYW5hZ2VtZW50IEFnZW5jeSAoRkVNQSlgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL2hhemFyZHMuZmVtYS5nb3YvbnJpL2V4cGVjdGVkLWFubnVhbC1sb3NzYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNC0yMDE3YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0VuZXJneSBidXJkZW4nLFxuICAgIGRlc2NyaXB0aW9uOiBgQXZlcmFnZSBhbm51YWwgZW5lcmd5IGNvc3QgKCQpIGRpdmlkZWQgYnkgaG91c2Vob2xkIGluY29tZS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBEZXBhcnRtZW50IG9mIEVuZXJneSAoRE9FKSBMRUFEIFNjb3JlYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuZW5lcmd5Lmdvdi9lZXJlL3Nsc2MvbG93LWluY29tZS1lbmVyZ3ktYWZmb3JkYWJpbGl0eS1kYXRhLWxlYWQtdG9vbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMThgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnSG91c2luZyBjb3N0IGJ1cmRlbicsXG4gICAgZGVzY3JpcHRpb246IGBIb3VzZWhvbGRzIHRoYXQgYXJlIGxvdyBpbmNvbWUgYW5kIHNwZW5kIG1vcmUgdGhhbiAzMCUgb2YgdGhlaXIgXG4gICAgaW5jb21lIHRvIGhvdXNpbmcgY29zdHMuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgRGVwYXJ0bWVudCBvZiBIb3VzaW5nICYgVXJiYW4gRGV2ZWxvcG1lbnTigJlzIFxuICAgIChIVUQpIENvbXByZWhlbnNpdmUgSG91c2luZyBBZmZvcmRhYmlsaXR5IFN0cmF0ZWd5IGRhdGFzZXRgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5odWR1c2VyLmdvdi9wb3J0YWwvZGF0YXNldHMvY3AuaHRtbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTMtMjAxN2AsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdXYXN0ZXdhdGVyIGRpc2NoYXJnZScsXG4gICAgZGVzY3JpcHRpb246IGBSU0VJIG1vZGVsZWQgVG94aWMgQ29uY2VudHJhdGlvbnMgYXQgc3RyZWFtIHNlZ21lbnRzIHdpdGhpbiA1MDAgXG4gICAgbWV0ZXJzLCBkaXZpZGVkIGJ5IGRpc3RhbmNlIGluIGtpbG9tZXRlcnMgKGttKS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIFJpc2stU2NyZWVuaW5nIFxuICAgIEVudmlyb25tZW50YWwgSW5kaWNhdG9ycyAoUlNFSSkgTW9kZWwgYXMgY29tcGlsZWQgYnkgRVBBJ3MgRUpTQ1JFRU5gLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5lcGEuZ292L2Vqc2NyZWVuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uLWVqc2NyZWVuYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAyMGAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdMZWFkIHBhaW50JyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgaG91c2luZyB1bml0cyBidWlsdCBwcmUtMTk2MCwgdXNlZCBhcyBhbiBcbiAgICBpbmRpY2F0b3Igb2YgcG90ZW50aWFsIGxlYWQgcGFpbnQgZXhwb3N1cmUgaW4gaG9tZXMuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2Vuc3VzJ3MgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9hY3NgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnRGllc2VsIHBhcnRpY3VsYXRlIG1hdHRlcicsXG4gICAgZGVzY3JpcHRpb246IGBNaXh0dXJlIG9mIHBhcnRpY2xlcyB0aGF0IGlzIHBhcnQgb2YgZGllc2VsIGV4aGF1c3QgaW4gdGhlIGFpci5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIE5hdGlvbmFsIEFpciBUb3hpY3MgQXNzZXNzbWVudCAoTkFUQSlcbiAgICBhcyBjb21waWxlZCBieSBFUEEncyBFSlNDUkVFTmAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmVwYS5nb3YvZWpzY3JlZW4vdGVjaG5pY2FsLWRvY3VtZW50YXRpb24tZWpzY3JlZW5gLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGA1LXllYXIgZXN0aW1hdGVzLCAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnUE0yLjUnLFxuICAgIGRlc2NyaXB0aW9uOiBgRmluZSBpbmhhbGFibGUgcGFydGljbGVzLCB3aXRoIGRpYW1ldGVycyB0aGF0IGFyZSBnZW5lcmFsbHkgXG4gICAgMi41IG1pY3JvbWV0ZXJzIGFuZCBzbWFsbGVyLmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYEVudmlyb25tZW50YWwgUHJvdGVjdGlvbiBBZ2VuY3kgKEVQQSkgT2ZmaWNlIG9mIEFpciBcbiAgICBhbmQgUmFkaWF0aW9uIChPQVIpIGZ1c2lvbiBvZiBtb2RlbCBhbmQgbW9uaXRvciBkYXRhIGFzIGNvbXBpbGVkIGJ5IEVQQSdzIEVKU0NSRUVOYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuZXBhLmdvdi9lanNjcmVlbi90ZWNobmljYWwtZG9jdW1lbnRhdGlvbi1lanNjcmVlbmAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTdgLFxuICB9LFxuXG5dO1xuXG5cbi8vIE1ldGhvZG9sb2d5IFN0ZXBzOlxuZXhwb3J0IGNvbnN0IE1FVEhPRE9MT0dZX1NURVBTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwcy5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYE1ldGhvZG9sb2d5YCxcbiAgICBkZXNjcmlwdGlvbjogJ2hlYWRpbmcgb2YgbWV0aG9kb2xvZ3kgc2VjdGlvbicsXG4gIH0sXG4gIERFU0NSSVBUSU9OXzE6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXBzLmRlc2NyaXB0aW9uLjEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIG1ldGhvZG9sb2d5IGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cyBpcycrXG4gICAgICcgY2FsY3VsYXRlZCBhdCB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGxldmVsLiBDZW5zdXMgYmxvY2sgZ2VvZ3JhcGhpY2FsIGJvdW5kYXJpZXMnK1xuICAgICAnIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBVLlMuIENlbnN1cyBCdXJlYXUgb25jZSBldmVyeSB0ZW4geWVhcnMuIFRoaXMgdG9vbCB1dGlsaXplcycrXG4gICAgICcgdGhlIGNlbnN1cyBibG9jayBib3VuZGFyaWVzIGZyb20gMjAxMC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnZmlyc3QgZGVzY3JpcHRpb24gdGV4dCAnLFxuICB9LFxuICBERVNDUklQVElPTl8yOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwcy5kZXNjcmlwdGlvbi4yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBwcm9jZXNzIGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cy4nLFxuICAgIGRlc2NyaXB0aW9uOiAnc2Vjb25kIGRlc2NyaXB0aW9uIHRleHQnLFxuICB9LFxuICBTVEVQXzFfSEVBRElORzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgR2F0aGVyIGRhdGFzZXRzYCxcbiAgICBkZXNjcmlwdGlvbjogJ2ZpcnN0IHN0ZXAgaGVhZGluZycsXG4gIH0sXG4gIFNURVBfMV9JTkZPOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IGBUaGUgbWV0aG9kb2xvZ3kgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBpbnB1dHMgdGhhdCBhcmUgZXF1YWxseSB3ZWlnaHRlZC5gLFxuICAgIGRlc2NyaXB0aW9uOiAnZmlyc3Qgc3RlcCBpbmZvJyxcbiAgfSxcbiAgU1RFUF8xX0FfSEVBRElORzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmEuaGVhZGluZycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IGBQZXJjZW50IG9mIEFyZWEgTWVkaWFuIEluY29tZWAsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYSBoZWFkaW5nJyxcbiAgfSxcbiAgU1RFUF8xX0FfSU5GT18xOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYS5pbmZvLjEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgYSBjZW5zdXMgYmxvY2sgZ3JvdXAgaXMgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYSwgdGhpcyB2YWx1ZSBpcyB0aGUnK1xuICAgICcgbWVkaWFuIGluY29tZSBvZiB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IG9mJytcbiAgICAnIHRoZSBtZXRyb3BvbGl0YW4gYXJlYeKAmXMgbWVkaWFuIGluY29tZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnc3RlcCAxIGEgaW5mbyAxJyxcbiAgfSxcbiAgU1RFUF8xX0FfSU5GT18yOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYS5pbmZvLjInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgYSBjZW5zdXMgYmxvY2sgZ3JvdXAgaXMgbm90IGluIGEgbWV0cm9wb2xpdGFuIGFyZWEsIHRoaXMgdmFsdWUgaXMgdGhlJytcbiAgICAnIG1lZGlhbiBpbmNvbWUgb2YgdGhlIGNlbnN1cyBibG9jayBncm91cCBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudCBvZiB0aGUgc3RhdGXigJlzIG1lZGlhbicrXG4gICAgJyBpbmNvbWUuJyxcbiAgICBkZXNjcmlwdGlvbjogJ3N0ZXAgMSBhIGluZm8gMicsXG4gIH0sXG4gIFNURVBfMV9CX0hFQURJTkc6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXAuMS5iLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgUGVyY2VudCBvZiBob3VzZWhvbGRzIGJlbG93IG9yIGF0IDEwMCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsaW5lYCxcbiAgICBkZXNjcmlwdGlvbjogJ3N0ZXAgMSBiIGhlYWRpbmcnLFxuICB9LFxuICBTVEVQXzFfQ19IRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYy5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYFRoZSBoaWdoIHNjaG9vbCBkZWdyZWUgYWNoaWV2ZW1lbnQgcmF0ZSBmb3IgYWR1bHRzIDI1IHllYXJzIGFuZCBvbGRlcmAsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYSBoZWFkaW5nJyxcbiAgfSxcbiAgU1RFUF8xX0NfSU5GTzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmMuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgcGVyY2VudCBvZiBpbmRpdmlkdWFscyB3aG8gYXJlIDI1IG9yIG9sZGVyIHdobyBoYXZlIHJlY2VpdmVkIGEgaGlnaCBzY2hvb2wgZGVncmVlLicsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYyBpbmZvJyxcbiAgfSxcbiAgU1RFUF8yX0hFQURJTkc6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXAuMi5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYERldGVybWluZSBjb21tdW5pdGVzIG9mIGZvY3VzYCxcbiAgICBkZXNjcmlwdGlvbjogJ3NlY29uZCBzdGVwIGhlYWRpbmcnLFxuICB9LFxuICBTVEVQXzJfSU5GTzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4yLmluZm8nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgVW5kZXIgdGhlIGV4aXN0aW5nIGZvcm11bGEsIGEgY2Vuc3VzIGJsb2NrIGdyb3VwIHdpbGwgYmUgY29uc2lkZXJlZCBhIGNvbW11bml0eSBvZiBmb2N1cyBpZjpgLFxuICAgIGRlc2NyaXB0aW9uOiAnc2Vjb25kIHN0ZXAgaW5mbycsXG4gIH0sXG59KTtcblxuY29uc3QgRkVEX1BPVkVSVFlfTElORV9VUkwgPSAnaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi90b3BpY3MvaW5jb21lLXBvdmVydHkvcG92ZXJ0eS9ndWlkYW5jZS9wb3ZlcnR5LW1lYXN1cmVzLmh0bWwnO1xuXG4vLyBDb3B5IHRoYXQgaGFzIGxpbmtzIG9yIG90aGVyIEhUTUwgdGFncyBpbiB0aGVtXG5leHBvcnQgY29uc3QgQ09NUExFWF9NRVRIX1NURVBTID0ge1xuICBTVEVQXzJfQl9JTkZPOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsnbWV0aG9kb2xvZ3kuc3RlcHMuMi5iLmluZm8nfVxuICAgIGRlc2NyaXB0aW9uPXsnRG93bmxvYWQgdGhlIGRyYWZ0IGxpc3Qgb2YgY29tbXVuaXRpZXMgb2YgZm9jdXMgYW5kIGRhdGFzZXRzIHVzZWQuJ31cbiAgICBkZWZhdWx0TWVzc2FnZT17YFRoaXMgaXMgdGhlIHBlcmNlbnQgb2YgaG91c2Vob2xkcyBpbiBhIHN0YXRlIHdpdGggYSBob3VzZWhvbGQgaW5jb21lIFxuICAgIGJlbG93IG9yIGF0IDEwMCUgb2YgdGhlIHtmZWRlcmFsUG92ZXJ0eUxpbmV9LiBUaGlzIGZlZGVyYWwgcG92ZXJ0eSBsaW5lIGlzIGNhbGN1bGF0ZWQgXG4gICAgYmFzZWQgb24gdGhlIGNvbXBvc2l0aW9uIG9mIGVhY2ggaG91c2Vob2xkIChlLmcuLCBiYXNlZCBvbiBob3VzZWhvbGQgc2l6ZSksIGJ1dCBpdCBkb2VzIG5vdCB2YXJ5IGdlb2dyYXBoaWNhbGx5LmB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBmZWRlcmFsUG92ZXJ0eUxpbmU6XG4gICAgICA8YSBocmVmPXtGRURfUE9WRVJUWV9MSU5FX1VSTH0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICBmZWRlcmFsIHBvdmVydHkgbGluZVxuICAgICAgPC9hPixcbiAgICB9fVxuICAvPixcbiAgRk9STVVMQTogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17J21ldGhvZG9sb2d5LnN0ZXBzLjIuZm9ybXVsYSd9XG4gICAgZGVzY3JpcHRpb249eydGb3JtYWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbW11bml0aWVzIG9mIGZvY3VzJ31cbiAgICBkZWZhdWx0TWVzc2FnZT17YHttZWRpYW5JbmNvbWV9IHtvcn0ge2xpdmluZ0F0UG92ZXJ5fSB7YW5kfSB7ZWR1Y2F0aW9ufWB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBtZWRpYW5JbmNvbWU6XG4gICAgICAgIDxwPlxuICAgICAgICAgKFRoZSBtZWRpYW4gaW5jb21lIGlzIGxlc3MgdGhhbiA4MCUgb2YgdGhlIGFyZWEgbWVkaWFuIGluY29tZVxuICAgICAgICA8L3A+LFxuICAgICAgb3I6XG4gICAgICAgIDxwIGNsYXNzTmFtZT17J2ZsdXNoJ30+XG4gICAgICAgICAgT1JcbiAgICAgICAgPC9wPixcbiAgICAgIGxpdmluZ0F0UG92ZXJ5OlxuICAgICAgICA8cCBjbGFzc05hbWU9eydmbHVzaCd9PlxuICAgICAgICAgIGhvdXNlaG9sZHMgbGl2aW5nIGluIHBvdmVydHkgKGF0IG9yIGJlbG93IDEwMCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsZXZlbCkgaXMgZ3JlYXRlciB0aGFuIDIwJSlcbiAgICAgICAgPC9wPixcbiAgICAgIGFuZDpcbiAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmx1c2gnfT5cbiAgICAgICAgICBBTkRcbiAgICAgICAgPC9wPixcbiAgICAgIGVkdWNhdGlvbjpcbiAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmx1c2gnfT5cbiAgICAgICAgICBUaGUgaGlnaCBzY2hvb2wgZGVncmVlIGFjaGlldmVtZW50IHJhdGUgZm9yIGFkdWx0cyAyNSB5ZWFycyBhbmQgb2xkZXIgaXMgZ3JlYXRlciB0aGFuIDk1JVxuICAgICAgICA8L3A+LFxuICAgIH19XG4gIC8+LFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5345\n')},1317:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ cejst; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/howYouCanHelp.module.scss\n// extracted by mini-css-extract-plugin\nvar howYouCanHelpContainer = \"howYouCanHelp-module--howYouCanHelpContainer--3wcow\";\nvar howYouCanHelpList = \"howYouCanHelp-module--howYouCanHelpList--3wyFv\";\nvar howYouCanHelpListWrapper = \"howYouCanHelp-module--howYouCanHelpListWrapper--BL7AD\";\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n// EXTERNAL MODULE: ./src/data/copy/contact.tsx\nvar contact = __webpack_require__(6183);\n// EXTERNAL MODULE: ./src/data/copy/methodology.tsx\nvar methodology = __webpack_require__(5345);\n;// CONCATENATED MODULE: ./src/data/copy/explore.tsx\nvar PAGE_INTRO=(0,react_intl_lib/* defineMessages */.vU)({PAGE_TILE:{id:'exploreTool.title.text',defaultMessage:'Explore the tool',description:'explore the tool title text'},PAGE_HEADING:{id:'exploreTool.heading.text',defaultMessage:'Explore the tool',description:'explore the tool heading text'}});var PAGE_DESCRIPTION=/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'exploreTool.page.description',defaultMessage:\"Zoom into the map to see communities of focus that can help Federal agencies\\n identify disadvantaged communities and to provide socioeconomic,\\n environmental, and climate information and data. Learn more about the methodology\\n and datasets that were used to determine these communities of focus on the\\n {methodologyLink}\\n page.\",description:'page description',values:{methodologyLink:/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},\"Data & methodology\")}});var LEGEND=(0,react_intl_lib/* defineMessages */.vU)({PRIORITY_LABEL:{id:'legend.info.priority.label',defaultMessage:'Draft community of focus',description:'the label of the prioritized community legend'},PRIORITY_DESCRIPT:{id:'legend.info.threshold.label',defaultMessage:'A community identified as experiencing disadvantages that merits'+' the focus of certain Federal investments, including through the Justice40 Initiative',description:'the label of the threshold community legend'}});// Map\nvar MAP=(0,react_intl_lib/* defineMessages */.vU)({ZOOM_WARNING:{id:'map.zoom.warning',defaultMessage:'Zoom in to the state or regional level to see prioritized communities on the map.',description:'zoom warning on map'},LOWER48_SHORT:{id:'map.territoryFocus.lower48.short',defaultMessage:'48',description:'The abbreviated name indicating the bounds of the Lower 48 states'},LOWER48_LONG:{id:'map.territoryFocus.lower48.long',defaultMessage:'Lower 48',description:'The longer name indicating the bounds of the Lower 48 states'},ALASKA_SHORT:{id:'map.territoryFocus.alaska.short',defaultMessage:'AK',description:'The abbreviated indicating the bounds of Alaska'},ALASKA_LONG:{id:'map.territoryFocus.alaska.long',defaultMessage:'Alaska',description:'The full name indicating the bounds of Alaska'},HAWAII_SHORT:{id:'map.territoryFocus.hawaii.short',defaultMessage:'HI',description:'The abbreviated name indicating the bounds of Hawaii'},HAWAII_LONG:{id:'map.territoryFocus.hawaii.long',defaultMessage:'Hawaii',description:'The longer name indicating the bounds of Hawaii'},PR_SHORT:{id:'map.territoryFocus.puerto_rico.short',defaultMessage:'PR',description:'The abbreviated name indicating the bounds of Puerto Rico'},PR_LONG:{id:'map.territoryFocus.puerto_rico.long',defaultMessage:'Puerto Rico',description:'The full name indicating the bounds of Puerto Rico'}});// Side Panel copy\nvar SIDE_PANEL_INITIAL_STATE=(0,react_intl_lib/* defineMessages */.vU)({TITLE:{id:'mapIntro.mapIntroHeader',defaultMessage:'Zoom and select a census block group to view data',description:'introductory text of ways to use the map'},DID_YOU_KNOW:{id:'mapIntro.didYouKnow',defaultMessage:' Did you know?',description:'text prompting a cite paragraph'},CBG_DEFINITION:{id:'mapIntro.censusBlockGroupDefinition',defaultMessage:'A census block group is generally between 600 and 3,000 people. '+'It is the smallest geographical unit for which the U.S. Census '+'Bureau publishes sample data.',description:'cites the definition and helpful information about census groups'}});var SIDE_PANEL_CBG_INFO=(0,react_intl_lib/* defineMessages */.vU)({CENSUS_BLOCK_GROUP:{id:'areaDetail.geographicInfo.censusBlockGroup',defaultMessage:'Census block group:',description:'the census block group id number of the feature selected'},COUNTY:{id:'areaDetail.geographicInfo.county',defaultMessage:'County:',description:'the county of the feature selected'},STATE:{id:'areaDetail.geographicInfo.state',defaultMessage:'State: ',description:'the state of the feature selected'},POPULATION:{id:'areaDetail.geographicInfo.population',defaultMessage:'Population:',description:'the population of the feature selected'}});var COMMUNITY={OF_FOCUS:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'areaDetail.categorization.community.of.focus',defaultMessage:'Community of focus',description:'the communities the score currently is focused on'}),NOT_OF_FOCUS:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'areaDetail.categorization.not.community.of.focus',defaultMessage:'Not a community of focus',description:'the communities the score currently is not focused on'})};var SIDE_PANEL_INDICATORS=(0,react_intl_lib/* defineMessages */.vU)({INDICATOR_COLUMN_HEADER:{id:'areaDetail.indicators.indicatorColumnHeader',defaultMessage:'Indicator',description:'the population of the feature selected'},PERCENTILE_COLUMN_HEADER:{id:'areaDetail.indicators.percentileColumnHeader',defaultMessage:'Percentile (0-100)',description:'the population of the feature selected'},POVERTY:{id:'areaDetail.indicator.poverty',defaultMessage:'Poverty',description:'Household income is less than or equal to twice the federal \"poverty level\"'},AREA_MEDIAN_INCOME:{id:'areaDetail.indicator.areaMedianIncome',defaultMessage:'Area Median Income',description:'calculated as percent of the area median income'},EDUCATION:{id:'areaDetail.indicator.education',defaultMessage:'Education, less than high school',description:'Percent of people age 25 or older that didn’t get a high school diploma'},ASTHMA:{id:'areaDetail.indicator.asthma',defaultMessage:'Asthma',description:'have asthma or been diagnosed by a doctor to have asthma'},DIABETES:{id:'areaDetail.indicator.diabetes',defaultMessage:'Diabetes',description:'diabetes from dr or nurse'},DIESEL_PARTICULATE_MATTER:{id:'areaDetail.indicator.dieselPartMatter',defaultMessage:'Diesel particulate matter',description:'Diesel particulate matter level in air'},ENERGY_BURDEN:{id:'areaDetail.indicator.energyBurden',defaultMessage:'Energy burden',description:'Average annual energy cost ($) divided by household income'},FEMA_RISK:{id:'areaDetail.indicator.femaRisk',defaultMessage:'FEMA Risk Index',description:'Risk based on 18 natural hazard types, in addition to a '+'community\\'s social vulnerability and community resilience'},HEART_DISEASE:{id:'areaDetail.indicator.heartDisease',defaultMessage:'Heart disease',description:'People ages 18 and up who report ever having been told by a'+'doctor, nurse, or other health professionals that they had angina or coronary heart disease'},HOUSE_BURDEN:{id:'areaDetail.indicator.houseBurden',defaultMessage:'Housing cost burden',description:'People ages 18 and up who report having been told by a doctor,'+' nurse, or other health professionals that they have diabetes other than diabetes during pregnancy'},LEAD_PAINT:{id:'areaDetail.indicator.leadPaint',defaultMessage:'Lead paint',description:'Housing units built pre-1960, used as an indicator of potential'+' lead paint exposure in homes'},LIFE_EXPECT:{id:'areaDetail.indicator.lifeExpect',defaultMessage:'Life expectancy',description:'Estimated years of life expectancy'},PM_2_5:{id:'areaDetail.indicator.pm25',defaultMessage:'PM2.5',description:'Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller'},TRAFFIC_VOLUME:{id:'areaDetail.indicator.trafficVolume',defaultMessage:'Traffic proximity and volume',description:'Count of vehicles (average annual daily traffic) at major roads within 500 meters,'+' divided by distance in meters'},WASTE_WATER:{id:'areaDetail.indicator.wasteWater',defaultMessage:'Wastewater discharge',description:'Toxic concentrations at stream segments within 500 meters divided by distance in'+' kilometers'}});var SIDE_PANEL_INDICATOR_DESCRIPTION=(0,react_intl_lib/* defineMessages */.vU)({AREA_MEDIAN_INCOME:{id:'areaDetail.indicator.description.area_median_income',defaultMessage:'Median income of the census block group calculated as a percent of the metropolitan'+' area’s or state\\'s median income',description:'Median income of the census block group calculated as a percent of the metropolitan'+' area’s or state\\'s median income'},EDUCATION:{id:'areaDetail.indicator.description.education',defaultMessage:'Percent of people age 25 or older that didn’t get a high school diploma',description:'Percent of people age 25 or older that didn’t get a high school diploma'},POVERTY:{id:'areaDetail.indicator.description.poverty',defaultMessage:'Percent of a block group\\'s population in households where the household income'+' is at or below 100% of the federal poverty level',description:'Percent of a block group\\'s population in households where the household income'+' is at or below 100% of the federal poverty level'},ASTHMA:{id:'areaDetail.indicator.description.asthma',defaultMessage:'People who answer “yes” to both of the questions: “Have you ever been told by'+' a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"',description:'People who answer “yes” to both of the questions: “Have you ever been told by'+' a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"'},DIABETES:{id:'areaDetail.indicator.description.diabetes',defaultMessage:'People ages 18 and up who report having been told by a doctor, nurse, or other'+' health professionals that they have diabetes other than diabetes during pregnancy',description:'People ages 18 and up who report having been told by a doctor, nurse, or other'+' health professionals that they have diabetes other than diabetes during pregnancy'},DIESEL_PARTICULATE_MATTER:{id:'areaDetail.indicator.description.dieselPartMatter',defaultMessage:'Mixture of particles that is part of diesel exhaust in the air',description:'Mixture of particles that is part of diesel exhaust in the air'},ENERGY_BURDEN:{id:'areaDetail.indicator.description.energyBurden',defaultMessage:'Average annual energy cost ($) divided by household income',description:'Average annual energy cost ($) divided by household income'},FEMA_RISK:{id:'areaDetail.indicator.description.femaRisk',defaultMessage:'Expected Annual Loss Score, which is the average economic loss in dollars'+' resulting from natural hazards each year.',description:'Expected Annual Loss Score, which is the average economic loss in dollars'+' resulting from natural hazards each year.'},HEART_DISEASE:{id:'areaDetail.indicator.description.heartDisease',defaultMessage:'People ages 18 and up who report ever having been told by a'+' doctor, nurse, or other health professionals that they had angina or coronary heart disease',description:'People ages 18 and up who report ever having been told by a'+' doctor, nurse, or other health professionals that they had angina or coronary heart disease'},HOUSE_BURDEN:{id:'areaDetail.indicator.description.houseBurden',defaultMessage:'Households that are low income and spend more than 30% of their income on'+' housing costs',description:'Households that are low income and spend more than 30% of their income on'+' housing costs'},LEAD_PAINT:{id:'areaDetail.indicator.description.leadPaint',defaultMessage:'Housing units built pre-1960, used as an indicator of potential'+' lead paint exposure in homes',description:'Housing units built pre-1960, used as an indicator of potential'+' lead paint exposure in homes'},LIFE_EXPECT:{id:'areaDetail.indicator.description.lifeExpect',defaultMessage:'Estimated years of life expectancy',description:'Estimated years of life expectancy'},PM_2_5:{id:'areaDetail.indicator.description.pm25',defaultMessage:'Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller',description:'Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller'},TRAFFIC_VOLUME:{id:'areaDetail.indicator.description.trafficVolume',defaultMessage:'Count of vehicles (average annual daily traffic) at major roads within 500 meters,'+' divided by distance in meters',description:'Count of vehicles (average annual daily traffic) at major roads within 500 meters,'+' divided by distance in meters'},WASTE_WATER:{id:'areaDetail.indicator.description.wasteWater',defaultMessage:'Toxic concentrations at stream segments within 500 meters divided by distance in'+' kilometers',description:'Toxic concentrations at stream segments within 500 meters divided by distance in'+' kilometers'}});var DOWNLOAD_DRAFT={PARAGRAPH_1:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'download.draft.ptag.1',description:'Download the draft list of communities of focus and datasets used.',defaultMessage:\"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.\",values:{downloadDraft:/*#__PURE__*/react.createElement(\"a\",{href:methodology/* DOWNLOAD_ZIP_URL */.iV},'Download the draft list'),dateUpdated:methodology/* DOWNLOAD_LAST_UPDATED */._f}}),PARAGRAPH_2:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'download.draft.ptag.2',description:'Download the draft list of communities of focus and datasets used.',defaultMessage:\"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).\",values:{downloadFileSize:methodology/* DOWNLOAD_FILE_SIZE */.Xr}})};var HOW_YOU_CAN_HELP_LIST_ITEMS={HEADING:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'youCanHelpInfoText.heading',description:'how one can help us improve the tool',defaultMessage:\"How you can help improve the tool\"}),LIST_ITEM_1:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'youCanHelpInfoText.list.item.1',description:'how one can help us via email',defaultMessage:\"If you have helpful information, we would love to {rxEmailFromYou}.\",values:{rxEmailFromYou:/*#__PURE__*/react.createElement(\"a\",{href:\"mailto:\"+contact/* FEEDBACK_EMAIL */.ap},'receive an email from you')}}),LIST_ITEM_2:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'youCanHelpInfoText.list.item.2',description:'give us feedback on our data and methodology',defaultMessage:\"View our {dataMeth} page and send us feedback.\",values:{dataMeth:/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:'/methodology'},'Data & methodology')}}),LIST_ITEM_3:/*#__PURE__*/react.createElement(gatsby_plugin_intl.FormattedMessage,{id:'youCanHelpInfoText.list.item.3',description:'share your feedback',defaultMessage:\"Find your community of interest and {shareFeedback}.\",values:{shareFeedback:/*#__PURE__*/react.createElement(\"a\",{href:\"mailto:\"+contact/* FEEDBACK_EMAIL */.ap},'share your feedback')}})};\n;// CONCATENATED MODULE: ./src/components/HowYouCanHelp/index.tsx\nvar HowYouCanHelp=function HowYouCanHelp(){return/*#__PURE__*/react.createElement(\"div\",{className:howYouCanHelpContainer},/*#__PURE__*/react.createElement(\"h2\",null,HOW_YOU_CAN_HELP_LIST_ITEMS.HEADING),/*#__PURE__*/react.createElement(\"ul\",{className:howYouCanHelpListWrapper},/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},HOW_YOU_CAN_HELP_LIST_ITEMS.LIST_ITEM_1),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},HOW_YOU_CAN_HELP_LIST_ITEMS.LIST_ITEM_2),/*#__PURE__*/react.createElement(\"li\",{className:howYouCanHelpList},HOW_YOU_CAN_HELP_LIST_ITEMS.LIST_ITEM_3)));};/* harmony default export */ var components_HowYouCanHelp = (HowYouCanHelp);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 5 modules\nvar layout = __webpack_require__(5614);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 3 modules\nvar toConsumableArray = __webpack_require__(7329);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\nvar unsupportedIterableToArray = __webpack_require__(2961);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n\n\n\n\nfunction slicedToArray_slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || (0,unsupportedIterableToArray/* default */.Z)(arr, i) || _nonIterableRest();\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.math.hypot.js\nvar es_math_hypot = __webpack_require__(5438);\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/common.js\n\n\n/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nvar RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nfunction setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nfunction toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nfunction equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec4.js\n\n\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nfunction fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nfunction set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec4_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nfunction cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nfunction transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nvar sub = (/* unused pure expression or super */ null && (subtract));\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nvar mul = (/* unused pure expression or super */ null && (multiply));\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nvar div = (/* unused pure expression or super */ null && (divide));\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nvar dist = (/* unused pure expression or super */ null && (distance));\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nvar sqrDist = (/* unused pure expression or super */ null && (squaredDistance));\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nvar len = (/* unused pure expression or super */ null && (vec4_length));\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nvar sqrLen = (/* unused pure expression or super */ null && (squaredLength));\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/math-utils.js\n\nfunction createMat4() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\nfunction transformVector(matrix, vector) {\n var result = transformMat4([], vector, matrix);\n scale(result, result, 1 / result[3]);\n return result;\n}\nfunction mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction math_utils_lerp(start, end, step) {\n return step * end + (1 - step) * start;\n}\n\nfunction ieLog2(x) {\n return Math.log(x) * Math.LOG2E;\n}\n\nvar log2 = Math.log2 || ieLog2;\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat4.js\n\n\n/**\r\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nfunction mat4_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nfunction mat4_fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nfunction adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nfunction translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nfunction mat4_scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nfunction fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nfunction fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nfunction getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nfunction fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nfunction perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nfunction ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nfunction targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nfunction mat4_str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nfunction frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nfunction mat4_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nfunction mat4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nvar mat4_mul = (/* unused pure expression or super */ null && (mat4_multiply));\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nvar mat4_sub = (/* unused pure expression or super */ null && (mat4_subtract));\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec2.js\n\n\n/**\r\n * 2 Dimensional Vector\r\n * @module vec2\r\n */\n\n/**\r\n * Creates a new, empty vec2\r\n *\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_create() {\n var out = new ARRAY_TYPE(2);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec2} a vector to clone\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} a new 2D vector\r\n */\n\nfunction vec2_fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Copy the values from one vec2 to another\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the source vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Set the components of a vec2 to the given values\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Adds two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\r\n * Multiplies two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\r\n * Divides two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to ceil\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to floor\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\r\n * Math.round the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to round\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\r\n * Scales a vec2 by a scalar number\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\r\n * Adds two vec2's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec2_distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec2_squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\r\n * Calculates the length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec2_length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec2_squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\r\n * Negates the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to negate\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to invert\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\r\n * Normalize a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to normalize\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec2_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\r\n * Computes the cross product of two vec2's\r\n * Note that the cross product must by definition produce a 3D vector\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec2_cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2d\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2d} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat3\r\n * 3rd vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat3} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat4\r\n * 3rd vector component is implicitly '0'\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\r\n * Rotate a 2D vector\r\n * @param {vec2} out The receiving vec2\r\n * @param {ReadonlyVec2} a The vec2 point to rotate\r\n * @param {ReadonlyVec2} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\r\n * Get the angle between two 2D vectors\r\n * @param {ReadonlyVec2} a The first operand\r\n * @param {ReadonlyVec2} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec2 to zero\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @returns {vec2} out\r\n */\n\nfunction vec2_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec2} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec2_str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\r\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec2_equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\r\n * Alias for {@link vec2.length}\r\n * @function\r\n */\n\nvar vec2_len = (/* unused pure expression or super */ null && (vec2_length));\n/**\r\n * Alias for {@link vec2.subtract}\r\n * @function\r\n */\n\nvar vec2_sub = vec2_subtract;\n/**\r\n * Alias for {@link vec2.multiply}\r\n * @function\r\n */\n\nvar vec2_mul = (/* unused pure expression or super */ null && (vec2_multiply));\n/**\r\n * Alias for {@link vec2.divide}\r\n * @function\r\n */\n\nvar vec2_div = (/* unused pure expression or super */ null && (vec2_divide));\n/**\r\n * Alias for {@link vec2.distance}\r\n * @function\r\n */\n\nvar vec2_dist = (/* unused pure expression or super */ null && (vec2_distance));\n/**\r\n * Alias for {@link vec2.squaredDistance}\r\n * @function\r\n */\n\nvar vec2_sqrDist = (/* unused pure expression or super */ null && (vec2_squaredDistance));\n/**\r\n * Alias for {@link vec2.squaredLength}\r\n * @function\r\n */\n\nvar vec2_sqrLen = (/* unused pure expression or super */ null && (vec2_squaredLength));\n/**\r\n * Perform some operation over an array of vec2s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec2_forEach = function () {\n var vec = vec2_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec3.js\n\n\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_create() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nfunction vec3_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nfunction vec3_fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nfunction vec3_distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nfunction vec3_squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nfunction vec3_squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nfunction vec3_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nfunction bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nfunction vec3_angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && vec3_dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nfunction vec3_zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nfunction vec3_str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nfunction vec3_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nvar vec3_sub = (/* unused pure expression or super */ null && (vec3_subtract));\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nvar vec3_mul = vec3_multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nvar vec3_div = (/* unused pure expression or super */ null && (vec3_divide));\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nvar vec3_dist = (/* unused pure expression or super */ null && (vec3_distance));\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nvar vec3_sqrDist = (/* unused pure expression or super */ null && (vec3_squaredDistance));\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nvar vec3_len = (/* unused pure expression or super */ null && (vec3_length));\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nvar vec3_sqrLen = (/* unused pure expression or super */ null && (vec3_squaredLength));\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nvar vec3_forEach = function () {\n var vec = vec3_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/assert.js\nfunction assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-utils.js\n\n\n\n\n\n\nvar PI = Math.PI;\nvar PI_4 = PI / 4;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nvar TILE_SIZE = 512;\nvar EARTH_CIRCUMFERENCE = 40.03e6;\nvar DEFAULT_ALTITUDE = 1.5;\nfunction zoomToScale(zoom) {\n return Math.pow(2, zoom);\n}\nfunction scaleToZoom(scale) {\n return log2(scale);\n}\nfunction lngLatToWorld(_ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n lng = _ref2[0],\n lat = _ref2[1];\n\n assert_assert(Number.isFinite(lng));\n assert_assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n var lambda2 = lng * DEGREES_TO_RADIANS;\n var phi2 = lat * DEGREES_TO_RADIANS;\n var x = TILE_SIZE * (lambda2 + PI) / (2 * PI);\n var y = TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n return [x, y];\n}\nfunction worldToLngLat(_ref3) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 2),\n x = _ref4[0],\n y = _ref4[1];\n\n var lambda2 = x / TILE_SIZE * (2 * PI) - PI;\n var phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\nfunction getMeterZoom(_ref5) {\n var latitude = _ref5.latitude;\n assert(Number.isFinite(latitude));\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\nfunction getDistanceScales(_ref6) {\n var latitude = _ref6.latitude,\n longitude = _ref6.longitude,\n _ref6$highPrecision = _ref6.highPrecision,\n highPrecision = _ref6$highPrecision === void 0 ? false : _ref6$highPrecision;\n assert_assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n var result = {};\n var worldSize = TILE_SIZE;\n var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n var unitsPerDegreeX = worldSize / 360;\n var unitsPerDegreeY = unitsPerDegreeX / latCosine;\n var altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n result.unitsPerMeter = [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter];\n result.metersPerUnit = [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter];\n result.unitsPerDegree = [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter];\n result.degreesPerUnit = [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter];\n\n if (highPrecision) {\n var latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n var unitsPerDegreeY2 = unitsPerDegreeX * latCosine2 / 2;\n var altUnitsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n var altUnitsPerMeter2 = altUnitsPerDegree2 / unitsPerDegreeY * altUnitsPerMeter;\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n return result;\n}\nfunction addMetersToLngLat(lngLatZ, xyz) {\n var _lngLatZ = _slicedToArray(lngLatZ, 3),\n longitude = _lngLatZ[0],\n latitude = _lngLatZ[1],\n z0 = _lngLatZ[2];\n\n var _xyz = _slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var _getDistanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude,\n highPrecision: true\n }),\n unitsPerMeter = _getDistanceScales.unitsPerMeter,\n unitsPerMeter2 = _getDistanceScales.unitsPerMeter2;\n\n var worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n var newLngLat = worldToLngLat(worldspace);\n var newZ = (z0 || 0) + (z || 0);\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\nfunction getViewMatrix(_ref7) {\n var height = _ref7.height,\n pitch = _ref7.pitch,\n bearing = _ref7.bearing,\n altitude = _ref7.altitude,\n scale = _ref7.scale,\n _ref7$center = _ref7.center,\n center = _ref7$center === void 0 ? null : _ref7$center;\n var vm = createMat4();\n translate(vm, vm, [0, 0, -altitude]);\n rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n scale /= height;\n mat4_scale(vm, vm, [scale, scale, scale]);\n\n if (center) {\n translate(vm, vm, vec3_negate([], center));\n }\n\n return vm;\n}\nfunction getProjectionParameters(_ref8) {\n var width = _ref8.width,\n height = _ref8.height,\n _ref8$fovy = _ref8.fovy,\n fovy = _ref8$fovy === void 0 ? altitudeToFovy(DEFAULT_ALTITUDE) : _ref8$fovy,\n altitude = _ref8.altitude,\n _ref8$pitch = _ref8.pitch,\n pitch = _ref8$pitch === void 0 ? 0 : _ref8$pitch,\n _ref8$nearZMultiplier = _ref8.nearZMultiplier,\n nearZMultiplier = _ref8$nearZMultiplier === void 0 ? 1 : _ref8$nearZMultiplier,\n _ref8$farZMultiplier = _ref8.farZMultiplier,\n farZMultiplier = _ref8$farZMultiplier === void 0 ? 1 : _ref8$farZMultiplier;\n\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n var halfFov = 0.5 * fovy * DEGREES_TO_RADIANS;\n var focalDistance = fovyToAltitude(fovy);\n var pitchRadians = pitch * DEGREES_TO_RADIANS;\n var topHalfSurfaceDistance = Math.sin(halfFov) * focalDistance / Math.sin(Math.min(Math.max(Math.PI / 2 - pitchRadians - halfFov, 0.01), Math.PI - 0.01));\n var farZ = Math.sin(pitchRadians) * topHalfSurfaceDistance + focalDistance;\n return {\n fov: 2 * halfFov,\n aspect: width / height,\n focalDistance: focalDistance,\n near: nearZMultiplier,\n far: farZ * farZMultiplier\n };\n}\nfunction getProjectionMatrix(_ref9) {\n var width = _ref9.width,\n height = _ref9.height,\n pitch = _ref9.pitch,\n altitude = _ref9.altitude,\n fovy = _ref9.fovy,\n nearZMultiplier = _ref9.nearZMultiplier,\n farZMultiplier = _ref9.farZMultiplier;\n\n var _getProjectionParamet = getProjectionParameters({\n width: width,\n height: height,\n altitude: altitude,\n fovy: fovy,\n pitch: pitch,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n }),\n fov = _getProjectionParamet.fov,\n aspect = _getProjectionParamet.aspect,\n near = _getProjectionParamet.near,\n far = _getProjectionParamet.far;\n\n var projectionMatrix = perspective([], fov, aspect, near, far);\n return projectionMatrix;\n}\nfunction altitudeToFovy(altitude) {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\nfunction fovyToAltitude(fovy) {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n var _xyz2 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz2[0],\n y = _xyz2[1],\n _xyz2$ = _xyz2[2],\n z = _xyz2$ === void 0 ? 0 : _xyz2$;\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix) {\n var targetZ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n var _xyz3 = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz3[0],\n y = _xyz3[1],\n z = _xyz3[2];\n\n assert_assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n var coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n var z0 = coord0[2];\n var z1 = coord1[2];\n var t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2_lerp([], coord0, coord1, t);\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fit-bounds.js\n\n\n\n\nfunction fit_bounds_fitBounds(_ref) {\n var width = _ref.width,\n height = _ref.height,\n bounds = _ref.bounds,\n _ref$minExtent = _ref.minExtent,\n minExtent = _ref$minExtent === void 0 ? 0 : _ref$minExtent,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? 24 : _ref$maxZoom,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? [0, 0] : _ref$offset;\n\n var _bounds = slicedToArray_slicedToArray(bounds, 2),\n _bounds$ = slicedToArray_slicedToArray(_bounds[0], 2),\n west = _bounds$[0],\n south = _bounds$[1],\n _bounds$2 = slicedToArray_slicedToArray(_bounds[1], 2),\n east = _bounds$2[0],\n north = _bounds$2[1];\n\n if (Number.isFinite(padding)) {\n var p = padding;\n padding = {\n top: p,\n bottom: p,\n left: p,\n right: p\n };\n } else {\n assert_assert(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n }\n\n var viewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: 0,\n latitude: 0,\n zoom: 0\n });\n var nw = viewport.project([west, north]);\n var se = viewport.project([east, south]);\n var size = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];\n var targetSize = [width - padding.left - padding.right - Math.abs(offset[0]) * 2, height - padding.top - padding.bottom - Math.abs(offset[1]) * 2];\n assert_assert(targetSize[0] > 0 && targetSize[1] > 0);\n var scaleX = targetSize[0] / size[0];\n var scaleY = targetSize[1] / size[1];\n var offsetX = (padding.right - padding.left) / 2 / scaleX;\n var offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n var center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n var centerLngLat = viewport.unproject(center);\n var zoom = Math.min(maxZoom, viewport.zoom + log2(Math.abs(Math.min(scaleX, scaleY))));\n assert_assert(Number.isFinite(zoom));\n return {\n longitude: centerLngLat[0],\n latitude: centerLngLat[1],\n zoom: zoom\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/get-bounds.js\n\n\n\nvar get_bounds_DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getBounds(viewport) {\n var z = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var width = viewport.width,\n height = viewport.height,\n unproject = viewport.unproject;\n var unprojectOps = {\n targetZ: z\n };\n var bottomLeft = unproject([0, height], unprojectOps);\n var bottomRight = unproject([width, height], unprojectOps);\n var topLeft;\n var topRight;\n var halfFov = viewport.fovy ? 0.5 * viewport.fovy * get_bounds_DEGREES_TO_RADIANS : Math.atan(0.5 / viewport.altitude);\n var angleToGround = (90 - viewport.pitch) * get_bounds_DEGREES_TO_RADIANS;\n\n if (halfFov > angleToGround - 0.01) {\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\nfunction unprojectOnFarPlane(viewport, x, targetZ) {\n var pixelUnprojectionMatrix = viewport.pixelUnprojectionMatrix;\n var coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n var coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n var z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n var t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n var coord = vec2_lerp([], coord0, coord1, t);\n var result = worldToLngLat(coord);\n result[2] = targetZ;\n return result;\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/web-mercator-viewport.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar WebMercatorViewport = /*#__PURE__*/function () {\n function WebMercatorViewport() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n width: 1,\n height: 1\n },\n width = _ref.width,\n height = _ref.height,\n _ref$latitude = _ref.latitude,\n latitude = _ref$latitude === void 0 ? 0 : _ref$latitude,\n _ref$longitude = _ref.longitude,\n longitude = _ref$longitude === void 0 ? 0 : _ref$longitude,\n _ref$zoom = _ref.zoom,\n zoom = _ref$zoom === void 0 ? 0 : _ref$zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? null : _ref$altitude,\n _ref$fovy = _ref.fovy,\n fovy = _ref$fovy === void 0 ? null : _ref$fovy,\n _ref$position = _ref.position,\n position = _ref$position === void 0 ? null : _ref$position,\n _ref$nearZMultiplier = _ref.nearZMultiplier,\n nearZMultiplier = _ref$nearZMultiplier === void 0 ? 0.02 : _ref$nearZMultiplier,\n _ref$farZMultiplier = _ref.farZMultiplier,\n farZMultiplier = _ref$farZMultiplier === void 0 ? 1.01 : _ref$farZMultiplier;\n\n _classCallCheck(this, WebMercatorViewport);\n\n width = width || 1;\n height = height || 1;\n\n if (fovy === null && altitude === null) {\n altitude = DEFAULT_ALTITUDE;\n fovy = altitudeToFovy(altitude);\n } else if (fovy === null) {\n fovy = altitudeToFovy(altitude);\n } else if (altitude === null) {\n altitude = fovyToAltitude(fovy);\n }\n\n var scale = zoomToScale(zoom);\n altitude = Math.max(0.75, altitude);\n var distanceScales = getDistanceScales({\n longitude: longitude,\n latitude: latitude\n });\n var center = lngLatToWorld([longitude, latitude]);\n center[2] = 0;\n\n if (position) {\n vec3_add(center, center, vec3_mul([], position, distanceScales.unitsPerMeter));\n }\n\n this.projectionMatrix = getProjectionMatrix({\n width: width,\n height: height,\n pitch: pitch,\n fovy: fovy,\n nearZMultiplier: nearZMultiplier,\n farZMultiplier: farZMultiplier\n });\n this.viewMatrix = getViewMatrix({\n height: height,\n scale: scale,\n center: center,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n });\n this.width = width;\n this.height = height;\n this.scale = scale;\n this.latitude = latitude;\n this.longitude = longitude;\n this.zoom = zoom;\n this.pitch = pitch;\n this.bearing = bearing;\n this.altitude = altitude;\n this.fovy = fovy;\n this.center = center;\n this.meterOffset = position || [0, 0, 0];\n this.distanceScales = distanceScales;\n\n this._initMatrices();\n\n this.equals = this.equals.bind(this);\n this.project = this.project.bind(this);\n this.unproject = this.unproject.bind(this);\n this.projectPosition = this.projectPosition.bind(this);\n this.unprojectPosition = this.unprojectPosition.bind(this);\n Object.freeze(this);\n }\n\n _createClass(WebMercatorViewport, [{\n key: \"_initMatrices\",\n value: function _initMatrices() {\n var width = this.width,\n height = this.height,\n projectionMatrix = this.projectionMatrix,\n viewMatrix = this.viewMatrix;\n var vpm = createMat4();\n mat4_multiply(vpm, vpm, projectionMatrix);\n mat4_multiply(vpm, vpm, viewMatrix);\n this.viewProjectionMatrix = vpm;\n var m = createMat4();\n mat4_scale(m, m, [width / 2, -height / 2, 1]);\n translate(m, m, [1, -1, 0]);\n mat4_multiply(m, m, vpm);\n var mInverse = invert(createMat4(), m);\n\n if (!mInverse) {\n throw new Error('Pixel project matrix not invertible');\n }\n\n this.pixelProjectionMatrix = m;\n this.pixelUnprojectionMatrix = mInverse;\n }\n }, {\n key: \"equals\",\n value: function equals(viewport) {\n if (!(viewport instanceof WebMercatorViewport)) {\n return false;\n }\n\n return viewport.width === this.width && viewport.height === this.height && mat4_equals(viewport.projectionMatrix, this.projectionMatrix) && mat4_equals(viewport.viewMatrix, this.viewMatrix);\n }\n }, {\n key: \"project\",\n value: function project(xyz) {\n var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref2$topLeft = _ref2.topLeft,\n topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft;\n\n var worldPosition = this.projectPosition(xyz);\n var coord = worldToPixels(worldPosition, this.pixelProjectionMatrix);\n\n var _coord = slicedToArray_slicedToArray(coord, 2),\n x = _coord[0],\n y = _coord[1];\n\n var y2 = topLeft ? y : this.height - y;\n return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n }\n }, {\n key: \"unproject\",\n value: function unproject(xyz) {\n var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref3$topLeft = _ref3.topLeft,\n topLeft = _ref3$topLeft === void 0 ? true : _ref3$topLeft,\n _ref3$targetZ = _ref3.targetZ,\n targetZ = _ref3$targetZ === void 0 ? undefined : _ref3$targetZ;\n\n var _xyz = slicedToArray_slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var y2 = topLeft ? y : this.height - y;\n var targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n var coord = pixelsToWorld([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n\n var _this$unprojectPositi = this.unprojectPosition(coord),\n _this$unprojectPositi2 = slicedToArray_slicedToArray(_this$unprojectPositi, 3),\n X = _this$unprojectPositi2[0],\n Y = _this$unprojectPositi2[1],\n Z = _this$unprojectPositi2[2];\n\n if (Number.isFinite(z)) {\n return [X, Y, Z];\n }\n\n return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n }\n }, {\n key: \"projectPosition\",\n value: function projectPosition(xyz) {\n var _lngLatToWorld = lngLatToWorld(xyz),\n _lngLatToWorld2 = slicedToArray_slicedToArray(_lngLatToWorld, 2),\n X = _lngLatToWorld2[0],\n Y = _lngLatToWorld2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n return [X, Y, Z];\n }\n }, {\n key: \"unprojectPosition\",\n value: function unprojectPosition(xyz) {\n var _worldToLngLat = worldToLngLat(xyz),\n _worldToLngLat2 = slicedToArray_slicedToArray(_worldToLngLat, 2),\n X = _worldToLngLat2[0],\n Y = _worldToLngLat2[1];\n\n var Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n return [X, Y, Z];\n }\n }, {\n key: \"projectFlat\",\n value: function projectFlat(lngLat) {\n return lngLatToWorld(lngLat);\n }\n }, {\n key: \"unprojectFlat\",\n value: function unprojectFlat(xy) {\n return worldToLngLat(xy);\n }\n }, {\n key: \"getMapCenterByLngLatPosition\",\n value: function getMapCenterByLngLatPosition(_ref4) {\n var lngLat = _ref4.lngLat,\n pos = _ref4.pos;\n var fromLocation = pixelsToWorld(pos, this.pixelUnprojectionMatrix);\n var toLocation = lngLatToWorld(lngLat);\n var translate = vec2_add([], toLocation, vec2_negate([], fromLocation));\n var newCenter = vec2_add([], this.center, translate);\n return worldToLngLat(newCenter);\n }\n }, {\n key: \"getLocationAtPoint\",\n value: function getLocationAtPoint(_ref5) {\n var lngLat = _ref5.lngLat,\n pos = _ref5.pos;\n return this.getMapCenterByLngLatPosition({\n lngLat: lngLat,\n pos: pos\n });\n }\n }, {\n key: \"fitBounds\",\n value: function fitBounds(bounds) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = this.width,\n height = this.height;\n\n var _fitBounds2 = fit_bounds_fitBounds(Object.assign({\n width: width,\n height: height,\n bounds: bounds\n }, options)),\n longitude = _fitBounds2.longitude,\n latitude = _fitBounds2.latitude,\n zoom = _fitBounds2.zoom;\n\n return new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n }\n }, {\n key: \"getBounds\",\n value: function getBounds(options) {\n var corners = this.getBoundingRegion(options);\n var west = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var east = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[0];\n })));\n var south = Math.min.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n var north = Math.max.apply(Math, (0,toConsumableArray/* default */.Z)(corners.map(function (p) {\n return p[1];\n })));\n return [[west, south], [east, north]];\n }\n }, {\n key: \"getBoundingRegion\",\n value: function getBoundingRegion() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return getBounds(this, options.z || 0);\n }\n }]);\n\n return WebMercatorViewport;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/normalize-viewport-props.js\n\n\nvar MAX_LATITUDE = 85.05113;\nvar MIN_LATITUDE = -85.05113;\nfunction normalizeViewportProps(_ref) {\n var width = _ref.width,\n height = _ref.height,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing;\n\n if (longitude < -180 || longitude > 180) {\n longitude = mod(longitude + 180, 360) - 180;\n }\n\n if (bearing < -180 || bearing > 180) {\n bearing = mod(bearing + 180, 360) - 180;\n }\n\n var flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n var bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n var shiftY = 0;\n\n if (bottomY - topY < height) {\n zoom += log2(height / (bottomY - topY));\n flatViewport = new WebMercatorViewport({\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n }\n\n if (topY > 0) {\n shiftY = topY;\n } else if (bottomY < height) {\n shiftY = bottomY - height;\n }\n\n if (shiftY) {\n latitude = flatViewport.unproject([width / 2, height / 2 + shiftY])[1];\n }\n\n return {\n width: width,\n height: height,\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/fly-to-viewport.js\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\nvar fly_to_viewport_EPSILON = 0.01;\nvar VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'];\nvar DEFAULT_OPTS = {\n curve: 1.414,\n speed: 1.2\n};\nfunction flyToViewport(startProps, endProps, t) {\n var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var viewport = {};\n\n var _getFlyToTransitionPa = getFlyToTransitionParams(startProps, endProps, opts),\n startZoom = _getFlyToTransitionPa.startZoom,\n startCenterXY = _getFlyToTransitionPa.startCenterXY,\n uDelta = _getFlyToTransitionPa.uDelta,\n w0 = _getFlyToTransitionPa.w0,\n u1 = _getFlyToTransitionPa.u1,\n S = _getFlyToTransitionPa.S,\n rho = _getFlyToTransitionPa.rho,\n rho2 = _getFlyToTransitionPa.rho2,\n r0 = _getFlyToTransitionPa.r0;\n\n if (u1 < fly_to_viewport_EPSILON) {\n var _iterator = _createForOfIteratorHelper(VIEWPORT_TRANSITION_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n viewport[key] = math_utils_lerp(startValue, endValue, t);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return viewport;\n }\n\n var s = t * S;\n var w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n var u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n var scaleIncrement = 1 / w;\n var newZoom = startZoom + scaleToZoom(scaleIncrement);\n var newCenterWorld = vec2_scale([], uDelta, u);\n vec2_add(newCenterWorld, newCenterWorld, startCenterXY);\n var newCenter = worldToLngLat(newCenterWorld);\n viewport.longitude = newCenter[0];\n viewport.latitude = newCenter[1];\n viewport.zoom = newZoom;\n return viewport;\n}\nfunction getFlyToDuration(startProps, endProps) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var _opts = opts,\n screenSpeed = _opts.screenSpeed,\n speed = _opts.speed,\n maxDuration = _opts.maxDuration;\n\n var _getFlyToTransitionPa2 = getFlyToTransitionParams(startProps, endProps, opts),\n S = _getFlyToTransitionPa2.S,\n rho = _getFlyToTransitionPa2.rho;\n\n var length = 1000 * S;\n var duration;\n\n if (Number.isFinite(screenSpeed)) {\n duration = length / (screenSpeed / rho);\n } else {\n duration = length / speed;\n }\n\n return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n opts = Object.assign({}, DEFAULT_OPTS, opts);\n var rho = opts.curve;\n var startZoom = startProps.zoom;\n var startCenter = [startProps.longitude, startProps.latitude];\n var startScale = zoomToScale(startZoom);\n var endZoom = endProps.zoom;\n var endCenter = [endProps.longitude, endProps.latitude];\n var scale = zoomToScale(endZoom - startZoom);\n var startCenterXY = lngLatToWorld(startCenter);\n var endCenterXY = lngLatToWorld(endCenter);\n var uDelta = vec2_sub([], endCenterXY, startCenterXY);\n var w0 = Math.max(startProps.width, startProps.height);\n var w1 = w0 / scale;\n var u1 = vec2_length(uDelta) * startScale;\n\n var _u1 = Math.max(u1, fly_to_viewport_EPSILON);\n\n var rho2 = rho * rho;\n var b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n var b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n var r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n var r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n var S = (r1 - r0) / rho;\n return {\n startZoom: startZoom,\n startCenterXY: startCenterXY,\n uDelta: uDelta,\n w0: w0,\n u1: u1,\n S: S,\n rho: rho,\n rho2: rho2,\n r0: r0,\n r1: r1\n };\n}\n;// CONCATENATED MODULE: ./node_modules/@math.gl/web-mercator/dist/esm/index.js\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/viewport-mercator-project/module.js\n\n\n;// CONCATENATED MODULE: ./node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js\n/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\n\n/* eslint-disable require-jsdoc, valid-jsdoc */\nvar MapShim = function () {\n if (typeof Map !== 'undefined') {\n return Map;\n }\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\n\n\n function getIndex(arr, key) {\n var result = -1;\n arr.some(function (entry, index) {\n if (entry[0] === key) {\n result = index;\n return true;\n }\n\n return false;\n });\n return result;\n }\n\n return (\n /** @class */\n function () {\n function class_1() {\n this.__entries__ = [];\n }\n\n Object.defineProperty(class_1.prototype, \"size\", {\n /**\r\n * @returns {boolean}\r\n */\n get: function get() {\n return this.__entries__.length;\n },\n enumerable: true,\n configurable: true\n });\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\n\n class_1.prototype.get = function (key) {\n var index = getIndex(this.__entries__, key);\n var entry = this.__entries__[index];\n return entry && entry[1];\n };\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.set = function (key, value) {\n var index = getIndex(this.__entries__, key);\n\n if (~index) {\n this.__entries__[index][1] = value;\n } else {\n this.__entries__.push([key, value]);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.delete = function (key) {\n var entries = this.__entries__;\n var index = getIndex(entries, key);\n\n if (~index) {\n entries.splice(index, 1);\n }\n };\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.has = function (key) {\n return !!~getIndex(this.__entries__, key);\n };\n /**\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.clear = function () {\n this.__entries__.splice(0);\n };\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\n\n\n class_1.prototype.forEach = function (callback, ctx) {\n if (ctx === void 0) {\n ctx = null;\n }\n\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\n var entry = _a[_i];\n callback.call(ctx, entry[1], entry[0]);\n }\n };\n\n return class_1;\n }()\n );\n}();\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\n\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document; // Returns global object of a current environment.\n\nvar global$1 = function () {\n if (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.Math === Math) {\n return __webpack_require__.g;\n }\n\n if (typeof self !== 'undefined' && self.Math === Math) {\n return self;\n }\n\n if (typeof window !== 'undefined' && window.Math === Math) {\n return window;\n } // eslint-disable-next-line no-new-func\n\n\n return Function('return this')();\n}();\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\n\n\nvar requestAnimationFrame$1 = function () {\n if (typeof requestAnimationFrame === 'function') {\n // It's required to use a bounded function because IE sometimes throws\n // an \"Invalid calling object\" error if rAF is invoked without the global\n // object on the left hand side.\n return requestAnimationFrame.bind(global$1);\n }\n\n return function (callback) {\n return setTimeout(function () {\n return callback(Date.now());\n }, 1000 / 60);\n };\n}(); // Defines minimum timeout before adding a trailing call.\n\n\nvar trailingTimeout = 2;\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\n\nfunction throttle(callback, delay) {\n var leadingCall = false,\n trailingCall = false,\n lastCallTime = 0;\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\n\n function resolvePending() {\n if (leadingCall) {\n leadingCall = false;\n callback();\n }\n\n if (trailingCall) {\n proxy();\n }\n }\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\n\n\n function timeoutCallback() {\n requestAnimationFrame$1(resolvePending);\n }\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\n\n\n function proxy() {\n var timeStamp = Date.now();\n\n if (leadingCall) {\n // Reject immediately following calls.\n if (timeStamp - lastCallTime < trailingTimeout) {\n return;\n } // Schedule new call to be in invoked when the pending one is resolved.\n // This is important for \"transitions\" which never actually start\n // immediately so there is a chance that we might miss one if change\n // happens amids the pending invocation.\n\n\n trailingCall = true;\n } else {\n leadingCall = true;\n trailingCall = false;\n setTimeout(timeoutCallback, delay);\n }\n\n lastCallTime = timeStamp;\n }\n\n return proxy;\n} // Minimum delay before invoking the update of observers.\n\n\nvar REFRESH_DELAY = 20; // A list of substrings of CSS properties used to find transition events that\n// might affect dimensions of observed elements.\n\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; // Check if MutationObserver is available.\n\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\n\nvar ResizeObserverController =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\n function ResizeObserverController() {\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\n this.connected_ = false;\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\n\n this.mutationEventsAdded_ = false;\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\n\n this.mutationsObserver_ = null;\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\n\n this.observers_ = [];\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\n }\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.addObserver = function (observer) {\n if (!~this.observers_.indexOf(observer)) {\n this.observers_.push(observer);\n } // Add listeners if they haven't been added yet.\n\n\n if (!this.connected_) {\n this.connect_();\n }\n };\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.removeObserver = function (observer) {\n var observers = this.observers_;\n var index = observers.indexOf(observer); // Remove observer if it's present in registry.\n\n if (~index) {\n observers.splice(index, 1);\n } // Remove listeners if controller has no connected observers.\n\n\n if (!observers.length && this.connected_) {\n this.disconnect_();\n }\n };\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.refresh = function () {\n var changesDetected = this.updateObservers_(); // Continue running updates if changes have been detected as there might\n // be future ones caused by CSS transitions.\n\n if (changesDetected) {\n this.refresh();\n }\n };\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\n\n\n ResizeObserverController.prototype.updateObservers_ = function () {\n // Collect observers that have active observations.\n var activeObservers = this.observers_.filter(function (observer) {\n return observer.gatherActive(), observer.hasActive();\n }); // Deliver notifications in a separate cycle in order to avoid any\n // collisions between observers, e.g. when multiple instances of\n // ResizeObserver are tracking the same element and the callback of one\n // of them changes content dimensions of the observed target. Sometimes\n // this may result in notifications being blocked for the rest of observers.\n\n activeObservers.forEach(function (observer) {\n return observer.broadcastActive();\n });\n return activeObservers.length > 0;\n };\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.connect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already added.\n if (!isBrowser || this.connected_) {\n return;\n } // Subscription to the \"Transitionend\" event is used as a workaround for\n // delayed transitions. This way it's possible to capture at least the\n // final state of an element.\n\n\n document.addEventListener('transitionend', this.onTransitionEnd_);\n window.addEventListener('resize', this.refresh);\n\n if (mutationObserverSupported) {\n this.mutationsObserver_ = new MutationObserver(this.refresh);\n this.mutationsObserver_.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n } else {\n document.addEventListener('DOMSubtreeModified', this.refresh);\n this.mutationEventsAdded_ = true;\n }\n\n this.connected_ = true;\n };\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.disconnect_ = function () {\n // Do nothing if running in a non-browser environment or if listeners\n // have been already removed.\n if (!isBrowser || !this.connected_) {\n return;\n }\n\n document.removeEventListener('transitionend', this.onTransitionEnd_);\n window.removeEventListener('resize', this.refresh);\n\n if (this.mutationsObserver_) {\n this.mutationsObserver_.disconnect();\n }\n\n if (this.mutationEventsAdded_) {\n document.removeEventListener('DOMSubtreeModified', this.refresh);\n }\n\n this.mutationsObserver_ = null;\n this.mutationEventsAdded_ = false;\n this.connected_ = false;\n };\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\n\n\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\n var _b = _a.propertyName,\n propertyName = _b === void 0 ? '' : _b; // Detect whether transition may affect dimensions of an element.\n\n var isReflowProperty = transitionKeys.some(function (key) {\n return !!~propertyName.indexOf(key);\n });\n\n if (isReflowProperty) {\n this.refresh();\n }\n };\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.getInstance = function () {\n if (!this.instance_) {\n this.instance_ = new ResizeObserverController();\n }\n\n return this.instance_;\n };\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\n\n\n ResizeObserverController.instance_ = null;\n return ResizeObserverController;\n}();\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\n\n\nvar defineConfigurable = function defineConfigurable(target, props) {\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n var key = _a[_i];\n Object.defineProperty(target, key, {\n value: props[key],\n enumerable: false,\n writable: false,\n configurable: true\n });\n }\n\n return target;\n};\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\n\n\nvar getWindowOf = function getWindowOf(target) {\n // Assume that the element is an instance of Node, which means that it\n // has the \"ownerDocument\" property from which we can retrieve a\n // corresponding global object.\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView; // Return the local global object if it's not possible extract one from\n // provided element.\n\n return ownerGlobal || global$1;\n}; // Placeholder of an empty content rectangle.\n\n\nvar emptyRect = createRectInit(0, 0, 0, 0);\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\n\nfunction toFloat(value) {\n return parseFloat(value) || 0;\n}\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\n\n\nfunction getBordersSize(styles) {\n var positions = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n positions[_i - 1] = arguments[_i];\n }\n\n return positions.reduce(function (size, position) {\n var value = styles['border-' + position + '-width'];\n return size + toFloat(value);\n }, 0);\n}\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\n\n\nfunction getPaddings(styles) {\n var positions = ['top', 'right', 'bottom', 'left'];\n var paddings = {};\n\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\n var position = positions_1[_i];\n var value = styles['padding-' + position];\n paddings[position] = toFloat(value);\n }\n\n return paddings;\n}\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getSVGContentRect(target) {\n var bbox = target.getBBox();\n return createRectInit(0, 0, bbox.width, bbox.height);\n}\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getHTMLElementContentRect(target) {\n // Client width & height properties can't be\n // used exclusively as they provide rounded values.\n var clientWidth = target.clientWidth,\n clientHeight = target.clientHeight; // By this condition we can catch all non-replaced inline, hidden and\n // detached elements. Though elements with width & height properties less\n // than 0.5 will be discarded as well.\n //\n // Without it we would need to implement separate methods for each of\n // those cases and it's not possible to perform a precise and performance\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\n // gives wrong results for elements with width & height less than 0.5.\n\n if (!clientWidth && !clientHeight) {\n return emptyRect;\n }\n\n var styles = getWindowOf(target).getComputedStyle(target);\n var paddings = getPaddings(styles);\n var horizPad = paddings.left + paddings.right;\n var vertPad = paddings.top + paddings.bottom; // Computed styles of width & height are being used because they are the\n // only dimensions available to JS that contain non-rounded values. It could\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\n // affected by CSS transformations let alone paddings, borders and scroll bars.\n\n var width = toFloat(styles.width),\n height = toFloat(styles.height); // Width & height include paddings and borders when the 'border-box' box\n // model is applied (except for IE).\n\n if (styles.boxSizing === 'border-box') {\n // Following conditions are required to handle Internet Explorer which\n // doesn't include paddings and borders to computed CSS dimensions.\n //\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\n // properties then it's either IE, and thus we don't need to subtract\n // anything, or an element merely doesn't have paddings/borders styles.\n if (Math.round(width + horizPad) !== clientWidth) {\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\n }\n\n if (Math.round(height + vertPad) !== clientHeight) {\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\n }\n } // Following steps can't be applied to the document's root element as its\n // client[Width/Height] properties represent viewport area of the window.\n // Besides, it's as well not necessary as the itself neither has\n // rendered scroll bars nor it can be clipped.\n\n\n if (!isDocumentElement(target)) {\n // In some browsers (only in Firefox, actually) CSS width & height\n // include scroll bars size which can be removed at this step as scroll\n // bars are the only difference between rounded dimensions + paddings\n // and \"client\" properties, though that is not always true in Chrome.\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\n var horizScrollbar = Math.round(height + vertPad) - clientHeight; // Chrome has a rather weird rounding of \"client\" properties.\n // E.g. for an element with content width of 314.2px it sometimes gives\n // the client width of 315px and for the width of 314.7px it may give\n // 314px. And it doesn't happen all the time. So just ignore this delta\n // as a non-relevant.\n\n if (Math.abs(vertScrollbar) !== 1) {\n width -= vertScrollbar;\n }\n\n if (Math.abs(horizScrollbar) !== 1) {\n height -= horizScrollbar;\n }\n }\n\n return createRectInit(paddings.left, paddings.top, width, height);\n}\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nvar isSVGGraphicsElement = function () {\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\n // interface.\n if (typeof SVGGraphicsElement !== 'undefined') {\n return function (target) {\n return target instanceof getWindowOf(target).SVGGraphicsElement;\n };\n } // If it's so, then check that element is at least an instance of the\n // SVGElement and that it has the \"getBBox\" method.\n // eslint-disable-next-line no-extra-parens\n\n\n return function (target) {\n return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === 'function';\n };\n}();\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\n\n\nfunction isDocumentElement(target) {\n return target === getWindowOf(target).document.documentElement;\n}\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction getContentRect(target) {\n if (!isBrowser) {\n return emptyRect;\n }\n\n if (isSVGGraphicsElement(target)) {\n return getSVGContentRect(target);\n }\n\n return getHTMLElementContentRect(target);\n}\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\n\n\nfunction createReadOnlyRect(_a) {\n var x = _a.x,\n y = _a.y,\n width = _a.width,\n height = _a.height; // If DOMRectReadOnly is available use it as a prototype for the rectangle.\n\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\n var rect = Object.create(Constr.prototype); // Rectangle's properties are not writable and non-enumerable.\n\n defineConfigurable(rect, {\n x: x,\n y: y,\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: height + y,\n left: x\n });\n return rect;\n}\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\n\n\nfunction createRectInit(x, y, width, height) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n}\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\n\n\nvar ResizeObservation =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\n function ResizeObservation(target) {\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\n this.broadcastWidth = 0;\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\n\n this.broadcastHeight = 0;\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\n\n this.contentRect_ = createRectInit(0, 0, 0, 0);\n this.target = target;\n }\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObservation.prototype.isActive = function () {\n var rect = getContentRect(this.target);\n this.contentRect_ = rect;\n return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;\n };\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\n\n\n ResizeObservation.prototype.broadcastRect = function () {\n var rect = this.contentRect_;\n this.broadcastWidth = rect.width;\n this.broadcastHeight = rect.height;\n return rect;\n };\n\n return ResizeObservation;\n}();\n\nvar ResizeObserverEntry =\n/** @class */\nfunction () {\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\n function ResizeObserverEntry(target, rectInit) {\n var contentRect = createReadOnlyRect(rectInit); // According to the specification following properties are not writable\n // and are also not enumerable in the native implementation.\n //\n // Property accessors are not being used as they'd require to define a\n // private WeakMap storage which may cause memory leaks in browsers that\n // don't support this type of collections.\n\n defineConfigurable(this, {\n target: target,\n contentRect: contentRect\n });\n }\n\n return ResizeObserverEntry;\n}();\n\nvar ResizeObserverSPI =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\n function ResizeObserverSPI(callback, controller, callbackCtx) {\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\n this.activeObservations_ = [];\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\n\n this.observations_ = new MapShim();\n\n if (typeof callback !== 'function') {\n throw new TypeError('The callback provided as parameter 1 is not a function.');\n }\n\n this.callback_ = callback;\n this.controller_ = controller;\n this.callbackCtx_ = callbackCtx;\n }\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.observe = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is already being observed.\n\n if (observations.has(target)) {\n return;\n }\n\n observations.set(target, new ResizeObservation(target));\n this.controller_.addObserver(this); // Force the update of observations.\n\n this.controller_.refresh();\n };\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.unobserve = function (target) {\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n } // Do nothing if current environment doesn't have the Element interface.\n\n\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\n return;\n }\n\n if (!(target instanceof getWindowOf(target).Element)) {\n throw new TypeError('parameter 1 is not of type \"Element\".');\n }\n\n var observations = this.observations_; // Do nothing if element is not being observed.\n\n if (!observations.has(target)) {\n return;\n }\n\n observations.delete(target);\n\n if (!observations.size) {\n this.controller_.removeObserver(this);\n }\n };\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.disconnect = function () {\n this.clearActive();\n this.observations_.clear();\n this.controller_.removeObserver(this);\n };\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.gatherActive = function () {\n var _this = this;\n\n this.clearActive();\n this.observations_.forEach(function (observation) {\n if (observation.isActive()) {\n _this.activeObservations_.push(observation);\n }\n });\n };\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.broadcastActive = function () {\n // Do nothing if observer doesn't have active observations.\n if (!this.hasActive()) {\n return;\n }\n\n var ctx = this.callbackCtx_; // Create ResizeObserverEntry instance for every active observation.\n\n var entries = this.activeObservations_.map(function (observation) {\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\n });\n this.callback_.call(ctx, entries, ctx);\n this.clearActive();\n };\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\n\n\n ResizeObserverSPI.prototype.clearActive = function () {\n this.activeObservations_.splice(0);\n };\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\n\n\n ResizeObserverSPI.prototype.hasActive = function () {\n return this.activeObservations_.length > 0;\n };\n\n return ResizeObserverSPI;\n}(); // Registry of internal observers. If WeakMap is not available use current shim\n// for the Map collection as it has all required methods and because WeakMap\n// can't be fully polyfilled anyway.\n\n\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\n\nvar ResizeObserver =\n/** @class */\nfunction () {\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\n function ResizeObserver(callback) {\n if (!(this instanceof ResizeObserver)) {\n throw new TypeError('Cannot call a class as a function.');\n }\n\n if (!arguments.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n\n var controller = ResizeObserverController.getInstance();\n var observer = new ResizeObserverSPI(callback, controller, this);\n observers.set(this, observer);\n }\n\n return ResizeObserver;\n}(); // Expose public methods of ResizeObserver.\n\n\n['observe', 'unobserve', 'disconnect'].forEach(function (method) {\n ResizeObserver.prototype[method] = function () {\n var _a;\n\n return (_a = observers.get(this))[method].apply(_a, arguments);\n };\n});\n\nvar index = function () {\n // Export existing implementation if available.\n if (typeof global$1.ResizeObserver !== 'undefined') {\n return global$1.ResizeObserver;\n }\n\n return ResizeObserver;\n}();\n\n/* harmony default export */ var ResizeObserver_es = (index);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/globals.js\nvar window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar document_ = typeof document !== 'undefined' ? document : {};\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/style-utils.js\n\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction style_utils_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = style_utils_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction style_utils_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return style_utils_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return style_utils_arrayLikeToArray(o, minLen);\n}\n\nfunction style_utils_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nvar refProps = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\nfunction normalizeStyle(style) {\n if (!style) {\n return null;\n }\n\n if (typeof style === 'string') {\n return style;\n }\n\n if (style.toJS) {\n style = style.toJS();\n }\n\n var layerIndex = {};\n\n var _iterator = style_utils_createForOfIteratorHelper(style.layers),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var layer = _step.value;\n layerIndex[layer.id] = layer;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var layers = style.layers.map(function (layer) {\n var layerRef = layerIndex[layer.ref];\n var normalizedLayer = null;\n\n if ('interactive' in layer) {\n normalizedLayer = _objectSpread({}, layer);\n delete normalizedLayer.interactive;\n }\n\n if (layerRef) {\n normalizedLayer = normalizedLayer || _objectSpread({}, layer);\n delete normalizedLayer.ref;\n\n var _iterator2 = style_utils_createForOfIteratorHelper(refProps),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var propName = _step2.value;\n\n if (propName in layerRef) {\n normalizedLayer[propName] = layerRef[propName];\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n\n return normalizedLayer || layer;\n });\n return _objectSpread(_objectSpread({}, style), {}, {\n layers: layers\n });\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/mapbox/mapbox.js\n\n\n\n\n\n\n\nfunction noop() {}\n\nfunction defaultOnError(event) {\n if (event) {\n console.error(event.error);\n }\n}\n\nvar propTypes = {\n container: prop_types.object,\n gl: prop_types.object,\n mapboxApiAccessToken: prop_types.string,\n mapboxApiUrl: prop_types.string,\n attributionControl: prop_types.bool,\n preserveDrawingBuffer: prop_types.bool,\n reuseMaps: prop_types.bool,\n transformRequest: prop_types.func,\n mapOptions: prop_types.object,\n mapStyle: prop_types.oneOfType([prop_types.string, prop_types.object]),\n preventStyleDiffing: prop_types.bool,\n visible: prop_types.bool,\n asyncRender: prop_types.bool,\n onLoad: prop_types.func,\n onError: prop_types.func,\n width: prop_types.number,\n height: prop_types.number,\n viewState: prop_types.object,\n longitude: prop_types.number,\n latitude: prop_types.number,\n zoom: prop_types.number,\n bearing: prop_types.number,\n pitch: prop_types.number,\n altitude: prop_types.number\n};\nvar defaultProps = {\n container: document_.body,\n mapboxApiAccessToken: getAccessToken(),\n mapboxApiUrl: 'https://api.mapbox.com',\n preserveDrawingBuffer: false,\n attributionControl: true,\n reuseMaps: false,\n mapOptions: {},\n mapStyle: 'mapbox://styles/mapbox/light-v8',\n preventStyleDiffing: false,\n visible: true,\n asyncRender: false,\n onLoad: noop,\n onError: defaultOnError,\n width: 0,\n height: 0,\n longitude: 0,\n latitude: 0,\n zoom: 0,\n bearing: 0,\n pitch: 0,\n altitude: 1.5\n};\nfunction getAccessToken() {\n var accessToken = null;\n\n if (typeof window !== 'undefined' && window.location) {\n var match = window.location.search.match(/access_token=([^&\\/]*)/);\n accessToken = match && match[1];\n }\n\n if (!accessToken && typeof process !== 'undefined') {\n accessToken = accessToken || ({}).MapboxAccessToken || ({}).REACT_APP_MAPBOX_ACCESS_TOKEN;\n }\n\n return accessToken || 'no-token';\n}\n\nfunction checkPropTypes(props) {\n var component = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'component';\n\n if (props.debug) {\n prop_types.checkPropTypes(propTypes, props, 'prop', component);\n }\n}\n\nvar Mapbox = function () {\n function Mapbox(props) {\n var _this = this;\n\n _classCallCheck(this, Mapbox);\n\n _defineProperty(this, \"props\", defaultProps);\n\n _defineProperty(this, \"width\", 0);\n\n _defineProperty(this, \"height\", 0);\n\n _defineProperty(this, \"_fireLoadEvent\", function () {\n _this.props.onLoad({\n type: 'load',\n target: _this._map\n });\n });\n\n if (!props.mapboxgl) {\n throw new Error('Mapbox not available');\n }\n\n this.mapboxgl = props.mapboxgl;\n\n if (!Mapbox.initialized) {\n Mapbox.initialized = true;\n\n this._checkStyleSheet(this.mapboxgl.version);\n }\n\n this._initialize(props);\n }\n\n _createClass(Mapbox, [{\n key: \"finalize\",\n value: function finalize() {\n this._destroy();\n\n return this;\n }\n }, {\n key: \"setProps\",\n value: function setProps(props) {\n this._update(this.props, props);\n\n return this;\n }\n }, {\n key: \"redraw\",\n value: function redraw() {\n var map = this._map;\n\n if (map.style) {\n if (map._frame) {\n map._frame.cancel();\n\n map._frame = null;\n }\n\n map._render();\n }\n }\n }, {\n key: \"getMap\",\n value: function getMap() {\n return this._map;\n }\n }, {\n key: \"_reuse\",\n value: function _reuse(props) {\n this._map = Mapbox.savedMap;\n\n var oldContainer = this._map.getContainer();\n\n var newContainer = props.container;\n newContainer.classList.add('mapboxgl-map');\n\n while (oldContainer.childNodes.length > 0) {\n newContainer.appendChild(oldContainer.childNodes[0]);\n }\n\n this._map._container = newContainer;\n Mapbox.savedMap = null;\n\n if (props.mapStyle) {\n this._map.setStyle(normalizeStyle(props.mapStyle), {\n diff: false\n });\n }\n\n if (this._map.isStyleLoaded()) {\n this._fireLoadEvent();\n } else {\n this._map.once('styledata', this._fireLoadEvent);\n }\n }\n }, {\n key: \"_create\",\n value: function _create(props) {\n if (props.reuseMaps && Mapbox.savedMap) {\n this._reuse(props);\n } else {\n if (props.gl) {\n var getContext = HTMLCanvasElement.prototype.getContext;\n\n HTMLCanvasElement.prototype.getContext = function () {\n HTMLCanvasElement.prototype.getContext = getContext;\n return props.gl;\n };\n }\n\n var mapOptions = {\n container: props.container,\n center: [0, 0],\n zoom: 8,\n pitch: 0,\n bearing: 0,\n maxZoom: 24,\n style: normalizeStyle(props.mapStyle),\n interactive: false,\n trackResize: false,\n attributionControl: props.attributionControl,\n preserveDrawingBuffer: props.preserveDrawingBuffer\n };\n\n if (props.transformRequest) {\n mapOptions.transformRequest = props.transformRequest;\n }\n\n this._map = new this.mapboxgl.Map(Object.assign({}, mapOptions, props.mapOptions));\n\n this._map.once('load', props.onLoad);\n\n this._map.on('error', props.onError);\n }\n\n return this;\n }\n }, {\n key: \"_destroy\",\n value: function _destroy() {\n if (!this._map) {\n return;\n }\n\n if (!Mapbox.savedMap) {\n Mapbox.savedMap = this._map;\n\n this._map.off('load', this.props.onLoad);\n\n this._map.off('error', this.props.onError);\n\n this._map.off('styledata', this._fireLoadEvent);\n } else {\n this._map.remove();\n }\n\n this._map = null;\n }\n }, {\n key: \"_initialize\",\n value: function _initialize(props) {\n var _this2 = this;\n\n props = Object.assign({}, defaultProps, props);\n checkPropTypes(props, 'Mapbox');\n this.mapboxgl.accessToken = props.mapboxApiAccessToken || defaultProps.mapboxApiAccessToken;\n this.mapboxgl.baseApiUrl = props.mapboxApiUrl;\n\n this._create(props);\n\n var _props = props,\n container = _props.container;\n Object.defineProperty(container, 'offsetWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'clientWidth', {\n get: function get() {\n return _this2.width;\n }\n });\n Object.defineProperty(container, 'offsetHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n Object.defineProperty(container, 'clientHeight', {\n get: function get() {\n return _this2.height;\n }\n });\n\n var canvas = this._map.getCanvas();\n\n if (canvas) {\n canvas.style.outline = 'none';\n }\n\n this._updateMapViewport({}, props);\n\n this._updateMapSize({}, props);\n\n this.props = props;\n }\n }, {\n key: \"_update\",\n value: function _update(oldProps, newProps) {\n if (!this._map) {\n return;\n }\n\n newProps = Object.assign({}, this.props, newProps);\n checkPropTypes(newProps, 'Mapbox');\n\n var viewportChanged = this._updateMapViewport(oldProps, newProps);\n\n var sizeChanged = this._updateMapSize(oldProps, newProps);\n\n this._updateMapStyle(oldProps, newProps);\n\n if (!newProps.asyncRender && (viewportChanged || sizeChanged)) {\n this.redraw();\n }\n\n this.props = newProps;\n }\n }, {\n key: \"_updateMapStyle\",\n value: function _updateMapStyle(oldProps, newProps) {\n var styleChanged = oldProps.mapStyle !== newProps.mapStyle;\n\n if (styleChanged) {\n this._map.setStyle(normalizeStyle(newProps.mapStyle), {\n diff: !newProps.preventStyleDiffing\n });\n }\n }\n }, {\n key: \"_updateMapSize\",\n value: function _updateMapSize(oldProps, newProps) {\n var sizeChanged = oldProps.width !== newProps.width || oldProps.height !== newProps.height;\n\n if (sizeChanged) {\n this.width = newProps.width;\n this.height = newProps.height;\n\n this._map.resize();\n }\n\n return sizeChanged;\n }\n }, {\n key: \"_updateMapViewport\",\n value: function _updateMapViewport(oldProps, newProps) {\n var oldViewState = this._getViewState(oldProps);\n\n var newViewState = this._getViewState(newProps);\n\n var viewportChanged = newViewState.latitude !== oldViewState.latitude || newViewState.longitude !== oldViewState.longitude || newViewState.zoom !== oldViewState.zoom || newViewState.pitch !== oldViewState.pitch || newViewState.bearing !== oldViewState.bearing || newViewState.altitude !== oldViewState.altitude;\n\n if (viewportChanged) {\n this._map.jumpTo(this._viewStateToMapboxProps(newViewState));\n\n if (newViewState.altitude !== oldViewState.altitude) {\n this._map.transform.altitude = newViewState.altitude;\n }\n }\n\n return viewportChanged;\n }\n }, {\n key: \"_getViewState\",\n value: function _getViewState(props) {\n var _ref = props.viewState || props,\n longitude = _ref.longitude,\n latitude = _ref.latitude,\n zoom = _ref.zoom,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? 1.5 : _ref$altitude;\n\n return {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom,\n pitch: pitch,\n bearing: bearing,\n altitude: altitude\n };\n }\n }, {\n key: \"_checkStyleSheet\",\n value: function _checkStyleSheet() {\n var mapboxVersion = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '0.47.0';\n\n if (typeof document_ === 'undefined') {\n return;\n }\n\n try {\n var testElement = document_.createElement('div');\n testElement.className = 'mapboxgl-map';\n testElement.style.display = 'none';\n document_.body.appendChild(testElement);\n var isCssLoaded = window.getComputedStyle(testElement).position !== 'static';\n\n if (!isCssLoaded) {\n var link = document_.createElement('link');\n link.setAttribute('rel', 'stylesheet');\n link.setAttribute('type', 'text/css');\n link.setAttribute('href', \"https://api.tiles.mapbox.com/mapbox-gl-js/v\".concat(mapboxVersion, \"/mapbox-gl.css\"));\n document_.head.appendChild(link);\n }\n } catch (error) {}\n }\n }, {\n key: \"_viewStateToMapboxProps\",\n value: function _viewStateToMapboxProps(viewState) {\n return {\n center: [viewState.longitude, viewState.latitude],\n zoom: viewState.zoom,\n bearing: viewState.bearing,\n pitch: viewState.pitch\n };\n }\n }]);\n\n return Mapbox;\n}();\n\n_defineProperty(Mapbox, \"initialized\", false);\n\n_defineProperty(Mapbox, \"propTypes\", propTypes);\n\n_defineProperty(Mapbox, \"defaultProps\", defaultProps);\n\n_defineProperty(Mapbox, \"savedMap\", null);\n\n\n// EXTERNAL MODULE: ./node_modules/maplibre-gl/dist/maplibre-gl.js\nvar maplibre_gl = __webpack_require__(9910);\nvar maplibre_gl_default = /*#__PURE__*/__webpack_require__.n(maplibre_gl);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/mapboxgl.browser.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/math-utils.js\nvar math_utils_EPSILON = 1e-7;\n\nfunction isArray(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nfunction math_utils_equals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; ++i) {\n if (!math_utils_equals(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n return Math.abs(a - b) <= math_utils_EPSILON;\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction utils_math_utils_lerp(a, b, t) {\n if (isArray(a)) {\n return a.map(function (ai, i) {\n return utils_math_utils_lerp(ai, b[i], t);\n });\n }\n\n return t * b + (1 - t) * a;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/assert.js\nfunction utils_assert_assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'react-map-gl: assertion failed.');\n }\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-state.js\n\n\n\n\n\nfunction map_state_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_state_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_state_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_state_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar MAPBOX_LIMITS = {\n minZoom: 0,\n maxZoom: 24,\n minPitch: 0,\n maxPitch: 85\n};\nvar DEFAULT_STATE = {\n pitch: 0,\n bearing: 0,\n altitude: 1.5\n};\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\n\nvar MapState = function () {\n function MapState(_ref) {\n var width = _ref.width,\n height = _ref.height,\n latitude = _ref.latitude,\n longitude = _ref.longitude,\n zoom = _ref.zoom,\n _ref$bearing = _ref.bearing,\n bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing,\n _ref$pitch = _ref.pitch,\n pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch,\n _ref$altitude = _ref.altitude,\n altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude,\n _ref$maxZoom = _ref.maxZoom,\n maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom,\n _ref$minZoom = _ref.minZoom,\n minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom,\n _ref$maxPitch = _ref.maxPitch,\n maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch,\n _ref$minPitch = _ref.minPitch,\n minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch,\n transitionDuration = _ref.transitionDuration,\n transitionEasing = _ref.transitionEasing,\n transitionInterpolator = _ref.transitionInterpolator,\n transitionInterruption = _ref.transitionInterruption,\n startPanLngLat = _ref.startPanLngLat,\n startZoomLngLat = _ref.startZoomLngLat,\n startRotatePos = _ref.startRotatePos,\n startBearing = _ref.startBearing,\n startPitch = _ref.startPitch,\n startZoom = _ref.startZoom;\n\n _classCallCheck(this, MapState);\n\n utils_assert_assert(Number.isFinite(width), '`width` must be supplied');\n utils_assert_assert(Number.isFinite(height), '`height` must be supplied');\n utils_assert_assert(Number.isFinite(longitude), '`longitude` must be supplied');\n utils_assert_assert(Number.isFinite(latitude), '`latitude` must be supplied');\n utils_assert_assert(Number.isFinite(zoom), '`zoom` must be supplied');\n this._viewportProps = this._applyConstraints({\n width: width,\n height: height,\n latitude: latitude,\n longitude: longitude,\n zoom: zoom,\n bearing: bearing,\n pitch: pitch,\n altitude: altitude,\n maxZoom: maxZoom,\n minZoom: minZoom,\n maxPitch: maxPitch,\n minPitch: minPitch,\n transitionDuration: transitionDuration,\n transitionEasing: transitionEasing,\n transitionInterpolator: transitionInterpolator,\n transitionInterruption: transitionInterruption\n });\n this._state = {\n startPanLngLat: startPanLngLat,\n startZoomLngLat: startZoomLngLat,\n startRotatePos: startRotatePos,\n startBearing: startBearing,\n startPitch: startPitch,\n startZoom: startZoom\n };\n }\n\n _createClass(MapState, [{\n key: \"getViewportProps\",\n value: function getViewportProps() {\n return this._viewportProps;\n }\n }, {\n key: \"getState\",\n value: function getState() {\n return this._state;\n }\n }, {\n key: \"panStart\",\n value: function panStart(_ref2) {\n var pos = _ref2.pos;\n return this._getUpdatedMapState({\n startPanLngLat: this._unproject(pos)\n });\n }\n }, {\n key: \"pan\",\n value: function pan(_ref3) {\n var pos = _ref3.pos,\n startPos = _ref3.startPos;\n\n var startPanLngLat = this._state.startPanLngLat || this._unproject(startPos);\n\n if (!startPanLngLat) {\n return this;\n }\n\n var _this$_calculateNewLn = this._calculateNewLngLat({\n startPanLngLat: startPanLngLat,\n pos: pos\n }),\n _this$_calculateNewLn2 = slicedToArray_slicedToArray(_this$_calculateNewLn, 2),\n longitude = _this$_calculateNewLn2[0],\n latitude = _this$_calculateNewLn2[1];\n\n return this._getUpdatedMapState({\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"panEnd\",\n value: function panEnd() {\n return this._getUpdatedMapState({\n startPanLngLat: null\n });\n }\n }, {\n key: \"rotateStart\",\n value: function rotateStart(_ref4) {\n var pos = _ref4.pos;\n return this._getUpdatedMapState({\n startRotatePos: pos,\n startBearing: this._viewportProps.bearing,\n startPitch: this._viewportProps.pitch\n });\n }\n }, {\n key: \"rotate\",\n value: function rotate(_ref5) {\n var pos = _ref5.pos,\n _ref5$deltaAngleX = _ref5.deltaAngleX,\n deltaAngleX = _ref5$deltaAngleX === void 0 ? 0 : _ref5$deltaAngleX,\n _ref5$deltaAngleY = _ref5.deltaAngleY,\n deltaAngleY = _ref5$deltaAngleY === void 0 ? 0 : _ref5$deltaAngleY;\n var _this$_state = this._state,\n startRotatePos = _this$_state.startRotatePos,\n startBearing = _this$_state.startBearing,\n startPitch = _this$_state.startPitch;\n\n if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) {\n return this;\n }\n\n var newRotation;\n\n if (pos) {\n newRotation = this._calculateNewPitchAndBearing(map_state_objectSpread(map_state_objectSpread({}, this._getRotationParams(pos, startRotatePos)), {}, {\n startBearing: startBearing,\n startPitch: startPitch\n }));\n } else {\n newRotation = {\n bearing: startBearing + deltaAngleX,\n pitch: startPitch + deltaAngleY\n };\n }\n\n return this._getUpdatedMapState(newRotation);\n }\n }, {\n key: \"rotateEnd\",\n value: function rotateEnd() {\n return this._getUpdatedMapState({\n startBearing: null,\n startPitch: null\n });\n }\n }, {\n key: \"zoomStart\",\n value: function zoomStart(_ref6) {\n var pos = _ref6.pos;\n return this._getUpdatedMapState({\n startZoomLngLat: this._unproject(pos),\n startZoom: this._viewportProps.zoom\n });\n }\n }, {\n key: \"zoom\",\n value: function zoom(_ref7) {\n var pos = _ref7.pos,\n startPos = _ref7.startPos,\n scale = _ref7.scale;\n utils_assert_assert(scale > 0, '`scale` must be a positive number');\n var _this$_state2 = this._state,\n startZoom = _this$_state2.startZoom,\n startZoomLngLat = _this$_state2.startZoomLngLat;\n\n if (!Number.isFinite(startZoom)) {\n startZoom = this._viewportProps.zoom;\n startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n }\n\n utils_assert_assert(startZoomLngLat, '`startZoomLngLat` prop is required ' + 'for zoom behavior to calculate where to position the map.');\n\n var zoom = this._calculateNewZoom({\n scale: scale,\n startZoom: startZoom || 0\n });\n\n var zoomedViewport = new WebMercatorViewport(Object.assign({}, this._viewportProps, {\n zoom: zoom\n }));\n\n var _zoomedViewport$getMa = zoomedViewport.getMapCenterByLngLatPosition({\n lngLat: startZoomLngLat,\n pos: pos\n }),\n _zoomedViewport$getMa2 = slicedToArray_slicedToArray(_zoomedViewport$getMa, 2),\n longitude = _zoomedViewport$getMa2[0],\n latitude = _zoomedViewport$getMa2[1];\n\n return this._getUpdatedMapState({\n zoom: zoom,\n longitude: longitude,\n latitude: latitude\n });\n }\n }, {\n key: \"zoomEnd\",\n value: function zoomEnd() {\n return this._getUpdatedMapState({\n startZoomLngLat: null,\n startZoom: null\n });\n }\n }, {\n key: \"_getUpdatedMapState\",\n value: function _getUpdatedMapState(newProps) {\n return new MapState(Object.assign({}, this._viewportProps, this._state, newProps));\n }\n }, {\n key: \"_applyConstraints\",\n value: function _applyConstraints(props) {\n var maxZoom = props.maxZoom,\n minZoom = props.minZoom,\n zoom = props.zoom;\n props.zoom = clamp(zoom, minZoom, maxZoom);\n var maxPitch = props.maxPitch,\n minPitch = props.minPitch,\n pitch = props.pitch;\n props.pitch = clamp(pitch, minPitch, maxPitch);\n Object.assign(props, normalizeViewportProps(props));\n return props;\n }\n }, {\n key: \"_unproject\",\n value: function _unproject(pos) {\n var viewport = new WebMercatorViewport(this._viewportProps);\n return pos && viewport.unproject(pos);\n }\n }, {\n key: \"_calculateNewLngLat\",\n value: function _calculateNewLngLat(_ref8) {\n var startPanLngLat = _ref8.startPanLngLat,\n pos = _ref8.pos;\n var viewport = new WebMercatorViewport(this._viewportProps);\n return viewport.getMapCenterByLngLatPosition({\n lngLat: startPanLngLat,\n pos: pos\n });\n }\n }, {\n key: \"_calculateNewZoom\",\n value: function _calculateNewZoom(_ref9) {\n var scale = _ref9.scale,\n startZoom = _ref9.startZoom;\n var _this$_viewportProps = this._viewportProps,\n maxZoom = _this$_viewportProps.maxZoom,\n minZoom = _this$_viewportProps.minZoom;\n var zoom = startZoom + Math.log2(scale);\n return clamp(zoom, minZoom, maxZoom);\n }\n }, {\n key: \"_calculateNewPitchAndBearing\",\n value: function _calculateNewPitchAndBearing(_ref10) {\n var deltaScaleX = _ref10.deltaScaleX,\n deltaScaleY = _ref10.deltaScaleY,\n startBearing = _ref10.startBearing,\n startPitch = _ref10.startPitch;\n deltaScaleY = clamp(deltaScaleY, -1, 1);\n var _this$_viewportProps2 = this._viewportProps,\n minPitch = _this$_viewportProps2.minPitch,\n maxPitch = _this$_viewportProps2.maxPitch;\n var bearing = startBearing + 180 * deltaScaleX;\n var pitch = startPitch;\n\n if (deltaScaleY > 0) {\n pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n } else if (deltaScaleY < 0) {\n pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n }\n\n return {\n pitch: pitch,\n bearing: bearing\n };\n }\n }, {\n key: \"_getRotationParams\",\n value: function _getRotationParams(pos, startPos) {\n var deltaX = pos[0] - startPos[0];\n var deltaY = pos[1] - startPos[1];\n var centerY = pos[1];\n var startY = startPos[1];\n var _this$_viewportProps3 = this._viewportProps,\n width = _this$_viewportProps3.width,\n height = _this$_viewportProps3.height;\n var deltaScaleX = deltaX / width;\n var deltaScaleY = 0;\n\n if (deltaY > 0) {\n if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n }\n } else if (deltaY < 0) {\n if (startY > PITCH_MOUSE_THRESHOLD) {\n deltaScaleY = 1 - centerY / startY;\n }\n }\n\n deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n return {\n deltaScaleX: deltaScaleX,\n deltaScaleY: deltaScaleY\n };\n }\n }]);\n\n return MapState;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-constraints.js\n\n\nfunction decapitalize(s) {\n return s[0].toLowerCase() + s.slice(1);\n}\n\nfunction checkVisibilityConstraints(props) {\n var constraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MAPBOX_LIMITS;\n\n for (var constraintName in constraints) {\n var type = constraintName.slice(0, 3);\n var propName = decapitalize(constraintName.slice(3));\n\n if (type === 'min' && props[propName] < constraints[constraintName]) {\n return false;\n }\n\n if (type === 'max' && props[propName] > constraints[constraintName]) {\n return false;\n }\n }\n\n return true;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/map-context.js\n\n\n\nfunction map_context_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_context_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_context_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_context_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar MapContext = (0,react.createContext)({\n viewport: null,\n map: null,\n container: null,\n onViewportChange: null,\n onViewStateChange: null,\n eventManager: null\n});\nvar MapContextProvider = MapContext.Provider;\n\nfunction WrappedProvider(_ref) {\n var value = _ref.value,\n children = _ref.children;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n map = _useState2[0],\n setMap = _useState2[1];\n\n var context = (0,react.useContext)(MapContext);\n value = map_context_objectSpread(map_context_objectSpread({\n setMap: setMap\n }, context), {}, {\n map: context && context.map || map\n }, value);\n return react.createElement(MapContextProvider, {\n value: value\n }, children);\n}\n\nMapContext.Provider = WrappedProvider;\n/* harmony default export */ var map_context = (MapContext);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/use-isomorphic-layout-effect.js\n\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? react.useLayoutEffect : react.useEffect;\n/* harmony default export */ var use_isomorphic_layout_effect = (useIsomorphicLayoutEffect);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/terrain.js\nfunction getTerrainElevation(map, _ref) {\n var longitude = _ref.longitude,\n latitude = _ref.latitude;\n\n if (map && map.queryTerrainElevation) {\n return map.queryTerrainElevation([longitude, latitude]) || 0;\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/static-map.js\n\n\n\nfunction static_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction static_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n static_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n static_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar TOKEN_DOC_URL = 'https://visgl.github.io/react-map-gl/docs/get-started/mapbox-tokens';\nvar NO_TOKEN_WARNING = 'A valid API access token is required to use Mapbox data';\n\nfunction static_map_noop() {}\n\nfunction getViewport(_ref) {\n var map = _ref.map,\n props = _ref.props,\n width = _ref.width,\n height = _ref.height;\n\n var viewportProps = static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), props.viewState), {}, {\n width: width,\n height: height\n });\n\n viewportProps.position = [0, 0, getTerrainElevation(map, viewportProps)];\n return new WebMercatorViewport(viewportProps);\n}\nvar UNAUTHORIZED_ERROR_CODE = 401;\nvar CONTAINER_STYLE = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n};\nvar static_map_defaultProps = Object.assign({}, Mapbox.defaultProps, {\n disableTokenWarning: false,\n visible: true,\n onResize: static_map_noop,\n className: '',\n style: null,\n visibilityConstraints: MAPBOX_LIMITS\n});\n\nfunction NoTokenWarning() {\n var style = {\n position: 'absolute',\n left: 0,\n top: 0\n };\n return react.createElement(\"div\", {\n key: \"warning\",\n id: \"no-token-warning\",\n style: style\n }, react.createElement(\"h3\", {\n key: \"header\"\n }, NO_TOKEN_WARNING), react.createElement(\"div\", {\n key: \"text\"\n }, \"For information on setting up your basemap, read\"), react.createElement(\"a\", {\n key: \"link\",\n href: TOKEN_DOC_URL\n }, \"Note on Map Tokens\"));\n}\n\nfunction getRefHandles(mapboxRef) {\n return {\n getMap: function getMap() {\n return mapboxRef.current && mapboxRef.current.getMap();\n },\n queryRenderedFeatures: function queryRenderedFeatures(geometry) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var map = mapboxRef.current && mapboxRef.current.getMap();\n return map && map.queryRenderedFeatures(geometry, options);\n }\n };\n}\n\nvar StaticMap = (0,react.forwardRef)(function (props, ref) {\n var _useState = (0,react.useState)(true),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n accessTokenValid = _useState2[0],\n setTokenState = _useState2[1];\n\n var _useState3 = (0,react.useState)({\n width: 0,\n height: 0\n }),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n size = _useState4[0],\n setSize = _useState4[1];\n\n var mapboxRef = (0,react.useRef)(null);\n var mapDivRef = (0,react.useRef)(null);\n var containerRef = (0,react.useRef)(null);\n var overlayRef = (0,react.useRef)(null);\n var context = (0,react.useContext)(map_context);\n use_isomorphic_layout_effect(function () {\n if (!StaticMap.supported()) {\n return undefined;\n }\n\n var mapbox = new Mapbox(static_map_objectSpread(static_map_objectSpread(static_map_objectSpread({}, props), size), {}, {\n mapboxgl: (maplibre_gl_default()),\n container: mapDivRef.current,\n onError: function onError(evt) {\n var statusCode = evt.error && evt.error.status || evt.status;\n\n if (statusCode === UNAUTHORIZED_ERROR_CODE && accessTokenValid) {\n console.error(NO_TOKEN_WARNING);\n setTokenState(false);\n }\n\n props.onError(evt);\n }\n }));\n mapboxRef.current = mapbox;\n\n if (context && context.setMap) {\n context.setMap(mapbox.getMap());\n }\n\n var resizeObserver = new ResizeObserver_es(function (entries) {\n if (entries[0].contentRect) {\n var _entries$0$contentRec = entries[0].contentRect,\n _width = _entries$0$contentRec.width,\n _height = _entries$0$contentRec.height;\n setSize({\n width: _width,\n height: _height\n });\n props.onResize({\n width: _width,\n height: _height\n });\n }\n });\n resizeObserver.observe(containerRef.current);\n return function () {\n mapbox.finalize();\n mapboxRef.current = null;\n resizeObserver.disconnect();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (mapboxRef.current) {\n mapboxRef.current.setProps(static_map_objectSpread(static_map_objectSpread({}, props), size));\n }\n });\n var map = mapboxRef.current && mapboxRef.current.getMap();\n (0,react.useImperativeHandle)(ref, function () {\n return getRefHandles(mapboxRef);\n }, []);\n var preventScroll = (0,react.useCallback)(function (_ref2) {\n var target = _ref2.target;\n\n if (target === overlayRef.current) {\n target.scrollTo(0, 0);\n }\n }, []);\n var overlays = map && react.createElement(MapContextProvider, {\n value: static_map_objectSpread(static_map_objectSpread({}, context), {}, {\n viewport: context.viewport || getViewport(static_map_objectSpread({\n map: map,\n props: props\n }, size)),\n map: map,\n container: context.container || containerRef.current\n })\n }, react.createElement(\"div\", {\n key: \"map-overlays\",\n className: \"overlays\",\n ref: overlayRef,\n style: CONTAINER_STYLE,\n onScroll: preventScroll\n }, props.children));\n var className = props.className,\n width = props.width,\n height = props.height,\n style = props.style,\n visibilityConstraints = props.visibilityConstraints;\n var mapContainerStyle = Object.assign({\n position: 'relative'\n }, style, {\n width: width,\n height: height\n });\n var visible = props.visible && checkVisibilityConstraints(props.viewState || props, visibilityConstraints);\n var mapStyle = Object.assign({}, CONTAINER_STYLE, {\n visibility: visible ? 'inherit' : 'hidden'\n });\n return react.createElement(\"div\", {\n key: \"map-container\",\n ref: containerRef,\n style: mapContainerStyle\n }, react.createElement(\"div\", {\n key: \"map-mapbox\",\n ref: mapDivRef,\n style: mapStyle,\n className: className\n }), overlays, !accessTokenValid && !props.disableTokenWarning && react.createElement(NoTokenWarning, null));\n});\n\nStaticMap.supported = function () {\n return (maplibre_gl_default()) && maplibre_gl_default().supported();\n};\n\nStaticMap.defaultProps = static_map_defaultProps;\n/* harmony default export */ var static_map = (StaticMap);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-interpolator.js\n\n\n\n\nfunction transition_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = transition_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction transition_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return transition_interpolator_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return transition_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction transition_interpolator_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\n\n\n\nvar TransitionInterpolator = function () {\n function TransitionInterpolator() {\n _classCallCheck(this, TransitionInterpolator);\n\n _defineProperty(this, \"propNames\", []);\n }\n\n _createClass(TransitionInterpolator, [{\n key: \"arePropsEqual\",\n value: function arePropsEqual(currentProps, nextProps) {\n var _iterator = transition_interpolator_createForOfIteratorHelper(this.propNames || []),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n\n if (!math_utils_equals(currentProps[key], nextProps[key])) {\n return false;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return true;\n }\n }, {\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n return {\n start: startProps,\n end: endProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n utils_assert_assert(false, 'interpolateProps is not implemented');\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n return endProps.transitionDuration;\n }\n }]);\n\n return TransitionInterpolator;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nvar setPrototypeOf = __webpack_require__(4665);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) (0,setPrototypeOf/* default */.Z)(subClass, superClass);\n}\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js\nvar helpers_typeof = __webpack_require__(8);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js\n\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (helpers_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/transition-utils.js\nvar WRAPPED_ANGULAR_PROPS = {\n longitude: 1,\n bearing: 1\n};\nfunction transition_utils_mod(value, divisor) {\n var modulus = value % divisor;\n return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction isValid(prop) {\n return Number.isFinite(prop) || Array.isArray(prop);\n}\n\nfunction isWrappedAngularProp(propName) {\n return propName in WRAPPED_ANGULAR_PROPS;\n}\n\nfunction getEndValueByShortestPath(propName, startValue, endValue) {\n if (isWrappedAngularProp(propName) && Math.abs(endValue - startValue) > 180) {\n endValue = endValue < 0 ? endValue + 360 : endValue - 360;\n }\n\n return endValue;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/viewport-fly-to-interpolator.js\n\n\n\n\n\n\n\n\nfunction viewport_fly_to_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = viewport_fly_to_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction viewport_fly_to_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return viewport_fly_to_interpolator_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return viewport_fly_to_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction viewport_fly_to_interpolator_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\nvar REQUIRED_PROPS = ['latitude', 'longitude', 'zoom', 'width', 'height'];\nvar LINEARLY_INTERPOLATED_PROPS = ['bearing', 'pitch'];\nvar viewport_fly_to_interpolator_DEFAULT_OPTS = {\n speed: 1.2,\n curve: 1.414\n};\n\nvar ViewportFlyToInterpolator = function (_TransitionInterpolat) {\n _inherits(ViewportFlyToInterpolator, _TransitionInterpolat);\n\n var _super = _createSuper(ViewportFlyToInterpolator);\n\n function ViewportFlyToInterpolator() {\n var _this;\n\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, ViewportFlyToInterpolator);\n\n _this = _super.call(this);\n\n _defineProperty(_assertThisInitialized(_this), \"propNames\", viewport_fly_to_interpolator_VIEWPORT_TRANSITION_PROPS);\n\n _this.props = Object.assign({}, viewport_fly_to_interpolator_DEFAULT_OPTS, props);\n return _this;\n }\n\n _createClass(ViewportFlyToInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n var _iterator = viewport_fly_to_interpolator_createForOfIteratorHelper(REQUIRED_PROPS),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var _iterator2 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _key = _step2.value;\n\n var _startValue = startProps[_key] || 0;\n\n var _endValue = endProps[_key] || 0;\n\n startViewportProps[_key] = _startValue;\n endViewportProps[_key] = getEndValueByShortestPath(_key, _startValue, _endValue);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = flyToViewport(startProps, endProps, t, this.props);\n\n var _iterator3 = viewport_fly_to_interpolator_createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var key = _step3.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return viewport;\n }\n }, {\n key: \"getDuration\",\n value: function getDuration(startProps, endProps) {\n var transitionDuration = endProps.transitionDuration;\n\n if (transitionDuration === 'auto') {\n transitionDuration = getFlyToDuration(startProps, endProps, this.props);\n }\n\n return transitionDuration;\n }\n }]);\n\n return ViewportFlyToInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/linear-interpolator.js\n\n\n\n\n\n\n\nfunction linear_interpolator_createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = linear_interpolator_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}\n\nfunction linear_interpolator_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return linear_interpolator_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return linear_interpolator_arrayLikeToArray(o, minLen);\n}\n\nfunction linear_interpolator_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nfunction linear_interpolator_createSuper(Derived) {\n var hasNativeReflectConstruct = linear_interpolator_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction linear_interpolator_isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\n\nvar linear_interpolator_VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\n\nvar LinearInterpolator = function (_TransitionInterpolat) {\n _inherits(LinearInterpolator, _TransitionInterpolat);\n\n var _super = linear_interpolator_createSuper(LinearInterpolator);\n\n function LinearInterpolator() {\n var _this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, LinearInterpolator);\n\n _this = _super.call(this);\n\n if (Array.isArray(opts)) {\n opts = {\n transitionProps: opts\n };\n }\n\n _this.propNames = opts.transitionProps || linear_interpolator_VIEWPORT_TRANSITION_PROPS;\n\n if (opts.around) {\n _this.around = opts.around;\n }\n\n return _this;\n }\n\n _createClass(LinearInterpolator, [{\n key: \"initializeProps\",\n value: function initializeProps(startProps, endProps) {\n var startViewportProps = {};\n var endViewportProps = {};\n\n if (this.around) {\n startViewportProps.around = this.around;\n var aroundLngLat = new WebMercatorViewport(startProps).unproject(this.around);\n Object.assign(endViewportProps, endProps, {\n around: new WebMercatorViewport(endProps).project(aroundLngLat),\n aroundLngLat: aroundLngLat\n });\n }\n\n var _iterator = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var key = _step.value;\n var startValue = startProps[key];\n var endValue = endProps[key];\n utils_assert_assert(isValid(startValue) && isValid(endValue), \"\".concat(key, \" must be supplied for transition\"));\n startViewportProps[key] = startValue;\n endViewportProps[key] = getEndValueByShortestPath(key, startValue, endValue);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return {\n start: startViewportProps,\n end: endViewportProps\n };\n }\n }, {\n key: \"interpolateProps\",\n value: function interpolateProps(startProps, endProps, t) {\n var viewport = {};\n\n var _iterator2 = linear_interpolator_createForOfIteratorHelper(this.propNames),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var key = _step2.value;\n viewport[key] = utils_math_utils_lerp(startProps[key], endProps[key], t);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (endProps.around) {\n var _WebMercatorViewport$ = new WebMercatorViewport(Object.assign({}, endProps, viewport)).getMapCenterByLngLatPosition({\n lngLat: endProps.aroundLngLat,\n pos: utils_math_utils_lerp(startProps.around, endProps.around, t)\n }),\n _WebMercatorViewport$2 = slicedToArray_slicedToArray(_WebMercatorViewport$, 2),\n longitude = _WebMercatorViewport$2[0],\n latitude = _WebMercatorViewport$2[1];\n\n viewport.longitude = longitude;\n viewport.latitude = latitude;\n }\n\n return viewport;\n }\n }]);\n\n return LinearInterpolator;\n}(TransitionInterpolator);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition/index.js\n\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/transition-manager.js\n\n\n\n\n\n\n\nvar transition_manager_noop = function noop() {};\n\nfunction cropEasingFunction(easing, x0) {\n var y0 = easing(x0);\n return function (t) {\n return 1 / (1 - y0) * (easing(t * (1 - x0) + x0) - y0);\n };\n}\nvar TRANSITION_EVENTS = {\n BREAK: 1,\n SNAP_TO_END: 2,\n IGNORE: 3,\n UPDATE: 4\n};\nvar DEFAULT_PROPS = {\n transitionDuration: 0,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK,\n onTransitionStart: transition_manager_noop,\n onTransitionInterrupt: transition_manager_noop,\n onTransitionEnd: transition_manager_noop\n};\n\nvar TransitionManager = function () {\n function TransitionManager() {\n var _this = this;\n\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, TransitionManager);\n\n _defineProperty(this, \"_animationFrame\", null);\n\n _defineProperty(this, \"_onTransitionFrame\", function () {\n _this._animationFrame = requestAnimationFrame(_this._onTransitionFrame);\n\n _this._updateViewport();\n });\n\n this.props = null;\n this.onViewportChange = opts.onViewportChange || transition_manager_noop;\n this.onStateChange = opts.onStateChange || transition_manager_noop;\n this.time = opts.getTime || Date.now;\n }\n\n _createClass(TransitionManager, [{\n key: \"getViewportInTransition\",\n value: function getViewportInTransition() {\n return this._animationFrame ? this.state.propsInTransition : null;\n }\n }, {\n key: \"processViewportChange\",\n value: function processViewportChange(nextProps) {\n var currentProps = this.props;\n this.props = nextProps;\n\n if (!currentProps || this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n return false;\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n var startProps = Object.assign({}, currentProps);\n var endProps = Object.assign({}, nextProps);\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n if (this.state.interruption === TRANSITION_EVENTS.SNAP_TO_END) {\n Object.assign(startProps, this.state.endProps);\n } else {\n Object.assign(startProps, this.state.propsInTransition);\n }\n\n if (this.state.interruption === TRANSITION_EVENTS.UPDATE) {\n var currentTime = this.time();\n var x0 = (currentTime - this.state.startTime) / this.state.duration;\n endProps.transitionDuration = this.state.duration - (currentTime - this.state.startTime);\n endProps.transitionEasing = cropEasingFunction(this.state.easing, x0);\n endProps.transitionInterpolator = startProps.transitionInterpolator;\n }\n }\n\n endProps.onTransitionStart();\n\n this._triggerTransition(startProps, endProps);\n\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n currentProps.onTransitionInterrupt();\n\n this._endTransition();\n }\n\n return false;\n }\n }, {\n key: \"_isTransitionInProgress\",\n value: function _isTransitionInProgress() {\n return Boolean(this._animationFrame);\n }\n }, {\n key: \"_isTransitionEnabled\",\n value: function _isTransitionEnabled(props) {\n var transitionDuration = props.transitionDuration,\n transitionInterpolator = props.transitionInterpolator;\n return (transitionDuration > 0 || transitionDuration === 'auto') && Boolean(transitionInterpolator);\n }\n }, {\n key: \"_isUpdateDueToCurrentTransition\",\n value: function _isUpdateDueToCurrentTransition(props) {\n if (this.state.propsInTransition) {\n return this.state.interpolator.arePropsEqual(props, this.state.propsInTransition);\n }\n\n return false;\n }\n }, {\n key: \"_shouldIgnoreViewportChange\",\n value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n if (!currentProps) {\n return true;\n }\n\n if (this._isTransitionInProgress()) {\n return this.state.interruption === TRANSITION_EVENTS.IGNORE || this._isUpdateDueToCurrentTransition(nextProps);\n }\n\n if (this._isTransitionEnabled(nextProps)) {\n return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n }\n\n return true;\n }\n }, {\n key: \"_triggerTransition\",\n value: function _triggerTransition(startProps, endProps) {\n utils_assert_assert(this._isTransitionEnabled(endProps));\n\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n }\n\n var transitionInterpolator = endProps.transitionInterpolator;\n var duration = transitionInterpolator.getDuration ? transitionInterpolator.getDuration(startProps, endProps) : endProps.transitionDuration;\n\n if (duration === 0) {\n return;\n }\n\n var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endProps);\n var interactionState = {\n inTransition: true,\n isZooming: startProps.zoom !== endProps.zoom,\n isPanning: startProps.longitude !== endProps.longitude || startProps.latitude !== endProps.latitude,\n isRotating: startProps.bearing !== endProps.bearing || startProps.pitch !== endProps.pitch\n };\n this.state = {\n duration: duration,\n easing: endProps.transitionEasing,\n interpolator: endProps.transitionInterpolator,\n interruption: endProps.transitionInterruption,\n startTime: this.time(),\n startProps: initialProps.start,\n endProps: initialProps.end,\n animation: null,\n propsInTransition: {}\n };\n\n this._onTransitionFrame();\n\n this.onStateChange(interactionState);\n }\n }, {\n key: \"_endTransition\",\n value: function _endTransition() {\n if (this._animationFrame) {\n cancelAnimationFrame(this._animationFrame);\n this._animationFrame = null;\n }\n\n this.onStateChange({\n inTransition: false,\n isZooming: false,\n isPanning: false,\n isRotating: false\n });\n }\n }, {\n key: \"_updateViewport\",\n value: function _updateViewport() {\n var currentTime = this.time();\n var _this$state = this.state,\n startTime = _this$state.startTime,\n duration = _this$state.duration,\n easing = _this$state.easing,\n interpolator = _this$state.interpolator,\n startProps = _this$state.startProps,\n endProps = _this$state.endProps;\n var shouldEnd = false;\n var t = (currentTime - startTime) / duration;\n\n if (t >= 1) {\n t = 1;\n shouldEnd = true;\n }\n\n t = easing(t);\n var viewport = interpolator.interpolateProps(startProps, endProps, t);\n var mapState = new MapState(Object.assign({}, this.props, viewport));\n this.state.propsInTransition = mapState.getViewportProps();\n this.onViewportChange(this.state.propsInTransition, this.props);\n\n if (shouldEnd) {\n this._endTransition();\n\n this.props.onTransitionEnd();\n }\n }\n }]);\n\n return TransitionManager;\n}();\n\n_defineProperty(TransitionManager, \"defaultProps\", DEFAULT_PROPS);\n\n\n// EXTERNAL MODULE: ./node_modules/hammerjs/hammer.js\nvar hammer = __webpack_require__(5087);\nvar hammer_default = /*#__PURE__*/__webpack_require__.n(hammer);\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer-overrides.js\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nfunction some(array, predict) {\n for (var i = 0; i < array.length; i++) {\n if (predict(array[i])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction enhancePointerEventInput(PointerEventInput) {\n var oldHandler = PointerEventInput.prototype.handler;\n\n PointerEventInput.prototype.handler = function handler(ev) {\n var store = this.store;\n\n if (ev.button > 0 && ev.type === 'pointerdown') {\n if (!some(store, function (e) {\n return e.pointerId === ev.pointerId;\n })) {\n store.push(ev);\n }\n }\n\n oldHandler.call(this, ev);\n };\n}\nfunction enhanceMouseInput(MouseInput) {\n MouseInput.prototype.handler = function handler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n if (eventType & INPUT_START && ev.button >= 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which === 0) {\n eventType = INPUT_END;\n }\n\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: 'mouse',\n srcEvent: ev\n });\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/hammer.browser.js\n\n\nenhancePointerEventInput((hammer_default()).PointerEventInput);\nenhanceMouseInput((hammer_default()).MouseInput);\nvar Manager = (hammer_default()).Manager;\n/* harmony default export */ var hammer_browser = ((hammer_default()));\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/constants.js\n\nvar RECOGNIZERS = hammer_browser ? [[hammer_browser.Pan, {\n event: 'tripan',\n pointers: 3,\n threshold: 0,\n enable: false\n}], [hammer_browser.Rotate, {\n enable: false\n}], [hammer_browser.Pinch, {\n enable: false\n}], [hammer_browser.Swipe, {\n enable: false\n}], [hammer_browser.Pan, {\n threshold: 0,\n enable: false\n}], [hammer_browser.Press, {\n enable: false\n}], [hammer_browser.Tap, {\n event: 'doubletap',\n taps: 2,\n enable: false\n}], [hammer_browser.Tap, {\n event: 'anytap',\n enable: false\n}], [hammer_browser.Tap, {\n enable: false\n}]] : null;\nvar RECOGNIZER_COMPATIBLE_MAP = {\n tripan: ['rotate', 'pinch', 'pan'],\n rotate: ['pinch'],\n pinch: ['pan'],\n pan: ['press', 'doubletap', 'anytap', 'tap'],\n doubletap: ['anytap'],\n anytap: ['tap']\n};\nvar RECOGNIZER_FALLBACK_MAP = {\n doubletap: ['tap']\n};\nvar BASIC_EVENT_ALIASES = {\n pointerdown: 'pointerdown',\n pointermove: 'pointermove',\n pointerup: 'pointerup',\n touchstart: 'pointerdown',\n touchmove: 'pointermove',\n touchend: 'pointerup',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup'\n};\nvar INPUT_EVENT_TYPES = {\n KEY_EVENTS: ['keydown', 'keyup'],\n MOUSE_EVENTS: ['mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout', 'mouseleave'],\n WHEEL_EVENTS: ['wheel', 'mousewheel']\n};\nvar EVENT_RECOGNIZER_MAP = {\n tap: 'tap',\n anytap: 'anytap',\n doubletap: 'doubletap',\n press: 'press',\n pinch: 'pinch',\n pinchin: 'pinch',\n pinchout: 'pinch',\n pinchstart: 'pinch',\n pinchmove: 'pinch',\n pinchend: 'pinch',\n pinchcancel: 'pinch',\n rotate: 'rotate',\n rotatestart: 'rotate',\n rotatemove: 'rotate',\n rotateend: 'rotate',\n rotatecancel: 'rotate',\n tripan: 'tripan',\n tripanstart: 'tripan',\n tripanmove: 'tripan',\n tripanup: 'tripan',\n tripandown: 'tripan',\n tripanleft: 'tripan',\n tripanright: 'tripan',\n tripanend: 'tripan',\n tripancancel: 'tripan',\n pan: 'pan',\n panstart: 'pan',\n panmove: 'pan',\n panup: 'pan',\n pandown: 'pan',\n panleft: 'pan',\n panright: 'pan',\n panend: 'pan',\n pancancel: 'pan',\n swipe: 'swipe',\n swipeleft: 'swipe',\n swiperight: 'swipe',\n swipeup: 'swipe',\n swipedown: 'swipe'\n};\nvar GESTURE_EVENT_ALIASES = {\n click: 'tap',\n anyclick: 'anytap',\n dblclick: 'doubletap',\n mousedown: 'pointerdown',\n mousemove: 'pointermove',\n mouseup: 'pointerup',\n mouseover: 'pointerover',\n mouseout: 'pointerout',\n mouseleave: 'pointerleave'\n};\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/globals.js\nvar userAgent = typeof navigator !== 'undefined' && navigator.userAgent ? navigator.userAgent.toLowerCase() : '';\nvar globals_window_ = typeof window !== 'undefined' ? window : __webpack_require__.g;\nvar globals_global_ = typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : window;\nvar globals_document_ = typeof document !== 'undefined' ? document : {};\n\nvar passiveSupported = false;\n\ntry {\n var options = {\n get passive() {\n passiveSupported = true;\n return true;\n }\n\n };\n globals_window_.addEventListener('test', options, options);\n globals_window_.removeEventListener('test', options, options);\n} catch (err) {}\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/wheel-input.js\n\n\n\n\nvar firefox = userAgent.indexOf('firefox') !== -1;\nvar WHEEL_EVENTS = INPUT_EVENT_TYPES.WHEEL_EVENTS;\nvar EVENT_TYPE = 'wheel';\nvar WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nvar WHEEL_DELTA_PER_LINE = 40;\nvar SHIFT_MULTIPLIER = 0.25;\n\nvar WheelInput = /*#__PURE__*/function () {\n function WheelInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, WheelInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.events = WHEEL_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent, passiveSupported ? {\n passive: false\n } : false);\n });\n }\n\n _createClass(WheelInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n var value = event.deltaY;\n\n if (globals_window_.WheelEvent) {\n if (firefox && event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_PIXEL) {\n value /= globals_window_.devicePixelRatio;\n }\n\n if (event.deltaMode === globals_window_.WheelEvent.DOM_DELTA_LINE) {\n value *= WHEEL_DELTA_PER_LINE;\n }\n }\n\n var wheelPosition = {\n x: event.clientX,\n y: event.clientY\n };\n\n if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) {\n value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n }\n\n if (event.shiftKey && value) {\n value = value * SHIFT_MULTIPLIER;\n }\n\n this._onWheel(event, -value, wheelPosition);\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(srcEvent, delta, position) {\n this.callback({\n type: EVENT_TYPE,\n center: position,\n delta: delta,\n srcEvent: srcEvent,\n pointerType: 'mouse',\n target: srcEvent.target\n });\n }\n }]);\n\n return WheelInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/move-input.js\n\n\n\nvar MOUSE_EVENTS = INPUT_EVENT_TYPES.MOUSE_EVENTS;\nvar MOVE_EVENT_TYPE = 'pointermove';\nvar OVER_EVENT_TYPE = 'pointerover';\nvar OUT_EVENT_TYPE = 'pointerout';\nvar LEAVE_EVENT_TYPE = 'pointerleave';\n\nvar MoveInput = /*#__PURE__*/function () {\n function MoveInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, MoveInput);\n\n this.element = element;\n this.callback = callback;\n this.pressed = false;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableMoveEvent = this.options.enable;\n this.enableLeaveEvent = this.options.enable;\n this.enableOutEvent = this.options.enable;\n this.enableOverEvent = this.options.enable;\n this.events = MOUSE_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(MoveInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === MOVE_EVENT_TYPE) {\n this.enableMoveEvent = enabled;\n }\n\n if (eventType === OVER_EVENT_TYPE) {\n this.enableOverEvent = enabled;\n }\n\n if (eventType === OUT_EVENT_TYPE) {\n this.enableOutEvent = enabled;\n }\n\n if (eventType === LEAVE_EVENT_TYPE) {\n this.enableLeaveEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.handleOverEvent(event);\n this.handleOutEvent(event);\n this.handleLeaveEvent(event);\n this.handleMoveEvent(event);\n }\n }, {\n key: \"handleOverEvent\",\n value: function handleOverEvent(event) {\n if (this.enableOverEvent) {\n if (event.type === 'mouseover') {\n this.callback({\n type: OVER_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleOutEvent\",\n value: function handleOutEvent(event) {\n if (this.enableOutEvent) {\n if (event.type === 'mouseout') {\n this.callback({\n type: OUT_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleLeaveEvent\",\n value: function handleLeaveEvent(event) {\n if (this.enableLeaveEvent) {\n if (event.type === 'mouseleave') {\n this.callback({\n type: LEAVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }\n }\n }, {\n key: \"handleMoveEvent\",\n value: function handleMoveEvent(event) {\n if (this.enableMoveEvent) {\n switch (event.type) {\n case 'mousedown':\n if (event.button >= 0) {\n this.pressed = true;\n }\n\n break;\n\n case 'mousemove':\n if (event.which === 0) {\n this.pressed = false;\n }\n\n if (!this.pressed) {\n this.callback({\n type: MOVE_EVENT_TYPE,\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n\n break;\n\n case 'mouseup':\n this.pressed = false;\n break;\n\n default:\n }\n }\n }\n }]);\n\n return MoveInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/key-input.js\n\n\n\nvar KEY_EVENTS = INPUT_EVENT_TYPES.KEY_EVENTS;\nvar DOWN_EVENT_TYPE = 'keydown';\nvar UP_EVENT_TYPE = 'keyup';\n\nvar KeyInput = /*#__PURE__*/function () {\n function KeyInput(element, callback) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, KeyInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.enableDownEvent = this.options.enable;\n this.enableUpEvent = this.options.enable;\n this.events = KEY_EVENTS.concat(options.events || []);\n this.handleEvent = this.handleEvent.bind(this);\n element.tabIndex = options.tabIndex || 0;\n element.style.outline = 'none';\n this.events.forEach(function (event) {\n return element.addEventListener(event, _this.handleEvent);\n });\n }\n\n _createClass(KeyInput, [{\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n this.events.forEach(function (event) {\n return _this2.element.removeEventListener(event, _this2.handleEvent);\n });\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === DOWN_EVENT_TYPE) {\n this.enableDownEvent = enabled;\n }\n\n if (eventType === UP_EVENT_TYPE) {\n this.enableUpEvent = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n var targetElement = event.target || event.srcElement;\n\n if (targetElement.tagName === 'INPUT' && targetElement.type === 'text' || targetElement.tagName === 'TEXTAREA') {\n return;\n }\n\n if (this.enableDownEvent && event.type === 'keydown') {\n this.callback({\n type: DOWN_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n\n if (this.enableUpEvent && event.type === 'keyup') {\n this.callback({\n type: UP_EVENT_TYPE,\n srcEvent: event,\n key: event.key,\n target: event.target\n });\n }\n }\n }]);\n\n return KeyInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/inputs/contextmenu-input.js\n\n\nvar contextmenu_input_EVENT_TYPE = 'contextmenu';\n\nvar ContextmenuInput = /*#__PURE__*/function () {\n function ContextmenuInput(element, callback) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, ContextmenuInput);\n\n this.element = element;\n this.callback = callback;\n this.options = Object.assign({\n enable: true\n }, options);\n this.handleEvent = this.handleEvent.bind(this);\n element.addEventListener('contextmenu', this.handleEvent);\n }\n\n _createClass(ContextmenuInput, [{\n key: \"destroy\",\n value: function destroy() {\n this.element.removeEventListener('contextmenu', this.handleEvent);\n }\n }, {\n key: \"enableEventType\",\n value: function enableEventType(eventType, enabled) {\n if (eventType === contextmenu_input_EVENT_TYPE) {\n this.options.enable = enabled;\n }\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (!this.options.enable) {\n return;\n }\n\n this.callback({\n type: contextmenu_input_EVENT_TYPE,\n center: {\n x: event.clientX,\n y: event.clientY\n },\n srcEvent: event,\n pointerType: 'mouse',\n target: event.target\n });\n }\n }]);\n\n return ContextmenuInput;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-utils.js\nvar DOWN_EVENT = 1;\nvar MOVE_EVENT = 2;\nvar UP_EVENT = 4;\nvar event_utils_MOUSE_EVENTS = {\n pointerdown: DOWN_EVENT,\n pointermove: MOVE_EVENT,\n pointerup: UP_EVENT,\n mousedown: DOWN_EVENT,\n mousemove: MOVE_EVENT,\n mouseup: UP_EVENT\n};\nvar MOUSE_EVENT_WHICH_LEFT = 1;\nvar MOUSE_EVENT_WHICH_MIDDLE = 2;\nvar MOUSE_EVENT_WHICH_RIGHT = 3;\nvar MOUSE_EVENT_BUTTON_LEFT = 0;\nvar MOUSE_EVENT_BUTTON_MIDDLE = 1;\nvar MOUSE_EVENT_BUTTON_RIGHT = 2;\nvar MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nvar MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nvar MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\nfunction whichButtons(event) {\n var eventType = event_utils_MOUSE_EVENTS[event.srcEvent.type];\n\n if (!eventType) {\n return null;\n }\n\n var _event$srcEvent = event.srcEvent,\n buttons = _event$srcEvent.buttons,\n button = _event$srcEvent.button,\n which = _event$srcEvent.which;\n var leftButton = false;\n var middleButton = false;\n var rightButton = false;\n\n if (eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n } else if (eventType === MOVE_EVENT) {\n leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n } else if (eventType === DOWN_EVENT) {\n leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n }\n\n return {\n leftButton: leftButton,\n middleButton: middleButton,\n rightButton: rightButton\n };\n}\nfunction getOffsetPosition(event, rootElement) {\n var srcEvent = event.srcEvent;\n\n if (!event.center && !Number.isFinite(srcEvent.clientX)) {\n return null;\n }\n\n var center = event.center || {\n x: srcEvent.clientX,\n y: srcEvent.clientY\n };\n var rect = rootElement.getBoundingClientRect();\n var scaleX = rect.width / rootElement.offsetWidth || 1;\n var scaleY = rect.height / rootElement.offsetHeight || 1;\n var offsetCenter = {\n x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n y: (center.y - rect.top - rootElement.clientTop) / scaleY\n };\n return {\n center: center,\n offsetCenter: offsetCenter\n };\n}\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/utils/event-registrar.js\n\n\n\nvar DEFAULT_OPTIONS = {\n srcElement: 'root',\n priority: 0\n};\n\nvar EventRegistrar = /*#__PURE__*/function () {\n function EventRegistrar(eventManager) {\n _classCallCheck(this, EventRegistrar);\n\n this.eventManager = eventManager;\n this.handlers = [];\n this.handlersByElement = new Map();\n this.handleEvent = this.handleEvent.bind(this);\n this._active = false;\n }\n\n _createClass(EventRegistrar, [{\n key: \"isEmpty\",\n value: function isEmpty() {\n return !this._active;\n }\n }, {\n key: \"add\",\n value: function add(type, handler, opts) {\n var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n if (opts && (typeof opts !== 'object' || opts.addEventListener)) {\n opts = {\n srcElement: opts\n };\n }\n\n opts = opts ? Object.assign({}, DEFAULT_OPTIONS, opts) : DEFAULT_OPTIONS;\n var entries = handlersByElement.get(opts.srcElement);\n\n if (!entries) {\n entries = [];\n handlersByElement.set(opts.srcElement, entries);\n }\n\n var entry = {\n type: type,\n handler: handler,\n srcElement: opts.srcElement,\n priority: opts.priority\n };\n\n if (once) {\n entry.once = true;\n }\n\n if (passive) {\n entry.passive = true;\n }\n\n handlers.push(entry);\n this._active = this._active || !entry.passive;\n var insertPosition = entries.length - 1;\n\n while (insertPosition >= 0) {\n if (entries[insertPosition].priority >= entry.priority) {\n break;\n }\n\n insertPosition--;\n }\n\n entries.splice(insertPosition + 1, 0, entry);\n }\n }, {\n key: \"remove\",\n value: function remove(type, handler) {\n var handlers = this.handlers,\n handlersByElement = this.handlersByElement;\n\n for (var i = handlers.length - 1; i >= 0; i--) {\n var entry = handlers[i];\n\n if (entry.type === type && entry.handler === handler) {\n handlers.splice(i, 1);\n var entries = handlersByElement.get(entry.srcElement);\n entries.splice(entries.indexOf(entry), 1);\n\n if (entries.length === 0) {\n handlersByElement.delete(entry.srcElement);\n }\n }\n }\n\n this._active = handlers.some(function (entry) {\n return !entry.passive;\n });\n }\n }, {\n key: \"handleEvent\",\n value: function handleEvent(event) {\n if (this.isEmpty()) {\n return;\n }\n\n var mjolnirEvent = this._normalizeEvent(event);\n\n var target = event.srcEvent.target;\n\n while (target && target !== mjolnirEvent.rootElement) {\n this._emit(mjolnirEvent, target);\n\n if (mjolnirEvent.handled) {\n return;\n }\n\n target = target.parentNode;\n }\n\n this._emit(mjolnirEvent, 'root');\n }\n }, {\n key: \"_emit\",\n value: function _emit(event, srcElement) {\n var entries = this.handlersByElement.get(srcElement);\n\n if (entries) {\n var immediatePropagationStopped = false;\n\n var stopPropagation = function stopPropagation() {\n event.handled = true;\n };\n\n var stopImmediatePropagation = function stopImmediatePropagation() {\n event.handled = true;\n immediatePropagationStopped = true;\n };\n\n var entriesToRemove = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n type = _entries$i.type,\n handler = _entries$i.handler,\n once = _entries$i.once;\n handler(Object.assign({}, event, {\n type: type,\n stopPropagation: stopPropagation,\n stopImmediatePropagation: stopImmediatePropagation\n }));\n\n if (once) {\n entriesToRemove.push(entries[i]);\n }\n\n if (immediatePropagationStopped) {\n break;\n }\n }\n\n for (var _i = 0; _i < entriesToRemove.length; _i++) {\n var _entriesToRemove$_i = entriesToRemove[_i],\n _type = _entriesToRemove$_i.type,\n _handler = _entriesToRemove$_i.handler;\n this.remove(_type, _handler);\n }\n }\n }\n }, {\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(event) {\n var rootElement = this.eventManager.element;\n return Object.assign({}, event, whichButtons(event), getOffsetPosition(event, rootElement), {\n handled: false,\n rootElement: rootElement\n });\n }\n }]);\n\n return EventRegistrar;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/event-manager.js\n\n\n\n\nfunction event_manager_createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = event_manager_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction event_manager_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return event_manager_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return event_manager_arrayLikeToArray(o, minLen); }\n\nfunction event_manager_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\n\n\n\n\nvar event_manager_DEFAULT_OPTIONS = {\n events: null,\n recognizers: null,\n recognizerOptions: {},\n Manager: Manager,\n touchAction: 'none',\n tabIndex: 0\n};\n\nvar EventManager = /*#__PURE__*/function () {\n function EventManager() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, EventManager);\n\n this.options = Object.assign({}, event_manager_DEFAULT_OPTIONS, options);\n this.events = new Map();\n this._onBasicInput = this._onBasicInput.bind(this);\n this._onOtherEvent = this._onOtherEvent.bind(this);\n this.setElement(element);\n var events = options.events;\n\n if (events) {\n this.on(events);\n }\n }\n\n _createClass(EventManager, [{\n key: \"setElement\",\n value: function setElement(element) {\n var _this = this;\n\n if (this.element) {\n this.destroy();\n }\n\n this.element = element;\n\n if (!element) {\n return;\n }\n\n var options = this.options;\n var ManagerClass = options.Manager;\n this.manager = new ManagerClass(element, {\n touchAction: options.touchAction,\n recognizers: options.recognizers || RECOGNIZERS\n }).on('hammer.input', this._onBasicInput);\n\n if (!options.recognizers) {\n Object.keys(RECOGNIZER_COMPATIBLE_MAP).forEach(function (name) {\n var recognizer = _this.manager.get(name);\n\n if (recognizer) {\n RECOGNIZER_COMPATIBLE_MAP[name].forEach(function (otherName) {\n recognizer.recognizeWith(otherName);\n });\n }\n });\n }\n\n for (var recognizerName in options.recognizerOptions) {\n var recognizer = this.manager.get(recognizerName);\n\n if (recognizer) {\n var recognizerOption = options.recognizerOptions[recognizerName];\n delete recognizerOption.enable;\n recognizer.set(recognizerOption);\n }\n }\n\n this.wheelInput = new WheelInput(element, this._onOtherEvent, {\n enable: false\n });\n this.moveInput = new MoveInput(element, this._onOtherEvent, {\n enable: false\n });\n this.keyInput = new KeyInput(element, this._onOtherEvent, {\n enable: false,\n tabIndex: options.tabIndex\n });\n this.contextmenuInput = new ContextmenuInput(element, this._onOtherEvent, {\n enable: false\n });\n\n var _iterator = event_manager_createForOfIteratorHelper(this.events),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = slicedToArray_slicedToArray(_step.value, 2),\n eventAlias = _step$value[0],\n eventRegistrar = _step$value[1];\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n\n this.manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.element) {\n this.wheelInput.destroy();\n this.moveInput.destroy();\n this.keyInput.destroy();\n this.contextmenuInput.destroy();\n this.manager.destroy();\n this.wheelInput = null;\n this.moveInput = null;\n this.keyInput = null;\n this.contextmenuInput = null;\n this.manager = null;\n this.element = null;\n }\n }\n }, {\n key: \"on\",\n value: function on(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false);\n }\n }, {\n key: \"once\",\n value: function once(event, handler, opts) {\n this._addEventHandler(event, handler, opts, true);\n }\n }, {\n key: \"watch\",\n value: function watch(event, handler, opts) {\n this._addEventHandler(event, handler, opts, false, true);\n }\n }, {\n key: \"off\",\n value: function off(event, handler) {\n this._removeEventHandler(event, handler);\n }\n }, {\n key: \"_toggleRecognizer\",\n value: function _toggleRecognizer(name, enabled) {\n var manager = this.manager;\n\n if (!manager) {\n return;\n }\n\n var recognizer = manager.get(name);\n\n if (recognizer && recognizer.options.enable !== enabled) {\n recognizer.set({\n enable: enabled\n });\n var fallbackRecognizers = RECOGNIZER_FALLBACK_MAP[name];\n\n if (fallbackRecognizers && !this.options.recognizers) {\n fallbackRecognizers.forEach(function (otherName) {\n var otherRecognizer = manager.get(otherName);\n\n if (enabled) {\n otherRecognizer.requireFailure(name);\n recognizer.dropRequireFailure(otherName);\n } else {\n otherRecognizer.dropRequireFailure(name);\n }\n });\n }\n }\n\n this.wheelInput.enableEventType(name, enabled);\n this.moveInput.enableEventType(name, enabled);\n this.keyInput.enableEventType(name, enabled);\n this.contextmenuInput.enableEventType(name, enabled);\n }\n }, {\n key: \"_addEventHandler\",\n value: function _addEventHandler(event, handler, opts, once, passive) {\n if (typeof event !== 'string') {\n opts = handler;\n\n for (var eventName in event) {\n this._addEventHandler(eventName, event[eventName], opts, once, passive);\n }\n\n return;\n }\n\n var manager = this.manager,\n events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n eventRegistrar = new EventRegistrar(this);\n events.set(eventAlias, eventRegistrar);\n eventRegistrar.recognizerName = EVENT_RECOGNIZER_MAP[eventAlias] || eventAlias;\n\n if (manager) {\n manager.on(eventAlias, eventRegistrar.handleEvent);\n }\n }\n\n eventRegistrar.add(event, handler, opts, once, passive);\n\n if (!eventRegistrar.isEmpty()) {\n this._toggleRecognizer(eventRegistrar.recognizerName, true);\n }\n }\n }, {\n key: \"_removeEventHandler\",\n value: function _removeEventHandler(event, handler) {\n if (typeof event !== 'string') {\n for (var eventName in event) {\n this._removeEventHandler(eventName, event[eventName]);\n }\n\n return;\n }\n\n var events = this.events;\n var eventAlias = GESTURE_EVENT_ALIASES[event] || event;\n var eventRegistrar = events.get(eventAlias);\n\n if (!eventRegistrar) {\n return;\n }\n\n eventRegistrar.remove(event, handler);\n\n if (eventRegistrar.isEmpty()) {\n var recognizerName = eventRegistrar.recognizerName;\n var isRecognizerUsed = false;\n\n var _iterator2 = event_manager_createForOfIteratorHelper(events.values()),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eh = _step2.value;\n\n if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n isRecognizerUsed = true;\n break;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n if (!isRecognizerUsed) {\n this._toggleRecognizer(recognizerName, false);\n }\n }\n }\n }, {\n key: \"_onBasicInput\",\n value: function _onBasicInput(event) {\n var srcEvent = event.srcEvent;\n var alias = BASIC_EVENT_ALIASES[srcEvent.type];\n\n if (alias) {\n this.manager.emit(alias, event);\n }\n }\n }, {\n key: \"_onOtherEvent\",\n value: function _onOtherEvent(event) {\n this.manager.emit(event.type, event);\n }\n }]);\n\n return EventManager;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/mjolnir.js/dist/esm/index.js\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/map-controller.js\n\n\n\n\nfunction map_controller_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction map_controller_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n map_controller_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n map_controller_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar NO_TRANSITION_PROPS = {\n transitionDuration: 0\n};\nvar LINEAR_TRANSITION_PROPS = {\n transitionDuration: 300,\n transitionEasing: function transitionEasing(t) {\n return t;\n },\n transitionInterpolator: new LinearInterpolator(),\n transitionInterruption: TRANSITION_EVENTS.BREAK\n};\nvar DEFAULT_INERTIA = 300;\n\nvar INERTIA_EASING = function INERTIA_EASING(t) {\n return 1 - (1 - t) * (1 - t);\n};\n\nvar EVENT_TYPES = {\n WHEEL: ['wheel'],\n PAN: ['panstart', 'panmove', 'panend'],\n PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n TRIPLE_PAN: ['tripanstart', 'tripanmove', 'tripanend'],\n DOUBLE_TAP: ['doubletap'],\n KEYBOARD: ['keydown']\n};\n\nvar MapController = function () {\n function MapController() {\n var _this = this;\n\n _classCallCheck(this, MapController);\n\n _defineProperty(this, \"events\", []);\n\n _defineProperty(this, \"scrollZoom\", true);\n\n _defineProperty(this, \"dragPan\", true);\n\n _defineProperty(this, \"dragRotate\", true);\n\n _defineProperty(this, \"doubleClickZoom\", true);\n\n _defineProperty(this, \"touchZoom\", true);\n\n _defineProperty(this, \"touchRotate\", false);\n\n _defineProperty(this, \"keyboard\", true);\n\n _defineProperty(this, \"_interactionState\", {\n isDragging: false\n });\n\n _defineProperty(this, \"_events\", {});\n\n _defineProperty(this, \"_setInteractionState\", function (newState) {\n Object.assign(_this._interactionState, newState);\n\n if (_this.onStateChange) {\n _this.onStateChange(_this._interactionState);\n }\n });\n\n _defineProperty(this, \"_onTransition\", function (newViewport, oldViewport) {\n _this.onViewportChange(newViewport, _this._interactionState, oldViewport);\n });\n\n this.handleEvent = this.handleEvent.bind(this);\n this._transitionManager = new TransitionManager({\n onViewportChange: this._onTransition,\n onStateChange: this._setInteractionState\n });\n }\n\n _createClass(MapController, [{\n key: \"handleEvent\",\n value: function handleEvent(event) {\n this.mapState = this.getMapState();\n var eventStartBlocked = this._eventStartBlocked;\n\n switch (event.type) {\n case 'panstart':\n return eventStartBlocked ? false : this._onPanStart(event);\n\n case 'panmove':\n return this._onPan(event);\n\n case 'panend':\n return this._onPanEnd(event);\n\n case 'pinchstart':\n return eventStartBlocked ? false : this._onPinchStart(event);\n\n case 'pinchmove':\n return this._onPinch(event);\n\n case 'pinchend':\n return this._onPinchEnd(event);\n\n case 'tripanstart':\n return eventStartBlocked ? false : this._onTriplePanStart(event);\n\n case 'tripanmove':\n return this._onTriplePan(event);\n\n case 'tripanend':\n return this._onTriplePanEnd(event);\n\n case 'doubletap':\n return this._onDoubleTap(event);\n\n case 'wheel':\n return this._onWheel(event);\n\n case 'keydown':\n return this._onKeyDown(event);\n\n default:\n return false;\n }\n }\n }, {\n key: \"getCenter\",\n value: function getCenter(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n }\n }, {\n key: \"isFunctionKeyPressed\",\n value: function isFunctionKeyPressed(event) {\n var srcEvent = event.srcEvent;\n return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n }\n }, {\n key: \"blockEvents\",\n value: function blockEvents(timeout) {\n var _this2 = this;\n\n var timer = setTimeout(function () {\n if (_this2._eventStartBlocked === timer) {\n _this2._eventStartBlocked = null;\n }\n }, timeout);\n this._eventStartBlocked = timer;\n }\n }, {\n key: \"updateViewport\",\n value: function updateViewport(newMapState, extraProps, interactionState) {\n var oldViewport = this.mapState instanceof MapState ? this.mapState.getViewportProps() : this.mapState;\n\n var newViewport = map_controller_objectSpread(map_controller_objectSpread({}, newMapState.getViewportProps()), extraProps);\n\n var viewStateChanged = Object.keys(newViewport).some(function (key) {\n return oldViewport[key] !== newViewport[key];\n });\n this._state = newMapState.getState();\n\n this._setInteractionState(interactionState);\n\n if (viewStateChanged) {\n this.onViewportChange(newViewport, this._interactionState, oldViewport);\n }\n }\n }, {\n key: \"getMapState\",\n value: function getMapState(overrides) {\n return new MapState(map_controller_objectSpread(map_controller_objectSpread(map_controller_objectSpread({}, this.mapStateProps), this._state), overrides));\n }\n }, {\n key: \"isDragging\",\n value: function isDragging() {\n return this._interactionState.isDragging;\n }\n }, {\n key: \"setOptions\",\n value: function setOptions(options) {\n var onViewportChange = options.onViewportChange,\n onStateChange = options.onStateChange,\n _options$eventManager = options.eventManager,\n eventManager = _options$eventManager === void 0 ? this.eventManager : _options$eventManager,\n _options$isInteractiv = options.isInteractive,\n isInteractive = _options$isInteractiv === void 0 ? true : _options$isInteractiv,\n _options$scrollZoom = options.scrollZoom,\n scrollZoom = _options$scrollZoom === void 0 ? this.scrollZoom : _options$scrollZoom,\n _options$dragPan = options.dragPan,\n dragPan = _options$dragPan === void 0 ? this.dragPan : _options$dragPan,\n _options$dragRotate = options.dragRotate,\n dragRotate = _options$dragRotate === void 0 ? this.dragRotate : _options$dragRotate,\n _options$doubleClickZ = options.doubleClickZoom,\n doubleClickZoom = _options$doubleClickZ === void 0 ? this.doubleClickZoom : _options$doubleClickZ,\n _options$touchZoom = options.touchZoom,\n touchZoom = _options$touchZoom === void 0 ? this.touchZoom : _options$touchZoom,\n _options$touchRotate = options.touchRotate,\n touchRotate = _options$touchRotate === void 0 ? this.touchRotate : _options$touchRotate,\n _options$keyboard = options.keyboard,\n keyboard = _options$keyboard === void 0 ? this.keyboard : _options$keyboard;\n this.onViewportChange = onViewportChange;\n this.onStateChange = onStateChange;\n var prevOptions = this.mapStateProps || {};\n var dimensionChanged = prevOptions.height !== options.height || prevOptions.width !== options.width;\n this.mapStateProps = options;\n\n if (dimensionChanged) {\n this.mapState = prevOptions;\n this.updateViewport(new MapState(options));\n }\n\n this._transitionManager.processViewportChange(options);\n\n if (this.eventManager !== eventManager) {\n this.eventManager = eventManager;\n this._events = {};\n this.toggleEvents(this.events, true);\n }\n\n this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && Boolean(scrollZoom));\n this.toggleEvents(EVENT_TYPES.PAN, isInteractive && Boolean(dragPan || dragRotate));\n this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && Boolean(touchZoom || touchRotate));\n this.toggleEvents(EVENT_TYPES.TRIPLE_PAN, isInteractive && Boolean(touchRotate));\n this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && Boolean(doubleClickZoom));\n this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && Boolean(keyboard));\n this.scrollZoom = scrollZoom;\n this.dragPan = dragPan;\n this.dragRotate = dragRotate;\n this.doubleClickZoom = doubleClickZoom;\n this.touchZoom = touchZoom;\n this.touchRotate = touchRotate;\n this.keyboard = keyboard;\n }\n }, {\n key: \"toggleEvents\",\n value: function toggleEvents(eventNames, enabled) {\n var _this3 = this;\n\n if (this.eventManager) {\n eventNames.forEach(function (eventName) {\n if (_this3._events[eventName] !== enabled) {\n _this3._events[eventName] = enabled;\n\n if (enabled) {\n _this3.eventManager.on(eventName, _this3.handleEvent);\n } else {\n _this3.eventManager.off(eventName, _this3.handleEvent);\n }\n }\n });\n }\n }\n }, {\n key: \"_onPanStart\",\n value: function _onPanStart(event) {\n var pos = this.getCenter(event);\n this._panRotate = this.isFunctionKeyPressed(event) || event.rightButton;\n var newMapState = this._panRotate ? this.mapState.rotateStart({\n pos: pos\n }) : this.mapState.panStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPan\",\n value: function _onPan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotate(event) : this._onPanMove(event);\n }\n }, {\n key: \"_onPanEnd\",\n value: function _onPanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n return this._panRotate ? this._onPanRotateEnd(event) : this._onPanMoveEnd(event);\n }\n }, {\n key: \"_onPanMove\",\n value: function _onPanMove(event) {\n if (!this.dragPan) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.pan({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isPanning: true\n });\n return true;\n }\n }, {\n key: \"_onPanMoveEnd\",\n value: function _onPanMoveEnd(event) {\n if (this.dragPan) {\n var _this$dragPan$inertia = this.dragPan.inertia,\n inertia = _this$dragPan$inertia === void 0 ? DEFAULT_INERTIA : _this$dragPan$inertia;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.pan({\n pos: endPos\n }).panEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false\n });\n return true;\n }\n }, {\n key: \"_onPanRotate\",\n value: function _onPanRotate(event) {\n if (!this.dragRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onPanRotateEnd\",\n value: function _onPanRotateEnd(event) {\n if (this.dragRotate) {\n var _this$dragRotate$iner = this.dragRotate.inertia,\n inertia = _this$dragRotate$iner === void 0 ? DEFAULT_INERTIA : _this$dragRotate$iner;\n\n if (inertia && event.velocity) {\n var pos = this.getCenter(event);\n var endPos = [pos[0] + event.velocityX * inertia / 2, pos[1] + event.velocityY * inertia / 2];\n var newControllerState = this.mapState.rotate({\n pos: endPos\n }).rotateEnd();\n this.updateViewport(newControllerState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n return true;\n }\n }\n\n var newMapState = this.mapState.panEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onWheel\",\n value: function _onWheel(event) {\n if (!this.scrollZoom) {\n return false;\n }\n\n var _this$scrollZoom = this.scrollZoom,\n _this$scrollZoom$spee = _this$scrollZoom.speed,\n speed = _this$scrollZoom$spee === void 0 ? 0.01 : _this$scrollZoom$spee,\n _this$scrollZoom$smoo = _this$scrollZoom.smooth,\n smooth = _this$scrollZoom$smoo === void 0 ? false : _this$scrollZoom$smoo;\n event.preventDefault();\n var pos = this.getCenter(event);\n var delta = event.delta;\n var scale = 2 / (1 + Math.exp(-Math.abs(delta * speed)));\n\n if (delta < 0 && scale !== 0) {\n scale = 1 / scale;\n }\n\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: scale\n });\n this.updateViewport(newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: smooth ? 250 : 1\n }), {\n isPanning: true,\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onPinchStart\",\n value: function _onPinchStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.zoomStart({\n pos: pos\n }).rotateStart({\n pos: pos\n });\n this._startPinchRotation = event.rotation;\n this._lastPinchEvent = event;\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onPinch\",\n value: function _onPinch(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchZoom && !this.touchRotate) {\n return false;\n }\n\n var newMapState = this.mapState;\n\n if (this.touchZoom) {\n var scale = event.scale;\n var pos = this.getCenter(event);\n newMapState = newMapState.zoom({\n pos: pos,\n scale: scale\n });\n }\n\n if (this.touchRotate) {\n var rotation = event.rotation;\n newMapState = newMapState.rotate({\n deltaAngleX: this._startPinchRotation - rotation\n });\n }\n\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: Boolean(this.touchRotate)\n });\n this._lastPinchEvent = event;\n return true;\n }\n }, {\n key: \"_onPinchEnd\",\n value: function _onPinchEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchZoom) {\n var _this$touchZoom$inert = this.touchZoom.inertia,\n inertia = _this$touchZoom$inert === void 0 ? DEFAULT_INERTIA : _this$touchZoom$inert;\n var _lastPinchEvent = this._lastPinchEvent;\n\n if (inertia && _lastPinchEvent && event.scale !== _lastPinchEvent.scale) {\n var pos = this.getCenter(event);\n\n var _newMapState = this.mapState.rotateEnd();\n\n var z = Math.log2(event.scale);\n\n var velocityZ = (z - Math.log2(_lastPinchEvent.scale)) / (event.deltaTime - _lastPinchEvent.deltaTime);\n\n var endScale = Math.pow(2, z + velocityZ * inertia / 2);\n _newMapState = _newMapState.zoom({\n pos: pos,\n scale: endScale\n }).zoomEnd();\n this.updateViewport(_newMapState, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n }),\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isPanning: Boolean(this.touchZoom),\n isZooming: Boolean(this.touchZoom),\n isRotating: false\n });\n this.blockEvents(inertia);\n return true;\n }\n }\n\n var newMapState = this.mapState.zoomEnd().rotateEnd();\n this._state.startPinchRotation = 0;\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isPanning: false,\n isZooming: false,\n isRotating: false\n });\n this._startPinchRotation = null;\n this._lastPinchEvent = null;\n return true;\n }\n }, {\n key: \"_onTriplePanStart\",\n value: function _onTriplePanStart(event) {\n var pos = this.getCenter(event);\n var newMapState = this.mapState.rotateStart({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isDragging: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePan\",\n value: function _onTriplePan(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (!this.touchRotate) {\n return false;\n }\n\n var pos = this.getCenter(event);\n pos[0] -= event.deltaX;\n var newMapState = this.mapState.rotate({\n pos: pos\n });\n this.updateViewport(newMapState, NO_TRANSITION_PROPS, {\n isRotating: true\n });\n return true;\n }\n }, {\n key: \"_onTriplePanEnd\",\n value: function _onTriplePanEnd(event) {\n if (!this.isDragging()) {\n return false;\n }\n\n if (this.touchRotate) {\n var _this$touchRotate$ine = this.touchRotate.inertia,\n inertia = _this$touchRotate$ine === void 0 ? DEFAULT_INERTIA : _this$touchRotate$ine;\n\n if (inertia && event.velocityY) {\n var pos = this.getCenter(event);\n var endPos = [pos[0], pos[1] += event.velocityY * inertia / 2];\n\n var _newMapState2 = this.mapState.rotate({\n pos: endPos\n });\n\n this.updateViewport(_newMapState2, map_controller_objectSpread(map_controller_objectSpread({}, LINEAR_TRANSITION_PROPS), {}, {\n transitionDuration: inertia,\n transitionEasing: INERTIA_EASING\n }), {\n isDragging: false,\n isRotating: true\n });\n this.blockEvents(inertia);\n return false;\n }\n }\n\n var newMapState = this.mapState.rotateEnd();\n this.updateViewport(newMapState, null, {\n isDragging: false,\n isRotating: false\n });\n return true;\n }\n }, {\n key: \"_onDoubleTap\",\n value: function _onDoubleTap(event) {\n if (!this.doubleClickZoom) {\n return false;\n }\n\n var pos = this.getCenter(event);\n var isZoomOut = this.isFunctionKeyPressed(event);\n var newMapState = this.mapState.zoom({\n pos: pos,\n scale: isZoomOut ? 0.5 : 2\n });\n this.updateViewport(newMapState, Object.assign({}, LINEAR_TRANSITION_PROPS, {\n transitionInterpolator: new LinearInterpolator({\n around: pos\n })\n }), {\n isZooming: true\n });\n return true;\n }\n }, {\n key: \"_onKeyDown\",\n value: function _onKeyDown(event) {\n if (!this.keyboard) {\n return false;\n }\n\n var funcKey = this.isFunctionKeyPressed(event);\n var _this$keyboard = this.keyboard,\n _this$keyboard$zoomSp = _this$keyboard.zoomSpeed,\n zoomSpeed = _this$keyboard$zoomSp === void 0 ? 2 : _this$keyboard$zoomSp,\n _this$keyboard$moveSp = _this$keyboard.moveSpeed,\n moveSpeed = _this$keyboard$moveSp === void 0 ? 100 : _this$keyboard$moveSp,\n _this$keyboard$rotate = _this$keyboard.rotateSpeedX,\n rotateSpeedX = _this$keyboard$rotate === void 0 ? 15 : _this$keyboard$rotate,\n _this$keyboard$rotate2 = _this$keyboard.rotateSpeedY,\n rotateSpeedY = _this$keyboard$rotate2 === void 0 ? 10 : _this$keyboard$rotate2;\n var mapStateProps = this.mapStateProps;\n var newMapState;\n\n switch (event.srcEvent.keyCode) {\n case 189:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed) - 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom - Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 187:\n if (funcKey) {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed) + 1\n });\n } else {\n newMapState = this.getMapState({\n zoom: mapStateProps.zoom + Math.log2(zoomSpeed)\n });\n }\n\n break;\n\n case 37:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing - rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 39:\n if (funcKey) {\n newMapState = this.getMapState({\n bearing: mapStateProps.bearing + rotateSpeedX\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [-moveSpeed, 0],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 38:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch + rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n case 40:\n if (funcKey) {\n newMapState = this.getMapState({\n pitch: mapStateProps.pitch - rotateSpeedY\n });\n } else {\n newMapState = this.mapState.pan({\n pos: [0, -moveSpeed],\n startPos: [0, 0]\n });\n }\n\n break;\n\n default:\n return false;\n }\n\n return this.updateViewport(newMapState, LINEAR_TRANSITION_PROPS);\n }\n }]);\n\n return MapController;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/interactive-map.js\n\n\n\n\nfunction interactive_map_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction interactive_map_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n interactive_map_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n interactive_map_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\n\n\nvar interactive_map_propTypes = Object.assign({}, static_map.propTypes, {\n maxZoom: prop_types.number,\n minZoom: prop_types.number,\n maxPitch: prop_types.number,\n minPitch: prop_types.number,\n onViewStateChange: prop_types.func,\n onViewportChange: prop_types.func,\n onInteractionStateChange: prop_types.func,\n transitionDuration: prop_types.oneOfType([prop_types.number, prop_types.string]),\n transitionInterpolator: prop_types.object,\n transitionInterruption: prop_types.number,\n transitionEasing: prop_types.func,\n onTransitionStart: prop_types.func,\n onTransitionInterrupt: prop_types.func,\n onTransitionEnd: prop_types.func,\n scrollZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragPan: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n dragRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n doubleClickZoom: prop_types.bool,\n touchZoom: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n touchRotate: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n keyboard: prop_types.oneOfType([prop_types.bool, prop_types.object]),\n onHover: prop_types.func,\n onClick: prop_types.func,\n onDblClick: prop_types.func,\n onContextMenu: prop_types.func,\n onMouseDown: prop_types.func,\n onMouseMove: prop_types.func,\n onMouseUp: prop_types.func,\n onTouchStart: prop_types.func,\n onTouchMove: prop_types.func,\n onTouchEnd: prop_types.func,\n onMouseEnter: prop_types.func,\n onMouseLeave: prop_types.func,\n onMouseOut: prop_types.func,\n onWheel: prop_types.func,\n touchAction: prop_types.string,\n eventRecognizerOptions: prop_types.object,\n clickRadius: prop_types.number,\n interactiveLayerIds: prop_types.array,\n getCursor: prop_types.func,\n controller: prop_types.instanceOf(MapController)\n});\n\nvar getDefaultCursor = function getDefaultCursor(_ref) {\n var isDragging = _ref.isDragging,\n isHovering = _ref.isHovering;\n return isDragging ? 'grabbing' : isHovering ? 'pointer' : 'grab';\n};\n\nvar interactive_map_defaultProps = Object.assign({}, static_map.defaultProps, MAPBOX_LIMITS, TransitionManager.defaultProps, {\n onViewStateChange: null,\n onViewportChange: null,\n onClick: null,\n onNativeClick: null,\n onHover: null,\n onContextMenu: function onContextMenu(event) {\n return event.preventDefault();\n },\n scrollZoom: true,\n dragPan: true,\n dragRotate: true,\n doubleClickZoom: true,\n touchZoom: true,\n touchRotate: false,\n keyboard: true,\n touchAction: 'none',\n eventRecognizerOptions: {},\n clickRadius: 0,\n getCursor: getDefaultCursor\n});\n\nfunction normalizeEvent(event) {\n if (event.lngLat || !event.offsetCenter) {\n return event;\n }\n\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return event;\n }\n\n var pos = [x, y];\n event.point = pos;\n var viewport = this.viewport;\n var location = viewport.unproject(pos, {\n targetZ: viewport.meterOffset[2]\n });\n event.lngLat = [location[0], location[1]];\n return event;\n}\n\nfunction getFeatures(pos) {\n var map = this.map;\n\n if (!map || !pos) {\n return null;\n }\n\n var queryParams = {};\n var size = this.props.clickRadius;\n\n if (this.props.interactiveLayerIds) {\n queryParams.layers = this.props.interactiveLayerIds;\n }\n\n try {\n return map.queryRenderedFeatures(size ? [[pos[0] - size, pos[1] + size], [pos[0] + size, pos[1] - size]] : pos, queryParams);\n } catch (_unused) {\n return null;\n }\n}\n\nfunction onEvent(callbackName, event) {\n var func = this.props[callbackName];\n\n if (func) {\n func(normalizeEvent.call(this, event));\n }\n}\n\nfunction onPointerDown(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchStart' : 'onMouseDown', event);\n}\n\nfunction onPointerUp(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchEnd' : 'onMouseUp', event);\n}\n\nfunction onPointerMove(event) {\n onEvent.call(this, event.pointerType === 'touch' ? 'onTouchMove' : 'onMouseMove', event);\n\n if (!this.state.isDragging) {\n var _this$props = this.props,\n onHover = _this$props.onHover,\n interactiveLayerIds = _this$props.interactiveLayerIds;\n var features;\n event = normalizeEvent.call(this, event);\n\n if (interactiveLayerIds || onHover) {\n features = getFeatures.call(this, event.point);\n }\n\n var isHovering = Boolean(interactiveLayerIds && features && features.length > 0);\n var isEntering = isHovering && !this.state.isHovering;\n var isExiting = !isHovering && this.state.isHovering;\n\n if (onHover || isEntering) {\n event.features = features;\n\n if (onHover) {\n onHover(event);\n }\n }\n\n if (isEntering) {\n onEvent.call(this, 'onMouseEnter', event);\n }\n\n if (isExiting) {\n onEvent.call(this, 'onMouseLeave', event);\n }\n\n if (isEntering || isExiting) {\n this.setState({\n isHovering: isHovering\n });\n }\n }\n}\n\nfunction onPointerClick(event) {\n var _this$props2 = this.props,\n onClick = _this$props2.onClick,\n onNativeClick = _this$props2.onNativeClick,\n onDblClick = _this$props2.onDblClick,\n doubleClickZoom = _this$props2.doubleClickZoom;\n var callbacks = [];\n var isDoubleClickEnabled = onDblClick || doubleClickZoom;\n\n switch (event.type) {\n case 'anyclick':\n callbacks.push(onNativeClick);\n\n if (!isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n case 'click':\n if (isDoubleClickEnabled) {\n callbacks.push(onClick);\n }\n\n break;\n\n default:\n }\n\n callbacks = callbacks.filter(Boolean);\n\n if (callbacks.length) {\n event = normalizeEvent.call(this, event);\n event.features = getFeatures.call(this, event.point);\n callbacks.forEach(function (cb) {\n return cb(event);\n });\n }\n}\n\nfunction interactive_map_getRefHandles(staticMapRef) {\n return {\n getMap: staticMapRef.current && staticMapRef.current.getMap,\n queryRenderedFeatures: staticMapRef.current && staticMapRef.current.queryRenderedFeatures\n };\n}\n\nvar InteractiveMap = (0,react.forwardRef)(function (props, ref) {\n var parentContext = (0,react.useContext)(map_context);\n var controller = (0,react.useMemo)(function () {\n return props.controller || new MapController();\n }, []);\n var eventManager = (0,react.useMemo)(function () {\n return new EventManager(null, {\n touchAction: props.touchAction,\n recognizerOptions: props.eventRecognizerOptions\n });\n }, []);\n var eventCanvasRef = (0,react.useRef)(null);\n var staticMapRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n width: 0,\n height: 0,\n state: {\n isHovering: false,\n isDragging: false\n }\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.map = staticMapRef.current && staticMapRef.current.getMap();\n\n thisRef.setState = function (newState) {\n thisRef.state = interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.state), newState);\n eventCanvasRef.current.style.cursor = props.getCursor(thisRef.state);\n };\n\n var inRender = true;\n var viewportUpdateRequested;\n var stateUpdateRequested;\n\n var handleViewportChange = function handleViewportChange(viewState, interactionState, oldViewState) {\n if (inRender) {\n viewportUpdateRequested = [viewState, interactionState, oldViewState];\n return;\n }\n\n var _thisRef$props = thisRef.props,\n onViewStateChange = _thisRef$props.onViewStateChange,\n onViewportChange = _thisRef$props.onViewportChange;\n Object.defineProperty(viewState, 'position', {\n get: function get() {\n return [0, 0, getTerrainElevation(thisRef.map, viewState)];\n }\n });\n\n if (onViewStateChange) {\n onViewStateChange({\n viewState: viewState,\n interactionState: interactionState,\n oldViewState: oldViewState\n });\n }\n\n if (onViewportChange) {\n onViewportChange(viewState, interactionState, oldViewState);\n }\n };\n\n (0,react.useImperativeHandle)(ref, function () {\n return interactive_map_getRefHandles(staticMapRef);\n }, []);\n var context = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({}, parentContext), {}, {\n eventManager: eventManager,\n container: parentContext.container || eventCanvasRef.current\n });\n }, [parentContext, eventCanvasRef.current]);\n context.onViewportChange = handleViewportChange;\n context.viewport = parentContext.viewport || getViewport(thisRef);\n thisRef.viewport = context.viewport;\n\n var handleInteractionStateChange = function handleInteractionStateChange(interactionState) {\n var _interactionState$isD = interactionState.isDragging,\n isDragging = _interactionState$isD === void 0 ? false : _interactionState$isD;\n\n if (isDragging !== thisRef.state.isDragging) {\n thisRef.setState({\n isDragging: isDragging\n });\n }\n\n if (inRender) {\n stateUpdateRequested = interactionState;\n return;\n }\n\n var onInteractionStateChange = thisRef.props.onInteractionStateChange;\n\n if (onInteractionStateChange) {\n onInteractionStateChange(interactionState);\n }\n };\n\n var updateControllerOpts = function updateControllerOpts() {\n if (thisRef.width && thisRef.height) {\n controller.setOptions(interactive_map_objectSpread(interactive_map_objectSpread(interactive_map_objectSpread({}, thisRef.props), thisRef.props.viewState), {}, {\n isInteractive: Boolean(thisRef.props.onViewStateChange || thisRef.props.onViewportChange),\n onViewportChange: handleViewportChange,\n onStateChange: handleInteractionStateChange,\n eventManager: eventManager,\n width: thisRef.width,\n height: thisRef.height\n }));\n }\n };\n\n var onResize = function onResize(_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n thisRef.width = width;\n thisRef.height = height;\n updateControllerOpts();\n thisRef.props.onResize({\n width: width,\n height: height\n });\n };\n\n (0,react.useEffect)(function () {\n eventManager.setElement(eventCanvasRef.current);\n eventManager.on({\n pointerdown: onPointerDown.bind(thisRef),\n pointermove: onPointerMove.bind(thisRef),\n pointerup: onPointerUp.bind(thisRef),\n pointerleave: onEvent.bind(thisRef, 'onMouseOut'),\n click: onPointerClick.bind(thisRef),\n anyclick: onPointerClick.bind(thisRef),\n dblclick: onEvent.bind(thisRef, 'onDblClick'),\n wheel: onEvent.bind(thisRef, 'onWheel'),\n contextmenu: onEvent.bind(thisRef, 'onContextMenu')\n });\n return function () {\n eventManager.destroy();\n };\n }, []);\n use_isomorphic_layout_effect(function () {\n if (viewportUpdateRequested) {\n handleViewportChange.apply(void 0, (0,toConsumableArray/* default */.Z)(viewportUpdateRequested));\n }\n\n if (stateUpdateRequested) {\n handleInteractionStateChange(stateUpdateRequested);\n }\n });\n updateControllerOpts();\n var width = props.width,\n height = props.height,\n style = props.style,\n getCursor = props.getCursor;\n var eventCanvasStyle = (0,react.useMemo)(function () {\n return interactive_map_objectSpread(interactive_map_objectSpread({\n position: 'relative'\n }, style), {}, {\n width: width,\n height: height,\n cursor: getCursor(thisRef.state)\n });\n }, [style, width, height, getCursor, thisRef.state]);\n\n if (!viewportUpdateRequested || !thisRef._child) {\n thisRef._child = react.createElement(MapContextProvider, {\n value: context\n }, react.createElement(\"div\", {\n key: \"event-canvas\",\n ref: eventCanvasRef,\n style: eventCanvasStyle\n }, react.createElement(static_map, _extends({}, props, {\n width: \"100%\",\n height: \"100%\",\n style: null,\n onResize: onResize,\n ref: staticMapRef\n }))));\n }\n\n inRender = false;\n return thisRef._child;\n});\nInteractiveMap.supported = static_map.supported;\nInteractiveMap.propTypes = interactive_map_propTypes;\nInteractiveMap.defaultProps = interactive_map_defaultProps;\n/* harmony default export */ var interactive_map = (InteractiveMap);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/deep-equal.js\n\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n } else if (Array.isArray(b)) {\n return false;\n }\n\n if (_typeof(a) === 'object' && _typeof(b) === 'object') {\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (var _i = 0, _aKeys = aKeys; _i < _aKeys.length; _i++) {\n var key = _aKeys[_i];\n\n if (!b.hasOwnProperty(key)) {\n return false;\n }\n\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/source.js\n\n\n\nfunction source_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction source_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n source_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n source_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar sourceCounter = 0;\n\nfunction createSource(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = source_objectSpread({}, props);\n\n delete options.id;\n delete options.children;\n map.addSource(id, options);\n return map.getSource(id);\n }\n\n return null;\n}\n\nfunction updateSource(source, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'source id changed');\n utils_assert_assert(props.type === prevProps.type, 'source type changed');\n var changedKey = '';\n var changedKeyCount = 0;\n\n for (var key in props) {\n if (key !== 'children' && key !== 'id' && !deepEqual(prevProps[key], props[key])) {\n changedKey = key;\n changedKeyCount++;\n }\n }\n\n if (!changedKeyCount) {\n return;\n }\n\n var type = props.type;\n\n if (type === 'geojson') {\n source.setData(props.data);\n } else if (type === 'image') {\n source.updateImage({\n url: props.url,\n coordinates: props.coordinates\n });\n } else if ((type === 'canvas' || type === 'video') && changedKeyCount === 1 && changedKey === 'coordinates') {\n source.setCoordinates(props.coordinates);\n } else if (type === 'vector' && source.setUrl) {\n switch (changedKey) {\n case 'url':\n source.setUrl(props.url);\n break;\n\n case 'tiles':\n source.setTiles(props.tiles);\n break;\n\n default:\n }\n } else {\n console.warn(\"Unable to update prop: \".concat(changedKey));\n }\n}\n\nfunction Source(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-source-\".concat(sourceCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n requestAnimationFrame(function () {\n if (map.style && map.style._loaded && map.getSource(id)) {\n map.removeSource(id);\n }\n });\n };\n }\n\n return undefined;\n }, [map, id]);\n var source = map && map.style && map.getSource(id);\n\n if (source) {\n updateSource(source, props, propsRef.current);\n } else {\n source = createSource(map, id, props);\n }\n\n propsRef.current = props;\n return source && react.Children.map(props.children, function (child) {\n return child && (0,react.cloneElement)(child, {\n source: id\n });\n }) || null;\n}\n\n/* harmony default export */ var source = (Source);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/layer.js\n\n\n\n\nfunction layer_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction layer_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n layer_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n layer_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar LAYER_TYPES = ['fill', 'line', 'symbol', 'circle', 'fill-extrusion', 'raster', 'background', 'heatmap', 'hillshade', 'sky'];\nvar layer_propTypes = {\n type: prop_types.oneOf(LAYER_TYPES).isRequired,\n id: prop_types.string,\n source: prop_types.string,\n beforeId: prop_types.string\n};\n\nfunction diffLayerStyles(map, id, props, prevProps) {\n var _props$layout = props.layout,\n layout = _props$layout === void 0 ? {} : _props$layout,\n _props$paint = props.paint,\n paint = _props$paint === void 0 ? {} : _props$paint,\n filter = props.filter,\n minzoom = props.minzoom,\n maxzoom = props.maxzoom,\n beforeId = props.beforeId,\n otherProps = _objectWithoutProperties(props, [\"layout\", \"paint\", \"filter\", \"minzoom\", \"maxzoom\", \"beforeId\"]);\n\n if (beforeId !== prevProps.beforeId) {\n map.moveLayer(id, beforeId);\n }\n\n if (layout !== prevProps.layout) {\n var prevLayout = prevProps.layout || {};\n\n for (var key in layout) {\n if (!deepEqual(layout[key], prevLayout[key])) {\n map.setLayoutProperty(id, key, layout[key]);\n }\n }\n\n for (var _key in prevLayout) {\n if (!layout.hasOwnProperty(_key)) {\n map.setLayoutProperty(id, _key, undefined);\n }\n }\n }\n\n if (paint !== prevProps.paint) {\n var prevPaint = prevProps.paint || {};\n\n for (var _key2 in paint) {\n if (!deepEqual(paint[_key2], prevPaint[_key2])) {\n map.setPaintProperty(id, _key2, paint[_key2]);\n }\n }\n\n for (var _key3 in prevPaint) {\n if (!paint.hasOwnProperty(_key3)) {\n map.setPaintProperty(id, _key3, undefined);\n }\n }\n }\n\n if (!deepEqual(filter, prevProps.filter)) {\n map.setFilter(id, filter);\n }\n\n if (minzoom !== prevProps.minzoom || maxzoom !== prevProps.maxzoom) {\n map.setLayerZoomRange(id, minzoom, maxzoom);\n }\n\n for (var _key4 in otherProps) {\n if (!deepEqual(otherProps[_key4], prevProps[_key4])) {\n map.setLayerProperty(id, _key4, otherProps[_key4]);\n }\n }\n}\n\nfunction createLayer(map, id, props) {\n if (map.style && map.style._loaded) {\n var options = layer_objectSpread(layer_objectSpread({}, props), {}, {\n id: id\n });\n\n delete options.beforeId;\n map.addLayer(options, props.beforeId);\n }\n}\n\nfunction updateLayer(map, id, props, prevProps) {\n utils_assert_assert(props.id === prevProps.id, 'layer id changed');\n utils_assert_assert(props.type === prevProps.type, 'layer type changed');\n\n try {\n diffLayerStyles(map, id, props, prevProps);\n } catch (error) {\n console.warn(error);\n }\n}\n\nvar layerCounter = 0;\n\nfunction Layer(props) {\n var context = (0,react.useContext)(map_context);\n var propsRef = (0,react.useRef)({\n id: props.id,\n type: props.type\n });\n\n var _useState = (0,react.useState)(0),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setStyleLoaded = _useState2[1];\n\n var id = (0,react.useMemo)(function () {\n return props.id || \"jsx-layer-\".concat(layerCounter++);\n }, []);\n var map = context.map;\n (0,react.useEffect)(function () {\n if (map) {\n var forceUpdate = function forceUpdate() {\n return setStyleLoaded(function (version) {\n return version + 1;\n });\n };\n\n map.on('styledata', forceUpdate);\n return function () {\n map.off('styledata', forceUpdate);\n\n if (map.style && map.style._loaded) {\n map.removeLayer(id);\n }\n };\n }\n\n return undefined;\n }, [map]);\n var layer = map && map.style && map.getLayer(id);\n\n if (layer) {\n updateLayer(map, id, props, propsRef.current);\n } else {\n createLayer(map, id, props);\n }\n\n propsRef.current = props;\n return null;\n}\n\nLayer.propTypes = layer_propTypes;\n/* harmony default export */ var components_layer = (Layer);\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/use-map-control.js\n\n\n\nvar mapControlDefaultProps = {\n captureScroll: false,\n captureDrag: true,\n captureClick: true,\n captureDoubleClick: true,\n capturePointerMove: false\n};\nvar mapControlPropTypes = {\n captureScroll: prop_types.bool,\n captureDrag: prop_types.bool,\n captureClick: prop_types.bool,\n captureDoubleClick: prop_types.bool,\n capturePointerMove: prop_types.bool\n};\n\nfunction onMount(thisRef) {\n var ref = thisRef.containerRef.current;\n var eventManager = thisRef.context.eventManager;\n\n if (!ref || !eventManager) {\n return undefined;\n }\n\n var events = {\n wheel: function wheel(evt) {\n var props = thisRef.props;\n\n if (props.captureScroll) {\n evt.stopPropagation();\n }\n\n if (props.onScroll) {\n props.onScroll(evt, thisRef);\n }\n },\n panstart: function panstart(evt) {\n var props = thisRef.props;\n\n if (props.captureDrag) {\n evt.stopPropagation();\n }\n\n if (props.onDragStart) {\n props.onDragStart(evt, thisRef);\n }\n },\n anyclick: function anyclick(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n click: function click(evt) {\n var props = thisRef.props;\n\n if (props.captureClick) {\n evt.stopPropagation();\n }\n\n if (props.onClick) {\n props.onClick(evt, thisRef);\n }\n },\n dblclick: function dblclick(evt) {\n var props = thisRef.props;\n\n if (props.captureDoubleClick) {\n evt.stopPropagation();\n }\n\n if (props.onDoubleClick) {\n props.onDoubleClick(evt, thisRef);\n }\n },\n pointermove: function pointermove(evt) {\n var props = thisRef.props;\n\n if (props.capturePointerMove) {\n evt.stopPropagation();\n }\n\n if (props.onPointerMove) {\n props.onPointerMove(evt, thisRef);\n }\n }\n };\n eventManager.watch(events, ref);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useMapControl() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var context = (0,react.useContext)(map_context);\n var containerRef = (0,react.useRef)(null);\n\n var _thisRef = (0,react.useRef)({\n props: props,\n state: {},\n context: context,\n containerRef: containerRef\n });\n\n var thisRef = _thisRef.current;\n thisRef.props = props;\n thisRef.context = context;\n (0,react.useEffect)(function () {\n return onMount(thisRef);\n }, [context.eventManager]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/base-control.js\n\n\n\n\n\n\n\n\n\nfunction base_control_createSuper(Derived) {\n var hasNativeReflectConstruct = base_control_isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction base_control_isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\n\n\n\n\nfunction Control(props) {\n var instance = props.instance;\n\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n instance._context = context;\n instance._containerRef = containerRef;\n return instance._render();\n}\n\nvar BaseControl = function (_PureComponent) {\n _inherits(BaseControl, _PureComponent);\n\n var _super = base_control_createSuper(BaseControl);\n\n function BaseControl() {\n var _this;\n\n _classCallCheck(this, BaseControl);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"_context\", {});\n\n _defineProperty(_assertThisInitialized(_this), \"_containerRef\", (0,react.createRef)());\n\n _defineProperty(_assertThisInitialized(_this), \"_onScroll\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDragStart\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onDblClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onClick\", function (evt) {});\n\n _defineProperty(_assertThisInitialized(_this), \"_onPointerMove\", function (evt) {});\n\n return _this;\n }\n\n _createClass(BaseControl, [{\n key: \"_render\",\n value: function _render() {\n throw new Error('_render() not implemented');\n }\n }, {\n key: \"render\",\n value: function render() {\n return react.createElement(Control, _extends({\n instance: this\n }, this.props, {\n onScroll: this._onScroll,\n onDragStart: this._onDragStart,\n onDblClick: this._onDblClick,\n onClick: this._onClick,\n onPointerMove: this._onPointerMove\n }));\n }\n }]);\n\n return BaseControl;\n}(react.PureComponent);\n\n_defineProperty(BaseControl, \"propTypes\", mapControlPropTypes);\n\n_defineProperty(BaseControl, \"defaultProps\", mapControlDefaultProps);\n\n\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/draggable-control.js\n\n\n\nfunction draggable_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction draggable_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n draggable_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n draggable_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\nvar draggableControlPropTypes = Object.assign({}, mapControlPropTypes, {\n draggable: prop_types.bool,\n onDrag: prop_types.func,\n onDragEnd: prop_types.func,\n onDragStart: prop_types.func,\n offsetLeft: prop_types.number,\n offsetTop: prop_types.number\n});\nvar draggableControlDefaultProps = Object.assign({}, mapControlDefaultProps, {\n draggable: false,\n offsetLeft: 0,\n offsetTop: 0\n});\n\nfunction getDragEventPosition(event) {\n var _event$offsetCenter = event.offsetCenter,\n x = _event$offsetCenter.x,\n y = _event$offsetCenter.y;\n return [x, y];\n}\n\nfunction getDragEventOffset(event, container) {\n var _event$center = event.center,\n x = _event$center.x,\n y = _event$center.y;\n\n if (container) {\n var rect = container.getBoundingClientRect();\n return [rect.left - x, rect.top - y];\n }\n\n return null;\n}\n\nfunction getDragLngLat(dragPos, dragOffset, props, context) {\n var x = dragPos[0] + dragOffset[0] - props.offsetLeft;\n var y = dragPos[1] + dragOffset[1] - props.offsetTop;\n return context.viewport.unproject([x, y]);\n}\n\nfunction onDragStart(event, _ref) {\n var props = _ref.props,\n callbacks = _ref.callbacks,\n state = _ref.state,\n context = _ref.context,\n containerRef = _ref.containerRef;\n var draggable = props.draggable;\n\n if (!draggable) {\n return;\n }\n\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n var dragOffset = getDragEventOffset(event, containerRef.current);\n state.setDragPos(dragPos);\n state.setDragOffset(dragOffset);\n\n if (callbacks.onDragStart && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragStart(callbackEvent);\n }\n}\n\nfunction onDrag(event, _ref2) {\n var props = _ref2.props,\n callbacks = _ref2.callbacks,\n state = _ref2.state,\n context = _ref2.context;\n event.stopPropagation();\n var dragPos = getDragEventPosition(event);\n state.setDragPos(dragPos);\n var dragOffset = state.dragOffset;\n\n if (callbacks.onDrag && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDrag(callbackEvent);\n }\n}\n\nfunction onDragEnd(event, _ref3) {\n var props = _ref3.props,\n callbacks = _ref3.callbacks,\n state = _ref3.state,\n context = _ref3.context;\n event.stopPropagation();\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n state.setDragPos(null);\n state.setDragOffset(null);\n\n if (callbacks.onDragEnd && dragPos && dragOffset) {\n var callbackEvent = Object.assign({}, event);\n callbackEvent.lngLat = getDragLngLat(dragPos, dragOffset, props, context);\n callbacks.onDragEnd(callbackEvent);\n }\n}\n\nfunction onDragCancel(event, _ref4) {\n var state = _ref4.state;\n event.stopPropagation();\n state.setDragPos(null);\n state.setDragOffset(null);\n}\n\nfunction registerEvents(thisRef) {\n var eventManager = thisRef.context.eventManager;\n\n if (!eventManager || !thisRef.state.dragPos) {\n return undefined;\n }\n\n var events = {\n panmove: function panmove(evt) {\n return onDrag(evt, thisRef);\n },\n panend: function panend(evt) {\n return onDragEnd(evt, thisRef);\n },\n pancancel: function pancancel(evt) {\n return onDragCancel(evt, thisRef);\n }\n };\n eventManager.watch(events);\n return function () {\n eventManager.off(events);\n };\n}\n\nfunction useDraggableControl(props) {\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n dragPos = _useState2[0],\n setDragPos = _useState2[1];\n\n var _useState3 = (0,react.useState)(null),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n dragOffset = _useState4[0],\n setDragOffset = _useState4[1];\n\n var thisRef = useMapControl(draggable_control_objectSpread(draggable_control_objectSpread({}, props), {}, {\n onDragStart: onDragStart\n }));\n thisRef.callbacks = props;\n thisRef.state.dragPos = dragPos;\n thisRef.state.setDragPos = setDragPos;\n thisRef.state.dragOffset = dragOffset;\n thisRef.state.setDragOffset = setDragOffset;\n (0,react.useEffect)(function () {\n return registerEvents(thisRef);\n }, [thisRef.context.eventManager, Boolean(dragPos)]);\n return thisRef;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/crisp-pixel.js\nvar pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar crispPixel = function crispPixel(size) {\n return Math.round(size * pixelRatio) / pixelRatio;\n};\nvar crispPercentage = function crispPercentage(el, percentage) {\n var dimension = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'x';\n\n if (el === null) {\n return percentage;\n }\n\n var origSize = dimension === 'x' ? el.offsetWidth : el.offsetHeight;\n return crispPixel(percentage / 100 * origSize) / origSize * 100;\n};\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/marker.js\n\n\n\n\n\n\nvar marker_defaultProps = Object.assign({}, draggableControlDefaultProps, {\n className: ''\n});\n\nfunction getPosition(_ref) {\n var props = _ref.props,\n state = _ref.state,\n context = _ref.context;\n var longitude = props.longitude,\n latitude = props.latitude,\n offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop;\n var dragPos = state.dragPos,\n dragOffset = state.dragOffset;\n var viewport = context.viewport,\n map = context.map;\n\n if (dragPos && dragOffset) {\n return [dragPos[0] + dragOffset[0], dragPos[1] + dragOffset[1]];\n }\n\n var altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n\n var _viewport$project = viewport.project([longitude, latitude, altitude]),\n _viewport$project2 = slicedToArray_slicedToArray(_viewport$project, 2),\n x = _viewport$project2[0],\n y = _viewport$project2[1];\n\n x += offsetLeft;\n y += offsetTop;\n return [x, y];\n}\n\nfunction Marker(props) {\n var thisRef = useDraggableControl(props);\n var state = thisRef.state,\n containerRef = thisRef.containerRef;\n var children = props.children,\n className = props.className,\n draggable = props.draggable;\n var dragPos = state.dragPos;\n\n var _getPosition = getPosition(thisRef),\n _getPosition2 = slicedToArray_slicedToArray(_getPosition, 2),\n x = _getPosition2[0],\n y = _getPosition2[1];\n\n var transform = \"translate(\".concat(crispPixel(x), \"px, \").concat(crispPixel(y), \"px)\");\n var cursor = draggable ? dragPos ? 'grabbing' : 'grab' : 'auto';\n var control = (0,react.useMemo)(function () {\n var containerStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n transform: transform,\n cursor: cursor\n };\n return react.createElement(\"div\", {\n className: \"mapboxgl-marker \".concat(className),\n ref: thisRef.containerRef,\n style: containerStyle\n }, children);\n }, [children, className]);\n var container = containerRef.current;\n\n if (container) {\n container.style.transform = transform;\n container.style.cursor = cursor;\n }\n\n return control;\n}\n\nMarker.defaultProps = marker_defaultProps;\n/* harmony default export */ var marker = (react.memo(Marker));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/dynamic-position.js\nvar ANCHOR_POSITION = {\n top: {\n x: 0.5,\n y: 0\n },\n 'top-left': {\n x: 0,\n y: 0\n },\n 'top-right': {\n x: 1,\n y: 0\n },\n bottom: {\n x: 0.5,\n y: 1\n },\n 'bottom-left': {\n x: 0,\n y: 1\n },\n 'bottom-right': {\n x: 1,\n y: 1\n },\n left: {\n x: 0,\n y: 0.5\n },\n right: {\n x: 1,\n y: 0.5\n }\n};\nvar ANCHOR_TYPES = Object.keys(ANCHOR_POSITION);\nfunction getDynamicPosition(_ref) {\n var x = _ref.x,\n y = _ref.y,\n width = _ref.width,\n height = _ref.height,\n selfWidth = _ref.selfWidth,\n selfHeight = _ref.selfHeight,\n anchor = _ref.anchor,\n _ref$padding = _ref.padding,\n padding = _ref$padding === void 0 ? 0 : _ref$padding;\n var _ANCHOR_POSITION$anch = ANCHOR_POSITION[anchor],\n anchorX = _ANCHOR_POSITION$anch.x,\n anchorY = _ANCHOR_POSITION$anch.y;\n var top = y - anchorY * selfHeight;\n var bottom = top + selfHeight;\n var cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY > 0) {\n var bestAnchorY = anchorY;\n var minCutoff = cutoffY;\n\n for (anchorY = 0; anchorY <= 1; anchorY += 0.5) {\n top = y - anchorY * selfHeight;\n bottom = top + selfHeight;\n cutoffY = Math.max(0, padding - top) + Math.max(0, bottom - height + padding);\n\n if (cutoffY < minCutoff) {\n minCutoff = cutoffY;\n bestAnchorY = anchorY;\n }\n }\n\n anchorY = bestAnchorY;\n }\n\n var xStep = 0.5;\n\n if (anchorY === 0.5) {\n anchorX = Math.floor(anchorX);\n xStep = 1;\n }\n\n var left = x - anchorX * selfWidth;\n var right = left + selfWidth;\n var cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX > 0) {\n var bestAnchorX = anchorX;\n var _minCutoff = cutoffX;\n\n for (anchorX = 0; anchorX <= 1; anchorX += xStep) {\n left = x - anchorX * selfWidth;\n right = left + selfWidth;\n cutoffX = Math.max(0, padding - left) + Math.max(0, right - width + padding);\n\n if (cutoffX < _minCutoff) {\n _minCutoff = cutoffX;\n bestAnchorX = anchorX;\n }\n }\n\n anchorX = bestAnchorX;\n }\n\n return ANCHOR_TYPES.find(function (positionType) {\n var anchorPosition = ANCHOR_POSITION[positionType];\n return anchorPosition.x === anchorX && anchorPosition.y === anchorY;\n }) || anchor;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/popup.js\n\n\n\nfunction popup_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction popup_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n popup_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n popup_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\nvar popup_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n offsetLeft: 0,\n offsetTop: 0,\n tipSize: 10,\n anchor: 'bottom',\n dynamicPosition: true,\n sortByDepth: false,\n closeButton: true,\n closeOnClick: true,\n onClose: function onClose() {}\n});\n\nfunction popup_getPosition(props, viewport, el, _ref) {\n var _ref2 = slicedToArray_slicedToArray(_ref, 2),\n x = _ref2[0],\n y = _ref2[1];\n\n var anchor = props.anchor,\n dynamicPosition = props.dynamicPosition,\n tipSize = props.tipSize;\n\n if (el) {\n return dynamicPosition ? getDynamicPosition({\n x: x,\n y: y,\n anchor: anchor,\n padding: tipSize,\n width: viewport.width,\n height: viewport.height,\n selfWidth: el.clientWidth,\n selfHeight: el.clientHeight\n }) : anchor;\n }\n\n return anchor;\n}\n\nfunction getContainerStyle(props, viewport, el, _ref3, positionType) {\n var _ref4 = slicedToArray_slicedToArray(_ref3, 3),\n x = _ref4[0],\n y = _ref4[1],\n z = _ref4[2];\n\n var offsetLeft = props.offsetLeft,\n offsetTop = props.offsetTop,\n sortByDepth = props.sortByDepth;\n var anchorPosition = ANCHOR_POSITION[positionType];\n var left = x + offsetLeft;\n var top = y + offsetTop;\n var xPercentage = crispPercentage(el, -anchorPosition.x * 100);\n var yPercentage = crispPercentage(el, -anchorPosition.y * 100, 'y');\n var style = {\n position: 'absolute',\n transform: \"\\n translate(\".concat(xPercentage, \"%, \").concat(yPercentage, \"%)\\n translate(\").concat(crispPixel(left), \"px, \").concat(crispPixel(top), \"px)\\n \"),\n display: undefined,\n zIndex: undefined\n };\n\n if (!sortByDepth) {\n return style;\n }\n\n if (z > 1 || z < -1 || x < 0 || x > viewport.width || y < 0 || y > viewport.height) {\n style.display = 'none';\n } else {\n style.zIndex = Math.floor((1 - z) / 2 * 100000);\n }\n\n return style;\n}\n\nfunction onClick(evt, _ref5) {\n var props = _ref5.props,\n context = _ref5.context;\n\n if (props.closeOnClick || evt.target.className === 'mapboxgl-popup-close-button') {\n props.onClose();\n\n if (context.eventManager) {\n context.eventManager.once('click', function (e) {\n return e.stopPropagation();\n }, evt.target);\n }\n }\n}\n\nfunction Popup(props) {\n var contentRef = (0,react.useRef)(null);\n var thisRef = useMapControl(popup_objectSpread(popup_objectSpread({}, props), {}, {\n onClick: onClick\n }));\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n setLoaded = _useState2[1];\n\n (0,react.useEffect)(function () {\n setLoaded(true);\n }, [contentRef.current]);\n var viewport = context.viewport,\n map = context.map;\n var className = props.className,\n longitude = props.longitude,\n latitude = props.latitude,\n tipSize = props.tipSize,\n closeButton = props.closeButton,\n children = props.children;\n var altitude = props.altitude;\n\n if (altitude === undefined) {\n altitude = getTerrainElevation(map, {\n longitude: longitude,\n latitude: latitude\n });\n }\n\n var position = viewport.project([longitude, latitude, altitude]);\n var positionType = popup_getPosition(props, viewport, contentRef.current, position);\n var containerStyle = getContainerStyle(props, viewport, containerRef.current, position, positionType);\n var onReactClick = (0,react.useCallback)(function (e) {\n return !context.eventManager && onClick(e, thisRef);\n }, [context.eventManager]);\n return react.createElement(\"div\", {\n className: \"mapboxgl-popup mapboxgl-popup-anchor-\".concat(positionType, \" \").concat(className),\n style: containerStyle,\n ref: containerRef\n }, react.createElement(\"div\", {\n key: \"tip\",\n className: \"mapboxgl-popup-tip\",\n style: {\n borderWidth: tipSize\n }\n }), react.createElement(\"div\", {\n key: \"content\",\n ref: contentRef,\n className: \"mapboxgl-popup-content\",\n onClick: onReactClick\n }, closeButton && react.createElement(\"button\", {\n key: \"close-button\",\n className: \"mapboxgl-popup-close-button\",\n type: \"button\"\n }, \"\\xD7\"), children));\n}\n\nPopup.defaultProps = popup_defaultProps;\n/* harmony default export */ var popup = (react.memo(Popup));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/attribution-control.js\n\n\n\nfunction attribution_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction attribution_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n attribution_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n attribution_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar attribution_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n toggleLabel: 'Toggle Attribution'\n});\n\nfunction setupAttributioncontrol(opts, map, container, attributionContainer) {\n var control = new (maplibre_gl_default()).AttributionControl(opts);\n control._map = map;\n control._container = container;\n control._innerContainer = attributionContainer;\n\n control._updateAttributions();\n\n control._updateEditLink();\n\n map.on('styledata', control._updateData);\n map.on('sourcedata', control._updateData);\n return control;\n}\n\nfunction removeAttributionControl(control) {\n control._map.off('styledata', control._updateData);\n\n control._map.off('sourcedata', control._updateData);\n}\n\nfunction AttributionControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var innerContainerRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n showCompact = _useState2[0],\n setShowCompact = _useState2[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n control = setupAttributioncontrol({\n customAttribution: props.customAttribution\n }, context.map, containerRef.current, innerContainerRef.current);\n }\n\n return function () {\n return control && removeAttributionControl(control);\n };\n }, [context.map]);\n var compact = props.compact === undefined ? context.viewport.width <= 640 : props.compact;\n (0,react.useEffect)(function () {\n if (!compact && showCompact) {\n setShowCompact(false);\n }\n }, [compact]);\n var toggleAttribution = (0,react.useCallback)(function () {\n return setShowCompact(function (value) {\n return !value;\n });\n }, []);\n var style = (0,react.useMemo)(function () {\n return attribution_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n \"aria-pressed\": showCompact,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-attrib \".concat(compact ? 'mapboxgl-compact' : '', \" \").concat(showCompact ? 'mapboxgl-compact-show' : '')\n }, react.createElement(\"button\", {\n type: \"button\",\n className: \"mapboxgl-ctrl-attrib-button\",\n title: props.toggleLabel,\n onClick: toggleAttribution\n }), react.createElement(\"div\", {\n ref: innerContainerRef,\n className: \"mapboxgl-ctrl-attrib-inner\",\n role: \"list\"\n })));\n}\n\nAttributionControl.defaultProps = attribution_control_defaultProps;\n/* harmony default export */ var attribution_control = (react.memo(AttributionControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/fullscreen-control.js\n\n\n\nfunction fullscreen_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction fullscreen_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n fullscreen_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n fullscreen_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\nvar fullscreen_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n container: null,\n label: 'Toggle fullscreen'\n});\n\nfunction FullscreenControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(false),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n isFullscreen = _useState2[0],\n setIsFullscreen = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n showButton = _useState4[0],\n setShowButton = _useState4[1];\n\n var _useState5 = (0,react.useState)(null),\n _useState6 = slicedToArray_slicedToArray(_useState5, 2),\n mapboxFullscreenControl = _useState6[0],\n createMapboxFullscreenControl = _useState6[1];\n\n (0,react.useEffect)(function () {\n var control = new (maplibre_gl_default()).FullscreenControl();\n createMapboxFullscreenControl(control);\n setShowButton(control._checkFullscreenSupport());\n\n var onFullscreenChange = function onFullscreenChange() {\n var nextState = !control._fullscreen;\n control._fullscreen = nextState;\n setIsFullscreen(nextState);\n };\n\n document_.addEventListener(control._fullscreenchange, onFullscreenChange);\n return function () {\n document_.removeEventListener(control._fullscreenchange, onFullscreenChange);\n };\n }, []);\n\n var onClickFullscreen = function onClickFullscreen() {\n if (mapboxFullscreenControl) {\n mapboxFullscreenControl._container = props.container || context.container;\n\n mapboxFullscreenControl._onClickFullscreen();\n }\n };\n\n var style = (0,react.useMemo)(function () {\n return fullscreen_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n\n if (!showButton) {\n return null;\n }\n\n var className = props.className,\n label = props.label;\n var type = isFullscreen ? 'shrink' : 'fullscreen';\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: onClickFullscreen\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nFullscreenControl.defaultProps = fullscreen_control_defaultProps;\n/* harmony default export */ var fullscreen_control = (react.memo(FullscreenControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/geolocate-utils.js\nvar supported;\nfunction isGeolocationSupported() {\n if (supported !== undefined) {\n return Promise.resolve(supported);\n }\n\n if (window.navigator.permissions !== undefined) {\n return window.navigator.permissions.query({\n name: 'geolocation'\n }).then(function (p) {\n supported = p.state !== 'denied';\n return supported;\n });\n }\n\n supported = Boolean(window.navigator.geolocation);\n return Promise.resolve(supported);\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/geolocate-control.js\n\n\n\nfunction geolocate_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction geolocate_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n geolocate_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n geolocate_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\n\n\nvar geolocate_control_noop = function noop() {};\n\nvar geolocate_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n label: 'Find My Location',\n disabledLabel: 'Location Not Available',\n auto: false,\n positionOptions: {\n enableHighAccuracy: false,\n timeout: 6000\n },\n fitBoundsOptions: {\n maxZoom: 15\n },\n trackUserLocation: false,\n showUserLocation: true,\n showAccuracyCircle: true,\n onGeolocate: function onGeolocate() {}\n});\n\nfunction geolocate_control_getBounds(position) {\n var center = new (maplibre_gl_default()).LngLat(position.coords.longitude, position.coords.latitude);\n var radius = position.coords.accuracy;\n var bounds = center.toBounds(radius);\n return [[bounds._ne.lng, bounds._ne.lat], [bounds._sw.lng, bounds._sw.lat]];\n}\n\nfunction setupMapboxGeolocateControl(context, props, geolocateButton) {\n var control = new (maplibre_gl_default()).GeolocateControl(props);\n control._container = document_.createElement('div');\n control._map = {\n on: function on() {},\n _getUIString: function _getUIString() {\n return '';\n }\n };\n\n control._setupUI(true);\n\n control._map = context.map;\n control._geolocateButton = geolocateButton;\n var eventManager = context.eventManager;\n\n if (control.options.trackUserLocation && eventManager) {\n eventManager.on('panstart', function () {\n if (control._watchState === 'ACTIVE_LOCK') {\n control._watchState = 'BACKGROUND';\n geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n }\n });\n }\n\n control.on('geolocate', props.onGeolocate);\n return control;\n}\n\nfunction updateCamera(position, _ref) {\n var context = _ref.context,\n props = _ref.props;\n var bounds = geolocate_control_getBounds(position);\n\n var _context$viewport$fit = context.viewport.fitBounds(bounds, props.fitBoundsOptions),\n longitude = _context$viewport$fit.longitude,\n latitude = _context$viewport$fit.latitude,\n zoom = _context$viewport$fit.zoom;\n\n var newViewState = Object.assign({}, context.viewport, {\n longitude: longitude,\n latitude: latitude,\n zoom: zoom\n });\n var mapState = new MapState(newViewState);\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || geolocate_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || geolocate_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction GeolocateControl(props) {\n var thisRef = useMapControl(props);\n var context = thisRef.context,\n containerRef = thisRef.containerRef;\n var geolocateButtonRef = (0,react.useRef)(null);\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxGeolocateControl = _useState2[0],\n createMapboxGeolocateControl = _useState2[1];\n\n var _useState3 = (0,react.useState)(false),\n _useState4 = slicedToArray_slicedToArray(_useState3, 2),\n supportsGeolocation = _useState4[0],\n setSupportsGeolocation = _useState4[1];\n\n (0,react.useEffect)(function () {\n var control;\n\n if (context.map) {\n isGeolocationSupported().then(function (result) {\n setSupportsGeolocation(result);\n\n if (geolocateButtonRef.current) {\n control = setupMapboxGeolocateControl(context, props, geolocateButtonRef.current);\n\n control._updateCamera = function (position) {\n return updateCamera(position, thisRef);\n };\n\n createMapboxGeolocateControl(control);\n }\n });\n }\n\n return function () {\n if (control) {\n control._clearWatch();\n }\n };\n }, [context.map]);\n var triggerGeolocate = (0,react.useCallback)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl.options = thisRef.props;\n mapboxGeolocateControl.trigger();\n }\n }, [mapboxGeolocateControl]);\n (0,react.useEffect)(function () {\n if (props.auto) {\n triggerGeolocate();\n }\n }, [mapboxGeolocateControl, props.auto]);\n (0,react.useEffect)(function () {\n if (mapboxGeolocateControl) {\n mapboxGeolocateControl._onZoom();\n }\n }, [context.viewport.zoom]);\n var className = props.className,\n label = props.label,\n disabledLabel = props.disabledLabel,\n trackUserLocation = props.trackUserLocation;\n var style = (0,react.useMemo)(function () {\n return geolocate_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n key: \"geolocate-control\",\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, react.createElement(\"button\", {\n key: \"geolocate\",\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-geolocate\",\n ref: geolocateButtonRef,\n disabled: !supportsGeolocation,\n \"aria-pressed\": !trackUserLocation,\n type: \"button\",\n title: supportsGeolocation ? label : disabledLabel,\n \"aria-label\": supportsGeolocation ? label : disabledLabel,\n onClick: triggerGeolocate\n }, react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }))));\n}\n\nGeolocateControl.defaultProps = geolocate_control_defaultProps;\n/* harmony default export */ var geolocate_control = (react.memo(GeolocateControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/version.js\nfunction compareVersions(version1, version2) {\n var v1 = (version1 || '').split('.').map(Number);\n var v2 = (version2 || '').split('.').map(Number);\n\n for (var i = 0; i < 3; i++) {\n var part1 = v1[i] || 0;\n var part2 = v2[i] || 0;\n\n if (part1 < part2) {\n return -1;\n }\n\n if (part1 > part2) {\n return 1;\n }\n }\n\n return 0;\n}\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/navigation-control.js\n\n\nfunction navigation_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction navigation_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n navigation_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n navigation_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\n\n\n\nvar navigation_control_noop = function noop() {};\n\nvar navigation_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n showCompass: true,\n showZoom: true,\n zoomInLabel: 'Zoom In',\n zoomOutLabel: 'Zoom Out',\n compassLabel: 'Reset North'\n});\nvar VERSION_LEGACY = 1;\nvar VERSION_1_6 = 2;\n\nfunction getUIVersion(mapboxVersion) {\n return compareVersions(mapboxVersion, '1.6.0') >= 0 ? VERSION_1_6 : VERSION_LEGACY;\n}\n\nfunction updateViewport(context, props, opts) {\n var viewport = context.viewport;\n var mapState = new MapState(Object.assign({}, viewport, opts));\n var viewState = Object.assign({}, mapState.getViewportProps(), LINEAR_TRANSITION_PROPS);\n var onViewportChange = props.onViewportChange || context.onViewportChange || navigation_control_noop;\n var onViewStateChange = props.onViewStateChange || context.onViewStateChange || navigation_control_noop;\n onViewStateChange({\n viewState: viewState\n });\n onViewportChange(viewState);\n}\n\nfunction renderButton(type, label, callback, children) {\n return react.createElement(\"button\", {\n key: type,\n className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-\".concat(type),\n type: \"button\",\n title: label,\n onClick: callback\n }, children || react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\"\n }));\n}\n\nfunction renderCompass(context) {\n var uiVersion = (0,react.useMemo)(function () {\n return context.map ? getUIVersion(context.map.version) : VERSION_1_6;\n }, [context.map]);\n var bearing = context.viewport.bearing;\n var style = {\n transform: \"rotate(\".concat(-bearing, \"deg)\")\n };\n return uiVersion === VERSION_1_6 ? react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-icon\",\n \"aria-hidden\": \"true\",\n style: style\n }) : react.createElement(\"span\", {\n className: \"mapboxgl-ctrl-compass-arrow\",\n style: style\n });\n}\n\nfunction NavigationControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var onZoomIn = function onZoomIn() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom + 1\n });\n };\n\n var onZoomOut = function onZoomOut() {\n updateViewport(context, props, {\n zoom: context.viewport.zoom - 1\n });\n };\n\n var onResetNorth = function onResetNorth() {\n updateViewport(context, props, {\n bearing: 0,\n pitch: 0\n });\n };\n\n var className = props.className,\n showCompass = props.showCompass,\n showZoom = props.showZoom,\n zoomInLabel = props.zoomInLabel,\n zoomOutLabel = props.zoomOutLabel,\n compassLabel = props.compassLabel;\n var style = (0,react.useMemo)(function () {\n return navigation_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: className\n }, react.createElement(\"div\", {\n className: \"mapboxgl-ctrl mapboxgl-ctrl-group\",\n ref: containerRef\n }, showZoom && renderButton('zoom-in', zoomInLabel, onZoomIn), showZoom && renderButton('zoom-out', zoomOutLabel, onZoomOut), showCompass && renderButton('compass', compassLabel, onResetNorth, renderCompass(context))));\n}\n\nNavigationControl.defaultProps = navigation_control_defaultProps;\n/* harmony default export */ var navigation_control = (react.memo(NavigationControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/components/scale-control.js\n\n\n\nfunction scale_control_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction scale_control_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n scale_control_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n scale_control_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\n\n\nvar scale_control_defaultProps = Object.assign({}, mapControlDefaultProps, {\n className: '',\n maxWidth: 100,\n unit: 'metric'\n});\n\nfunction ScaleControl(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n mapboxScaleControl = _useState2[0],\n createMapboxScaleControl = _useState2[1];\n\n (0,react.useEffect)(function () {\n if (context.map) {\n var control = new (maplibre_gl_default()).ScaleControl();\n control._map = context.map;\n control._container = containerRef.current;\n createMapboxScaleControl(control);\n }\n }, [context.map]);\n\n if (mapboxScaleControl) {\n mapboxScaleControl.options = props;\n\n mapboxScaleControl._onMove();\n }\n\n var style = (0,react.useMemo)(function () {\n return scale_control_objectSpread({\n position: 'absolute'\n }, props.style);\n }, [props.style]);\n return react.createElement(\"div\", {\n style: style,\n className: props.className\n }, react.createElement(\"div\", {\n ref: containerRef,\n className: \"mapboxgl-ctrl mapboxgl-ctrl-scale\"\n }));\n}\n\nScaleControl.defaultProps = scale_control_defaultProps;\n/* harmony default export */ var scale_control = (react.memo(ScaleControl));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/canvas-overlay.js\n\n\n\n\nvar canvas_overlay_pixelRatio = typeof window !== 'undefined' && window.devicePixelRatio || 1;\nvar canvas_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction CanvasOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var _useState = (0,react.useState)(null),\n _useState2 = slicedToArray_slicedToArray(_useState, 2),\n ctx = _useState2[0],\n setDrawingContext = _useState2[1];\n\n (0,react.useEffect)(function () {\n setDrawingContext(containerRef.current.getContext('2d'));\n }, []);\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n if (ctx) {\n ctx.save();\n ctx.scale(canvas_overlay_pixelRatio, canvas_overlay_pixelRatio);\n props.redraw({\n width: viewport.width,\n height: viewport.height,\n ctx: ctx,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n });\n ctx.restore();\n }\n\n return react.createElement(\"canvas\", {\n ref: containerRef,\n width: viewport.width * canvas_overlay_pixelRatio,\n height: viewport.height * canvas_overlay_pixelRatio,\n style: {\n width: \"\".concat(viewport.width, \"px\"),\n height: \"\".concat(viewport.height, \"px\"),\n position: 'absolute',\n left: 0,\n top: 0\n }\n });\n}\n\nCanvasOverlay.defaultProps = canvas_overlay_defaultProps;\n/* harmony default export */ var canvas_overlay = ((/* unused pure expression or super */ null && (CanvasOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/html-overlay.js\n\n\nfunction html_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction html_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n html_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n html_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar html_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction HTMLOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = html_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height\n }, props.style);\n\n return react.createElement(\"div\", {\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nHTMLOverlay.defaultProps = html_overlay_defaultProps;\n/* harmony default export */ var html_overlay = ((/* unused pure expression or super */ null && (HTMLOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/overlays/svg-overlay.js\n\n\nfunction svg_overlay_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction svg_overlay_objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n svg_overlay_ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n svg_overlay_ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n\n\nvar svg_overlay_defaultProps = {\n captureScroll: false,\n captureDrag: false,\n captureClick: false,\n captureDoubleClick: false,\n capturePointerMove: false\n};\n\nfunction SVGOverlay(props) {\n var _useMapControl = useMapControl(props),\n context = _useMapControl.context,\n containerRef = _useMapControl.containerRef;\n\n var viewport = context.viewport,\n isDragging = context.isDragging;\n\n var style = svg_overlay_objectSpread({\n position: 'absolute',\n left: 0,\n top: 0\n }, props.style);\n\n return react.createElement(\"svg\", {\n width: viewport.width,\n height: viewport.height,\n ref: containerRef,\n style: style\n }, props.redraw({\n width: viewport.width,\n height: viewport.height,\n isDragging: isDragging,\n project: viewport.project,\n unproject: viewport.unproject\n }));\n}\n\nSVGOverlay.defaultProps = svg_overlay_defaultProps;\n/* harmony default export */ var svg_overlay = ((/* unused pure expression or super */ null && (SVGOverlay)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/utils/set-rtl-text-plugin.js\n\nvar setRTLTextPlugin = (maplibre_gl_default()) ? (maplibre_gl_default()).setRTLTextPlugin : function () {};\n/* harmony default export */ var set_rtl_text_plugin = ((/* unused pure expression or super */ null && (setRTLTextPlugin)));\n;// CONCATENATED MODULE: ./node_modules/react-map-gl/dist/esm/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/@turf/helpers/dist/es/index.js\n/**\n * @module helpers\n */\n\n/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n *\n * @memberof helpers\n * @type {number}\n */\nvar earthRadius = 6371008.8;\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: earthRadius / 111325,\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936\n};\n/**\n * Units of measurement factors based on 1 meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar unitsFactors = {\n centimeters: 100,\n centimetres: 100,\n degrees: 1 / 111325,\n feet: 3.28084,\n inches: 39.37,\n kilometers: 1 / 1000,\n kilometres: 1 / 1000,\n meters: 1,\n metres: 1,\n miles: 1 / 1609.344,\n millimeters: 1000,\n millimetres: 1000,\n nauticalmiles: 1 / 1852,\n radians: 1 / earthRadius,\n yards: 1.0936133\n};\n/**\n * Area of measurement factors based on 1 square meter.\n *\n * @memberof helpers\n * @type {Object}\n */\n\nvar areaFactors = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046\n};\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\n\nfunction es_feature(geom, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var feat = {\n type: \"Feature\"\n };\n\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\n\nfunction geometry(type, coordinates, _options) {\n if (_options === void 0) {\n _options = {};\n }\n\n switch (type) {\n case \"Point\":\n return es_point(coordinates).geometry;\n\n case \"LineString\":\n return es_lineString(coordinates).geometry;\n\n case \"Polygon\":\n return polygon(coordinates).geometry;\n\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\n\nfunction es_point(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n var geom = {\n type: \"Point\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\n\nfunction points(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_point(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\n\nfunction polygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {\n var ring = coordinates_1[_i];\n\n if (ring.length < 4) {\n throw new Error(\"Each LinearRing of a Polygon must have 4 or more Positions.\");\n }\n\n for (var j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n\n var geom = {\n type: \"Polygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\n\nfunction polygons(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return polygon(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\n\nfunction es_lineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n\n var geom = {\n type: \"LineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\n\nfunction lineStrings(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n return featureCollection(coordinates.map(function (coords) {\n return es_lineString(coords, properties);\n }), options);\n}\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\n\nfunction featureCollection(features, options) {\n if (options === void 0) {\n options = {};\n }\n\n var fc = {\n type: \"FeatureCollection\"\n };\n\n if (options.id) {\n fc.id = options.id;\n }\n\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n\n fc.features = features;\n return fc;\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\n\nfunction multiLineString(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiLineString\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\n\nfunction multiPoint(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPoint\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\n\nfunction multiPolygon(coordinates, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"MultiPolygon\",\n coordinates: coordinates\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\n\nfunction geometryCollection(geometries, properties, options) {\n if (options === void 0) {\n options = {};\n }\n\n var geom = {\n type: \"GeometryCollection\",\n geometries: geometries\n };\n return es_feature(geom, properties, options);\n}\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\n\nfunction es_round(num, precision) {\n if (precision === void 0) {\n precision = 0;\n }\n\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\n\nfunction radiansToLength(radians, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return radians * factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\n\nfunction lengthToRadians(distance, units) {\n if (units === void 0) {\n units = \"kilometers\";\n }\n\n var factor = factors[units];\n\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n\n return distance / factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\n\nfunction lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\n\nfunction bearingToAzimuth(bearing) {\n var angle = bearing % 360;\n\n if (angle < 0) {\n angle += 360;\n }\n\n return angle;\n}\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\n\nfunction radiansToDegrees(radians) {\n var degrees = radians % (2 * Math.PI);\n return degrees * 180 / Math.PI;\n}\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\n\nfunction degreesToRadians(degrees) {\n var radians = degrees % 360;\n return radians * Math.PI / 180;\n}\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] of the length\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted length\n */\n\nfunction convertLength(length, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"kilometers\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares\n * @param {number} area to be converted\n * @param {Units} [originalUnit=\"meters\"] of the distance\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted area\n */\n\nfunction convertArea(area, originalUnit, finalUnit) {\n if (originalUnit === void 0) {\n originalUnit = \"meters\";\n }\n\n if (finalUnit === void 0) {\n finalUnit = \"kilometers\";\n }\n\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n var startFactor = areaFactors[originalUnit];\n\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n var finalFactor = areaFactors[finalUnit];\n\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return area / startFactor * finalFactor;\n}\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\n\nfunction isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\n\nfunction es_isObject(input) {\n return !!input && input.constructor === Object;\n}\n/**\n * Validate BBox\n *\n * @private\n * @param {Array} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\n\nfunction validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n\n bbox.forEach(function (num) {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\n\nfunction validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@turf/meta/dist/es/index.js\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @name coordEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection; // Handles null Geometry -- Skips this geometry\n\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n wrapShrink = excludeWrapCoord && (geomType === \"Polygon\" || geomType === \"MultiPolygon\") ? 1 : 0;\n\n switch (geomType) {\n case null:\n break;\n\n case \"Point\":\n if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n coordIndex++;\n }\n\n geometryIndex++;\n }\n\n multiFeatureIndex++;\n }\n\n break;\n\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++) {\n if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;\n }\n\n break;\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Array} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @name coordReduce\n * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\n\n\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);\n }, excludeWrapCoord);\n return previousValue;\n}\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {Object} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @name propEach\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\n\n\nfunction propEach(geojson, callback) {\n var i;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n\n break;\n\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {*} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @name propReduce\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\n\n\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;else previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name featureEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\n\n\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name featureReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\n\n\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @name coordAll\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @returns {Array>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\n\n\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @name geomEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\n\n\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1; // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection ? geojson.features[i].geometry : isFeature ? geojson.geometry : geojson;\n featureProperties = isFeatureCollection ? geojson.features[i].properties : isFeature ? geojson.properties : {};\n featureBBox = isFeatureCollection ? geojson.features[i].bbox : isFeature ? geojson.bbox : undefined;\n featureId = isFeatureCollection ? geojson.features[i].id : isFeature ? geojson.id : undefined;\n isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === \"GeometryCollection\" : false;\n stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection ? geometryMaybeCollection.geometries[g] : geometryMaybeCollection; // Handle null Geometry\n\n if (geometry === null) {\n if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n continue;\n }\n\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n {\n if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n break;\n }\n\n case \"GeometryCollection\":\n {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;\n }\n\n break;\n }\n\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n } // Only increase `featureIndex` per each feature\n\n\n featureIndex++;\n }\n}\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @name geomReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\n\n\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);\n });\n return previousValue;\n}\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name flattenEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\n\n\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (callback(feature(geometry, properties, {\n bbox: bbox,\n id: id\n }), featureIndex, 0) === false) return false;\n return;\n }\n\n var geomType; // Callback for multi-geometry\n\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate\n };\n if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;\n }\n });\n}\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @name flattenReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\n\n\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {\n if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);\n });\n return previousValue;\n}\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\n\n\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0; // Exclude null Geometries\n\n if (!feature.geometry) return; // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return; // Generate 2-vertex line segments\n\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (coordEach(feature, function (currentCoord, coordIndex, featureIndexCoord, multiPartIndexCoord, geometryIndex) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (previousCoords === undefined || featureIndex > previousFeatureIndex || multiPartIndexCoord > previousMultiIndex || geometryIndex > prevGeomIndex) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n\n var currentSegment = lineString([previousCoords, currentCoord], feature.properties);\n if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }) === false) return false;\n });\n}\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\n\n\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n if (started === false && initialValue === undefined) previousValue = currentSegment;else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);\n started = true;\n });\n return previousValue;\n}\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @name lineEach\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\n\n\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false) return false;\n break;\n\n case \"Polygon\":\n for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {\n if (callback(lineString(coords[geometryIndex], feature.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;\n }\n\n break;\n }\n });\n}\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name lineReduce\n * @param {Geometry|Feature} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\n\n\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);\n });\n return previousValue;\n}\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature>\n */\n\n\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find SegmentIndex\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature>\n */\n\n\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0; // Find FeatureIndex\n\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n\n case \"Point\":\n case \"MultiPoint\":\n return null;\n\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n\n default:\n throw new Error(\"geojson is invalid\");\n } // Find Coord Index\n\n\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n\n case \"MultiPoint\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n\n case \"MultiLineString\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);\n }\n\n throw new Error(\"geojson is invalid\");\n}\n\n\n;// CONCATENATED MODULE: ./node_modules/@turf/bbox/dist/es/index.js\n\n/**\n * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.\n *\n * @name bbox\n * @param {GeoJSON} geojson any GeoJSON object\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\n\nfunction bbox(geojson) {\n var result = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, function (coord) {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nbbox[\"default\"] = bbox;\n/* harmony default export */ var es = (bbox);\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n// EXTERNAL MODULE: ./node_modules/react-device-detect/main.js\nvar main = __webpack_require__(1677);\n;// CONCATENATED MODULE: ./node_modules/react-use/esm/useEffectOnce.js\n\n\nvar useEffectOnce = function useEffectOnce(effect) {\n (0,react.useEffect)(effect, []);\n};\n\n/* harmony default export */ var esm_useEffectOnce = (useEffectOnce);\n;// CONCATENATED MODULE: ./node_modules/react-use/esm/useUnmount.js\n\n\n\nvar useUnmount = function useUnmount(fn) {\n var fnRef = (0,react.useRef)(fn); // update the ref each render so if it change the newest callback will be invoked\n\n fnRef.current = fn;\n esm_useEffectOnce(function () {\n return function () {\n return fnRef.current();\n };\n });\n};\n\n/* harmony default export */ var esm_useUnmount = (useUnmount);\n;// CONCATENATED MODULE: ./node_modules/react-use/esm/useRafState.js\n\n\n\nvar useRafState = function useRafState(initialState) {\n var frame = (0,react.useRef)(0);\n\n var _a = (0,react.useState)(initialState),\n state = _a[0],\n setState = _a[1];\n\n var setRafState = (0,react.useCallback)(function (value) {\n cancelAnimationFrame(frame.current);\n frame.current = requestAnimationFrame(function () {\n setState(value);\n });\n }, []);\n esm_useUnmount(function () {\n cancelAnimationFrame(frame.current);\n });\n return [state, setRafState];\n};\n\n/* harmony default export */ var esm_useRafState = (useRafState);\n;// CONCATENATED MODULE: ./node_modules/react-use/esm/misc/util.js\nvar util_noop = function noop() {};\nfunction on(obj) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n if (obj && obj.addEventListener) {\n obj.addEventListener.apply(obj, args);\n }\n}\nfunction off(obj) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n if (obj && obj.removeEventListener) {\n obj.removeEventListener.apply(obj, args);\n }\n}\nvar util_isBrowser = typeof window !== 'undefined';\nvar isNavigator = typeof navigator !== 'undefined';\n;// CONCATENATED MODULE: ./node_modules/react-use/esm/useWindowSize.js\n\n\n\n\nvar useWindowSize = function useWindowSize(initialWidth, initialHeight) {\n if (initialWidth === void 0) {\n initialWidth = Infinity;\n }\n\n if (initialHeight === void 0) {\n initialHeight = Infinity;\n }\n\n var _a = esm_useRafState({\n width: util_isBrowser ? window.innerWidth : initialWidth,\n height: util_isBrowser ? window.innerHeight : initialHeight\n }),\n state = _a[0],\n setState = _a[1];\n\n (0,react.useEffect)(function () {\n if (util_isBrowser) {\n var handler_1 = function handler_1() {\n setState({\n width: window.innerWidth,\n height: window.innerHeight\n });\n };\n\n on(window, 'resize', handler_1);\n return function () {\n off(window, 'resize', handler_1);\n };\n }\n }, []);\n return state;\n};\n\n/* harmony default export */ var esm_useWindowSize = (useWindowSize);\n// EXTERNAL MODULE: ./src/contexts/FlagContext.tsx\nvar FlagContext = __webpack_require__(774);\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.module.scss\n// extracted by mini-css-extract-plugin\nvar territoryFocusContainer = \"territoryFocusControl-module--territoryFocusContainer--3N0XM\";\n;// CONCATENATED MODULE: ./src/components/territoryFocusControl.tsx\nvar TerritoryFocusControl=function TerritoryFocusControl(_ref){var onClickTerritoryFocusButton=_ref.onClickTerritoryFocusButton;var intl=(0,gatsby_plugin_intl.useIntl)();var _useMapControl=useMapControl({// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\nonClick:onClickTerritoryFocusButton}),containerRef=_useMapControl.containerRef;var territories=[{short:intl.formatMessage(MAP.LOWER48_SHORT),long:intl.formatMessage(MAP.LOWER48_LONG)},{short:intl.formatMessage(MAP.ALASKA_SHORT),long:intl.formatMessage(MAP.ALASKA_LONG)},{short:intl.formatMessage(MAP.HAWAII_SHORT),long:intl.formatMessage(MAP.HAWAII_LONG)},{short:intl.formatMessage(MAP.PR_SHORT),long:intl.formatMessage(MAP.PR_LONG)}];// the offset for this array should map the territories variable\nvar territoriesIconClassName=['mapboxgl-ctrl-zoom-to-48','mapboxgl-ctrl-zoom-to-ak','mapboxgl-ctrl-zoom-to-hi','mapboxgl-ctrl-zoom-to-pr'];return/*#__PURE__*/react.createElement(\"div\",{ref:containerRef,className:territoryFocusContainer},/*#__PURE__*/react.createElement(\"div\",{className:'mapboxgl-ctrl mapboxgl-ctrl-group'},territories.map(function(territory,index){return/*#__PURE__*/react.createElement(\"button\",{id:territory.short,key:territory.short,onClick:onClickTerritoryFocusButton,className:'mapboxgl-ctrl-icon '+territoriesIconClassName[index],\"aria-label\":intl.formatMessage({id:'map.territoryFocus.focusOn',defaultMessage:'Focus on {territory}',description:'Focus on the bounds of a specific territory'},{territory:territory.long})},/*#__PURE__*/react.createElement(\"span\",{className:'mapboxgl-ctrl-icon',\"aria-hidden\":true}));})));};/* harmony default export */ var territoryFocusControl = (TerritoryFocusControl);\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/lightbulb_outline.svg\n/* harmony default export */ var lightbulb_outline = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxnPjxwYXRoIGQ9Ik05LDIxYzAsMC41NSwwLjQ1LDEsMSwxaDRjMC41NSwwLDEtMC40NSwxLTF2LTFIOVYyMXogTTEyLDJDOC4xNCwyLDUsNS4xNCw1LDljMCwyLjM4LDEuMTksNC40NywzLDUuNzRWMTcgYzAsMC41NSwwLjQ1LDEsMSwxaDZjMC41NSwwLDEtMC40NSwxLTF2LTIuMjZjMS44MS0xLjI3LDMtMy4zNiwzLTUuNzRDMTksNS4xNCwxNS44NiwyLDEyLDJ6IE0xNCwxMy43VjE2aC00di0yLjMgQzguNDgsMTIuNjMsNywxMS41Myw3LDljMC0yLjc2LDIuMjQtNSw1LTVzNSwyLjI0LDUsNUMxNywxMS40OSwxNS40OSwxMi42NSwxNCwxMy43eiIvPjwvZz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.module.scss\n// extracted by mini-css-extract-plugin\nvar mapIntroContainer = \"mapIntroduction-module--mapIntroContainer--1K8du\";\nvar mapIntroHeader = \"mapIntroduction-module--mapIntroHeader--32LBs\";\nvar mapIntroText = \"mapIntroduction-module--mapIntroText--Tib8L\";\nvar mapIntroLightbulb = \"mapIntroduction-module--mapIntroLightbulb--3LBx0\";\nvar didYouKnowBox = \"mapIntroduction-module--didYouKnowBox--3ztEy\";\nvar didYouKnow = \"mapIntroduction-module--didYouKnow--3_v_i\";\nvar didYouKnowText = \"mapIntroduction-module--didYouKnowText--3sgHs\";\n;// CONCATENATED MODULE: ./src/components/mapIntroduction.tsx\n// @ts-ignore\nvar MapIntroduction=function MapIntroduction(){var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(\"aside\",{className:mapIntroContainer},/*#__PURE__*/react.createElement(\"header\",{className:mapIntroHeader},intl.formatMessage(SIDE_PANEL_INITIAL_STATE.TITLE)),/*#__PURE__*/react.createElement(\"div\",{className:mapIntroText},/*#__PURE__*/react.createElement(\"img\",{className:mapIntroLightbulb,src:lightbulb_outline,alt:'icon showing a lightbulb'}),/*#__PURE__*/react.createElement(\"div\",{className:didYouKnowBox},/*#__PURE__*/react.createElement(\"div\",{className:didYouKnow},intl.formatMessage(SIDE_PANEL_INITIAL_STATE.DID_YOU_KNOW)),/*#__PURE__*/react.createElement(\"cite\",{className:didYouKnowText},intl.formatMessage(SIDE_PANEL_INITIAL_STATE.CBG_DEFINITION)))));};/* harmony default export */ var mapIntroduction = (MapIntroduction);\n;// CONCATENATED MODULE: ./src/components/AreaDetail/areaDetail.module.scss\n// extracted by mini-css-extract-plugin\nvar areaDetailContainer = \"areaDetail-module--areaDetailContainer--YFThR\";\nvar categorization = \"areaDetail-module--categorization--hB9K8\";\nvar communityOfFocus = \"areaDetail-module--communityOfFocus--2DIWM\";\nvar communityOfFocusCircle = \"areaDetail-module--communityOfFocusCircle--2Kzj5\";\nvar censusRow = \"areaDetail-module--censusRow--169O8\";\nvar censusLabel = \"areaDetail-module--censusLabel--3SC-c\";\nvar censusText = \"areaDetail-module--censusText--3j1xg\";\nvar divider = \"areaDetail-module--divider--3yw9U\";\nvar indicatorBoxMain = \"areaDetail-module--indicatorBoxMain--13JDU\";\nvar indicatorBoxAdditional = \"areaDetail-module--indicatorBoxAdditional--31WUZ\";\nvar indicatorRow = \"areaDetail-module--indicatorRow--1uWBi\";\nvar indicatorName = \"areaDetail-module--indicatorName--2n0RS\";\nvar indicatorValue = \"areaDetail-module--indicatorValue--3EtVQ\";\nvar indicatorSuperscript = \"areaDetail-module--indicatorSuperscript--1jeWm\";\nvar indicatorDesc = \"areaDetail-module--indicatorDesc--2lR_d\";\n;// CONCATENATED MODULE: ./src/data/constants.tsx\nvar XYZ_SUFFIX='{z}/{x}/{y}.pbf';var featureURLForTilesetName=function featureURLForTilesetName(tilesetName){// The feature tile base URL can either point locally or the CDN.\n// This is selected based on the DATA_SOURCE env variable.\nvar featureTileBaseURL= false?0:\"https://d3jqyw10j8e7p9.cloudfront.net\";return[featureTileBaseURL,\"data-pipeline/data/score\",\"tiles\",tilesetName,XYZ_SUFFIX].join('/');};var FEATURE_TILE_HIGH_ZOOM_URL=featureURLForTilesetName('high');var FEATURE_TILE_LOW_ZOOM_URL=featureURLForTilesetName('low');// Performance markers\nvar PERFORMANCE_MARKER_MAP_IDLE='MAP_IDLE';// Properties\nvar SCORE_PROPERTY_HIGH='Score G';var SCORE_PROPERTY_LOW='G_SCORE';var GEOID_PROPERTY='GEOID10';var HIGH_SCORE_SOURCE_NAME='score-high';var HIGH_SCORE_LAYER_NAME='score-high-layer';var LOW_SCORE_SOURCE_NAME='score-low';var LOW_SCORE_LAYER_NAME='score-low-layer';var SELECTED_PROPERTY='selected';var CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME='currently-selected-feature-highlight-layer';var BLOCK_GROUP_BOUNDARY_LAYER_NAME='block-group-boundary-layer';// Properties\nvar POVERTY_PROPERTY_PERCENTILE='Poverty (Less than 200% of federal poverty line) (percentile)';var HOUSING_BURDEN_PROPERTY_PERCENTILE='Housing burden (percent) (percentile)';var LINGUISTIC_ISOLATION_PROPERTY_PERCENTILE='Linguistic isolation (percent) (percentile)';var UNEMPLOYMENT_PROPERTY_PERCENTILE='Unemployed civilians (percent) (percentile)';var TOTAL_POPULATION='Total population';var EDUCATION_PROPERTY_PERCENTILE=\"Percent individuals age 25 or over with less than high school degree (percentile)\";var COUNTY_NAME='County Name';var STATE_NAME='State Name';var DIABETES_PERCENTILE='Diagnosed diabetes among adults aged >=18 years (percentile)';var ASTHMA_PERCENTILE='Current asthma among adults aged >=18 years (percentile)';var HEART_PERCENTILE='Coronary heart disease among adults aged >=18 years (percentile)';var LIFE_PERCENTILE='Life expectancy (years) (percentile)';var TRAFFIC_PERCENTILE='Traffic proximity and volume (percentile)';var FEMA_PERCENTILE='FEMA Risk Index Expected Annual Loss Score (percentile)';var ENERGY_PERCENTILE='Energy burden (percentile)';var WASTEWATER_PERCENTILE='Wastewater discharge (percentile)';var LEAD_PAINT_PERCENTILE='Percent pre-1960s housing (lead paint indicator) (percentile)';var DIESEL_MATTER_PERCENTILE='Diesel particulate matter (percentile)';var PM25_PERCENTILE='Particulate matter (PM2.5) (percentile)';// The name of the layer within the tiles that contains the score\nvar SCORE_SOURCE_LAYER='blocks';// Zoom\nvar GLOBAL_MIN_ZOOM=3;var GLOBAL_MAX_ZOOM=22;var GLOBAL_MIN_ZOOM_LOW=3;var GLOBAL_MAX_ZOOM_LOW=7;var GLOBAL_MIN_ZOOM_HIGHLIGHT=8;var GLOBAL_MAX_ZOOM_HIGHLIGHT=22;var GLOBAL_MIN_ZOOM_HIGH=7;var GLOBAL_MAX_ZOOM_HIGH=11;// Bounds\nvar GLOBAL_MAX_BOUNDS=(/* unused pure expression or super */ null && ([[-180.118306,5.499550],[-65.0,83.162102]]));var LOWER_48_BOUNDS=[[-124.7844079,24.7433195],[-66.9513812,49.3457868]];var ALASKA_BOUNDS=[[-183.856888,50.875311],[-140.932617,71.958797]];var HAWAII_BOUNDS=[[-168.118306,18.748115],[-154.757881,22.378413]];var PUERTO_RICO_BOUNDS=[[-67.945404,17.88328],[-65.220703,18.515683]];var GUAM_BOUNDS=(/* unused pure expression or super */ null && ([[-215.389709,13.225909],[-215.040894,13.663335]]));var MARIANA_ISLAND_BOUNDS=(/* unused pure expression or super */ null && ([[-215.313449,14.007801],[-213.742404,19.750326]]));var AMERICAN_SAMOA_BOUNDS=(/* unused pure expression or super */ null && ([[-171.089874,-14.548699],[-168.1433,-11.046934]]));var DEFAULT_CENTER=[32.4687126,-86.502136];// Opacity\nvar DEFAULT_LAYER_OPACITY=0.6;// Colors\nvar DEFAULT_OUTLINE_COLOR='#4EA5CF';var MIN_COLOR='#FFFFFF';var MED_COLOR='#D1DAE6';var MAX_COLOR='#768FB3';var BORDER_HIGHLIGHT_COLOR='#00BDE3';var CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY=0.5;// Widths\nvar HIGHLIGHT_BORDER_WIDTH=5.0;var CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH=0.8;// Score boundaries\nvar SCORE_BOUNDARY_LOW=0.0;var SCORE_BOUNDARY_THRESHOLD=0.6;var SCORE_BOUNDARY_PRIORITIZED=0.75;var isMobile=main/* isMobile */.tq;\n;// CONCATENATED MODULE: ./src/components/AreaDetail/index.tsx\n/* eslint-disable quotes */ // External Libs:\n// Components:\n// import {Accordion} from '@trussworks/react-uswds';\n// Styles and constants\nvar readablePercentile=function readablePercentile(percentile){return Math.round(percentile*100);};// Todo: Add internationalization to superscript ticket #582\nvar getSuperscriptOrdinal=function getSuperscriptOrdinal(percentile){var englishOrdinalRules=new Intl.PluralRules('en',{type:'ordinal'});var suffixes={zero:'th',one:'st',two:'nd',few:'rd',many:'th',other:'th'};return suffixes[englishOrdinalRules.select(percentile)];};var AreaDetail=function AreaDetail(_ref){var properties=_ref.properties;var intl=(0,gatsby_plugin_intl.useIntl)();var _React$useState=react.useState(true),isCommunityFocus=_React$useState[0],setIsCommunityFocus=_React$useState[1];var score=properties[SCORE_PROPERTY_HIGH];var blockGroup=properties[GEOID_PROPERTY];var population=properties[TOTAL_POPULATION];var countyName=properties[COUNTY_NAME];var stateName=properties[STATE_NAME];(0,react.useEffect)(function(){if(score>=SCORE_BOUNDARY_PRIORITIZED){setIsCommunityFocus(true);}else{setIsCommunityFocus(false);}},[score]);// Todo: Ticket #367 will be replacing descriptions with YAML file\nvar areaMedianIncome={label:intl.formatMessage(SIDE_PANEL_INDICATORS.AREA_MEDIAN_INCOME),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.AREA_MEDIAN_INCOME),value:properties[POVERTY_PROPERTY_PERCENTILE]};var eduInfo={label:intl.formatMessage(SIDE_PANEL_INDICATORS.EDUCATION),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.EDUCATION),value:properties[EDUCATION_PROPERTY_PERCENTILE]};var poverty={label:intl.formatMessage(SIDE_PANEL_INDICATORS.POVERTY),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.POVERTY),value:properties[POVERTY_PROPERTY_PERCENTILE]};var asthma={label:intl.formatMessage(SIDE_PANEL_INDICATORS.ASTHMA),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.ASTHMA),value:properties[ASTHMA_PERCENTILE]};var diabetes={label:intl.formatMessage(SIDE_PANEL_INDICATORS.DIABETES),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.DIABETES),value:properties[DIABETES_PERCENTILE]};var dieselPartMatter={label:intl.formatMessage(SIDE_PANEL_INDICATORS.DIESEL_PARTICULATE_MATTER),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.DIESEL_PARTICULATE_MATTER),value:properties[DIESEL_MATTER_PERCENTILE]};var lifeExpect={label:intl.formatMessage(SIDE_PANEL_INDICATORS.LIFE_EXPECT),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.LIFE_EXPECT),value:properties[LIFE_PERCENTILE]};var energyBurden={label:intl.formatMessage(SIDE_PANEL_INDICATORS.ENERGY_BURDEN),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.ENERGY_BURDEN),value:properties[ENERGY_PERCENTILE]};var pm25={label:intl.formatMessage(SIDE_PANEL_INDICATORS.PM_2_5),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.PM_2_5),value:properties[PM25_PERCENTILE]};var leadPaint={label:intl.formatMessage(SIDE_PANEL_INDICATORS.LEAD_PAINT),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.LEAD_PAINT),value:properties[LEAD_PAINT_PERCENTILE]};var trafficVolume={label:intl.formatMessage(SIDE_PANEL_INDICATORS.TRAFFIC_VOLUME),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.TRAFFIC_VOLUME),value:properties[TRAFFIC_PERCENTILE]};var wasteWater={label:intl.formatMessage(SIDE_PANEL_INDICATORS.WASTE_WATER),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.WASTE_WATER),value:properties[WASTEWATER_PERCENTILE]};var femaRisk={label:intl.formatMessage(SIDE_PANEL_INDICATORS.FEMA_RISK),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.FEMA_RISK),value:properties[FEMA_PERCENTILE]};var heartDisease={label:intl.formatMessage(SIDE_PANEL_INDICATORS.HEART_DISEASE),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.HEART_DISEASE),value:properties[HEART_PERCENTILE]};var houseBurden={label:intl.formatMessage(SIDE_PANEL_INDICATORS.HOUSE_BURDEN),description:intl.formatMessage(SIDE_PANEL_INDICATOR_DESCRIPTION.HOUSE_BURDEN),value:properties[HOUSING_BURDEN_PROPERTY_PERCENTILE]};var indicators=[areaMedianIncome,eduInfo,poverty];var additionalIndicators=[asthma,diabetes,dieselPartMatter,energyBurden,femaRisk,heartDisease,houseBurden,leadPaint,lifeExpect,pm25,trafficVolume,wasteWater];return/*#__PURE__*/react.createElement(\"aside\",{className:areaDetailContainer,\"data-cy\":'aside'},/*#__PURE__*/react.createElement(\"ul\",{className:censusRow},/*#__PURE__*/react.createElement(\"li\",null,/*#__PURE__*/react.createElement(\"span\",{className:censusLabel},intl.formatMessage(SIDE_PANEL_CBG_INFO.CENSUS_BLOCK_GROUP)),/*#__PURE__*/react.createElement(\"span\",{className:censusText},\" \"+blockGroup)),/*#__PURE__*/react.createElement(\"li\",null,/*#__PURE__*/react.createElement(\"span\",{className:censusLabel},intl.formatMessage(SIDE_PANEL_CBG_INFO.COUNTY)),/*#__PURE__*/react.createElement(\"span\",{className:censusText},\" \"+countyName)),/*#__PURE__*/react.createElement(\"li\",null,/*#__PURE__*/react.createElement(\"span\",{className:censusLabel},intl.formatMessage(SIDE_PANEL_CBG_INFO.STATE)),/*#__PURE__*/react.createElement(\"span\",{className:censusText},\" \"+stateName)),/*#__PURE__*/react.createElement(\"li\",null,/*#__PURE__*/react.createElement(\"span\",{className:censusLabel},intl.formatMessage(SIDE_PANEL_CBG_INFO.POPULATION)),/*#__PURE__*/react.createElement(\"span\",{className:censusText},\" \"+population.toLocaleString()))),/*#__PURE__*/react.createElement(\"div\",{className:categorization},/*#__PURE__*/react.createElement(\"div\",{className:communityOfFocus},isCommunityFocus?/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(\"div\",{className:communityOfFocusCircle}),/*#__PURE__*/react.createElement(\"h3\",null,COMMUNITY.OF_FOCUS)):/*#__PURE__*/react.createElement(\"h3\",null,COMMUNITY.NOT_OF_FOCUS)),/*#__PURE__*/react.createElement(\"p\",{className:\"secondary\"},\"version \",methodology/* VERSION_NUMBER */.IE)),/*#__PURE__*/react.createElement(\"div\",{className:divider},/*#__PURE__*/react.createElement(\"h6\",null,intl.formatMessage(SIDE_PANEL_INDICATORS.INDICATOR_COLUMN_HEADER)),/*#__PURE__*/react.createElement(\"h6\",null,intl.formatMessage(SIDE_PANEL_INDICATORS.PERCENTILE_COLUMN_HEADER))),/*#__PURE__*/react.createElement(react.Fragment,null,indicators.map(function(indicator,index){return/*#__PURE__*/react.createElement(\"li\",{key:\"ind\"+index,className:indicatorBoxMain,\"data-cy\":'indicatorBox'},/*#__PURE__*/react.createElement(\"div\",{className:indicatorRow},/*#__PURE__*/react.createElement(\"h4\",{className:indicatorName},indicator.label),/*#__PURE__*/react.createElement(\"div\",{className:indicatorValue},readablePercentile(indicator.value),/*#__PURE__*/react.createElement(\"sup\",{className:indicatorSuperscript},/*#__PURE__*/react.createElement(\"span\",null,getSuperscriptOrdinal(readablePercentile(indicator.value)))))),/*#__PURE__*/react.createElement(\"p\",{className:'secondary j40-indicator'},indicator.description));})),/*#__PURE__*/react.createElement(react.Fragment,null,additionalIndicators.map(function(indicator,index){return/*#__PURE__*/react.createElement(\"li\",{key:\"ind\"+index,className:indicatorBoxAdditional,\"data-cy\":'indicatorBox'},/*#__PURE__*/react.createElement(\"div\",{className:indicatorRow},/*#__PURE__*/react.createElement(\"h4\",{className:indicatorName},indicator.label),/*#__PURE__*/react.createElement(\"div\",{className:indicatorValue},readablePercentile(indicator.value),/*#__PURE__*/react.createElement(\"sup\",{className:indicatorSuperscript},/*#__PURE__*/react.createElement(\"span\",null,getSuperscriptOrdinal(readablePercentile(indicator.value)))))),/*#__PURE__*/react.createElement(\"p\",{className:'secondary j40-indicator'},indicator.description));})));};/* harmony default export */ var components_AreaDetail = (AreaDetail);\n;// CONCATENATED MODULE: ./src/components/mapInfoPanel.tsx\nvar MapInfoPanel=function MapInfoPanel(_ref){var className=_ref.className,featureProperties=_ref.featureProperties,selectedFeatureId=_ref.selectedFeatureId;return/*#__PURE__*/react.createElement(\"div\",{className:className},featureProperties&&selectedFeatureId?/*#__PURE__*/react.createElement(components_AreaDetail,{properties:featureProperties}):/*#__PURE__*/react.createElement(mapIntroduction,null));};/* harmony default export */ var mapInfoPanel = (MapInfoPanel);\n// EXTERNAL MODULE: ./node_modules/chroma-js/chroma.js\nvar chroma = __webpack_require__(3873);\nvar chroma_default = /*#__PURE__*/__webpack_require__.n(chroma);\n;// CONCATENATED MODULE: ./src/data/mapStyle.tsx\n// eslint-disable-next-line require-jsdoc\nfunction hexToHSLA(hex,alpha){return chroma_default()(hex).alpha(alpha).css('hsl');}/**\n * `MakePaint` generates a zoom-faded Maplibre style formatted layer given a set of parameters.\n *\n * @param {string} field : the field within the data to consult\n * @param {number} minRamp : the minimum value this can assume\n * @param {number} medRamp : the medium value this can assume\n * @param {number} maxRamp : the maximum value this can assume\n * @return {FillPaint} a maplibregl fill layer\n **/function makePaint(_ref){var field=_ref.field,minRamp=_ref.minRamp,medRamp=_ref.medRamp,maxRamp=_ref.maxRamp;var paintDescriptor={'fill-color':['step',['get',field],hexToHSLA(MIN_COLOR,DEFAULT_LAYER_OPACITY),minRamp,hexToHSLA(MIN_COLOR,DEFAULT_LAYER_OPACITY),medRamp,hexToHSLA(MED_COLOR,DEFAULT_LAYER_OPACITY),maxRamp,hexToHSLA(MAX_COLOR,DEFAULT_LAYER_OPACITY)]};return paintDescriptor;}var imageSuffix=isMobile?'':'@2x';var makeMapStyle=function makeMapStyle(flagContainer){var _sources;return{'version':8,'sources':(_sources={'carto':{'type':'raster','tiles':[\"https://a.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://b.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://c.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://d.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}\"+imageSuffix+\".png\"],'minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM},'geo':{'type':'raster','tiles':['https://mt0.google.com/vt/lyrs=p&hl=en&x={x}&y={y}&z={z}'],'minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM}},_sources[HIGH_SCORE_SOURCE_NAME]={// \"Score-high\" represents the full set of data\n// at the census block group level. It is only shown\n// at high zoom levels to avoid performance issues at lower zooms\n'type':'vector',// Our current tippecanoe command does not set an id.\n// The below line promotes the GEOID10 property to the ID\n'promoteId':GEOID_PROPERTY,'tiles':['high_tiles'in flagContainer?featureURLForTilesetName(flagContainer['high_tiles']):FEATURE_TILE_HIGH_ZOOM_URL],// Seeting maxzoom here enables 'overzooming'\n// e.g. continued zooming beyond the max bounds.\n// More here: https://docs.mapbox.com/help/glossary/overzoom/\n'minzoom':GLOBAL_MIN_ZOOM_HIGH,'maxzoom':GLOBAL_MAX_ZOOM_HIGH},_sources[LOW_SCORE_SOURCE_NAME]={// \"Score-low\" represents a tileset at the level of bucketed tracts.\n// census block group information is `dissolve`d into tracts, then\n// each tract is `dissolve`d into one of ten buckets. It is meant\n// to give us a favorable tradeoff between performance and fidelity.\n'type':'vector','promoteId':GEOID_PROPERTY,'tiles':['low_tiles'in flagContainer?featureURLForTilesetName(flagContainer['low_tiles']):FEATURE_TILE_LOW_ZOOM_URL// For local development, use:\n// 'http://localhost:8080/data/tl_2010_bg_with_data/{z}/{x}/{y}.pbf',\n],'minzoom':GLOBAL_MIN_ZOOM_LOW,'maxzoom':GLOBAL_MAX_ZOOM_LOW},_sources['labels']={'type':'raster','tiles':[\"https://cartodb-basemaps-a.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://cartodb-basemaps-b.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://cartodb-basemaps-c.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}\"+imageSuffix+\".png\",\"https://cartodb-basemaps-d.global.ssl.fastly.net/light_only_labels/{z}/{x}/{y}\"+imageSuffix+\".png\"]},_sources),'layers':[{'id':'carto','source':'carto','type':'raster','minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM},{'id':'geo','source':'geo','type':'raster','layout':{// Make the layer invisible by default.\n'visibility':'none'},'minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM},{'id':HIGH_SCORE_LAYER_NAME,'source':HIGH_SCORE_SOURCE_NAME,'source-layer':SCORE_SOURCE_LAYER,'type':'fill','paint':makePaint({field:SCORE_PROPERTY_HIGH,minRamp:SCORE_BOUNDARY_LOW,medRamp:SCORE_BOUNDARY_THRESHOLD,maxRamp:SCORE_BOUNDARY_PRIORITIZED}),'minzoom':GLOBAL_MIN_ZOOM_HIGH},{'id':LOW_SCORE_LAYER_NAME,'source':LOW_SCORE_SOURCE_NAME,'source-layer':SCORE_SOURCE_LAYER,'type':'fill','filter':['all',['>',SCORE_PROPERTY_LOW,SCORE_BOUNDARY_THRESHOLD]],'paint':makePaint({field:SCORE_PROPERTY_LOW,minRamp:SCORE_BOUNDARY_LOW,medRamp:SCORE_BOUNDARY_THRESHOLD,maxRamp:SCORE_BOUNDARY_PRIORITIZED}),'minzoom':GLOBAL_MIN_ZOOM_LOW,'maxzoom':GLOBAL_MAX_ZOOM_LOW},{// We put labels last to ensure prominence\n'id':'labels-only-layer','type':'raster','source':'labels','minzoom':GLOBAL_MIN_ZOOM,'maxzoom':GLOBAL_MAX_ZOOM}]};};\n;// CONCATENATED MODULE: ./src/components/J40Map.module.scss\n// extracted by mini-css-extract-plugin\nvar j40Popup = \"J40Map-module--j40Popup--3yJGr\";\nvar navigationControl = \"J40Map-module--navigationControl--2Aybf\";\nvar fullscreenControl = \"J40Map-module--fullscreenControl--1UBKe\";\nvar geolocateControl = \"J40Map-module--geolocateControl--3KVAk\";\nvar J40Map_module_mapInfoPanel = \"J40Map-module--mapInfoPanel--F3jR4\";\n;// CONCATENATED MODULE: ./src/components/J40Map.tsx\n/* eslint-disable no-unused-vars */ // External Libs:\n// Contexts:\n// Components:\n// Styles and constants\n;;var J40Map=function J40Map(_ref){var location=_ref.location;// Hash portion of URL is of the form #zoom/lat/lng\nvar _location$hash$slice$=location.hash.slice(1).split('/'),zoom=_location$hash$slice$[0],lat=_location$hash$slice$[1],lng=_location$hash$slice$[2];var _useState=(0,react.useState)({latitude:lat&&parseFloat(lat)||DEFAULT_CENTER[0],longitude:lng&&parseFloat(lng)||DEFAULT_CENTER[1],zoom:zoom&&parseFloat(zoom)||GLOBAL_MIN_ZOOM}),viewport=_useState[0],setViewport=_useState[1];var _useState2=(0,react.useState)(),selectedFeature=_useState2[0],setSelectedFeature=_useState2[1];var _useState3=(0,react.useState)(),detailViewData=_useState3[0],setDetailViewData=_useState3[1];var _useState4=(0,react.useState)(false),transitionInProgress=_useState4[0],setTransitionInProgress=_useState4[1];var _useState5=(0,react.useState)(false),geolocationInProgress=_useState5[0],setGeolocationInProgress=_useState5[1];var _useState6=(0,react.useState)(false),isMobileMapState=_useState6[0],setIsMobileMapState=_useState6[1];var _useWindowSize=esm_useWindowSize(),windowWidth=_useWindowSize.width;var mapRef=(0,react.useRef)(null);var flags=(0,FlagContext/* useFlags */.Vb)();var selectedFeatureId=selectedFeature&&selectedFeature.id||'';var filter=(0,react.useMemo)(function(){return['in',GEOID_PROPERTY,selectedFeatureId];},[selectedFeature]);var onClick=function onClick(event){var feature=event.features&&event.features[0];if(feature){var _bbox=es(feature),minLng=_bbox[0],minLat=_bbox[1],maxLng=_bbox[2],maxLat=_bbox[3];var newViewPort=new WebMercatorViewport({height:viewport.height,width:viewport.width});var _newViewPort$fitBound=newViewPort.fitBounds([[minLng,minLat],[maxLng,maxLat]],{padding:40}),longitude=_newViewPort$fitBound.longitude,latitude=_newViewPort$fitBound.latitude,_zoom=_newViewPort$fitBound.zoom;if(feature.id!==selectedFeatureId){setSelectedFeature(feature);}else{setSelectedFeature(undefined);}var popupInfo={longitude:longitude,latitude:latitude,zoom:_zoom,properties:feature.properties};goToPlace([[minLng,minLat],[maxLng,maxLat]]);setDetailViewData(popupInfo);}};var onLoad=function onLoad(){if(typeof window!=='undefined'&&window.Cypress&&mapRef.current){window.underlyingMap=mapRef.current.getMap();}if(main/* isMobile */.tq)setIsMobileMapState(true);};var goToPlace=function goToPlace(bounds){var _WebMercatorViewport$=new WebMercatorViewport({height:viewport.height,width:viewport.width}).fitBounds(bounds,{padding:20,offset:[0,-100]}),longitude=_WebMercatorViewport$.longitude,latitude=_WebMercatorViewport$.latitude,zoom=_WebMercatorViewport$.zoom;setViewport(Object.assign({},viewport,{longitude:longitude,latitude:latitude,zoom:zoom,transitionDuration:1000,transitionInterpolator:new ViewportFlyToInterpolator(),transitionEasing:cubicInOut}));};var onClickTerritoryFocusButton=function onClickTerritoryFocusButton(event){event.stopPropagation();var buttonID=event.target&&event.target.id;switch(buttonID){case'48':goToPlace(LOWER_48_BOUNDS);break;case'AK':goToPlace(ALASKA_BOUNDS);break;case'HI':goToPlace(HAWAII_BOUNDS);break;case'PR':goToPlace(PUERTO_RICO_BOUNDS);break;default:break;}};var onTransitionStart=function onTransitionStart(){setTransitionInProgress(true);};var onTransitionEnd=function onTransitionEnd(){setTransitionInProgress(false);};var onGeolocate=function onGeolocate(){setGeolocationInProgress(false);};var onClickGeolocate=function onClickGeolocate(){setGeolocationInProgress(true);};return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Grid,{col:12,desktop:{col:9}},/*#__PURE__*/react.createElement(interactive_map,Object.assign({},viewport,{mapStyle:makeMapStyle(flags),minZoom:GLOBAL_MIN_ZOOM,maxZoom:GLOBAL_MAX_ZOOM,mapOptions:{hash:true},width:\"100%\",height:windowWidth<1024?'44vh':'100%',dragRotate:false,touchRotate:false,interactiveLayerIds:[HIGH_SCORE_LAYER_NAME],onViewportChange:setViewport,onClick:onClick,onLoad:onLoad,onTransitionStart:onTransitionStart,onTransitionEnd:onTransitionEnd,ref:mapRef,\"data-cy\":'reactMapGL'}),/*#__PURE__*/react.createElement(source,{id:HIGH_SCORE_SOURCE_NAME,type:\"vector\",promoteId:GEOID_PROPERTY,tiles:[FEATURE_TILE_HIGH_ZOOM_URL],maxzoom:GLOBAL_MIN_ZOOM_HIGH,minzoom:GLOBAL_MAX_ZOOM_HIGH},/*#__PURE__*/react.createElement(components_layer,{id:CURRENTLY_SELECTED_FEATURE_HIGHLIGHT_LAYER_NAME,\"source-layer\":SCORE_SOURCE_LAYER,type:\"line\",paint:{'line-color':DEFAULT_OUTLINE_COLOR,'line-width':CURRENTLY_SELECTED_FEATURE_LAYER_WIDTH,'line-opacity':CURRENTLY_SELECTED_FEATURE_LAYER_OPACITY},minzoom:GLOBAL_MIN_ZOOM_HIGHLIGHT,maxzoom:GLOBAL_MAX_ZOOM_HIGHLIGHT}),/*#__PURE__*/react.createElement(components_layer,{id:BLOCK_GROUP_BOUNDARY_LAYER_NAME,type:\"line\",\"source-layer\":SCORE_SOURCE_LAYER,paint:{'line-color':BORDER_HIGHLIGHT_COLOR,'line-width':HIGHLIGHT_BORDER_WIDTH},filter:filter,minzoom:GLOBAL_MIN_ZOOM_HIGH})),'fs'in flags&&detailViewData&&!transitionInProgress&&/*#__PURE__*/react.createElement(popup,{className:j40Popup,tipSize:5,anchor:\"top\",longitude:detailViewData.longitude,latitude:detailViewData.latitude,closeOnClick:true,onClose:setDetailViewData,captureScroll:true},/*#__PURE__*/react.createElement(components_AreaDetail,{properties:detailViewData.properties})),/*#__PURE__*/react.createElement(navigation_control,{showCompass:false,className:navigationControl}),'gl'in flags?/*#__PURE__*/react.createElement(geolocate_control,{className:geolocateControl,positionOptions:{enableHighAccuracy:true},onGeolocate:onGeolocate// @ts-ignore // Types have not caught up yet, see https://github.com/visgl/react-map-gl/issues/1492\n,onClick:onClickGeolocate}):'',geolocationInProgress?/*#__PURE__*/react.createElement(\"div\",null,\"Geolocation in progress...\"):'',/*#__PURE__*/react.createElement(territoryFocusControl,{onClickTerritoryFocusButton:onClickTerritoryFocusButton}),'fs'in flags?/*#__PURE__*/react.createElement(fullscreen_control,{className:fullscreenControl}):'')),/*#__PURE__*/react.createElement(lib.Grid,{col:12,desktop:{col:3},className:J40Map_module_mapInfoPanel},/*#__PURE__*/react.createElement(mapInfoPanel,{className:J40Map_module_mapInfoPanel,featureProperties:detailViewData===null||detailViewData===void 0?void 0:detailViewData.properties,selectedFeatureId:selectedFeature===null||selectedFeature===void 0?void 0:selectedFeature.id})));};/* harmony default export */ var components_J40Map = (J40Map);\n;// CONCATENATED MODULE: ./src/components/MapWrapper/mapWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar mapCaptionTextLink = \"mapWrapper-module--mapCaptionTextLink--23b2n\";\n;// CONCATENATED MODULE: ./src/components/MapWrapper/index.tsx\nvar MapWrapper=function MapWrapper(_ref){var location=_ref.location;return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:12},/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}))),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(components_J40Map,{location:location})),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:7},/*#__PURE__*/react.createElement(\"div\",{className:mapCaptionTextLink},DOWNLOAD_DRAFT.PARAGRAPH_1),/*#__PURE__*/react.createElement(\"div\",null,DOWNLOAD_DRAFT.PARAGRAPH_2))));};/* harmony default export */ var components_MapWrapper = (MapWrapper);\n;// CONCATENATED MODULE: ./src/components/MapLegend/mapLegend.module.scss\n// extracted by mini-css-extract-plugin\nvar legendContainer = \"mapLegend-module--legendContainer--2FaKH\";\nvar colorSwatch = \"mapLegend-module--colorSwatch--_SQwT\";\n;// CONCATENATED MODULE: ./src/components/MapLegend/index.tsx\nvar MapLegend=function MapLegend(){var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(\"div\",{className:legendContainer},/*#__PURE__*/react.createElement(\"div\",{className:colorSwatch}),/*#__PURE__*/react.createElement(\"div\",null,/*#__PURE__*/react.createElement(\"div\",{className:'j40-h4'},intl.formatMessage(LEGEND.PRIORITY_LABEL)),/*#__PURE__*/react.createElement(\"p\",{className:'secondary'},intl.formatMessage(LEGEND.PRIORITY_DESCRIPT))));};/* harmony default export */ var components_MapLegend = (MapLegend);\n;// CONCATENATED MODULE: ./src/pages/cejst.tsx\nvar CEJSTPage=function CEJSTPage(_ref){var location=_ref.location;// We temporarily removed MapControls, which would enable you to `setFeatures` also, for now\n// We will bring back later when we have interactive controls.\nvar intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location,title:intl.formatMessage(PAGE_INTRO.PAGE_TILE)},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(\"h1\",null,intl.formatMessage(PAGE_INTRO.PAGE_HEADING)),/*#__PURE__*/react.createElement(lib.Grid,{row:true,className:'j40-mb-5'},/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:6}},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(\"p\",null,PAGE_DESCRIPTION))),/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:6}},/*#__PURE__*/react.createElement(components_MapLegend,null)))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(components_MapWrapper,{location:location})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(\"section\",null,/*#__PURE__*/react.createElement(components_HowYouCanHelp,null))))));};/* harmony default export */ var cejst = (CEJSTPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0hvd1lvdUNhbkhlbHAvaG93WW91Q2FuSGVscC5tb2R1bGUuc2Nzcz8yOWZiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2RhdGEvY29weS9leHBsb3JlLnRzeD9lNTU4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSG93WW91Q2FuSGVscC9pbmRleC50c3g/Zjk3NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzP2MzMWQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanM/YWRlMyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz8wZDIxIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzPzA5ZjAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzPzNkOGMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcz8zODM1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzP2Q0ZWMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanM/YmVlMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcz9iOTNlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjNC5qcz84OWJiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9tYXRoLXV0aWxzLmpzP2Q5MDYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzPzQ1ODkiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzPzFhNzEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzPzg5MDIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2Fzc2VydC5qcz9hYTdhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS93ZWItbWVyY2F0b3ItdXRpbHMuanM/NzM1MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZml0LWJvdW5kcy5qcz84MTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9nZXQtYm91bmRzLmpzPzQwZjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL3dlYi1tZXJjYXRvci12aWV3cG9ydC5qcz8xYWQ2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BtYXRoLmdsL3dlYi1tZXJjYXRvci9kaXN0L2VzbS9ub3JtYWxpemUtdmlld3BvcnQtcHJvcHMuanM/YzNkOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AbWF0aC5nbC93ZWItbWVyY2F0b3IvZGlzdC9lc20vZmx5LXRvLXZpZXdwb3J0LmpzPzNjMjgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQG1hdGguZ2wvd2ViLW1lcmNhdG9yL2Rpc3QvZXNtL2luZGV4LmpzP2U1YjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdC9tb2R1bGUuanM/ZTI0NSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwvZGlzdC9SZXNpemVPYnNlcnZlci5lcy5qcz82ZmVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2U3YWUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3N0eWxlLXV0aWxzLmpzP2UyZGEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL21hcGJveC9tYXBib3guanM/OWM3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWF0aC11dGlscy5qcz9mOTFhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9hc3NlcnQuanM/ODA0NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLXN0YXRlLmpzPzRmYjEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL21hcC1jb25zdHJhaW50cy5qcz8yMWNiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL21hcC1jb250ZXh0LmpzP2M2N2EiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QuanM/NGY3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdGVycmFpbi5qcz8xMDFiIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3N0YXRpYy1tYXAuanM/NjhkMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLWludGVycG9sYXRvci5qcz80YWQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcz8yNTdlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzPzI2MmUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcz85OWRlIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzPzdlODQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vdHJhbnNpdGlvbi11dGlscy5qcz84ZDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy90cmFuc2l0aW9uL3ZpZXdwb3J0LWZseS10by1pbnRlcnBvbGF0b3IuanM/NDg3MiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi9saW5lYXItaW50ZXJwb2xhdG9yLmpzPzRiMGUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL3V0aWxzL3RyYW5zaXRpb24vaW5kZXguanM/MmJiOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvdHJhbnNpdGlvbi1tYW5hZ2VyLmpzP2MzMzQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXItb3ZlcnJpZGVzLmpzPzNjNzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9oYW1tZXIuYnJvd3Nlci5qcz9iNjk4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL21qb2xuaXIuanMvZGlzdC9lc20vY29uc3RhbnRzLmpzP2Y0MjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9nbG9iYWxzLmpzP2UxNDEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvd2hlZWwtaW5wdXQuanM/MDUzZSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2lucHV0cy9tb3ZlLWlucHV0LmpzP2JiNDAiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMva2V5LWlucHV0LmpzPzQzMmEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS9pbnB1dHMvY29udGV4dG1lbnUtaW5wdXQuanM/NWVkMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL3V0aWxzL2V2ZW50LXV0aWxzLmpzPzI1NjIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvbWpvbG5pci5qcy9kaXN0L2VzbS91dGlscy9ldmVudC1yZWdpc3RyYXIuanM/NDc1MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tam9sbmlyLmpzL2Rpc3QvZXNtL2V2ZW50LW1hbmFnZXIuanM/ZDE3MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvbWFwLWNvbnRyb2xsZXIuanM/MmM1MSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1tYXAuanM/ODZkYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanM/NTNjYSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZGVlcC1lcXVhbC5qcz82NTAyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3NvdXJjZS5qcz82ZWU0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanM/Y2NiNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcz8xNWZkIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2xheWVyLmpzPzlmZjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sLmpzPzgzYjciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYmFzZS1jb250cm9sLmpzP2MzNTciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvZHJhZ2dhYmxlLWNvbnRyb2wuanM/MmY3NCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvY3Jpc3AtcGl4ZWwuanM/ODhhZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9tYXJrZXIuanM/MDA4ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvZHluYW1pYy1wb3NpdGlvbi5qcz9hZDM5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL3BvcHVwLmpzPzk5MzYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvYXR0cmlidXRpb24tY29udHJvbC5qcz8yMzEyIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9jb21wb25lbnRzL2Z1bGxzY3JlZW4tY29udHJvbC5qcz8xMDM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy9nZW9sb2NhdGUtdXRpbHMuanM/ZDM2YiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vY29tcG9uZW50cy9nZW9sb2NhdGUtY29udHJvbC5qcz9hYzMwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS91dGlscy92ZXJzaW9uLmpzP2IyNzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1jb250cm9sLmpzP2ExYzUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtbWFwLWdsL2Rpc3QvZXNtL2NvbXBvbmVudHMvc2NhbGUtY29udHJvbC5qcz9lNzIwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9jYW52YXMtb3ZlcmxheS5qcz84NTMzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9vdmVybGF5cy9odG1sLW92ZXJsYXkuanM/Y2Q3ZCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vb3ZlcmxheXMvc3ZnLW92ZXJsYXkuanM/OGU1MCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9yZWFjdC1tYXAtZ2wvZGlzdC9lc20vdXRpbHMvc2V0LXJ0bC10ZXh0LXBsdWdpbi5qcz8wMGNmIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW1hcC1nbC9kaXN0L2VzbS9pbmRleC5qcz9jMWIzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2hlbHBlcnMvZGlzdC9lcy9pbmRleC5qcz8yOTI1Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL21ldGEvZGlzdC9lcy9pbmRleC5qcz80ZTU4Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL0B0dXJmL2Jib3gvZGlzdC9lcy9pbmRleC5qcz9jZTFjIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzP2U0MmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtdXNlL2VzbS91c2VFZmZlY3RPbmNlLmpzPzI1MjEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtdXNlL2VzbS91c2VVbm1vdW50LmpzPzUzZWQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtdXNlL2VzbS91c2VSYWZTdGF0ZS5qcz9kZGIwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXVzZS9lc20vbWlzYy91dGlsLmpzPzZhZmUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvcmVhY3QtdXNlL2VzbS91c2VXaW5kb3dTaXplLmpzP2IzYjYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy90ZXJyaXRvcnlGb2N1c0NvbnRyb2wubW9kdWxlLnNjc3M/MDAwYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL3RlcnJpdG9yeUZvY3VzQ29udHJvbC50c3g/MTRlNSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvbGlnaHRidWxiX291dGxpbmUuc3ZnPzg0YWYiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9tYXBJbnRyb2R1Y3Rpb24ubW9kdWxlLnNjc3M/YWE4NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEludHJvZHVjdGlvbi50c3g/MmJkMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FyZWFEZXRhaWwvYXJlYURldGFpbC5tb2R1bGUuc2Nzcz80YzM2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2RhdGEvY29uc3RhbnRzLnRzeD9iZTVhIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvQXJlYURldGFpbC9pbmRleC50c3g/MDk5NyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL21hcEluZm9QYW5lbC50c3g/ODg0MyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL21hcFN0eWxlLnRzeD85ZDk2Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvSjQwTWFwLm1vZHVsZS5zY3NzP2I3ZGIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9KNDBNYXAudHN4P2FmNzciLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBXcmFwcGVyL21hcFdyYXBwZXIubW9kdWxlLnNjc3M/MDJhOSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL01hcFdyYXBwZXIvaW5kZXgudHN4P2JkYjMiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBMZWdlbmQvbWFwTGVnZW5kLm1vZHVsZS5zY3NzPzdlMzgiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9NYXBMZWdlbmQvaW5kZXgudHN4PzI4ZmQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvcGFnZXMvY2Vqc3QudHN4P2UxZGYiXSwibmFtZXMiOlsiUEFHRV9JTlRSTyIsImRlZmluZU1lc3NhZ2VzIiwiUEFHRV9USUxFIiwiaWQiLCJkZWZhdWx0TWVzc2FnZSIsImRlc2NyaXB0aW9uIiwiUEFHRV9IRUFESU5HIiwiUEFHRV9ERVNDUklQVElPTiIsIm1ldGhvZG9sb2d5TGluayIsIkxFR0VORCIsIlBSSU9SSVRZX0xBQkVMIiwiUFJJT1JJVFlfREVTQ1JJUFQiLCJNQVAiLCJaT09NX1dBUk5JTkciLCJMT1dFUjQ4X1NIT1JUIiwiTE9XRVI0OF9MT05HIiwiQUxBU0tBX1NIT1JUIiwiQUxBU0tBX0xPTkciLCJIQVdBSUlfU0hPUlQiLCJIQVdBSUlfTE9ORyIsIlBSX1NIT1JUIiwiUFJfTE9ORyIsIlNJREVfUEFORUxfSU5JVElBTF9TVEFURSIsIlRJVExFIiwiRElEX1lPVV9LTk9XIiwiQ0JHX0RFRklOSVRJT04iLCJTSURFX1BBTkVMX0NCR19JTkZPIiwiQ0VOU1VTX0JMT0NLX0dST1VQIiwiQ09VTlRZIiwiU1RBVEUiLCJQT1BVTEFUSU9OIiwiQ09NTVVOSVRZIiwiT0ZfRk9DVVMiLCJOT1RfT0ZfRk9DVVMiLCJTSURFX1BBTkVMX0lORElDQVRPUlMiLCJJTkRJQ0FUT1JfQ09MVU1OX0hFQURFUiIsIlBFUkNFTlRJTEVfQ09MVU1OX0hFQURFUiIsIlBPVkVSVFkiLCJBUkVBX01FRElBTl9JTkNPTUUiLCJFRFVDQVRJT04iLCJBU1RITUEiLCJESUFCRVRFUyIsIkRJRVNFTF9QQVJUSUNVTEFURV9NQVRURVIiLCJFTkVSR1lfQlVSREVOIiwiRkVNQV9SSVNLIiwiSEVBUlRfRElTRUFTRSIsIkhPVVNFX0JVUkRFTiIsIkxFQURfUEFJTlQiLCJMSUZFX0VYUEVDVCIsIlBNXzJfNSIsIlRSQUZGSUNfVk9MVU1FIiwiV0FTVEVfV0FURVIiLCJTSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTiIsIkRPV05MT0FEX0RSQUZUIiwiUEFSQUdSQVBIXzEiLCJkb3dubG9hZERyYWZ0IiwiTUVUSE9ET0xPR1lfQ09QWSIsImRhdGVVcGRhdGVkIiwiUEFSQUdSQVBIXzIiLCJkb3dubG9hZEZpbGVTaXplIiwiSE9XX1lPVV9DQU5fSEVMUF9MSVNUX0lURU1TIiwiSEVBRElORyIsIkxJU1RfSVRFTV8xIiwicnhFbWFpbEZyb21Zb3UiLCJDT05UQUNUX0NPUFkiLCJMSVNUX0lURU1fMiIsImRhdGFNZXRoIiwiTElTVF9JVEVNXzMiLCJzaGFyZUZlZWRiYWNrIiwiSG93WW91Q2FuSGVscCIsInN0eWxlcyIsIkVYUExPUkVfQ09QWSIsIlRlcnJpdG9yeUZvY3VzQ29udHJvbCIsIm9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbiIsImludGwiLCJ1c2VJbnRsIiwidXNlTWFwQ29udHJvbCIsIm9uQ2xpY2siLCJjb250YWluZXJSZWYiLCJ0ZXJyaXRvcmllcyIsInNob3J0IiwiZm9ybWF0TWVzc2FnZSIsImxvbmciLCJ0ZXJyaXRvcmllc0ljb25DbGFzc05hbWUiLCJtYXAiLCJ0ZXJyaXRvcnkiLCJpbmRleCIsIk1hcEludHJvZHVjdGlvbiIsImxpZ2h0YnVsYkljb24iLCJYWVpfU1VGRklYIiwiZmVhdHVyZVVSTEZvclRpbGVzZXROYW1lIiwidGlsZXNldE5hbWUiLCJmZWF0dXJlVGlsZUJhc2VVUkwiLCJwcm9jZXNzIiwiam9pbiIsIkZFQVRVUkVfVElMRV9ISUdIX1pPT01fVVJMIiwiRkVBVFVSRV9USUxFX0xPV19aT09NX1VSTCIsIlBFUkZPUk1BTkNFX01BUktFUl9NQVBfSURMRSIsIlNDT1JFX1BST1BFUlRZX0hJR0giLCJTQ09SRV9QUk9QRVJUWV9MT1ciLCJHRU9JRF9QUk9QRVJUWSIsIkhJR0hfU0NPUkVfU09VUkNFX05BTUUiLCJISUdIX1NDT1JFX0xBWUVSX05BTUUiLCJMT1dfU0NPUkVfU09VUkNFX05BTUUiLCJMT1dfU0NPUkVfTEFZRVJfTkFNRSIsIlNFTEVDVEVEX1BST1BFUlRZIiwiQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfSElHSExJR0hUX0xBWUVSX05BTUUiLCJCTE9DS19HUk9VUF9CT1VOREFSWV9MQVlFUl9OQU1FIiwiUE9WRVJUWV9QUk9QRVJUWV9QRVJDRU5USUxFIiwiSE9VU0lOR19CVVJERU5fUFJPUEVSVFlfUEVSQ0VOVElMRSIsIkxJTkdVSVNUSUNfSVNPTEFUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEUiLCJVTkVNUExPWU1FTlRfUFJPUEVSVFlfUEVSQ0VOVElMRSIsIlRPVEFMX1BPUFVMQVRJT04iLCJFRFVDQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRSIsIkNPVU5UWV9OQU1FIiwiU1RBVEVfTkFNRSIsIkRJQUJFVEVTX1BFUkNFTlRJTEUiLCJBU1RITUFfUEVSQ0VOVElMRSIsIkhFQVJUX1BFUkNFTlRJTEUiLCJMSUZFX1BFUkNFTlRJTEUiLCJUUkFGRklDX1BFUkNFTlRJTEUiLCJGRU1BX1BFUkNFTlRJTEUiLCJFTkVSR1lfUEVSQ0VOVElMRSIsIldBU1RFV0FURVJfUEVSQ0VOVElMRSIsIkxFQURfUEFJTlRfUEVSQ0VOVElMRSIsIkRJRVNFTF9NQVRURVJfUEVSQ0VOVElMRSIsIlBNMjVfUEVSQ0VOVElMRSIsIlNDT1JFX1NPVVJDRV9MQVlFUiIsIkdMT0JBTF9NSU5fWk9PTSIsIkdMT0JBTF9NQVhfWk9PTSIsIkdMT0JBTF9NSU5fWk9PTV9MT1ciLCJHTE9CQUxfTUFYX1pPT01fTE9XIiwiR0xPQkFMX01JTl9aT09NX0hJR0hMSUdIVCIsIkdMT0JBTF9NQVhfWk9PTV9ISUdITElHSFQiLCJHTE9CQUxfTUlOX1pPT01fSElHSCIsIkdMT0JBTF9NQVhfWk9PTV9ISUdIIiwiR0xPQkFMX01BWF9CT1VORFMiLCJMT1dFUl80OF9CT1VORFMiLCJBTEFTS0FfQk9VTkRTIiwiSEFXQUlJX0JPVU5EUyIsIlBVRVJUT19SSUNPX0JPVU5EUyIsIkdVQU1fQk9VTkRTIiwiTUFSSUFOQV9JU0xBTkRfQk9VTkRTIiwiQU1FUklDQU5fU0FNT0FfQk9VTkRTIiwiREVGQVVMVF9DRU5URVIiLCJERUZBVUxUX0xBWUVSX09QQUNJVFkiLCJERUZBVUxUX09VVExJTkVfQ09MT1IiLCJNSU5fQ09MT1IiLCJNRURfQ09MT1IiLCJNQVhfQ09MT1IiLCJCT1JERVJfSElHSExJR0hUX0NPTE9SIiwiQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfT1BBQ0lUWSIsIkhJR0hMSUdIVF9CT1JERVJfV0lEVEgiLCJDVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9MQVlFUl9XSURUSCIsIlNDT1JFX0JPVU5EQVJZX0xPVyIsIlNDT1JFX0JPVU5EQVJZX1RIUkVTSE9MRCIsIlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEIiwiaXNNb2JpbGUiLCJpc01vYmlsZVJlYWN0RGV2aWNlRGV0ZWN0IiwicmVhZGFibGVQZXJjZW50aWxlIiwicGVyY2VudGlsZSIsIk1hdGgiLCJyb3VuZCIsImdldFN1cGVyc2NyaXB0T3JkaW5hbCIsImVuZ2xpc2hPcmRpbmFsUnVsZXMiLCJJbnRsIiwiUGx1cmFsUnVsZXMiLCJ0eXBlIiwic3VmZml4ZXMiLCJ6ZXJvIiwib25lIiwidHdvIiwiZmV3IiwibWFueSIsIm90aGVyIiwic2VsZWN0IiwiQXJlYURldGFpbCIsInByb3BlcnRpZXMiLCJSZWFjdCIsImlzQ29tbXVuaXR5Rm9jdXMiLCJzZXRJc0NvbW11bml0eUZvY3VzIiwic2NvcmUiLCJjb25zdGFudHMiLCJibG9ja0dyb3VwIiwicG9wdWxhdGlvbiIsImNvdW50eU5hbWUiLCJzdGF0ZU5hbWUiLCJ1c2VFZmZlY3QiLCJhcmVhTWVkaWFuSW5jb21lIiwibGFiZWwiLCJ2YWx1ZSIsImVkdUluZm8iLCJwb3ZlcnR5IiwiYXN0aG1hIiwiZGlhYmV0ZXMiLCJkaWVzZWxQYXJ0TWF0dGVyIiwibGlmZUV4cGVjdCIsImVuZXJneUJ1cmRlbiIsInBtMjUiLCJsZWFkUGFpbnQiLCJ0cmFmZmljVm9sdW1lIiwid2FzdGVXYXRlciIsImZlbWFSaXNrIiwiaGVhcnREaXNlYXNlIiwiaG91c2VCdXJkZW4iLCJpbmRpY2F0b3JzIiwiYWRkaXRpb25hbEluZGljYXRvcnMiLCJ0b0xvY2FsZVN0cmluZyIsImluZGljYXRvciIsIk1hcEluZm9QYW5lbCIsImNsYXNzTmFtZSIsImZlYXR1cmVQcm9wZXJ0aWVzIiwic2VsZWN0ZWRGZWF0dXJlSWQiLCJoZXhUb0hTTEEiLCJoZXgiLCJhbHBoYSIsImNocm9tYSIsImNzcyIsIm1ha2VQYWludCIsImZpZWxkIiwibWluUmFtcCIsIm1lZFJhbXAiLCJtYXhSYW1wIiwicGFpbnREZXNjcmlwdG9yIiwiaW1hZ2VTdWZmaXgiLCJtYWtlTWFwU3R5bGUiLCJmbGFnQ29udGFpbmVyIiwiSjQwTWFwIiwibG9jYXRpb24iLCJoYXNoIiwic2xpY2UiLCJzcGxpdCIsInpvb20iLCJsYXQiLCJsbmciLCJ1c2VTdGF0ZSIsImxhdGl0dWRlIiwicGFyc2VGbG9hdCIsImxvbmdpdHVkZSIsInZpZXdwb3J0Iiwic2V0Vmlld3BvcnQiLCJzZWxlY3RlZEZlYXR1cmUiLCJzZXRTZWxlY3RlZEZlYXR1cmUiLCJkZXRhaWxWaWV3RGF0YSIsInNldERldGFpbFZpZXdEYXRhIiwidHJhbnNpdGlvbkluUHJvZ3Jlc3MiLCJzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzcyIsImdlb2xvY2F0aW9uSW5Qcm9ncmVzcyIsInNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzcyIsImlzTW9iaWxlTWFwU3RhdGUiLCJzZXRJc01vYmlsZU1hcFN0YXRlIiwidXNlV2luZG93U2l6ZSIsIndpbmRvd1dpZHRoIiwid2lkdGgiLCJtYXBSZWYiLCJ1c2VSZWYiLCJmbGFncyIsInVzZUZsYWdzIiwiZmlsdGVyIiwidXNlTWVtbyIsImV2ZW50IiwiZmVhdHVyZSIsImZlYXR1cmVzIiwiYmJveCIsIm1pbkxuZyIsIm1pbkxhdCIsIm1heExuZyIsIm1heExhdCIsIm5ld1ZpZXdQb3J0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsImhlaWdodCIsImZpdEJvdW5kcyIsInBhZGRpbmciLCJ1bmRlZmluZWQiLCJwb3B1cEluZm8iLCJnb1RvUGxhY2UiLCJvbkxvYWQiLCJ3aW5kb3ciLCJDeXByZXNzIiwiY3VycmVudCIsInVuZGVybHlpbmdNYXAiLCJnZXRNYXAiLCJib3VuZHMiLCJvZmZzZXQiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJ0cmFuc2l0aW9uSW50ZXJwb2xhdG9yIiwiRmx5VG9JbnRlcnBvbGF0b3IiLCJ0cmFuc2l0aW9uRWFzaW5nIiwiZDMiLCJzdG9wUHJvcGFnYXRpb24iLCJidXR0b25JRCIsInRhcmdldCIsIm9uVHJhbnNpdGlvblN0YXJ0Iiwib25UcmFuc2l0aW9uRW5kIiwib25HZW9sb2NhdGUiLCJvbkNsaWNrR2VvbG9jYXRlIiwiY29sIiwiZW5hYmxlSGlnaEFjY3VyYWN5IiwiTWFwV3JhcHBlciIsIk1hcExlZ2VuZCIsIkNFSlNUUGFnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPO0FBQ0E7QUFDQSx1Rjs7Ozs7Ozs7QUNLQSxHQUFNQSxXQUFVLENBQUdDLHlDQUFjLENBQUMsQ0FDdkNDLFNBQVMsQ0FBRSxDQUNUQyxFQUFFLENBQUUsd0JBREssQ0FFVEMsY0FBYyxDQUFFLGtCQUZQLENBR1RDLFdBQVcsQ0FBRSw2QkFISixDQUQ0QixDQU12Q0MsWUFBWSxDQUFFLENBQ1pILEVBQUUsQ0FBRSwwQkFEUSxDQUVaQyxjQUFjLENBQUUsa0JBRkosQ0FHWkMsV0FBVyxDQUFFLCtCQUhELENBTnlCLENBQUQsQ0FBakMsQ0FhQSxHQUFNRSxpQkFBZ0IsY0FBRyxvQkFBQyxtQ0FBRCxFQUM5QixFQUFFLENBQUUsOEJBRDBCLENBRTlCLGNBQWMsc1ZBRmdCLENBUzlCLFdBQVcsQ0FBRSxrQkFUaUIsQ0FVOUIsTUFBTSxDQUFFLENBQ05DLGVBQWUsY0FBRSxvQkFBQyx1QkFBRCxFQUFNLEVBQUUsQ0FBRSxjQUFWLHVCQURYLENBVnNCLEVBQXpCLENBZUEsR0FBTUMsT0FBTSxDQUFHUix5Q0FBYyxDQUFDLENBQ25DUyxjQUFjLENBQUUsQ0FDZFAsRUFBRSxDQUFFLDRCQURVLENBRWRDLGNBQWMsQ0FBRSwwQkFGRixDQUdkQyxXQUFXLENBQUUsK0NBSEMsQ0FEbUIsQ0FNbkNNLGlCQUFpQixDQUFFLENBQ2pCUixFQUFFLENBQUUsNkJBRGEsQ0FFakJDLGNBQWMsQ0FBRSxtRUFDZCx1RkFIZSxDQUlqQkMsV0FBVyxDQUFFLDZDQUpJLENBTmdCLENBQUQsQ0FBN0IsQ0FlUDtBQUNPLEdBQU1PLElBQUcsQ0FBR1gseUNBQWMsQ0FBQyxDQUNo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QUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsT0FBTztBQUNwQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFVBQUs7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE1BQU07QUFDakIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQixZQUFZLGFBQWE7QUFDekIsWUFBWSxLQUFLO0FBQ2pCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQixZQUFZLGFBQWE7QUFDekIsWUFBWSxLQUFLO0FBQ2pCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksS0FBSztBQUNqQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsTUFBTTtBQUNqQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE1BQU07QUFDakIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEI7QUFDQSxhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FB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QURGLENBREYsQ0FERixDQXpCTSxDQUFSLENBbUNELENBekNELENBMkNBLDBDQUFld0UsU0FBZiIsImZpbGUiOiIxMzE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGhvd1lvdUNhbkhlbHBDb250YWluZXIgPSBcImhvd1lvdUNhbkhlbHAtbW9kdWxlLS1ob3dZb3VDYW5IZWxwQ29udGFpbmVyLS0zd2Nvd1wiO1xuZXhwb3J0IHZhciBob3dZb3VDYW5IZWxwTGlzdCA9IFwiaG93WW91Q2FuSGVscC1tb2R1bGUtLWhvd1lvdUNhbkhlbHBMaXN0LS0zd3lGdlwiO1xuZXhwb3J0IHZhciBob3dZb3VDYW5IZWxwTGlzdFdyYXBwZXIgPSBcImhvd1lvdUNhbkhlbHAtbW9kdWxlLS1ob3dZb3VDYW5IZWxwTGlzdFdyYXBwZXItLUJMN0FEXCI7IiwiXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2UsIExpbmt9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCAqIGFzIENPTlRBQ1RfQ09QWSBmcm9tICcuL2NvbnRhY3QnO1xuaW1wb3J0ICogYXMgTUVUSE9ET0xPR1lfQ09QWSBmcm9tICcuL21ldGhvZG9sb2d5JztcblxuZXhwb3J0IGNvbnN0IFBBR0VfSU5UUk8gPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFBBR0VfVElMRToge1xuICAgIGlkOiAnZXhwbG9yZVRvb2wudGl0bGUudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFeHBsb3JlIHRoZSB0b29sJyxcbiAgICBkZXNjcmlwdGlvbjogJ2V4cGxvcmUgdGhlIHRvb2wgdGl0bGUgdGV4dCcsXG4gIH0sXG4gIFBBR0VfSEVBRElORzoge1xuICAgIGlkOiAnZXhwbG9yZVRvb2wuaGVhZGluZy50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGxvcmUgdGhlIHRvb2wnLFxuICAgIGRlc2NyaXB0aW9uOiAnZXhwbG9yZSB0aGUgdG9vbCBoZWFkaW5nIHRleHQnLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBQQUdFX0RFU0NSSVBUSU9OID0gPEZvcm1hdHRlZE1lc3NhZ2VcbiAgaWQ9eydleHBsb3JlVG9vbC5wYWdlLmRlc2NyaXB0aW9uJ31cbiAgZGVmYXVsdE1lc3NhZ2U9e1xuICAgIGBab29tIGludG8gdGhlIG1hcCB0byBzZWUgY29tbXVuaXRpZXMgb2YgZm9jdXMgdGhhdCBjYW4gaGVscCBGZWRlcmFsIGFnZW5jaWVzXG4gIGlkZW50aWZ5IGRpc2FkdmFudGFnZWQgY29tbXVuaXRpZXMgYW5kIHRvIHByb3ZpZGUgc29jaW9lY29ub21pYyxcbiAgZW52aXJvbm1lbnRhbCwgYW5kIGNsaW1hdGUgaW5mb3JtYXRpb24gYW5kIGRhdGEuIExlYXJuIG1vcmUgYWJvdXQgdGhlIG1ldGhvZG9sb2d5XG4gIGFuZCBkYXRhc2V0cyB0aGF0IHdlcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlc2UgY29tbXVuaXRpZXMgb2YgZm9jdXMgb24gdGhlXG4gICAge21ldGhvZG9sb2d5TGlua31cbiAgcGFnZS5gfVxuICBkZXNjcmlwdGlvbj17J3BhZ2UgZGVzY3JpcHRpb24nfVxuICB2YWx1ZXM9e3tcbiAgICBtZXRob2RvbG9neUxpbms6IDxMaW5rIHRvPXsnL21ldGhvZG9sb2d5J30+RGF0YSAmIG1ldGhvZG9sb2d5PC9MaW5rPixcbiAgfX1cbi8+O1xuXG5leHBvcnQgY29uc3QgTEVHRU5EID0gZGVmaW5lTWVzc2FnZXMoe1xuICBQUklPUklUWV9MQUJFTDoge1xuICAgIGlkOiAnbGVnZW5kLmluZm8ucHJpb3JpdHkubGFiZWwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRHJhZnQgY29tbXVuaXR5IG9mIGZvY3VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ3RoZSBsYWJlbCBvZiB0aGUgcHJpb3JpdGl6ZWQgY29tbXVuaXR5IGxlZ2VuZCcsXG4gIH0sXG4gIFBSSU9SSVRZX0RFU0NSSVBUOiB7XG4gICAgaWQ6ICdsZWdlbmQuaW5mby50aHJlc2hvbGQubGFiZWwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQSBjb21tdW5pdHkgaWRlbnRpZmllZCBhcyBleHBlcmllbmNpbmcgZGlzYWR2YW50YWdlcyB0aGF0IG1lcml0cycgK1xuICAgICAgJyB0aGUgZm9jdXMgb2YgY2VydGFpbiBGZWRlcmFsIGludmVzdG1lbnRzLCBpbmNsdWRpbmcgdGhyb3VnaCB0aGUgSnVzdGljZTQwIEluaXRpYXRpdmUnLFxuICAgIGRlc2NyaXB0aW9uOiAndGhlIGxhYmVsIG9mIHRoZSB0aHJlc2hvbGQgY29tbXVuaXR5IGxlZ2VuZCcsXG4gIH0sXG59KTtcblxuXG4vLyBNYXBcbmV4cG9ydCBjb25zdCBNQVAgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFpPT01fV0FSTklORzoge1xuICAgIGlkOiAnbWFwLnpvb20ud2FybmluZycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdab29tIGluIHRvIHRoZSBzdGF0ZSBvciByZWdpb25hbCBsZXZlbCB0byBzZWUgcHJpb3JpdGl6ZWQgY29tbXVuaXRpZXMgb24gdGhlIG1hcC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnem9vbSB3YXJuaW5nIG9uIG1hcCcsXG4gIH0sXG4gIExPV0VSNDhfU0hPUlQ6IHtcbiAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5sb3dlcjQ4LnNob3J0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJzQ4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBhYmJyZXZpYXRlZCBuYW1lIGluZGljYXRpbmcgdGhlIGJvdW5kcyBvZiB0aGUgTG93ZXIgNDggc3RhdGVzJyxcbiAgfSxcbiAgTE9XRVI0OF9MT05HOiB7XG4gICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMubG93ZXI0OC5sb25nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0xvd2VyIDQ4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBsb25nZXIgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgdGhlIExvd2VyIDQ4IHN0YXRlcycsXG4gIH0sXG4gIEFMQVNLQV9TSE9SVDoge1xuICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLmFsYXNrYS5zaG9ydCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBSycsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEFsYXNrYScsXG4gIH0sXG4gIEFMQVNLQV9MT05HOiB7XG4gICAgaWQ6ICdtYXAudGVycml0b3J5Rm9jdXMuYWxhc2thLmxvbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQWxhc2thJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIEFsYXNrYScsXG4gIH0sXG4gIEhBV0FJSV9TSE9SVDoge1xuICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLmhhd2FpaS5zaG9ydCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdISScsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgYWJicmV2aWF0ZWQgbmFtZSBpbmRpY2F0aW5nIHRoZSBib3VuZHMgb2YgSGF3YWlpJyxcbiAgfSxcbiAgSEFXQUlJX0xPTkc6IHtcbiAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5oYXdhaWkubG9uZycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdIYXdhaWknLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGxvbmdlciBuYW1lIGluZGljYXRpbmcgdGhlIGJvdW5kcyBvZiBIYXdhaWknLFxuICB9LFxuICBQUl9TSE9SVDoge1xuICAgIGlkOiAnbWFwLnRlcnJpdG9yeUZvY3VzLnB1ZXJ0b19yaWNvLnNob3J0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1BSJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBhYmJyZXZpYXRlZCBuYW1lIGluZGljYXRpbmcgdGhlIGJvdW5kcyBvZiBQdWVydG8gUmljbycsXG4gIH0sXG4gIFBSX0xPTkc6IHtcbiAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5wdWVydG9fcmljby5sb25nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1B1ZXJ0byBSaWNvJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBmdWxsIG5hbWUgaW5kaWNhdGluZyB0aGUgYm91bmRzIG9mIFB1ZXJ0byBSaWNvJyxcbiAgfSxcbn0pO1xuXG4vLyBTaWRlIFBhbmVsIGNvcHlcbmV4cG9ydCBjb25zdCBTSURFX1BBTkVMX0lOSVRJQUxfU1RBVEUgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFRJVExFOiB7XG4gICAgaWQ6ICdtYXBJbnRyby5tYXBJbnRyb0hlYWRlcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdab29tIGFuZCBzZWxlY3QgYSBjZW5zdXMgYmxvY2sgZ3JvdXAgdG8gdmlldyBkYXRhJyxcbiAgICBkZXNjcmlwdGlvbjogJ2ludHJvZHVjdG9yeSB0ZXh0IG9mIHdheXMgdG8gdXNlIHRoZSBtYXAnLFxuICB9LFxuICBESURfWU9VX0tOT1c6IHtcbiAgICBpZDogJ21hcEludHJvLmRpZFlvdUtub3cnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnIERpZCB5b3Uga25vdz8nLFxuICAgIGRlc2NyaXB0aW9uOiAndGV4dCBwcm9tcHRpbmcgYSBjaXRlIHBhcmFncmFwaCcsXG4gIH0sXG4gIENCR19ERUZJTklUSU9OOiB7XG4gICAgaWQ6ICdtYXBJbnRyby5jZW5zdXNCbG9ja0dyb3VwRGVmaW5pdGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBIGNlbnN1cyBibG9jayBncm91cCBpcyBnZW5lcmFsbHkgYmV0d2VlbiA2MDAgYW5kIDMsMDAwIHBlb3BsZS4gJyArXG4gICAgJ0l0IGlzIHRoZSBzbWFsbGVzdCBnZW9ncmFwaGljYWwgdW5pdCBmb3Igd2hpY2ggdGhlIFUuUy4gQ2Vuc3VzICcgK1xuICAgICdCdXJlYXUgcHVibGlzaGVzIHNhbXBsZSBkYXRhLicsXG4gICAgZGVzY3JpcHRpb246ICdjaXRlcyB0aGUgZGVmaW5pdGlvbiBhbmQgaGVscGZ1bCBpbmZvcm1hdGlvbiBhYm91dCBjZW5zdXMgZ3JvdXBzJyxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0lERV9QQU5FTF9DQkdfSU5GTyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgQ0VOU1VTX0JMT0NLX0dST1VQOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLmNlbnN1c0Jsb2NrR3JvdXAnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2Vuc3VzIGJsb2NrIGdyb3VwOicsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGlkIG51bWJlciBvZiB0aGUgZmVhdHVyZSBzZWxlY3RlZCcsXG4gIH0sXG4gIENPVU5UWToge1xuICAgIGlkOiAnYXJlYURldGFpbC5nZW9ncmFwaGljSW5mby5jb3VudHknLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ291bnR5OicsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgY291bnR5IG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgfSxcbiAgU1RBVEU6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuZ2VvZ3JhcGhpY0luZm8uc3RhdGUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RhdGU6ICcsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICB9LFxuICBQT1BVTEFUSU9OOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmdlb2dyYXBoaWNJbmZvLnBvcHVsYXRpb24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUG9wdWxhdGlvbjonLFxuICAgIGRlc2NyaXB0aW9uOiAndGhlIHBvcHVsYXRpb24gb2YgdGhlIGZlYXR1cmUgc2VsZWN0ZWQnLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBDT01NVU5JVFkgPSB7XG4gIE9GX0ZPQ1VTOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsnYXJlYURldGFpbC5jYXRlZ29yaXphdGlvbi5jb21tdW5pdHkub2YuZm9jdXMnfVxuICAgIGRlZmF1bHRNZXNzYWdlPXsgJ0NvbW11bml0eSBvZiBmb2N1cyd9XG4gICAgZGVzY3JpcHRpb249eyd0aGUgY29tbXVuaXRpZXMgdGhlIHNjb3JlIGN1cnJlbnRseSBpcyBmb2N1c2VkIG9uJ31cbiAgLz4sXG4gIE5PVF9PRl9GT0NVUzogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD0geydhcmVhRGV0YWlsLmNhdGVnb3JpemF0aW9uLm5vdC5jb21tdW5pdHkub2YuZm9jdXMnfVxuICAgIGRlZmF1bHRNZXNzYWdlPSB7J05vdCBhIGNvbW11bml0eSBvZiBmb2N1cyd9XG4gICAgZGVzY3JpcHRpb249IHsndGhlIGNvbW11bml0aWVzIHRoZSBzY29yZSBjdXJyZW50bHkgaXMgbm90IGZvY3VzZWQgb24nfVxuICAvPixcbn07XG5cbmV4cG9ydCBjb25zdCBTSURFX1BBTkVMX0lORElDQVRPUlMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIElORElDQVRPUl9DT0xVTU5fSEVBREVSOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvcnMuaW5kaWNhdG9yQ29sdW1uSGVhZGVyJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0luZGljYXRvcicsXG4gICAgZGVzY3JpcHRpb246ICd0aGUgcG9wdWxhdGlvbiBvZiB0aGUgZmVhdHVyZSBzZWxlY3RlZCcsXG4gIH0sXG4gIFBFUkNFTlRJTEVfQ09MVU1OX0hFQURFUjoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3JzLnBlcmNlbnRpbGVDb2x1bW5IZWFkZXInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUGVyY2VudGlsZSAoMC0xMDApJyxcbiAgICBkZXNjcmlwdGlvbjogJ3RoZSBwb3B1bGF0aW9uIG9mIHRoZSBmZWF0dXJlIHNlbGVjdGVkJyxcbiAgfSxcbiAgUE9WRVJUWToge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IucG92ZXJ0eScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdQb3ZlcnR5JyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZCBpbmNvbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHR3aWNlIHRoZSBmZWRlcmFsIFwicG92ZXJ0eSBsZXZlbFwiJyxcbiAgfSxcbiAgQVJFQV9NRURJQU5fSU5DT01FOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5hcmVhTWVkaWFuSW5jb21lJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0FyZWEgTWVkaWFuIEluY29tZScsXG4gICAgZGVzY3JpcHRpb246ICdjYWxjdWxhdGVkIGFzIHBlcmNlbnQgb2YgdGhlIGFyZWEgbWVkaWFuIGluY29tZScsXG4gIH0sXG4gIEVEVUNBVElPTjoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZWR1Y2F0aW9uJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0VkdWNhdGlvbiwgbGVzcyB0aGFuIGhpZ2ggc2Nob29sJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgcGVvcGxlIGFnZSAyNSBvciBvbGRlciB0aGF0IGRpZG7igJl0IGdldCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEnLFxuICB9LFxuICBBU1RITUE6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmFzdGhtYScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBc3RobWEnLFxuICAgIGRlc2NyaXB0aW9uOiAnaGF2ZSBhc3RobWEgb3IgYmVlbiBkaWFnbm9zZWQgYnkgYSBkb2N0b3IgdG8gaGF2ZSBhc3RobWEnLFxuICB9LFxuICBESUFCRVRFUzoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZGlhYmV0ZXMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGlhYmV0ZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnZGlhYmV0ZXMgZnJvbSBkciBvciBudXJzZScsXG4gIH0sXG4gIERJRVNFTF9QQVJUSUNVTEFURV9NQVRURVI6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRpZXNlbFBhcnRNYXR0ZXInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGllc2VsIHBhcnRpY3VsYXRlIG1hdHRlcicsXG4gICAgZGVzY3JpcHRpb246ICdEaWVzZWwgcGFydGljdWxhdGUgbWF0dGVyIGxldmVsIGluIGFpcicsXG4gIH0sXG4gIEVORVJHWV9CVVJERU46IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmVuZXJneUJ1cmRlbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFbmVyZ3kgYnVyZGVuJyxcbiAgICBkZXNjcmlwdGlvbjogJ0F2ZXJhZ2UgYW5udWFsIGVuZXJneSBjb3N0ICgkKSBkaXZpZGVkIGJ5IGhvdXNlaG9sZCBpbmNvbWUnLFxuICB9LFxuICBGRU1BX1JJU0s6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmZlbWFSaXNrJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0ZFTUEgUmlzayBJbmRleCcsXG4gICAgZGVzY3JpcHRpb246ICdSaXNrIGJhc2VkIG9uIDE4IG5hdHVyYWwgaGF6YXJkIHR5cGVzLCBpbiBhZGRpdGlvbiB0byBhICcrXG4gICAgICAnY29tbXVuaXR5XFwncyBzb2NpYWwgdnVsbmVyYWJpbGl0eSBhbmQgY29tbXVuaXR5IHJlc2lsaWVuY2UnLFxuICB9LFxuICBIRUFSVF9ESVNFQVNFOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5oZWFydERpc2Vhc2UnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSGVhcnQgZGlzZWFzZScsXG4gICAgZGVzY3JpcHRpb246ICdQZW9wbGUgYWdlcyAxOCBhbmQgdXAgd2hvIHJlcG9ydCBldmVyIGhhdmluZyBiZWVuIHRvbGQgYnkgYScgK1xuICAgICAgJ2RvY3RvciwgbnVyc2UsIG9yIG90aGVyIGhlYWx0aCBwcm9mZXNzaW9uYWxzIHRoYXQgdGhleSBoYWQgYW5naW5hIG9yIGNvcm9uYXJ5IGhlYXJ0IGRpc2Vhc2UnLFxuICB9LFxuICBIT1VTRV9CVVJERU46IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmhvdXNlQnVyZGVuJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0hvdXNpbmcgY29zdCBidXJkZW4nLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVvcGxlIGFnZXMgMTggYW5kIHVwIHdobyByZXBvcnQgaGF2aW5nIGJlZW4gdG9sZCBieSBhIGRvY3RvciwnICtcbiAgICAgICcgbnVyc2UsIG9yIG90aGVyIGhlYWx0aCBwcm9mZXNzaW9uYWxzIHRoYXQgdGhleSBoYXZlIGRpYWJldGVzIG90aGVyIHRoYW4gZGlhYmV0ZXMgZHVyaW5nIHByZWduYW5jeScsXG4gIH0sXG4gIExFQURfUEFJTlQ6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmxlYWRQYWludCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMZWFkIHBhaW50JyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdXNpbmcgdW5pdHMgYnVpbHQgcHJlLTE5NjAsIHVzZWQgYXMgYW4gaW5kaWNhdG9yIG9mIHBvdGVudGlhbCcrXG4gICAgICAnIGxlYWQgcGFpbnQgZXhwb3N1cmUgaW4gaG9tZXMnLFxuICB9LFxuICBMSUZFX0VYUEVDVDoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IubGlmZUV4cGVjdCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMaWZlIGV4cGVjdGFuY3knLFxuICAgIGRlc2NyaXB0aW9uOiAnRXN0aW1hdGVkIHllYXJzIG9mIGxpZmUgZXhwZWN0YW5jeScsXG4gIH0sXG4gIFBNXzJfNToge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IucG0yNScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdQTTIuNScsXG4gICAgZGVzY3JpcHRpb246ICdGaW5lIGluaGFsYWJsZSBwYXJ0aWNsZXMsIHdpdGggZGlhbWV0ZXJzIHRoYXQgYXJlIGdlbmVyYWxseSAyLjUgbWljcm9tZXRlcnMgYW5kIHNtYWxsZXInLFxuICB9LFxuICBUUkFGRklDX1ZPTFVNRToge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IudHJhZmZpY1ZvbHVtZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUcmFmZmljIHByb3hpbWl0eSBhbmQgdm9sdW1lJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvdW50IG9mIHZlaGljbGVzIChhdmVyYWdlIGFubnVhbCBkYWlseSB0cmFmZmljKSBhdCBtYWpvciByb2FkcyB3aXRoaW4gNTAwIG1ldGVycywnICtcbiAgICAgICcgZGl2aWRlZCBieSBkaXN0YW5jZSBpbiBtZXRlcnMnLFxuICB9LFxuICBXQVNURV9XQVRFUjoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3Iud2FzdGVXYXRlcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdXYXN0ZXdhdGVyIGRpc2NoYXJnZScsXG4gICAgZGVzY3JpcHRpb246ICdUb3hpYyBjb25jZW50cmF0aW9ucyBhdCBzdHJlYW0gc2VnbWVudHMgd2l0aGluIDUwMCBtZXRlcnMgZGl2aWRlZCBieSBkaXN0YW5jZSBpbicgK1xuICAgICAgJyBraWxvbWV0ZXJzJyxcbiAgfSxcbn0pO1xuXG5cbmV4cG9ydCBjb25zdCBTSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTiA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgQVJFQV9NRURJQU5fSU5DT01FOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5kZXNjcmlwdGlvbi5hcmVhX21lZGlhbl9pbmNvbWUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTWVkaWFuIGluY29tZSBvZiB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IG9mIHRoZSBtZXRyb3BvbGl0YW4nK1xuICAgICAgICAnIGFyZWHigJlzIG9yIHN0YXRlXFwncyBtZWRpYW4gaW5jb21lJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lZGlhbiBpbmNvbWUgb2YgdGhlIGNlbnN1cyBibG9jayBncm91cCBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudCBvZiB0aGUgbWV0cm9wb2xpdGFuJytcbiAgICAnIGFyZWHigJlzIG9yIHN0YXRlXFwncyBtZWRpYW4gaW5jb21lJyxcbiAgfSxcbiAgRURVQ0FUSU9OOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5kZXNjcmlwdGlvbi5lZHVjYXRpb24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUGVyY2VudCBvZiBwZW9wbGUgYWdlIDI1IG9yIG9sZGVyIHRoYXQgZGlkbuKAmXQgZ2V0IGEgaGlnaCBzY2hvb2wgZGlwbG9tYScsXG4gICAgZGVzY3JpcHRpb246ICdQZXJjZW50IG9mIHBlb3BsZSBhZ2UgMjUgb3Igb2xkZXIgdGhhdCBkaWRu4oCZdCBnZXQgYSBoaWdoIHNjaG9vbCBkaXBsb21hJyxcbiAgfSxcbiAgUE9WRVJUWToge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZGVzY3JpcHRpb24ucG92ZXJ0eScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdQZXJjZW50IG9mIGEgYmxvY2sgZ3JvdXBcXCdzIHBvcHVsYXRpb24gaW4gaG91c2Vob2xkcyB3aGVyZSB0aGUgaG91c2Vob2xkIGluY29tZScgK1xuICAgICcgaXMgYXQgb3IgYmVsb3cgMTAwJSBvZiB0aGUgZmVkZXJhbCBwb3ZlcnR5IGxldmVsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgYSBibG9jayBncm91cFxcJ3MgcG9wdWxhdGlvbiBpbiBob3VzZWhvbGRzIHdoZXJlIHRoZSBob3VzZWhvbGQgaW5jb21lJyArXG4gICAgJyBpcyBhdCBvciBiZWxvdyAxMDAlIG9mIHRoZSBmZWRlcmFsIHBvdmVydHkgbGV2ZWwnLFxuICB9LFxuICBBU1RITUE6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLmFzdGhtYScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdQZW9wbGUgd2hvIGFuc3dlciDigJx5ZXPigJ0gdG8gYm90aCBvZiB0aGUgcXVlc3Rpb25zOiDigJxIYXZlIHlvdSBldmVyIGJlZW4gdG9sZCBieScgK1xuICAgICcgYSBkb2N0b3IgbnVyc2UsIG9yIG90aGVyIGhlYWx0aCBwcm9mZXNzaW9uYWwgdGhhdCB5b3UgaGF2ZSBhc3RobWE/4oCdIGFuZCDigJxEbyB5b3Ugc3RpbGwgaGF2ZSBhc3RobWE/XCInLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVvcGxlIHdobyBhbnN3ZXIg4oCceWVz4oCdIHRvIGJvdGggb2YgdGhlIHF1ZXN0aW9uczog4oCcSGF2ZSB5b3UgZXZlciBiZWVuIHRvbGQgYnknICtcbiAgICAnIGEgZG9jdG9yIG51cnNlLCBvciBvdGhlciBoZWFsdGggcHJvZmVzc2lvbmFsIHRoYXQgeW91IGhhdmUgYXN0aG1hP+KAnSBhbmQg4oCcRG8geW91IHN0aWxsIGhhdmUgYXN0aG1hP1wiJyxcbiAgfSxcbiAgRElBQkVURVM6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLmRpYWJldGVzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1Blb3BsZSBhZ2VzIDE4IGFuZCB1cCB3aG8gcmVwb3J0IGhhdmluZyBiZWVuIHRvbGQgYnkgYSBkb2N0b3IsIG51cnNlLCBvciBvdGhlcicgK1xuICAgICcgaGVhbHRoIHByb2Zlc3Npb25hbHMgdGhhdCB0aGV5IGhhdmUgZGlhYmV0ZXMgb3RoZXIgdGhhbiBkaWFiZXRlcyBkdXJpbmcgcHJlZ25hbmN5JyxcbiAgICBkZXNjcmlwdGlvbjogJ1Blb3BsZSBhZ2VzIDE4IGFuZCB1cCB3aG8gcmVwb3J0IGhhdmluZyBiZWVuIHRvbGQgYnkgYSBkb2N0b3IsIG51cnNlLCBvciBvdGhlcicgK1xuICAgICcgaGVhbHRoIHByb2Zlc3Npb25hbHMgdGhhdCB0aGV5IGhhdmUgZGlhYmV0ZXMgb3RoZXIgdGhhbiBkaWFiZXRlcyBkdXJpbmcgcHJlZ25hbmN5JyxcbiAgfSxcbiAgRElFU0VMX1BBUlRJQ1VMQVRFX01BVFRFUjoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZGVzY3JpcHRpb24uZGllc2VsUGFydE1hdHRlcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdNaXh0dXJlIG9mIHBhcnRpY2xlcyB0aGF0IGlzIHBhcnQgb2YgZGllc2VsIGV4aGF1c3QgaW4gdGhlIGFpcicsXG4gICAgZGVzY3JpcHRpb246ICdNaXh0dXJlIG9mIHBhcnRpY2xlcyB0aGF0IGlzIHBhcnQgb2YgZGllc2VsIGV4aGF1c3QgaW4gdGhlIGFpcicsXG4gIH0sXG4gIEVORVJHWV9CVVJERU46IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLmVuZXJneUJ1cmRlbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBdmVyYWdlIGFubnVhbCBlbmVyZ3kgY29zdCAoJCkgZGl2aWRlZCBieSBob3VzZWhvbGQgaW5jb21lJyxcbiAgICBkZXNjcmlwdGlvbjogJ0F2ZXJhZ2UgYW5udWFsIGVuZXJneSBjb3N0ICgkKSBkaXZpZGVkIGJ5IGhvdXNlaG9sZCBpbmNvbWUnLFxuICB9LFxuICBGRU1BX1JJU0s6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLmZlbWFSaXNrJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGVjdGVkIEFubnVhbCBMb3NzIFNjb3JlLCB3aGljaCBpcyB0aGUgYXZlcmFnZSBlY29ub21pYyBsb3NzIGluIGRvbGxhcnMnICtcbiAgICAnIHJlc3VsdGluZyBmcm9tIG5hdHVyYWwgaGF6YXJkcyBlYWNoIHllYXIuJyxcbiAgICBkZXNjcmlwdGlvbjogJ0V4cGVjdGVkIEFubnVhbCBMb3NzIFNjb3JlLCB3aGljaCBpcyB0aGUgYXZlcmFnZSBlY29ub21pYyBsb3NzIGluIGRvbGxhcnMnICtcbiAgICAnIHJlc3VsdGluZyBmcm9tIG5hdHVyYWwgaGF6YXJkcyBlYWNoIHllYXIuJyxcbiAgfSxcbiAgSEVBUlRfRElTRUFTRToge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZGVzY3JpcHRpb24uaGVhcnREaXNlYXNlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1Blb3BsZSBhZ2VzIDE4IGFuZCB1cCB3aG8gcmVwb3J0IGV2ZXIgaGF2aW5nIGJlZW4gdG9sZCBieSBhJyArXG4gICAgJyBkb2N0b3IsIG51cnNlLCBvciBvdGhlciBoZWFsdGggcHJvZmVzc2lvbmFscyB0aGF0IHRoZXkgaGFkIGFuZ2luYSBvciBjb3JvbmFyeSBoZWFydCBkaXNlYXNlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Blb3BsZSBhZ2VzIDE4IGFuZCB1cCB3aG8gcmVwb3J0IGV2ZXIgaGF2aW5nIGJlZW4gdG9sZCBieSBhJyArXG4gICAgJyBkb2N0b3IsIG51cnNlLCBvciBvdGhlciBoZWFsdGggcHJvZmVzc2lvbmFscyB0aGF0IHRoZXkgaGFkIGFuZ2luYSBvciBjb3JvbmFyeSBoZWFydCBkaXNlYXNlJyxcbiAgfSxcbiAgSE9VU0VfQlVSREVOOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5kZXNjcmlwdGlvbi5ob3VzZUJ1cmRlbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdIb3VzZWhvbGRzIHRoYXQgYXJlIGxvdyBpbmNvbWUgYW5kIHNwZW5kIG1vcmUgdGhhbiAzMCUgb2YgdGhlaXIgaW5jb21lIG9uJyArXG4gICAgJyBob3VzaW5nIGNvc3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdXNlaG9sZHMgdGhhdCBhcmUgbG93IGluY29tZSBhbmQgc3BlbmQgbW9yZSB0aGFuIDMwJSBvZiB0aGVpciBpbmNvbWUgb24nICtcbiAgICAnIGhvdXNpbmcgY29zdHMnLFxuICB9LFxuICBMRUFEX1BBSU5UOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5kZXNjcmlwdGlvbi5sZWFkUGFpbnQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSG91c2luZyB1bml0cyBidWlsdCBwcmUtMTk2MCwgdXNlZCBhcyBhbiBpbmRpY2F0b3Igb2YgcG90ZW50aWFsJytcbiAgICAnIGxlYWQgcGFpbnQgZXhwb3N1cmUgaW4gaG9tZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnSG91c2luZyB1bml0cyBidWlsdCBwcmUtMTk2MCwgdXNlZCBhcyBhbiBpbmRpY2F0b3Igb2YgcG90ZW50aWFsJytcbiAgICAnIGxlYWQgcGFpbnQgZXhwb3N1cmUgaW4gaG9tZXMnLFxuICB9LFxuICBMSUZFX0VYUEVDVDoge1xuICAgIGlkOiAnYXJlYURldGFpbC5pbmRpY2F0b3IuZGVzY3JpcHRpb24ubGlmZUV4cGVjdCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFc3RpbWF0ZWQgeWVhcnMgb2YgbGlmZSBleHBlY3RhbmN5JyxcbiAgICBkZXNjcmlwdGlvbjogJ0VzdGltYXRlZCB5ZWFycyBvZiBsaWZlIGV4cGVjdGFuY3knLFxuICB9LFxuICBQTV8yXzU6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLnBtMjUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRmluZSBpbmhhbGFibGUgcGFydGljbGVzLCB3aXRoIGRpYW1ldGVycyB0aGF0IGFyZSBnZW5lcmFsbHkgMi41IG1pY3JvbWV0ZXJzIGFuZCBzbWFsbGVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbmUgaW5oYWxhYmxlIHBhcnRpY2xlcywgd2l0aCBkaWFtZXRlcnMgdGhhdCBhcmUgZ2VuZXJhbGx5IDIuNSBtaWNyb21ldGVycyBhbmQgc21hbGxlcicsXG4gIH0sXG4gIFRSQUZGSUNfVk9MVU1FOiB7XG4gICAgaWQ6ICdhcmVhRGV0YWlsLmluZGljYXRvci5kZXNjcmlwdGlvbi50cmFmZmljVm9sdW1lJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NvdW50IG9mIHZlaGljbGVzIChhdmVyYWdlIGFubnVhbCBkYWlseSB0cmFmZmljKSBhdCBtYWpvciByb2FkcyB3aXRoaW4gNTAwIG1ldGVycywnICtcbiAgICAnIGRpdmlkZWQgYnkgZGlzdGFuY2UgaW4gbWV0ZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvdW50IG9mIHZlaGljbGVzIChhdmVyYWdlIGFubnVhbCBkYWlseSB0cmFmZmljKSBhdCBtYWpvciByb2FkcyB3aXRoaW4gNTAwIG1ldGVycywnICtcbiAgICAnIGRpdmlkZWQgYnkgZGlzdGFuY2UgaW4gbWV0ZXJzJyxcbiAgfSxcbiAgV0FTVEVfV0FURVI6IHtcbiAgICBpZDogJ2FyZWFEZXRhaWwuaW5kaWNhdG9yLmRlc2NyaXB0aW9uLndhc3RlV2F0ZXInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVG94aWMgY29uY2VudHJhdGlvbnMgYXQgc3RyZWFtIHNlZ21lbnRzIHdpdGhpbiA1MDAgbWV0ZXJzIGRpdmlkZWQgYnkgZGlzdGFuY2UgaW4nICtcbiAgICAnIGtpbG9tZXRlcnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG94aWMgY29uY2VudHJhdGlvbnMgYXQgc3RyZWFtIHNlZ21lbnRzIHdpdGhpbiA1MDAgbWV0ZXJzIGRpdmlkZWQgYnkgZGlzdGFuY2UgaW4nICtcbiAgICAnIGtpbG9tZXRlcnMnLFxuICB9LFxufSk7XG5cblxuZXhwb3J0IGNvbnN0IERPV05MT0FEX0RSQUZUID0ge1xuICBQQVJBR1JBUEhfMTogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17J2Rvd25sb2FkLmRyYWZ0LnB0YWcuMSd9XG4gICAgZGVzY3JpcHRpb249eydEb3dubG9hZCB0aGUgZHJhZnQgbGlzdCBvZiBjb21tdW5pdGllcyBvZiBmb2N1cyBhbmQgZGF0YXNldHMgdXNlZC4nfVxuICAgIGRlZmF1bHRNZXNzYWdlPXtge2Rvd25sb2FkRHJhZnR9IG9mIGNvbW11bml0aWVzIG9mIGZvY3VzIGFuZCBkYXRhc2V0cyB1c2VkLiBMYXN0IHVwZGF0ZWQ6IHtkYXRlVXBkYXRlZH0uYH1cbiAgICB2YWx1ZXM9e3tcbiAgICAgIGRvd25sb2FkRHJhZnQ6XG4gICAgICAgIDxhIGhyZWY9e01FVEhPRE9MT0dZX0NPUFkuRE9XTkxPQURfWklQX1VSTH0+XG4gICAgICAgICAgeydEb3dubG9hZCB0aGUgZHJhZnQgbGlzdCd9XG4gICAgICAgIDwvYT4sXG4gICAgICBkYXRlVXBkYXRlZDogTUVUSE9ET0xPR1lfQ09QWS5ET1dOTE9BRF9MQVNUX1VQREFURUQsXG4gICAgfX1cbiAgLz4sXG4gIFBBUkFHUkFQSF8yOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsnZG93bmxvYWQuZHJhZnQucHRhZy4yJ31cbiAgICBkZXNjcmlwdGlvbj17J0Rvd25sb2FkIHRoZSBkcmFmdCBsaXN0IG9mIGNvbW11bml0aWVzIG9mIGZvY3VzIGFuZCBkYXRhc2V0cyB1c2VkLid9XG4gICAgZGVmYXVsdE1lc3NhZ2U9e2BaSVAgZmlsZSB3aWxsIGNvbnRhaW4gb25lIC54bHN4LCBvbmUgLmNzdiwgYW5kIG9uZSAucGRmICh7ZG93bmxvYWRGaWxlU2l6ZX0pLmB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBkb3dubG9hZEZpbGVTaXplOiBNRVRIT0RPTE9HWV9DT1BZLkRPV05MT0FEX0ZJTEVfU0laRSxcbiAgICB9fVxuICAvPixcbn07XG5cbmV4cG9ydCBjb25zdCBIT1dfWU9VX0NBTl9IRUxQX0xJU1RfSVRFTVMgPSB7XG4gIEhFQURJTkc6IDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgaWQ9eyd5b3VDYW5IZWxwSW5mb1RleHQuaGVhZGluZyd9XG4gICAgZGVzY3JpcHRpb249eydob3cgb25lIGNhbiBoZWxwIHVzIGltcHJvdmUgdGhlIHRvb2wnfVxuICAgIGRlZmF1bHRNZXNzYWdlPXtgSG93IHlvdSBjYW4gaGVscCBpbXByb3ZlIHRoZSB0b29sYH1cbiAgLz4sXG4gIExJU1RfSVRFTV8xOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsneW91Q2FuSGVscEluZm9UZXh0Lmxpc3QuaXRlbS4xJ31cbiAgICBkZXNjcmlwdGlvbj17J2hvdyBvbmUgY2FuIGhlbHAgdXMgdmlhIGVtYWlsJ31cbiAgICBkZWZhdWx0TWVzc2FnZT17YElmIHlvdSBoYXZlIGhlbHBmdWwgaW5mb3JtYXRpb24sIHdlIHdvdWxkIGxvdmUgdG8ge3J4RW1haWxGcm9tWW91fS5gfVxuICAgIHZhbHVlcz17e1xuICAgICAgcnhFbWFpbEZyb21Zb3U6XG4gICAgICA8YSBocmVmPXtgbWFpbHRvOiR7Q09OVEFDVF9DT1BZLkZFRURCQUNLX0VNQUlMfWB9PlxuICAgICAgICB7J3JlY2VpdmUgYW4gZW1haWwgZnJvbSB5b3UnfVxuICAgICAgPC9hPixcbiAgICB9fVxuICAvPixcbiAgTElTVF9JVEVNXzI6IDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgaWQ9eyd5b3VDYW5IZWxwSW5mb1RleHQubGlzdC5pdGVtLjInfVxuICAgIGRlc2NyaXB0aW9uPXsnZ2l2ZSB1cyBmZWVkYmFjayBvbiBvdXIgZGF0YSBhbmQgbWV0aG9kb2xvZ3knfVxuICAgIGRlZmF1bHRNZXNzYWdlPXtgVmlldyBvdXIge2RhdGFNZXRofSBwYWdlIGFuZCBzZW5kIHVzIGZlZWRiYWNrLmB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBkYXRhTWV0aDpcbiAgICA8TGluayB0bz17Jy9tZXRob2RvbG9neSd9PlxuICAgICAgeydEYXRhICYgbWV0aG9kb2xvZ3knfVxuICAgIDwvTGluaz4sXG4gICAgfX1cbiAgLz4sXG4gIExJU1RfSVRFTV8zOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsneW91Q2FuSGVscEluZm9UZXh0Lmxpc3QuaXRlbS4zJ31cbiAgICBkZXNjcmlwdGlvbj17J3NoYXJlIHlvdXIgZmVlZGJhY2snfVxuICAgIGRlZmF1bHRNZXNzYWdlPXtgRmluZCB5b3VyIGNvbW11bml0eSBvZiBpbnRlcmVzdCBhbmQge3NoYXJlRmVlZGJhY2t9LmB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBzaGFyZUZlZWRiYWNrOlxuICAgICAgICA8YSBocmVmPXtgbWFpbHRvOiR7Q09OVEFDVF9DT1BZLkZFRURCQUNLX0VNQUlMfWB9PlxuICAgICAgICAgIHsnc2hhcmUgeW91ciBmZWVkYmFjayd9XG4gICAgICAgIDwvYT4sXG4gICAgfX1cbiAgLz4sXG5cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9ob3dZb3VDYW5IZWxwLm1vZHVsZS5zY3NzJztcbmltcG9ydCAqIGFzIEVYUExPUkVfQ09QWSBmcm9tICcuLi8uLi9kYXRhL2NvcHkvZXhwbG9yZSc7XG5cbmNvbnN0IEhvd1lvdUNhbkhlbHAgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5ob3dZb3VDYW5IZWxwQ29udGFpbmVyfT5cbiAgICAgIDxoMj5cbiAgICAgICAge0VYUExPUkVfQ09QWS5IT1dfWU9VX0NBTl9IRUxQX0xJU1RfSVRFTVMuSEVBRElOR31cbiAgICAgIDwvaDI+XG4gICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMuaG93WW91Q2FuSGVscExpc3RXcmFwcGVyfT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBMaXN0fT5cbiAgICAgICAgICB7RVhQTE9SRV9DT1BZLkhPV19ZT1VfQ0FOX0hFTFBfTElTVF9JVEVNUy5MSVNUX0lURU1fMX1cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBMaXN0fT5cbiAgICAgICAgICB7RVhQTE9SRV9DT1BZLkhPV19ZT1VfQ0FOX0hFTFBfTElTVF9JVEVNUy5MSVNUX0lURU1fMn1cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT17c3R5bGVzLmhvd1lvdUNhbkhlbHBMaXN0fT5cbiAgICAgICAgICB7RVhQTE9SRV9DT1BZLkhPV19ZT1VfQ0FOX0hFTFBfTElTVF9JVEVNUy5MSVNUX0lURU1fM31cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIb3dZb3VDYW5IZWxwO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn0iLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiaW1wb3J0IFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIjtcblxuLyoqXHJcbiAqIENvbW1vbiB1dGlsaXRpZXNcclxuICogQG1vZHVsZSBnbE1hdHJpeFxyXG4gKi9cbi8vIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG5leHBvcnQgdmFyIEVQU0lMT04gPSAwLjAwMDAwMTtcbmV4cG9ydCB2YXIgQVJSQVlfVFlQRSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5leHBvcnQgdmFyIFJBTkRPTSA9IE1hdGgucmFuZG9tO1xuLyoqXHJcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheUNvbnN0cnVjdG9yIHwgQXJyYXlDb25zdHJ1Y3Rvcn0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1hdHJpeEFycmF5VHlwZSh0eXBlKSB7XG4gIEFSUkFZX1RZUEUgPSB0eXBlO1xufVxudmFyIGRlZ3JlZSA9IE1hdGguUEkgLyAxODA7XG4vKipcclxuICogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIEFuZ2xlIGluIERlZ3JlZXNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JhZGlhbihhKSB7XG4gIHJldHVybiBhICogZGVncmVlO1xufVxuLyoqXHJcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1bWVudHMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlLCB3aXRoaW4gYW4gYWJzb2x1dGVcclxuICogb3IgcmVsYXRpdmUgdG9sZXJhbmNlIG9mIGdsTWF0cml4LkVQU0lMT04gKGFuIGFic29sdXRlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciB2YWx1ZXMgbGVzc1xyXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCBudW1iZXIgdG8gdGVzdC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlcnMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5pZiAoIU1hdGguaHlwb3QpIE1hdGguaHlwb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB5ID0gMCxcbiAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB5ICs9IGFyZ3VtZW50c1tpXSAqIGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLnNxcnQoeSk7XG59OyIsImltcG9ydCBcImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzXCI7XG5pbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHksIHosIHcpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWM0IHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5LCB6LCB3KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIG91dFszXSA9IHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogRGl2aWRlcyB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC8gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLmNlaWwoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5mbG9vcihhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5yb3VuZChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWM0IGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHZhciB3ID0gYlszXSAtIGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcbn1cbi8qKlxyXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IC1hWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIG91dFszXSA9IDEuMCAvIGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTm9ybWFsaXplIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0geCAqIGxlbjtcbiAgb3V0WzFdID0geSAqIGxlbjtcbiAgb3V0WzJdID0geiAqIGxlbjtcbiAgb3V0WzNdID0gdyAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhyZWUgdmVjdG9ycyBpbiBhIDQtZGltZW5zaW9uYWwgc3BhY2VcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IHJlc3VsdCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBWIHRoZSBzZWNvbmQgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBXIHRoZSB0aGlyZCB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzR9IHJlc3VsdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgdSwgdiwgdykge1xuICB2YXIgQSA9IHZbMF0gKiB3WzFdIC0gdlsxXSAqIHdbMF0sXG4gICAgICBCID0gdlswXSAqIHdbMl0gLSB2WzJdICogd1swXSxcbiAgICAgIEMgPSB2WzBdICogd1szXSAtIHZbM10gKiB3WzBdLFxuICAgICAgRCA9IHZbMV0gKiB3WzJdIC0gdlsyXSAqIHdbMV0sXG4gICAgICBFID0gdlsxXSAqIHdbM10gLSB2WzNdICogd1sxXSxcbiAgICAgIEYgPSB2WzJdICogd1szXSAtIHZbM10gKiB3WzJdO1xuICB2YXIgRyA9IHVbMF07XG4gIHZhciBIID0gdVsxXTtcbiAgdmFyIEkgPSB1WzJdO1xuICB2YXIgSiA9IHVbM107XG4gIG91dFswXSA9IEggKiBGIC0gSSAqIEUgKyBKICogRDtcbiAgb3V0WzFdID0gLShHICogRikgKyBJICogQyAtIEogKiBCO1xuICBvdXRbMl0gPSBHICogRSAtIEggKiBDICsgSiAqIEE7XG4gIG91dFszXSA9IC0oRyAqIEQpICsgSCAqIEIgLSBJICogQTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgdmFyIGF3ID0gYVszXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wOyAvLyBNYXJzYWdsaWEsIEdlb3JnZS4gQ2hvb3NpbmcgYSBQb2ludCBmcm9tIHRoZSBTdXJmYWNlIG9mIGFcbiAgLy8gU3BoZXJlLiBBbm4uIE1hdGguIFN0YXRpc3QuIDQzICgxOTcyKSwgbm8uIDIsIDY0NS0tNjQ2LlxuICAvLyBodHRwOi8vcHJvamVjdGV1Y2xpZC5vcmcvZXVjbGlkLmFvbXMvMTE3NzY5MjY0NDtcblxuICB2YXIgdjEsIHYyLCB2MywgdjQ7XG4gIHZhciBzMSwgczI7XG5cbiAgZG8ge1xuICAgIHYxID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2MiA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczEgPSB2MSAqIHYxICsgdjIgKiB2MjtcbiAgfSB3aGlsZSAoczEgPj0gMSk7XG5cbiAgZG8ge1xuICAgIHYzID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2NCA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczIgPSB2MyAqIHYzICsgdjQgKiB2NDtcbiAgfSB3aGlsZSAoczIgPj0gMSk7XG5cbiAgdmFyIGQgPSBNYXRoLnNxcnQoKDEgLSBzMSkgLyBzMik7XG4gIG91dFswXSA9IHNjYWxlICogdjE7XG4gIG91dFsxXSA9IHNjYWxlICogdjI7XG4gIG91dFsyXSA9IHNjYWxlICogdjMgKiBkO1xuICBvdXRbM10gPSBzY2FsZSAqIHY0ICogZDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBtYXQ0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdOyAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY1xuXG4gIHZhciBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcbiAgdmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xuICB2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG4gIHZhciBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7IC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcblxuICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICBvdXRbMV0gPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xuICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgb3V0WzNdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjNHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjNC4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gNDtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgdmVjWzNdID0gYVtpICsgM107XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgICAgYVtpICsgM10gPSB2ZWNbM107XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgdmVjNCBmcm9tICdnbC1tYXRyaXgvdmVjNCc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF0NCgpIHtcbiAgcmV0dXJuIFsxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1WZWN0b3IobWF0cml4LCB2ZWN0b3IpIHtcbiAgdmFyIHJlc3VsdCA9IHZlYzQudHJhbnNmb3JtTWF0NChbXSwgdmVjdG9yLCBtYXRyaXgpO1xuICB2ZWM0LnNjYWxlKHJlc3VsdCwgcmVzdWx0LCAxIC8gcmVzdWx0WzNdKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtb2QodmFsdWUsIGRpdmlzb3IpIHtcbiAgdmFyIG1vZHVsdXMgPSB2YWx1ZSAlIGRpdmlzb3I7XG4gIHJldHVybiBtb2R1bHVzIDwgMCA/IGRpdmlzb3IgKyBtb2R1bHVzIDogbW9kdWx1cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgcmV0dXJuIHN0ZXAgKiBlbmQgKyAoMSAtIHN0ZXApICogc3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGllTG9nMih4KSB7XG4gIHJldHVybiBNYXRoLmxvZyh4KSAqIE1hdGguTE9HMkU7XG59XG5cbmV4cG9ydCB2YXIgbG9nMiA9IE1hdGgubG9nMiB8fCBpZUxvZzI7IiwiaW1wb3J0IFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIjtcbmltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDR4NCBNYXRyaXg8YnI+Rm9ybWF0OiBjb2x1bW4tbWFqb3IsIHdoZW4gdHlwZWQgb3V0IGl0IGxvb2tzIGxpa2Ugcm93LW1ham9yPGJyPlRoZSBtYXRyaWNlcyBhcmUgYmVpbmcgcG9zdCBtdWx0aXBsaWVkLlxyXG4gKiBAbW9kdWxlIG1hdDRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDRcclxuICpcclxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0NCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gQSBuZXcgbWF0NFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQ0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTAzID0gYVszXTtcbiAgICB2YXIgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XTtcbiAgICB2YXIgYTIzID0gYVsxMV07XG4gICAgb3V0WzFdID0gYVs0XTtcbiAgICBvdXRbMl0gPSBhWzhdO1xuICAgIG91dFszXSA9IGFbMTJdO1xuICAgIG91dFs0XSA9IGEwMTtcbiAgICBvdXRbNl0gPSBhWzldO1xuICAgIG91dFs3XSA9IGFbMTNdO1xuICAgIG91dFs4XSA9IGEwMjtcbiAgICBvdXRbOV0gPSBhMTI7XG4gICAgb3V0WzExXSA9IGFbMTRdO1xuICAgIG91dFsxMl0gPSBhMDM7XG4gICAgb3V0WzEzXSA9IGExMztcbiAgICBvdXRbMTRdID0gYTIzO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVs0XTtcbiAgICBvdXRbMl0gPSBhWzhdO1xuICAgIG91dFszXSA9IGFbMTJdO1xuICAgIG91dFs0XSA9IGFbMV07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzldO1xuICAgIG91dFs3XSA9IGFbMTNdO1xuICAgIG91dFs4XSA9IGFbMl07XG4gICAgb3V0WzldID0gYVs2XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTRdO1xuICAgIG91dFsxMl0gPSBhWzNdO1xuICAgIG91dFsxM10gPSBhWzddO1xuICAgIG91dFsxNF0gPSBhWzExXTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICBvdXRbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcbiAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICBvdXRbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcbiAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICBvdXRbMF0gPSBhMTEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMik7XG4gIG91dFsxXSA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgb3V0WzJdID0gYTAxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbM10gPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs0XSA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgb3V0WzVdID0gYTAwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpO1xuICBvdXRbNl0gPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs3XSA9IGEwMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTEwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzhdID0gYTEwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpO1xuICBvdXRbOV0gPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gIG91dFsxMF0gPSBhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSk7XG4gIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gIG91dFsxM10gPSBhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSk7XG4gIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gIG91dFsxNV0gPSBhMDAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0c1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTsgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG5cbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzNdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls0XTtcbiAgYjEgPSBiWzVdO1xuICBiMiA9IGJbNl07XG4gIGIzID0gYls3XTtcbiAgb3V0WzRdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs1XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbNl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzddID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls4XTtcbiAgYjEgPSBiWzldO1xuICBiMiA9IGJbMTBdO1xuICBiMyA9IGJbMTFdO1xuICBvdXRbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzldID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbMTJdO1xuICBiMSA9IGJbMTNdO1xuICBiMiA9IGJbMTRdO1xuICBiMyA9IGJbMTVdO1xuICBvdXRbMTJdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxM10gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzE0XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTVdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzIG5vdCB1c2luZyB2ZWN0b3JpemF0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICBvdXRbMF0gPSBhWzBdICogeDtcbiAgb3V0WzFdID0gYVsxXSAqIHg7XG4gIG91dFsyXSA9IGFbMl0gKiB4O1xuICBvdXRbM10gPSBhWzNdICogeDtcbiAgb3V0WzRdID0gYVs0XSAqIHk7XG4gIG91dFs1XSA9IGFbNV0gKiB5O1xuICBvdXRbNl0gPSBhWzZdICogeTtcbiAgb3V0WzddID0gYVs3XSAqIHk7XG4gIG91dFs4XSA9IGFbOF0gKiB6O1xuICBvdXRbOV0gPSBhWzldICogejtcbiAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQ0IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIGdpdmVuIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgdmFyIGIwMCwgYjAxLCBiMDI7XG4gIHZhciBiMTAsIGIxMSwgYjEyO1xuICB2YXIgYjIwLCBiMjEsIGIyMjtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7XG4gIGEwMCA9IGFbMF07XG4gIGEwMSA9IGFbMV07XG4gIGEwMiA9IGFbMl07XG4gIGEwMyA9IGFbM107XG4gIGExMCA9IGFbNF07XG4gIGExMSA9IGFbNV07XG4gIGExMiA9IGFbNl07XG4gIGExMyA9IGFbN107XG4gIGEyMCA9IGFbOF07XG4gIGEyMSA9IGFbOV07XG4gIGEyMiA9IGFbMTBdO1xuICBhMjMgPSBhWzExXTsgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG5cbiAgYjAwID0geCAqIHggKiB0ICsgYztcbiAgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBiMTAgPSB4ICogeSAqIHQgLSB6ICogcztcbiAgYjExID0geSAqIHkgKiB0ICsgYztcbiAgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIGIyMCA9IHggKiB6ICogdCArIHkgKiBzO1xuICBiMjEgPSB5ICogeiAqIHQgLSB4ICogcztcbiAgYjIyID0geiAqIHogKiB0ICsgYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGExMCA9IGFbNF07XG4gIHZhciBhMTEgPSBhWzVdO1xuICB2YXIgYTEyID0gYVs2XTtcbiAgdmFyIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7XG4gIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7XG4gIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjIC0gYTIwICogcztcbiAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjIC0gYTIzICogcztcbiAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICBvdXRbMTBdID0gYTAyICogcyArIGEyMiAqIGM7XG4gIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gdlsxXTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IHZbMl07XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0geCAqIHggKiB0ICsgYztcbiAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIG91dFsyXSA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgb3V0WzVdID0geSAqIHkgKiB0ICsgYztcbiAgb3V0WzZdID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHggKiB6ICogdCArIHkgKiBzO1xuICBvdXRbOV0gPSB5ICogeiAqIHQgLSB4ICogcztcbiAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWFJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gYztcbiAgb3V0WzZdID0gcztcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gLXM7XG4gIG91dFsxMF0gPSBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVkoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVlSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBzO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVaKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21aUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAtcztcbiAgb3V0WzVdID0gYztcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIGFuZCB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGZyb20gYSBkdWFsIHF1YXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvbixcclxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgdHJhbnNsYXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24ob3V0LCBtYXQpIHtcbiAgb3V0WzBdID0gbWF0WzEyXTtcbiAgb3V0WzFdID0gbWF0WzEzXTtcbiAgb3V0WzJdID0gbWF0WzE0XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxyXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVcclxuICogIHdpdGggYSBub3JtYWxpemVkIFF1YXRlcm5pb24gcGFyYW10ZXIsIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZVxyXG4gKiAgdGhlIHNhbWUgYXMgdGhlIHNjYWxpbmcgdmVjdG9yXHJcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgc2NhbGluZyBmYWN0b3IgY29tcG9uZW50XHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGluZyhvdXQsIG1hdCkge1xuICB2YXIgbTExID0gbWF0WzBdO1xuICB2YXIgbTEyID0gbWF0WzFdO1xuICB2YXIgbTEzID0gbWF0WzJdO1xuICB2YXIgbTIxID0gbWF0WzRdO1xuICB2YXIgbTIyID0gbWF0WzVdO1xuICB2YXIgbTIzID0gbWF0WzZdO1xuICB2YXIgbTMxID0gbWF0WzhdO1xuICB2YXIgbTMyID0gbWF0WzldO1xuICB2YXIgbTMzID0gbWF0WzEwXTtcbiAgb3V0WzBdID0gTWF0aC5oeXBvdChtMTEsIG0xMiwgbTEzKTtcbiAgb3V0WzFdID0gTWF0aC5oeXBvdChtMjEsIG0yMiwgbTIzKTtcbiAgb3V0WzJdID0gTWF0aC5oeXBvdChtMzEsIG0zMiwgbTMzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XHJcbiAqICBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aFxyXG4gKiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sIHRoZSByZXR1cm5lZCBxdWF0ZXJuaW9uIHdpbGwgYmUgdGhlXHJcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IFF1YXRlcm5pb24gdG8gcmVjZWl2ZSB0aGUgcm90YXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvbihvdXQsIG1hdCkge1xuICB2YXIgc2NhbGluZyA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBnZXRTY2FsaW5nKHNjYWxpbmcsIG1hdCk7XG4gIHZhciBpczEgPSAxIC8gc2NhbGluZ1swXTtcbiAgdmFyIGlzMiA9IDEgLyBzY2FsaW5nWzFdO1xuICB2YXIgaXMzID0gMSAvIHNjYWxpbmdbMl07XG4gIHZhciBzbTExID0gbWF0WzBdICogaXMxO1xuICB2YXIgc20xMiA9IG1hdFsxXSAqIGlzMjtcbiAgdmFyIHNtMTMgPSBtYXRbMl0gKiBpczM7XG4gIHZhciBzbTIxID0gbWF0WzRdICogaXMxO1xuICB2YXIgc20yMiA9IG1hdFs1XSAqIGlzMjtcbiAgdmFyIHNtMjMgPSBtYXRbNl0gKiBpczM7XG4gIHZhciBzbTMxID0gbWF0WzhdICogaXMxO1xuICB2YXIgc20zMiA9IG1hdFs5XSAqIGlzMjtcbiAgdmFyIHNtMzMgPSBtYXRbMTBdICogaXMzO1xuICB2YXIgdHJhY2UgPSBzbTExICsgc20yMiArIHNtMzM7XG4gIHZhciBTID0gMDtcblxuICBpZiAodHJhY2UgPiAwKSB7XG4gICAgUyA9IE1hdGguc3FydCh0cmFjZSArIDEuMCkgKiAyO1xuICAgIG91dFszXSA9IDAuMjUgKiBTO1xuICAgIG91dFswXSA9IChzbTIzIC0gc20zMikgLyBTO1xuICAgIG91dFsxXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFsyXSA9IChzbTEyIC0gc20yMSkgLyBTO1xuICB9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTExIC0gc20yMiAtIHNtMzMpICogMjtcbiAgICBvdXRbM10gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMF0gPSAwLjI1ICogUztcbiAgICBvdXRbMV0gPSAoc20xMiArIHNtMjEpIC8gUztcbiAgICBvdXRbMl0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgfSBlbHNlIGlmIChzbTIyID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20yMiAtIHNtMTEgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMzEgLSBzbTEzKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzFdID0gMC4yNSAqIFM7XG4gICAgb3V0WzJdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gIH0gZWxzZSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTMzIC0gc20xMSAtIHNtMjIpICogMjtcbiAgICBvdXRbM10gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgICBvdXRbMF0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgICBvdXRbMV0gPSAoc20yMyArIHNtMzIpIC8gUztcbiAgICBvdXRbMl0gPSAwLjI1ICogUztcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUob3V0LCBxLCB2LCBzKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIHZhciBzeCA9IHNbMF07XG4gIHZhciBzeSA9IHNbMV07XG4gIHZhciBzeiA9IHNbMl07XG4gIG91dFswXSA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICBvdXRbMV0gPSAoeHkgKyB3eikgKiBzeDtcbiAgb3V0WzJdID0gKHh6IC0gd3kpICogc3g7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9ICh4eSAtIHd6KSAqIHN5O1xuICBvdXRbNV0gPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgb3V0WzZdID0gKHl6ICsgd3gpICogc3k7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9ICh4eiArIHd5KSAqIHN6O1xuICBvdXRbOV0gPSAoeXogLSB3eCkgKiBzejtcbiAgb3V0WzEwXSA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBuZWdhdGl2ZU9yaWdpbik7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gbyBUaGUgb3JpZ2luIHZlY3RvciBhcm91bmQgd2hpY2ggdG8gc2NhbGUgYW5kIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgNHg0IG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cclxuICpcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB5eCAtIHd6O1xuICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzZdID0genkgKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0genggKyB3eTtcbiAgb3V0WzldID0genkgLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgZnJ1c3R1bSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtOdW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gKiBQYXNzaW5nIG51bGwvdW5kZWZpbmVkL25vIHZhbHVlIGZvciBmYXIgd2lsbCBnZW5lcmF0ZSBpbmZpbml0ZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcclxuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcclxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bSwgY2FuIGJlIG51bGwgb3IgSW5maW5pdHlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICBuZjtcbiAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gZjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzExXSA9IC0xO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNV0gPSAwO1xuXG4gIGlmIChmYXIgIT0gbnVsbCAmJiBmYXIgIT09IEluZmluaXR5KSB7XG4gICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTRdID0gMiAqIGZhciAqIG5lYXIgKiBuZjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMTBdID0gLTE7XG4gICAgb3V0WzE0XSA9IC0yICogbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZmllbGQgb2Ygdmlldy5cclxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxyXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlRnJvbUZpZWxkT2ZWaWV3KG91dCwgZm92LCBuZWFyLCBmYXIpIHtcbiAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pO1xuICB2YXIgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG4gIG91dFswXSA9IHhTY2FsZTtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgb3V0WzRdID0gMC4wO1xuICBvdXRbNV0gPSB5U2NhbGU7XG4gIG91dFs2XSA9IDAuMDtcbiAgb3V0WzddID0gMC4wO1xuICBvdXRbOF0gPSAtKChsZWZ0VGFuIC0gcmlnaHRUYW4pICogeFNjYWxlICogMC41KTtcbiAgb3V0WzldID0gKHVwVGFuIC0gZG93blRhbikgKiB5U2NhbGUgKiAwLjU7XG4gIG91dFsxMF0gPSBmYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxMV0gPSAtMS4wO1xuICBvdXRbMTJdID0gMC4wO1xuICBvdXRbMTNdID0gMC4wO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzE1XSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAyICogbmY7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgb3V0WzEzXSA9ICh0b3AgKyBib3R0b20pICogYnQ7XG4gIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXMuXHJcbiAqIElmIHlvdSB3YW50IGEgbWF0cml4IHRoYXQgYWN0dWFsbHkgbWFrZXMgYW4gb2JqZWN0IGxvb2sgYXQgYW5vdGhlciBvYmplY3QsIHlvdSBzaG91bGQgdXNlIHRhcmdldFRvIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBtYXRyaXggdGhhdCBtYWtlcyBzb21ldGhpbmcgbG9vayBhdCBzb21ldGhpbmcgZWxzZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRhcmdldFRvKG91dCwgZXllLCB0YXJnZXQsIHVwKSB7XG4gIHZhciBleWV4ID0gZXllWzBdLFxuICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICB1cHggPSB1cFswXSxcbiAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgdXB6ID0gdXBbMl07XG4gIHZhciB6MCA9IGV5ZXggLSB0YXJnZXRbMF0sXG4gICAgICB6MSA9IGV5ZXkgLSB0YXJnZXRbMV0sXG4gICAgICB6MiA9IGV5ZXogLSB0YXJnZXRbMl07XG4gIHZhciBsZW4gPSB6MCAqIHowICsgejEgKiB6MSArIHoyICogejI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgejAgKj0gbGVuO1xuICAgIHoxICo9IGxlbjtcbiAgICB6MiAqPSBsZW47XG4gIH1cblxuICB2YXIgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxLFxuICAgICAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyLFxuICAgICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSB4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgeDAgKj0gbGVuO1xuICAgIHgxICo9IGxlbjtcbiAgICB4MiAqPSBsZW47XG4gIH1cblxuICBvdXRbMF0gPSB4MDtcbiAgb3V0WzFdID0geDE7XG4gIG91dFsyXSA9IHgyO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgb3V0WzVdID0gejIgKiB4MCAtIHowICogeDI7XG4gIG91dFs2XSA9IHowICogeDEgLSB6MSAqIHgwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB6MDtcbiAgb3V0WzldID0gejE7XG4gIG91dFsxMF0gPSB6MjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSBleWV4O1xuICBvdXRbMTNdID0gZXlleTtcbiAgb3V0WzE0XSA9IGV5ZXo7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQ0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIsIFwiICsgYVs5XSArIFwiLCBcIiArIGFbMTBdICsgXCIsIFwiICsgYVsxMV0gKyBcIiwgXCIgKyBhWzEyXSArIFwiLCBcIiArIGFbMTNdICsgXCIsIFwiICsgYVsxNF0gKyBcIiwgXCIgKyBhWzE1XSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0sIGFbOV0sIGFbMTBdLCBhWzExXSwgYVsxMl0sIGFbMTNdLCBhWzE0XSwgYVsxNV0pO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgb3V0WzZdID0gYVs2XSAtIGJbNl07XG4gIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICBvdXRbOF0gPSBhWzhdIC0gYls4XTtcbiAgb3V0WzldID0gYVs5XSAtIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSAtIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gLSBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdIC0gYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSAtIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gLSBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdIC0gYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV0gKiBzY2FsZTtcbiAgb3V0WzEwXSA9IGFbMTBdICsgYlsxMF0gKiBzY2FsZTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV0gKiBzY2FsZTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl0gKiBzY2FsZTtcbiAgb3V0WzEzXSA9IGFbMTNdICsgYlsxM10gKiBzY2FsZTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF0gKiBzY2FsZTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIGFbOF0gPT09IGJbOF0gJiYgYVs5XSA9PT0gYls5XSAmJiBhWzEwXSA9PT0gYlsxMF0gJiYgYVsxMV0gPT09IGJbMTFdICYmIGFbMTJdID09PSBiWzEyXSAmJiBhWzEzXSA9PT0gYlsxM10gJiYgYVsxNF0gPT09IGJbMTRdICYmIGFbMTVdID09PSBiWzE1XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGE4ID0gYVs4XSxcbiAgICAgIGE5ID0gYVs5XSxcbiAgICAgIGExMCA9IGFbMTBdLFxuICAgICAgYTExID0gYVsxMV07XG4gIHZhciBhMTIgPSBhWzEyXSxcbiAgICAgIGExMyA9IGFbMTNdLFxuICAgICAgYTE0ID0gYVsxNF0sXG4gICAgICBhMTUgPSBhWzE1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgdmFyIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgdmFyIGI4ID0gYls4XSxcbiAgICAgIGI5ID0gYls5XSxcbiAgICAgIGIxMCA9IGJbMTBdLFxuICAgICAgYjExID0gYlsxMV07XG4gIHZhciBiMTIgPSBiWzEyXSxcbiAgICAgIGIxMyA9IGJbMTNdLFxuICAgICAgYjE0ID0gYlsxNF0sXG4gICAgICBiMTUgPSBiWzE1XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiYgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpICYmIE1hdGguYWJzKGE5IC0gYjkpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE5KSwgTWF0aC5hYnMoYjkpKSAmJiBNYXRoLmFicyhhMTAgLSBiMTApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMCksIE1hdGguYWJzKGIxMCkpICYmIE1hdGguYWJzKGExMSAtIGIxMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTExKSwgTWF0aC5hYnMoYjExKSkgJiYgTWF0aC5hYnMoYTEyIC0gYjEyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTIpLCBNYXRoLmFicyhiMTIpKSAmJiBNYXRoLmFicyhhMTMgLSBiMTMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMyksIE1hdGguYWJzKGIxMykpICYmIE1hdGguYWJzKGExNCAtIGIxNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE0KSwgTWF0aC5hYnMoYjE0KSkgJiYgTWF0aC5hYnMoYTE1IC0gYjE1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTUpLCBNYXRoLmFicyhiMTUpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgXCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qc1wiO1xuaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMiBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWMyXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHkpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMyIHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogRGl2aWRlcyB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHkpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHkpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBpbnZlcnRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTm9ybWFsaXplIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeTtcblxuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59XG4vKipcclxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xyXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIHogPSBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdO1xuICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiBzY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MmQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0M1xyXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDMob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzRdICogeSArIG1bN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0NFxyXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xyXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAyRCB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMyXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSB2ZWMyIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCBiLCByYWQpIHtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICB2YXIgcDAgPSBhWzBdIC0gYlswXSxcbiAgICAgIHAxID0gYVsxXSAtIGJbMV0sXG4gICAgICBzaW5DID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGNvc0MgPSBNYXRoLmNvcyhyYWQpOyAvL3BlcmZvcm0gcm90YXRpb24gYW5kIHRyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gcDAgKiBjb3NDIC0gcDEgKiBzaW5DICsgYlswXTtcbiAgb3V0WzFdID0gcDAgKiBzaW5DICsgcDEgKiBjb3NDICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDJEIHZlY3RvcnNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgeDEgPSBhWzBdLFxuICAgICAgeTEgPSBhWzFdLFxuICAgICAgeDIgPSBiWzBdLFxuICAgICAgeTIgPSBiWzFdLFxuICAgICAgLy8gbWFnIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBtYWduaXR1ZGVzIG9mIGEgYW5kIGJcbiAgbWFnID0gTWF0aC5zcXJ0KHgxICogeDEgKyB5MSAqIHkxKSAqIE1hdGguc3FydCh4MiAqIHgyICsgeTIgKiB5MiksXG4gICAgICAvLyBtYWcgJiYuLiBzaG9ydCBjaXJjdWl0cyBpZiBtYWcgPT0gMFxuICBjb3NpbmUgPSBtYWcgJiYgKHgxICogeDIgKyB5MSAqIHkyKSAvIG1hZzsgLy8gTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpIGNsYW1wcyB0aGUgY29zaW5lIGJldHdlZW4gLTEgYW5kIDFcblxuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAyO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0IFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIjtcbmltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDMgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjM1xyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzNcclxuICpcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMyB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeikge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTm9ybWFsaXplIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07XG59XG4vKipcclxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdO1xuICB2YXIgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdO1xuICBvdXRbMF0gPSBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF4ICogYnkgLSBheSAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaGVybWl0ZShvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGZhY3RvclRpbWVzMiAqICgyICogdCAtIDMpICsgMTtcbiAgdmFyIGZhY3RvcjIgPSBmYWN0b3JUaW1lczIgKiAodCAtIDIpICsgdDtcbiAgdmFyIGZhY3RvcjMgPSBmYWN0b3JUaW1lczIgKiAodCAtIDEpO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqICgzIC0gMiAqIHQpO1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgYmV6aWVyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICB2YXIgeiA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wIC0gMS4wO1xuICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEuMCAtIHogKiB6KSAqIHNjYWxlO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxyXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICB3ID0gdyB8fCAxLjA7XG4gIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgb3V0WzJdID0gKG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSkgLyB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcclxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgLy8gYmVuY2htYXJrczogaHR0cHM6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zLWZpeGVkXG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07IC8vIHZhciBxdmVjID0gW3F4LCBxeSwgcXpdO1xuICAvLyB2YXIgdXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCBhKTtcblxuICB2YXIgdXZ4ID0gcXkgKiB6IC0gcXogKiB5LFxuICAgICAgdXZ5ID0gcXogKiB4IC0gcXggKiB6LFxuICAgICAgdXZ6ID0gcXggKiB5IC0gcXkgKiB4OyAvLyB2YXIgdXV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgdXYpO1xuXG4gIHZhciB1dXZ4ID0gcXkgKiB1dnogLSBxeiAqIHV2eSxcbiAgICAgIHV1dnkgPSBxeiAqIHV2eCAtIHF4ICogdXZ6LFxuICAgICAgdXV2eiA9IHF4ICogdXZ5IC0gcXkgKiB1dng7IC8vIHZlYzMuc2NhbGUodXYsIHV2LCAyICogdyk7XG5cbiAgdmFyIHcyID0gcXcgKiAyO1xuICB1dnggKj0gdzI7XG4gIHV2eSAqPSB3MjtcbiAgdXZ6ICo9IHcyOyAvLyB2ZWMzLnNjYWxlKHV1diwgdXV2LCAyKTtcblxuICB1dXZ4ICo9IDI7XG4gIHV1dnkgKj0gMjtcbiAgdXV2eiAqPSAyOyAvLyByZXR1cm4gdmVjMy5hZGQob3V0LCBhLCB2ZWMzLmFkZChvdXQsIHV2LCB1dXYpKTtcblxuICBvdXRbMF0gPSB4ICsgdXZ4ICsgdXV2eDtcbiAgb3V0WzFdID0geSArIHV2eSArIHV1dnk7XG4gIG91dFsyXSA9IHogKyB1dnogKyB1dXZ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdO1xuICByWzFdID0gcFsxXSAqIE1hdGguY29zKHJhZCkgLSBwWzJdICogTWF0aC5zaW4ocmFkKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihyYWQpICsgcFsyXSAqIE1hdGguY29zKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzJdICogTWF0aC5zaW4ocmFkKSArIHBbMF0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzFdID0gcFsxXTtcbiAgclsyXSA9IHBbMl0gKiBNYXRoLmNvcyhyYWQpIC0gcFswXSAqIE1hdGguc2luKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdICogTWF0aC5jb3MocmFkKSAtIHBbMV0gKiBNYXRoLnNpbihyYWQpO1xuICByWzFdID0gcFswXSAqIE1hdGguc2luKHJhZCkgKyBwWzFdICogTWF0aC5jb3MocmFkKTtcbiAgclsyXSA9IHBbMl07IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gM0QgdmVjdG9yc1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBtYWcxID0gTWF0aC5zcXJ0KGF4ICogYXggKyBheSAqIGF5ICsgYXogKiBheiksXG4gICAgICBtYWcyID0gTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiksXG4gICAgICBtYWcgPSBtYWcxICogbWFnMixcbiAgICAgIGNvc2luZSA9IG1hZyAmJiBkb3QoYSwgYikgLyBtYWc7XG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMyhcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzNzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzMuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdAbWF0aC5nbC93ZWItbWVyY2F0b3I6IGFzc2VydGlvbiBmYWlsZWQuJyk7XG4gIH1cbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgY3JlYXRlTWF0NCwgdHJhbnNmb3JtVmVjdG9yLCBsb2cyIH0gZnJvbSAnLi9tYXRoLXV0aWxzJztcbmltcG9ydCAqIGFzIG1hdDQgZnJvbSAnZ2wtbWF0cml4L21hdDQnO1xuaW1wb3J0ICogYXMgdmVjMiBmcm9tICdnbC1tYXRyaXgvdmVjMic7XG5pbXBvcnQgKiBhcyB2ZWMzIGZyb20gJ2dsLW1hdHJpeC92ZWMzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi9hc3NlcnQnO1xudmFyIFBJID0gTWF0aC5QSTtcbnZhciBQSV80ID0gUEkgLyA0O1xudmFyIERFR1JFRVNfVE9fUkFESUFOUyA9IFBJIC8gMTgwO1xudmFyIFJBRElBTlNfVE9fREVHUkVFUyA9IDE4MCAvIFBJO1xudmFyIFRJTEVfU0laRSA9IDUxMjtcbnZhciBFQVJUSF9DSVJDVU1GRVJFTkNFID0gNDAuMDNlNjtcbmV4cG9ydCB2YXIgREVGQVVMVF9BTFRJVFVERSA9IDEuNTtcbmV4cG9ydCBmdW5jdGlvbiB6b29tVG9TY2FsZSh6b29tKSB7XG4gIHJldHVybiBNYXRoLnBvdygyLCB6b29tKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZVRvWm9vbShzY2FsZSkge1xuICByZXR1cm4gbG9nMihzY2FsZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG5nTGF0VG9Xb3JsZChfcmVmKSB7XG4gIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgbG5nID0gX3JlZjJbMF0sXG4gICAgICBsYXQgPSBfcmVmMlsxXTtcblxuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxuZykpO1xuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdCkgJiYgbGF0ID49IC05MCAmJiBsYXQgPD0gOTAsICdpbnZhbGlkIGxhdGl0dWRlJyk7XG4gIHZhciBsYW1iZGEyID0gbG5nICogREVHUkVFU19UT19SQURJQU5TO1xuICB2YXIgcGhpMiA9IGxhdCAqIERFR1JFRVNfVE9fUkFESUFOUztcbiAgdmFyIHggPSBUSUxFX1NJWkUgKiAobGFtYmRhMiArIFBJKSAvICgyICogUEkpO1xuICB2YXIgeSA9IFRJTEVfU0laRSAqIChQSSArIE1hdGgubG9nKE1hdGgudGFuKFBJXzQgKyBwaGkyICogMC41KSkpIC8gKDIgKiBQSSk7XG4gIHJldHVybiBbeCwgeV07XG59XG5leHBvcnQgZnVuY3Rpb24gd29ybGRUb0xuZ0xhdChfcmVmMykge1xuICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMiksXG4gICAgICB4ID0gX3JlZjRbMF0sXG4gICAgICB5ID0gX3JlZjRbMV07XG5cbiAgdmFyIGxhbWJkYTIgPSB4IC8gVElMRV9TSVpFICogKDIgKiBQSSkgLSBQSTtcbiAgdmFyIHBoaTIgPSAyICogKE1hdGguYXRhbihNYXRoLmV4cCh5IC8gVElMRV9TSVpFICogKDIgKiBQSSkgLSBQSSkpIC0gUElfNCk7XG4gIHJldHVybiBbbGFtYmRhMiAqIFJBRElBTlNfVE9fREVHUkVFUywgcGhpMiAqIFJBRElBTlNfVE9fREVHUkVFU107XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0ZXJab29tKF9yZWY1KSB7XG4gIHZhciBsYXRpdHVkZSA9IF9yZWY1LmxhdGl0dWRlO1xuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGxhdGl0dWRlKSk7XG4gIHZhciBsYXRDb3NpbmUgPSBNYXRoLmNvcyhsYXRpdHVkZSAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG4gIHJldHVybiBzY2FsZVRvWm9vbShFQVJUSF9DSVJDVU1GRVJFTkNFICogbGF0Q29zaW5lKSAtIDk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2VTY2FsZXMoX3JlZjYpIHtcbiAgdmFyIGxhdGl0dWRlID0gX3JlZjYubGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGUgPSBfcmVmNi5sb25naXR1ZGUsXG4gICAgICBfcmVmNiRoaWdoUHJlY2lzaW9uID0gX3JlZjYuaGlnaFByZWNpc2lvbixcbiAgICAgIGhpZ2hQcmVjaXNpb24gPSBfcmVmNiRoaWdoUHJlY2lzaW9uID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY2JGhpZ2hQcmVjaXNpb247XG4gIGFzc2VydChOdW1iZXIuaXNGaW5pdGUobGF0aXR1ZGUpICYmIE51bWJlci5pc0Zpbml0ZShsb25naXR1ZGUpKTtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgd29ybGRTaXplID0gVElMRV9TSVpFO1xuICB2YXIgbGF0Q29zaW5lID0gTWF0aC5jb3MobGF0aXR1ZGUgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICB2YXIgdW5pdHNQZXJEZWdyZWVYID0gd29ybGRTaXplIC8gMzYwO1xuICB2YXIgdW5pdHNQZXJEZWdyZWVZID0gdW5pdHNQZXJEZWdyZWVYIC8gbGF0Q29zaW5lO1xuICB2YXIgYWx0VW5pdHNQZXJNZXRlciA9IHdvcmxkU2l6ZSAvIEVBUlRIX0NJUkNVTUZFUkVOQ0UgLyBsYXRDb3NpbmU7XG4gIHJlc3VsdC51bml0c1Blck1ldGVyID0gW2FsdFVuaXRzUGVyTWV0ZXIsIGFsdFVuaXRzUGVyTWV0ZXIsIGFsdFVuaXRzUGVyTWV0ZXJdO1xuICByZXN1bHQubWV0ZXJzUGVyVW5pdCA9IFsxIC8gYWx0VW5pdHNQZXJNZXRlciwgMSAvIGFsdFVuaXRzUGVyTWV0ZXIsIDEgLyBhbHRVbml0c1Blck1ldGVyXTtcbiAgcmVzdWx0LnVuaXRzUGVyRGVncmVlID0gW3VuaXRzUGVyRGVncmVlWCwgdW5pdHNQZXJEZWdyZWVZLCBhbHRVbml0c1Blck1ldGVyXTtcbiAgcmVzdWx0LmRlZ3JlZXNQZXJVbml0ID0gWzEgLyB1bml0c1BlckRlZ3JlZVgsIDEgLyB1bml0c1BlckRlZ3JlZVksIDEgLyBhbHRVbml0c1Blck1ldGVyXTtcblxuICBpZiAoaGlnaFByZWNpc2lvbikge1xuICAgIHZhciBsYXRDb3NpbmUyID0gREVHUkVFU19UT19SQURJQU5TICogTWF0aC50YW4obGF0aXR1ZGUgKiBERUdSRUVTX1RPX1JBRElBTlMpIC8gbGF0Q29zaW5lO1xuICAgIHZhciB1bml0c1BlckRlZ3JlZVkyID0gdW5pdHNQZXJEZWdyZWVYICogbGF0Q29zaW5lMiAvIDI7XG4gICAgdmFyIGFsdFVuaXRzUGVyRGVncmVlMiA9IHdvcmxkU2l6ZSAvIEVBUlRIX0NJUkNVTUZFUkVOQ0UgKiBsYXRDb3NpbmUyO1xuICAgIHZhciBhbHRVbml0c1Blck1ldGVyMiA9IGFsdFVuaXRzUGVyRGVncmVlMiAvIHVuaXRzUGVyRGVncmVlWSAqIGFsdFVuaXRzUGVyTWV0ZXI7XG4gICAgcmVzdWx0LnVuaXRzUGVyRGVncmVlMiA9IFswLCB1bml0c1BlckRlZ3JlZVkyLCBhbHRVbml0c1BlckRlZ3JlZTJdO1xuICAgIHJlc3VsdC51bml0c1Blck1ldGVyMiA9IFthbHRVbml0c1Blck1ldGVyMiwgMCwgYWx0VW5pdHNQZXJNZXRlcjJdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRNZXRlcnNUb0xuZ0xhdChsbmdMYXRaLCB4eXopIHtcbiAgdmFyIF9sbmdMYXRaID0gX3NsaWNlZFRvQXJyYXkobG5nTGF0WiwgMyksXG4gICAgICBsb25naXR1ZGUgPSBfbG5nTGF0WlswXSxcbiAgICAgIGxhdGl0dWRlID0gX2xuZ0xhdFpbMV0sXG4gICAgICB6MCA9IF9sbmdMYXRaWzJdO1xuXG4gIHZhciBfeHl6ID0gX3NsaWNlZFRvQXJyYXkoeHl6LCAzKSxcbiAgICAgIHggPSBfeHl6WzBdLFxuICAgICAgeSA9IF94eXpbMV0sXG4gICAgICB6ID0gX3h5elsyXTtcblxuICB2YXIgX2dldERpc3RhbmNlU2NhbGVzID0gZ2V0RGlzdGFuY2VTY2FsZXMoe1xuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICBoaWdoUHJlY2lzaW9uOiB0cnVlXG4gIH0pLFxuICAgICAgdW5pdHNQZXJNZXRlciA9IF9nZXREaXN0YW5jZVNjYWxlcy51bml0c1Blck1ldGVyLFxuICAgICAgdW5pdHNQZXJNZXRlcjIgPSBfZ2V0RGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlcjI7XG5cbiAgdmFyIHdvcmxkc3BhY2UgPSBsbmdMYXRUb1dvcmxkKGxuZ0xhdFopO1xuICB3b3JsZHNwYWNlWzBdICs9IHggKiAodW5pdHNQZXJNZXRlclswXSArIHVuaXRzUGVyTWV0ZXIyWzBdICogeSk7XG4gIHdvcmxkc3BhY2VbMV0gKz0geSAqICh1bml0c1Blck1ldGVyWzFdICsgdW5pdHNQZXJNZXRlcjJbMV0gKiB5KTtcbiAgdmFyIG5ld0xuZ0xhdCA9IHdvcmxkVG9MbmdMYXQod29ybGRzcGFjZSk7XG4gIHZhciBuZXdaID0gKHowIHx8IDApICsgKHogfHwgMCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUoejApIHx8IE51bWJlci5pc0Zpbml0ZSh6KSA/IFtuZXdMbmdMYXRbMF0sIG5ld0xuZ0xhdFsxXSwgbmV3Wl0gOiBuZXdMbmdMYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld01hdHJpeChfcmVmNykge1xuICB2YXIgaGVpZ2h0ID0gX3JlZjcuaGVpZ2h0LFxuICAgICAgcGl0Y2ggPSBfcmVmNy5waXRjaCxcbiAgICAgIGJlYXJpbmcgPSBfcmVmNy5iZWFyaW5nLFxuICAgICAgYWx0aXR1ZGUgPSBfcmVmNy5hbHRpdHVkZSxcbiAgICAgIHNjYWxlID0gX3JlZjcuc2NhbGUsXG4gICAgICBfcmVmNyRjZW50ZXIgPSBfcmVmNy5jZW50ZXIsXG4gICAgICBjZW50ZXIgPSBfcmVmNyRjZW50ZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmNyRjZW50ZXI7XG4gIHZhciB2bSA9IGNyZWF0ZU1hdDQoKTtcbiAgbWF0NC50cmFuc2xhdGUodm0sIHZtLCBbMCwgMCwgLWFsdGl0dWRlXSk7XG4gIG1hdDQucm90YXRlWCh2bSwgdm0sIC1waXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG4gIG1hdDQucm90YXRlWih2bSwgdm0sIGJlYXJpbmcgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuICBzY2FsZSAvPSBoZWlnaHQ7XG4gIG1hdDQuc2NhbGUodm0sIHZtLCBbc2NhbGUsIHNjYWxlLCBzY2FsZV0pO1xuXG4gIGlmIChjZW50ZXIpIHtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh2bSwgdm0sIHZlYzMubmVnYXRlKFtdLCBjZW50ZXIpKTtcbiAgfVxuXG4gIHJldHVybiB2bTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uUGFyYW1ldGVycyhfcmVmOCkge1xuICB2YXIgd2lkdGggPSBfcmVmOC53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWY4LmhlaWdodCxcbiAgICAgIF9yZWY4JGZvdnkgPSBfcmVmOC5mb3Z5LFxuICAgICAgZm92eSA9IF9yZWY4JGZvdnkgPT09IHZvaWQgMCA/IGFsdGl0dWRlVG9Gb3Z5KERFRkFVTFRfQUxUSVRVREUpIDogX3JlZjgkZm92eSxcbiAgICAgIGFsdGl0dWRlID0gX3JlZjguYWx0aXR1ZGUsXG4gICAgICBfcmVmOCRwaXRjaCA9IF9yZWY4LnBpdGNoLFxuICAgICAgcGl0Y2ggPSBfcmVmOCRwaXRjaCA9PT0gdm9pZCAwID8gMCA6IF9yZWY4JHBpdGNoLFxuICAgICAgX3JlZjgkbmVhclpNdWx0aXBsaWVyID0gX3JlZjgubmVhclpNdWx0aXBsaWVyLFxuICAgICAgbmVhclpNdWx0aXBsaWVyID0gX3JlZjgkbmVhclpNdWx0aXBsaWVyID09PSB2b2lkIDAgPyAxIDogX3JlZjgkbmVhclpNdWx0aXBsaWVyLFxuICAgICAgX3JlZjgkZmFyWk11bHRpcGxpZXIgPSBfcmVmOC5mYXJaTXVsdGlwbGllcixcbiAgICAgIGZhclpNdWx0aXBsaWVyID0gX3JlZjgkZmFyWk11bHRpcGxpZXIgPT09IHZvaWQgMCA/IDEgOiBfcmVmOCRmYXJaTXVsdGlwbGllcjtcblxuICBpZiAoYWx0aXR1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGZvdnkgPSBhbHRpdHVkZVRvRm92eShhbHRpdHVkZSk7XG4gIH1cblxuICB2YXIgaGFsZkZvdiA9IDAuNSAqIGZvdnkgKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIHZhciBmb2NhbERpc3RhbmNlID0gZm92eVRvQWx0aXR1ZGUoZm92eSk7XG4gIHZhciBwaXRjaFJhZGlhbnMgPSBwaXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUztcbiAgdmFyIHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPSBNYXRoLnNpbihoYWxmRm92KSAqIGZvY2FsRGlzdGFuY2UgLyBNYXRoLnNpbihNYXRoLm1pbihNYXRoLm1heChNYXRoLlBJIC8gMiAtIHBpdGNoUmFkaWFucyAtIGhhbGZGb3YsIDAuMDEpLCBNYXRoLlBJIC0gMC4wMSkpO1xuICB2YXIgZmFyWiA9IE1hdGguc2luKHBpdGNoUmFkaWFucykgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgZm9jYWxEaXN0YW5jZTtcbiAgcmV0dXJuIHtcbiAgICBmb3Y6IDIgKiBoYWxmRm92LFxuICAgIGFzcGVjdDogd2lkdGggLyBoZWlnaHQsXG4gICAgZm9jYWxEaXN0YW5jZTogZm9jYWxEaXN0YW5jZSxcbiAgICBuZWFyOiBuZWFyWk11bHRpcGxpZXIsXG4gICAgZmFyOiBmYXJaICogZmFyWk11bHRpcGxpZXJcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uTWF0cml4KF9yZWY5KSB7XG4gIHZhciB3aWR0aCA9IF9yZWY5LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZjkuaGVpZ2h0LFxuICAgICAgcGl0Y2ggPSBfcmVmOS5waXRjaCxcbiAgICAgIGFsdGl0dWRlID0gX3JlZjkuYWx0aXR1ZGUsXG4gICAgICBmb3Z5ID0gX3JlZjkuZm92eSxcbiAgICAgIG5lYXJaTXVsdGlwbGllciA9IF9yZWY5Lm5lYXJaTXVsdGlwbGllcixcbiAgICAgIGZhclpNdWx0aXBsaWVyID0gX3JlZjkuZmFyWk11bHRpcGxpZXI7XG5cbiAgdmFyIF9nZXRQcm9qZWN0aW9uUGFyYW1ldCA9IGdldFByb2plY3Rpb25QYXJhbWV0ZXJzKHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgYWx0aXR1ZGU6IGFsdGl0dWRlLFxuICAgIGZvdnk6IGZvdnksXG4gICAgcGl0Y2g6IHBpdGNoLFxuICAgIG5lYXJaTXVsdGlwbGllcjogbmVhclpNdWx0aXBsaWVyLFxuICAgIGZhclpNdWx0aXBsaWVyOiBmYXJaTXVsdGlwbGllclxuICB9KSxcbiAgICAgIGZvdiA9IF9nZXRQcm9qZWN0aW9uUGFyYW1ldC5mb3YsXG4gICAgICBhc3BlY3QgPSBfZ2V0UHJvamVjdGlvblBhcmFtZXQuYXNwZWN0LFxuICAgICAgbmVhciA9IF9nZXRQcm9qZWN0aW9uUGFyYW1ldC5uZWFyLFxuICAgICAgZmFyID0gX2dldFByb2plY3Rpb25QYXJhbWV0LmZhcjtcblxuICB2YXIgcHJvamVjdGlvbk1hdHJpeCA9IG1hdDQucGVyc3BlY3RpdmUoW10sIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIpO1xuICByZXR1cm4gcHJvamVjdGlvbk1hdHJpeDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbHRpdHVkZVRvRm92eShhbHRpdHVkZSkge1xuICByZXR1cm4gMiAqIE1hdGguYXRhbigwLjUgLyBhbHRpdHVkZSkgKiBSQURJQU5TX1RPX0RFR1JFRVM7XG59XG5leHBvcnQgZnVuY3Rpb24gZm92eVRvQWx0aXR1ZGUoZm92eSkge1xuICByZXR1cm4gMC41IC8gTWF0aC50YW4oMC41ICogZm92eSAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd29ybGRUb1BpeGVscyh4eXosIHBpeGVsUHJvamVjdGlvbk1hdHJpeCkge1xuICB2YXIgX3h5ejIgPSBfc2xpY2VkVG9BcnJheSh4eXosIDMpLFxuICAgICAgeCA9IF94eXoyWzBdLFxuICAgICAgeSA9IF94eXoyWzFdLFxuICAgICAgX3h5ejIkID0gX3h5ejJbMl0sXG4gICAgICB6ID0gX3h5ejIkID09PSB2b2lkIDAgPyAwIDogX3h5ejIkO1xuXG4gIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoeCkgJiYgTnVtYmVyLmlzRmluaXRlKHkpICYmIE51bWJlci5pc0Zpbml0ZSh6KSk7XG4gIHJldHVybiB0cmFuc2Zvcm1WZWN0b3IocGl4ZWxQcm9qZWN0aW9uTWF0cml4LCBbeCwgeSwgeiwgMV0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsc1RvV29ybGQoeHl6LCBwaXhlbFVucHJvamVjdGlvbk1hdHJpeCkge1xuICB2YXIgdGFyZ2V0WiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcblxuICB2YXIgX3h5ejMgPSBfc2xpY2VkVG9BcnJheSh4eXosIDMpLFxuICAgICAgeCA9IF94eXozWzBdLFxuICAgICAgeSA9IF94eXozWzFdLFxuICAgICAgeiA9IF94eXozWzJdO1xuXG4gIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoeCkgJiYgTnVtYmVyLmlzRmluaXRlKHkpLCAnaW52YWxpZCBwaXhlbCBjb29yZGluYXRlJyk7XG5cbiAgaWYgKE51bWJlci5pc0Zpbml0ZSh6KSkge1xuICAgIHZhciBjb29yZCA9IHRyYW5zZm9ybVZlY3RvcihwaXhlbFVucHJvamVjdGlvbk1hdHJpeCwgW3gsIHksIHosIDFdKTtcbiAgICByZXR1cm4gY29vcmQ7XG4gIH1cblxuICB2YXIgY29vcmQwID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgeSwgMCwgMV0pO1xuICB2YXIgY29vcmQxID0gdHJhbnNmb3JtVmVjdG9yKHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4LCBbeCwgeSwgMSwgMV0pO1xuICB2YXIgejAgPSBjb29yZDBbMl07XG4gIHZhciB6MSA9IGNvb3JkMVsyXTtcbiAgdmFyIHQgPSB6MCA9PT0gejEgPyAwIDogKCh0YXJnZXRaIHx8IDApIC0gejApIC8gKHoxIC0gejApO1xuICByZXR1cm4gdmVjMi5sZXJwKFtdLCBjb29yZDAsIGNvb3JkMSwgdCk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgbG9nMiB9IGZyb20gJy4vbWF0aC11dGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaXRCb3VuZHMoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBib3VuZHMgPSBfcmVmLmJvdW5kcyxcbiAgICAgIF9yZWYkbWluRXh0ZW50ID0gX3JlZi5taW5FeHRlbnQsXG4gICAgICBtaW5FeHRlbnQgPSBfcmVmJG1pbkV4dGVudCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkbWluRXh0ZW50LFxuICAgICAgX3JlZiRtYXhab29tID0gX3JlZi5tYXhab29tLFxuICAgICAgbWF4Wm9vbSA9IF9yZWYkbWF4Wm9vbSA9PT0gdm9pZCAwID8gMjQgOiBfcmVmJG1heFpvb20sXG4gICAgICBfcmVmJHBhZGRpbmcgPSBfcmVmLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX3JlZiRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRwYWRkaW5nLFxuICAgICAgX3JlZiRvZmZzZXQgPSBfcmVmLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9yZWYkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfcmVmJG9mZnNldDtcblxuICB2YXIgX2JvdW5kcyA9IF9zbGljZWRUb0FycmF5KGJvdW5kcywgMiksXG4gICAgICBfYm91bmRzJCA9IF9zbGljZWRUb0FycmF5KF9ib3VuZHNbMF0sIDIpLFxuICAgICAgd2VzdCA9IF9ib3VuZHMkWzBdLFxuICAgICAgc291dGggPSBfYm91bmRzJFsxXSxcbiAgICAgIF9ib3VuZHMkMiA9IF9zbGljZWRUb0FycmF5KF9ib3VuZHNbMV0sIDIpLFxuICAgICAgZWFzdCA9IF9ib3VuZHMkMlswXSxcbiAgICAgIG5vcnRoID0gX2JvdW5kcyQyWzFdO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUocGFkZGluZykpIHtcbiAgICB2YXIgcCA9IHBhZGRpbmc7XG4gICAgcGFkZGluZyA9IHtcbiAgICAgIHRvcDogcCxcbiAgICAgIGJvdHRvbTogcCxcbiAgICAgIGxlZnQ6IHAsXG4gICAgICByaWdodDogcFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShwYWRkaW5nLnRvcCkgJiYgTnVtYmVyLmlzRmluaXRlKHBhZGRpbmcuYm90dG9tKSAmJiBOdW1iZXIuaXNGaW5pdGUocGFkZGluZy5sZWZ0KSAmJiBOdW1iZXIuaXNGaW5pdGUocGFkZGluZy5yaWdodCkpO1xuICB9XG5cbiAgdmFyIHZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoe1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBsb25naXR1ZGU6IDAsXG4gICAgbGF0aXR1ZGU6IDAsXG4gICAgem9vbTogMFxuICB9KTtcbiAgdmFyIG53ID0gdmlld3BvcnQucHJvamVjdChbd2VzdCwgbm9ydGhdKTtcbiAgdmFyIHNlID0gdmlld3BvcnQucHJvamVjdChbZWFzdCwgc291dGhdKTtcbiAgdmFyIHNpemUgPSBbTWF0aC5tYXgoTWF0aC5hYnMoc2VbMF0gLSBud1swXSksIG1pbkV4dGVudCksIE1hdGgubWF4KE1hdGguYWJzKHNlWzFdIC0gbndbMV0pLCBtaW5FeHRlbnQpXTtcbiAgdmFyIHRhcmdldFNpemUgPSBbd2lkdGggLSBwYWRkaW5nLmxlZnQgLSBwYWRkaW5nLnJpZ2h0IC0gTWF0aC5hYnMob2Zmc2V0WzBdKSAqIDIsIGhlaWdodCAtIHBhZGRpbmcudG9wIC0gcGFkZGluZy5ib3R0b20gLSBNYXRoLmFicyhvZmZzZXRbMV0pICogMl07XG4gIGFzc2VydCh0YXJnZXRTaXplWzBdID4gMCAmJiB0YXJnZXRTaXplWzFdID4gMCk7XG4gIHZhciBzY2FsZVggPSB0YXJnZXRTaXplWzBdIC8gc2l6ZVswXTtcbiAgdmFyIHNjYWxlWSA9IHRhcmdldFNpemVbMV0gLyBzaXplWzFdO1xuICB2YXIgb2Zmc2V0WCA9IChwYWRkaW5nLnJpZ2h0IC0gcGFkZGluZy5sZWZ0KSAvIDIgLyBzY2FsZVg7XG4gIHZhciBvZmZzZXRZID0gKHBhZGRpbmcuYm90dG9tIC0gcGFkZGluZy50b3ApIC8gMiAvIHNjYWxlWTtcbiAgdmFyIGNlbnRlciA9IFsoc2VbMF0gKyBud1swXSkgLyAyICsgb2Zmc2V0WCwgKHNlWzFdICsgbndbMV0pIC8gMiArIG9mZnNldFldO1xuICB2YXIgY2VudGVyTG5nTGF0ID0gdmlld3BvcnQudW5wcm9qZWN0KGNlbnRlcik7XG4gIHZhciB6b29tID0gTWF0aC5taW4obWF4Wm9vbSwgdmlld3BvcnQuem9vbSArIGxvZzIoTWF0aC5hYnMoTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSkpO1xuICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKHpvb20pKTtcbiAgcmV0dXJuIHtcbiAgICBsb25naXR1ZGU6IGNlbnRlckxuZ0xhdFswXSxcbiAgICBsYXRpdHVkZTogY2VudGVyTG5nTGF0WzFdLFxuICAgIHpvb206IHpvb21cbiAgfTtcbn0iLCJpbXBvcnQgeyB3b3JsZFRvTG5nTGF0IH0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuaW1wb3J0ICogYXMgdmVjMiBmcm9tICdnbC1tYXRyaXgvdmVjMic7XG5pbXBvcnQgeyB0cmFuc2Zvcm1WZWN0b3IgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xudmFyIERFR1JFRVNfVE9fUkFESUFOUyA9IE1hdGguUEkgLyAxODA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZHModmlld3BvcnQpIHtcbiAgdmFyIHogPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciB3aWR0aCA9IHZpZXdwb3J0LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgdW5wcm9qZWN0ID0gdmlld3BvcnQudW5wcm9qZWN0O1xuICB2YXIgdW5wcm9qZWN0T3BzID0ge1xuICAgIHRhcmdldFo6IHpcbiAgfTtcbiAgdmFyIGJvdHRvbUxlZnQgPSB1bnByb2plY3QoWzAsIGhlaWdodF0sIHVucHJvamVjdE9wcyk7XG4gIHZhciBib3R0b21SaWdodCA9IHVucHJvamVjdChbd2lkdGgsIGhlaWdodF0sIHVucHJvamVjdE9wcyk7XG4gIHZhciB0b3BMZWZ0O1xuICB2YXIgdG9wUmlnaHQ7XG4gIHZhciBoYWxmRm92ID0gdmlld3BvcnQuZm92eSA/IDAuNSAqIHZpZXdwb3J0LmZvdnkgKiBERUdSRUVTX1RPX1JBRElBTlMgOiBNYXRoLmF0YW4oMC41IC8gdmlld3BvcnQuYWx0aXR1ZGUpO1xuICB2YXIgYW5nbGVUb0dyb3VuZCA9ICg5MCAtIHZpZXdwb3J0LnBpdGNoKSAqIERFR1JFRVNfVE9fUkFESUFOUztcblxuICBpZiAoaGFsZkZvdiA+IGFuZ2xlVG9Hcm91bmQgLSAwLjAxKSB7XG4gICAgdG9wTGVmdCA9IHVucHJvamVjdE9uRmFyUGxhbmUodmlld3BvcnQsIDAsIHopO1xuICAgIHRvcFJpZ2h0ID0gdW5wcm9qZWN0T25GYXJQbGFuZSh2aWV3cG9ydCwgd2lkdGgsIHopO1xuICB9IGVsc2Uge1xuICAgIHRvcExlZnQgPSB1bnByb2plY3QoWzAsIDBdLCB1bnByb2plY3RPcHMpO1xuICAgIHRvcFJpZ2h0ID0gdW5wcm9qZWN0KFt3aWR0aCwgMF0sIHVucHJvamVjdE9wcyk7XG4gIH1cblxuICByZXR1cm4gW2JvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LCB0b3BSaWdodCwgdG9wTGVmdF07XG59XG5cbmZ1bmN0aW9uIHVucHJvamVjdE9uRmFyUGxhbmUodmlld3BvcnQsIHgsIHRhcmdldFopIHtcbiAgdmFyIHBpeGVsVW5wcm9qZWN0aW9uTWF0cml4ID0gdmlld3BvcnQucGl4ZWxVbnByb2plY3Rpb25NYXRyaXg7XG4gIHZhciBjb29yZDAgPSB0cmFuc2Zvcm1WZWN0b3IocGl4ZWxVbnByb2plY3Rpb25NYXRyaXgsIFt4LCAwLCAxLCAxXSk7XG4gIHZhciBjb29yZDEgPSB0cmFuc2Zvcm1WZWN0b3IocGl4ZWxVbnByb2plY3Rpb25NYXRyaXgsIFt4LCB2aWV3cG9ydC5oZWlnaHQsIDEsIDFdKTtcbiAgdmFyIHogPSB0YXJnZXRaICogdmlld3BvcnQuZGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlclsyXTtcbiAgdmFyIHQgPSAoeiAtIGNvb3JkMFsyXSkgLyAoY29vcmQxWzJdIC0gY29vcmQwWzJdKTtcbiAgdmFyIGNvb3JkID0gdmVjMi5sZXJwKFtdLCBjb29yZDAsIGNvb3JkMSwgdCk7XG4gIHZhciByZXN1bHQgPSB3b3JsZFRvTG5nTGF0KGNvb3JkKTtcbiAgcmVzdWx0WzJdID0gdGFyZ2V0WjtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWF0NCB9IGZyb20gJy4vbWF0aC11dGlscyc7XG5pbXBvcnQgeyB6b29tVG9TY2FsZSwgcGl4ZWxzVG9Xb3JsZCwgbG5nTGF0VG9Xb3JsZCwgd29ybGRUb0xuZ0xhdCwgd29ybGRUb1BpeGVscywgYWx0aXR1ZGVUb0ZvdnksIGZvdnlUb0FsdGl0dWRlLCBERUZBVUxUX0FMVElUVURFLCBnZXRQcm9qZWN0aW9uTWF0cml4LCBnZXREaXN0YW5jZVNjYWxlcywgZ2V0Vmlld01hdHJpeCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmltcG9ydCBfZml0Qm91bmRzIGZyb20gJy4vZml0LWJvdW5kcyc7XG5pbXBvcnQgZ2V0Qm91bmRzIGZyb20gJy4vZ2V0LWJvdW5kcyc7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gJ2dsLW1hdHJpeC9tYXQ0JztcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSAnZ2wtbWF0cml4L3ZlYzInO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tICdnbC1tYXRyaXgvdmVjMyc7XG5cbnZhciBXZWJNZXJjYXRvclZpZXdwb3J0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gV2ViTWVyY2F0b3JWaWV3cG9ydCgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDFcbiAgICB9LFxuICAgICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0LFxuICAgICAgICBfcmVmJGxhdGl0dWRlID0gX3JlZi5sYXRpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGUgPSBfcmVmJGxhdGl0dWRlID09PSB2b2lkIDAgPyAwIDogX3JlZiRsYXRpdHVkZSxcbiAgICAgICAgX3JlZiRsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlID0gX3JlZiRsb25naXR1ZGUgPT09IHZvaWQgMCA/IDAgOiBfcmVmJGxvbmdpdHVkZSxcbiAgICAgICAgX3JlZiR6b29tID0gX3JlZi56b29tLFxuICAgICAgICB6b29tID0gX3JlZiR6b29tID09PSB2b2lkIDAgPyAwIDogX3JlZiR6b29tLFxuICAgICAgICBfcmVmJHBpdGNoID0gX3JlZi5waXRjaCxcbiAgICAgICAgcGl0Y2ggPSBfcmVmJHBpdGNoID09PSB2b2lkIDAgPyAwIDogX3JlZiRwaXRjaCxcbiAgICAgICAgX3JlZiRiZWFyaW5nID0gX3JlZi5iZWFyaW5nLFxuICAgICAgICBiZWFyaW5nID0gX3JlZiRiZWFyaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRiZWFyaW5nLFxuICAgICAgICBfcmVmJGFsdGl0dWRlID0gX3JlZi5hbHRpdHVkZSxcbiAgICAgICAgYWx0aXR1ZGUgPSBfcmVmJGFsdGl0dWRlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRhbHRpdHVkZSxcbiAgICAgICAgX3JlZiRmb3Z5ID0gX3JlZi5mb3Z5LFxuICAgICAgICBmb3Z5ID0gX3JlZiRmb3Z5ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRmb3Z5LFxuICAgICAgICBfcmVmJHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbixcbiAgICAgICAgcG9zaXRpb24gPSBfcmVmJHBvc2l0aW9uID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRwb3NpdGlvbixcbiAgICAgICAgX3JlZiRuZWFyWk11bHRpcGxpZXIgPSBfcmVmLm5lYXJaTXVsdGlwbGllcixcbiAgICAgICAgbmVhclpNdWx0aXBsaWVyID0gX3JlZiRuZWFyWk11bHRpcGxpZXIgPT09IHZvaWQgMCA/IDAuMDIgOiBfcmVmJG5lYXJaTXVsdGlwbGllcixcbiAgICAgICAgX3JlZiRmYXJaTXVsdGlwbGllciA9IF9yZWYuZmFyWk11bHRpcGxpZXIsXG4gICAgICAgIGZhclpNdWx0aXBsaWVyID0gX3JlZiRmYXJaTXVsdGlwbGllciA9PT0gdm9pZCAwID8gMS4wMSA6IF9yZWYkZmFyWk11bHRpcGxpZXI7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViTWVyY2F0b3JWaWV3cG9ydCk7XG5cbiAgICB3aWR0aCA9IHdpZHRoIHx8IDE7XG4gICAgaGVpZ2h0ID0gaGVpZ2h0IHx8IDE7XG5cbiAgICBpZiAoZm92eSA9PT0gbnVsbCAmJiBhbHRpdHVkZSA9PT0gbnVsbCkge1xuICAgICAgYWx0aXR1ZGUgPSBERUZBVUxUX0FMVElUVURFO1xuICAgICAgZm92eSA9IGFsdGl0dWRlVG9Gb3Z5KGFsdGl0dWRlKTtcbiAgICB9IGVsc2UgaWYgKGZvdnkgPT09IG51bGwpIHtcbiAgICAgIGZvdnkgPSBhbHRpdHVkZVRvRm92eShhbHRpdHVkZSk7XG4gICAgfSBlbHNlIGlmIChhbHRpdHVkZSA9PT0gbnVsbCkge1xuICAgICAgYWx0aXR1ZGUgPSBmb3Z5VG9BbHRpdHVkZShmb3Z5KTtcbiAgICB9XG5cbiAgICB2YXIgc2NhbGUgPSB6b29tVG9TY2FsZSh6b29tKTtcbiAgICBhbHRpdHVkZSA9IE1hdGgubWF4KDAuNzUsIGFsdGl0dWRlKTtcbiAgICB2YXIgZGlzdGFuY2VTY2FsZXMgPSBnZXREaXN0YW5jZVNjYWxlcyh7XG4gICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICAgIH0pO1xuICAgIHZhciBjZW50ZXIgPSBsbmdMYXRUb1dvcmxkKFtsb25naXR1ZGUsIGxhdGl0dWRlXSk7XG4gICAgY2VudGVyWzJdID0gMDtcblxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgdmVjMy5hZGQoY2VudGVyLCBjZW50ZXIsIHZlYzMubXVsKFtdLCBwb3NpdGlvbiwgZGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlcikpO1xuICAgIH1cblxuICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IGdldFByb2plY3Rpb25NYXRyaXgoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICBmb3Z5OiBmb3Z5LFxuICAgICAgbmVhclpNdWx0aXBsaWVyOiBuZWFyWk11bHRpcGxpZXIsXG4gICAgICBmYXJaTXVsdGlwbGllcjogZmFyWk11bHRpcGxpZXJcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdNYXRyaXggPSBnZXRWaWV3TWF0cml4KHtcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgY2VudGVyOiBjZW50ZXIsXG4gICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICBiZWFyaW5nOiBiZWFyaW5nLFxuICAgICAgYWx0aXR1ZGU6IGFsdGl0dWRlXG4gICAgfSk7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLmxhdGl0dWRlID0gbGF0aXR1ZGU7XG4gICAgdGhpcy5sb25naXR1ZGUgPSBsb25naXR1ZGU7XG4gICAgdGhpcy56b29tID0gem9vbTtcbiAgICB0aGlzLnBpdGNoID0gcGl0Y2g7XG4gICAgdGhpcy5iZWFyaW5nID0gYmVhcmluZztcbiAgICB0aGlzLmFsdGl0dWRlID0gYWx0aXR1ZGU7XG4gICAgdGhpcy5mb3Z5ID0gZm92eTtcbiAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICB0aGlzLm1ldGVyT2Zmc2V0ID0gcG9zaXRpb24gfHwgWzAsIDAsIDBdO1xuICAgIHRoaXMuZGlzdGFuY2VTY2FsZXMgPSBkaXN0YW5jZVNjYWxlcztcblxuICAgIHRoaXMuX2luaXRNYXRyaWNlcygpO1xuXG4gICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucHJvamVjdCA9IHRoaXMucHJvamVjdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMudW5wcm9qZWN0ID0gdGhpcy51bnByb2plY3QuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2plY3RQb3NpdGlvbiA9IHRoaXMucHJvamVjdFBvc2l0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy51bnByb2plY3RQb3NpdGlvbiA9IHRoaXMudW5wcm9qZWN0UG9zaXRpb24uYmluZCh0aGlzKTtcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFdlYk1lcmNhdG9yVmlld3BvcnQsIFt7XG4gICAga2V5OiBcIl9pbml0TWF0cmljZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2luaXRNYXRyaWNlcygpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMucHJvamVjdGlvbk1hdHJpeCxcbiAgICAgICAgICB2aWV3TWF0cml4ID0gdGhpcy52aWV3TWF0cml4O1xuICAgICAgdmFyIHZwbSA9IGNyZWF0ZU1hdDQoKTtcbiAgICAgIG1hdDQubXVsdGlwbHkodnBtLCB2cG0sIHByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgbWF0NC5tdWx0aXBseSh2cG0sIHZwbSwgdmlld01hdHJpeCk7XG4gICAgICB0aGlzLnZpZXdQcm9qZWN0aW9uTWF0cml4ID0gdnBtO1xuICAgICAgdmFyIG0gPSBjcmVhdGVNYXQ0KCk7XG4gICAgICBtYXQ0LnNjYWxlKG0sIG0sIFt3aWR0aCAvIDIsIC1oZWlnaHQgLyAyLCAxXSk7XG4gICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgIG1hdDQubXVsdGlwbHkobSwgbSwgdnBtKTtcbiAgICAgIHZhciBtSW52ZXJzZSA9IG1hdDQuaW52ZXJ0KGNyZWF0ZU1hdDQoKSwgbSk7XG5cbiAgICAgIGlmICghbUludmVyc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaXhlbCBwcm9qZWN0IG1hdHJpeCBub3QgaW52ZXJ0aWJsZScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBpeGVsUHJvamVjdGlvbk1hdHJpeCA9IG07XG4gICAgICB0aGlzLnBpeGVsVW5wcm9qZWN0aW9uTWF0cml4ID0gbUludmVyc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHModmlld3BvcnQpIHtcbiAgICAgIGlmICghKHZpZXdwb3J0IGluc3RhbmNlb2YgV2ViTWVyY2F0b3JWaWV3cG9ydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmlld3BvcnQud2lkdGggPT09IHRoaXMud2lkdGggJiYgdmlld3BvcnQuaGVpZ2h0ID09PSB0aGlzLmhlaWdodCAmJiBtYXQ0LmVxdWFscyh2aWV3cG9ydC5wcm9qZWN0aW9uTWF0cml4LCB0aGlzLnByb2plY3Rpb25NYXRyaXgpICYmIG1hdDQuZXF1YWxzKHZpZXdwb3J0LnZpZXdNYXRyaXgsIHRoaXMudmlld01hdHJpeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvamVjdCh4eXopIHtcbiAgICAgIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgICAgX3JlZjIkdG9wTGVmdCA9IF9yZWYyLnRvcExlZnQsXG4gICAgICAgICAgdG9wTGVmdCA9IF9yZWYyJHRvcExlZnQgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmMiR0b3BMZWZ0O1xuXG4gICAgICB2YXIgd29ybGRQb3NpdGlvbiA9IHRoaXMucHJvamVjdFBvc2l0aW9uKHh5eik7XG4gICAgICB2YXIgY29vcmQgPSB3b3JsZFRvUGl4ZWxzKHdvcmxkUG9zaXRpb24sIHRoaXMucGl4ZWxQcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgdmFyIF9jb29yZCA9IF9zbGljZWRUb0FycmF5KGNvb3JkLCAyKSxcbiAgICAgICAgICB4ID0gX2Nvb3JkWzBdLFxuICAgICAgICAgIHkgPSBfY29vcmRbMV07XG5cbiAgICAgIHZhciB5MiA9IHRvcExlZnQgPyB5IDogdGhpcy5oZWlnaHQgLSB5O1xuICAgICAgcmV0dXJuIHh5ei5sZW5ndGggPT09IDIgPyBbeCwgeTJdIDogW3gsIHkyLCBjb29yZFsyXV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVucHJvamVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnByb2plY3QoeHl6KSB7XG4gICAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICAgIF9yZWYzJHRvcExlZnQgPSBfcmVmMy50b3BMZWZ0LFxuICAgICAgICAgIHRvcExlZnQgPSBfcmVmMyR0b3BMZWZ0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjMkdG9wTGVmdCxcbiAgICAgICAgICBfcmVmMyR0YXJnZXRaID0gX3JlZjMudGFyZ2V0WixcbiAgICAgICAgICB0YXJnZXRaID0gX3JlZjMkdGFyZ2V0WiA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZjMkdGFyZ2V0WjtcblxuICAgICAgdmFyIF94eXogPSBfc2xpY2VkVG9BcnJheSh4eXosIDMpLFxuICAgICAgICAgIHggPSBfeHl6WzBdLFxuICAgICAgICAgIHkgPSBfeHl6WzFdLFxuICAgICAgICAgIHogPSBfeHl6WzJdO1xuXG4gICAgICB2YXIgeTIgPSB0b3BMZWZ0ID8geSA6IHRoaXMuaGVpZ2h0IC0geTtcbiAgICAgIHZhciB0YXJnZXRaV29ybGQgPSB0YXJnZXRaICYmIHRhcmdldFogKiB0aGlzLmRpc3RhbmNlU2NhbGVzLnVuaXRzUGVyTWV0ZXJbMl07XG4gICAgICB2YXIgY29vcmQgPSBwaXhlbHNUb1dvcmxkKFt4LCB5Miwgel0sIHRoaXMucGl4ZWxVbnByb2plY3Rpb25NYXRyaXgsIHRhcmdldFpXb3JsZCk7XG5cbiAgICAgIHZhciBfdGhpcyR1bnByb2plY3RQb3NpdGkgPSB0aGlzLnVucHJvamVjdFBvc2l0aW9uKGNvb3JkKSxcbiAgICAgICAgICBfdGhpcyR1bnByb2plY3RQb3NpdGkyID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkdW5wcm9qZWN0UG9zaXRpLCAzKSxcbiAgICAgICAgICBYID0gX3RoaXMkdW5wcm9qZWN0UG9zaXRpMlswXSxcbiAgICAgICAgICBZID0gX3RoaXMkdW5wcm9qZWN0UG9zaXRpMlsxXSxcbiAgICAgICAgICBaID0gX3RoaXMkdW5wcm9qZWN0UG9zaXRpMlsyXTtcblxuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh6KSkge1xuICAgICAgICByZXR1cm4gW1gsIFksIFpdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHRhcmdldFopID8gW1gsIFksIHRhcmdldFpdIDogW1gsIFldO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvamVjdFBvc2l0aW9uKHh5eikge1xuICAgICAgdmFyIF9sbmdMYXRUb1dvcmxkID0gbG5nTGF0VG9Xb3JsZCh4eXopLFxuICAgICAgICAgIF9sbmdMYXRUb1dvcmxkMiA9IF9zbGljZWRUb0FycmF5KF9sbmdMYXRUb1dvcmxkLCAyKSxcbiAgICAgICAgICBYID0gX2xuZ0xhdFRvV29ybGQyWzBdLFxuICAgICAgICAgIFkgPSBfbG5nTGF0VG9Xb3JsZDJbMV07XG5cbiAgICAgIHZhciBaID0gKHh5elsyXSB8fCAwKSAqIHRoaXMuZGlzdGFuY2VTY2FsZXMudW5pdHNQZXJNZXRlclsyXTtcbiAgICAgIHJldHVybiBbWCwgWSwgWl07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVucHJvamVjdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVucHJvamVjdFBvc2l0aW9uKHh5eikge1xuICAgICAgdmFyIF93b3JsZFRvTG5nTGF0ID0gd29ybGRUb0xuZ0xhdCh4eXopLFxuICAgICAgICAgIF93b3JsZFRvTG5nTGF0MiA9IF9zbGljZWRUb0FycmF5KF93b3JsZFRvTG5nTGF0LCAyKSxcbiAgICAgICAgICBYID0gX3dvcmxkVG9MbmdMYXQyWzBdLFxuICAgICAgICAgIFkgPSBfd29ybGRUb0xuZ0xhdDJbMV07XG5cbiAgICAgIHZhciBaID0gKHh5elsyXSB8fCAwKSAqIHRoaXMuZGlzdGFuY2VTY2FsZXMubWV0ZXJzUGVyVW5pdFsyXTtcbiAgICAgIHJldHVybiBbWCwgWSwgWl07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByb2plY3RGbGF0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3RGbGF0KGxuZ0xhdCkge1xuICAgICAgcmV0dXJuIGxuZ0xhdFRvV29ybGQobG5nTGF0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5wcm9qZWN0RmxhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnByb2plY3RGbGF0KHh5KSB7XG4gICAgICByZXR1cm4gd29ybGRUb0xuZ0xhdCh4eSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWFwQ2VudGVyQnlMbmdMYXRQb3NpdGlvbihfcmVmNCkge1xuICAgICAgdmFyIGxuZ0xhdCA9IF9yZWY0LmxuZ0xhdCxcbiAgICAgICAgICBwb3MgPSBfcmVmNC5wb3M7XG4gICAgICB2YXIgZnJvbUxvY2F0aW9uID0gcGl4ZWxzVG9Xb3JsZChwb3MsIHRoaXMucGl4ZWxVbnByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgdmFyIHRvTG9jYXRpb24gPSBsbmdMYXRUb1dvcmxkKGxuZ0xhdCk7XG4gICAgICB2YXIgdHJhbnNsYXRlID0gdmVjMi5hZGQoW10sIHRvTG9jYXRpb24sIHZlYzIubmVnYXRlKFtdLCBmcm9tTG9jYXRpb24pKTtcbiAgICAgIHZhciBuZXdDZW50ZXIgPSB2ZWMyLmFkZChbXSwgdGhpcy5jZW50ZXIsIHRyYW5zbGF0ZSk7XG4gICAgICByZXR1cm4gd29ybGRUb0xuZ0xhdChuZXdDZW50ZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb2NhdGlvbkF0UG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TG9jYXRpb25BdFBvaW50KF9yZWY1KSB7XG4gICAgICB2YXIgbG5nTGF0ID0gX3JlZjUubG5nTGF0LFxuICAgICAgICAgIHBvcyA9IF9yZWY1LnBvcztcbiAgICAgIHJldHVybiB0aGlzLmdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oe1xuICAgICAgICBsbmdMYXQ6IGxuZ0xhdCxcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaXRCb3VuZHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZml0Qm91bmRzKGJvdW5kcykge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuICAgICAgdmFyIF9maXRCb3VuZHMyID0gX2ZpdEJvdW5kcyhPYmplY3QuYXNzaWduKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm91bmRzOiBib3VuZHNcbiAgICAgIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICBsb25naXR1ZGUgPSBfZml0Qm91bmRzMi5sb25naXR1ZGUsXG4gICAgICAgICAgbGF0aXR1ZGUgPSBfZml0Qm91bmRzMi5sYXRpdHVkZSxcbiAgICAgICAgICB6b29tID0gX2ZpdEJvdW5kczIuem9vbTtcblxuICAgICAgcmV0dXJuIG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgem9vbTogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJvdW5kc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCb3VuZHMob3B0aW9ucykge1xuICAgICAgdmFyIGNvcm5lcnMgPSB0aGlzLmdldEJvdW5kaW5nUmVnaW9uKG9wdGlvbnMpO1xuICAgICAgdmFyIHdlc3QgPSBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoY29ybmVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHBbMF07XG4gICAgICB9KSkpO1xuICAgICAgdmFyIGVhc3QgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoY29ybmVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHBbMF07XG4gICAgICB9KSkpO1xuICAgICAgdmFyIHNvdXRoID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGNvcm5lcnMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwWzFdO1xuICAgICAgfSkpKTtcbiAgICAgIHZhciBub3J0aCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShjb3JuZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcFsxXTtcbiAgICAgIH0pKSk7XG4gICAgICByZXR1cm4gW1t3ZXN0LCBzb3V0aF0sIFtlYXN0LCBub3J0aF1dO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRCb3VuZGluZ1JlZ2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCb3VuZGluZ1JlZ2lvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBnZXRCb3VuZHModGhpcywgb3B0aW9ucy56IHx8IDApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXZWJNZXJjYXRvclZpZXdwb3J0O1xufSgpO1xuXG5leHBvcnQgeyBXZWJNZXJjYXRvclZpZXdwb3J0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5pbXBvcnQgeyBtb2QsIGxvZzIgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xudmFyIE1BWF9MQVRJVFVERSA9IDg1LjA1MTEzO1xudmFyIE1JTl9MQVRJVFVERSA9IC04NS4wNTExMztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZpZXdwb3J0UHJvcHMoX3JlZikge1xuICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gX3JlZi5sYXRpdHVkZSxcbiAgICAgIHpvb20gPSBfcmVmLnpvb20sXG4gICAgICBfcmVmJHBpdGNoID0gX3JlZi5waXRjaCxcbiAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGl0Y2gsXG4gICAgICBfcmVmJGJlYXJpbmcgPSBfcmVmLmJlYXJpbmcsXG4gICAgICBiZWFyaW5nID0gX3JlZiRiZWFyaW5nID09PSB2b2lkIDAgPyAwIDogX3JlZiRiZWFyaW5nO1xuXG4gIGlmIChsb25naXR1ZGUgPCAtMTgwIHx8IGxvbmdpdHVkZSA+IDE4MCkge1xuICAgIGxvbmdpdHVkZSA9IG1vZChsb25naXR1ZGUgKyAxODAsIDM2MCkgLSAxODA7XG4gIH1cblxuICBpZiAoYmVhcmluZyA8IC0xODAgfHwgYmVhcmluZyA+IDE4MCkge1xuICAgIGJlYXJpbmcgPSBtb2QoYmVhcmluZyArIDE4MCwgMzYwKSAtIDE4MDtcbiAgfVxuXG4gIHZhciBmbGF0Vmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICB6b29tOiB6b29tXG4gIH0pO1xuICB2YXIgdG9wWSA9IGZsYXRWaWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIE1BWF9MQVRJVFVERV0pWzFdO1xuICB2YXIgYm90dG9tWSA9IGZsYXRWaWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIE1JTl9MQVRJVFVERV0pWzFdO1xuICB2YXIgc2hpZnRZID0gMDtcblxuICBpZiAoYm90dG9tWSAtIHRvcFkgPCBoZWlnaHQpIHtcbiAgICB6b29tICs9IGxvZzIoaGVpZ2h0IC8gKGJvdHRvbVkgLSB0b3BZKSk7XG4gICAgZmxhdFZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgIHpvb206IHpvb21cbiAgICB9KTtcbiAgICB0b3BZID0gZmxhdFZpZXdwb3J0LnByb2plY3QoW2xvbmdpdHVkZSwgTUFYX0xBVElUVURFXSlbMV07XG4gICAgYm90dG9tWSA9IGZsYXRWaWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIE1JTl9MQVRJVFVERV0pWzFdO1xuICB9XG5cbiAgaWYgKHRvcFkgPiAwKSB7XG4gICAgc2hpZnRZID0gdG9wWTtcbiAgfSBlbHNlIGlmIChib3R0b21ZIDwgaGVpZ2h0KSB7XG4gICAgc2hpZnRZID0gYm90dG9tWSAtIGhlaWdodDtcbiAgfVxuXG4gIGlmIChzaGlmdFkpIHtcbiAgICBsYXRpdHVkZSA9IGZsYXRWaWV3cG9ydC51bnByb2plY3QoW3dpZHRoIC8gMiwgaGVpZ2h0IC8gMiArIHNoaWZ0WV0pWzFdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgIHpvb206IHpvb20sXG4gICAgcGl0Y2g6IHBpdGNoLFxuICAgIGJlYXJpbmc6IGJlYXJpbmdcbiAgfTtcbn0iLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKCFpdCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCB7IGxlcnAgfSBmcm9tICcuL21hdGgtdXRpbHMnO1xuaW1wb3J0IHsgc2NhbGVUb1pvb20sIHpvb21Ub1NjYWxlLCBsbmdMYXRUb1dvcmxkLCB3b3JsZFRvTG5nTGF0IH0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuaW1wb3J0ICogYXMgdmVjMiBmcm9tICdnbC1tYXRyaXgvdmVjMic7XG52YXIgRVBTSUxPTiA9IDAuMDE7XG52YXIgVklFV1BPUlRfVFJBTlNJVElPTl9QUk9QUyA9IFsnbG9uZ2l0dWRlJywgJ2xhdGl0dWRlJywgJ3pvb20nXTtcbnZhciBERUZBVUxUX09QVFMgPSB7XG4gIGN1cnZlOiAxLjQxNCxcbiAgc3BlZWQ6IDEuMlxufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZseVRvVmlld3BvcnQoc3RhcnRQcm9wcywgZW5kUHJvcHMsIHQpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICB2YXIgdmlld3BvcnQgPSB7fTtcblxuICB2YXIgX2dldEZseVRvVHJhbnNpdGlvblBhID0gZ2V0Rmx5VG9UcmFuc2l0aW9uUGFyYW1zKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCBvcHRzKSxcbiAgICAgIHN0YXJ0Wm9vbSA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5zdGFydFpvb20sXG4gICAgICBzdGFydENlbnRlclhZID0gX2dldEZseVRvVHJhbnNpdGlvblBhLnN0YXJ0Q2VudGVyWFksXG4gICAgICB1RGVsdGEgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEudURlbHRhLFxuICAgICAgdzAgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEudzAsXG4gICAgICB1MSA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS51MSxcbiAgICAgIFMgPSBfZ2V0Rmx5VG9UcmFuc2l0aW9uUGEuUyxcbiAgICAgIHJobyA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5yaG8sXG4gICAgICByaG8yID0gX2dldEZseVRvVHJhbnNpdGlvblBhLnJobzIsXG4gICAgICByMCA9IF9nZXRGbHlUb1RyYW5zaXRpb25QYS5yMDtcblxuICBpZiAodTEgPCBFUFNJTE9OKSB7XG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFMpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIHZhciBzdGFydFZhbHVlID0gc3RhcnRQcm9wc1trZXldO1xuICAgICAgICB2YXIgZW5kVmFsdWUgPSBlbmRQcm9wc1trZXldO1xuICAgICAgICB2aWV3cG9ydFtrZXldID0gbGVycChzdGFydFZhbHVlLCBlbmRWYWx1ZSwgdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJldHVybiB2aWV3cG9ydDtcbiAgfVxuXG4gIHZhciBzID0gdCAqIFM7XG4gIHZhciB3ID0gTWF0aC5jb3NoKHIwKSAvIE1hdGguY29zaChyMCArIHJobyAqIHMpO1xuICB2YXIgdSA9IHcwICogKChNYXRoLmNvc2gocjApICogTWF0aC50YW5oKHIwICsgcmhvICogcykgLSBNYXRoLnNpbmgocjApKSAvIHJobzIpIC8gdTE7XG4gIHZhciBzY2FsZUluY3JlbWVudCA9IDEgLyB3O1xuICB2YXIgbmV3Wm9vbSA9IHN0YXJ0Wm9vbSArIHNjYWxlVG9ab29tKHNjYWxlSW5jcmVtZW50KTtcbiAgdmFyIG5ld0NlbnRlcldvcmxkID0gdmVjMi5zY2FsZShbXSwgdURlbHRhLCB1KTtcbiAgdmVjMi5hZGQobmV3Q2VudGVyV29ybGQsIG5ld0NlbnRlcldvcmxkLCBzdGFydENlbnRlclhZKTtcbiAgdmFyIG5ld0NlbnRlciA9IHdvcmxkVG9MbmdMYXQobmV3Q2VudGVyV29ybGQpO1xuICB2aWV3cG9ydC5sb25naXR1ZGUgPSBuZXdDZW50ZXJbMF07XG4gIHZpZXdwb3J0LmxhdGl0dWRlID0gbmV3Q2VudGVyWzFdO1xuICB2aWV3cG9ydC56b29tID0gbmV3Wm9vbTtcbiAgcmV0dXJuIHZpZXdwb3J0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZseVRvRHVyYXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRTLCBvcHRzKTtcbiAgdmFyIF9vcHRzID0gb3B0cyxcbiAgICAgIHNjcmVlblNwZWVkID0gX29wdHMuc2NyZWVuU3BlZWQsXG4gICAgICBzcGVlZCA9IF9vcHRzLnNwZWVkLFxuICAgICAgbWF4RHVyYXRpb24gPSBfb3B0cy5tYXhEdXJhdGlvbjtcblxuICB2YXIgX2dldEZseVRvVHJhbnNpdGlvblBhMiA9IGdldEZseVRvVHJhbnNpdGlvblBhcmFtcyhzdGFydFByb3BzLCBlbmRQcm9wcywgb3B0cyksXG4gICAgICBTID0gX2dldEZseVRvVHJhbnNpdGlvblBhMi5TLFxuICAgICAgcmhvID0gX2dldEZseVRvVHJhbnNpdGlvblBhMi5yaG87XG5cbiAgdmFyIGxlbmd0aCA9IDEwMDAgKiBTO1xuICB2YXIgZHVyYXRpb247XG5cbiAgaWYgKE51bWJlci5pc0Zpbml0ZShzY3JlZW5TcGVlZCkpIHtcbiAgICBkdXJhdGlvbiA9IGxlbmd0aCAvIChzY3JlZW5TcGVlZCAvIHJobyk7XG4gIH0gZWxzZSB7XG4gICAgZHVyYXRpb24gPSBsZW5ndGggLyBzcGVlZDtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWF4RHVyYXRpb24pICYmIGR1cmF0aW9uID4gbWF4RHVyYXRpb24gPyAwIDogZHVyYXRpb247XG59XG5cbmZ1bmN0aW9uIGdldEZseVRvVHJhbnNpdGlvblBhcmFtcyhzdGFydFByb3BzLCBlbmRQcm9wcywgb3B0cykge1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRTLCBvcHRzKTtcbiAgdmFyIHJobyA9IG9wdHMuY3VydmU7XG4gIHZhciBzdGFydFpvb20gPSBzdGFydFByb3BzLnpvb207XG4gIHZhciBzdGFydENlbnRlciA9IFtzdGFydFByb3BzLmxvbmdpdHVkZSwgc3RhcnRQcm9wcy5sYXRpdHVkZV07XG4gIHZhciBzdGFydFNjYWxlID0gem9vbVRvU2NhbGUoc3RhcnRab29tKTtcbiAgdmFyIGVuZFpvb20gPSBlbmRQcm9wcy56b29tO1xuICB2YXIgZW5kQ2VudGVyID0gW2VuZFByb3BzLmxvbmdpdHVkZSwgZW5kUHJvcHMubGF0aXR1ZGVdO1xuICB2YXIgc2NhbGUgPSB6b29tVG9TY2FsZShlbmRab29tIC0gc3RhcnRab29tKTtcbiAgdmFyIHN0YXJ0Q2VudGVyWFkgPSBsbmdMYXRUb1dvcmxkKHN0YXJ0Q2VudGVyKTtcbiAgdmFyIGVuZENlbnRlclhZID0gbG5nTGF0VG9Xb3JsZChlbmRDZW50ZXIpO1xuICB2YXIgdURlbHRhID0gdmVjMi5zdWIoW10sIGVuZENlbnRlclhZLCBzdGFydENlbnRlclhZKTtcbiAgdmFyIHcwID0gTWF0aC5tYXgoc3RhcnRQcm9wcy53aWR0aCwgc3RhcnRQcm9wcy5oZWlnaHQpO1xuICB2YXIgdzEgPSB3MCAvIHNjYWxlO1xuICB2YXIgdTEgPSB2ZWMyLmxlbmd0aCh1RGVsdGEpICogc3RhcnRTY2FsZTtcblxuICB2YXIgX3UxID0gTWF0aC5tYXgodTEsIEVQU0lMT04pO1xuXG4gIHZhciByaG8yID0gcmhvICogcmhvO1xuICB2YXIgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG8yICogcmhvMiAqIF91MSAqIF91MSkgLyAoMiAqIHcwICogcmhvMiAqIF91MSk7XG4gIHZhciBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzIgKiByaG8yICogX3UxICogX3UxKSAvICgyICogdzEgKiByaG8yICogX3UxKTtcbiAgdmFyIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKTtcbiAgdmFyIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgdmFyIFMgPSAocjEgLSByMCkgLyByaG87XG4gIHJldHVybiB7XG4gICAgc3RhcnRab29tOiBzdGFydFpvb20sXG4gICAgc3RhcnRDZW50ZXJYWTogc3RhcnRDZW50ZXJYWSxcbiAgICB1RGVsdGE6IHVEZWx0YSxcbiAgICB3MDogdzAsXG4gICAgdTE6IHUxLFxuICAgIFM6IFMsXG4gICAgcmhvOiByaG8sXG4gICAgcmhvMjogcmhvMixcbiAgICByMDogcjAsXG4gICAgcjE6IHIxXG4gIH07XG59IiwiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgV2ViTWVyY2F0b3JWaWV3cG9ydCB9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0Qm91bmRzIH0gZnJvbSAnLi9nZXQtYm91bmRzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZml0Qm91bmRzIH0gZnJvbSAnLi9maXQtYm91bmRzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbm9ybWFsaXplVmlld3BvcnRQcm9wcyB9IGZyb20gJy4vbm9ybWFsaXplLXZpZXdwb3J0LXByb3BzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmx5VG9WaWV3cG9ydCwgZ2V0Rmx5VG9EdXJhdGlvbiB9IGZyb20gJy4vZmx5LXRvLXZpZXdwb3J0JztcbmV4cG9ydCB7IGxuZ0xhdFRvV29ybGQsIHdvcmxkVG9MbmdMYXQsIHdvcmxkVG9QaXhlbHMsIHBpeGVsc1RvV29ybGQsIHpvb21Ub1NjYWxlLCBzY2FsZVRvWm9vbSwgZ2V0TWV0ZXJab29tLCBnZXREaXN0YW5jZVNjYWxlcywgYWRkTWV0ZXJzVG9MbmdMYXQsIGdldFZpZXdNYXRyaXgsIGdldFByb2plY3Rpb25NYXRyaXgsIGdldFByb2plY3Rpb25QYXJhbWV0ZXJzIH0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnOyIsImV4cG9ydCB7IFdlYk1lcmNhdG9yVmlld3BvcnQgYXMgZGVmYXVsdCB9IGZyb20gJ0BtYXRoLmdsL3dlYi1tZXJjYXRvcic7XG5leHBvcnQgKiBmcm9tICdAbWF0aC5nbC93ZWItbWVyY2F0b3InOyIsIi8qKlxyXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2hpbXMgdGhhdCBwcm92aWRlIG1pbmltYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgRVM2IGNvbGxlY3Rpb25zLlxyXG4gKlxyXG4gKiBUaGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIFJlc2l6ZU9ic2VydmVyXHJcbiAqIG1vZHVsZXMgYXMgdGhleSBjb3ZlciBvbmx5IGEgbGltaXRlZCByYW5nZSBvZiB1c2UgY2FzZXMuXHJcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWpzZG9jLCB2YWxpZC1qc2RvYyAqL1xudmFyIE1hcFNoaW0gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBNYXA7XG4gIH1cbiAgLyoqXHJcbiAgICogUmV0dXJucyBpbmRleCBpbiBwcm92aWRlZCBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBrZXkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5Pn0gYXJyXHJcbiAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0SW5kZXgoYXJyLCBrZXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gLTE7XG4gICAgYXJyLnNvbWUoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgICAgaWYgKGVudHJ5WzBdID09PSBrZXkpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5kZXg7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgLyoqIEBjbGFzcyAqL1xuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIGNsYXNzXzEoKSB7XG4gICAgICAgIHRoaXMuX19lbnRyaWVzX18gPSBbXTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXNzXzEucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19lbnRyaWVzX18ubGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXHJcbiAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAqIEByZXR1cm5zIHsqfVxyXG4gICAgICAgKi9cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleCh0aGlzLl9fZW50cmllc19fLCBrZXkpO1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9fZW50cmllc19fW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzFdO1xuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgKiBAcGFyYW0geyp9IHZhbHVlXHJcbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgKi9cblxuXG4gICAgICBjbGFzc18xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleCh0aGlzLl9fZW50cmllc19fLCBrZXkpO1xuXG4gICAgICAgIGlmICh+aW5kZXgpIHtcbiAgICAgICAgICB0aGlzLl9fZW50cmllc19fW2luZGV4XVsxXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX19lbnRyaWVzX18ucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXHJcbiAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgKi9cblxuXG4gICAgICBjbGFzc18xLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5fX2VudHJpZXNfXztcbiAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgoZW50cmllcywga2V5KTtcblxuICAgICAgICBpZiAofmluZGV4KSB7XG4gICAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXHJcbiAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgKi9cblxuXG4gICAgICBjbGFzc18xLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIX5nZXRJbmRleCh0aGlzLl9fZW50cmllc19fLCBrZXkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAgICovXG5cblxuICAgICAgY2xhc3NfMS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX19lbnRyaWVzX18uc3BsaWNlKDApO1xuICAgICAgfTtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICAgKiBAcGFyYW0geyp9IFtjdHg9bnVsbF1cclxuICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAqL1xuXG5cbiAgICAgIGNsYXNzXzEucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xuICAgICAgICBpZiAoY3R4ID09PSB2b2lkIDApIHtcbiAgICAgICAgICBjdHggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuX19lbnRyaWVzX187IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gX2FbX2ldO1xuICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBlbnRyeVsxXSwgZW50cnlbMF0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gY2xhc3NfMTtcbiAgICB9KClcbiAgKTtcbn0oKTtcbi8qKlxyXG4gKiBEZXRlY3RzIHdoZXRoZXIgd2luZG93IGFuZCBkb2N1bWVudCBvYmplY3RzIGFyZSBhdmFpbGFibGUgaW4gY3VycmVudCBlbnZpcm9ubWVudC5cclxuICovXG5cblxudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ID09PSBkb2N1bWVudDsgLy8gUmV0dXJucyBnbG9iYWwgb2JqZWN0IG9mIGEgY3VycmVudCBlbnZpcm9ubWVudC5cblxudmFyIGdsb2JhbCQxID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLk1hdGggPT09IE1hdGgpIHtcbiAgICByZXR1cm4gZ2xvYmFsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT09IE1hdGgpIHtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PT0gTWF0aCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG5cblxuICByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn0oKTtcbi8qKlxyXG4gKiBBIHNoaW0gZm9yIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgd2hpY2ggZmFsbHMgYmFjayB0byB0aGUgc2V0VGltZW91dCBpZlxyXG4gKiBmaXJzdCBvbmUgaXMgbm90IHN1cHBvcnRlZC5cclxuICpcclxuICogQHJldHVybnMge251bWJlcn0gUmVxdWVzdHMnIGlkZW50aWZpZXIuXHJcbiAqL1xuXG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUkMSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBJdCdzIHJlcXVpcmVkIHRvIHVzZSBhIGJvdW5kZWQgZnVuY3Rpb24gYmVjYXVzZSBJRSBzb21ldGltZXMgdGhyb3dzXG4gICAgLy8gYW4gXCJJbnZhbGlkIGNhbGxpbmcgb2JqZWN0XCIgZXJyb3IgaWYgckFGIGlzIGludm9rZWQgd2l0aG91dCB0aGUgZ2xvYmFsXG4gICAgLy8gb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS5cbiAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQoZ2xvYmFsJDEpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhEYXRlLm5vdygpKTtcbiAgICB9LCAxMDAwIC8gNjApO1xuICB9O1xufSgpOyAvLyBEZWZpbmVzIG1pbmltdW0gdGltZW91dCBiZWZvcmUgYWRkaW5nIGEgdHJhaWxpbmcgY2FsbC5cblxuXG52YXIgdHJhaWxpbmdUaW1lb3V0ID0gMjtcbi8qKlxyXG4gKiBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiB3aGljaCBlbnN1cmVzIHRoYXQgcHJvdmlkZWQgY2FsbGJhY2sgd2lsbCBiZVxyXG4gKiBpbnZva2VkIG9ubHkgb25jZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBkZWxheSBwZXJpb2QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgZGVsYXkgcGVyaW9kLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSBEZWxheSBhZnRlciB3aGljaCB0byBpbnZva2UgY2FsbGJhY2suXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cclxuICovXG5cbmZ1bmN0aW9uIHRocm90dGxlKGNhbGxiYWNrLCBkZWxheSkge1xuICB2YXIgbGVhZGluZ0NhbGwgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nQ2FsbCA9IGZhbHNlLFxuICAgICAgbGFzdENhbGxUaW1lID0gMDtcbiAgLyoqXHJcbiAgICogSW52b2tlcyB0aGUgb3JpZ2luYWwgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIHNjaGVkdWxlcyBuZXcgaW52b2NhdGlvbiBpZlxyXG4gICAqIHRoZSBcInByb3h5XCIgd2FzIGNhbGxlZCBkdXJpbmcgY3VycmVudCByZXF1ZXN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVBlbmRpbmcoKSB7XG4gICAgaWYgKGxlYWRpbmdDYWxsKSB7XG4gICAgICBsZWFkaW5nQ2FsbCA9IGZhbHNlO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBpZiAodHJhaWxpbmdDYWxsKSB7XG4gICAgICBwcm94eSgpO1xuICAgIH1cbiAgfVxuICAvKipcclxuICAgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuIEl0IHdpbGwgZnVydGhlciBwb3N0cG9uZVxyXG4gICAqIGludm9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGRlbGVnYXRpbmcgaXQgdG8gdGhlXHJcbiAgICogcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBmdW5jdGlvbiB0aW1lb3V0Q2FsbGJhY2soKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEocmVzb2x2ZVBlbmRpbmcpO1xuICB9XG4gIC8qKlxyXG4gICAqIFNjaGVkdWxlcyBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcHJveHkoKSB7XG4gICAgdmFyIHRpbWVTdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICBpZiAobGVhZGluZ0NhbGwpIHtcbiAgICAgIC8vIFJlamVjdCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMuXG4gICAgICBpZiAodGltZVN0YW1wIC0gbGFzdENhbGxUaW1lIDwgdHJhaWxpbmdUaW1lb3V0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gU2NoZWR1bGUgbmV3IGNhbGwgdG8gYmUgaW4gaW52b2tlZCB3aGVuIHRoZSBwZW5kaW5nIG9uZSBpcyByZXNvbHZlZC5cbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBcInRyYW5zaXRpb25zXCIgd2hpY2ggbmV2ZXIgYWN0dWFsbHkgc3RhcnRcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgd2UgbWlnaHQgbWlzcyBvbmUgaWYgY2hhbmdlXG4gICAgICAvLyBoYXBwZW5zIGFtaWRzIHRoZSBwZW5kaW5nIGludm9jYXRpb24uXG5cblxuICAgICAgdHJhaWxpbmdDYWxsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVhZGluZ0NhbGwgPSB0cnVlO1xuICAgICAgdHJhaWxpbmdDYWxsID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KHRpbWVvdXRDYWxsYmFjaywgZGVsYXkpO1xuICAgIH1cblxuICAgIGxhc3RDYWxsVGltZSA9IHRpbWVTdGFtcDtcbiAgfVxuXG4gIHJldHVybiBwcm94eTtcbn0gLy8gTWluaW11bSBkZWxheSBiZWZvcmUgaW52b2tpbmcgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuXG5cblxudmFyIFJFRlJFU0hfREVMQVkgPSAyMDsgLy8gQSBsaXN0IG9mIHN1YnN0cmluZ3Mgb2YgQ1NTIHByb3BlcnRpZXMgdXNlZCB0byBmaW5kIHRyYW5zaXRpb24gZXZlbnRzIHRoYXRcbi8vIG1pZ2h0IGFmZmVjdCBkaW1lbnNpb25zIG9mIG9ic2VydmVkIGVsZW1lbnRzLlxuXG52YXIgdHJhbnNpdGlvbktleXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICd3aWR0aCcsICdoZWlnaHQnLCAnc2l6ZScsICd3ZWlnaHQnXTsgLy8gQ2hlY2sgaWYgTXV0YXRpb25PYnNlcnZlciBpcyBhdmFpbGFibGUuXG5cbnZhciBtdXRhdGlvbk9ic2VydmVyU3VwcG9ydGVkID0gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuLyoqXHJcbiAqIFNpbmdsZXRvbiBjb250cm9sbGVyIGNsYXNzIHdoaWNoIGhhbmRsZXMgdXBkYXRlcyBvZiBSZXNpemVPYnNlcnZlciBpbnN0YW5jZXMuXHJcbiAqL1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIoKSB7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBET00gbGlzdGVuZXJzIGhhdmUgYmVlbiBhZGRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuICAgIHRoaXMuY29ubmVjdGVkXyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogVGVsbHMgdGhhdCBjb250cm9sbGVyIGhhcyBzdWJzY3JpYmVkIGZvciBNdXRhdGlvbiBFdmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEtlZXBzIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2Ugb2YgTXV0YXRpb25PYnNlcnZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7TXV0YXRpb25PYnNlcnZlcn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGNvbm5lY3RlZCBvYnNlcnZlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmVyU1BJPn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5vYnNlcnZlcnNfID0gW107XG4gICAgdGhpcy5vblRyYW5zaXRpb25FbmRfID0gdGhpcy5vblRyYW5zaXRpb25FbmRfLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZWZyZXNoID0gdGhyb3R0bGUodGhpcy5yZWZyZXNoLmJpbmQodGhpcyksIFJFRlJFU0hfREVMQVkpO1xuICB9XG4gIC8qKlxyXG4gICAqIEFkZHMgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyU1BJfSBvYnNlcnZlciAtIE9ic2VydmVyIHRvIGJlIGFkZGVkLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgIGlmICghfnRoaXMub2JzZXJ2ZXJzXy5pbmRleE9mKG9ic2VydmVyKSkge1xuICAgICAgdGhpcy5vYnNlcnZlcnNfLnB1c2gob2JzZXJ2ZXIpO1xuICAgIH0gLy8gQWRkIGxpc3RlbmVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBhZGRlZCB5ZXQuXG5cblxuICAgIGlmICghdGhpcy5jb25uZWN0ZWRfKSB7XG4gICAgICB0aGlzLmNvbm5lY3RfKCk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBSZW1vdmVzIG9ic2VydmVyIGZyb20gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyU1BJfSBvYnNlcnZlciAtIE9ic2VydmVyIHRvIGJlIHJlbW92ZWQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZU9ic2VydmVyID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgdmFyIG9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzXztcbiAgICB2YXIgaW5kZXggPSBvYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7IC8vIFJlbW92ZSBvYnNlcnZlciBpZiBpdCdzIHByZXNlbnQgaW4gcmVnaXN0cnkuXG5cbiAgICBpZiAofmluZGV4KSB7XG4gICAgICBvYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9IC8vIFJlbW92ZSBsaXN0ZW5lcnMgaWYgY29udHJvbGxlciBoYXMgbm8gY29ubmVjdGVkIG9ic2VydmVycy5cblxuXG4gICAgaWYgKCFvYnNlcnZlcnMubGVuZ3RoICYmIHRoaXMuY29ubmVjdGVkXykge1xuICAgICAgdGhpcy5kaXNjb25uZWN0XygpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogSW52b2tlcyB0aGUgdXBkYXRlIG9mIG9ic2VydmVycy4gSXQgd2lsbCBjb250aW51ZSBydW5uaW5nIHVwZGF0ZXMgaW5zb2ZhclxyXG4gICAqIGl0IGRldGVjdHMgY2hhbmdlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGFuZ2VzRGV0ZWN0ZWQgPSB0aGlzLnVwZGF0ZU9ic2VydmVyc18oKTsgLy8gQ29udGludWUgcnVubmluZyB1cGRhdGVzIGlmIGNoYW5nZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGFzIHRoZXJlIG1pZ2h0XG4gICAgLy8gYmUgZnV0dXJlIG9uZXMgY2F1c2VkIGJ5IENTUyB0cmFuc2l0aW9ucy5cblxuICAgIGlmIChjaGFuZ2VzRGV0ZWN0ZWQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBldmVyeSBvYnNlcnZlciBmcm9tIG9ic2VydmVycyBsaXN0IGFuZCBub3RpZmllcyB0aGVtIG9mIHF1ZXVlZFxyXG4gICAqIGVudHJpZXMuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIFwidHJ1ZVwiIGlmIGFueSBvYnNlcnZlciBoYXMgZGV0ZWN0ZWQgY2hhbmdlcyBpblxyXG4gICAqICAgICAgZGltZW5zaW9ucyBvZiBpdCdzIGVsZW1lbnRzLlxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVPYnNlcnZlcnNfID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIENvbGxlY3Qgb2JzZXJ2ZXJzIHRoYXQgaGF2ZSBhY3RpdmUgb2JzZXJ2YXRpb25zLlxuICAgIHZhciBhY3RpdmVPYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc18uZmlsdGVyKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgcmV0dXJuIG9ic2VydmVyLmdhdGhlckFjdGl2ZSgpLCBvYnNlcnZlci5oYXNBY3RpdmUoKTtcbiAgICB9KTsgLy8gRGVsaXZlciBub3RpZmljYXRpb25zIGluIGEgc2VwYXJhdGUgY3ljbGUgaW4gb3JkZXIgdG8gYXZvaWQgYW55XG4gICAgLy8gY29sbGlzaW9ucyBiZXR3ZWVuIG9ic2VydmVycywgZS5nLiB3aGVuIG11bHRpcGxlIGluc3RhbmNlcyBvZlxuICAgIC8vIFJlc2l6ZU9ic2VydmVyIGFyZSB0cmFja2luZyB0aGUgc2FtZSBlbGVtZW50IGFuZCB0aGUgY2FsbGJhY2sgb2Ygb25lXG4gICAgLy8gb2YgdGhlbSBjaGFuZ2VzIGNvbnRlbnQgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgdGFyZ2V0LiBTb21ldGltZXNcbiAgICAvLyB0aGlzIG1heSByZXN1bHQgaW4gbm90aWZpY2F0aW9ucyBiZWluZyBibG9ja2VkIGZvciB0aGUgcmVzdCBvZiBvYnNlcnZlcnMuXG5cbiAgICBhY3RpdmVPYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBvYnNlcnZlci5icm9hZGNhc3RBY3RpdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aXZlT2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gIH07XG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5jb25uZWN0XyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIHJ1bm5pbmcgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBpZiBsaXN0ZW5lcnNcbiAgICAvLyBoYXZlIGJlZW4gYWxyZWFkeSBhZGRlZC5cbiAgICBpZiAoIWlzQnJvd3NlciB8fCB0aGlzLmNvbm5lY3RlZF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFN1YnNjcmlwdGlvbiB0byB0aGUgXCJUcmFuc2l0aW9uZW5kXCIgZXZlbnQgaXMgdXNlZCBhcyBhIHdvcmthcm91bmQgZm9yXG4gICAgLy8gZGVsYXllZCB0cmFuc2l0aW9ucy4gVGhpcyB3YXkgaXQncyBwb3NzaWJsZSB0byBjYXB0dXJlIGF0IGxlYXN0IHRoZVxuICAgIC8vIGZpbmFsIHN0YXRlIG9mIGFuIGVsZW1lbnQuXG5cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xuXG4gICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5yZWZyZXNoKTtcbiAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLm9ic2VydmUoZG9jdW1lbnQsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcbiAgICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGVkXyA9IHRydWU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgRE9NIGxpc3RlbmVycy5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmRpc2Nvbm5lY3RfID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xuICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IHJlbW92ZWQuXG4gICAgaWYgKCFpc0Jyb3dzZXIgfHwgIXRoaXMuY29ubmVjdGVkXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLm9uVHJhbnNpdGlvbkVuZF8pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlZnJlc2gpO1xuXG4gICAgaWYgKHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfKSB7XG4gICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8pIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIHRoaXMucmVmcmVzaCk7XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xuICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3RlZF8gPSBmYWxzZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJUcmFuc2l0aW9uZW5kXCIgZXZlbnQgaGFuZGxlci5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHtUcmFuc2l0aW9uRXZlbnR9IGV2ZW50XHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZF8gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IgPSBfYS5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIHByb3BlcnR5TmFtZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iOyAvLyBEZXRlY3Qgd2hldGhlciB0cmFuc2l0aW9uIG1heSBhZmZlY3QgZGltZW5zaW9ucyBvZiBhbiBlbGVtZW50LlxuXG4gICAgdmFyIGlzUmVmbG93UHJvcGVydHkgPSB0cmFuc2l0aW9uS2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiAhIX5wcm9wZXJ0eU5hbWUuaW5kZXhPZihrZXkpO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzUmVmbG93UHJvcGVydHkpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBpbnN0YW5jZSBvZiB0aGUgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VfKSB7XG4gICAgICB0aGlzLmluc3RhbmNlXyA9IG5ldyBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZV87XG4gIH07XG4gIC8qKlxyXG4gICAqIEhvbGRzIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbGxlcidzIGluc3RhbmNlLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGUge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5pbnN0YW5jZV8gPSBudWxsO1xuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyO1xufSgpO1xuLyoqXHJcbiAqIERlZmluZXMgbm9uLXdyaXRhYmxlL2VudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgcHJvdmlkZWQgdGFyZ2V0IG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIE9iamVjdCBmb3Igd2hpY2ggdG8gZGVmaW5lIHByb3BlcnRpZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIFByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC5cclxuICogQHJldHVybnMge09iamVjdH0gVGFyZ2V0IG9iamVjdC5cclxuICovXG5cblxudmFyIGRlZmluZUNvbmZpZ3VyYWJsZSA9IGZ1bmN0aW9uIGRlZmluZUNvbmZpZ3VyYWJsZSh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhwcm9wcyk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGtleSA9IF9hW19pXTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIHZhbHVlOiBwcm9wc1trZXldLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuLyoqXHJcbiAqIFJldHVybnMgdGhlIGdsb2JhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcclxuICogQHJldHVybnMge09iamVjdH1cclxuICovXG5cblxudmFyIGdldFdpbmRvd09mID0gZnVuY3Rpb24gZ2V0V2luZG93T2YodGFyZ2V0KSB7XG4gIC8vIEFzc3VtZSB0aGF0IHRoZSBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIE5vZGUsIHdoaWNoIG1lYW5zIHRoYXQgaXRcbiAgLy8gaGFzIHRoZSBcIm93bmVyRG9jdW1lbnRcIiBwcm9wZXJ0eSBmcm9tIHdoaWNoIHdlIGNhbiByZXRyaWV2ZSBhXG4gIC8vIGNvcnJlc3BvbmRpbmcgZ2xvYmFsIG9iamVjdC5cbiAgdmFyIG93bmVyR2xvYmFsID0gdGFyZ2V0ICYmIHRhcmdldC5vd25lckRvY3VtZW50ICYmIHRhcmdldC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OyAvLyBSZXR1cm4gdGhlIGxvY2FsIGdsb2JhbCBvYmplY3QgaWYgaXQncyBub3QgcG9zc2libGUgZXh0cmFjdCBvbmUgZnJvbVxuICAvLyBwcm92aWRlZCBlbGVtZW50LlxuXG4gIHJldHVybiBvd25lckdsb2JhbCB8fCBnbG9iYWwkMTtcbn07IC8vIFBsYWNlaG9sZGVyIG9mIGFuIGVtcHR5IGNvbnRlbnQgcmVjdGFuZ2xlLlxuXG5cbnZhciBlbXB0eVJlY3QgPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcbi8qKlxyXG4gKiBDb252ZXJ0cyBwcm92aWRlZCBzdHJpbmcgdG8gYSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXG5cbmZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcbiAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpIHx8IDA7XG59XG4vKipcclxuICogRXh0cmFjdHMgYm9yZGVycyBzaXplIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcG9zaXRpb25zIC0gQm9yZGVycyBwb3NpdGlvbnMgKHRvcCwgcmlnaHQsIC4uLilcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzKSB7XG4gIHZhciBwb3NpdGlvbnMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIHBvc2l0aW9uc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHJldHVybiBwb3NpdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChzaXplLCBwb3NpdGlvbikge1xuICAgIHZhciB2YWx1ZSA9IHN0eWxlc1snYm9yZGVyLScgKyBwb3NpdGlvbiArICctd2lkdGgnXTtcbiAgICByZXR1cm4gc2l6ZSArIHRvRmxvYXQodmFsdWUpO1xuICB9LCAwKTtcbn1cbi8qKlxyXG4gKiBFeHRyYWN0cyBwYWRkaW5ncyBzaXplcyBmcm9tIHByb3ZpZGVkIHN0eWxlcy5cclxuICpcclxuICogQHBhcmFtIHtDU1NTdHlsZURlY2xhcmF0aW9ufSBzdHlsZXNcclxuICogQHJldHVybnMge09iamVjdH0gUGFkZGluZ3MgYm94LlxyXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRQYWRkaW5ncyhzdHlsZXMpIHtcbiAgdmFyIHBvc2l0aW9ucyA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J107XG4gIHZhciBwYWRkaW5ncyA9IHt9O1xuXG4gIGZvciAodmFyIF9pID0gMCwgcG9zaXRpb25zXzEgPSBwb3NpdGlvbnM7IF9pIDwgcG9zaXRpb25zXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gcG9zaXRpb25zXzFbX2ldO1xuICAgIHZhciB2YWx1ZSA9IHN0eWxlc1sncGFkZGluZy0nICsgcG9zaXRpb25dO1xuICAgIHBhZGRpbmdzW3Bvc2l0aW9uXSA9IHRvRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHBhZGRpbmdzO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgU1ZHIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U1ZHR3JhcGhpY3NFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IGNvbnRlbnQgcmVjdGFuZ2xlIG9mIHdoaWNoIG5lZWRzXHJcbiAqICAgICAgdG8gYmUgY2FsY3VsYXRlZC5cclxuICogQHJldHVybnMge0RPTVJlY3RJbml0fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpIHtcbiAgdmFyIGJib3ggPSB0YXJnZXQuZ2V0QkJveCgpO1xuICByZXR1cm4gY3JlYXRlUmVjdEluaXQoMCwgMCwgYmJveC53aWR0aCwgYmJveC5oZWlnaHQpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgSFRNTEVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY29udGVudCByZWN0YW5nbGUuXHJcbiAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICovXG5cblxuZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRDb250ZW50UmVjdCh0YXJnZXQpIHtcbiAgLy8gQ2xpZW50IHdpZHRoICYgaGVpZ2h0IHByb3BlcnRpZXMgY2FuJ3QgYmVcbiAgLy8gdXNlZCBleGNsdXNpdmVseSBhcyB0aGV5IHByb3ZpZGUgcm91bmRlZCB2YWx1ZXMuXG4gIHZhciBjbGllbnRXaWR0aCA9IHRhcmdldC5jbGllbnRXaWR0aCxcbiAgICAgIGNsaWVudEhlaWdodCA9IHRhcmdldC5jbGllbnRIZWlnaHQ7IC8vIEJ5IHRoaXMgY29uZGl0aW9uIHdlIGNhbiBjYXRjaCBhbGwgbm9uLXJlcGxhY2VkIGlubGluZSwgaGlkZGVuIGFuZFxuICAvLyBkZXRhY2hlZCBlbGVtZW50cy4gVGhvdWdoIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBsZXNzXG4gIC8vIHRoYW4gMC41IHdpbGwgYmUgZGlzY2FyZGVkIGFzIHdlbGwuXG4gIC8vXG4gIC8vIFdpdGhvdXQgaXQgd2Ugd291bGQgbmVlZCB0byBpbXBsZW1lbnQgc2VwYXJhdGUgbWV0aG9kcyBmb3IgZWFjaCBvZlxuICAvLyB0aG9zZSBjYXNlcyBhbmQgaXQncyBub3QgcG9zc2libGUgdG8gcGVyZm9ybSBhIHByZWNpc2UgYW5kIHBlcmZvcm1hbmNlXG4gIC8vIGVmZmVjdGl2ZSB0ZXN0IGZvciBoaWRkZW4gZWxlbWVudHMuIEUuZy4gZXZlbiBqUXVlcnkncyAnOnZpc2libGUnIGZpbHRlclxuICAvLyBnaXZlcyB3cm9uZyByZXN1bHRzIGZvciBlbGVtZW50cyB3aXRoIHdpZHRoICYgaGVpZ2h0IGxlc3MgdGhhbiAwLjUuXG5cbiAgaWYgKCFjbGllbnRXaWR0aCAmJiAhY2xpZW50SGVpZ2h0KSB7XG4gICAgcmV0dXJuIGVtcHR5UmVjdDtcbiAgfVxuXG4gIHZhciBzdHlsZXMgPSBnZXRXaW5kb3dPZih0YXJnZXQpLmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcbiAgdmFyIHBhZGRpbmdzID0gZ2V0UGFkZGluZ3Moc3R5bGVzKTtcbiAgdmFyIGhvcml6UGFkID0gcGFkZGluZ3MubGVmdCArIHBhZGRpbmdzLnJpZ2h0O1xuICB2YXIgdmVydFBhZCA9IHBhZGRpbmdzLnRvcCArIHBhZGRpbmdzLmJvdHRvbTsgLy8gQ29tcHV0ZWQgc3R5bGVzIG9mIHdpZHRoICYgaGVpZ2h0IGFyZSBiZWluZyB1c2VkIGJlY2F1c2UgdGhleSBhcmUgdGhlXG4gIC8vIG9ubHkgZGltZW5zaW9ucyBhdmFpbGFibGUgdG8gSlMgdGhhdCBjb250YWluIG5vbi1yb3VuZGVkIHZhbHVlcy4gSXQgY291bGRcbiAgLy8gYmUgcG9zc2libGUgdG8gdXRpbGl6ZSB0aGUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlmIG9ubHkgaXQncyBkYXRhIHdhc24ndFxuICAvLyBhZmZlY3RlZCBieSBDU1MgdHJhbnNmb3JtYXRpb25zIGxldCBhbG9uZSBwYWRkaW5ncywgYm9yZGVycyBhbmQgc2Nyb2xsIGJhcnMuXG5cbiAgdmFyIHdpZHRoID0gdG9GbG9hdChzdHlsZXMud2lkdGgpLFxuICAgICAgaGVpZ2h0ID0gdG9GbG9hdChzdHlsZXMuaGVpZ2h0KTsgLy8gV2lkdGggJiBoZWlnaHQgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB3aGVuIHRoZSAnYm9yZGVyLWJveCcgYm94XG4gIC8vIG1vZGVsIGlzIGFwcGxpZWQgKGV4Y2VwdCBmb3IgSUUpLlxuXG4gIGlmIChzdHlsZXMuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAvLyBGb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgcmVxdWlyZWQgdG8gaGFuZGxlIEludGVybmV0IEV4cGxvcmVyIHdoaWNoXG4gICAgLy8gZG9lc24ndCBpbmNsdWRlIHBhZGRpbmdzIGFuZCBib3JkZXJzIHRvIGNvbXB1dGVkIENTUyBkaW1lbnNpb25zLlxuICAgIC8vXG4gICAgLy8gV2UgY2FuIHNheSB0aGF0IGlmIENTUyBkaW1lbnNpb25zICsgcGFkZGluZ3MgYXJlIGVxdWFsIHRvIHRoZSBcImNsaWVudFwiXG4gICAgLy8gcHJvcGVydGllcyB0aGVuIGl0J3MgZWl0aGVyIElFLCBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIHN1YnRyYWN0XG4gICAgLy8gYW55dGhpbmcsIG9yIGFuIGVsZW1lbnQgbWVyZWx5IGRvZXNuJ3QgaGF2ZSBwYWRkaW5ncy9ib3JkZXJzIHN0eWxlcy5cbiAgICBpZiAoTWF0aC5yb3VuZCh3aWR0aCArIGhvcml6UGFkKSAhPT0gY2xpZW50V2lkdGgpIHtcbiAgICAgIHdpZHRoIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ2xlZnQnLCAncmlnaHQnKSArIGhvcml6UGFkO1xuICAgIH1cblxuICAgIGlmIChNYXRoLnJvdW5kKGhlaWdodCArIHZlcnRQYWQpICE9PSBjbGllbnRIZWlnaHQpIHtcbiAgICAgIGhlaWdodCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd0b3AnLCAnYm90dG9tJykgKyB2ZXJ0UGFkO1xuICAgIH1cbiAgfSAvLyBGb2xsb3dpbmcgc3RlcHMgY2FuJ3QgYmUgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQncyByb290IGVsZW1lbnQgYXMgaXRzXG4gIC8vIGNsaWVudFtXaWR0aC9IZWlnaHRdIHByb3BlcnRpZXMgcmVwcmVzZW50IHZpZXdwb3J0IGFyZWEgb2YgdGhlIHdpbmRvdy5cbiAgLy8gQmVzaWRlcywgaXQncyBhcyB3ZWxsIG5vdCBuZWNlc3NhcnkgYXMgdGhlIDxodG1sPiBpdHNlbGYgbmVpdGhlciBoYXNcbiAgLy8gcmVuZGVyZWQgc2Nyb2xsIGJhcnMgbm9yIGl0IGNhbiBiZSBjbGlwcGVkLlxuXG5cbiAgaWYgKCFpc0RvY3VtZW50RWxlbWVudCh0YXJnZXQpKSB7XG4gICAgLy8gSW4gc29tZSBicm93c2VycyAob25seSBpbiBGaXJlZm94LCBhY3R1YWxseSkgQ1NTIHdpZHRoICYgaGVpZ2h0XG4gICAgLy8gaW5jbHVkZSBzY3JvbGwgYmFycyBzaXplIHdoaWNoIGNhbiBiZSByZW1vdmVkIGF0IHRoaXMgc3RlcCBhcyBzY3JvbGxcbiAgICAvLyBiYXJzIGFyZSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gcm91bmRlZCBkaW1lbnNpb25zICsgcGFkZGluZ3NcbiAgICAvLyBhbmQgXCJjbGllbnRcIiBwcm9wZXJ0aWVzLCB0aG91Z2ggdGhhdCBpcyBub3QgYWx3YXlzIHRydWUgaW4gQ2hyb21lLlxuICAgIHZhciB2ZXJ0U2Nyb2xsYmFyID0gTWF0aC5yb3VuZCh3aWR0aCArIGhvcml6UGFkKSAtIGNsaWVudFdpZHRoO1xuICAgIHZhciBob3JpelNjcm9sbGJhciA9IE1hdGgucm91bmQoaGVpZ2h0ICsgdmVydFBhZCkgLSBjbGllbnRIZWlnaHQ7IC8vIENocm9tZSBoYXMgYSByYXRoZXIgd2VpcmQgcm91bmRpbmcgb2YgXCJjbGllbnRcIiBwcm9wZXJ0aWVzLlxuICAgIC8vIEUuZy4gZm9yIGFuIGVsZW1lbnQgd2l0aCBjb250ZW50IHdpZHRoIG9mIDMxNC4ycHggaXQgc29tZXRpbWVzIGdpdmVzXG4gICAgLy8gdGhlIGNsaWVudCB3aWR0aCBvZiAzMTVweCBhbmQgZm9yIHRoZSB3aWR0aCBvZiAzMTQuN3B4IGl0IG1heSBnaXZlXG4gICAgLy8gMzE0cHguIEFuZCBpdCBkb2Vzbid0IGhhcHBlbiBhbGwgdGhlIHRpbWUuIFNvIGp1c3QgaWdub3JlIHRoaXMgZGVsdGFcbiAgICAvLyBhcyBhIG5vbi1yZWxldmFudC5cblxuICAgIGlmIChNYXRoLmFicyh2ZXJ0U2Nyb2xsYmFyKSAhPT0gMSkge1xuICAgICAgd2lkdGggLT0gdmVydFNjcm9sbGJhcjtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnMoaG9yaXpTY3JvbGxiYXIpICE9PSAxKSB7XG4gICAgICBoZWlnaHQgLT0gaG9yaXpTY3JvbGxiYXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJlY3RJbml0KHBhZGRpbmdzLmxlZnQsIHBhZGRpbmdzLnRvcCwgd2lkdGgsIGhlaWdodCk7XG59XG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU1ZHR3JhcGhpY3NFbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgY2hlY2tlZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xuXG5cbnZhciBpc1NWR0dyYXBoaWNzRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gU29tZSBicm93c2VycywgbmFtZWx5IElFIGFuZCBFZGdlLCBkb24ndCBoYXZlIHRoZSBTVkdHcmFwaGljc0VsZW1lbnRcbiAgLy8gaW50ZXJmYWNlLlxuICBpZiAodHlwZW9mIFNWR0dyYXBoaWNzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgIH07XG4gIH0gLy8gSWYgaXQncyBzbywgdGhlbiBjaGVjayB0aGF0IGVsZW1lbnQgaXMgYXQgbGVhc3QgYW4gaW5zdGFuY2Ugb2YgdGhlXG4gIC8vIFNWR0VsZW1lbnQgYW5kIHRoYXQgaXQgaGFzIHRoZSBcImdldEJCb3hcIiBtZXRob2QuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblxuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuU1ZHRWxlbWVudCAmJiB0eXBlb2YgdGFyZ2V0LmdldEJCb3ggPT09ICdmdW5jdGlvbic7XG4gIH07XG59KCk7XG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhIGRvY3VtZW50IGVsZW1lbnQgKDxodG1sPikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBjaGVja2VkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXG5cblxuZnVuY3Rpb24gaXNEb2N1bWVudEVsZW1lbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgPT09IGdldFdpbmRvd09mKHRhcmdldCkuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYW4gYXBwcm9wcmlhdGUgY29udGVudCByZWN0YW5nbGUgZm9yIHByb3ZpZGVkIGh0bWwgb3Igc3ZnIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB3aGljaCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbnRlbnRSZWN0KHRhcmdldCkge1xuICBpZiAoIWlzQnJvd3Nlcikge1xuICAgIHJldHVybiBlbXB0eVJlY3Q7XG4gIH1cblxuICBpZiAoaXNTVkdHcmFwaGljc0VsZW1lbnQodGFyZ2V0KSkge1xuICAgIHJldHVybiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KTtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIHJlY3RhbmdsZSB3aXRoIGFuIGludGVyZmFjZSBvZiB0aGUgRE9NUmVjdFJlYWRPbmx5LlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZG9tcmVjdHJlYWRvbmx5XHJcbiAqXHJcbiAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gT2JqZWN0IHdpdGggcmVjdGFuZ2xlJ3MgeC95IGNvb3JkaW5hdGVzIGFuZCBkaW1lbnNpb25zLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdFJlYWRPbmx5fVxyXG4gKi9cblxuXG5mdW5jdGlvbiBjcmVhdGVSZWFkT25seVJlY3QoX2EpIHtcbiAgdmFyIHggPSBfYS54LFxuICAgICAgeSA9IF9hLnksXG4gICAgICB3aWR0aCA9IF9hLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX2EuaGVpZ2h0OyAvLyBJZiBET01SZWN0UmVhZE9ubHkgaXMgYXZhaWxhYmxlIHVzZSBpdCBhcyBhIHByb3RvdHlwZSBmb3IgdGhlIHJlY3RhbmdsZS5cblxuICB2YXIgQ29uc3RyID0gdHlwZW9mIERPTVJlY3RSZWFkT25seSAhPT0gJ3VuZGVmaW5lZCcgPyBET01SZWN0UmVhZE9ubHkgOiBPYmplY3Q7XG4gIHZhciByZWN0ID0gT2JqZWN0LmNyZWF0ZShDb25zdHIucHJvdG90eXBlKTsgLy8gUmVjdGFuZ2xlJ3MgcHJvcGVydGllcyBhcmUgbm90IHdyaXRhYmxlIGFuZCBub24tZW51bWVyYWJsZS5cblxuICBkZWZpbmVDb25maWd1cmFibGUocmVjdCwge1xuICAgIHg6IHgsXG4gICAgeTogeSxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiBoZWlnaHQgKyB5LFxuICAgIGxlZnQ6IHhcbiAgfSk7XG4gIHJldHVybiByZWN0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgRE9NUmVjdEluaXQgb2JqZWN0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkaW1lbnNpb25zIGFuZCB0aGUgeC95IGNvb3JkaW5hdGVzLlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZGljdGRlZi1kb21yZWN0aW5pdFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFggY29vcmRpbmF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBZIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFJlY3RhbmdsZSdzIHdpZHRoLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gUmVjdGFuZ2xlJ3MgaGVpZ2h0LlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZVJlY3RJbml0KHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG4vKipcclxuICogQ2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0YXRpb25zIG9mIHRoZSBjb250ZW50IHJlY3RhbmdsZSBvZlxyXG4gKiBwcm92aWRlZCBET00gZWxlbWVudCBhbmQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgaXQncyBjaGFuZ2VzLlxyXG4gKi9cblxuXG52YXIgUmVzaXplT2JzZXJ2YXRpb24gPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlc2l6ZU9ic2VydmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIGJlIG9ic2VydmVkLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpIHtcbiAgICAvKipcclxuICAgICAqIEJyb2FkY2FzdGVkIHdpZHRoIG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cbiAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gMDtcbiAgICAvKipcclxuICAgICAqIEJyb2FkY2FzdGVkIGhlaWdodCBvZiBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgICB0aGlzLmJyb2FkY2FzdEhlaWdodCA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGUge0RPTVJlY3RJbml0fVxyXG4gICAgICovXG5cbiAgICB0aGlzLmNvbnRlbnRSZWN0XyA9IGNyZWF0ZVJlY3RJbml0KDAsIDAsIDAsIDApO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgY29udGVudCByZWN0YW5nbGUgYW5kIHRlbGxzIHdoZXRoZXIgaXQncyB3aWR0aCBvciBoZWlnaHQgcHJvcGVydGllc1xyXG4gICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBicm9hZGNhc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmF0aW9uLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVjdCA9IGdldENvbnRlbnRSZWN0KHRoaXMudGFyZ2V0KTtcbiAgICB0aGlzLmNvbnRlbnRSZWN0XyA9IHJlY3Q7XG4gICAgcmV0dXJuIHJlY3Qud2lkdGggIT09IHRoaXMuYnJvYWRjYXN0V2lkdGggfHwgcmVjdC5oZWlnaHQgIT09IHRoaXMuYnJvYWRjYXN0SGVpZ2h0O1xuICB9O1xuICAvKipcclxuICAgKiBVcGRhdGVzICdicm9hZGNhc3RXaWR0aCcgYW5kICdicm9hZGNhc3RIZWlnaHQnIHByb3BlcnRpZXMgd2l0aCBhIGRhdGFcclxuICAgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgb2YgdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9IExhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuYnJvYWRjYXN0UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVjdCA9IHRoaXMuY29udGVudFJlY3RfO1xuICAgIHRoaXMuYnJvYWRjYXN0V2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMuYnJvYWRjYXN0SGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH07XG5cbiAgcmV0dXJuIFJlc2l6ZU9ic2VydmF0aW9uO1xufSgpO1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJFbnRyeSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzaXplT2JzZXJ2ZXJFbnRyeS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0aGF0IGlzIGJlaW5nIG9ic2VydmVkLlxyXG4gICAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gRGF0YSBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlckVudHJ5KHRhcmdldCwgcmVjdEluaXQpIHtcbiAgICB2YXIgY29udGVudFJlY3QgPSBjcmVhdGVSZWFkT25seVJlY3QocmVjdEluaXQpOyAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG5vdCB3cml0YWJsZVxuICAgIC8vIGFuZCBhcmUgYWxzbyBub3QgZW51bWVyYWJsZSBpbiB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLlxuICAgIC8vXG4gICAgLy8gUHJvcGVydHkgYWNjZXNzb3JzIGFyZSBub3QgYmVpbmcgdXNlZCBhcyB0aGV5J2QgcmVxdWlyZSB0byBkZWZpbmUgYVxuICAgIC8vIHByaXZhdGUgV2Vha01hcCBzdG9yYWdlIHdoaWNoIG1heSBjYXVzZSBtZW1vcnkgbGVha3MgaW4gYnJvd3NlcnMgdGhhdFxuICAgIC8vIGRvbid0IHN1cHBvcnQgdGhpcyB0eXBlIG9mIGNvbGxlY3Rpb25zLlxuXG4gICAgZGVmaW5lQ29uZmlndXJhYmxlKHRoaXMsIHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgY29udGVudFJlY3Q6IGNvbnRlbnRSZWN0XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJFbnRyeTtcbn0oKTtcblxudmFyIFJlc2l6ZU9ic2VydmVyU1BJID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWRcclxuICAgKiAgICAgIHdoZW4gb25lIG9mIHRoZSBvYnNlcnZlZCBlbGVtZW50cyBjaGFuZ2VzIGl0J3MgY29udGVudCBkaW1lbnNpb25zLlxyXG4gICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBpbnN0YW5jZSB3aGljaFxyXG4gICAqICAgICAgaXMgcmVzcG9uc2libGUgZm9yIHRoZSB1cGRhdGVzIG9mIG9ic2VydmVyLlxyXG4gICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJ9IGNhbGxiYWNrQ3R4IC0gUmVmZXJlbmNlIHRvIHRoZSBwdWJsaWNcclxuICAgKiAgICAgIFJlc2l6ZU9ic2VydmVyIGluc3RhbmNlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgY2FsbGJhY2tDdHgpIHtcbiAgICAvKipcclxuICAgICAqIENvbGxlY3Rpb24gb2YgcmVzaXplIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgZGV0ZWN0ZWQgY2hhbmdlcyBpbiBkaW1lbnNpb25zXHJcbiAgICAgKiBvZiBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZSB7QXJyYXk8UmVzaXplT2JzZXJ2YXRpb24+fVxyXG4gICAgICovXG4gICAgdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfID0gW107XG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyeSBvZiB0aGUgUmVzaXplT2JzZXJ2YXRpb24gaW5zdGFuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtNYXA8RWxlbWVudCwgUmVzaXplT2JzZXJ2YXRpb24+fVxyXG4gICAgICovXG5cbiAgICB0aGlzLm9ic2VydmF0aW9uc18gPSBuZXcgTWFwU2hpbSgpO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2tfID0gY2FsbGJhY2s7XG4gICAgdGhpcy5jb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7XG4gICAgdGhpcy5jYWxsYmFja0N0eF8gPSBjYWxsYmFja0N0eDtcbiAgfVxuICAvKipcclxuICAgKiBTdGFydHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICB9IC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxuXG5cbiAgICBpZiAodHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICEoRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLkVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcbiAgICB9XG5cbiAgICB2YXIgb2JzZXJ2YXRpb25zID0gdGhpcy5vYnNlcnZhdGlvbnNfOyAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC5cblxuICAgIGlmIChvYnNlcnZhdGlvbnMuaGFzKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvYnNlcnZhdGlvbnMuc2V0KHRhcmdldCwgbmV3IFJlc2l6ZU9ic2VydmF0aW9uKHRhcmdldCkpO1xuICAgIHRoaXMuY29udHJvbGxlcl8uYWRkT2JzZXJ2ZXIodGhpcyk7IC8vIEZvcmNlIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2YXRpb25zLlxuXG4gICAgdGhpcy5jb250cm9sbGVyXy5yZWZyZXNoKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFN0b3BzIG9ic2VydmluZyBwcm92aWRlZCBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIHN0b3Agb2JzZXJ2aW5nLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLnVub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICB9IC8vIERvIG5vdGhpbmcgaWYgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgdGhlIEVsZW1lbnQgaW50ZXJmYWNlLlxuXG5cbiAgICBpZiAodHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICEoRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLkVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcbiAgICB9XG5cbiAgICB2YXIgb2JzZXJ2YXRpb25zID0gdGhpcy5vYnNlcnZhdGlvbnNfOyAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgbm90IGJlaW5nIG9ic2VydmVkLlxuXG4gICAgaWYgKCFvYnNlcnZhdGlvbnMuaGFzKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvYnNlcnZhdGlvbnMuZGVsZXRlKHRhcmdldCk7XG5cbiAgICBpZiAoIW9ic2VydmF0aW9ucy5zaXplKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXJfLnJlbW92ZU9ic2VydmVyKHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogU3RvcHMgb2JzZXJ2aW5nIGFsbCBlbGVtZW50cy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zXy5jbGVhcigpO1xuICAgIHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENvbGxlY3RzIG9ic2VydmF0aW9uIGluc3RhbmNlcyB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IG9mIHdoaWNoIGhhcyBjaGFuZ2VkXHJcbiAgICogaXQncyBjb250ZW50IHJlY3RhbmdsZS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xuXG5cbiAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmdhdGhlckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zXy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xuICAgICAgaWYgKG9ic2VydmF0aW9uLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgX3RoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5wdXNoKG9ic2VydmF0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogSW52b2tlcyBpbml0aWFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYSBsaXN0IG9mIFJlc2l6ZU9ic2VydmVyRW50cnlcclxuICAgKiBpbnN0YW5jZXMgY29sbGVjdGVkIGZyb20gYWN0aXZlIHJlc2l6ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5icm9hZGNhc3RBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRG8gbm90aGluZyBpZiBvYnNlcnZlciBkb2Vzbid0IGhhdmUgYWN0aXZlIG9ic2VydmF0aW9ucy5cbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3R4ID0gdGhpcy5jYWxsYmFja0N0eF87IC8vIENyZWF0ZSBSZXNpemVPYnNlcnZlckVudHJ5IGluc3RhbmNlIGZvciBldmVyeSBhY3RpdmUgb2JzZXJ2YXRpb24uXG5cbiAgICB2YXIgZW50cmllcyA9IHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5tYXAoZnVuY3Rpb24gKG9ic2VydmF0aW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc2l6ZU9ic2VydmVyRW50cnkob2JzZXJ2YXRpb24udGFyZ2V0LCBvYnNlcnZhdGlvbi5icm9hZGNhc3RSZWN0KCkpO1xuICAgIH0pO1xuICAgIHRoaXMuY2FsbGJhY2tfLmNhbGwoY3R4LCBlbnRyaWVzLCBjdHgpO1xuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBvYnNlcnZhdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cblxuXG4gIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS5jbGVhckFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18uc3BsaWNlKDApO1xuICB9O1xuICAvKipcclxuICAgKiBUZWxscyB3aGV0aGVyIG9ic2VydmVyIGhhcyBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuaGFzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubGVuZ3RoID4gMDtcbiAgfTtcblxuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJTUEk7XG59KCk7IC8vIFJlZ2lzdHJ5IG9mIGludGVybmFsIG9ic2VydmVycy4gSWYgV2Vha01hcCBpcyBub3QgYXZhaWxhYmxlIHVzZSBjdXJyZW50IHNoaW1cbi8vIGZvciB0aGUgTWFwIGNvbGxlY3Rpb24gYXMgaXQgaGFzIGFsbCByZXF1aXJlZCBtZXRob2RzIGFuZCBiZWNhdXNlIFdlYWtNYXBcbi8vIGNhbid0IGJlIGZ1bGx5IHBvbHlmaWxsZWQgYW55d2F5LlxuXG5cbnZhciBvYnNlcnZlcnMgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgV2Vha01hcCgpIDogbmV3IE1hcFNoaW0oKTtcbi8qKlxyXG4gKiBSZXNpemVPYnNlcnZlciBBUEkuIEVuY2Fwc3VsYXRlcyB0aGUgUmVzaXplT2JzZXJ2ZXIgU1BJIGltcGxlbWVudGF0aW9uXHJcbiAqIGV4cG9zaW5nIG9ubHkgdGhvc2UgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzcGVjLlxyXG4gKi9cblxudmFyIFJlc2l6ZU9ic2VydmVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlblxyXG4gICAqICAgICAgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlcihjYWxsYmFjaykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgY29udHJvbGxlciA9IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgdGhpcyk7XG4gICAgb2JzZXJ2ZXJzLnNldCh0aGlzLCBvYnNlcnZlcik7XG4gIH1cblxuICByZXR1cm4gUmVzaXplT2JzZXJ2ZXI7XG59KCk7IC8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcyBvZiBSZXNpemVPYnNlcnZlci5cblxuXG5bJ29ic2VydmUnLCAndW5vYnNlcnZlJywgJ2Rpc2Nvbm5lY3QnXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgUmVzaXplT2JzZXJ2ZXIucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgcmV0dXJuIChfYSA9IG9ic2VydmVycy5nZXQodGhpcykpW21ldGhvZF0uYXBwbHkoX2EsIGFyZ3VtZW50cyk7XG4gIH07XG59KTtcblxudmFyIGluZGV4ID0gZnVuY3Rpb24gKCkge1xuICAvLyBFeHBvcnQgZXhpc3RpbmcgaW1wbGVtZW50YXRpb24gaWYgYXZhaWxhYmxlLlxuICBpZiAodHlwZW9mIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWwkMS5SZXNpemVPYnNlcnZlcjtcbiAgfVxuXG4gIHJldHVybiBSZXNpemVPYnNlcnZlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXg7IiwidmFyIHdpbmRvd18gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbnZhciBnbG9iYWxfID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3c7XG52YXIgZG9jdW1lbnRfID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDoge307XG5leHBvcnQgeyB3aW5kb3dfIGFzIHdpbmRvdywgZ2xvYmFsXyBhcyBnbG9iYWwsIGRvY3VtZW50XyBhcyBkb2N1bWVudCB9OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHtcbiAgdmFyIGl0O1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHZhciBGID0gZnVuY3Rpb24gRigpIHt9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIGUoX2UpIHtcbiAgICAgICAgICB0aHJvdyBfZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cblxuICB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsXG4gICAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICAgIGVycjtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiBzKCkge1xuICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0Lm5leHQoKTtcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIGUoX2UyKSB7XG4gICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgZXJyID0gX2UyO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gZigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbnZhciByZWZQcm9wcyA9IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3R5bGUoc3R5bGUpIHtcbiAgaWYgKCFzdHlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICBpZiAoc3R5bGUudG9KUykge1xuICAgIHN0eWxlID0gc3R5bGUudG9KUygpO1xuICB9XG5cbiAgdmFyIGxheWVySW5kZXggPSB7fTtcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc3R5bGUubGF5ZXJzKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBsYXllciA9IF9zdGVwLnZhbHVlO1xuICAgICAgbGF5ZXJJbmRleFtsYXllci5pZF0gPSBsYXllcjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIHZhciBsYXllcnMgPSBzdHlsZS5sYXllcnMubWFwKGZ1bmN0aW9uIChsYXllcikge1xuICAgIHZhciBsYXllclJlZiA9IGxheWVySW5kZXhbbGF5ZXIucmVmXTtcbiAgICB2YXIgbm9ybWFsaXplZExheWVyID0gbnVsbDtcblxuICAgIGlmICgnaW50ZXJhY3RpdmUnIGluIGxheWVyKSB7XG4gICAgICBub3JtYWxpemVkTGF5ZXIgPSBfb2JqZWN0U3ByZWFkKHt9LCBsYXllcik7XG4gICAgICBkZWxldGUgbm9ybWFsaXplZExheWVyLmludGVyYWN0aXZlO1xuICAgIH1cblxuICAgIGlmIChsYXllclJlZikge1xuICAgICAgbm9ybWFsaXplZExheWVyID0gbm9ybWFsaXplZExheWVyIHx8IF9vYmplY3RTcHJlYWQoe30sIGxheWVyKTtcbiAgICAgIGRlbGV0ZSBub3JtYWxpemVkTGF5ZXIucmVmO1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHJlZlByb3BzKSxcbiAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHByb3BOYW1lID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHByb3BOYW1lIGluIGxheWVyUmVmKSB7XG4gICAgICAgICAgICBub3JtYWxpemVkTGF5ZXJbcHJvcE5hbWVdID0gbGF5ZXJSZWZbcHJvcE5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRMYXllciB8fCBsYXllcjtcbiAgfSk7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICBsYXllcnM6IGxheWVyc1xuICB9KTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU3R5bGUgfSBmcm9tICcuLi91dGlscy9zdHlsZS11dGlscyc7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihldmVudCkge1xuICBpZiAoZXZlbnQpIHtcbiAgICBjb25zb2xlLmVycm9yKGV2ZW50LmVycm9yKTtcbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb250YWluZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gIGdsOiBQcm9wVHlwZXMub2JqZWN0LFxuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgbWFwYm94QXBpVXJsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhdHRyaWJ1dGlvbkNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IFByb3BUeXBlcy5ib29sLFxuICByZXVzZU1hcHM6IFByb3BUeXBlcy5ib29sLFxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBQcm9wVHlwZXMuZnVuYyxcbiAgbWFwT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgbWFwU3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgcHJldmVudFN0eWxlRGlmZmluZzogUHJvcFR5cGVzLmJvb2wsXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICBhc3luY1JlbmRlcjogUHJvcFR5cGVzLmJvb2wsXG4gIG9uTG9hZDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICB2aWV3U3RhdGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGxvbmdpdHVkZTogUHJvcFR5cGVzLm51bWJlcixcbiAgbGF0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXIsXG4gIHpvb206IFByb3BUeXBlcy5udW1iZXIsXG4gIGJlYXJpbmc6IFByb3BUeXBlcy5udW1iZXIsXG4gIHBpdGNoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBhbHRpdHVkZTogUHJvcFR5cGVzLm51bWJlclxufTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keSxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IGdldEFjY2Vzc1Rva2VuKCksXG4gIG1hcGJveEFwaVVybDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20nLFxuICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGZhbHNlLFxuICBhdHRyaWJ1dGlvbkNvbnRyb2w6IHRydWUsXG4gIHJldXNlTWFwczogZmFsc2UsXG4gIG1hcE9wdGlvbnM6IHt9LFxuICBtYXBTdHlsZTogJ21hcGJveDovL3N0eWxlcy9tYXBib3gvbGlnaHQtdjgnLFxuICBwcmV2ZW50U3R5bGVEaWZmaW5nOiBmYWxzZSxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgYXN5bmNSZW5kZXI6IGZhbHNlLFxuICBvbkxvYWQ6IG5vb3AsXG4gIG9uRXJyb3I6IGRlZmF1bHRPbkVycm9yLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsb25naXR1ZGU6IDAsXG4gIGxhdGl0dWRlOiAwLFxuICB6b29tOiAwLFxuICBiZWFyaW5nOiAwLFxuICBwaXRjaDogMCxcbiAgYWx0aXR1ZGU6IDEuNVxufTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgdmFyIGFjY2Vzc1Rva2VuID0gbnVsbDtcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2F0aW9uKSB7XG4gICAgdmFyIG1hdGNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvYWNjZXNzX3Rva2VuPShbXiZcXC9dKikvKTtcbiAgICBhY2Nlc3NUb2tlbiA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICB9XG5cbiAgaWYgKCFhY2Nlc3NUb2tlbiAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IHByb2Nlc3MuZW52Lk1hcGJveEFjY2Vzc1Rva2VuIHx8IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9NQVBCT1hfQUNDRVNTX1RPS0VOO1xuICB9XG5cbiAgcmV0dXJuIGFjY2Vzc1Rva2VuIHx8ICduby10b2tlbic7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHByb3BzKSB7XG4gIHZhciBjb21wb25lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdjb21wb25lbnQnO1xuXG4gIGlmIChwcm9wcy5kZWJ1Zykge1xuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIHByb3BzLCAncHJvcCcsIGNvbXBvbmVudCk7XG4gIH1cbn1cblxudmFyIE1hcGJveCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFwYm94KHByb3BzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXBib3gpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwicHJvcHNcIiwgZGVmYXVsdFByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIndpZHRoXCIsIDApO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGVpZ2h0XCIsIDApO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ZpcmVMb2FkRXZlbnRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMucHJvcHMub25Mb2FkKHtcbiAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICB0YXJnZXQ6IF90aGlzLl9tYXBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKCFwcm9wcy5tYXBib3hnbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXBib3ggbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIHRoaXMubWFwYm94Z2wgPSBwcm9wcy5tYXBib3hnbDtcblxuICAgIGlmICghTWFwYm94LmluaXRpYWxpemVkKSB7XG4gICAgICBNYXBib3guaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jaGVja1N0eWxlU2hlZXQodGhpcy5tYXBib3hnbC52ZXJzaW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbml0aWFsaXplKHByb3BzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNYXBib3gsIFt7XG4gICAga2V5OiBcImZpbmFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmFsaXplKCkge1xuICAgICAgdGhpcy5fZGVzdHJveSgpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UHJvcHMocHJvcHMpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZSh0aGlzLnByb3BzLCBwcm9wcyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWRyYXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVkcmF3KCkge1xuICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgaWYgKG1hcC5zdHlsZSkge1xuICAgICAgICBpZiAobWFwLl9mcmFtZSkge1xuICAgICAgICAgIG1hcC5fZnJhbWUuY2FuY2VsKCk7XG5cbiAgICAgICAgICBtYXAuX2ZyYW1lID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5fcmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcmV1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JldXNlKHByb3BzKSB7XG4gICAgICB0aGlzLl9tYXAgPSBNYXBib3guc2F2ZWRNYXA7XG5cbiAgICAgIHZhciBvbGRDb250YWluZXIgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCk7XG5cbiAgICAgIHZhciBuZXdDb250YWluZXIgPSBwcm9wcy5jb250YWluZXI7XG4gICAgICBuZXdDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFwJyk7XG5cbiAgICAgIHdoaWxlIChvbGRDb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZChvbGRDb250YWluZXIuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcC5fY29udGFpbmVyID0gbmV3Q29udGFpbmVyO1xuICAgICAgTWFwYm94LnNhdmVkTWFwID0gbnVsbDtcblxuICAgICAgaWYgKHByb3BzLm1hcFN0eWxlKSB7XG4gICAgICAgIHRoaXMuX21hcC5zZXRTdHlsZShub3JtYWxpemVTdHlsZShwcm9wcy5tYXBTdHlsZSksIHtcbiAgICAgICAgICBkaWZmOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX21hcC5pc1N0eWxlTG9hZGVkKCkpIHtcbiAgICAgICAgdGhpcy5fZmlyZUxvYWRFdmVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3N0eWxlZGF0YScsIHRoaXMuX2ZpcmVMb2FkRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGUocHJvcHMpIHtcbiAgICAgIGlmIChwcm9wcy5yZXVzZU1hcHMgJiYgTWFwYm94LnNhdmVkTWFwKSB7XG4gICAgICAgIHRoaXMuX3JldXNlKHByb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9wcy5nbCkge1xuICAgICAgICAgIHZhciBnZXRDb250ZXh0ID0gSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldENvbnRleHQ7XG5cbiAgICAgICAgICBIVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS5nZXRDb250ZXh0ID0gZ2V0Q29udGV4dDtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5nbDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1hcE9wdGlvbnMgPSB7XG4gICAgICAgICAgY29udGFpbmVyOiBwcm9wcy5jb250YWluZXIsXG4gICAgICAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICAgICAgem9vbTogOCxcbiAgICAgICAgICBwaXRjaDogMCxcbiAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgIG1heFpvb206IDI0LFxuICAgICAgICAgIHN0eWxlOiBub3JtYWxpemVTdHlsZShwcm9wcy5tYXBTdHlsZSksXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgIHRyYWNrUmVzaXplOiBmYWxzZSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbkNvbnRyb2w6IHByb3BzLmF0dHJpYnV0aW9uQ29udHJvbCxcbiAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHByb3BzLnByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwcm9wcy50cmFuc2Zvcm1SZXF1ZXN0KSB7XG4gICAgICAgICAgbWFwT3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0ID0gcHJvcHMudHJhbnNmb3JtUmVxdWVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyB0aGlzLm1hcGJveGdsLk1hcChPYmplY3QuYXNzaWduKHt9LCBtYXBPcHRpb25zLCBwcm9wcy5tYXBPcHRpb25zKSk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ2xvYWQnLCBwcm9wcy5vbkxvYWQpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignZXJyb3InLCBwcm9wcy5vbkVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9kZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZXN0cm95KCkge1xuICAgICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU1hcGJveC5zYXZlZE1hcCkge1xuICAgICAgICBNYXBib3guc2F2ZWRNYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignbG9hZCcsIHRoaXMucHJvcHMub25Mb2FkKTtcblxuICAgICAgICB0aGlzLl9tYXAub2ZmKCdlcnJvcicsIHRoaXMucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignc3R5bGVkYXRhJywgdGhpcy5fZmlyZUxvYWRFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9tYXAucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcCA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0aWFsaXplKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMsIHByb3BzKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BzLCAnTWFwYm94Jyk7XG4gICAgICB0aGlzLm1hcGJveGdsLmFjY2Vzc1Rva2VuID0gcHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW4gfHwgZGVmYXVsdFByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuO1xuICAgICAgdGhpcy5tYXBib3hnbC5iYXNlQXBpVXJsID0gcHJvcHMubWFwYm94QXBpVXJsO1xuXG4gICAgICB0aGlzLl9jcmVhdGUocHJvcHMpO1xuXG4gICAgICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICAgICAgY29udGFpbmVyID0gX3Byb3BzLmNvbnRhaW5lcjtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250YWluZXIsICdvZmZzZXRXaWR0aCcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi53aWR0aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGFpbmVyLCAnY2xpZW50V2lkdGgnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIud2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgJ29mZnNldEhlaWdodCcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lciwgJ2NsaWVudEhlaWdodCcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FudmFzID0gdGhpcy5fbWFwLmdldENhbnZhcygpO1xuXG4gICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydCh7fSwgcHJvcHMpO1xuXG4gICAgICB0aGlzLl91cGRhdGVNYXBTaXplKHt9LCBwcm9wcyk7XG5cbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXdQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG5ld1Byb3BzKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKG5ld1Byb3BzLCAnTWFwYm94Jyk7XG5cbiAgICAgIHZhciB2aWV3cG9ydENoYW5nZWQgPSB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydChvbGRQcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgICB2YXIgc2l6ZUNoYW5nZWQgPSB0aGlzLl91cGRhdGVNYXBTaXplKG9sZFByb3BzLCBuZXdQcm9wcyk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZU1hcFN0eWxlKG9sZFByb3BzLCBuZXdQcm9wcyk7XG5cbiAgICAgIGlmICghbmV3UHJvcHMuYXN5bmNSZW5kZXIgJiYgKHZpZXdwb3J0Q2hhbmdlZCB8fCBzaXplQ2hhbmdlZCkpIHtcbiAgICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlTWFwU3R5bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZU1hcFN0eWxlKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgICAgdmFyIHN0eWxlQ2hhbmdlZCA9IG9sZFByb3BzLm1hcFN0eWxlICE9PSBuZXdQcm9wcy5tYXBTdHlsZTtcblxuICAgICAgaWYgKHN0eWxlQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9tYXAuc2V0U3R5bGUobm9ybWFsaXplU3R5bGUobmV3UHJvcHMubWFwU3R5bGUpLCB7XG4gICAgICAgICAgZGlmZjogIW5ld1Byb3BzLnByZXZlbnRTdHlsZURpZmZpbmdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXBTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVNYXBTaXplKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgICAgdmFyIHNpemVDaGFuZ2VkID0gb2xkUHJvcHMud2lkdGggIT09IG5ld1Byb3BzLndpZHRoIHx8IG9sZFByb3BzLmhlaWdodCAhPT0gbmV3UHJvcHMuaGVpZ2h0O1xuXG4gICAgICBpZiAoc2l6ZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IG5ld1Byb3BzLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IG5ld1Byb3BzLmhlaWdodDtcblxuICAgICAgICB0aGlzLl9tYXAucmVzaXplKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaXplQ2hhbmdlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZU1hcFZpZXdwb3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVNYXBWaWV3cG9ydChvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICAgIHZhciBvbGRWaWV3U3RhdGUgPSB0aGlzLl9nZXRWaWV3U3RhdGUob2xkUHJvcHMpO1xuXG4gICAgICB2YXIgbmV3Vmlld1N0YXRlID0gdGhpcy5fZ2V0Vmlld1N0YXRlKG5ld1Byb3BzKTtcblxuICAgICAgdmFyIHZpZXdwb3J0Q2hhbmdlZCA9IG5ld1ZpZXdTdGF0ZS5sYXRpdHVkZSAhPT0gb2xkVmlld1N0YXRlLmxhdGl0dWRlIHx8IG5ld1ZpZXdTdGF0ZS5sb25naXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5sb25naXR1ZGUgfHwgbmV3Vmlld1N0YXRlLnpvb20gIT09IG9sZFZpZXdTdGF0ZS56b29tIHx8IG5ld1ZpZXdTdGF0ZS5waXRjaCAhPT0gb2xkVmlld1N0YXRlLnBpdGNoIHx8IG5ld1ZpZXdTdGF0ZS5iZWFyaW5nICE9PSBvbGRWaWV3U3RhdGUuYmVhcmluZyB8fCBuZXdWaWV3U3RhdGUuYWx0aXR1ZGUgIT09IG9sZFZpZXdTdGF0ZS5hbHRpdHVkZTtcblxuICAgICAgaWYgKHZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9tYXAuanVtcFRvKHRoaXMuX3ZpZXdTdGF0ZVRvTWFwYm94UHJvcHMobmV3Vmlld1N0YXRlKSk7XG5cbiAgICAgICAgaWYgKG5ld1ZpZXdTdGF0ZS5hbHRpdHVkZSAhPT0gb2xkVmlld1N0YXRlLmFsdGl0dWRlKSB7XG4gICAgICAgICAgdGhpcy5fbWFwLnRyYW5zZm9ybS5hbHRpdHVkZSA9IG5ld1ZpZXdTdGF0ZS5hbHRpdHVkZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmlld3BvcnRDaGFuZ2VkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0Vmlld1N0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRWaWV3U3RhdGUocHJvcHMpIHtcbiAgICAgIHZhciBfcmVmID0gcHJvcHMudmlld1N0YXRlIHx8IHByb3BzLFxuICAgICAgICAgIGxvbmdpdHVkZSA9IF9yZWYubG9uZ2l0dWRlLFxuICAgICAgICAgIGxhdGl0dWRlID0gX3JlZi5sYXRpdHVkZSxcbiAgICAgICAgICB6b29tID0gX3JlZi56b29tLFxuICAgICAgICAgIF9yZWYkcGl0Y2ggPSBfcmVmLnBpdGNoLFxuICAgICAgICAgIHBpdGNoID0gX3JlZiRwaXRjaCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkcGl0Y2gsXG4gICAgICAgICAgX3JlZiRiZWFyaW5nID0gX3JlZi5iZWFyaW5nLFxuICAgICAgICAgIGJlYXJpbmcgPSBfcmVmJGJlYXJpbmcgPT09IHZvaWQgMCA/IDAgOiBfcmVmJGJlYXJpbmcsXG4gICAgICAgICAgX3JlZiRhbHRpdHVkZSA9IF9yZWYuYWx0aXR1ZGUsXG4gICAgICAgICAgYWx0aXR1ZGUgPSBfcmVmJGFsdGl0dWRlID09PSB2b2lkIDAgPyAxLjUgOiBfcmVmJGFsdGl0dWRlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgIGJlYXJpbmc6IGJlYXJpbmcsXG4gICAgICAgIGFsdGl0dWRlOiBhbHRpdHVkZVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NoZWNrU3R5bGVTaGVldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2hlY2tTdHlsZVNoZWV0KCkge1xuICAgICAgdmFyIG1hcGJveFZlcnNpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcwLjQ3LjAnO1xuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZXN0RWxlbWVudC5jbGFzc05hbWUgPSAnbWFwYm94Z2wtbWFwJztcbiAgICAgICAgdGVzdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbWVudCk7XG4gICAgICAgIHZhciBpc0Nzc0xvYWRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRlc3RFbGVtZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYyc7XG5cbiAgICAgICAgaWYgKCFpc0Nzc0xvYWRlZCkge1xuICAgICAgICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7XG4gICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBcImh0dHBzOi8vYXBpLnRpbGVzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3ZcIi5jb25jYXQobWFwYm94VmVyc2lvbiwgXCIvbWFwYm94LWdsLmNzc1wiKSk7XG4gICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl92aWV3U3RhdGVUb01hcGJveFByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF92aWV3U3RhdGVUb01hcGJveFByb3BzKHZpZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2VudGVyOiBbdmlld1N0YXRlLmxvbmdpdHVkZSwgdmlld1N0YXRlLmxhdGl0dWRlXSxcbiAgICAgICAgem9vbTogdmlld1N0YXRlLnpvb20sXG4gICAgICAgIGJlYXJpbmc6IHZpZXdTdGF0ZS5iZWFyaW5nLFxuICAgICAgICBwaXRjaDogdmlld1N0YXRlLnBpdGNoXG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXBib3g7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShNYXBib3gsIFwiaW5pdGlhbGl6ZWRcIiwgZmFsc2UpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWFwYm94LCBcInByb3BUeXBlc1wiLCBwcm9wVHlwZXMpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWFwYm94LCBcImRlZmF1bHRQcm9wc1wiLCBkZWZhdWx0UHJvcHMpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWFwYm94LCBcInNhdmVkTWFwXCIsIG51bGwpO1xuXG5leHBvcnQgeyBNYXBib3ggYXMgZGVmYXVsdCB9OyIsInZhciBFUFNJTE9OID0gMWUtNztcblxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNBcnJheShhKSAmJiBpc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCFlcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBFUFNJTE9OO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVycChhLCBiLCB0KSB7XG4gIGlmIChpc0FycmF5KGEpKSB7XG4gICAgcmV0dXJuIGEubWFwKGZ1bmN0aW9uIChhaSwgaSkge1xuICAgICAgcmV0dXJuIGxlcnAoYWksIGJbaV0sIHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHQgKiBiICsgKDEgLSB0KSAqIGE7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdyZWFjdC1tYXAtZ2w6IGFzc2VydGlvbiBmYWlsZWQuJyk7XG4gIH1cbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCwgeyBub3JtYWxpemVWaWV3cG9ydFByb3BzIH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vbWF0aC11dGlscyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4vYXNzZXJ0JztcbmV4cG9ydCB2YXIgTUFQQk9YX0xJTUlUUyA9IHtcbiAgbWluWm9vbTogMCxcbiAgbWF4Wm9vbTogMjQsXG4gIG1pblBpdGNoOiAwLFxuICBtYXhQaXRjaDogODVcbn07XG52YXIgREVGQVVMVF9TVEFURSA9IHtcbiAgcGl0Y2g6IDAsXG4gIGJlYXJpbmc6IDAsXG4gIGFsdGl0dWRlOiAxLjVcbn07XG52YXIgUElUQ0hfTU9VU0VfVEhSRVNIT0xEID0gNTtcbnZhciBQSVRDSF9BQ0NFTCA9IDEuMjtcblxudmFyIE1hcFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXBTdGF0ZShfcmVmKSB7XG4gICAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICAgIGxhdGl0dWRlID0gX3JlZi5sYXRpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICAgIHpvb20gPSBfcmVmLnpvb20sXG4gICAgICAgIF9yZWYkYmVhcmluZyA9IF9yZWYuYmVhcmluZyxcbiAgICAgICAgYmVhcmluZyA9IF9yZWYkYmVhcmluZyA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEFURS5iZWFyaW5nIDogX3JlZiRiZWFyaW5nLFxuICAgICAgICBfcmVmJHBpdGNoID0gX3JlZi5waXRjaCxcbiAgICAgICAgcGl0Y2ggPSBfcmVmJHBpdGNoID09PSB2b2lkIDAgPyBERUZBVUxUX1NUQVRFLnBpdGNoIDogX3JlZiRwaXRjaCxcbiAgICAgICAgX3JlZiRhbHRpdHVkZSA9IF9yZWYuYWx0aXR1ZGUsXG4gICAgICAgIGFsdGl0dWRlID0gX3JlZiRhbHRpdHVkZSA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEFURS5hbHRpdHVkZSA6IF9yZWYkYWx0aXR1ZGUsXG4gICAgICAgIF9yZWYkbWF4Wm9vbSA9IF9yZWYubWF4Wm9vbSxcbiAgICAgICAgbWF4Wm9vbSA9IF9yZWYkbWF4Wm9vbSA9PT0gdm9pZCAwID8gTUFQQk9YX0xJTUlUUy5tYXhab29tIDogX3JlZiRtYXhab29tLFxuICAgICAgICBfcmVmJG1pblpvb20gPSBfcmVmLm1pblpvb20sXG4gICAgICAgIG1pblpvb20gPSBfcmVmJG1pblpvb20gPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWluWm9vbSA6IF9yZWYkbWluWm9vbSxcbiAgICAgICAgX3JlZiRtYXhQaXRjaCA9IF9yZWYubWF4UGl0Y2gsXG4gICAgICAgIG1heFBpdGNoID0gX3JlZiRtYXhQaXRjaCA9PT0gdm9pZCAwID8gTUFQQk9YX0xJTUlUUy5tYXhQaXRjaCA6IF9yZWYkbWF4UGl0Y2gsXG4gICAgICAgIF9yZWYkbWluUGl0Y2ggPSBfcmVmLm1pblBpdGNoLFxuICAgICAgICBtaW5QaXRjaCA9IF9yZWYkbWluUGl0Y2ggPT09IHZvaWQgMCA/IE1BUEJPWF9MSU1JVFMubWluUGl0Y2ggOiBfcmVmJG1pblBpdGNoLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSBfcmVmLnRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgICAgdHJhbnNpdGlvbkVhc2luZyA9IF9yZWYudHJhbnNpdGlvbkVhc2luZyxcbiAgICAgICAgdHJhbnNpdGlvbkludGVycG9sYXRvciA9IF9yZWYudHJhbnNpdGlvbkludGVycG9sYXRvcixcbiAgICAgICAgdHJhbnNpdGlvbkludGVycnVwdGlvbiA9IF9yZWYudHJhbnNpdGlvbkludGVycnVwdGlvbixcbiAgICAgICAgc3RhcnRQYW5MbmdMYXQgPSBfcmVmLnN0YXJ0UGFuTG5nTGF0LFxuICAgICAgICBzdGFydFpvb21MbmdMYXQgPSBfcmVmLnN0YXJ0Wm9vbUxuZ0xhdCxcbiAgICAgICAgc3RhcnRSb3RhdGVQb3MgPSBfcmVmLnN0YXJ0Um90YXRlUG9zLFxuICAgICAgICBzdGFydEJlYXJpbmcgPSBfcmVmLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgc3RhcnRQaXRjaCA9IF9yZWYuc3RhcnRQaXRjaCxcbiAgICAgICAgc3RhcnRab29tID0gX3JlZi5zdGFydFpvb207XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFwU3RhdGUpO1xuXG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZSh3aWR0aCksICdgd2lkdGhgIG11c3QgYmUgc3VwcGxpZWQnKTtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGhlaWdodCksICdgaGVpZ2h0YCBtdXN0IGJlIHN1cHBsaWVkJyk7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZShsb25naXR1ZGUpLCAnYGxvbmdpdHVkZWAgbXVzdCBiZSBzdXBwbGllZCcpO1xuICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUobGF0aXR1ZGUpLCAnYGxhdGl0dWRlYCBtdXN0IGJlIHN1cHBsaWVkJyk7XG4gICAgYXNzZXJ0KE51bWJlci5pc0Zpbml0ZSh6b29tKSwgJ2B6b29tYCBtdXN0IGJlIHN1cHBsaWVkJyk7XG4gICAgdGhpcy5fdmlld3BvcnRQcm9wcyA9IHRoaXMuX2FwcGx5Q29uc3RyYWludHMoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgIHpvb206IHpvb20sXG4gICAgICBiZWFyaW5nOiBiZWFyaW5nLFxuICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgYWx0aXR1ZGU6IGFsdGl0dWRlLFxuICAgICAgbWF4Wm9vbTogbWF4Wm9vbSxcbiAgICAgIG1pblpvb206IG1pblpvb20sXG4gICAgICBtYXhQaXRjaDogbWF4UGl0Y2gsXG4gICAgICBtaW5QaXRjaDogbWluUGl0Y2gsXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb246IHRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgIHRyYW5zaXRpb25FYXNpbmc6IHRyYW5zaXRpb25FYXNpbmcsXG4gICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yLFxuICAgICAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogdHJhbnNpdGlvbkludGVycnVwdGlvblxuICAgIH0pO1xuICAgIHRoaXMuX3N0YXRlID0ge1xuICAgICAgc3RhcnRQYW5MbmdMYXQ6IHN0YXJ0UGFuTG5nTGF0LFxuICAgICAgc3RhcnRab29tTG5nTGF0OiBzdGFydFpvb21MbmdMYXQsXG4gICAgICBzdGFydFJvdGF0ZVBvczogc3RhcnRSb3RhdGVQb3MsXG4gICAgICBzdGFydEJlYXJpbmc6IHN0YXJ0QmVhcmluZyxcbiAgICAgIHN0YXJ0UGl0Y2g6IHN0YXJ0UGl0Y2gsXG4gICAgICBzdGFydFpvb206IHN0YXJ0Wm9vbVxuICAgIH07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWFwU3RhdGUsIFt7XG4gICAga2V5OiBcImdldFZpZXdwb3J0UHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vmlld3BvcnRQcm9wcygpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aWV3cG9ydFByb3BzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFuU3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFuU3RhcnQoX3JlZjIpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmMi5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgc3RhcnRQYW5MbmdMYXQ6IHRoaXMuX3VucHJvamVjdChwb3MpXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhbihfcmVmMykge1xuICAgICAgdmFyIHBvcyA9IF9yZWYzLnBvcyxcbiAgICAgICAgICBzdGFydFBvcyA9IF9yZWYzLnN0YXJ0UG9zO1xuXG4gICAgICB2YXIgc3RhcnRQYW5MbmdMYXQgPSB0aGlzLl9zdGF0ZS5zdGFydFBhbkxuZ0xhdCB8fCB0aGlzLl91bnByb2plY3Qoc3RhcnRQb3MpO1xuXG4gICAgICBpZiAoIXN0YXJ0UGFuTG5nTGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkX2NhbGN1bGF0ZU5ld0xuID0gdGhpcy5fY2FsY3VsYXRlTmV3TG5nTGF0KHtcbiAgICAgICAgc3RhcnRQYW5MbmdMYXQ6IHN0YXJ0UGFuTG5nTGF0LFxuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSksXG4gICAgICAgICAgX3RoaXMkX2NhbGN1bGF0ZU5ld0xuMiA9IF9zbGljZWRUb0FycmF5KF90aGlzJF9jYWxjdWxhdGVOZXdMbiwgMiksXG4gICAgICAgICAgbG9uZ2l0dWRlID0gX3RoaXMkX2NhbGN1bGF0ZU5ld0xuMlswXSxcbiAgICAgICAgICBsYXRpdHVkZSA9IF90aGlzJF9jYWxjdWxhdGVOZXdMbjJbMV07XG5cbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFuRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhbkVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICBzdGFydFBhbkxuZ0xhdDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJvdGF0ZVN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJvdGF0ZVN0YXJ0KF9yZWY0KSB7XG4gICAgICB2YXIgcG9zID0gX3JlZjQucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0Um90YXRlUG9zOiBwb3MsXG4gICAgICAgIHN0YXJ0QmVhcmluZzogdGhpcy5fdmlld3BvcnRQcm9wcy5iZWFyaW5nLFxuICAgICAgICBzdGFydFBpdGNoOiB0aGlzLl92aWV3cG9ydFByb3BzLnBpdGNoXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicm90YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJvdGF0ZShfcmVmNSkge1xuICAgICAgdmFyIHBvcyA9IF9yZWY1LnBvcyxcbiAgICAgICAgICBfcmVmNSRkZWx0YUFuZ2xlWCA9IF9yZWY1LmRlbHRhQW5nbGVYLFxuICAgICAgICAgIGRlbHRhQW5nbGVYID0gX3JlZjUkZGVsdGFBbmdsZVggPT09IHZvaWQgMCA/IDAgOiBfcmVmNSRkZWx0YUFuZ2xlWCxcbiAgICAgICAgICBfcmVmNSRkZWx0YUFuZ2xlWSA9IF9yZWY1LmRlbHRhQW5nbGVZLFxuICAgICAgICAgIGRlbHRhQW5nbGVZID0gX3JlZjUkZGVsdGFBbmdsZVkgPT09IHZvaWQgMCA/IDAgOiBfcmVmNSRkZWx0YUFuZ2xlWTtcbiAgICAgIHZhciBfdGhpcyRfc3RhdGUgPSB0aGlzLl9zdGF0ZSxcbiAgICAgICAgICBzdGFydFJvdGF0ZVBvcyA9IF90aGlzJF9zdGF0ZS5zdGFydFJvdGF0ZVBvcyxcbiAgICAgICAgICBzdGFydEJlYXJpbmcgPSBfdGhpcyRfc3RhdGUuc3RhcnRCZWFyaW5nLFxuICAgICAgICAgIHN0YXJ0UGl0Y2ggPSBfdGhpcyRfc3RhdGUuc3RhcnRQaXRjaDtcblxuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3RhcnRCZWFyaW5nKSB8fCAhTnVtYmVyLmlzRmluaXRlKHN0YXJ0UGl0Y2gpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Um90YXRpb247XG5cbiAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgbmV3Um90YXRpb24gPSB0aGlzLl9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLl9nZXRSb3RhdGlvblBhcmFtcyhwb3MsIHN0YXJ0Um90YXRlUG9zKSksIHt9LCB7XG4gICAgICAgICAgc3RhcnRCZWFyaW5nOiBzdGFydEJlYXJpbmcsXG4gICAgICAgICAgc3RhcnRQaXRjaDogc3RhcnRQaXRjaFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdSb3RhdGlvbiA9IHtcbiAgICAgICAgICBiZWFyaW5nOiBzdGFydEJlYXJpbmcgKyBkZWx0YUFuZ2xlWCxcbiAgICAgICAgICBwaXRjaDogc3RhcnRQaXRjaCArIGRlbHRhQW5nbGVZXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUobmV3Um90YXRpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyb3RhdGVFbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcm90YXRlRW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0QmVhcmluZzogbnVsbCxcbiAgICAgICAgc3RhcnRQaXRjaDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInpvb21TdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB6b29tU3RhcnQoX3JlZjYpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmNi5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VXBkYXRlZE1hcFN0YXRlKHtcbiAgICAgICAgc3RhcnRab29tTG5nTGF0OiB0aGlzLl91bnByb2plY3QocG9zKSxcbiAgICAgICAgc3RhcnRab29tOiB0aGlzLl92aWV3cG9ydFByb3BzLnpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ6b29tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHpvb20oX3JlZjcpIHtcbiAgICAgIHZhciBwb3MgPSBfcmVmNy5wb3MsXG4gICAgICAgICAgc3RhcnRQb3MgPSBfcmVmNy5zdGFydFBvcyxcbiAgICAgICAgICBzY2FsZSA9IF9yZWY3LnNjYWxlO1xuICAgICAgYXNzZXJ0KHNjYWxlID4gMCwgJ2BzY2FsZWAgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgICAgdmFyIF90aGlzJF9zdGF0ZTIgPSB0aGlzLl9zdGF0ZSxcbiAgICAgICAgICBzdGFydFpvb20gPSBfdGhpcyRfc3RhdGUyLnN0YXJ0Wm9vbSxcbiAgICAgICAgICBzdGFydFpvb21MbmdMYXQgPSBfdGhpcyRfc3RhdGUyLnN0YXJ0Wm9vbUxuZ0xhdDtcblxuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3RhcnRab29tKSkge1xuICAgICAgICBzdGFydFpvb20gPSB0aGlzLl92aWV3cG9ydFByb3BzLnpvb207XG4gICAgICAgIHN0YXJ0Wm9vbUxuZ0xhdCA9IHRoaXMuX3VucHJvamVjdChzdGFydFBvcykgfHwgdGhpcy5fdW5wcm9qZWN0KHBvcyk7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChzdGFydFpvb21MbmdMYXQsICdgc3RhcnRab29tTG5nTGF0YCBwcm9wIGlzIHJlcXVpcmVkICcgKyAnZm9yIHpvb20gYmVoYXZpb3IgdG8gY2FsY3VsYXRlIHdoZXJlIHRvIHBvc2l0aW9uIHRoZSBtYXAuJyk7XG5cbiAgICAgIHZhciB6b29tID0gdGhpcy5fY2FsY3VsYXRlTmV3Wm9vbSh7XG4gICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgc3RhcnRab29tOiBzdGFydFpvb20gfHwgMFxuICAgICAgfSk7XG5cbiAgICAgIHZhciB6b29tZWRWaWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3ZpZXdwb3J0UHJvcHMsIHtcbiAgICAgICAgem9vbTogem9vbVxuICAgICAgfSkpO1xuXG4gICAgICB2YXIgX3pvb21lZFZpZXdwb3J0JGdldE1hID0gem9vbWVkVmlld3BvcnQuZ2V0TWFwQ2VudGVyQnlMbmdMYXRQb3NpdGlvbih7XG4gICAgICAgIGxuZ0xhdDogc3RhcnRab29tTG5nTGF0LFxuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSksXG4gICAgICAgICAgX3pvb21lZFZpZXdwb3J0JGdldE1hMiA9IF9zbGljZWRUb0FycmF5KF96b29tZWRWaWV3cG9ydCRnZXRNYSwgMiksXG4gICAgICAgICAgbG9uZ2l0dWRlID0gX3pvb21lZFZpZXdwb3J0JGdldE1hMlswXSxcbiAgICAgICAgICBsYXRpdHVkZSA9IF96b29tZWRWaWV3cG9ydCRnZXRNYTJbMV07XG5cbiAgICAgIHJldHVybiB0aGlzLl9nZXRVcGRhdGVkTWFwU3RhdGUoe1xuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiem9vbUVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB6b29tRW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFVwZGF0ZWRNYXBTdGF0ZSh7XG4gICAgICAgIHN0YXJ0Wm9vbUxuZ0xhdDogbnVsbCxcbiAgICAgICAgc3RhcnRab29tOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFVwZGF0ZWRNYXBTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0VXBkYXRlZE1hcFN0YXRlKG5ld1Byb3BzKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3ZpZXdwb3J0UHJvcHMsIHRoaXMuX3N0YXRlLCBuZXdQcm9wcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfYXBwbHlDb25zdHJhaW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYXBwbHlDb25zdHJhaW50cyhwcm9wcykge1xuICAgICAgdmFyIG1heFpvb20gPSBwcm9wcy5tYXhab29tLFxuICAgICAgICAgIG1pblpvb20gPSBwcm9wcy5taW5ab29tLFxuICAgICAgICAgIHpvb20gPSBwcm9wcy56b29tO1xuICAgICAgcHJvcHMuem9vbSA9IGNsYW1wKHpvb20sIG1pblpvb20sIG1heFpvb20pO1xuICAgICAgdmFyIG1heFBpdGNoID0gcHJvcHMubWF4UGl0Y2gsXG4gICAgICAgICAgbWluUGl0Y2ggPSBwcm9wcy5taW5QaXRjaCxcbiAgICAgICAgICBwaXRjaCA9IHByb3BzLnBpdGNoO1xuICAgICAgcHJvcHMucGl0Y2ggPSBjbGFtcChwaXRjaCwgbWluUGl0Y2gsIG1heFBpdGNoKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIG5vcm1hbGl6ZVZpZXdwb3J0UHJvcHMocHJvcHMpKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VucHJvamVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdW5wcm9qZWN0KHBvcykge1xuICAgICAgdmFyIHZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQodGhpcy5fdmlld3BvcnRQcm9wcyk7XG4gICAgICByZXR1cm4gcG9zICYmIHZpZXdwb3J0LnVucHJvamVjdChwb3MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FsY3VsYXRlTmV3TG5nTGF0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWxjdWxhdGVOZXdMbmdMYXQoX3JlZjgpIHtcbiAgICAgIHZhciBzdGFydFBhbkxuZ0xhdCA9IF9yZWY4LnN0YXJ0UGFuTG5nTGF0LFxuICAgICAgICAgIHBvcyA9IF9yZWY4LnBvcztcbiAgICAgIHZhciB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHRoaXMuX3ZpZXdwb3J0UHJvcHMpO1xuICAgICAgcmV0dXJuIHZpZXdwb3J0LmdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oe1xuICAgICAgICBsbmdMYXQ6IHN0YXJ0UGFuTG5nTGF0LFxuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYWxjdWxhdGVOZXdab29tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWxjdWxhdGVOZXdab29tKF9yZWY5KSB7XG4gICAgICB2YXIgc2NhbGUgPSBfcmVmOS5zY2FsZSxcbiAgICAgICAgICBzdGFydFpvb20gPSBfcmVmOS5zdGFydFpvb207XG4gICAgICB2YXIgX3RoaXMkX3ZpZXdwb3J0UHJvcHMgPSB0aGlzLl92aWV3cG9ydFByb3BzLFxuICAgICAgICAgIG1heFpvb20gPSBfdGhpcyRfdmlld3BvcnRQcm9wcy5tYXhab29tLFxuICAgICAgICAgIG1pblpvb20gPSBfdGhpcyRfdmlld3BvcnRQcm9wcy5taW5ab29tO1xuICAgICAgdmFyIHpvb20gPSBzdGFydFpvb20gKyBNYXRoLmxvZzIoc2NhbGUpO1xuICAgICAgcmV0dXJuIGNsYW1wKHpvb20sIG1pblpvb20sIG1heFpvb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoX3JlZjEwKSB7XG4gICAgICB2YXIgZGVsdGFTY2FsZVggPSBfcmVmMTAuZGVsdGFTY2FsZVgsXG4gICAgICAgICAgZGVsdGFTY2FsZVkgPSBfcmVmMTAuZGVsdGFTY2FsZVksXG4gICAgICAgICAgc3RhcnRCZWFyaW5nID0gX3JlZjEwLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgICBzdGFydFBpdGNoID0gX3JlZjEwLnN0YXJ0UGl0Y2g7XG4gICAgICBkZWx0YVNjYWxlWSA9IGNsYW1wKGRlbHRhU2NhbGVZLCAtMSwgMSk7XG4gICAgICB2YXIgX3RoaXMkX3ZpZXdwb3J0UHJvcHMyID0gdGhpcy5fdmlld3BvcnRQcm9wcyxcbiAgICAgICAgICBtaW5QaXRjaCA9IF90aGlzJF92aWV3cG9ydFByb3BzMi5taW5QaXRjaCxcbiAgICAgICAgICBtYXhQaXRjaCA9IF90aGlzJF92aWV3cG9ydFByb3BzMi5tYXhQaXRjaDtcbiAgICAgIHZhciBiZWFyaW5nID0gc3RhcnRCZWFyaW5nICsgMTgwICogZGVsdGFTY2FsZVg7XG4gICAgICB2YXIgcGl0Y2ggPSBzdGFydFBpdGNoO1xuXG4gICAgICBpZiAoZGVsdGFTY2FsZVkgPiAwKSB7XG4gICAgICAgIHBpdGNoID0gc3RhcnRQaXRjaCArIGRlbHRhU2NhbGVZICogKG1heFBpdGNoIC0gc3RhcnRQaXRjaCk7XG4gICAgICB9IGVsc2UgaWYgKGRlbHRhU2NhbGVZIDwgMCkge1xuICAgICAgICBwaXRjaCA9IHN0YXJ0UGl0Y2ggLSBkZWx0YVNjYWxlWSAqIChtaW5QaXRjaCAtIHN0YXJ0UGl0Y2gpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgIGJlYXJpbmc6IGJlYXJpbmdcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRSb3RhdGlvblBhcmFtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Um90YXRpb25QYXJhbXMocG9zLCBzdGFydFBvcykge1xuICAgICAgdmFyIGRlbHRhWCA9IHBvc1swXSAtIHN0YXJ0UG9zWzBdO1xuICAgICAgdmFyIGRlbHRhWSA9IHBvc1sxXSAtIHN0YXJ0UG9zWzFdO1xuICAgICAgdmFyIGNlbnRlclkgPSBwb3NbMV07XG4gICAgICB2YXIgc3RhcnRZID0gc3RhcnRQb3NbMV07XG4gICAgICB2YXIgX3RoaXMkX3ZpZXdwb3J0UHJvcHMzID0gdGhpcy5fdmlld3BvcnRQcm9wcyxcbiAgICAgICAgICB3aWR0aCA9IF90aGlzJF92aWV3cG9ydFByb3BzMy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRfdmlld3BvcnRQcm9wczMuaGVpZ2h0O1xuICAgICAgdmFyIGRlbHRhU2NhbGVYID0gZGVsdGFYIC8gd2lkdGg7XG4gICAgICB2YXIgZGVsdGFTY2FsZVkgPSAwO1xuXG4gICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gc3RhcnRZKSA+IFBJVENIX01PVVNFX1RIUkVTSE9MRCkge1xuICAgICAgICAgIGRlbHRhU2NhbGVZID0gZGVsdGFZIC8gKHN0YXJ0WSAtIGhlaWdodCkgKiBQSVRDSF9BQ0NFTDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAwKSB7XG4gICAgICAgIGlmIChzdGFydFkgPiBQSVRDSF9NT1VTRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICBkZWx0YVNjYWxlWSA9IDEgLSBjZW50ZXJZIC8gc3RhcnRZO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlbHRhU2NhbGVZID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoLTEsIGRlbHRhU2NhbGVZKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWx0YVNjYWxlWDogZGVsdGFTY2FsZVgsXG4gICAgICAgIGRlbHRhU2NhbGVZOiBkZWx0YVNjYWxlWVxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFwU3RhdGU7XG59KCk7XG5cbmV4cG9ydCB7IE1hcFN0YXRlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgeyBNQVBCT1hfTElNSVRTIH0gZnJvbSAnLi9tYXAtc3RhdGUnO1xuXG5mdW5jdGlvbiBkZWNhcGl0YWxpemUocykge1xuICByZXR1cm4gc1swXS50b0xvd2VyQ2FzZSgpICsgcy5zbGljZSgxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlzaWJpbGl0eUNvbnN0cmFpbnRzKHByb3BzKSB7XG4gIHZhciBjb25zdHJhaW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogTUFQQk9YX0xJTUlUUztcblxuICBmb3IgKHZhciBjb25zdHJhaW50TmFtZSBpbiBjb25zdHJhaW50cykge1xuICAgIHZhciB0eXBlID0gY29uc3RyYWludE5hbWUuc2xpY2UoMCwgMyk7XG4gICAgdmFyIHByb3BOYW1lID0gZGVjYXBpdGFsaXplKGNvbnN0cmFpbnROYW1lLnNsaWNlKDMpKTtcblxuICAgIGlmICh0eXBlID09PSAnbWluJyAmJiBwcm9wc1twcm9wTmFtZV0gPCBjb25zdHJhaW50c1tjb25zdHJhaW50TmFtZV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ21heCcgJiYgcHJvcHNbcHJvcE5hbWVdID4gY29uc3RyYWludHNbY29uc3RyYWludE5hbWVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xudmFyIE1hcENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgdmlld3BvcnQ6IG51bGwsXG4gIG1hcDogbnVsbCxcbiAgY29udGFpbmVyOiBudWxsLFxuICBvblZpZXdwb3J0Q2hhbmdlOiBudWxsLFxuICBvblZpZXdTdGF0ZUNoYW5nZTogbnVsbCxcbiAgZXZlbnRNYW5hZ2VyOiBudWxsXG59KTtcbmV4cG9ydCB2YXIgTWFwQ29udGV4dFByb3ZpZGVyID0gTWFwQ29udGV4dC5Qcm92aWRlcjtcblxuZnVuY3Rpb24gV3JhcHBlZFByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIG1hcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRNYXAgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcbiAgdmFsdWUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHNldE1hcDogc2V0TWFwXG4gIH0sIGNvbnRleHQpLCB7fSwge1xuICAgIG1hcDogY29udGV4dCAmJiBjb250ZXh0Lm1hcCB8fCBtYXBcbiAgfSwgdmFsdWUpO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChNYXBDb250ZXh0UHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG5NYXBDb250ZXh0LlByb3ZpZGVyID0gV3JhcHBlZFByb3ZpZGVyO1xuZXhwb3J0IGRlZmF1bHQgTWFwQ29udGV4dDsiLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7XG5leHBvcnQgZGVmYXVsdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0OyIsImV4cG9ydCBmdW5jdGlvbiBnZXRUZXJyYWluRWxldmF0aW9uKG1hcCwgX3JlZikge1xuICB2YXIgbG9uZ2l0dWRlID0gX3JlZi5sb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSA9IF9yZWYubGF0aXR1ZGU7XG5cbiAgaWYgKG1hcCAmJiBtYXAucXVlcnlUZXJyYWluRWxldmF0aW9uKSB7XG4gICAgcmV0dXJuIG1hcC5xdWVyeVRlcnJhaW5FbGV2YXRpb24oW2xvbmdpdHVkZSwgbGF0aXR1ZGVdKSB8fCAwO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJztcbmltcG9ydCBNYXBib3ggZnJvbSAnLi4vbWFwYm94L21hcGJveCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHsgY2hlY2tWaXNpYmlsaXR5Q29uc3RyYWludHMgfSBmcm9tICcuLi91dGlscy9tYXAtY29uc3RyYWludHMnO1xuaW1wb3J0IHsgTUFQQk9YX0xJTUlUUyB9IGZyb20gJy4uL3V0aWxzL21hcC1zdGF0ZSc7XG5pbXBvcnQgTWFwQ29udGV4dCwgeyBNYXBDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IGZyb20gJy4uL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QnO1xuaW1wb3J0IHsgZ2V0VGVycmFpbkVsZXZhdGlvbiB9IGZyb20gJy4uL3V0aWxzL3RlcnJhaW4nO1xudmFyIFRPS0VOX0RPQ19VUkwgPSAnaHR0cHM6Ly92aXNnbC5naXRodWIuaW8vcmVhY3QtbWFwLWdsL2RvY3MvZ2V0LXN0YXJ0ZWQvbWFwYm94LXRva2Vucyc7XG52YXIgTk9fVE9LRU5fV0FSTklORyA9ICdBIHZhbGlkIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBkYXRhJztcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydChfcmVmKSB7XG4gIHZhciBtYXAgPSBfcmVmLm1hcCxcbiAgICAgIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICAgIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0O1xuXG4gIHZhciB2aWV3cG9ydFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwgcHJvcHMudmlld1N0YXRlKSwge30sIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSk7XG5cbiAgdmlld3BvcnRQcm9wcy5wb3NpdGlvbiA9IFswLCAwLCBnZXRUZXJyYWluRWxldmF0aW9uKG1hcCwgdmlld3BvcnRQcm9wcyldO1xuICByZXR1cm4gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQodmlld3BvcnRQcm9wcyk7XG59XG52YXIgVU5BVVRIT1JJWkVEX0VSUk9SX0NPREUgPSA0MDE7XG52YXIgQ09OVEFJTkVSX1NUWUxFID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgd2lkdGg6ICcxMDAlJyxcbiAgaGVpZ2h0OiAnMTAwJScsXG4gIG92ZXJmbG93OiAnaGlkZGVuJ1xufTtcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBNYXBib3guZGVmYXVsdFByb3BzLCB7XG4gIGRpc2FibGVUb2tlbldhcm5pbmc6IGZhbHNlLFxuICB2aXNpYmxlOiB0cnVlLFxuICBvblJlc2l6ZTogbm9vcCxcbiAgY2xhc3NOYW1lOiAnJyxcbiAgc3R5bGU6IG51bGwsXG4gIHZpc2liaWxpdHlDb25zdHJhaW50czogTUFQQk9YX0xJTUlUU1xufSk7XG5cbmZ1bmN0aW9uIE5vVG9rZW5XYXJuaW5nKCkge1xuICB2YXIgc3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDBcbiAgfTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJ3YXJuaW5nXCIsXG4gICAgaWQ6IFwibm8tdG9rZW4td2FybmluZ1wiLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge1xuICAgIGtleTogXCJoZWFkZXJcIlxuICB9LCBOT19UT0tFTl9XQVJOSU5HKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcInRleHRcIlxuICB9LCBcIkZvciBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIHlvdXIgYmFzZW1hcCwgcmVhZFwiKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgIGtleTogXCJsaW5rXCIsXG4gICAgaHJlZjogVE9LRU5fRE9DX1VSTFxuICB9LCBcIk5vdGUgb24gTWFwIFRva2Vuc1wiKSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlZkhhbmRsZXMobWFwYm94UmVmKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0TWFwOiBmdW5jdGlvbiBnZXRNYXAoKSB7XG4gICAgICByZXR1cm4gbWFwYm94UmVmLmN1cnJlbnQgJiYgbWFwYm94UmVmLmN1cnJlbnQuZ2V0TWFwKCk7XG4gICAgfSxcbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXM6IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIG1hcCA9IG1hcGJveFJlZi5jdXJyZW50ICYmIG1hcGJveFJlZi5jdXJyZW50LmdldE1hcCgpO1xuICAgICAgcmV0dXJuIG1hcCAmJiBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGdlb21ldHJ5LCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTdGF0aWNNYXAgPSBmb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh0cnVlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgYWNjZXNzVG9rZW5WYWxpZCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRUb2tlblN0YXRlID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzaXplID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldFNpemUgPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBtYXBib3hSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBtYXBEaXZSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBvdmVybGF5UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghU3RhdGljTWFwLnN1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciBtYXBib3ggPSBuZXcgTWFwYm94KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHNpemUpLCB7fSwge1xuICAgICAgbWFwYm94Z2w6IG1hcGJveGdsLFxuICAgICAgY29udGFpbmVyOiBtYXBEaXZSZWYuY3VycmVudCxcbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZXZ0KSB7XG4gICAgICAgIHZhciBzdGF0dXNDb2RlID0gZXZ0LmVycm9yICYmIGV2dC5lcnJvci5zdGF0dXMgfHwgZXZ0LnN0YXR1cztcblxuICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gVU5BVVRIT1JJWkVEX0VSUk9SX0NPREUgJiYgYWNjZXNzVG9rZW5WYWxpZCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoTk9fVE9LRU5fV0FSTklORyk7XG4gICAgICAgICAgc2V0VG9rZW5TdGF0ZShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9wcy5vbkVycm9yKGV2dCk7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIG1hcGJveFJlZi5jdXJyZW50ID0gbWFwYm94O1xuXG4gICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5zZXRNYXApIHtcbiAgICAgIGNvbnRleHQuc2V0TWFwKG1hcGJveC5nZXRNYXAoKSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllc1swXS5jb250ZW50UmVjdCkge1xuICAgICAgICB2YXIgX2VudHJpZXMkMCRjb250ZW50UmVjID0gZW50cmllc1swXS5jb250ZW50UmVjdCxcbiAgICAgICAgICAgIF93aWR0aCA9IF9lbnRyaWVzJDAkY29udGVudFJlYy53aWR0aCxcbiAgICAgICAgICAgIF9oZWlnaHQgPSBfZW50cmllcyQwJGNvbnRlbnRSZWMuaGVpZ2h0O1xuICAgICAgICBzZXRTaXplKHtcbiAgICAgICAgICB3aWR0aDogX3dpZHRoLFxuICAgICAgICAgIGhlaWdodDogX2hlaWdodFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvcHMub25SZXNpemUoe1xuICAgICAgICAgIHdpZHRoOiBfd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtYXBib3guZmluYWxpemUoKTtcbiAgICAgIG1hcGJveFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXBib3hSZWYuY3VycmVudCkge1xuICAgICAgbWFwYm94UmVmLmN1cnJlbnQuc2V0UHJvcHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHNpemUpKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgbWFwID0gbWFwYm94UmVmLmN1cnJlbnQgJiYgbWFwYm94UmVmLmN1cnJlbnQuZ2V0TWFwKCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFJlZkhhbmRsZXMobWFwYm94UmVmKTtcbiAgfSwgW10pO1xuICB2YXIgcHJldmVudFNjcm9sbCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB0YXJnZXQgPSBfcmVmMi50YXJnZXQ7XG5cbiAgICBpZiAodGFyZ2V0ID09PSBvdmVybGF5UmVmLmN1cnJlbnQpIHtcbiAgICAgIHRhcmdldC5zY3JvbGxUbygwLCAwKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgdmFyIG92ZXJsYXlzID0gbWFwICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFwQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29udGV4dCksIHt9LCB7XG4gICAgICB2aWV3cG9ydDogY29udGV4dC52aWV3cG9ydCB8fCBnZXRWaWV3cG9ydChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgbWFwOiBtYXAsXG4gICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgfSwgc2l6ZSkpLFxuICAgICAgbWFwOiBtYXAsXG4gICAgICBjb250YWluZXI6IGNvbnRleHQuY29udGFpbmVyIHx8IGNvbnRhaW5lclJlZi5jdXJyZW50XG4gICAgfSlcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcIm1hcC1vdmVybGF5c1wiLFxuICAgIGNsYXNzTmFtZTogXCJvdmVybGF5c1wiLFxuICAgIHJlZjogb3ZlcmxheVJlZixcbiAgICBzdHlsZTogQ09OVEFJTkVSX1NUWUxFLFxuICAgIG9uU2Nyb2xsOiBwcmV2ZW50U2Nyb2xsXG4gIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIHZpc2liaWxpdHlDb25zdHJhaW50cyA9IHByb3BzLnZpc2liaWxpdHlDb25zdHJhaW50cztcbiAgdmFyIG1hcENvbnRhaW5lclN0eWxlID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgfSwgc3R5bGUsIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSk7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSAmJiBjaGVja1Zpc2liaWxpdHlDb25zdHJhaW50cyhwcm9wcy52aWV3U3RhdGUgfHwgcHJvcHMsIHZpc2liaWxpdHlDb25zdHJhaW50cyk7XG4gIHZhciBtYXBTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIENPTlRBSU5FUl9TVFlMRSwge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGUgPyAnaW5oZXJpdCcgOiAnaGlkZGVuJ1xuICB9KTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJtYXAtY29udGFpbmVyXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgc3R5bGU6IG1hcENvbnRhaW5lclN0eWxlXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJtYXAtbWFwYm94XCIsXG4gICAgcmVmOiBtYXBEaXZSZWYsXG4gICAgc3R5bGU6IG1hcFN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBvdmVybGF5cywgIWFjY2Vzc1Rva2VuVmFsaWQgJiYgIXByb3BzLmRpc2FibGVUb2tlbldhcm5pbmcgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChOb1Rva2VuV2FybmluZywgbnVsbCkpO1xufSk7XG5cblN0YXRpY01hcC5zdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYXBib3hnbCAmJiBtYXBib3hnbC5zdXBwb3J0ZWQoKTtcbn07XG5cblN0YXRpY01hcC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBTdGF0aWNNYXA7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkge1xuICB2YXIgaXQ7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoaXQpIG8gPSBpdDtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHM6IEYsXG4gICAgICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gZShfZSkge1xuICAgICAgICAgIHRocm93IF9lO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSxcbiAgICAgIGRpZEVyciA9IGZhbHNlLFxuICAgICAgZXJyO1xuICByZXR1cm4ge1xuICAgIHM6IGZ1bmN0aW9uIHMoKSB7XG4gICAgICBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgIHZhciBzdGVwID0gaXQubmV4dCgpO1xuICAgICAgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTtcbiAgICAgIHJldHVybiBzdGVwO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gZShfZTIpIHtcbiAgICAgIGRpZEVyciA9IHRydWU7XG4gICAgICBlcnIgPSBfZTI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiBmKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxuaW1wb3J0IHsgZXF1YWxzIH0gZnJvbSAnLi4vbWF0aC11dGlscyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4uL2Fzc2VydCc7XG5cbnZhciBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInByb3BOYW1lc1wiLCBbXSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVHJhbnNpdGlvbkludGVycG9sYXRvciwgW3tcbiAgICBrZXk6IFwiYXJlUHJvcHNFcXVhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcmVQcm9wc0VxdWFsKGN1cnJlbnRQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5wcm9wTmFtZXMgfHwgW10pLFxuICAgICAgICAgIF9zdGVwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBrZXkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRQcm9wc1trZXldLCBuZXh0UHJvcHNba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBzdGFydFByb3BzLFxuICAgICAgICBlbmQ6IGVuZFByb3BzXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlcnBvbGF0ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVycG9sYXRlUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIHQpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ2ludGVycG9sYXRlUHJvcHMgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICByZXR1cm4gZW5kUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yO1xufSgpO1xuXG5leHBvcnQgeyBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yIGFzIGRlZmF1bHQgfTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufSIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufSIsInZhciBXUkFQUEVEX0FOR1VMQVJfUFJPUFMgPSB7XG4gIGxvbmdpdHVkZTogMSxcbiAgYmVhcmluZzogMVxufTtcbmV4cG9ydCBmdW5jdGlvbiBtb2QodmFsdWUsIGRpdmlzb3IpIHtcbiAgdmFyIG1vZHVsdXMgPSB2YWx1ZSAlIGRpdmlzb3I7XG4gIHJldHVybiBtb2R1bHVzIDwgMCA/IGRpdmlzb3IgKyBtb2R1bHVzIDogbW9kdWx1cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkKHByb3ApIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwcm9wKSB8fCBBcnJheS5pc0FycmF5KHByb3ApO1xufVxuXG5mdW5jdGlvbiBpc1dyYXBwZWRBbmd1bGFyUHJvcChwcm9wTmFtZSkge1xuICByZXR1cm4gcHJvcE5hbWUgaW4gV1JBUFBFRF9BTkdVTEFSX1BST1BTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aChwcm9wTmFtZSwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUpIHtcbiAgaWYgKGlzV3JhcHBlZEFuZ3VsYXJQcm9wKHByb3BOYW1lKSAmJiBNYXRoLmFicyhlbmRWYWx1ZSAtIHN0YXJ0VmFsdWUpID4gMTgwKSB7XG4gICAgZW5kVmFsdWUgPSBlbmRWYWx1ZSA8IDAgPyBlbmRWYWx1ZSArIDM2MCA6IGVuZFZhbHVlIC0gMzYwO1xuICB9XG5cbiAgcmV0dXJuIGVuZFZhbHVlO1xufSIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChpdCkgbyA9IGl0O1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gbigpIHtcbiAgICAgICAgICBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBvW2krK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiBlKF9lKSB7XG4gICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG5cbiAgdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gcygpIHtcbiAgICAgIGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiBlKF9lMikge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IF9lMjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uIGYoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtcblxuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJy4uL2Fzc2VydCc7XG5pbXBvcnQgVHJhbnNpdGlvbkludGVycG9sYXRvciBmcm9tICcuL3RyYW5zaXRpb24taW50ZXJwb2xhdG9yJztcbmltcG9ydCB7IGZseVRvVmlld3BvcnQsIGdldEZseVRvRHVyYXRpb24gfSBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCB7IGlzVmFsaWQsIGdldEVuZFZhbHVlQnlTaG9ydGVzdFBhdGggfSBmcm9tICcuL3RyYW5zaXRpb24tdXRpbHMnO1xuaW1wb3J0IHsgbGVycCB9IGZyb20gJy4uL21hdGgtdXRpbHMnO1xudmFyIFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFMgPSBbJ2xvbmdpdHVkZScsICdsYXRpdHVkZScsICd6b29tJywgJ2JlYXJpbmcnLCAncGl0Y2gnXTtcbnZhciBSRVFVSVJFRF9QUk9QUyA9IFsnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJywgJ3pvb20nLCAnd2lkdGgnLCAnaGVpZ2h0J107XG52YXIgTElORUFSTFlfSU5URVJQT0xBVEVEX1BST1BTID0gWydiZWFyaW5nJywgJ3BpdGNoJ107XG52YXIgREVGQVVMVF9PUFRTID0ge1xuICBzcGVlZDogMS4yLFxuICBjdXJ2ZTogMS40MTRcbn07XG5cbnZhciBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKF9UcmFuc2l0aW9uSW50ZXJwb2xhdCkge1xuICBfaW5oZXJpdHMoVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciwgX1RyYW5zaXRpb25JbnRlcnBvbGF0KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IpO1xuXG4gIGZ1bmN0aW9uIFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicHJvcE5hbWVzXCIsIFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFMpO1xuXG4gICAgX3RoaXMucHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVFMsIHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciwgW3tcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemVQcm9wcyhzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgdmFyIHN0YXJ0Vmlld3BvcnRQcm9wcyA9IHt9O1xuICAgICAgdmFyIGVuZFZpZXdwb3J0UHJvcHMgPSB7fTtcblxuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKFJFUVVJUkVEX1BST1BTKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFByb3BzW2tleV07XG4gICAgICAgICAgdmFyIGVuZFZhbHVlID0gZW5kUHJvcHNba2V5XTtcbiAgICAgICAgICBhc3NlcnQoaXNWYWxpZChzdGFydFZhbHVlKSAmJiBpc1ZhbGlkKGVuZFZhbHVlKSwgXCJcIi5jb25jYXQoa2V5LCBcIiBtdXN0IGJlIHN1cHBsaWVkIGZvciB0cmFuc2l0aW9uXCIpKTtcbiAgICAgICAgICBzdGFydFZpZXdwb3J0UHJvcHNba2V5XSA9IHN0YXJ0VmFsdWU7XG4gICAgICAgICAgZW5kVmlld3BvcnRQcm9wc1trZXldID0gZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aChrZXksIHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKExJTkVBUkxZX0lOVEVSUE9MQVRFRF9QUk9QUyksXG4gICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgdmFyIF9zdGFydFZhbHVlID0gc3RhcnRQcm9wc1tfa2V5XSB8fCAwO1xuXG4gICAgICAgICAgdmFyIF9lbmRWYWx1ZSA9IGVuZFByb3BzW19rZXldIHx8IDA7XG5cbiAgICAgICAgICBzdGFydFZpZXdwb3J0UHJvcHNbX2tleV0gPSBfc3RhcnRWYWx1ZTtcbiAgICAgICAgICBlbmRWaWV3cG9ydFByb3BzW19rZXldID0gZ2V0RW5kVmFsdWVCeVNob3J0ZXN0UGF0aChfa2V5LCBfc3RhcnRWYWx1ZSwgX2VuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBzdGFydFZpZXdwb3J0UHJvcHMsXG4gICAgICAgIGVuZDogZW5kVmlld3BvcnRQcm9wc1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJwb2xhdGVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gICAgICB2YXIgdmlld3BvcnQgPSBmbHlUb1ZpZXdwb3J0KHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0LCB0aGlzLnByb3BzKTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihMSU5FQVJMWV9JTlRFUlBPTEFURURfUFJPUFMpLFxuICAgICAgICAgIF9zdGVwMztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICAgIHZpZXdwb3J0W2tleV0gPSBsZXJwKHN0YXJ0UHJvcHNba2V5XSwgZW5kUHJvcHNba2V5XSwgdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmlld3BvcnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gZW5kUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbkR1cmF0aW9uID09PSAnYXV0bycpIHtcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gZ2V0Rmx5VG9EdXJhdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcywgdGhpcy5wcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc2l0aW9uRHVyYXRpb247XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3I7XG59KFRyYW5zaXRpb25JbnRlcnBvbGF0b3IpO1xuXG5leHBvcnQgeyBWaWV3cG9ydEZseVRvSW50ZXJwb2xhdG9yIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZ2V0UHJvdG90eXBlT2ZcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHtcbiAgdmFyIGl0O1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHZhciBGID0gZnVuY3Rpb24gRigpIHt9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIGUoX2UpIHtcbiAgICAgICAgICB0aHJvdyBfZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cblxuICB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsXG4gICAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICAgIGVycjtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiBzKCkge1xuICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uIG4oKSB7XG4gICAgICB2YXIgc3RlcCA9IGl0Lm5leHQoKTtcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIGUoX2UyKSB7XG4gICAgICBkaWRFcnIgPSB0cnVlO1xuICAgICAgZXJyID0gX2UyO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gZigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdFtcInJldHVyblwiXSAhPSBudWxsKSBpdFtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7XG4gIHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHtcbiAgICB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksXG4gICAgICAgIHJlc3VsdDtcblxuICAgIGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7XG4gICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuXG4gICAgICByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi9hc3NlcnQnO1xuaW1wb3J0IFRyYW5zaXRpb25JbnRlcnBvbGF0b3IgZnJvbSAnLi90cmFuc2l0aW9uLWludGVycG9sYXRvcic7XG5pbXBvcnQgeyBpc1ZhbGlkLCBnZXRFbmRWYWx1ZUJ5U2hvcnRlc3RQYXRoIH0gZnJvbSAnLi90cmFuc2l0aW9uLXV0aWxzJztcbmltcG9ydCB7IGxlcnAgfSBmcm9tICcuLi9tYXRoLXV0aWxzJztcbnZhciBWSUVXUE9SVF9UUkFOU0lUSU9OX1BST1BTID0gWydsb25naXR1ZGUnLCAnbGF0aXR1ZGUnLCAnem9vbScsICdiZWFyaW5nJywgJ3BpdGNoJ107XG5cbnZhciBMaW5lYXJJbnRlcnBvbGF0b3IgPSBmdW5jdGlvbiAoX1RyYW5zaXRpb25JbnRlcnBvbGF0KSB7XG4gIF9pbmhlcml0cyhMaW5lYXJJbnRlcnBvbGF0b3IsIF9UcmFuc2l0aW9uSW50ZXJwb2xhdCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihMaW5lYXJJbnRlcnBvbGF0b3IpO1xuXG4gIGZ1bmN0aW9uIExpbmVhckludGVycG9sYXRvcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluZWFySW50ZXJwb2xhdG9yKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzKSkge1xuICAgICAgb3B0cyA9IHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BzOiBvcHRzXG4gICAgICB9O1xuICAgIH1cblxuICAgIF90aGlzLnByb3BOYW1lcyA9IG9wdHMudHJhbnNpdGlvblByb3BzIHx8IFZJRVdQT1JUX1RSQU5TSVRJT05fUFJPUFM7XG5cbiAgICBpZiAob3B0cy5hcm91bmQpIHtcbiAgICAgIF90aGlzLmFyb3VuZCA9IG9wdHMuYXJvdW5kO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaW5lYXJJbnRlcnBvbGF0b3IsIFt7XG4gICAga2V5OiBcImluaXRpYWxpemVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMpIHtcbiAgICAgIHZhciBzdGFydFZpZXdwb3J0UHJvcHMgPSB7fTtcbiAgICAgIHZhciBlbmRWaWV3cG9ydFByb3BzID0ge307XG5cbiAgICAgIGlmICh0aGlzLmFyb3VuZCkge1xuICAgICAgICBzdGFydFZpZXdwb3J0UHJvcHMuYXJvdW5kID0gdGhpcy5hcm91bmQ7XG4gICAgICAgIHZhciBhcm91bmRMbmdMYXQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChzdGFydFByb3BzKS51bnByb2plY3QodGhpcy5hcm91bmQpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGVuZFZpZXdwb3J0UHJvcHMsIGVuZFByb3BzLCB7XG4gICAgICAgICAgYXJvdW5kOiBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChlbmRQcm9wcykucHJvamVjdChhcm91bmRMbmdMYXQpLFxuICAgICAgICAgIGFyb3VuZExuZ0xhdDogYXJvdW5kTG5nTGF0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5wcm9wTmFtZXMpLFxuICAgICAgICAgIF9zdGVwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBrZXkgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0UHJvcHNba2V5XTtcbiAgICAgICAgICB2YXIgZW5kVmFsdWUgPSBlbmRQcm9wc1trZXldO1xuICAgICAgICAgIGFzc2VydChpc1ZhbGlkKHN0YXJ0VmFsdWUpICYmIGlzVmFsaWQoZW5kVmFsdWUpLCBcIlwiLmNvbmNhdChrZXksIFwiIG11c3QgYmUgc3VwcGxpZWQgZm9yIHRyYW5zaXRpb25cIikpO1xuICAgICAgICAgIHN0YXJ0Vmlld3BvcnRQcm9wc1trZXldID0gc3RhcnRWYWx1ZTtcbiAgICAgICAgICBlbmRWaWV3cG9ydFByb3BzW2tleV0gPSBnZXRFbmRWYWx1ZUJ5U2hvcnRlc3RQYXRoKGtleSwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBzdGFydFZpZXdwb3J0UHJvcHMsXG4gICAgICAgIGVuZDogZW5kVmlld3BvcnRQcm9wc1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJwb2xhdGVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnBvbGF0ZVByb3BzKHN0YXJ0UHJvcHMsIGVuZFByb3BzLCB0KSB7XG4gICAgICB2YXIgdmlld3BvcnQgPSB7fTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLnByb3BOYW1lcyksXG4gICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgdmlld3BvcnRba2V5XSA9IGxlcnAoc3RhcnRQcm9wc1trZXldLCBlbmRQcm9wc1trZXldLCB0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmRQcm9wcy5hcm91bmQpIHtcbiAgICAgICAgdmFyIF9XZWJNZXJjYXRvclZpZXdwb3J0JCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KE9iamVjdC5hc3NpZ24oe30sIGVuZFByb3BzLCB2aWV3cG9ydCkpLmdldE1hcENlbnRlckJ5TG5nTGF0UG9zaXRpb24oe1xuICAgICAgICAgIGxuZ0xhdDogZW5kUHJvcHMuYXJvdW5kTG5nTGF0LFxuICAgICAgICAgIHBvczogbGVycChzdGFydFByb3BzLmFyb3VuZCwgZW5kUHJvcHMuYXJvdW5kLCB0KVxuICAgICAgICB9KSxcbiAgICAgICAgICAgIF9XZWJNZXJjYXRvclZpZXdwb3J0JDIgPSBfc2xpY2VkVG9BcnJheShfV2ViTWVyY2F0b3JWaWV3cG9ydCQsIDIpLFxuICAgICAgICAgICAgbG9uZ2l0dWRlID0gX1dlYk1lcmNhdG9yVmlld3BvcnQkMlswXSxcbiAgICAgICAgICAgIGxhdGl0dWRlID0gX1dlYk1lcmNhdG9yVmlld3BvcnQkMlsxXTtcblxuICAgICAgICB2aWV3cG9ydC5sb25naXR1ZGUgPSBsb25naXR1ZGU7XG4gICAgICAgIHZpZXdwb3J0LmxhdGl0dWRlID0gbGF0aXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2aWV3cG9ydDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGluZWFySW50ZXJwb2xhdG9yO1xufShUcmFuc2l0aW9uSW50ZXJwb2xhdG9yKTtcblxuZXhwb3J0IHsgTGluZWFySW50ZXJwb2xhdG9yIGFzIGRlZmF1bHQgfTsiLCJleHBvcnQgeyBkZWZhdWx0IGFzIFRyYW5zaXRpb25JbnRlcnBvbGF0b3IgfSBmcm9tICcuL3RyYW5zaXRpb24taW50ZXJwb2xhdG9yJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVmlld3BvcnRGbHlUb0ludGVycG9sYXRvciB9IGZyb20gJy4vdmlld3BvcnQtZmx5LXRvLWludGVycG9sYXRvcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpbmVhckludGVycG9sYXRvciB9IGZyb20gJy4vbGluZWFyLWludGVycG9sYXRvcic7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuL2Fzc2VydCc7XG5pbXBvcnQgeyBMaW5lYXJJbnRlcnBvbGF0b3IgfSBmcm9tICcuL3RyYW5zaXRpb24nO1xuaW1wb3J0IE1hcFN0YXRlIGZyb20gJy4vbWFwLXN0YXRlJztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9wRWFzaW5nRnVuY3Rpb24oZWFzaW5nLCB4MCkge1xuICB2YXIgeTAgPSBlYXNpbmcoeDApO1xuICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gMSAvICgxIC0geTApICogKGVhc2luZyh0ICogKDEgLSB4MCkgKyB4MCkgLSB5MCk7XG4gIH07XG59XG5leHBvcnQgdmFyIFRSQU5TSVRJT05fRVZFTlRTID0ge1xuICBCUkVBSzogMSxcbiAgU05BUF9UT19FTkQ6IDIsXG4gIElHTk9SRTogMyxcbiAgVVBEQVRFOiA0XG59O1xudmFyIERFRkFVTFRfUFJPUFMgPSB7XG4gIHRyYW5zaXRpb25EdXJhdGlvbjogMCxcbiAgdHJhbnNpdGlvbkVhc2luZzogZnVuY3Rpb24gdHJhbnNpdGlvbkVhc2luZyh0KSB7XG4gICAgcmV0dXJuIHQ7XG4gIH0sXG4gIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSxcbiAgdHJhbnNpdGlvbkludGVycnVwdGlvbjogVFJBTlNJVElPTl9FVkVOVFMuQlJFQUssXG4gIG9uVHJhbnNpdGlvblN0YXJ0OiBub29wLFxuICBvblRyYW5zaXRpb25JbnRlcnJ1cHQ6IG5vb3AsXG4gIG9uVHJhbnNpdGlvbkVuZDogbm9vcFxufTtcblxudmFyIFRyYW5zaXRpb25NYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmFuc2l0aW9uTWFuYWdlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zaXRpb25NYW5hZ2VyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9hbmltYXRpb25GcmFtZVwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9vblRyYW5zaXRpb25GcmFtZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMuX29uVHJhbnNpdGlvbkZyYW1lKTtcblxuICAgICAgX3RoaXMuX3VwZGF0ZVZpZXdwb3J0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3BzID0gbnVsbDtcbiAgICB0aGlzLm9uVmlld3BvcnRDaGFuZ2UgPSBvcHRzLm9uVmlld3BvcnRDaGFuZ2UgfHwgbm9vcDtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2UgPSBvcHRzLm9uU3RhdGVDaGFuZ2UgfHwgbm9vcDtcbiAgICB0aGlzLnRpbWUgPSBvcHRzLmdldFRpbWUgfHwgRGF0ZS5ub3c7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVHJhbnNpdGlvbk1hbmFnZXIsIFt7XG4gICAga2V5OiBcImdldFZpZXdwb3J0SW5UcmFuc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZpZXdwb3J0SW5UcmFuc2l0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FuaW1hdGlvbkZyYW1lID8gdGhpcy5zdGF0ZS5wcm9wc0luVHJhbnNpdGlvbiA6IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByb2Nlc3NWaWV3cG9ydENoYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzVmlld3BvcnRDaGFuZ2UobmV4dFByb3BzKSB7XG4gICAgICB2YXIgY3VycmVudFByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHRoaXMucHJvcHMgPSBuZXh0UHJvcHM7XG5cbiAgICAgIGlmICghY3VycmVudFByb3BzIHx8IHRoaXMuX3Nob3VsZElnbm9yZVZpZXdwb3J0Q2hhbmdlKGN1cnJlbnRQcm9wcywgbmV4dFByb3BzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25FbmFibGVkKG5leHRQcm9wcykpIHtcbiAgICAgICAgdmFyIHN0YXJ0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50UHJvcHMpO1xuICAgICAgICB2YXIgZW5kUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBuZXh0UHJvcHMpO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25JblByb2dyZXNzKCkpIHtcbiAgICAgICAgICBjdXJyZW50UHJvcHMub25UcmFuc2l0aW9uSW50ZXJydXB0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5pbnRlcnJ1cHRpb24gPT09IFRSQU5TSVRJT05fRVZFTlRTLlNOQVBfVE9fRU5EKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXJ0UHJvcHMsIHRoaXMuc3RhdGUuZW5kUHJvcHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXJ0UHJvcHMsIHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmludGVycnVwdGlvbiA9PT0gVFJBTlNJVElPTl9FVkVOVFMuVVBEQVRFKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSB0aGlzLnRpbWUoKTtcbiAgICAgICAgICAgIHZhciB4MCA9IChjdXJyZW50VGltZSAtIHRoaXMuc3RhdGUuc3RhcnRUaW1lKSAvIHRoaXMuc3RhdGUuZHVyYXRpb247XG4gICAgICAgICAgICBlbmRQcm9wcy50cmFuc2l0aW9uRHVyYXRpb24gPSB0aGlzLnN0YXRlLmR1cmF0aW9uIC0gKGN1cnJlbnRUaW1lIC0gdGhpcy5zdGF0ZS5zdGFydFRpbWUpO1xuICAgICAgICAgICAgZW5kUHJvcHMudHJhbnNpdGlvbkVhc2luZyA9IGNyb3BFYXNpbmdGdW5jdGlvbih0aGlzLnN0YXRlLmVhc2luZywgeDApO1xuICAgICAgICAgICAgZW5kUHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvciA9IHN0YXJ0UHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlbmRQcm9wcy5vblRyYW5zaXRpb25TdGFydCgpO1xuXG4gICAgICAgIHRoaXMuX3RyaWdnZXJUcmFuc2l0aW9uKHN0YXJ0UHJvcHMsIGVuZFByb3BzKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbkluUHJvZ3Jlc3MoKSkge1xuICAgICAgICBjdXJyZW50UHJvcHMub25UcmFuc2l0aW9uSW50ZXJydXB0KCk7XG5cbiAgICAgICAgdGhpcy5fZW5kVHJhbnNpdGlvbigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1RyYW5zaXRpb25JblByb2dyZXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1RyYW5zaXRpb25JblByb2dyZXNzKCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaXNUcmFuc2l0aW9uRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaXNUcmFuc2l0aW9uRW5hYmxlZChwcm9wcykge1xuICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IHByb3BzLnRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yID0gcHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvcjtcbiAgICAgIHJldHVybiAodHJhbnNpdGlvbkR1cmF0aW9uID4gMCB8fCB0cmFuc2l0aW9uRHVyYXRpb24gPT09ICdhdXRvJykgJiYgQm9vbGVhbih0cmFuc2l0aW9uSW50ZXJwb2xhdG9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2lzVXBkYXRlRHVlVG9DdXJyZW50VHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaXNVcGRhdGVEdWVUb0N1cnJlbnRUcmFuc2l0aW9uKHByb3BzKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5wcm9wc0luVHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnRlcnBvbGF0b3IuYXJlUHJvcHNFcXVhbChwcm9wcywgdGhpcy5zdGF0ZS5wcm9wc0luVHJhbnNpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Nob3VsZElnbm9yZVZpZXdwb3J0Q2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zaG91bGRJZ25vcmVWaWV3cG9ydENoYW5nZShjdXJyZW50UHJvcHMsIG5leHRQcm9wcykge1xuICAgICAgaWYgKCFjdXJyZW50UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25JblByb2dyZXNzKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW50ZXJydXB0aW9uID09PSBUUkFOU0lUSU9OX0VWRU5UUy5JR05PUkUgfHwgdGhpcy5faXNVcGRhdGVEdWVUb0N1cnJlbnRUcmFuc2l0aW9uKG5leHRQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25FbmFibGVkKG5leHRQcm9wcykpIHtcbiAgICAgICAgcmV0dXJuIG5leHRQcm9wcy50cmFuc2l0aW9uSW50ZXJwb2xhdG9yLmFyZVByb3BzRXF1YWwoY3VycmVudFByb3BzLCBuZXh0UHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3RyaWdnZXJUcmFuc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF90cmlnZ2VyVHJhbnNpdGlvbihzdGFydFByb3BzLCBlbmRQcm9wcykge1xuICAgICAgYXNzZXJ0KHRoaXMuX2lzVHJhbnNpdGlvbkVuYWJsZWQoZW5kUHJvcHMpKTtcblxuICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRyYW5zaXRpb25JbnRlcnBvbGF0b3IgPSBlbmRQcm9wcy50cmFuc2l0aW9uSW50ZXJwb2xhdG9yO1xuICAgICAgdmFyIGR1cmF0aW9uID0gdHJhbnNpdGlvbkludGVycG9sYXRvci5nZXREdXJhdGlvbiA/IHRyYW5zaXRpb25JbnRlcnBvbGF0b3IuZ2V0RHVyYXRpb24oc3RhcnRQcm9wcywgZW5kUHJvcHMpIDogZW5kUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uO1xuXG4gICAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5pdGlhbFByb3BzID0gZW5kUHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvci5pbml0aWFsaXplUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMpO1xuICAgICAgdmFyIGludGVyYWN0aW9uU3RhdGUgPSB7XG4gICAgICAgIGluVHJhbnNpdGlvbjogdHJ1ZSxcbiAgICAgICAgaXNab29taW5nOiBzdGFydFByb3BzLnpvb20gIT09IGVuZFByb3BzLnpvb20sXG4gICAgICAgIGlzUGFubmluZzogc3RhcnRQcm9wcy5sb25naXR1ZGUgIT09IGVuZFByb3BzLmxvbmdpdHVkZSB8fCBzdGFydFByb3BzLmxhdGl0dWRlICE9PSBlbmRQcm9wcy5sYXRpdHVkZSxcbiAgICAgICAgaXNSb3RhdGluZzogc3RhcnRQcm9wcy5iZWFyaW5nICE9PSBlbmRQcm9wcy5iZWFyaW5nIHx8IHN0YXJ0UHJvcHMucGl0Y2ggIT09IGVuZFByb3BzLnBpdGNoXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICBlYXNpbmc6IGVuZFByb3BzLnRyYW5zaXRpb25FYXNpbmcsXG4gICAgICAgIGludGVycG9sYXRvcjogZW5kUHJvcHMudHJhbnNpdGlvbkludGVycG9sYXRvcixcbiAgICAgICAgaW50ZXJydXB0aW9uOiBlbmRQcm9wcy50cmFuc2l0aW9uSW50ZXJydXB0aW9uLFxuICAgICAgICBzdGFydFRpbWU6IHRoaXMudGltZSgpLFxuICAgICAgICBzdGFydFByb3BzOiBpbml0aWFsUHJvcHMuc3RhcnQsXG4gICAgICAgIGVuZFByb3BzOiBpbml0aWFsUHJvcHMuZW5kLFxuICAgICAgICBhbmltYXRpb246IG51bGwsXG4gICAgICAgIHByb3BzSW5UcmFuc2l0aW9uOiB7fVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fb25UcmFuc2l0aW9uRnJhbWUoKTtcblxuICAgICAgdGhpcy5vblN0YXRlQ2hhbmdlKGludGVyYWN0aW9uU3RhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZW5kVHJhbnNpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZW5kVHJhbnNpdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZSk7XG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vblN0YXRlQ2hhbmdlKHtcbiAgICAgICAgaW5UcmFuc2l0aW9uOiBmYWxzZSxcbiAgICAgICAgaXNab29taW5nOiBmYWxzZSxcbiAgICAgICAgaXNQYW5uaW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlVmlld3BvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVZpZXdwb3J0KCkge1xuICAgICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy50aW1lKCk7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgIHN0YXJ0VGltZSA9IF90aGlzJHN0YXRlLnN0YXJ0VGltZSxcbiAgICAgICAgICBkdXJhdGlvbiA9IF90aGlzJHN0YXRlLmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZyA9IF90aGlzJHN0YXRlLmVhc2luZyxcbiAgICAgICAgICBpbnRlcnBvbGF0b3IgPSBfdGhpcyRzdGF0ZS5pbnRlcnBvbGF0b3IsXG4gICAgICAgICAgc3RhcnRQcm9wcyA9IF90aGlzJHN0YXRlLnN0YXJ0UHJvcHMsXG4gICAgICAgICAgZW5kUHJvcHMgPSBfdGhpcyRzdGF0ZS5lbmRQcm9wcztcbiAgICAgIHZhciBzaG91bGRFbmQgPSBmYWxzZTtcbiAgICAgIHZhciB0ID0gKGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lKSAvIGR1cmF0aW9uO1xuXG4gICAgICBpZiAodCA+PSAxKSB7XG4gICAgICAgIHQgPSAxO1xuICAgICAgICBzaG91bGRFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0ID0gZWFzaW5nKHQpO1xuICAgICAgdmFyIHZpZXdwb3J0ID0gaW50ZXJwb2xhdG9yLmludGVycG9sYXRlUHJvcHMoc3RhcnRQcm9wcywgZW5kUHJvcHMsIHQpO1xuICAgICAgdmFyIG1hcFN0YXRlID0gbmV3IE1hcFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHZpZXdwb3J0KSk7XG4gICAgICB0aGlzLnN0YXRlLnByb3BzSW5UcmFuc2l0aW9uID0gbWFwU3RhdGUuZ2V0Vmlld3BvcnRQcm9wcygpO1xuICAgICAgdGhpcy5vblZpZXdwb3J0Q2hhbmdlKHRoaXMuc3RhdGUucHJvcHNJblRyYW5zaXRpb24sIHRoaXMucHJvcHMpO1xuXG4gICAgICBpZiAoc2hvdWxkRW5kKSB7XG4gICAgICAgIHRoaXMuX2VuZFRyYW5zaXRpb24oKTtcblxuICAgICAgICB0aGlzLnByb3BzLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2l0aW9uTWFuYWdlcjtcbn0oKTtcblxuX2RlZmluZVByb3BlcnR5KFRyYW5zaXRpb25NYW5hZ2VyLCBcImRlZmF1bHRQcm9wc1wiLCBERUZBVUxUX1BST1BTKTtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbk1hbmFnZXIgYXMgZGVmYXVsdCB9OyIsInZhciBJTlBVVF9TVEFSVCA9IDE7XG52YXIgSU5QVVRfTU9WRSA9IDI7XG52YXIgSU5QVVRfRU5EID0gNDtcbnZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gIG1vdXNlbW92ZTogSU5QVVRfTU9WRSxcbiAgbW91c2V1cDogSU5QVVRfRU5EXG59O1xuXG5mdW5jdGlvbiBzb21lKGFycmF5LCBwcmVkaWN0KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocHJlZGljdChhcnJheVtpXSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuaGFuY2VQb2ludGVyRXZlbnRJbnB1dChQb2ludGVyRXZlbnRJbnB1dCkge1xuICB2YXIgb2xkSGFuZGxlciA9IFBvaW50ZXJFdmVudElucHV0LnByb3RvdHlwZS5oYW5kbGVyO1xuXG4gIFBvaW50ZXJFdmVudElucHV0LnByb3RvdHlwZS5oYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihldikge1xuICAgIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG5cbiAgICBpZiAoZXYuYnV0dG9uID4gMCAmJiBldi50eXBlID09PSAncG9pbnRlcmRvd24nKSB7XG4gICAgICBpZiAoIXNvbWUoc3RvcmUsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLnBvaW50ZXJJZCA9PT0gZXYucG9pbnRlcklkO1xuICAgICAgfSkpIHtcbiAgICAgICAgc3RvcmUucHVzaChldik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb2xkSGFuZGxlci5jYWxsKHRoaXMsIGV2KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmhhbmNlTW91c2VJbnB1dChNb3VzZUlucHV0KSB7XG4gIE1vdXNlSW5wdXQucHJvdG90eXBlLmhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKGV2KSB7XG4gICAgdmFyIGV2ZW50VHlwZSA9IE1PVVNFX0lOUFVUX01BUFtldi50eXBlXTtcblxuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBldi5idXR0b24gPj0gMCkge1xuICAgICAgdGhpcy5wcmVzc2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCA9PT0gMCkge1xuICAgICAgZXZlbnRUeXBlID0gSU5QVVRfRU5EO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX0VORCkge1xuICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIGV2ZW50VHlwZSwge1xuICAgICAgcG9pbnRlcnM6IFtldl0sXG4gICAgICBjaGFuZ2VkUG9pbnRlcnM6IFtldl0sXG4gICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgIHNyY0V2ZW50OiBldlxuICAgIH0pO1xuICB9O1xufSIsImltcG9ydCBoYW1tZXJqcyBmcm9tICdoYW1tZXJqcyc7XG5pbXBvcnQgeyBlbmhhbmNlUG9pbnRlckV2ZW50SW5wdXQsIGVuaGFuY2VNb3VzZUlucHV0IH0gZnJvbSAnLi9oYW1tZXItb3ZlcnJpZGVzJztcbmVuaGFuY2VQb2ludGVyRXZlbnRJbnB1dChoYW1tZXJqcy5Qb2ludGVyRXZlbnRJbnB1dCk7XG5lbmhhbmNlTW91c2VJbnB1dChoYW1tZXJqcy5Nb3VzZUlucHV0KTtcbmV4cG9ydCB2YXIgTWFuYWdlciA9IGhhbW1lcmpzLk1hbmFnZXI7XG5leHBvcnQgZGVmYXVsdCBoYW1tZXJqczsiLCJpbXBvcnQgSGFtbWVyIGZyb20gJy4vdXRpbHMvaGFtbWVyJztcbmV4cG9ydCB2YXIgUkVDT0dOSVpFUlMgPSBIYW1tZXIgPyBbW0hhbW1lci5QYW4sIHtcbiAgZXZlbnQ6ICd0cmlwYW4nLFxuICBwb2ludGVyczogMyxcbiAgdGhyZXNob2xkOiAwLFxuICBlbmFibGU6IGZhbHNlXG59XSwgW0hhbW1lci5Sb3RhdGUsIHtcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuUGluY2gsIHtcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuU3dpcGUsIHtcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuUGFuLCB7XG4gIHRocmVzaG9sZDogMCxcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuUHJlc3MsIHtcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuVGFwLCB7XG4gIGV2ZW50OiAnZG91YmxldGFwJyxcbiAgdGFwczogMixcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuVGFwLCB7XG4gIGV2ZW50OiAnYW55dGFwJyxcbiAgZW5hYmxlOiBmYWxzZVxufV0sIFtIYW1tZXIuVGFwLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dXSA6IG51bGw7XG5leHBvcnQgdmFyIFJFQ09HTklaRVJfQ09NUEFUSUJMRV9NQVAgPSB7XG4gIHRyaXBhbjogWydyb3RhdGUnLCAncGluY2gnLCAncGFuJ10sXG4gIHJvdGF0ZTogWydwaW5jaCddLFxuICBwaW5jaDogWydwYW4nXSxcbiAgcGFuOiBbJ3ByZXNzJywgJ2RvdWJsZXRhcCcsICdhbnl0YXAnLCAndGFwJ10sXG4gIGRvdWJsZXRhcDogWydhbnl0YXAnXSxcbiAgYW55dGFwOiBbJ3RhcCddXG59O1xuZXhwb3J0IHZhciBSRUNPR05JWkVSX0ZBTExCQUNLX01BUCA9IHtcbiAgZG91YmxldGFwOiBbJ3RhcCddXG59O1xuZXhwb3J0IHZhciBCQVNJQ19FVkVOVF9BTElBU0VTID0ge1xuICBwb2ludGVyZG93bjogJ3BvaW50ZXJkb3duJyxcbiAgcG9pbnRlcm1vdmU6ICdwb2ludGVybW92ZScsXG4gIHBvaW50ZXJ1cDogJ3BvaW50ZXJ1cCcsXG4gIHRvdWNoc3RhcnQ6ICdwb2ludGVyZG93bicsXG4gIHRvdWNobW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgdG91Y2hlbmQ6ICdwb2ludGVydXAnLFxuICBtb3VzZWRvd246ICdwb2ludGVyZG93bicsXG4gIG1vdXNlbW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgbW91c2V1cDogJ3BvaW50ZXJ1cCdcbn07XG5leHBvcnQgdmFyIElOUFVUX0VWRU5UX1RZUEVTID0ge1xuICBLRVlfRVZFTlRTOiBbJ2tleWRvd24nLCAna2V5dXAnXSxcbiAgTU9VU0VfRVZFTlRTOiBbJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdtb3VzZW92ZXInLCAnbW91c2VvdXQnLCAnbW91c2VsZWF2ZSddLFxuICBXSEVFTF9FVkVOVFM6IFsnd2hlZWwnLCAnbW91c2V3aGVlbCddXG59O1xuZXhwb3J0IHZhciBFVkVOVF9SRUNPR05JWkVSX01BUCA9IHtcbiAgdGFwOiAndGFwJyxcbiAgYW55dGFwOiAnYW55dGFwJyxcbiAgZG91YmxldGFwOiAnZG91YmxldGFwJyxcbiAgcHJlc3M6ICdwcmVzcycsXG4gIHBpbmNoOiAncGluY2gnLFxuICBwaW5jaGluOiAncGluY2gnLFxuICBwaW5jaG91dDogJ3BpbmNoJyxcbiAgcGluY2hzdGFydDogJ3BpbmNoJyxcbiAgcGluY2htb3ZlOiAncGluY2gnLFxuICBwaW5jaGVuZDogJ3BpbmNoJyxcbiAgcGluY2hjYW5jZWw6ICdwaW5jaCcsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJvdGF0ZXN0YXJ0OiAncm90YXRlJyxcbiAgcm90YXRlbW92ZTogJ3JvdGF0ZScsXG4gIHJvdGF0ZWVuZDogJ3JvdGF0ZScsXG4gIHJvdGF0ZWNhbmNlbDogJ3JvdGF0ZScsXG4gIHRyaXBhbjogJ3RyaXBhbicsXG4gIHRyaXBhbnN0YXJ0OiAndHJpcGFuJyxcbiAgdHJpcGFubW92ZTogJ3RyaXBhbicsXG4gIHRyaXBhbnVwOiAndHJpcGFuJyxcbiAgdHJpcGFuZG93bjogJ3RyaXBhbicsXG4gIHRyaXBhbmxlZnQ6ICd0cmlwYW4nLFxuICB0cmlwYW5yaWdodDogJ3RyaXBhbicsXG4gIHRyaXBhbmVuZDogJ3RyaXBhbicsXG4gIHRyaXBhbmNhbmNlbDogJ3RyaXBhbicsXG4gIHBhbjogJ3BhbicsXG4gIHBhbnN0YXJ0OiAncGFuJyxcbiAgcGFubW92ZTogJ3BhbicsXG4gIHBhbnVwOiAncGFuJyxcbiAgcGFuZG93bjogJ3BhbicsXG4gIHBhbmxlZnQ6ICdwYW4nLFxuICBwYW5yaWdodDogJ3BhbicsXG4gIHBhbmVuZDogJ3BhbicsXG4gIHBhbmNhbmNlbDogJ3BhbicsXG4gIHN3aXBlOiAnc3dpcGUnLFxuICBzd2lwZWxlZnQ6ICdzd2lwZScsXG4gIHN3aXBlcmlnaHQ6ICdzd2lwZScsXG4gIHN3aXBldXA6ICdzd2lwZScsXG4gIHN3aXBlZG93bjogJ3N3aXBlJ1xufTtcbmV4cG9ydCB2YXIgR0VTVFVSRV9FVkVOVF9BTElBU0VTID0ge1xuICBjbGljazogJ3RhcCcsXG4gIGFueWNsaWNrOiAnYW55dGFwJyxcbiAgZGJsY2xpY2s6ICdkb3VibGV0YXAnLFxuICBtb3VzZWRvd246ICdwb2ludGVyZG93bicsXG4gIG1vdXNlbW92ZTogJ3BvaW50ZXJtb3ZlJyxcbiAgbW91c2V1cDogJ3BvaW50ZXJ1cCcsXG4gIG1vdXNlb3ZlcjogJ3BvaW50ZXJvdmVyJyxcbiAgbW91c2VvdXQ6ICdwb2ludGVyb3V0JyxcbiAgbW91c2VsZWF2ZTogJ3BvaW50ZXJsZWF2ZSdcbn07IiwiZXhwb3J0IHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ID8gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpIDogJyc7XG52YXIgd2luZG93XyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsO1xudmFyIGdsb2JhbF8gPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdztcbnZhciBkb2N1bWVudF8gPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB7fTtcbmV4cG9ydCB7IHdpbmRvd18gYXMgd2luZG93LCBnbG9iYWxfIGFzIGdsb2JhbCwgZG9jdW1lbnRfIGFzIGRvY3VtZW50IH07XG52YXIgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH07XG4gIHdpbmRvd18uYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB3aW5kb3dfLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbn0gY2F0Y2ggKGVycikge31cblxuZXhwb3J0IHsgcGFzc2l2ZVN1cHBvcnRlZCB9OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IElOUFVUX0VWRU5UX1RZUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHdpbmRvdywgdXNlckFnZW50LCBwYXNzaXZlU3VwcG9ydGVkIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYmFscyc7XG52YXIgZmlyZWZveCA9IHVzZXJBZ2VudC5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xudmFyIFdIRUVMX0VWRU5UUyA9IElOUFVUX0VWRU5UX1RZUEVTLldIRUVMX0VWRU5UUztcbnZhciBFVkVOVF9UWVBFID0gJ3doZWVsJztcbnZhciBXSEVFTF9ERUxUQV9NQUdJQ19TQ0FMRVIgPSA0LjAwMDI0NDE0MDYyNTtcbnZhciBXSEVFTF9ERUxUQV9QRVJfTElORSA9IDQwO1xudmFyIFNISUZUX01VTFRJUExJRVIgPSAwLjI1O1xuXG52YXIgV2hlZWxJbnB1dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdoZWVsSW5wdXQoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdoZWVsSW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmV2ZW50cyA9IFdIRUVMX0VWRU5UUy5jb25jYXQob3B0aW9ucy5ldmVudHMgfHwgW10pO1xuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzLmhhbmRsZUV2ZW50LCBwYXNzaXZlU3VwcG9ydGVkID8ge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSA6IGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhXaGVlbElucHV0LCBbe1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzMi5oYW5kbGVFdmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlRXZlbnRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50VHlwZShldmVudFR5cGUsIGVuYWJsZWQpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IEVWRU5UX1RZUEUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmVuYWJsZSA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWUgPSBldmVudC5kZWx0YVk7XG5cbiAgICAgIGlmICh3aW5kb3cuV2hlZWxFdmVudCkge1xuICAgICAgICBpZiAoZmlyZWZveCAmJiBldmVudC5kZWx0YU1vZGUgPT09IHdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTCkge1xuICAgICAgICAgIHZhbHVlIC89IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHtcbiAgICAgICAgICB2YWx1ZSAqPSBXSEVFTF9ERUxUQV9QRVJfTElORTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgd2hlZWxQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfTtcblxuICAgICAgaWYgKHZhbHVlICE9PSAwICYmIHZhbHVlICUgV0hFRUxfREVMVEFfTUFHSUNfU0NBTEVSID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSAvIFdIRUVMX0RFTFRBX01BR0lDX1NDQUxFUik7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICogU0hJRlRfTVVMVElQTElFUjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25XaGVlbChldmVudCwgLXZhbHVlLCB3aGVlbFBvc2l0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uV2hlZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uV2hlZWwoc3JjRXZlbnQsIGRlbHRhLCBwb3NpdGlvbikge1xuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIHR5cGU6IEVWRU5UX1RZUEUsXG4gICAgICAgIGNlbnRlcjogcG9zaXRpb24sXG4gICAgICAgIGRlbHRhOiBkZWx0YSxcbiAgICAgICAgc3JjRXZlbnQ6IHNyY0V2ZW50LFxuICAgICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgICAgdGFyZ2V0OiBzcmNFdmVudC50YXJnZXRcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXaGVlbElucHV0O1xufSgpO1xuXG5leHBvcnQgeyBXaGVlbElucHV0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBJTlBVVF9FVkVOVF9UWVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgTU9VU0VfRVZFTlRTID0gSU5QVVRfRVZFTlRfVFlQRVMuTU9VU0VfRVZFTlRTO1xudmFyIE1PVkVfRVZFTlRfVFlQRSA9ICdwb2ludGVybW92ZSc7XG52YXIgT1ZFUl9FVkVOVF9UWVBFID0gJ3BvaW50ZXJvdmVyJztcbnZhciBPVVRfRVZFTlRfVFlQRSA9ICdwb2ludGVyb3V0JztcbnZhciBMRUFWRV9FVkVOVF9UWVBFID0gJ3BvaW50ZXJsZWF2ZSc7XG5cbnZhciBNb3ZlSW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNb3ZlSW5wdXQoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vdmVJbnB1dCk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGVuYWJsZTogdHJ1ZVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMuZW5hYmxlTW92ZUV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZUxlYXZlRXZlbnQgPSB0aGlzLm9wdGlvbnMuZW5hYmxlO1xuICAgIHRoaXMuZW5hYmxlT3V0RXZlbnQgPSB0aGlzLm9wdGlvbnMuZW5hYmxlO1xuICAgIHRoaXMuZW5hYmxlT3ZlckV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmV2ZW50cyA9IE1PVVNFX0VWRU5UUy5jb25jYXQob3B0aW9ucy5ldmVudHMgfHwgW10pO1xuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzLmhhbmRsZUV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNb3ZlSW5wdXQsIFt7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgX3RoaXMyLmhhbmRsZUV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmFibGVFdmVudFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlRXZlbnRUeXBlKGV2ZW50VHlwZSwgZW5hYmxlZCkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gTU9WRV9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlTW92ZUV2ZW50ID0gZW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gT1ZFUl9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlT3ZlckV2ZW50ID0gZW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gT1VUX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgdGhpcy5lbmFibGVPdXRFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFR5cGUgPT09IExFQVZFX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgdGhpcy5lbmFibGVMZWF2ZUV2ZW50ID0gZW5hYmxlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlT3ZlckV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuaGFuZGxlT3V0RXZlbnQoZXZlbnQpO1xuICAgICAgdGhpcy5oYW5kbGVMZWF2ZUV2ZW50KGV2ZW50KTtcbiAgICAgIHRoaXMuaGFuZGxlTW92ZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlT3ZlckV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU92ZXJFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlT3ZlckV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbW91c2VvdmVyJykge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICAgICAgdHlwZTogT1ZFUl9FVkVOVF9UWVBFLFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZU91dEV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU91dEV2ZW50KGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5lbmFibGVPdXRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICAgICAgdHlwZTogT1VUX0VWRU5UX1RZUEUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlTGVhdmVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVMZWF2ZUV2ZW50KGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5lbmFibGVMZWF2ZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbW91c2VsZWF2ZScpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IExFQVZFX0VWRU5UX1RZUEUsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBwb2ludGVyVHlwZTogJ21vdXNlJyxcbiAgICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFuZGxlTW92ZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZU1vdmVFdmVudChldmVudCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlTW92ZUV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID49IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBNT1ZFX0VWRU5UX1RZUEUsXG4gICAgICAgICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTW92ZUlucHV0O1xufSgpO1xuXG5leHBvcnQgeyBNb3ZlSW5wdXQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IElOUFVUX0VWRU5UX1RZUEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbnZhciBLRVlfRVZFTlRTID0gSU5QVVRfRVZFTlRfVFlQRVMuS0VZX0VWRU5UUztcbnZhciBET1dOX0VWRU5UX1RZUEUgPSAna2V5ZG93bic7XG52YXIgVVBfRVZFTlRfVFlQRSA9ICdrZXl1cCc7XG5cbnZhciBLZXlJbnB1dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEtleUlucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBLZXlJbnB1dCk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGVuYWJsZTogdHJ1ZVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMuZW5hYmxlRG93bkV2ZW50ID0gdGhpcy5vcHRpb25zLmVuYWJsZTtcbiAgICB0aGlzLmVuYWJsZVVwRXZlbnQgPSB0aGlzLm9wdGlvbnMuZW5hYmxlO1xuICAgIHRoaXMuZXZlbnRzID0gS0VZX0VWRU5UUy5jb25jYXQob3B0aW9ucy5ldmVudHMgfHwgW10pO1xuICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgZWxlbWVudC50YWJJbmRleCA9IG9wdGlvbnMudGFiSW5kZXggfHwgMDtcbiAgICBlbGVtZW50LnN0eWxlLm91dGxpbmUgPSAnbm9uZSc7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIF90aGlzLmhhbmRsZUV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhLZXlJbnB1dCwgW3tcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBfdGhpczIuaGFuZGxlRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZUV2ZW50VHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVFdmVudFR5cGUoZXZlbnRUeXBlLCBlbmFibGVkKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBET1dOX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgdGhpcy5lbmFibGVEb3duRXZlbnQgPSBlbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBVUF9FVkVOVF9UWVBFKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlVXBFdmVudCA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuXG4gICAgICBpZiAodGFyZ2V0RWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnICYmIHRhcmdldEVsZW1lbnQudHlwZSA9PT0gJ3RleHQnIHx8IHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZURvd25FdmVudCAmJiBldmVudC50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgdHlwZTogRE9XTl9FVkVOVF9UWVBFLFxuICAgICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZW5hYmxlVXBFdmVudCAmJiBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICAgIHR5cGU6IFVQX0VWRU5UX1RZUEUsXG4gICAgICAgICAgc3JjRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBLZXlJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgS2V5SW5wdXQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIi9ob21lL3J1bm5lci93b3JrL2p1c3RpY2U0MC10b29sL2p1c3RpY2U0MC10b29sL2NsaWVudC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbnZhciBFVkVOVF9UWVBFID0gJ2NvbnRleHRtZW51JztcblxudmFyIENvbnRleHRtZW51SW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb250ZXh0bWVudUlucHV0KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnRleHRtZW51SW5wdXQpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb250ZXh0bWVudUlucHV0LCBbe1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlRXZlbnRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZUV2ZW50VHlwZShldmVudFR5cGUsIGVuYWJsZWQpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IEVWRU5UX1RZUEUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmVuYWJsZSA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgdHlwZTogRVZFTlRfVFlQRSxcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgICAgIH0sXG4gICAgICAgIHNyY0V2ZW50OiBldmVudCxcbiAgICAgICAgcG9pbnRlclR5cGU6ICdtb3VzZScsXG4gICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29udGV4dG1lbnVJbnB1dDtcbn0oKTtcblxuZXhwb3J0IHsgQ29udGV4dG1lbnVJbnB1dCBhcyBkZWZhdWx0IH07IiwidmFyIERPV05fRVZFTlQgPSAxO1xudmFyIE1PVkVfRVZFTlQgPSAyO1xudmFyIFVQX0VWRU5UID0gNDtcbnZhciBNT1VTRV9FVkVOVFMgPSB7XG4gIHBvaW50ZXJkb3duOiBET1dOX0VWRU5ULFxuICBwb2ludGVybW92ZTogTU9WRV9FVkVOVCxcbiAgcG9pbnRlcnVwOiBVUF9FVkVOVCxcbiAgbW91c2Vkb3duOiBET1dOX0VWRU5ULFxuICBtb3VzZW1vdmU6IE1PVkVfRVZFTlQsXG4gIG1vdXNldXA6IFVQX0VWRU5UXG59O1xudmFyIE1PVVNFX0VWRU5UX1dISUNIX0xFRlQgPSAxO1xudmFyIE1PVVNFX0VWRU5UX1dISUNIX01JRERMRSA9IDI7XG52YXIgTU9VU0VfRVZFTlRfV0hJQ0hfUklHSFQgPSAzO1xudmFyIE1PVVNFX0VWRU5UX0JVVFRPTl9MRUZUID0gMDtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05fTUlERExFID0gMTtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05fUklHSFQgPSAyO1xudmFyIE1PVVNFX0VWRU5UX0JVVFRPTlNfTEVGVF9NQVNLID0gMTtcbnZhciBNT1VTRV9FVkVOVF9CVVRUT05TX1JJR0hUX01BU0sgPSAyO1xudmFyIE1PVVNFX0VWRU5UX0JVVFRPTlNfTUlERExFX01BU0sgPSA0O1xuZXhwb3J0IGZ1bmN0aW9uIHdoaWNoQnV0dG9ucyhldmVudCkge1xuICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfRVZFTlRTW2V2ZW50LnNyY0V2ZW50LnR5cGVdO1xuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgX2V2ZW50JHNyY0V2ZW50ID0gZXZlbnQuc3JjRXZlbnQsXG4gICAgICBidXR0b25zID0gX2V2ZW50JHNyY0V2ZW50LmJ1dHRvbnMsXG4gICAgICBidXR0b24gPSBfZXZlbnQkc3JjRXZlbnQuYnV0dG9uLFxuICAgICAgd2hpY2ggPSBfZXZlbnQkc3JjRXZlbnQud2hpY2g7XG4gIHZhciBsZWZ0QnV0dG9uID0gZmFsc2U7XG4gIHZhciBtaWRkbGVCdXR0b24gPSBmYWxzZTtcbiAgdmFyIHJpZ2h0QnV0dG9uID0gZmFsc2U7XG5cbiAgaWYgKGV2ZW50VHlwZSA9PT0gVVBfRVZFTlQgfHwgZXZlbnRUeXBlID09PSBNT1ZFX0VWRU5UICYmICFOdW1iZXIuaXNGaW5pdGUoYnV0dG9ucykpIHtcbiAgICBsZWZ0QnV0dG9uID0gd2hpY2ggPT09IE1PVVNFX0VWRU5UX1dISUNIX0xFRlQ7XG4gICAgbWlkZGxlQnV0dG9uID0gd2hpY2ggPT09IE1PVVNFX0VWRU5UX1dISUNIX01JRERMRTtcbiAgICByaWdodEJ1dHRvbiA9IHdoaWNoID09PSBNT1VTRV9FVkVOVF9XSElDSF9SSUdIVDtcbiAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IE1PVkVfRVZFTlQpIHtcbiAgICBsZWZ0QnV0dG9uID0gQm9vbGVhbihidXR0b25zICYgTU9VU0VfRVZFTlRfQlVUVE9OU19MRUZUX01BU0spO1xuICAgIG1pZGRsZUJ1dHRvbiA9IEJvb2xlYW4oYnV0dG9ucyAmIE1PVVNFX0VWRU5UX0JVVFRPTlNfTUlERExFX01BU0spO1xuICAgIHJpZ2h0QnV0dG9uID0gQm9vbGVhbihidXR0b25zICYgTU9VU0VfRVZFTlRfQlVUVE9OU19SSUdIVF9NQVNLKTtcbiAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IERPV05fRVZFTlQpIHtcbiAgICBsZWZ0QnV0dG9uID0gYnV0dG9uID09PSBNT1VTRV9FVkVOVF9CVVRUT05fTEVGVDtcbiAgICBtaWRkbGVCdXR0b24gPSBidXR0b24gPT09IE1PVVNFX0VWRU5UX0JVVFRPTl9NSURETEU7XG4gICAgcmlnaHRCdXR0b24gPSBidXR0b24gPT09IE1PVVNFX0VWRU5UX0JVVFRPTl9SSUdIVDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGVmdEJ1dHRvbjogbGVmdEJ1dHRvbixcbiAgICBtaWRkbGVCdXR0b246IG1pZGRsZUJ1dHRvbixcbiAgICByaWdodEJ1dHRvbjogcmlnaHRCdXR0b25cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXRQb3NpdGlvbihldmVudCwgcm9vdEVsZW1lbnQpIHtcbiAgdmFyIHNyY0V2ZW50ID0gZXZlbnQuc3JjRXZlbnQ7XG5cbiAgaWYgKCFldmVudC5jZW50ZXIgJiYgIU51bWJlci5pc0Zpbml0ZShzcmNFdmVudC5jbGllbnRYKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNlbnRlciA9IGV2ZW50LmNlbnRlciB8fCB7XG4gICAgeDogc3JjRXZlbnQuY2xpZW50WCxcbiAgICB5OiBzcmNFdmVudC5jbGllbnRZXG4gIH07XG4gIHZhciByZWN0ID0gcm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByZWN0LndpZHRoIC8gcm9vdEVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJlY3QuaGVpZ2h0IC8gcm9vdEVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHZhciBvZmZzZXRDZW50ZXIgPSB7XG4gICAgeDogKGNlbnRlci54IC0gcmVjdC5sZWZ0IC0gcm9vdEVsZW1lbnQuY2xpZW50TGVmdCkgLyBzY2FsZVgsXG4gICAgeTogKGNlbnRlci55IC0gcmVjdC50b3AgLSByb290RWxlbWVudC5jbGllbnRUb3ApIC8gc2NhbGVZXG4gIH07XG4gIHJldHVybiB7XG4gICAgY2VudGVyOiBjZW50ZXIsXG4gICAgb2Zmc2V0Q2VudGVyOiBvZmZzZXRDZW50ZXJcbiAgfTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyB3aGljaEJ1dHRvbnMsIGdldE9mZnNldFBvc2l0aW9uIH0gZnJvbSAnLi9ldmVudC11dGlscyc7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBzcmNFbGVtZW50OiAncm9vdCcsXG4gIHByaW9yaXR5OiAwXG59O1xuXG52YXIgRXZlbnRSZWdpc3RyYXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFdmVudFJlZ2lzdHJhcihldmVudE1hbmFnZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRSZWdpc3RyYXIpO1xuXG4gICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFdmVudFJlZ2lzdHJhciwgW3tcbiAgICBrZXk6IFwiaXNFbXB0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLl9hY3RpdmU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQodHlwZSwgaGFuZGxlciwgb3B0cykge1xuICAgICAgdmFyIG9uY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICAgICAgdmFyIHBhc3NpdmUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZhbHNlO1xuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycyxcbiAgICAgICAgICBoYW5kbGVyc0J5RWxlbWVudCA9IHRoaXMuaGFuZGxlcnNCeUVsZW1lbnQ7XG5cbiAgICAgIGlmIChvcHRzICYmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcgfHwgb3B0cy5hZGRFdmVudExpc3RlbmVyKSkge1xuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgIHNyY0VsZW1lbnQ6IG9wdHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3B0cyA9IG9wdHMgPyBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdHMpIDogREVGQVVMVF9PUFRJT05TO1xuICAgICAgdmFyIGVudHJpZXMgPSBoYW5kbGVyc0J5RWxlbWVudC5nZXQob3B0cy5zcmNFbGVtZW50KTtcblxuICAgICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICAgIGVudHJpZXMgPSBbXTtcbiAgICAgICAgaGFuZGxlcnNCeUVsZW1lbnQuc2V0KG9wdHMuc3JjRWxlbWVudCwgZW50cmllcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgICAgc3JjRWxlbWVudDogb3B0cy5zcmNFbGVtZW50LFxuICAgICAgICBwcmlvcml0eTogb3B0cy5wcmlvcml0eVxuICAgICAgfTtcblxuICAgICAgaWYgKG9uY2UpIHtcbiAgICAgICAgZW50cnkub25jZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXNzaXZlKSB7XG4gICAgICAgIGVudHJ5LnBhc3NpdmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBoYW5kbGVycy5wdXNoKGVudHJ5KTtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2FjdGl2ZSB8fCAhZW50cnkucGFzc2l2ZTtcbiAgICAgIHZhciBpbnNlcnRQb3NpdGlvbiA9IGVudHJpZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGluc2VydFBvc2l0aW9uID49IDApIHtcbiAgICAgICAgaWYgKGVudHJpZXNbaW5zZXJ0UG9zaXRpb25dLnByaW9yaXR5ID49IGVudHJ5LnByaW9yaXR5KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbnNlcnRQb3NpdGlvbi0tO1xuICAgICAgfVxuXG4gICAgICBlbnRyaWVzLnNwbGljZShpbnNlcnRQb3NpdGlvbiArIDEsIDAsIGVudHJ5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSh0eXBlLCBoYW5kbGVyKSB7XG4gICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLFxuICAgICAgICAgIGhhbmRsZXJzQnlFbGVtZW50ID0gdGhpcy5oYW5kbGVyc0J5RWxlbWVudDtcblxuICAgICAgZm9yICh2YXIgaSA9IGhhbmRsZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGhhbmRsZXJzW2ldO1xuXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSB0eXBlICYmIGVudHJ5LmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgdmFyIGVudHJpZXMgPSBoYW5kbGVyc0J5RWxlbWVudC5nZXQoZW50cnkuc3JjRWxlbWVudCk7XG4gICAgICAgICAgZW50cmllcy5zcGxpY2UoZW50cmllcy5pbmRleE9mKGVudHJ5KSwgMSk7XG5cbiAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGhhbmRsZXJzQnlFbGVtZW50LmRlbGV0ZShlbnRyeS5zcmNFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fYWN0aXZlID0gaGFuZGxlcnMuc29tZShmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuICFlbnRyeS5wYXNzaXZlO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhbmRsZUV2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWpvbG5pckV2ZW50ID0gdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZlbnQpO1xuXG4gICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQuc3JjRXZlbnQudGFyZ2V0O1xuXG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gbWpvbG5pckV2ZW50LnJvb3RFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2VtaXQobWpvbG5pckV2ZW50LCB0YXJnZXQpO1xuXG4gICAgICAgIGlmIChtam9sbmlyRXZlbnQuaGFuZGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbWl0KG1qb2xuaXJFdmVudCwgJ3Jvb3QnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2VtaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2VtaXQoZXZlbnQsIHNyY0VsZW1lbnQpIHtcbiAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5oYW5kbGVyc0J5RWxlbWVudC5nZXQoc3JjRWxlbWVudCk7XG5cbiAgICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICAgIHZhciBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTtcblxuICAgICAgICB2YXIgc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgIGV2ZW50LmhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgICAgICAgZXZlbnQuaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgZW50cmllc1RvUmVtb3ZlID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbnRyaWVzJGkgPSBlbnRyaWVzW2ldLFxuICAgICAgICAgICAgICB0eXBlID0gX2VudHJpZXMkaS50eXBlLFxuICAgICAgICAgICAgICBoYW5kbGVyID0gX2VudHJpZXMkaS5oYW5kbGVyLFxuICAgICAgICAgICAgICBvbmNlID0gX2VudHJpZXMkaS5vbmNlO1xuICAgICAgICAgIGhhbmRsZXIoT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQsIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IHN0b3BQcm9wYWdhdGlvbixcbiAgICAgICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgaWYgKG9uY2UpIHtcbiAgICAgICAgICAgIGVudHJpZXNUb1JlbW92ZS5wdXNoKGVudHJpZXNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbnRyaWVzVG9SZW1vdmUubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbnRyaWVzVG9SZW1vdmUkX2kgPSBlbnRyaWVzVG9SZW1vdmVbX2ldLFxuICAgICAgICAgICAgICBfdHlwZSA9IF9lbnRyaWVzVG9SZW1vdmUkX2kudHlwZSxcbiAgICAgICAgICAgICAgX2hhbmRsZXIgPSBfZW50cmllc1RvUmVtb3ZlJF9pLmhhbmRsZXI7XG4gICAgICAgICAgdGhpcy5yZW1vdmUoX3R5cGUsIF9oYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfbm9ybWFsaXplRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX25vcm1hbGl6ZUV2ZW50KGV2ZW50KSB7XG4gICAgICB2YXIgcm9vdEVsZW1lbnQgPSB0aGlzLmV2ZW50TWFuYWdlci5lbGVtZW50O1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LCB3aGljaEJ1dHRvbnMoZXZlbnQpLCBnZXRPZmZzZXRQb3NpdGlvbihldmVudCwgcm9vdEVsZW1lbnQpLCB7XG4gICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxuICAgICAgICByb290RWxlbWVudDogcm9vdEVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFdmVudFJlZ2lzdHJhcjtcbn0oKTtcblxuZXhwb3J0IHsgRXZlbnRSZWdpc3RyYXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiL2hvbWUvcnVubmVyL3dvcmsvanVzdGljZTQwLXRvb2wvanVzdGljZTQwLXRvb2wvY2xpZW50L25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCIvaG9tZS9ydW5uZXIvd29yay9qdXN0aWNlNDAtdG9vbC9qdXN0aWNlNDAtdG9vbC9jbGllbnQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IHsgTWFuYWdlciB9IGZyb20gJy4vdXRpbHMvaGFtbWVyJztcbmltcG9ydCBXaGVlbElucHV0IGZyb20gJy4vaW5wdXRzL3doZWVsLWlucHV0JztcbmltcG9ydCBNb3ZlSW5wdXQgZnJvbSAnLi9pbnB1dHMvbW92ZS1pbnB1dCc7XG5pbXBvcnQgS2V5SW5wdXQgZnJvbSAnLi9pbnB1dHMva2V5LWlucHV0JztcbmltcG9ydCBDb250ZXh0bWVudUlucHV0IGZyb20gJy4vaW5wdXRzL2NvbnRleHRtZW51LWlucHV0JztcbmltcG9ydCBFdmVudFJlZ2lzdHJhciBmcm9tICcuL3V0aWxzL2V2ZW50LXJlZ2lzdHJhcic7XG5pbXBvcnQgeyBCQVNJQ19FVkVOVF9BTElBU0VTLCBFVkVOVF9SRUNPR05JWkVSX01BUCwgR0VTVFVSRV9FVkVOVF9BTElBU0VTLCBSRUNPR05JWkVSUywgUkVDT0dOSVpFUl9DT01QQVRJQkxFX01BUCwgUkVDT0dOSVpFUl9GQUxMQkFDS19NQVAgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBldmVudHM6IG51bGwsXG4gIHJlY29nbml6ZXJzOiBudWxsLFxuICByZWNvZ25pemVyT3B0aW9uczoge30sXG4gIE1hbmFnZXI6IE1hbmFnZXIsXG4gIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gIHRhYkluZGV4OiAwXG59O1xuXG52YXIgRXZlbnRNYW5hZ2VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKCkge1xuICAgIHZhciBlbGVtZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudE1hbmFnZXIpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKTtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vbkJhc2ljSW5wdXQgPSB0aGlzLl9vbkJhc2ljSW5wdXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbk90aGVyRXZlbnQgPSB0aGlzLl9vbk90aGVyRXZlbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldEVsZW1lbnQoZWxlbWVudCk7XG4gICAgdmFyIGV2ZW50cyA9IG9wdGlvbnMuZXZlbnRzO1xuXG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgdGhpcy5vbihldmVudHMpO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFdmVudE1hbmFnZXIsIFt7XG4gICAga2V5OiBcInNldEVsZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBNYW5hZ2VyQ2xhc3MgPSBvcHRpb25zLk1hbmFnZXI7XG4gICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgTWFuYWdlckNsYXNzKGVsZW1lbnQsIHtcbiAgICAgICAgdG91Y2hBY3Rpb246IG9wdGlvbnMudG91Y2hBY3Rpb24sXG4gICAgICAgIHJlY29nbml6ZXJzOiBvcHRpb25zLnJlY29nbml6ZXJzIHx8IFJFQ09HTklaRVJTXG4gICAgICB9KS5vbignaGFtbWVyLmlucHV0JywgdGhpcy5fb25CYXNpY0lucHV0KTtcblxuICAgICAgaWYgKCFvcHRpb25zLnJlY29nbml6ZXJzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKFJFQ09HTklaRVJfQ09NUEFUSUJMRV9NQVApLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICB2YXIgcmVjb2duaXplciA9IF90aGlzLm1hbmFnZXIuZ2V0KG5hbWUpO1xuXG4gICAgICAgICAgaWYgKHJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIFJFQ09HTklaRVJfQ09NUEFUSUJMRV9NQVBbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAob3RoZXJOYW1lKSB7XG4gICAgICAgICAgICAgIHJlY29nbml6ZXIucmVjb2duaXplV2l0aChvdGhlck5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcmVjb2duaXplck5hbWUgaW4gb3B0aW9ucy5yZWNvZ25pemVyT3B0aW9ucykge1xuICAgICAgICB2YXIgcmVjb2duaXplciA9IHRoaXMubWFuYWdlci5nZXQocmVjb2duaXplck5hbWUpO1xuXG4gICAgICAgIGlmIChyZWNvZ25pemVyKSB7XG4gICAgICAgICAgdmFyIHJlY29nbml6ZXJPcHRpb24gPSBvcHRpb25zLnJlY29nbml6ZXJPcHRpb25zW3JlY29nbml6ZXJOYW1lXTtcbiAgICAgICAgICBkZWxldGUgcmVjb2duaXplck9wdGlvbi5lbmFibGU7XG4gICAgICAgICAgcmVjb2duaXplci5zZXQocmVjb2duaXplck9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy53aGVlbElucHV0ID0gbmV3IFdoZWVsSW5wdXQoZWxlbWVudCwgdGhpcy5fb25PdGhlckV2ZW50LCB7XG4gICAgICAgIGVuYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tb3ZlSW5wdXQgPSBuZXcgTW92ZUlucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMua2V5SW5wdXQgPSBuZXcgS2V5SW5wdXQoZWxlbWVudCwgdGhpcy5fb25PdGhlckV2ZW50LCB7XG4gICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgIHRhYkluZGV4OiBvcHRpb25zLnRhYkluZGV4XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29udGV4dG1lbnVJbnB1dCA9IG5ldyBDb250ZXh0bWVudUlucHV0KGVsZW1lbnQsIHRoaXMuX29uT3RoZXJFdmVudCwge1xuICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMuZXZlbnRzKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc2xpY2VkVG9BcnJheShfc3RlcC52YWx1ZSwgMiksXG4gICAgICAgICAgICAgIGV2ZW50QWxpYXMgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyYXIgPSBfc3RlcCR2YWx1ZVsxXTtcblxuICAgICAgICAgIGlmICghZXZlbnRSZWdpc3RyYXIuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLl90b2dnbGVSZWNvZ25pemVyKGV2ZW50UmVnaXN0cmFyLnJlY29nbml6ZXJOYW1lLCB0cnVlKTtcblxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLm9uKGV2ZW50QWxpYXMsIGV2ZW50UmVnaXN0cmFyLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICB0aGlzLndoZWVsSW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdmVJbnB1dC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMua2V5SW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbnRleHRtZW51SW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1hbmFnZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLndoZWVsSW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLm1vdmVJbnB1dCA9IG51bGw7XG4gICAgICAgIHRoaXMua2V5SW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRleHRtZW51SW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudCwgaGFuZGxlciwgb3B0cykge1xuICAgICAgdGhpcy5fYWRkRXZlbnRIYW5kbGVyKGV2ZW50LCBoYW5kbGVyLCBvcHRzLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25jZShldmVudCwgaGFuZGxlciwgb3B0cykge1xuICAgICAgdGhpcy5fYWRkRXZlbnRIYW5kbGVyKGV2ZW50LCBoYW5kbGVyLCBvcHRzLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid2F0Y2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2F0Y2goZXZlbnQsIGhhbmRsZXIsIG9wdHMpIHtcbiAgICAgIHRoaXMuX2FkZEV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlciwgb3B0cywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvZmZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICB0aGlzLl9yZW1vdmVFdmVudEhhbmRsZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdG9nZ2xlUmVjb2duaXplclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdG9nZ2xlUmVjb2duaXplcihuYW1lLCBlbmFibGVkKSB7XG4gICAgICB2YXIgbWFuYWdlciA9IHRoaXMubWFuYWdlcjtcblxuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29nbml6ZXIgPSBtYW5hZ2VyLmdldChuYW1lKTtcblxuICAgICAgaWYgKHJlY29nbml6ZXIgJiYgcmVjb2duaXplci5vcHRpb25zLmVuYWJsZSAhPT0gZW5hYmxlZCkge1xuICAgICAgICByZWNvZ25pemVyLnNldCh7XG4gICAgICAgICAgZW5hYmxlOiBlbmFibGVkXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZmFsbGJhY2tSZWNvZ25pemVycyA9IFJFQ09HTklaRVJfRkFMTEJBQ0tfTUFQW25hbWVdO1xuXG4gICAgICAgIGlmIChmYWxsYmFja1JlY29nbml6ZXJzICYmICF0aGlzLm9wdGlvbnMucmVjb2duaXplcnMpIHtcbiAgICAgICAgICBmYWxsYmFja1JlY29nbml6ZXJzLmZvckVhY2goZnVuY3Rpb24gKG90aGVyTmFtZSkge1xuICAgICAgICAgICAgdmFyIG90aGVyUmVjb2duaXplciA9IG1hbmFnZXIuZ2V0KG90aGVyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5yZXF1aXJlRmFpbHVyZShuYW1lKTtcbiAgICAgICAgICAgICAgcmVjb2duaXplci5kcm9wUmVxdWlyZUZhaWx1cmUob3RoZXJOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG90aGVyUmVjb2duaXplci5kcm9wUmVxdWlyZUZhaWx1cmUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy53aGVlbElucHV0LmVuYWJsZUV2ZW50VHlwZShuYW1lLCBlbmFibGVkKTtcbiAgICAgIHRoaXMubW92ZUlucHV0LmVuYWJsZUV2ZW50VHlwZShuYW1lLCBlbmFibGVkKTtcbiAgICAgIHRoaXMua2V5SW5wdXQuZW5hYmxlRXZlbnRUeXBlKG5hbWUsIGVuYWJsZWQpO1xuICAgICAgdGhpcy5jb250ZXh0bWVudUlucHV0LmVuYWJsZUV2ZW50VHlwZShuYW1lLCBlbmFibGVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2FkZEV2ZW50SGFuZGxlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkRXZlbnRIYW5kbGVyKGV2ZW50LCBoYW5kbGVyLCBvcHRzLCBvbmNlLCBwYXNzaXZlKSB7XG4gICAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBvcHRzID0gaGFuZGxlcjtcblxuICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLl9hZGRFdmVudEhhbmRsZXIoZXZlbnROYW1lLCBldmVudFtldmVudE5hbWVdLCBvcHRzLCBvbmNlLCBwYXNzaXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXIsXG4gICAgICAgICAgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgICB2YXIgZXZlbnRBbGlhcyA9IEdFU1RVUkVfRVZFTlRfQUxJQVNFU1tldmVudF0gfHwgZXZlbnQ7XG4gICAgICB2YXIgZXZlbnRSZWdpc3RyYXIgPSBldmVudHMuZ2V0KGV2ZW50QWxpYXMpO1xuXG4gICAgICBpZiAoIWV2ZW50UmVnaXN0cmFyKSB7XG4gICAgICAgIGV2ZW50UmVnaXN0cmFyID0gbmV3IEV2ZW50UmVnaXN0cmFyKHRoaXMpO1xuICAgICAgICBldmVudHMuc2V0KGV2ZW50QWxpYXMsIGV2ZW50UmVnaXN0cmFyKTtcbiAgICAgICAgZXZlbnRSZWdpc3RyYXIucmVjb2duaXplck5hbWUgPSBFVkVOVF9SRUNPR05JWkVSX01BUFtldmVudEFsaWFzXSB8fCBldmVudEFsaWFzO1xuXG4gICAgICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICAgICAgbWFuYWdlci5vbihldmVudEFsaWFzLCBldmVudFJlZ2lzdHJhci5oYW5kbGVFdmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZXZlbnRSZWdpc3RyYXIuYWRkKGV2ZW50LCBoYW5kbGVyLCBvcHRzLCBvbmNlLCBwYXNzaXZlKTtcblxuICAgICAgaWYgKCFldmVudFJlZ2lzdHJhci5pc0VtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5fdG9nZ2xlUmVjb2duaXplcihldmVudFJlZ2lzdHJhci5yZWNvZ25pemVyTmFtZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9yZW1vdmVFdmVudEhhbmRsZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbW92ZUV2ZW50SGFuZGxlcihldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRbZXZlbnROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgICAgIHZhciBldmVudEFsaWFzID0gR0VTVFVSRV9FVkVOVF9BTElBU0VTW2V2ZW50XSB8fCBldmVudDtcbiAgICAgIHZhciBldmVudFJlZ2lzdHJhciA9IGV2ZW50cy5nZXQoZXZlbnRBbGlhcyk7XG5cbiAgICAgIGlmICghZXZlbnRSZWdpc3RyYXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudFJlZ2lzdHJhci5yZW1vdmUoZXZlbnQsIGhhbmRsZXIpO1xuXG4gICAgICBpZiAoZXZlbnRSZWdpc3RyYXIuaXNFbXB0eSgpKSB7XG4gICAgICAgIHZhciByZWNvZ25pemVyTmFtZSA9IGV2ZW50UmVnaXN0cmFyLnJlY29nbml6ZXJOYW1lO1xuICAgICAgICB2YXIgaXNSZWNvZ25pemVyVXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZXZlbnRzLnZhbHVlcygpKSxcbiAgICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZWggPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChlaC5yZWNvZ25pemVyTmFtZSA9PT0gcmVjb2duaXplck5hbWUgJiYgIWVoLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICBpc1JlY29nbml6ZXJVc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNSZWNvZ25pemVyVXNlZCkge1xuICAgICAgICAgIHRoaXMuX3RvZ2dsZVJlY29nbml6ZXIocmVjb2duaXplck5hbWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25CYXNpY0lucHV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkJhc2ljSW5wdXQoZXZlbnQpIHtcbiAgICAgIHZhciBzcmNFdmVudCA9IGV2ZW50LnNyY0V2ZW50O1xuICAgICAgdmFyIGFsaWFzID0gQkFTSUNfRVZFTlRfQUxJQVNFU1tzcmNFdmVudC50eXBlXTtcblxuICAgICAgaWYgKGFsaWFzKSB7XG4gICAgICAgIHRoaXMubWFuYWdlci5lbWl0KGFsaWFzLCBldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vbk90aGVyRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uT3RoZXJFdmVudChldmVudCkge1xuICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQoZXZlbnQudHlwZSwgZXZlbnQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFdmVudE1hbmFnZXI7XG59KCk7XG5cbmV4cG9ydCB7IEV2ZW50TWFuYWdlciBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCBNYXBTdGF0ZSBmcm9tICcuL21hcC1zdGF0ZSc7XG5pbXBvcnQgeyBMaW5lYXJJbnRlcnBvbGF0b3IgfSBmcm9tICcuL3RyYW5zaXRpb24nO1xuaW1wb3J0IFRyYW5zaXRpb25NYW5hZ2VyLCB7IFRSQU5TSVRJT05fRVZFTlRTIH0gZnJvbSAnLi90cmFuc2l0aW9uLW1hbmFnZXInO1xudmFyIE5PX1RSQU5TSVRJT05fUFJPUFMgPSB7XG4gIHRyYW5zaXRpb25EdXJhdGlvbjogMFxufTtcbmV4cG9ydCB2YXIgTElORUFSX1RSQU5TSVRJT05fUFJPUFMgPSB7XG4gIHRyYW5zaXRpb25EdXJhdGlvbjogMzAwLFxuICB0cmFuc2l0aW9uRWFzaW5nOiBmdW5jdGlvbiB0cmFuc2l0aW9uRWFzaW5nKHQpIHtcbiAgICByZXR1cm4gdDtcbiAgfSxcbiAgdHJhbnNpdGlvbkludGVycG9sYXRvcjogbmV3IExpbmVhckludGVycG9sYXRvcigpLFxuICB0cmFuc2l0aW9uSW50ZXJydXB0aW9uOiBUUkFOU0lUSU9OX0VWRU5UUy5CUkVBS1xufTtcbnZhciBERUZBVUxUX0lORVJUSUEgPSAzMDA7XG5cbnZhciBJTkVSVElBX0VBU0lORyA9IGZ1bmN0aW9uIElORVJUSUFfRUFTSU5HKHQpIHtcbiAgcmV0dXJuIDEgLSAoMSAtIHQpICogKDEgLSB0KTtcbn07XG5cbnZhciBFVkVOVF9UWVBFUyA9IHtcbiAgV0hFRUw6IFsnd2hlZWwnXSxcbiAgUEFOOiBbJ3BhbnN0YXJ0JywgJ3Bhbm1vdmUnLCAncGFuZW5kJ10sXG4gIFBJTkNIOiBbJ3BpbmNoc3RhcnQnLCAncGluY2htb3ZlJywgJ3BpbmNoZW5kJ10sXG4gIFRSSVBMRV9QQU46IFsndHJpcGFuc3RhcnQnLCAndHJpcGFubW92ZScsICd0cmlwYW5lbmQnXSxcbiAgRE9VQkxFX1RBUDogWydkb3VibGV0YXAnXSxcbiAgS0VZQk9BUkQ6IFsna2V5ZG93biddXG59O1xuXG52YXIgTWFwQ29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFwQ29udHJvbGxlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcENvbnRyb2xsZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZXZlbnRzXCIsIFtdKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNjcm9sbFpvb21cIiwgdHJ1ZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkcmFnUGFuXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZHJhZ1JvdGF0ZVwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRvdWJsZUNsaWNrWm9vbVwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRvdWNoWm9vbVwiLCB0cnVlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRvdWNoUm90YXRlXCIsIGZhbHNlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImtleWJvYXJkXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludGVyYWN0aW9uU3RhdGVcIiwge1xuICAgICAgaXNEcmFnZ2luZzogZmFsc2VcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9ldmVudHNcIiwge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX3NldEludGVyYWN0aW9uU3RhdGVcIiwgZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gICAgICBPYmplY3QuYXNzaWduKF90aGlzLl9pbnRlcmFjdGlvblN0YXRlLCBuZXdTdGF0ZSk7XG5cbiAgICAgIGlmIChfdGhpcy5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICAgIF90aGlzLm9uU3RhdGVDaGFuZ2UoX3RoaXMuX2ludGVyYWN0aW9uU3RhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiX29uVHJhbnNpdGlvblwiLCBmdW5jdGlvbiAobmV3Vmlld3BvcnQsIG9sZFZpZXdwb3J0KSB7XG4gICAgICBfdGhpcy5vblZpZXdwb3J0Q2hhbmdlKG5ld1ZpZXdwb3J0LCBfdGhpcy5faW50ZXJhY3Rpb25TdGF0ZSwgb2xkVmlld3BvcnQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl90cmFuc2l0aW9uTWFuYWdlciA9IG5ldyBUcmFuc2l0aW9uTWFuYWdlcih7XG4gICAgICBvblZpZXdwb3J0Q2hhbmdlOiB0aGlzLl9vblRyYW5zaXRpb24sXG4gICAgICBvblN0YXRlQ2hhbmdlOiB0aGlzLl9zZXRJbnRlcmFjdGlvblN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWFwQ29udHJvbGxlciwgW3tcbiAgICBrZXk6IFwiaGFuZGxlRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgIHRoaXMubWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKCk7XG4gICAgICB2YXIgZXZlbnRTdGFydEJsb2NrZWQgPSB0aGlzLl9ldmVudFN0YXJ0QmxvY2tlZDtcblxuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BhbnN0YXJ0JzpcbiAgICAgICAgICByZXR1cm4gZXZlbnRTdGFydEJsb2NrZWQgPyBmYWxzZSA6IHRoaXMuX29uUGFuU3RhcnQoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3Bhbm1vdmUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vblBhbihldmVudCk7XG5cbiAgICAgICAgY2FzZSAncGFuZW5kJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25QYW5FbmQoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3BpbmNoc3RhcnQnOlxuICAgICAgICAgIHJldHVybiBldmVudFN0YXJ0QmxvY2tlZCA/IGZhbHNlIDogdGhpcy5fb25QaW5jaFN0YXJ0KGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwaW5jaG1vdmUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vblBpbmNoKGV2ZW50KTtcblxuICAgICAgICBjYXNlICdwaW5jaGVuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uUGluY2hFbmQoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3RyaXBhbnN0YXJ0JzpcbiAgICAgICAgICByZXR1cm4gZXZlbnRTdGFydEJsb2NrZWQgPyBmYWxzZSA6IHRoaXMuX29uVHJpcGxlUGFuU3RhcnQoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ3RyaXBhbm1vdmUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vblRyaXBsZVBhbihldmVudCk7XG5cbiAgICAgICAgY2FzZSAndHJpcGFuZW5kJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5fb25UcmlwbGVQYW5FbmQoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ2RvdWJsZXRhcCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uRG91YmxlVGFwKGV2ZW50KTtcblxuICAgICAgICBjYXNlICd3aGVlbCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29uV2hlZWwoZXZlbnQpO1xuXG4gICAgICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgICAgIHJldHVybiB0aGlzLl9vbktleURvd24oZXZlbnQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDZW50ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2VudGVyKGV2ZW50KSB7XG4gICAgICB2YXIgX2V2ZW50JG9mZnNldENlbnRlciA9IGV2ZW50Lm9mZnNldENlbnRlcixcbiAgICAgICAgICB4ID0gX2V2ZW50JG9mZnNldENlbnRlci54LFxuICAgICAgICAgIHkgPSBfZXZlbnQkb2Zmc2V0Q2VudGVyLnk7XG4gICAgICByZXR1cm4gW3gsIHldO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Z1bmN0aW9uS2V5UHJlc3NlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0Z1bmN0aW9uS2V5UHJlc3NlZChldmVudCkge1xuICAgICAgdmFyIHNyY0V2ZW50ID0gZXZlbnQuc3JjRXZlbnQ7XG4gICAgICByZXR1cm4gQm9vbGVhbihzcmNFdmVudC5tZXRhS2V5IHx8IHNyY0V2ZW50LmFsdEtleSB8fCBzcmNFdmVudC5jdHJsS2V5IHx8IHNyY0V2ZW50LnNoaWZ0S2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmxvY2tFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmxvY2tFdmVudHModGltZW91dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMyLl9ldmVudFN0YXJ0QmxvY2tlZCA9PT0gdGltZXIpIHtcbiAgICAgICAgICBfdGhpczIuX2V2ZW50U3RhcnRCbG9ja2VkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG4gICAgICB0aGlzLl9ldmVudFN0YXJ0QmxvY2tlZCA9IHRpbWVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVWaWV3cG9ydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgZXh0cmFQcm9wcywgaW50ZXJhY3Rpb25TdGF0ZSkge1xuICAgICAgdmFyIG9sZFZpZXdwb3J0ID0gdGhpcy5tYXBTdGF0ZSBpbnN0YW5jZW9mIE1hcFN0YXRlID8gdGhpcy5tYXBTdGF0ZS5nZXRWaWV3cG9ydFByb3BzKCkgOiB0aGlzLm1hcFN0YXRlO1xuXG4gICAgICB2YXIgbmV3Vmlld3BvcnQgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG5ld01hcFN0YXRlLmdldFZpZXdwb3J0UHJvcHMoKSksIGV4dHJhUHJvcHMpO1xuXG4gICAgICB2YXIgdmlld1N0YXRlQ2hhbmdlZCA9IE9iamVjdC5rZXlzKG5ld1ZpZXdwb3J0KS5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIG9sZFZpZXdwb3J0W2tleV0gIT09IG5ld1ZpZXdwb3J0W2tleV07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3N0YXRlID0gbmV3TWFwU3RhdGUuZ2V0U3RhdGUoKTtcblxuICAgICAgdGhpcy5fc2V0SW50ZXJhY3Rpb25TdGF0ZShpbnRlcmFjdGlvblN0YXRlKTtcblxuICAgICAgaWYgKHZpZXdTdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5vblZpZXdwb3J0Q2hhbmdlKG5ld1ZpZXdwb3J0LCB0aGlzLl9pbnRlcmFjdGlvblN0YXRlLCBvbGRWaWV3cG9ydCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1hcFN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hcFN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgcmV0dXJuIG5ldyBNYXBTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5tYXBTdGF0ZVByb3BzKSwgdGhpcy5fc3RhdGUpLCBvdmVycmlkZXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNEcmFnZ2luZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0RyYWdnaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uU3RhdGUuaXNEcmFnZ2luZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0T3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgIHZhciBvblZpZXdwb3J0Q2hhbmdlID0gb3B0aW9ucy5vblZpZXdwb3J0Q2hhbmdlLFxuICAgICAgICAgIG9uU3RhdGVDaGFuZ2UgPSBvcHRpb25zLm9uU3RhdGVDaGFuZ2UsXG4gICAgICAgICAgX29wdGlvbnMkZXZlbnRNYW5hZ2VyID0gb3B0aW9ucy5ldmVudE1hbmFnZXIsXG4gICAgICAgICAgZXZlbnRNYW5hZ2VyID0gX29wdGlvbnMkZXZlbnRNYW5hZ2VyID09PSB2b2lkIDAgPyB0aGlzLmV2ZW50TWFuYWdlciA6IF9vcHRpb25zJGV2ZW50TWFuYWdlcixcbiAgICAgICAgICBfb3B0aW9ucyRpc0ludGVyYWN0aXYgPSBvcHRpb25zLmlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgaXNJbnRlcmFjdGl2ZSA9IF9vcHRpb25zJGlzSW50ZXJhY3RpdiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGlzSW50ZXJhY3RpdixcbiAgICAgICAgICBfb3B0aW9ucyRzY3JvbGxab29tID0gb3B0aW9ucy5zY3JvbGxab29tLFxuICAgICAgICAgIHNjcm9sbFpvb20gPSBfb3B0aW9ucyRzY3JvbGxab29tID09PSB2b2lkIDAgPyB0aGlzLnNjcm9sbFpvb20gOiBfb3B0aW9ucyRzY3JvbGxab29tLFxuICAgICAgICAgIF9vcHRpb25zJGRyYWdQYW4gPSBvcHRpb25zLmRyYWdQYW4sXG4gICAgICAgICAgZHJhZ1BhbiA9IF9vcHRpb25zJGRyYWdQYW4gPT09IHZvaWQgMCA/IHRoaXMuZHJhZ1BhbiA6IF9vcHRpb25zJGRyYWdQYW4sXG4gICAgICAgICAgX29wdGlvbnMkZHJhZ1JvdGF0ZSA9IG9wdGlvbnMuZHJhZ1JvdGF0ZSxcbiAgICAgICAgICBkcmFnUm90YXRlID0gX29wdGlvbnMkZHJhZ1JvdGF0ZSA9PT0gdm9pZCAwID8gdGhpcy5kcmFnUm90YXRlIDogX29wdGlvbnMkZHJhZ1JvdGF0ZSxcbiAgICAgICAgICBfb3B0aW9ucyRkb3VibGVDbGlja1ogPSBvcHRpb25zLmRvdWJsZUNsaWNrWm9vbSxcbiAgICAgICAgICBkb3VibGVDbGlja1pvb20gPSBfb3B0aW9ucyRkb3VibGVDbGlja1ogPT09IHZvaWQgMCA/IHRoaXMuZG91YmxlQ2xpY2tab29tIDogX29wdGlvbnMkZG91YmxlQ2xpY2taLFxuICAgICAgICAgIF9vcHRpb25zJHRvdWNoWm9vbSA9IG9wdGlvbnMudG91Y2hab29tLFxuICAgICAgICAgIHRvdWNoWm9vbSA9IF9vcHRpb25zJHRvdWNoWm9vbSA9PT0gdm9pZCAwID8gdGhpcy50b3VjaFpvb20gOiBfb3B0aW9ucyR0b3VjaFpvb20sXG4gICAgICAgICAgX29wdGlvbnMkdG91Y2hSb3RhdGUgPSBvcHRpb25zLnRvdWNoUm90YXRlLFxuICAgICAgICAgIHRvdWNoUm90YXRlID0gX29wdGlvbnMkdG91Y2hSb3RhdGUgPT09IHZvaWQgMCA/IHRoaXMudG91Y2hSb3RhdGUgOiBfb3B0aW9ucyR0b3VjaFJvdGF0ZSxcbiAgICAgICAgICBfb3B0aW9ucyRrZXlib2FyZCA9IG9wdGlvbnMua2V5Ym9hcmQsXG4gICAgICAgICAga2V5Ym9hcmQgPSBfb3B0aW9ucyRrZXlib2FyZCA9PT0gdm9pZCAwID8gdGhpcy5rZXlib2FyZCA6IF9vcHRpb25zJGtleWJvYXJkO1xuICAgICAgdGhpcy5vblZpZXdwb3J0Q2hhbmdlID0gb25WaWV3cG9ydENoYW5nZTtcbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSA9IG9uU3RhdGVDaGFuZ2U7XG4gICAgICB2YXIgcHJldk9wdGlvbnMgPSB0aGlzLm1hcFN0YXRlUHJvcHMgfHwge307XG4gICAgICB2YXIgZGltZW5zaW9uQ2hhbmdlZCA9IHByZXZPcHRpb25zLmhlaWdodCAhPT0gb3B0aW9ucy5oZWlnaHQgfHwgcHJldk9wdGlvbnMud2lkdGggIT09IG9wdGlvbnMud2lkdGg7XG4gICAgICB0aGlzLm1hcFN0YXRlUHJvcHMgPSBvcHRpb25zO1xuXG4gICAgICBpZiAoZGltZW5zaW9uQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLm1hcFN0YXRlID0gcHJldk9wdGlvbnM7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3IE1hcFN0YXRlKG9wdGlvbnMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJhbnNpdGlvbk1hbmFnZXIucHJvY2Vzc1ZpZXdwb3J0Q2hhbmdlKG9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXIgIT09IGV2ZW50TWFuYWdlcikge1xuICAgICAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGV2ZW50TWFuYWdlcjtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKHRoaXMuZXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b2dnbGVFdmVudHMoRVZFTlRfVFlQRVMuV0hFRUwsIGlzSW50ZXJhY3RpdmUgJiYgQm9vbGVhbihzY3JvbGxab29tKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5QQU4sIGlzSW50ZXJhY3RpdmUgJiYgQm9vbGVhbihkcmFnUGFuIHx8IGRyYWdSb3RhdGUpKTtcbiAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKEVWRU5UX1RZUEVTLlBJTkNILCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4odG91Y2hab29tIHx8IHRvdWNoUm90YXRlKSk7XG4gICAgICB0aGlzLnRvZ2dsZUV2ZW50cyhFVkVOVF9UWVBFUy5UUklQTEVfUEFOLCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4odG91Y2hSb3RhdGUpKTtcbiAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKEVWRU5UX1RZUEVTLkRPVUJMRV9UQVAsIGlzSW50ZXJhY3RpdmUgJiYgQm9vbGVhbihkb3VibGVDbGlja1pvb20pKTtcbiAgICAgIHRoaXMudG9nZ2xlRXZlbnRzKEVWRU5UX1RZUEVTLktFWUJPQVJELCBpc0ludGVyYWN0aXZlICYmIEJvb2xlYW4oa2V5Ym9hcmQpKTtcbiAgICAgIHRoaXMuc2Nyb2xsWm9vbSA9IHNjcm9sbFpvb207XG4gICAgICB0aGlzLmRyYWdQYW4gPSBkcmFnUGFuO1xuICAgICAgdGhpcy5kcmFnUm90YXRlID0gZHJhZ1JvdGF0ZTtcbiAgICAgIHRoaXMuZG91YmxlQ2xpY2tab29tID0gZG91YmxlQ2xpY2tab29tO1xuICAgICAgdGhpcy50b3VjaFpvb20gPSB0b3VjaFpvb207XG4gICAgICB0aGlzLnRvdWNoUm90YXRlID0gdG91Y2hSb3RhdGU7XG4gICAgICB0aGlzLmtleWJvYXJkID0ga2V5Ym9hcmQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvZ2dsZUV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVFdmVudHMoZXZlbnROYW1lcywgZW5hYmxlZCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmV2ZW50TWFuYWdlcikge1xuICAgICAgICBldmVudE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgIGlmIChfdGhpczMuX2V2ZW50c1tldmVudE5hbWVdICE9PSBlbmFibGVkKSB7XG4gICAgICAgICAgICBfdGhpczMuX2V2ZW50c1tldmVudE5hbWVdID0gZW5hYmxlZDtcblxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMzLmV2ZW50TWFuYWdlci5vbihldmVudE5hbWUsIF90aGlzMy5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfdGhpczMuZXZlbnRNYW5hZ2VyLm9mZihldmVudE5hbWUsIF90aGlzMy5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuU3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuU3RhcnQoZXZlbnQpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB0aGlzLl9wYW5Sb3RhdGUgPSB0aGlzLmlzRnVuY3Rpb25LZXlQcmVzc2VkKGV2ZW50KSB8fCBldmVudC5yaWdodEJ1dHRvbjtcbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMuX3BhblJvdGF0ZSA/IHRoaXMubWFwU3RhdGUucm90YXRlU3RhcnQoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSkgOiB0aGlzLm1hcFN0YXRlLnBhblN0YXJ0KHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTk9fVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICBpc0RyYWdnaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGFuKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3BhblJvdGF0ZSA/IHRoaXMuX29uUGFuUm90YXRlKGV2ZW50KSA6IHRoaXMuX29uUGFuTW92ZShldmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhbkVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5FbmQoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcGFuUm90YXRlID8gdGhpcy5fb25QYW5Sb3RhdGVFbmQoZXZlbnQpIDogdGhpcy5fb25QYW5Nb3ZlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuTW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Nb3ZlKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuZHJhZ1Bhbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNQYW5uaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QYW5Nb3ZlRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhbk1vdmVFbmQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmRyYWdQYW4pIHtcbiAgICAgICAgdmFyIF90aGlzJGRyYWdQYW4kaW5lcnRpYSA9IHRoaXMuZHJhZ1Bhbi5pbmVydGlhLFxuICAgICAgICAgICAgaW5lcnRpYSA9IF90aGlzJGRyYWdQYW4kaW5lcnRpYSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTkVSVElBIDogX3RoaXMkZHJhZ1BhbiRpbmVydGlhO1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIGV2ZW50LnZlbG9jaXR5KSB7XG4gICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB2YXIgZW5kUG9zID0gW3Bvc1swXSArIGV2ZW50LnZlbG9jaXR5WCAqIGluZXJ0aWEgLyAyLCBwb3NbMV0gKyBldmVudC52ZWxvY2l0eVkgKiBpbmVydGlhIC8gMl07XG4gICAgICAgICAgdmFyIG5ld0NvbnRyb2xsZXJTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgIHBvczogZW5kUG9zXG4gICAgICAgICAgfSkucGFuRW5kKCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdDb250cm9sbGVyU3RhdGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1Bhbm5pbmc6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbkVuZCgpO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgbnVsbCwge1xuICAgICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgaXNQYW5uaW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGFuUm90YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBhblJvdGF0ZShldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmRyYWdSb3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGUoe1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBOT19UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIGlzUm90YXRpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBhblJvdGF0ZUVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25QYW5Sb3RhdGVFbmQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmRyYWdSb3RhdGUpIHtcbiAgICAgICAgdmFyIF90aGlzJGRyYWdSb3RhdGUkaW5lciA9IHRoaXMuZHJhZ1JvdGF0ZS5pbmVydGlhLFxuICAgICAgICAgICAgaW5lcnRpYSA9IF90aGlzJGRyYWdSb3RhdGUkaW5lciA9PT0gdm9pZCAwID8gREVGQVVMVF9JTkVSVElBIDogX3RoaXMkZHJhZ1JvdGF0ZSRpbmVyO1xuXG4gICAgICAgIGlmIChpbmVydGlhICYmIGV2ZW50LnZlbG9jaXR5KSB7XG4gICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB2YXIgZW5kUG9zID0gW3Bvc1swXSArIGV2ZW50LnZlbG9jaXR5WCAqIGluZXJ0aWEgLyAyLCBwb3NbMV0gKyBldmVudC52ZWxvY2l0eVkgKiBpbmVydGlhIC8gMl07XG4gICAgICAgICAgdmFyIG5ld0NvbnRyb2xsZXJTdGF0ZSA9IHRoaXMubWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgICAgIHBvczogZW5kUG9zXG4gICAgICAgICAgfSkucm90YXRlRW5kKCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdDb250cm9sbGVyU3RhdGUsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgTElORUFSX1RSQU5TSVRJT05fUFJPUFMpLCB7fSwge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBpbmVydGlhLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVhc2luZzogSU5FUlRJQV9FQVNJTkdcbiAgICAgICAgICB9KSwge1xuICAgICAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBpc1JvdGF0aW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW5FbmQoKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25XaGVlbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25XaGVlbChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLnNjcm9sbFpvb20pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkc2Nyb2xsWm9vbSA9IHRoaXMuc2Nyb2xsWm9vbSxcbiAgICAgICAgICBfdGhpcyRzY3JvbGxab29tJHNwZWUgPSBfdGhpcyRzY3JvbGxab29tLnNwZWVkLFxuICAgICAgICAgIHNwZWVkID0gX3RoaXMkc2Nyb2xsWm9vbSRzcGVlID09PSB2b2lkIDAgPyAwLjAxIDogX3RoaXMkc2Nyb2xsWm9vbSRzcGVlLFxuICAgICAgICAgIF90aGlzJHNjcm9sbFpvb20kc21vbyA9IF90aGlzJHNjcm9sbFpvb20uc21vb3RoLFxuICAgICAgICAgIHNtb290aCA9IF90aGlzJHNjcm9sbFpvb20kc21vbyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfdGhpcyRzY3JvbGxab29tJHNtb287XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHZhciBkZWx0YSA9IGV2ZW50LmRlbHRhO1xuICAgICAgdmFyIHNjYWxlID0gMiAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKGRlbHRhICogc3BlZWQpKSk7XG5cbiAgICAgIGlmIChkZWx0YSA8IDAgJiYgc2NhbGUgIT09IDApIHtcbiAgICAgICAgc2NhbGUgPSAxIC8gc2NhbGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUuem9vbSh7XG4gICAgICAgIHBvczogcG9zLFxuICAgICAgICBzY2FsZTogc2NhbGVcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyksIHt9LCB7XG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3Ioe1xuICAgICAgICAgIGFyb3VuZDogcG9zXG4gICAgICAgIH0pLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IHNtb290aCA/IDI1MCA6IDFcbiAgICAgIH0pLCB7XG4gICAgICAgIGlzUGFubmluZzogdHJ1ZSxcbiAgICAgICAgaXNab29taW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25QaW5jaFN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBpbmNoU3RhcnQoZXZlbnQpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnpvb21TdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KS5yb3RhdGVTdGFydCh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3N0YXJ0UGluY2hSb3RhdGlvbiA9IGV2ZW50LnJvdGF0aW9uO1xuICAgICAgdGhpcy5fbGFzdFBpbmNoRXZlbnQgPSBldmVudDtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uUGluY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uUGluY2goZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMudG91Y2hab29tICYmICF0aGlzLnRvdWNoUm90YXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZTtcblxuICAgICAgaWYgKHRoaXMudG91Y2hab29tKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IGV2ZW50LnNjYWxlO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgICBuZXdNYXBTdGF0ZSA9IG5ld01hcFN0YXRlLnpvb20oe1xuICAgICAgICAgIHBvczogcG9zLFxuICAgICAgICAgIHNjYWxlOiBzY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG91Y2hSb3RhdGUpIHtcbiAgICAgICAgdmFyIHJvdGF0aW9uID0gZXZlbnQucm90YXRpb247XG4gICAgICAgIG5ld01hcFN0YXRlID0gbmV3TWFwU3RhdGUucm90YXRlKHtcbiAgICAgICAgICBkZWx0YUFuZ2xlWDogdGhpcy5fc3RhcnRQaW5jaFJvdGF0aW9uIC0gcm90YXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogdHJ1ZSxcbiAgICAgICAgaXNQYW5uaW5nOiBCb29sZWFuKHRoaXMudG91Y2hab29tKSxcbiAgICAgICAgaXNab29taW5nOiBCb29sZWFuKHRoaXMudG91Y2hab29tKSxcbiAgICAgICAgaXNSb3RhdGluZzogQm9vbGVhbih0aGlzLnRvdWNoUm90YXRlKVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9sYXN0UGluY2hFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblBpbmNoRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblBpbmNoRW5kKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG91Y2hab29tKSB7XG4gICAgICAgIHZhciBfdGhpcyR0b3VjaFpvb20kaW5lcnQgPSB0aGlzLnRvdWNoWm9vbS5pbmVydGlhLFxuICAgICAgICAgICAgaW5lcnRpYSA9IF90aGlzJHRvdWNoWm9vbSRpbmVydCA9PT0gdm9pZCAwID8gREVGQVVMVF9JTkVSVElBIDogX3RoaXMkdG91Y2hab29tJGluZXJ0O1xuICAgICAgICB2YXIgX2xhc3RQaW5jaEV2ZW50ID0gdGhpcy5fbGFzdFBpbmNoRXZlbnQ7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEgJiYgX2xhc3RQaW5jaEV2ZW50ICYmIGV2ZW50LnNjYWxlICE9PSBfbGFzdFBpbmNoRXZlbnQuc2NhbGUpIHtcbiAgICAgICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuXG4gICAgICAgICAgdmFyIF9uZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucm90YXRlRW5kKCk7XG5cbiAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nMihldmVudC5zY2FsZSk7XG5cbiAgICAgICAgICB2YXIgdmVsb2NpdHlaID0gKHogLSBNYXRoLmxvZzIoX2xhc3RQaW5jaEV2ZW50LnNjYWxlKSkgLyAoZXZlbnQuZGVsdGFUaW1lIC0gX2xhc3RQaW5jaEV2ZW50LmRlbHRhVGltZSk7XG5cbiAgICAgICAgICB2YXIgZW5kU2NhbGUgPSBNYXRoLnBvdygyLCB6ICsgdmVsb2NpdHlaICogaW5lcnRpYSAvIDIpO1xuICAgICAgICAgIF9uZXdNYXBTdGF0ZSA9IF9uZXdNYXBTdGF0ZS56b29tKHtcbiAgICAgICAgICAgIHBvczogcG9zLFxuICAgICAgICAgICAgc2NhbGU6IGVuZFNjYWxlXG4gICAgICAgICAgfSkuem9vbUVuZCgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQoX25ld01hcFN0YXRlLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTKSwge30sIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3Ioe1xuICAgICAgICAgICAgICBhcm91bmQ6IHBvc1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGluZXJ0aWEsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRWFzaW5nOiBJTkVSVElBX0VBU0lOR1xuICAgICAgICAgIH0pLCB7XG4gICAgICAgICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGFubmluZzogQm9vbGVhbih0aGlzLnRvdWNoWm9vbSksXG4gICAgICAgICAgICBpc1pvb21pbmc6IEJvb2xlYW4odGhpcy50b3VjaFpvb20pLFxuICAgICAgICAgICAgaXNSb3RhdGluZzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmJsb2NrRXZlbnRzKGluZXJ0aWEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUuem9vbUVuZCgpLnJvdGF0ZUVuZCgpO1xuICAgICAgdGhpcy5fc3RhdGUuc3RhcnRQaW5jaFJvdGF0aW9uID0gMDtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIG51bGwsIHtcbiAgICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIGlzUGFubmluZzogZmFsc2UsXG4gICAgICAgIGlzWm9vbWluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3N0YXJ0UGluY2hSb3RhdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLl9sYXN0UGluY2hFdmVudCA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uVHJpcGxlUGFuU3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uVHJpcGxlUGFuU3RhcnQoZXZlbnQpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmdldENlbnRlcihldmVudCk7XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZVN0YXJ0KHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgTk9fVFJBTlNJVElPTl9QUk9QUywge1xuICAgICAgICBpc0RyYWdnaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25UcmlwbGVQYW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uVHJpcGxlUGFuKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRvdWNoUm90YXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgIHBvc1swXSAtPSBldmVudC5kZWx0YVg7XG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZSh7XG4gICAgICAgIHBvczogcG9zXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE5PX1RSQU5TSVRJT05fUFJPUFMsIHtcbiAgICAgICAgaXNSb3RhdGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uVHJpcGxlUGFuRW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblRyaXBsZVBhbkVuZChldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRvdWNoUm90YXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyR0b3VjaFJvdGF0ZSRpbmUgPSB0aGlzLnRvdWNoUm90YXRlLmluZXJ0aWEsXG4gICAgICAgICAgICBpbmVydGlhID0gX3RoaXMkdG91Y2hSb3RhdGUkaW5lID09PSB2b2lkIDAgPyBERUZBVUxUX0lORVJUSUEgOiBfdGhpcyR0b3VjaFJvdGF0ZSRpbmU7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEgJiYgZXZlbnQudmVsb2NpdHlZKSB7XG4gICAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0Q2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB2YXIgZW5kUG9zID0gW3Bvc1swXSwgcG9zWzFdICs9IGV2ZW50LnZlbG9jaXR5WSAqIGluZXJ0aWEgLyAyXTtcblxuICAgICAgICAgIHZhciBfbmV3TWFwU3RhdGUyID0gdGhpcy5tYXBTdGF0ZS5yb3RhdGUoe1xuICAgICAgICAgICAgcG9zOiBlbmRQb3NcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQoX25ld01hcFN0YXRlMiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyksIHt9LCB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGluZXJ0aWEsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRWFzaW5nOiBJTkVSVElBX0VBU0lOR1xuICAgICAgICAgIH0pLCB7XG4gICAgICAgICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzUm90YXRpbmc6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmJsb2NrRXZlbnRzKGluZXJ0aWEpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnJvdGF0ZUVuZCgpO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChuZXdNYXBTdGF0ZSwgbnVsbCwge1xuICAgICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vbkRvdWJsZVRhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25Eb3VibGVUYXAoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5kb3VibGVDbGlja1pvb20pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zID0gdGhpcy5nZXRDZW50ZXIoZXZlbnQpO1xuICAgICAgdmFyIGlzWm9vbU91dCA9IHRoaXMuaXNGdW5jdGlvbktleVByZXNzZWQoZXZlbnQpO1xuICAgICAgdmFyIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS56b29tKHtcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIHNjYWxlOiBpc1pvb21PdXQgPyAwLjUgOiAyXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQobmV3TWFwU3RhdGUsIE9iamVjdC5hc3NpZ24oe30sIExJTkVBUl9UUkFOU0lUSU9OX1BST1BTLCB7XG4gICAgICAgIHRyYW5zaXRpb25JbnRlcnBvbGF0b3I6IG5ldyBMaW5lYXJJbnRlcnBvbGF0b3Ioe1xuICAgICAgICAgIGFyb3VuZDogcG9zXG4gICAgICAgIH0pXG4gICAgICB9KSwge1xuICAgICAgICBpc1pvb21pbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vbktleURvd25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmtleWJvYXJkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZ1bmNLZXkgPSB0aGlzLmlzRnVuY3Rpb25LZXlQcmVzc2VkKGV2ZW50KTtcbiAgICAgIHZhciBfdGhpcyRrZXlib2FyZCA9IHRoaXMua2V5Ym9hcmQsXG4gICAgICAgICAgX3RoaXMka2V5Ym9hcmQkem9vbVNwID0gX3RoaXMka2V5Ym9hcmQuem9vbVNwZWVkLFxuICAgICAgICAgIHpvb21TcGVlZCA9IF90aGlzJGtleWJvYXJkJHpvb21TcCA9PT0gdm9pZCAwID8gMiA6IF90aGlzJGtleWJvYXJkJHpvb21TcCxcbiAgICAgICAgICBfdGhpcyRrZXlib2FyZCRtb3ZlU3AgPSBfdGhpcyRrZXlib2FyZC5tb3ZlU3BlZWQsXG4gICAgICAgICAgbW92ZVNwZWVkID0gX3RoaXMka2V5Ym9hcmQkbW92ZVNwID09PSB2b2lkIDAgPyAxMDAgOiBfdGhpcyRrZXlib2FyZCRtb3ZlU3AsXG4gICAgICAgICAgX3RoaXMka2V5Ym9hcmQkcm90YXRlID0gX3RoaXMka2V5Ym9hcmQucm90YXRlU3BlZWRYLFxuICAgICAgICAgIHJvdGF0ZVNwZWVkWCA9IF90aGlzJGtleWJvYXJkJHJvdGF0ZSA9PT0gdm9pZCAwID8gMTUgOiBfdGhpcyRrZXlib2FyZCRyb3RhdGUsXG4gICAgICAgICAgX3RoaXMka2V5Ym9hcmQkcm90YXRlMiA9IF90aGlzJGtleWJvYXJkLnJvdGF0ZVNwZWVkWSxcbiAgICAgICAgICByb3RhdGVTcGVlZFkgPSBfdGhpcyRrZXlib2FyZCRyb3RhdGUyID09PSB2b2lkIDAgPyAxMCA6IF90aGlzJGtleWJvYXJkJHJvdGF0ZTI7XG4gICAgICB2YXIgbWFwU3RhdGVQcm9wcyA9IHRoaXMubWFwU3RhdGVQcm9wcztcbiAgICAgIHZhciBuZXdNYXBTdGF0ZTtcblxuICAgICAgc3dpdGNoIChldmVudC5zcmNFdmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gLSBNYXRoLmxvZzIoem9vbVNwZWVkKSAtIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICB6b29tOiBtYXBTdGF0ZVByb3BzLnpvb20gLSBNYXRoLmxvZzIoem9vbVNwZWVkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgaWYgKGZ1bmNLZXkpIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSh7XG4gICAgICAgICAgICAgIHpvb206IG1hcFN0YXRlUHJvcHMuem9vbSArIE1hdGgubG9nMih6b29tU3BlZWQpICsgMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5nZXRNYXBTdGF0ZSh7XG4gICAgICAgICAgICAgIHpvb206IG1hcFN0YXRlUHJvcHMuem9vbSArIE1hdGgubG9nMih6b29tU3BlZWQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICBiZWFyaW5nOiBtYXBTdGF0ZVByb3BzLmJlYXJpbmcgLSByb3RhdGVTcGVlZFhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMubWFwU3RhdGUucGFuKHtcbiAgICAgICAgICAgICAgcG9zOiBbbW92ZVNwZWVkLCAwXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICBpZiAoZnVuY0tleSkge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLmdldE1hcFN0YXRlKHtcbiAgICAgICAgICAgICAgYmVhcmluZzogbWFwU3RhdGVQcm9wcy5iZWFyaW5nICsgcm90YXRlU3BlZWRYXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TWFwU3RhdGUgPSB0aGlzLm1hcFN0YXRlLnBhbih7XG4gICAgICAgICAgICAgIHBvczogWy1tb3ZlU3BlZWQsIDBdLFxuICAgICAgICAgICAgICBzdGFydFBvczogWzAsIDBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICBwaXRjaDogbWFwU3RhdGVQcm9wcy5waXRjaCArIHJvdGF0ZVNwZWVkWVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICAgICAgICBwb3M6IFswLCBtb3ZlU3BlZWRdLFxuICAgICAgICAgICAgICBzdGFydFBvczogWzAsIDBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIGlmIChmdW5jS2V5KSB7XG4gICAgICAgICAgICBuZXdNYXBTdGF0ZSA9IHRoaXMuZ2V0TWFwU3RhdGUoe1xuICAgICAgICAgICAgICBwaXRjaDogbWFwU3RhdGVQcm9wcy5waXRjaCAtIHJvdGF0ZVNwZWVkWVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld01hcFN0YXRlID0gdGhpcy5tYXBTdGF0ZS5wYW4oe1xuICAgICAgICAgICAgICBwb3M6IFswLCAtbW92ZVNwZWVkXSxcbiAgICAgICAgICAgICAgc3RhcnRQb3M6IFswLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXdwb3J0KG5ld01hcFN0YXRlLCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hcENvbnRyb2xsZXI7XG59KCk7XG5cbmV4cG9ydCB7IE1hcENvbnRyb2xsZXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlUmVmLCB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgU3RhdGljTWFwLCB7IGdldFZpZXdwb3J0IH0gZnJvbSAnLi9zdGF0aWMtbWFwJztcbmltcG9ydCB7IE1BUEJPWF9MSU1JVFMgfSBmcm9tICcuLi91dGlscy9tYXAtc3RhdGUnO1xuaW1wb3J0IFRyYW5zaXRpb25NYW5hZ2VyIGZyb20gJy4uL3V0aWxzL3RyYW5zaXRpb24tbWFuYWdlcic7XG5pbXBvcnQgTWFwQ29udGV4dCwgeyBNYXBDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL21hcC1jb250ZXh0JztcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gJ21qb2xuaXIuanMnO1xuaW1wb3J0IE1hcENvbnRyb2xsZXIgZnJvbSAnLi4vdXRpbHMvbWFwLWNvbnRyb2xsZXInO1xuaW1wb3J0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgZnJvbSAnLi4vdXRpbHMvdXNlLWlzb21vcnBoaWMtbGF5b3V0LWVmZmVjdCc7XG5pbXBvcnQgeyBnZXRUZXJyYWluRWxldmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdGVycmFpbic7XG52YXIgcHJvcFR5cGVzID0gT2JqZWN0LmFzc2lnbih7fSwgU3RhdGljTWFwLnByb3BUeXBlcywge1xuICBtYXhab29tOiBQcm9wVHlwZXMubnVtYmVyLFxuICBtaW5ab29tOiBQcm9wVHlwZXMubnVtYmVyLFxuICBtYXhQaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgbWluUGl0Y2g6IFByb3BUeXBlcy5udW1iZXIsXG4gIG9uVmlld1N0YXRlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WaWV3cG9ydENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICB0cmFuc2l0aW9uSW50ZXJydXB0aW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICB0cmFuc2l0aW9uRWFzaW5nOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25UcmFuc2l0aW9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBvblRyYW5zaXRpb25JbnRlcnJ1cHQ6IFByb3BUeXBlcy5mdW5jLFxuICBvblRyYW5zaXRpb25FbmQ6IFByb3BUeXBlcy5mdW5jLFxuICBzY3JvbGxab29tOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBkcmFnUGFuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBkcmFnUm90YXRlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBkb3VibGVDbGlja1pvb206IFByb3BUeXBlcy5ib29sLFxuICB0b3VjaFpvb206IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIHRvdWNoUm90YXRlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBrZXlib2FyZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgb25Ib3ZlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBvbkRibENsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Db250ZXh0TWVudTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VEb3duOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZU1vdmU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlVXA6IFByb3BUeXBlcy5mdW5jLFxuICBvblRvdWNoU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBvblRvdWNoTW92ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVG91Y2hFbmQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlT3V0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25XaGVlbDogUHJvcFR5cGVzLmZ1bmMsXG4gIHRvdWNoQWN0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBldmVudFJlY29nbml6ZXJPcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGlja1JhZGl1czogUHJvcFR5cGVzLm51bWJlcixcbiAgaW50ZXJhY3RpdmVMYXllcklkczogUHJvcFR5cGVzLmFycmF5LFxuICBnZXRDdXJzb3I6IFByb3BUeXBlcy5mdW5jLFxuICBjb250cm9sbGVyOiBQcm9wVHlwZXMuaW5zdGFuY2VPZihNYXBDb250cm9sbGVyKVxufSk7XG5cbnZhciBnZXREZWZhdWx0Q3Vyc29yID0gZnVuY3Rpb24gZ2V0RGVmYXVsdEN1cnNvcihfcmVmKSB7XG4gIHZhciBpc0RyYWdnaW5nID0gX3JlZi5pc0RyYWdnaW5nLFxuICAgICAgaXNIb3ZlcmluZyA9IF9yZWYuaXNIb3ZlcmluZztcbiAgcmV0dXJuIGlzRHJhZ2dpbmcgPyAnZ3JhYmJpbmcnIDogaXNIb3ZlcmluZyA/ICdwb2ludGVyJyA6ICdncmFiJztcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBTdGF0aWNNYXAuZGVmYXVsdFByb3BzLCBNQVBCT1hfTElNSVRTLCBUcmFuc2l0aW9uTWFuYWdlci5kZWZhdWx0UHJvcHMsIHtcbiAgb25WaWV3U3RhdGVDaGFuZ2U6IG51bGwsXG4gIG9uVmlld3BvcnRDaGFuZ2U6IG51bGwsXG4gIG9uQ2xpY2s6IG51bGwsXG4gIG9uTmF0aXZlQ2xpY2s6IG51bGwsXG4gIG9uSG92ZXI6IG51bGwsXG4gIG9uQ29udGV4dE1lbnU6IGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSxcbiAgc2Nyb2xsWm9vbTogdHJ1ZSxcbiAgZHJhZ1BhbjogdHJ1ZSxcbiAgZHJhZ1JvdGF0ZTogdHJ1ZSxcbiAgZG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICB0b3VjaFpvb206IHRydWUsXG4gIHRvdWNoUm90YXRlOiBmYWxzZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gIGV2ZW50UmVjb2duaXplck9wdGlvbnM6IHt9LFxuICBjbGlja1JhZGl1czogMCxcbiAgZ2V0Q3Vyc29yOiBnZXREZWZhdWx0Q3Vyc29yXG59KTtcblxuZnVuY3Rpb24gbm9ybWFsaXplRXZlbnQoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LmxuZ0xhdCB8fCAhZXZlbnQub2Zmc2V0Q2VudGVyKSB7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgdmFyIF9ldmVudCRvZmZzZXRDZW50ZXIgPSBldmVudC5vZmZzZXRDZW50ZXIsXG4gICAgICB4ID0gX2V2ZW50JG9mZnNldENlbnRlci54LFxuICAgICAgeSA9IF9ldmVudCRvZmZzZXRDZW50ZXIueTtcblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSB7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgdmFyIHBvcyA9IFt4LCB5XTtcbiAgZXZlbnQucG9pbnQgPSBwb3M7XG4gIHZhciB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7XG4gIHZhciBsb2NhdGlvbiA9IHZpZXdwb3J0LnVucHJvamVjdChwb3MsIHtcbiAgICB0YXJnZXRaOiB2aWV3cG9ydC5tZXRlck9mZnNldFsyXVxuICB9KTtcbiAgZXZlbnQubG5nTGF0ID0gW2xvY2F0aW9uWzBdLCBsb2NhdGlvblsxXV07XG4gIHJldHVybiBldmVudDtcbn1cblxuZnVuY3Rpb24gZ2V0RmVhdHVyZXMocG9zKSB7XG4gIHZhciBtYXAgPSB0aGlzLm1hcDtcblxuICBpZiAoIW1hcCB8fCAhcG9zKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcXVlcnlQYXJhbXMgPSB7fTtcbiAgdmFyIHNpemUgPSB0aGlzLnByb3BzLmNsaWNrUmFkaXVzO1xuXG4gIGlmICh0aGlzLnByb3BzLmludGVyYWN0aXZlTGF5ZXJJZHMpIHtcbiAgICBxdWVyeVBhcmFtcy5sYXllcnMgPSB0aGlzLnByb3BzLmludGVyYWN0aXZlTGF5ZXJJZHM7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHNpemUgPyBbW3Bvc1swXSAtIHNpemUsIHBvc1sxXSArIHNpemVdLCBbcG9zWzBdICsgc2l6ZSwgcG9zWzFdIC0gc2l6ZV1dIDogcG9zLCBxdWVyeVBhcmFtcyk7XG4gIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkV2ZW50KGNhbGxiYWNrTmFtZSwgZXZlbnQpIHtcbiAgdmFyIGZ1bmMgPSB0aGlzLnByb3BzW2NhbGxiYWNrTmFtZV07XG5cbiAgaWYgKGZ1bmMpIHtcbiAgICBmdW5jKG5vcm1hbGl6ZUV2ZW50LmNhbGwodGhpcywgZXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gIG9uRXZlbnQuY2FsbCh0aGlzLCBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyA/ICdvblRvdWNoU3RhcnQnIDogJ29uTW91c2VEb3duJywgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBvblBvaW50ZXJVcChldmVudCkge1xuICBvbkV2ZW50LmNhbGwodGhpcywgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgPyAnb25Ub3VjaEVuZCcgOiAnb25Nb3VzZVVwJywgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBvblBvaW50ZXJNb3ZlKGV2ZW50KSB7XG4gIG9uRXZlbnQuY2FsbCh0aGlzLCBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyA/ICdvblRvdWNoTW92ZScgOiAnb25Nb3VzZU1vdmUnLCBldmVudCk7XG5cbiAgaWYgKCF0aGlzLnN0YXRlLmlzRHJhZ2dpbmcpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvbkhvdmVyID0gX3RoaXMkcHJvcHMub25Ib3ZlcixcbiAgICAgICAgaW50ZXJhY3RpdmVMYXllcklkcyA9IF90aGlzJHByb3BzLmludGVyYWN0aXZlTGF5ZXJJZHM7XG4gICAgdmFyIGZlYXR1cmVzO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQuY2FsbCh0aGlzLCBldmVudCk7XG5cbiAgICBpZiAoaW50ZXJhY3RpdmVMYXllcklkcyB8fCBvbkhvdmVyKSB7XG4gICAgICBmZWF0dXJlcyA9IGdldEZlYXR1cmVzLmNhbGwodGhpcywgZXZlbnQucG9pbnQpO1xuICAgIH1cblxuICAgIHZhciBpc0hvdmVyaW5nID0gQm9vbGVhbihpbnRlcmFjdGl2ZUxheWVySWRzICYmIGZlYXR1cmVzICYmIGZlYXR1cmVzLmxlbmd0aCA+IDApO1xuICAgIHZhciBpc0VudGVyaW5nID0gaXNIb3ZlcmluZyAmJiAhdGhpcy5zdGF0ZS5pc0hvdmVyaW5nO1xuICAgIHZhciBpc0V4aXRpbmcgPSAhaXNIb3ZlcmluZyAmJiB0aGlzLnN0YXRlLmlzSG92ZXJpbmc7XG5cbiAgICBpZiAob25Ib3ZlciB8fCBpc0VudGVyaW5nKSB7XG4gICAgICBldmVudC5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuXG4gICAgICBpZiAob25Ib3Zlcikge1xuICAgICAgICBvbkhvdmVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNFbnRlcmluZykge1xuICAgICAgb25FdmVudC5jYWxsKHRoaXMsICdvbk1vdXNlRW50ZXInLCBldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzRXhpdGluZykge1xuICAgICAgb25FdmVudC5jYWxsKHRoaXMsICdvbk1vdXNlTGVhdmUnLCBldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzRW50ZXJpbmcgfHwgaXNFeGl0aW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNIb3ZlcmluZzogaXNIb3ZlcmluZ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUG9pbnRlckNsaWNrKGV2ZW50KSB7XG4gIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgb25DbGljayA9IF90aGlzJHByb3BzMi5vbkNsaWNrLFxuICAgICAgb25OYXRpdmVDbGljayA9IF90aGlzJHByb3BzMi5vbk5hdGl2ZUNsaWNrLFxuICAgICAgb25EYmxDbGljayA9IF90aGlzJHByb3BzMi5vbkRibENsaWNrLFxuICAgICAgZG91YmxlQ2xpY2tab29tID0gX3RoaXMkcHJvcHMyLmRvdWJsZUNsaWNrWm9vbTtcbiAgdmFyIGNhbGxiYWNrcyA9IFtdO1xuICB2YXIgaXNEb3VibGVDbGlja0VuYWJsZWQgPSBvbkRibENsaWNrIHx8IGRvdWJsZUNsaWNrWm9vbTtcblxuICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICBjYXNlICdhbnljbGljayc6XG4gICAgICBjYWxsYmFja3MucHVzaChvbk5hdGl2ZUNsaWNrKTtcblxuICAgICAgaWYgKCFpc0RvdWJsZUNsaWNrRW5hYmxlZCkge1xuICAgICAgICBjYWxsYmFja3MucHVzaChvbkNsaWNrKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICBpZiAoaXNEb3VibGVDbGlja0VuYWJsZWQpIHtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2gob25DbGljayk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgfVxuXG4gIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuICAgIGV2ZW50LmZlYXR1cmVzID0gZ2V0RmVhdHVyZXMuY2FsbCh0aGlzLCBldmVudC5wb2ludCk7XG4gICAgY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gY2IoZXZlbnQpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZkhhbmRsZXMoc3RhdGljTWFwUmVmKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0TWFwOiBzdGF0aWNNYXBSZWYuY3VycmVudCAmJiBzdGF0aWNNYXBSZWYuY3VycmVudC5nZXRNYXAsXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzOiBzdGF0aWNNYXBSZWYuY3VycmVudCAmJiBzdGF0aWNNYXBSZWYuY3VycmVudC5xdWVyeVJlbmRlcmVkRmVhdHVyZXNcbiAgfTtcbn1cblxudmFyIEludGVyYWN0aXZlTWFwID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcGFyZW50Q29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhciBjb250cm9sbGVyID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmNvbnRyb2xsZXIgfHwgbmV3IE1hcENvbnRyb2xsZXIoKTtcbiAgfSwgW10pO1xuICB2YXIgZXZlbnRNYW5hZ2VyID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBFdmVudE1hbmFnZXIobnVsbCwge1xuICAgICAgdG91Y2hBY3Rpb246IHByb3BzLnRvdWNoQWN0aW9uLFxuICAgICAgcmVjb2duaXplck9wdGlvbnM6IHByb3BzLmV2ZW50UmVjb2duaXplck9wdGlvbnNcbiAgICB9KTtcbiAgfSwgW10pO1xuICB2YXIgZXZlbnRDYW52YXNSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBzdGF0aWNNYXBSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgdmFyIF90aGlzUmVmID0gdXNlUmVmKHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgc3RhdGU6IHtcbiAgICAgIGlzSG92ZXJpbmc6IGZhbHNlLFxuICAgICAgaXNEcmFnZ2luZzogZmFsc2VcbiAgICB9XG4gIH0pO1xuXG4gIHZhciB0aGlzUmVmID0gX3RoaXNSZWYuY3VycmVudDtcbiAgdGhpc1JlZi5wcm9wcyA9IHByb3BzO1xuICB0aGlzUmVmLm1hcCA9IHN0YXRpY01hcFJlZi5jdXJyZW50ICYmIHN0YXRpY01hcFJlZi5jdXJyZW50LmdldE1hcCgpO1xuXG4gIHRoaXNSZWYuc2V0U3RhdGUgPSBmdW5jdGlvbiAobmV3U3RhdGUpIHtcbiAgICB0aGlzUmVmLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzUmVmLnN0YXRlKSwgbmV3U3RhdGUpO1xuICAgIGV2ZW50Q2FudmFzUmVmLmN1cnJlbnQuc3R5bGUuY3Vyc29yID0gcHJvcHMuZ2V0Q3Vyc29yKHRoaXNSZWYuc3RhdGUpO1xuICB9O1xuXG4gIHZhciBpblJlbmRlciA9IHRydWU7XG4gIHZhciB2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZDtcbiAgdmFyIHN0YXRlVXBkYXRlUmVxdWVzdGVkO1xuXG4gIHZhciBoYW5kbGVWaWV3cG9ydENoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVZpZXdwb3J0Q2hhbmdlKHZpZXdTdGF0ZSwgaW50ZXJhY3Rpb25TdGF0ZSwgb2xkVmlld1N0YXRlKSB7XG4gICAgaWYgKGluUmVuZGVyKSB7XG4gICAgICB2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCA9IFt2aWV3U3RhdGUsIGludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdTdGF0ZV07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIF90aGlzUmVmJHByb3BzID0gdGhpc1JlZi5wcm9wcyxcbiAgICAgICAgb25WaWV3U3RhdGVDaGFuZ2UgPSBfdGhpc1JlZiRwcm9wcy5vblZpZXdTdGF0ZUNoYW5nZSxcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZSA9IF90aGlzUmVmJHByb3BzLm9uVmlld3BvcnRDaGFuZ2U7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXdTdGF0ZSwgJ3Bvc2l0aW9uJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBbMCwgMCwgZ2V0VGVycmFpbkVsZXZhdGlvbih0aGlzUmVmLm1hcCwgdmlld1N0YXRlKV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAob25WaWV3U3RhdGVDaGFuZ2UpIHtcbiAgICAgIG9uVmlld1N0YXRlQ2hhbmdlKHtcbiAgICAgICAgdmlld1N0YXRlOiB2aWV3U3RhdGUsXG4gICAgICAgIGludGVyYWN0aW9uU3RhdGU6IGludGVyYWN0aW9uU3RhdGUsXG4gICAgICAgIG9sZFZpZXdTdGF0ZTogb2xkVmlld1N0YXRlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob25WaWV3cG9ydENoYW5nZSkge1xuICAgICAgb25WaWV3cG9ydENoYW5nZSh2aWV3U3RhdGUsIGludGVyYWN0aW9uU3RhdGUsIG9sZFZpZXdTdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFJlZkhhbmRsZXMoc3RhdGljTWFwUmVmKTtcbiAgfSwgW10pO1xuICB2YXIgY29udGV4dCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhcmVudENvbnRleHQpLCB7fSwge1xuICAgICAgZXZlbnRNYW5hZ2VyOiBldmVudE1hbmFnZXIsXG4gICAgICBjb250YWluZXI6IHBhcmVudENvbnRleHQuY29udGFpbmVyIHx8IGV2ZW50Q2FudmFzUmVmLmN1cnJlbnRcbiAgICB9KTtcbiAgfSwgW3BhcmVudENvbnRleHQsIGV2ZW50Q2FudmFzUmVmLmN1cnJlbnRdKTtcbiAgY29udGV4dC5vblZpZXdwb3J0Q2hhbmdlID0gaGFuZGxlVmlld3BvcnRDaGFuZ2U7XG4gIGNvbnRleHQudmlld3BvcnQgPSBwYXJlbnRDb250ZXh0LnZpZXdwb3J0IHx8IGdldFZpZXdwb3J0KHRoaXNSZWYpO1xuICB0aGlzUmVmLnZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydDtcblxuICB2YXIgaGFuZGxlSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUludGVyYWN0aW9uU3RhdGVDaGFuZ2UoaW50ZXJhY3Rpb25TdGF0ZSkge1xuICAgIHZhciBfaW50ZXJhY3Rpb25TdGF0ZSRpc0QgPSBpbnRlcmFjdGlvblN0YXRlLmlzRHJhZ2dpbmcsXG4gICAgICAgIGlzRHJhZ2dpbmcgPSBfaW50ZXJhY3Rpb25TdGF0ZSRpc0QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2ludGVyYWN0aW9uU3RhdGUkaXNEO1xuXG4gICAgaWYgKGlzRHJhZ2dpbmcgIT09IHRoaXNSZWYuc3RhdGUuaXNEcmFnZ2luZykge1xuICAgICAgdGhpc1JlZi5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpblJlbmRlcikge1xuICAgICAgc3RhdGVVcGRhdGVSZXF1ZXN0ZWQgPSBpbnRlcmFjdGlvblN0YXRlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2UgPSB0aGlzUmVmLnByb3BzLm9uSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZTtcblxuICAgIGlmIChvbkludGVyYWN0aW9uU3RhdGVDaGFuZ2UpIHtcbiAgICAgIG9uSW50ZXJhY3Rpb25TdGF0ZUNoYW5nZShpbnRlcmFjdGlvblN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHVwZGF0ZUNvbnRyb2xsZXJPcHRzID0gZnVuY3Rpb24gdXBkYXRlQ29udHJvbGxlck9wdHMoKSB7XG4gICAgaWYgKHRoaXNSZWYud2lkdGggJiYgdGhpc1JlZi5oZWlnaHQpIHtcbiAgICAgIGNvbnRyb2xsZXIuc2V0T3B0aW9ucyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpc1JlZi5wcm9wcyksIHRoaXNSZWYucHJvcHMudmlld1N0YXRlKSwge30sIHtcbiAgICAgICAgaXNJbnRlcmFjdGl2ZTogQm9vbGVhbih0aGlzUmVmLnByb3BzLm9uVmlld1N0YXRlQ2hhbmdlIHx8IHRoaXNSZWYucHJvcHMub25WaWV3cG9ydENoYW5nZSksXG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2U6IGhhbmRsZVZpZXdwb3J0Q2hhbmdlLFxuICAgICAgICBvblN0YXRlQ2hhbmdlOiBoYW5kbGVJbnRlcmFjdGlvblN0YXRlQ2hhbmdlLFxuICAgICAgICBldmVudE1hbmFnZXI6IGV2ZW50TWFuYWdlcixcbiAgICAgICAgd2lkdGg6IHRoaXNSZWYud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpc1JlZi5oZWlnaHRcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9uUmVzaXplID0gZnVuY3Rpb24gb25SZXNpemUoX3JlZjIpIHtcbiAgICB2YXIgd2lkdGggPSBfcmVmMi53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZjIuaGVpZ2h0O1xuICAgIHRoaXNSZWYud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzUmVmLmhlaWdodCA9IGhlaWdodDtcbiAgICB1cGRhdGVDb250cm9sbGVyT3B0cygpO1xuICAgIHRoaXNSZWYucHJvcHMub25SZXNpemUoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9KTtcbiAgfTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50TWFuYWdlci5zZXRFbGVtZW50KGV2ZW50Q2FudmFzUmVmLmN1cnJlbnQpO1xuICAgIGV2ZW50TWFuYWdlci5vbih7XG4gICAgICBwb2ludGVyZG93bjogb25Qb2ludGVyRG93bi5iaW5kKHRoaXNSZWYpLFxuICAgICAgcG9pbnRlcm1vdmU6IG9uUG9pbnRlck1vdmUuYmluZCh0aGlzUmVmKSxcbiAgICAgIHBvaW50ZXJ1cDogb25Qb2ludGVyVXAuYmluZCh0aGlzUmVmKSxcbiAgICAgIHBvaW50ZXJsZWF2ZTogb25FdmVudC5iaW5kKHRoaXNSZWYsICdvbk1vdXNlT3V0JyksXG4gICAgICBjbGljazogb25Qb2ludGVyQ2xpY2suYmluZCh0aGlzUmVmKSxcbiAgICAgIGFueWNsaWNrOiBvblBvaW50ZXJDbGljay5iaW5kKHRoaXNSZWYpLFxuICAgICAgZGJsY2xpY2s6IG9uRXZlbnQuYmluZCh0aGlzUmVmLCAnb25EYmxDbGljaycpLFxuICAgICAgd2hlZWw6IG9uRXZlbnQuYmluZCh0aGlzUmVmLCAnb25XaGVlbCcpLFxuICAgICAgY29udGV4dG1lbnU6IG9uRXZlbnQuYmluZCh0aGlzUmVmLCAnb25Db250ZXh0TWVudScpXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGV2ZW50TWFuYWdlci5kZXN0cm95KCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQpIHtcbiAgICAgIGhhbmRsZVZpZXdwb3J0Q2hhbmdlLmFwcGx5KHZvaWQgMCwgX3RvQ29uc3VtYWJsZUFycmF5KHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlVXBkYXRlUmVxdWVzdGVkKSB7XG4gICAgICBoYW5kbGVJbnRlcmFjdGlvblN0YXRlQ2hhbmdlKHN0YXRlVXBkYXRlUmVxdWVzdGVkKTtcbiAgICB9XG4gIH0pO1xuICB1cGRhdGVDb250cm9sbGVyT3B0cygpO1xuICB2YXIgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBnZXRDdXJzb3IgPSBwcm9wcy5nZXRDdXJzb3I7XG4gIHZhciBldmVudENhbnZhc1N0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH0sIHN0eWxlKSwge30sIHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgY3Vyc29yOiBnZXRDdXJzb3IodGhpc1JlZi5zdGF0ZSlcbiAgICB9KTtcbiAgfSwgW3N0eWxlLCB3aWR0aCwgaGVpZ2h0LCBnZXRDdXJzb3IsIHRoaXNSZWYuc3RhdGVdKTtcblxuICBpZiAoIXZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkIHx8ICF0aGlzUmVmLl9jaGlsZCkge1xuICAgIHRoaXNSZWYuX2NoaWxkID0gUmVhY3QuY3JlYXRlRWxlbWVudChNYXBDb250ZXh0UHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBjb250ZXh0XG4gICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBrZXk6IFwiZXZlbnQtY2FudmFzXCIsXG4gICAgICByZWY6IGV2ZW50Q2FudmFzUmVmLFxuICAgICAgc3R5bGU6IGV2ZW50Q2FudmFzU3R5bGVcbiAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFN0YXRpY01hcCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgc3R5bGU6IG51bGwsXG4gICAgICBvblJlc2l6ZTogb25SZXNpemUsXG4gICAgICByZWY6IHN0YXRpY01hcFJlZlxuICAgIH0pKSkpO1xuICB9XG5cbiAgaW5SZW5kZXIgPSBmYWxzZTtcbiAgcmV0dXJuIHRoaXNSZWYuX2NoaWxkO1xufSk7XG5JbnRlcmFjdGl2ZU1hcC5zdXBwb3J0ZWQgPSBTdGF0aWNNYXAuc3VwcG9ydGVkO1xuSW50ZXJhY3RpdmVNYXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuSW50ZXJhY3RpdmVNYXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgSW50ZXJhY3RpdmVNYXA7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKF90eXBlb2YoYSkgPT09ICdvYmplY3QnICYmIF90eXBlb2YoYikgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgdmFyIGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG5cbiAgICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hS2V5cyA9IGFLZXlzOyBfaSA8IF9hS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrZXkgPSBfYUtleXNbX2ldO1xuXG4gICAgICBpZiAoIWIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNYXBDb250ZXh0IGZyb20gJy4vbWFwLWNvbnRleHQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi91dGlscy9hc3NlcnQnO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICcuLi91dGlscy9kZWVwLWVxdWFsJztcbnZhciBzb3VyY2VDb3VudGVyID0gMDtcblxuZnVuY3Rpb24gY3JlYXRlU291cmNlKG1hcCwgaWQsIHByb3BzKSB7XG4gIGlmIChtYXAuc3R5bGUgJiYgbWFwLnN0eWxlLl9sb2FkZWQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQoe30sIHByb3BzKTtcblxuICAgIGRlbGV0ZSBvcHRpb25zLmlkO1xuICAgIGRlbGV0ZSBvcHRpb25zLmNoaWxkcmVuO1xuICAgIG1hcC5hZGRTb3VyY2UoaWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtYXAuZ2V0U291cmNlKGlkKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTb3VyY2Uoc291cmNlLCBwcm9wcywgcHJldlByb3BzKSB7XG4gIGFzc2VydChwcm9wcy5pZCA9PT0gcHJldlByb3BzLmlkLCAnc291cmNlIGlkIGNoYW5nZWQnKTtcbiAgYXNzZXJ0KHByb3BzLnR5cGUgPT09IHByZXZQcm9wcy50eXBlLCAnc291cmNlIHR5cGUgY2hhbmdlZCcpO1xuICB2YXIgY2hhbmdlZEtleSA9ICcnO1xuICB2YXIgY2hhbmdlZEtleUNvdW50ID0gMDtcblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2lkJyAmJiAhZGVlcEVxdWFsKHByZXZQcm9wc1trZXldLCBwcm9wc1trZXldKSkge1xuICAgICAgY2hhbmdlZEtleSA9IGtleTtcbiAgICAgIGNoYW5nZWRLZXlDb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY2hhbmdlZEtleUNvdW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh0eXBlID09PSAnZ2VvanNvbicpIHtcbiAgICBzb3VyY2Uuc2V0RGF0YShwcm9wcy5kYXRhKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgc291cmNlLnVwZGF0ZUltYWdlKHtcbiAgICAgIHVybDogcHJvcHMudXJsLFxuICAgICAgY29vcmRpbmF0ZXM6IHByb3BzLmNvb3JkaW5hdGVzXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoKHR5cGUgPT09ICdjYW52YXMnIHx8IHR5cGUgPT09ICd2aWRlbycpICYmIGNoYW5nZWRLZXlDb3VudCA9PT0gMSAmJiBjaGFuZ2VkS2V5ID09PSAnY29vcmRpbmF0ZXMnKSB7XG4gICAgc291cmNlLnNldENvb3JkaW5hdGVzKHByb3BzLmNvb3JkaW5hdGVzKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAndmVjdG9yJyAmJiBzb3VyY2Uuc2V0VXJsKSB7XG4gICAgc3dpdGNoIChjaGFuZ2VkS2V5KSB7XG4gICAgICBjYXNlICd1cmwnOlxuICAgICAgICBzb3VyY2Uuc2V0VXJsKHByb3BzLnVybCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aWxlcyc6XG4gICAgICAgIHNvdXJjZS5zZXRUaWxlcyhwcm9wcy50aWxlcyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLndhcm4oXCJVbmFibGUgdG8gdXBkYXRlIDxTb3VyY2U+IHByb3A6IFwiLmNvbmNhdChjaGFuZ2VkS2V5KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gU291cmNlKHByb3BzKSB7XG4gIHZhciBjb250ZXh0ID0gdXNlQ29udGV4dChNYXBDb250ZXh0KTtcbiAgdmFyIHByb3BzUmVmID0gdXNlUmVmKHtcbiAgICBpZDogcHJvcHMuaWQsXG4gICAgdHlwZTogcHJvcHMudHlwZVxuICB9KTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHNldFN0eWxlTG9hZGVkID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgaWQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHJvcHMuaWQgfHwgXCJqc3gtc291cmNlLVwiLmNvbmNhdChzb3VyY2VDb3VudGVyKyspO1xuICB9LCBbXSk7XG4gIHZhciBtYXAgPSBjb250ZXh0Lm1hcDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWFwKSB7XG4gICAgICB2YXIgZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHNldFN0eWxlTG9hZGVkKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHZlcnNpb24gKyAxO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIG1hcC5vbignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWFwLm9mZignc3R5bGVkYXRhJywgZm9yY2VVcGRhdGUpO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChtYXAuc3R5bGUgJiYgbWFwLnN0eWxlLl9sb2FkZWQgJiYgbWFwLmdldFNvdXJjZShpZCkpIHtcbiAgICAgICAgICAgIG1hcC5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFttYXAsIGlkXSk7XG4gIHZhciBzb3VyY2UgPSBtYXAgJiYgbWFwLnN0eWxlICYmIG1hcC5nZXRTb3VyY2UoaWQpO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICB1cGRhdGVTb3VyY2Uoc291cmNlLCBwcm9wcywgcHJvcHNSZWYuY3VycmVudCk7XG4gIH0gZWxzZSB7XG4gICAgc291cmNlID0gY3JlYXRlU291cmNlKG1hcCwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIHByb3BzUmVmLmN1cnJlbnQgPSBwcm9wcztcbiAgcmV0dXJuIHNvdXJjZSAmJiBSZWFjdC5DaGlsZHJlbi5tYXAocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZCAmJiBjbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIHNvdXJjZTogaWRcbiAgICB9KTtcbiAgfSkgfHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgdmFyIGtleSwgaTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBNYXBDb250ZXh0IGZyb20gJy4vbWFwLWNvbnRleHQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICcuLi91dGlscy9hc3NlcnQnO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICcuLi91dGlscy9kZWVwLWVxdWFsJztcbnZhciBMQVlFUl9UWVBFUyA9IFsnZmlsbCcsICdsaW5lJywgJ3N5bWJvbCcsICdjaXJjbGUnLCAnZmlsbC1leHRydXNpb24nLCAncmFzdGVyJywgJ2JhY2tncm91bmQnLCAnaGVhdG1hcCcsICdoaWxsc2hhZGUnLCAnc2t5J107XG52YXIgcHJvcFR5cGVzID0ge1xuICB0eXBlOiBQcm9wVHlwZXMub25lT2YoTEFZRVJfVFlQRVMpLmlzUmVxdWlyZWQsXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzb3VyY2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGJlZm9yZUlkOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5mdW5jdGlvbiBkaWZmTGF5ZXJTdHlsZXMobWFwLCBpZCwgcHJvcHMsIHByZXZQcm9wcykge1xuICB2YXIgX3Byb3BzJGxheW91dCA9IHByb3BzLmxheW91dCxcbiAgICAgIGxheW91dCA9IF9wcm9wcyRsYXlvdXQgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGxheW91dCxcbiAgICAgIF9wcm9wcyRwYWludCA9IHByb3BzLnBhaW50LFxuICAgICAgcGFpbnQgPSBfcHJvcHMkcGFpbnQgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJHBhaW50LFxuICAgICAgZmlsdGVyID0gcHJvcHMuZmlsdGVyLFxuICAgICAgbWluem9vbSA9IHByb3BzLm1pbnpvb20sXG4gICAgICBtYXh6b29tID0gcHJvcHMubWF4em9vbSxcbiAgICAgIGJlZm9yZUlkID0gcHJvcHMuYmVmb3JlSWQsXG4gICAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJsYXlvdXRcIiwgXCJwYWludFwiLCBcImZpbHRlclwiLCBcIm1pbnpvb21cIiwgXCJtYXh6b29tXCIsIFwiYmVmb3JlSWRcIl0pO1xuXG4gIGlmIChiZWZvcmVJZCAhPT0gcHJldlByb3BzLmJlZm9yZUlkKSB7XG4gICAgbWFwLm1vdmVMYXllcihpZCwgYmVmb3JlSWQpO1xuICB9XG5cbiAgaWYgKGxheW91dCAhPT0gcHJldlByb3BzLmxheW91dCkge1xuICAgIHZhciBwcmV2TGF5b3V0ID0gcHJldlByb3BzLmxheW91dCB8fCB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBsYXlvdXQpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKGxheW91dFtrZXldLCBwcmV2TGF5b3V0W2tleV0pKSB7XG4gICAgICAgIG1hcC5zZXRMYXlvdXRQcm9wZXJ0eShpZCwga2V5LCBsYXlvdXRba2V5XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2tleSBpbiBwcmV2TGF5b3V0KSB7XG4gICAgICBpZiAoIWxheW91dC5oYXNPd25Qcm9wZXJ0eShfa2V5KSkge1xuICAgICAgICBtYXAuc2V0TGF5b3V0UHJvcGVydHkoaWQsIF9rZXksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhaW50ICE9PSBwcmV2UHJvcHMucGFpbnQpIHtcbiAgICB2YXIgcHJldlBhaW50ID0gcHJldlByb3BzLnBhaW50IHx8IHt9O1xuXG4gICAgZm9yICh2YXIgX2tleTIgaW4gcGFpbnQpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKHBhaW50W19rZXkyXSwgcHJldlBhaW50W19rZXkyXSkpIHtcbiAgICAgICAgbWFwLnNldFBhaW50UHJvcGVydHkoaWQsIF9rZXkyLCBwYWludFtfa2V5Ml0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9rZXkzIGluIHByZXZQYWludCkge1xuICAgICAgaWYgKCFwYWludC5oYXNPd25Qcm9wZXJ0eShfa2V5MykpIHtcbiAgICAgICAgbWFwLnNldFBhaW50UHJvcGVydHkoaWQsIF9rZXkzLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghZGVlcEVxdWFsKGZpbHRlciwgcHJldlByb3BzLmZpbHRlcikpIHtcbiAgICBtYXAuc2V0RmlsdGVyKGlkLCBmaWx0ZXIpO1xuICB9XG5cbiAgaWYgKG1pbnpvb20gIT09IHByZXZQcm9wcy5taW56b29tIHx8IG1heHpvb20gIT09IHByZXZQcm9wcy5tYXh6b29tKSB7XG4gICAgbWFwLnNldExheWVyWm9vbVJhbmdlKGlkLCBtaW56b29tLCBtYXh6b29tKTtcbiAgfVxuXG4gIGZvciAodmFyIF9rZXk0IGluIG90aGVyUHJvcHMpIHtcbiAgICBpZiAoIWRlZXBFcXVhbChvdGhlclByb3BzW19rZXk0XSwgcHJldlByb3BzW19rZXk0XSkpIHtcbiAgICAgIG1hcC5zZXRMYXllclByb3BlcnR5KGlkLCBfa2V5NCwgb3RoZXJQcm9wc1tfa2V5NF0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMYXllcihtYXAsIGlkLCBwcm9wcykge1xuICBpZiAobWFwLnN0eWxlICYmIG1hcC5zdHlsZS5fbG9hZGVkKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIGlkOiBpZFxuICAgIH0pO1xuXG4gICAgZGVsZXRlIG9wdGlvbnMuYmVmb3JlSWQ7XG4gICAgbWFwLmFkZExheWVyKG9wdGlvbnMsIHByb3BzLmJlZm9yZUlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXllcihtYXAsIGlkLCBwcm9wcywgcHJldlByb3BzKSB7XG4gIGFzc2VydChwcm9wcy5pZCA9PT0gcHJldlByb3BzLmlkLCAnbGF5ZXIgaWQgY2hhbmdlZCcpO1xuICBhc3NlcnQocHJvcHMudHlwZSA9PT0gcHJldlByb3BzLnR5cGUsICdsYXllciB0eXBlIGNoYW5nZWQnKTtcblxuICB0cnkge1xuICAgIGRpZmZMYXllclN0eWxlcyhtYXAsIGlkLCBwcm9wcywgcHJldlByb3BzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICB9XG59XG5cbnZhciBsYXllckNvdW50ZXIgPSAwO1xuXG5mdW5jdGlvbiBMYXllcihwcm9wcykge1xuICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoTWFwQ29udGV4dCk7XG4gIHZhciBwcm9wc1JlZiA9IHVzZVJlZih7XG4gICAgaWQ6IHByb3BzLmlkLFxuICAgIHR5cGU6IHByb3BzLnR5cGVcbiAgfSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBzZXRTdHlsZUxvYWRlZCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGlkID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb3BzLmlkIHx8IFwianN4LWxheWVyLVwiLmNvbmNhdChsYXllckNvdW50ZXIrKyk7XG4gIH0sIFtdKTtcbiAgdmFyIG1hcCA9IGNvbnRleHQubWFwO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtYXApIHtcbiAgICAgIHZhciBmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gc2V0U3R5bGVMb2FkZWQoZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgICAgICByZXR1cm4gdmVyc2lvbiArIDE7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgbWFwLm9uKCdzdHlsZWRhdGEnLCBmb3JjZVVwZGF0ZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBtYXAub2ZmKCdzdHlsZWRhdGEnLCBmb3JjZVVwZGF0ZSk7XG5cbiAgICAgICAgaWYgKG1hcC5zdHlsZSAmJiBtYXAuc3R5bGUuX2xvYWRlZCkge1xuICAgICAgICAgIG1hcC5yZW1vdmVMYXllcihpZCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW21hcF0pO1xuICB2YXIgbGF5ZXIgPSBtYXAgJiYgbWFwLnN0eWxlICYmIG1hcC5nZXRMYXllcihpZCk7XG5cbiAgaWYgKGxheWVyKSB7XG4gICAgdXBkYXRlTGF5ZXIobWFwLCBpZCwgcHJvcHMsIHByb3BzUmVmLmN1cnJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNyZWF0ZUxheWVyKG1hcCwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIHByb3BzUmVmLmN1cnJlbnQgPSBwcm9wcztcbiAgcmV0dXJuIG51bGw7XG59XG5cbkxheWVyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydCBkZWZhdWx0IExheWVyOyIsImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IE1hcENvbnRleHQgZnJvbSAnLi9tYXAtY29udGV4dCc7XG5leHBvcnQgdmFyIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogdHJ1ZSxcbiAgY2FwdHVyZUNsaWNrOiB0cnVlLFxuICBjYXB0dXJlRG91YmxlQ2xpY2s6IHRydWUsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5leHBvcnQgdmFyIG1hcENvbnRyb2xQcm9wVHlwZXMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IFByb3BUeXBlcy5ib29sLFxuICBjYXB0dXJlRHJhZzogUHJvcFR5cGVzLmJvb2wsXG4gIGNhcHR1cmVDbGljazogUHJvcFR5cGVzLmJvb2wsXG4gIGNhcHR1cmVEb3VibGVDbGljazogUHJvcFR5cGVzLmJvb2wsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmZ1bmN0aW9uIG9uTW91bnQodGhpc1JlZikge1xuICB2YXIgcmVmID0gdGhpc1JlZi5jb250YWluZXJSZWYuY3VycmVudDtcbiAgdmFyIGV2ZW50TWFuYWdlciA9IHRoaXNSZWYuY29udGV4dC5ldmVudE1hbmFnZXI7XG5cbiAgaWYgKCFyZWYgfHwgIWV2ZW50TWFuYWdlcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZXZlbnRzID0ge1xuICAgIHdoZWVsOiBmdW5jdGlvbiB3aGVlbChldnQpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXNSZWYucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5jYXB0dXJlU2Nyb2xsKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsKSB7XG4gICAgICAgIHByb3BzLm9uU2Nyb2xsKGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYW5zdGFydDogZnVuY3Rpb24gcGFuc3RhcnQoZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZURyYWcpIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMub25EcmFnU3RhcnQpIHtcbiAgICAgICAgcHJvcHMub25EcmFnU3RhcnQoZXZ0LCB0aGlzUmVmKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFueWNsaWNrOiBmdW5jdGlvbiBhbnljbGljayhldnQpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXNSZWYucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5jYXB0dXJlQ2xpY2spIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMub25DbGljaykge1xuICAgICAgICBwcm9wcy5vbkNsaWNrKGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGljazogZnVuY3Rpb24gY2xpY2soZXZ0KSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzUmVmLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMuY2FwdHVyZUNsaWNrKSB7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgcHJvcHMub25DbGljayhldnQsIHRoaXNSZWYpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGJsY2xpY2s6IGZ1bmN0aW9uIGRibGNsaWNrKGV2dCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpc1JlZi5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLmNhcHR1cmVEb3VibGVDbGljaykge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5vbkRvdWJsZUNsaWNrKSB7XG4gICAgICAgIHByb3BzLm9uRG91YmxlQ2xpY2soZXZ0LCB0aGlzUmVmKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBvaW50ZXJtb3ZlOiBmdW5jdGlvbiBwb2ludGVybW92ZShldnQpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXNSZWYucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy5jYXB0dXJlUG9pbnRlck1vdmUpIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMub25Qb2ludGVyTW92ZSkge1xuICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlKGV2dCwgdGhpc1JlZik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBldmVudE1hbmFnZXIud2F0Y2goZXZlbnRzLCByZWYpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50TWFuYWdlci5vZmYoZXZlbnRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWFwQ29udHJvbCgpIHtcbiAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgdmFyIGNvbnRleHQgPSB1c2VDb250ZXh0KE1hcENvbnRleHQpO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBfdGhpc1JlZiA9IHVzZVJlZih7XG4gICAgcHJvcHM6IHByb3BzLFxuICAgIHN0YXRlOiB7fSxcbiAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgIGNvbnRhaW5lclJlZjogY29udGFpbmVyUmVmXG4gIH0pO1xuXG4gIHZhciB0aGlzUmVmID0gX3RoaXNSZWYuY3VycmVudDtcbiAgdGhpc1JlZi5wcm9wcyA9IHByb3BzO1xuICB0aGlzUmVmLmNvbnRleHQgPSBjb250ZXh0O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvbk1vdW50KHRoaXNSZWYpO1xuICB9LCBbY29udGV4dC5ldmVudE1hbmFnZXJdKTtcbiAgcmV0dXJuIHRoaXNSZWY7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLFxuICAgICAgICByZXN1bHQ7XG5cbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtcblxuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQdXJlQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sRGVmYXVsdFByb3BzLCBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi91c2UtbWFwLWNvbnRyb2wnO1xuXG5mdW5jdGlvbiBDb250cm9sKHByb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHByb3BzLmluc3RhbmNlO1xuXG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgaW5zdGFuY2UuX2NvbnRleHQgPSBjb250ZXh0O1xuICBpbnN0YW5jZS5fY29udGFpbmVyUmVmID0gY29udGFpbmVyUmVmO1xuICByZXR1cm4gaW5zdGFuY2UuX3JlbmRlcigpO1xufVxuXG52YXIgQmFzZUNvbnRyb2wgPSBmdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEJhc2VDb250cm9sLCBfUHVyZUNvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihCYXNlQ29udHJvbCk7XG5cbiAgZnVuY3Rpb24gQmFzZUNvbnRyb2woKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VDb250cm9sKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX2NvbnRleHRcIiwge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9jb250YWluZXJSZWZcIiwgY3JlYXRlUmVmKCkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vblNjcm9sbFwiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX29uRHJhZ1N0YXJ0XCIsIGZ1bmN0aW9uIChldnQpIHt9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfb25EYmxDbGlja1wiLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiX29uQ2xpY2tcIiwgZnVuY3Rpb24gKGV2dCkge30pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIl9vblBvaW50ZXJNb3ZlXCIsIGZ1bmN0aW9uIChldnQpIHt9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCYXNlQ29udHJvbCwgW3tcbiAgICBrZXk6IFwiX3JlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVuZGVyKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcmVuZGVyKCkgbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb250cm9sLCBfZXh0ZW5kcyh7XG4gICAgICAgIGluc3RhbmNlOiB0aGlzXG4gICAgICB9LCB0aGlzLnByb3BzLCB7XG4gICAgICAgIG9uU2Nyb2xsOiB0aGlzLl9vblNjcm9sbCxcbiAgICAgICAgb25EcmFnU3RhcnQ6IHRoaXMuX29uRHJhZ1N0YXJ0LFxuICAgICAgICBvbkRibENsaWNrOiB0aGlzLl9vbkRibENsaWNrLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLl9vbkNsaWNrLFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLl9vblBvaW50ZXJNb3ZlXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJhc2VDb250cm9sO1xufShQdXJlQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEJhc2VDb250cm9sLCBcInByb3BUeXBlc1wiLCBtYXBDb250cm9sUHJvcFR5cGVzKTtcblxuX2RlZmluZVByb3BlcnR5KEJhc2VDb250cm9sLCBcImRlZmF1bHRQcm9wc1wiLCBtYXBDb250cm9sRGVmYXVsdFByb3BzKTtcblxuZXhwb3J0IHsgQmFzZUNvbnRyb2wgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbmV4cG9ydCB2YXIgZHJhZ2dhYmxlQ29udHJvbFByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xQcm9wVHlwZXMsIHtcbiAgZHJhZ2dhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25EcmFnOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25EcmFnRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25EcmFnU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBvZmZzZXRMZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBvZmZzZXRUb3A6IFByb3BUeXBlcy5udW1iZXJcbn0pO1xuZXhwb3J0IHZhciBkcmFnZ2FibGVDb250cm9sRGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwQ29udHJvbERlZmF1bHRQcm9wcywge1xuICBkcmFnZ2FibGU6IGZhbHNlLFxuICBvZmZzZXRMZWZ0OiAwLFxuICBvZmZzZXRUb3A6IDBcbn0pO1xuXG5mdW5jdGlvbiBnZXREcmFnRXZlbnRQb3NpdGlvbihldmVudCkge1xuICB2YXIgX2V2ZW50JG9mZnNldENlbnRlciA9IGV2ZW50Lm9mZnNldENlbnRlcixcbiAgICAgIHggPSBfZXZlbnQkb2Zmc2V0Q2VudGVyLngsXG4gICAgICB5ID0gX2V2ZW50JG9mZnNldENlbnRlci55O1xuICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiBnZXREcmFnRXZlbnRPZmZzZXQoZXZlbnQsIGNvbnRhaW5lcikge1xuICB2YXIgX2V2ZW50JGNlbnRlciA9IGV2ZW50LmNlbnRlcixcbiAgICAgIHggPSBfZXZlbnQkY2VudGVyLngsXG4gICAgICB5ID0gX2V2ZW50JGNlbnRlci55O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gW3JlY3QubGVmdCAtIHgsIHJlY3QudG9wIC0geV07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RHJhZ0xuZ0xhdChkcmFnUG9zLCBkcmFnT2Zmc2V0LCBwcm9wcywgY29udGV4dCkge1xuICB2YXIgeCA9IGRyYWdQb3NbMF0gKyBkcmFnT2Zmc2V0WzBdIC0gcHJvcHMub2Zmc2V0TGVmdDtcbiAgdmFyIHkgPSBkcmFnUG9zWzFdICsgZHJhZ09mZnNldFsxXSAtIHByb3BzLm9mZnNldFRvcDtcbiAgcmV0dXJuIGNvbnRleHQudmlld3BvcnQudW5wcm9qZWN0KFt4LCB5XSk7XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGV2ZW50LCBfcmVmKSB7XG4gIHZhciBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICBjYWxsYmFja3MgPSBfcmVmLmNhbGxiYWNrcyxcbiAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfcmVmLmNvbnRhaW5lclJlZjtcbiAgdmFyIGRyYWdnYWJsZSA9IHByb3BzLmRyYWdnYWJsZTtcblxuICBpZiAoIWRyYWdnYWJsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB2YXIgZHJhZ1BvcyA9IGdldERyYWdFdmVudFBvc2l0aW9uKGV2ZW50KTtcbiAgdmFyIGRyYWdPZmZzZXQgPSBnZXREcmFnRXZlbnRPZmZzZXQoZXZlbnQsIGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgc3RhdGUuc2V0RHJhZ1BvcyhkcmFnUG9zKTtcbiAgc3RhdGUuc2V0RHJhZ09mZnNldChkcmFnT2Zmc2V0KTtcblxuICBpZiAoY2FsbGJhY2tzLm9uRHJhZ1N0YXJ0ICYmIGRyYWdPZmZzZXQpIHtcbiAgICB2YXIgY2FsbGJhY2tFdmVudCA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50KTtcbiAgICBjYWxsYmFja0V2ZW50LmxuZ0xhdCA9IGdldERyYWdMbmdMYXQoZHJhZ1BvcywgZHJhZ09mZnNldCwgcHJvcHMsIGNvbnRleHQpO1xuICAgIGNhbGxiYWNrcy5vbkRyYWdTdGFydChjYWxsYmFja0V2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkRyYWcoZXZlbnQsIF9yZWYyKSB7XG4gIHZhciBwcm9wcyA9IF9yZWYyLnByb3BzLFxuICAgICAgY2FsbGJhY2tzID0gX3JlZjIuY2FsbGJhY2tzLFxuICAgICAgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIGNvbnRleHQgPSBfcmVmMi5jb250ZXh0O1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgdmFyIGRyYWdQb3MgPSBnZXREcmFnRXZlbnRQb3NpdGlvbihldmVudCk7XG4gIHN0YXRlLnNldERyYWdQb3MoZHJhZ1Bvcyk7XG4gIHZhciBkcmFnT2Zmc2V0ID0gc3RhdGUuZHJhZ09mZnNldDtcblxuICBpZiAoY2FsbGJhY2tzLm9uRHJhZyAmJiBkcmFnT2Zmc2V0KSB7XG4gICAgdmFyIGNhbGxiYWNrRXZlbnQgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudCk7XG4gICAgY2FsbGJhY2tFdmVudC5sbmdMYXQgPSBnZXREcmFnTG5nTGF0KGRyYWdQb3MsIGRyYWdPZmZzZXQsIHByb3BzLCBjb250ZXh0KTtcbiAgICBjYWxsYmFja3Mub25EcmFnKGNhbGxiYWNrRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ0VuZChldmVudCwgX3JlZjMpIHtcbiAgdmFyIHByb3BzID0gX3JlZjMucHJvcHMsXG4gICAgICBjYWxsYmFja3MgPSBfcmVmMy5jYWxsYmFja3MsXG4gICAgICBzdGF0ZSA9IF9yZWYzLnN0YXRlLFxuICAgICAgY29udGV4dCA9IF9yZWYzLmNvbnRleHQ7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB2YXIgZHJhZ1BvcyA9IHN0YXRlLmRyYWdQb3MsXG4gICAgICBkcmFnT2Zmc2V0ID0gc3RhdGUuZHJhZ09mZnNldDtcbiAgc3RhdGUuc2V0RHJhZ1BvcyhudWxsKTtcbiAgc3RhdGUuc2V0RHJhZ09mZnNldChudWxsKTtcblxuICBpZiAoY2FsbGJhY2tzLm9uRHJhZ0VuZCAmJiBkcmFnUG9zICYmIGRyYWdPZmZzZXQpIHtcbiAgICB2YXIgY2FsbGJhY2tFdmVudCA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50KTtcbiAgICBjYWxsYmFja0V2ZW50LmxuZ0xhdCA9IGdldERyYWdMbmdMYXQoZHJhZ1BvcywgZHJhZ09mZnNldCwgcHJvcHMsIGNvbnRleHQpO1xuICAgIGNhbGxiYWNrcy5vbkRyYWdFbmQoY2FsbGJhY2tFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25EcmFnQ2FuY2VsKGV2ZW50LCBfcmVmNCkge1xuICB2YXIgc3RhdGUgPSBfcmVmNC5zdGF0ZTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIHN0YXRlLnNldERyYWdQb3MobnVsbCk7XG4gIHN0YXRlLnNldERyYWdPZmZzZXQobnVsbCk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKHRoaXNSZWYpIHtcbiAgdmFyIGV2ZW50TWFuYWdlciA9IHRoaXNSZWYuY29udGV4dC5ldmVudE1hbmFnZXI7XG5cbiAgaWYgKCFldmVudE1hbmFnZXIgfHwgIXRoaXNSZWYuc3RhdGUuZHJhZ1Bvcykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZXZlbnRzID0ge1xuICAgIHBhbm1vdmU6IGZ1bmN0aW9uIHBhbm1vdmUoZXZ0KSB7XG4gICAgICByZXR1cm4gb25EcmFnKGV2dCwgdGhpc1JlZik7XG4gICAgfSxcbiAgICBwYW5lbmQ6IGZ1bmN0aW9uIHBhbmVuZChldnQpIHtcbiAgICAgIHJldHVybiBvbkRyYWdFbmQoZXZ0LCB0aGlzUmVmKTtcbiAgICB9LFxuICAgIHBhbmNhbmNlbDogZnVuY3Rpb24gcGFuY2FuY2VsKGV2dCkge1xuICAgICAgcmV0dXJuIG9uRHJhZ0NhbmNlbChldnQsIHRoaXNSZWYpO1xuICAgIH1cbiAgfTtcbiAgZXZlbnRNYW5hZ2VyLndhdGNoKGV2ZW50cyk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZXZlbnRNYW5hZ2VyLm9mZihldmVudHMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEcmFnZ2FibGVDb250cm9sKHByb3BzKSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgZHJhZ1BvcyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXREcmFnUG9zID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgZHJhZ09mZnNldCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXREcmFnT2Zmc2V0ID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgdGhpc1JlZiA9IHVzZU1hcENvbnRyb2woX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgb25EcmFnU3RhcnQ6IG9uRHJhZ1N0YXJ0XG4gIH0pKTtcbiAgdGhpc1JlZi5jYWxsYmFja3MgPSBwcm9wcztcbiAgdGhpc1JlZi5zdGF0ZS5kcmFnUG9zID0gZHJhZ1BvcztcbiAgdGhpc1JlZi5zdGF0ZS5zZXREcmFnUG9zID0gc2V0RHJhZ1BvcztcbiAgdGhpc1JlZi5zdGF0ZS5kcmFnT2Zmc2V0ID0gZHJhZ09mZnNldDtcbiAgdGhpc1JlZi5zdGF0ZS5zZXREcmFnT2Zmc2V0ID0gc2V0RHJhZ09mZnNldDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmVnaXN0ZXJFdmVudHModGhpc1JlZik7XG4gIH0sIFt0aGlzUmVmLmNvbnRleHQuZXZlbnRNYW5hZ2VyLCBCb29sZWFuKGRyYWdQb3MpXSk7XG4gIHJldHVybiB0aGlzUmVmO1xufSIsInZhciBwaXhlbFJhdGlvID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbmV4cG9ydCB2YXIgY3Jpc3BQaXhlbCA9IGZ1bmN0aW9uIGNyaXNwUGl4ZWwoc2l6ZSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChzaXplICogcGl4ZWxSYXRpbykgLyBwaXhlbFJhdGlvO1xufTtcbmV4cG9ydCB2YXIgY3Jpc3BQZXJjZW50YWdlID0gZnVuY3Rpb24gY3Jpc3BQZXJjZW50YWdlKGVsLCBwZXJjZW50YWdlKSB7XG4gIHZhciBkaW1lbnNpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICd4JztcblxuICBpZiAoZWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gcGVyY2VudGFnZTtcbiAgfVxuXG4gIHZhciBvcmlnU2l6ZSA9IGRpbWVuc2lvbiA9PT0gJ3gnID8gZWwub2Zmc2V0V2lkdGggOiBlbC5vZmZzZXRIZWlnaHQ7XG4gIHJldHVybiBjcmlzcFBpeGVsKHBlcmNlbnRhZ2UgLyAxMDAgKiBvcmlnU2l6ZSkgLyBvcmlnU2l6ZSAqIDEwMDtcbn07IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZURyYWdnYWJsZUNvbnRyb2wsIHsgZHJhZ2dhYmxlQ29udHJvbERlZmF1bHRQcm9wcywgZHJhZ2dhYmxlQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vZHJhZ2dhYmxlLWNvbnRyb2wnO1xuaW1wb3J0IHsgY3Jpc3BQaXhlbCB9IGZyb20gJy4uL3V0aWxzL2NyaXNwLXBpeGVsJztcbmltcG9ydCB7IGdldFRlcnJhaW5FbGV2YXRpb24gfSBmcm9tICcuLi91dGlscy90ZXJyYWluJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBkcmFnZ2FibGVDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJydcbn0pO1xuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihfcmVmKSB7XG4gIHZhciBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBjb250ZXh0ID0gX3JlZi5jb250ZXh0O1xuICB2YXIgbG9uZ2l0dWRlID0gcHJvcHMubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGUgPSBwcm9wcy5sYXRpdHVkZSxcbiAgICAgIG9mZnNldExlZnQgPSBwcm9wcy5vZmZzZXRMZWZ0LFxuICAgICAgb2Zmc2V0VG9wID0gcHJvcHMub2Zmc2V0VG9wO1xuICB2YXIgZHJhZ1BvcyA9IHN0YXRlLmRyYWdQb3MsXG4gICAgICBkcmFnT2Zmc2V0ID0gc3RhdGUuZHJhZ09mZnNldDtcbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIG1hcCA9IGNvbnRleHQubWFwO1xuXG4gIGlmIChkcmFnUG9zICYmIGRyYWdPZmZzZXQpIHtcbiAgICByZXR1cm4gW2RyYWdQb3NbMF0gKyBkcmFnT2Zmc2V0WzBdLCBkcmFnUG9zWzFdICsgZHJhZ09mZnNldFsxXV07XG4gIH1cblxuICB2YXIgYWx0aXR1ZGUgPSBnZXRUZXJyYWluRWxldmF0aW9uKG1hcCwge1xuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZVxuICB9KTtcblxuICB2YXIgX3ZpZXdwb3J0JHByb2plY3QgPSB2aWV3cG9ydC5wcm9qZWN0KFtsb25naXR1ZGUsIGxhdGl0dWRlLCBhbHRpdHVkZV0pLFxuICAgICAgX3ZpZXdwb3J0JHByb2plY3QyID0gX3NsaWNlZFRvQXJyYXkoX3ZpZXdwb3J0JHByb2plY3QsIDIpLFxuICAgICAgeCA9IF92aWV3cG9ydCRwcm9qZWN0MlswXSxcbiAgICAgIHkgPSBfdmlld3BvcnQkcHJvamVjdDJbMV07XG5cbiAgeCArPSBvZmZzZXRMZWZ0O1xuICB5ICs9IG9mZnNldFRvcDtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZnVuY3Rpb24gTWFya2VyKHByb3BzKSB7XG4gIHZhciB0aGlzUmVmID0gdXNlRHJhZ2dhYmxlQ29udHJvbChwcm9wcyk7XG4gIHZhciBzdGF0ZSA9IHRoaXNSZWYuc3RhdGUsXG4gICAgICBjb250YWluZXJSZWYgPSB0aGlzUmVmLmNvbnRhaW5lclJlZjtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBkcmFnZ2FibGUgPSBwcm9wcy5kcmFnZ2FibGU7XG4gIHZhciBkcmFnUG9zID0gc3RhdGUuZHJhZ1BvcztcblxuICB2YXIgX2dldFBvc2l0aW9uID0gZ2V0UG9zaXRpb24odGhpc1JlZiksXG4gICAgICBfZ2V0UG9zaXRpb24yID0gX3NsaWNlZFRvQXJyYXkoX2dldFBvc2l0aW9uLCAyKSxcbiAgICAgIHggPSBfZ2V0UG9zaXRpb24yWzBdLFxuICAgICAgeSA9IF9nZXRQb3NpdGlvbjJbMV07XG5cbiAgdmFyIHRyYW5zZm9ybSA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdChjcmlzcFBpeGVsKHgpLCBcInB4LCBcIikuY29uY2F0KGNyaXNwUGl4ZWwoeSksIFwicHgpXCIpO1xuICB2YXIgY3Vyc29yID0gZHJhZ2dhYmxlID8gZHJhZ1BvcyA/ICdncmFiYmluZycgOiAnZ3JhYicgOiAnYXV0byc7XG4gIHZhciBjb250cm9sID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRhaW5lclN0eWxlID0ge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICBjdXJzb3I6IGN1cnNvclxuICAgIH07XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLW1hcmtlciBcIi5jb25jYXQoY2xhc3NOYW1lKSxcbiAgICAgIHJlZjogdGhpc1JlZi5jb250YWluZXJSZWYsXG4gICAgICBzdHlsZTogY29udGFpbmVyU3R5bGVcbiAgICB9LCBjaGlsZHJlbik7XG4gIH0sIFtjaGlsZHJlbiwgY2xhc3NOYW1lXSk7XG4gIHZhciBjb250YWluZXIgPSBjb250YWluZXJSZWYuY3VycmVudDtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBjb250YWluZXIuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2w7XG59XG5cbk1hcmtlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKE1hcmtlcik7IiwiZXhwb3J0IHZhciBBTkNIT1JfUE9TSVRJT04gPSB7XG4gIHRvcDoge1xuICAgIHg6IDAuNSxcbiAgICB5OiAwXG4gIH0sXG4gICd0b3AtbGVmdCc6IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfSxcbiAgJ3RvcC1yaWdodCc6IHtcbiAgICB4OiAxLFxuICAgIHk6IDBcbiAgfSxcbiAgYm90dG9tOiB7XG4gICAgeDogMC41LFxuICAgIHk6IDFcbiAgfSxcbiAgJ2JvdHRvbS1sZWZ0Jzoge1xuICAgIHg6IDAsXG4gICAgeTogMVxuICB9LFxuICAnYm90dG9tLXJpZ2h0Jzoge1xuICAgIHg6IDEsXG4gICAgeTogMVxuICB9LFxuICBsZWZ0OiB7XG4gICAgeDogMCxcbiAgICB5OiAwLjVcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICB4OiAxLFxuICAgIHk6IDAuNVxuICB9XG59O1xudmFyIEFOQ0hPUl9UWVBFUyA9IE9iamVjdC5rZXlzKEFOQ0hPUl9QT1NJVElPTik7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RHluYW1pY1Bvc2l0aW9uKF9yZWYpIHtcbiAgdmFyIHggPSBfcmVmLngsXG4gICAgICB5ID0gX3JlZi55LFxuICAgICAgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgICBzZWxmV2lkdGggPSBfcmVmLnNlbGZXaWR0aCxcbiAgICAgIHNlbGZIZWlnaHQgPSBfcmVmLnNlbGZIZWlnaHQsXG4gICAgICBhbmNob3IgPSBfcmVmLmFuY2hvcixcbiAgICAgIF9yZWYkcGFkZGluZyA9IF9yZWYucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfcmVmJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHBhZGRpbmc7XG4gIHZhciBfQU5DSE9SX1BPU0lUSU9OJGFuY2ggPSBBTkNIT1JfUE9TSVRJT05bYW5jaG9yXSxcbiAgICAgIGFuY2hvclggPSBfQU5DSE9SX1BPU0lUSU9OJGFuY2gueCxcbiAgICAgIGFuY2hvclkgPSBfQU5DSE9SX1BPU0lUSU9OJGFuY2gueTtcbiAgdmFyIHRvcCA9IHkgLSBhbmNob3JZICogc2VsZkhlaWdodDtcbiAgdmFyIGJvdHRvbSA9IHRvcCArIHNlbGZIZWlnaHQ7XG4gIHZhciBjdXRvZmZZID0gTWF0aC5tYXgoMCwgcGFkZGluZyAtIHRvcCkgKyBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQgKyBwYWRkaW5nKTtcblxuICBpZiAoY3V0b2ZmWSA+IDApIHtcbiAgICB2YXIgYmVzdEFuY2hvclkgPSBhbmNob3JZO1xuICAgIHZhciBtaW5DdXRvZmYgPSBjdXRvZmZZO1xuXG4gICAgZm9yIChhbmNob3JZID0gMDsgYW5jaG9yWSA8PSAxOyBhbmNob3JZICs9IDAuNSkge1xuICAgICAgdG9wID0geSAtIGFuY2hvclkgKiBzZWxmSGVpZ2h0O1xuICAgICAgYm90dG9tID0gdG9wICsgc2VsZkhlaWdodDtcbiAgICAgIGN1dG9mZlkgPSBNYXRoLm1heCgwLCBwYWRkaW5nIC0gdG9wKSArIE1hdGgubWF4KDAsIGJvdHRvbSAtIGhlaWdodCArIHBhZGRpbmcpO1xuXG4gICAgICBpZiAoY3V0b2ZmWSA8IG1pbkN1dG9mZikge1xuICAgICAgICBtaW5DdXRvZmYgPSBjdXRvZmZZO1xuICAgICAgICBiZXN0QW5jaG9yWSA9IGFuY2hvclk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYW5jaG9yWSA9IGJlc3RBbmNob3JZO1xuICB9XG5cbiAgdmFyIHhTdGVwID0gMC41O1xuXG4gIGlmIChhbmNob3JZID09PSAwLjUpIHtcbiAgICBhbmNob3JYID0gTWF0aC5mbG9vcihhbmNob3JYKTtcbiAgICB4U3RlcCA9IDE7XG4gIH1cblxuICB2YXIgbGVmdCA9IHggLSBhbmNob3JYICogc2VsZldpZHRoO1xuICB2YXIgcmlnaHQgPSBsZWZ0ICsgc2VsZldpZHRoO1xuICB2YXIgY3V0b2ZmWCA9IE1hdGgubWF4KDAsIHBhZGRpbmcgLSBsZWZ0KSArIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGggKyBwYWRkaW5nKTtcblxuICBpZiAoY3V0b2ZmWCA+IDApIHtcbiAgICB2YXIgYmVzdEFuY2hvclggPSBhbmNob3JYO1xuICAgIHZhciBfbWluQ3V0b2ZmID0gY3V0b2ZmWDtcblxuICAgIGZvciAoYW5jaG9yWCA9IDA7IGFuY2hvclggPD0gMTsgYW5jaG9yWCArPSB4U3RlcCkge1xuICAgICAgbGVmdCA9IHggLSBhbmNob3JYICogc2VsZldpZHRoO1xuICAgICAgcmlnaHQgPSBsZWZ0ICsgc2VsZldpZHRoO1xuICAgICAgY3V0b2ZmWCA9IE1hdGgubWF4KDAsIHBhZGRpbmcgLSBsZWZ0KSArIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGggKyBwYWRkaW5nKTtcblxuICAgICAgaWYgKGN1dG9mZlggPCBfbWluQ3V0b2ZmKSB7XG4gICAgICAgIF9taW5DdXRvZmYgPSBjdXRvZmZYO1xuICAgICAgICBiZXN0QW5jaG9yWCA9IGFuY2hvclg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYW5jaG9yWCA9IGJlc3RBbmNob3JYO1xuICB9XG5cbiAgcmV0dXJuIEFOQ0hPUl9UWVBFUy5maW5kKGZ1bmN0aW9uIChwb3NpdGlvblR5cGUpIHtcbiAgICB2YXIgYW5jaG9yUG9zaXRpb24gPSBBTkNIT1JfUE9TSVRJT05bcG9zaXRpb25UeXBlXTtcbiAgICByZXR1cm4gYW5jaG9yUG9zaXRpb24ueCA9PT0gYW5jaG9yWCAmJiBhbmNob3JQb3NpdGlvbi55ID09PSBhbmNob3JZO1xuICB9KSB8fCBhbmNob3I7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sRGVmYXVsdFByb3BzLCBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi91c2UtbWFwLWNvbnRyb2wnO1xuaW1wb3J0IHsgZ2V0RHluYW1pY1Bvc2l0aW9uLCBBTkNIT1JfUE9TSVRJT04gfSBmcm9tICcuLi91dGlscy9keW5hbWljLXBvc2l0aW9uJztcbmltcG9ydCB7IGdldFRlcnJhaW5FbGV2YXRpb24gfSBmcm9tICcuLi91dGlscy90ZXJyYWluJztcbmltcG9ydCB7IGNyaXNwUGVyY2VudGFnZSwgY3Jpc3BQaXhlbCB9IGZyb20gJy4uL3V0aWxzL2NyaXNwLXBpeGVsJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIG9mZnNldExlZnQ6IDAsXG4gIG9mZnNldFRvcDogMCxcbiAgdGlwU2l6ZTogMTAsXG4gIGFuY2hvcjogJ2JvdHRvbScsXG4gIGR5bmFtaWNQb3NpdGlvbjogdHJ1ZSxcbiAgc29ydEJ5RGVwdGg6IGZhbHNlLFxuICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgY2xvc2VPbkNsaWNrOiB0cnVlLFxuICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKCkge31cbn0pO1xuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihwcm9wcywgdmlld3BvcnQsIGVsLCBfcmVmKSB7XG4gIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgeCA9IF9yZWYyWzBdLFxuICAgICAgeSA9IF9yZWYyWzFdO1xuXG4gIHZhciBhbmNob3IgPSBwcm9wcy5hbmNob3IsXG4gICAgICBkeW5hbWljUG9zaXRpb24gPSBwcm9wcy5keW5hbWljUG9zaXRpb24sXG4gICAgICB0aXBTaXplID0gcHJvcHMudGlwU2l6ZTtcblxuICBpZiAoZWwpIHtcbiAgICByZXR1cm4gZHluYW1pY1Bvc2l0aW9uID8gZ2V0RHluYW1pY1Bvc2l0aW9uKHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5LFxuICAgICAgYW5jaG9yOiBhbmNob3IsXG4gICAgICBwYWRkaW5nOiB0aXBTaXplLFxuICAgICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgICBzZWxmV2lkdGg6IGVsLmNsaWVudFdpZHRoLFxuICAgICAgc2VsZkhlaWdodDogZWwuY2xpZW50SGVpZ2h0XG4gICAgfSkgOiBhbmNob3I7XG4gIH1cblxuICByZXR1cm4gYW5jaG9yO1xufVxuXG5mdW5jdGlvbiBnZXRDb250YWluZXJTdHlsZShwcm9wcywgdmlld3BvcnQsIGVsLCBfcmVmMywgcG9zaXRpb25UeXBlKSB7XG4gIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAzKSxcbiAgICAgIHggPSBfcmVmNFswXSxcbiAgICAgIHkgPSBfcmVmNFsxXSxcbiAgICAgIHogPSBfcmVmNFsyXTtcblxuICB2YXIgb2Zmc2V0TGVmdCA9IHByb3BzLm9mZnNldExlZnQsXG4gICAgICBvZmZzZXRUb3AgPSBwcm9wcy5vZmZzZXRUb3AsXG4gICAgICBzb3J0QnlEZXB0aCA9IHByb3BzLnNvcnRCeURlcHRoO1xuICB2YXIgYW5jaG9yUG9zaXRpb24gPSBBTkNIT1JfUE9TSVRJT05bcG9zaXRpb25UeXBlXTtcbiAgdmFyIGxlZnQgPSB4ICsgb2Zmc2V0TGVmdDtcbiAgdmFyIHRvcCA9IHkgKyBvZmZzZXRUb3A7XG4gIHZhciB4UGVyY2VudGFnZSA9IGNyaXNwUGVyY2VudGFnZShlbCwgLWFuY2hvclBvc2l0aW9uLnggKiAxMDApO1xuICB2YXIgeVBlcmNlbnRhZ2UgPSBjcmlzcFBlcmNlbnRhZ2UoZWwsIC1hbmNob3JQb3NpdGlvbi55ICogMTAwLCAneScpO1xuICB2YXIgc3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdHJhbnNmb3JtOiBcIlxcbiAgICAgIHRyYW5zbGF0ZShcIi5jb25jYXQoeFBlcmNlbnRhZ2UsIFwiJSwgXCIpLmNvbmNhdCh5UGVyY2VudGFnZSwgXCIlKVxcbiAgICAgIHRyYW5zbGF0ZShcIikuY29uY2F0KGNyaXNwUGl4ZWwobGVmdCksIFwicHgsIFwiKS5jb25jYXQoY3Jpc3BQaXhlbCh0b3ApLCBcInB4KVxcbiAgICBcIiksXG4gICAgZGlzcGxheTogdW5kZWZpbmVkLFxuICAgIHpJbmRleDogdW5kZWZpbmVkXG4gIH07XG5cbiAgaWYgKCFzb3J0QnlEZXB0aCkge1xuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIGlmICh6ID4gMSB8fCB6IDwgLTEgfHwgeCA8IDAgfHwgeCA+IHZpZXdwb3J0LndpZHRoIHx8IHkgPCAwIHx8IHkgPiB2aWV3cG9ydC5oZWlnaHQpIHtcbiAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLnpJbmRleCA9IE1hdGguZmxvb3IoKDEgLSB6KSAvIDIgKiAxMDAwMDApO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG5mdW5jdGlvbiBvbkNsaWNrKGV2dCwgX3JlZjUpIHtcbiAgdmFyIHByb3BzID0gX3JlZjUucHJvcHMsXG4gICAgICBjb250ZXh0ID0gX3JlZjUuY29udGV4dDtcblxuICBpZiAocHJvcHMuY2xvc2VPbkNsaWNrIHx8IGV2dC50YXJnZXQuY2xhc3NOYW1lID09PSAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJykge1xuICAgIHByb3BzLm9uQ2xvc2UoKTtcblxuICAgIGlmIChjb250ZXh0LmV2ZW50TWFuYWdlcikge1xuICAgICAgY29udGV4dC5ldmVudE1hbmFnZXIub25jZSgnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sIGV2dC50YXJnZXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBQb3B1cChwcm9wcykge1xuICB2YXIgY29udGVudFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHRoaXNSZWYgPSB1c2VNYXBDb250cm9sKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2tcbiAgfSkpO1xuICB2YXIgY29udGV4dCA9IHRoaXNSZWYuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IHRoaXNSZWYuY29udGFpbmVyUmVmO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHNldExvYWRlZCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRMb2FkZWQodHJ1ZSk7XG4gIH0sIFtjb250ZW50UmVmLmN1cnJlbnRdKTtcbiAgdmFyIHZpZXdwb3J0ID0gY29udGV4dC52aWV3cG9ydCxcbiAgICAgIG1hcCA9IGNvbnRleHQubWFwO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgbG9uZ2l0dWRlID0gcHJvcHMubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGUgPSBwcm9wcy5sYXRpdHVkZSxcbiAgICAgIHRpcFNpemUgPSBwcm9wcy50aXBTaXplLFxuICAgICAgY2xvc2VCdXR0b24gPSBwcm9wcy5jbG9zZUJ1dHRvbixcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBhbHRpdHVkZSA9IHByb3BzLmFsdGl0dWRlO1xuXG4gIGlmIChhbHRpdHVkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYWx0aXR1ZGUgPSBnZXRUZXJyYWluRWxldmF0aW9uKG1hcCwge1xuICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZTogbGF0aXR1ZGVcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBwb3NpdGlvbiA9IHZpZXdwb3J0LnByb2plY3QoW2xvbmdpdHVkZSwgbGF0aXR1ZGUsIGFsdGl0dWRlXSk7XG4gIHZhciBwb3NpdGlvblR5cGUgPSBnZXRQb3NpdGlvbihwcm9wcywgdmlld3BvcnQsIGNvbnRlbnRSZWYuY3VycmVudCwgcG9zaXRpb24pO1xuICB2YXIgY29udGFpbmVyU3R5bGUgPSBnZXRDb250YWluZXJTdHlsZShwcm9wcywgdmlld3BvcnQsIGNvbnRhaW5lclJlZi5jdXJyZW50LCBwb3NpdGlvbiwgcG9zaXRpb25UeXBlKTtcbiAgdmFyIG9uUmVhY3RDbGljayA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICFjb250ZXh0LmV2ZW50TWFuYWdlciAmJiBvbkNsaWNrKGUsIHRoaXNSZWYpO1xuICB9LCBbY29udGV4dC5ldmVudE1hbmFnZXJdKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1wb3B1cCBtYXBib3hnbC1wb3B1cC1hbmNob3ItXCIuY29uY2F0KHBvc2l0aW9uVHlwZSwgXCIgXCIpLmNvbmNhdChjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBjb250YWluZXJTdHlsZSxcbiAgICByZWY6IGNvbnRhaW5lclJlZlxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwidGlwXCIsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLXBvcHVwLXRpcFwiLFxuICAgIHN0eWxlOiB7XG4gICAgICBib3JkZXJXaWR0aDogdGlwU2l6ZVxuICAgIH1cbiAgfSksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJjb250ZW50XCIsXG4gICAgcmVmOiBjb250ZW50UmVmLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1wb3B1cC1jb250ZW50XCIsXG4gICAgb25DbGljazogb25SZWFjdENsaWNrXG4gIH0sIGNsb3NlQnV0dG9uICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGtleTogXCJjbG9zZS1idXR0b25cIixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uXCIsXG4gICAgdHlwZTogXCJidXR0b25cIlxuICB9LCBcIlxceEQ3XCIpLCBjaGlsZHJlbikpO1xufVxuXG5Qb3B1cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKFBvcHVwKTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlU3RhdGUsIHVzZVJlZiwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYXBib3hnbCBmcm9tICcuLi91dGlscy9tYXBib3hnbCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sRGVmYXVsdFByb3BzLCBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi91c2UtbWFwLWNvbnRyb2wnO1xudmFyIGRlZmF1bHRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIHtcbiAgY2xhc3NOYW1lOiAnJyxcbiAgdG9nZ2xlTGFiZWw6ICdUb2dnbGUgQXR0cmlidXRpb24nXG59KTtcblxuZnVuY3Rpb24gc2V0dXBBdHRyaWJ1dGlvbmNvbnRyb2wob3B0cywgbWFwLCBjb250YWluZXIsIGF0dHJpYnV0aW9uQ29udGFpbmVyKSB7XG4gIHZhciBjb250cm9sID0gbmV3IG1hcGJveGdsLkF0dHJpYnV0aW9uQ29udHJvbChvcHRzKTtcbiAgY29udHJvbC5fbWFwID0gbWFwO1xuICBjb250cm9sLl9jb250YWluZXIgPSBjb250YWluZXI7XG4gIGNvbnRyb2wuX2lubmVyQ29udGFpbmVyID0gYXR0cmlidXRpb25Db250YWluZXI7XG5cbiAgY29udHJvbC5fdXBkYXRlQXR0cmlidXRpb25zKCk7XG5cbiAgY29udHJvbC5fdXBkYXRlRWRpdExpbmsoKTtcblxuICBtYXAub24oJ3N0eWxlZGF0YScsIGNvbnRyb2wuX3VwZGF0ZURhdGEpO1xuICBtYXAub24oJ3NvdXJjZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcbiAgcmV0dXJuIGNvbnRyb2w7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0aW9uQ29udHJvbChjb250cm9sKSB7XG4gIGNvbnRyb2wuX21hcC5vZmYoJ3N0eWxlZGF0YScsIGNvbnRyb2wuX3VwZGF0ZURhdGEpO1xuXG4gIGNvbnRyb2wuX21hcC5vZmYoJ3NvdXJjZWRhdGEnLCBjb250cm9sLl91cGRhdGVEYXRhKTtcbn1cblxuZnVuY3Rpb24gQXR0cmlidXRpb25Db250cm9sKHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIGlubmVyQ29udGFpbmVyUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHNob3dDb21wYWN0ID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldFNob3dDb21wYWN0ID0gX3VzZVN0YXRlMlsxXTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250cm9sO1xuXG4gICAgaWYgKGNvbnRleHQubWFwKSB7XG4gICAgICBjb250cm9sID0gc2V0dXBBdHRyaWJ1dGlvbmNvbnRyb2woe1xuICAgICAgICBjdXN0b21BdHRyaWJ1dGlvbjogcHJvcHMuY3VzdG9tQXR0cmlidXRpb25cbiAgICAgIH0sIGNvbnRleHQubWFwLCBjb250YWluZXJSZWYuY3VycmVudCwgaW5uZXJDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb250cm9sICYmIHJlbW92ZUF0dHJpYnV0aW9uQ29udHJvbChjb250cm9sKTtcbiAgICB9O1xuICB9LCBbY29udGV4dC5tYXBdKTtcbiAgdmFyIGNvbXBhY3QgPSBwcm9wcy5jb21wYWN0ID09PSB1bmRlZmluZWQgPyBjb250ZXh0LnZpZXdwb3J0LndpZHRoIDw9IDY0MCA6IHByb3BzLmNvbXBhY3Q7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFjb21wYWN0ICYmIHNob3dDb21wYWN0KSB7XG4gICAgICBzZXRTaG93Q29tcGFjdChmYWxzZSk7XG4gICAgfVxuICB9LCBbY29tcGFjdF0pO1xuICB2YXIgdG9nZ2xlQXR0cmlidXRpb24gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNldFNob3dDb21wYWN0KGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICB9KTtcbiAgfSwgW10pO1xuICB2YXIgc3R5bGUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sIHByb3BzLnN0eWxlKTtcbiAgfSwgW3Byb3BzLnN0eWxlXSk7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWVcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgXCJhcmlhLXByZXNzZWRcIjogc2hvd0NvbXBhY3QsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1hdHRyaWIgXCIuY29uY2F0KGNvbXBhY3QgPyAnbWFwYm94Z2wtY29tcGFjdCcgOiAnJywgXCIgXCIpLmNvbmNhdChzaG93Q29tcGFjdCA/ICdtYXBib3hnbC1jb21wYWN0LXNob3cnIDogJycpXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtYXR0cmliLWJ1dHRvblwiLFxuICAgIHRpdGxlOiBwcm9wcy50b2dnbGVMYWJlbCxcbiAgICBvbkNsaWNrOiB0b2dnbGVBdHRyaWJ1dGlvblxuICB9KSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBpbm5lckNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1hdHRyaWItaW5uZXJcIixcbiAgICByb2xlOiBcImxpc3RcIlxuICB9KSkpO1xufVxuXG5BdHRyaWJ1dGlvbkNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhBdHRyaWJ1dGlvbkNvbnRyb2wpOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgeyBkb2N1bWVudCB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYXBib3hnbCBmcm9tICcuLi91dGlscy9tYXBib3hnbCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sRGVmYXVsdFByb3BzLCBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi91c2UtbWFwLWNvbnRyb2wnO1xudmFyIGRlZmF1bHRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIHtcbiAgY2xhc3NOYW1lOiAnJyxcbiAgY29udGFpbmVyOiBudWxsLFxuICBsYWJlbDogJ1RvZ2dsZSBmdWxsc2NyZWVuJ1xufSk7XG5cbmZ1bmN0aW9uIEZ1bGxzY3JlZW5Db250cm9sKHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgaXNGdWxsc2NyZWVuID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldElzRnVsbHNjcmVlbiA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBzaG93QnV0dG9uID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldFNob3dCdXR0b24gPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgICBtYXBib3hGdWxsc2NyZWVuQ29udHJvbCA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICBjcmVhdGVNYXBib3hGdWxsc2NyZWVuQ29udHJvbCA9IF91c2VTdGF0ZTZbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udHJvbCA9IG5ldyBtYXBib3hnbC5GdWxsc2NyZWVuQ29udHJvbCgpO1xuICAgIGNyZWF0ZU1hcGJveEZ1bGxzY3JlZW5Db250cm9sKGNvbnRyb2wpO1xuICAgIHNldFNob3dCdXR0b24oY29udHJvbC5fY2hlY2tGdWxsc2NyZWVuU3VwcG9ydCgpKTtcblxuICAgIHZhciBvbkZ1bGxzY3JlZW5DaGFuZ2UgPSBmdW5jdGlvbiBvbkZ1bGxzY3JlZW5DaGFuZ2UoKSB7XG4gICAgICB2YXIgbmV4dFN0YXRlID0gIWNvbnRyb2wuX2Z1bGxzY3JlZW47XG4gICAgICBjb250cm9sLl9mdWxsc2NyZWVuID0gbmV4dFN0YXRlO1xuICAgICAgc2V0SXNGdWxsc2NyZWVuKG5leHRTdGF0ZSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoY29udHJvbC5fZnVsbHNjcmVlbmNoYW5nZSwgb25GdWxsc2NyZWVuQ2hhbmdlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihjb250cm9sLl9mdWxsc2NyZWVuY2hhbmdlLCBvbkZ1bGxzY3JlZW5DaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB2YXIgb25DbGlja0Z1bGxzY3JlZW4gPSBmdW5jdGlvbiBvbkNsaWNrRnVsbHNjcmVlbigpIHtcbiAgICBpZiAobWFwYm94RnVsbHNjcmVlbkNvbnRyb2wpIHtcbiAgICAgIG1hcGJveEZ1bGxzY3JlZW5Db250cm9sLl9jb250YWluZXIgPSBwcm9wcy5jb250YWluZXIgfHwgY29udGV4dC5jb250YWluZXI7XG5cbiAgICAgIG1hcGJveEZ1bGxzY3JlZW5Db250cm9sLl9vbkNsaWNrRnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3R5bGUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sIHByb3BzLnN0eWxlKTtcbiAgfSwgW3Byb3BzLnN0eWxlXSk7XG5cbiAgaWYgKCFzaG93QnV0dG9uKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbDtcbiAgdmFyIHR5cGUgPSBpc0Z1bGxzY3JlZW4gPyAnc2hyaW5rJyA6ICdmdWxsc2NyZWVuJztcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAga2V5OiB0eXBlLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb24gbWFwYm94Z2wtY3RybC1cIi5jb25jYXQodHlwZSksXG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICB0aXRsZTogbGFiZWwsXG4gICAgb25DbGljazogb25DbGlja0Z1bGxzY3JlZW5cbiAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWljb25cIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gIH0pKSkpO1xufVxuXG5GdWxsc2NyZWVuQ29udHJvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKEZ1bGxzY3JlZW5Db250cm9sKTsiLCJ2YXIgc3VwcG9ydGVkO1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvbG9jYXRpb25TdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydGVkKTtcbiAgfVxuXG4gIGlmICh3aW5kb3cubmF2aWdhdG9yLnBlcm1pc3Npb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICBuYW1lOiAnZ2VvbG9jYXRpb24nXG4gICAgfSkudGhlbihmdW5jdGlvbiAocCkge1xuICAgICAgc3VwcG9ydGVkID0gcC5zdGF0ZSAhPT0gJ2RlbmllZCc7XG4gICAgICByZXR1cm4gc3VwcG9ydGVkO1xuICAgIH0pO1xuICB9XG5cbiAgc3VwcG9ydGVkID0gQm9vbGVhbih3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdXBwb3J0ZWQpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCBtYXBib3hnbCBmcm9tICcuLi91dGlscy9tYXBib3hnbCc7XG5pbXBvcnQgTWFwU3RhdGUgZnJvbSAnLi4vdXRpbHMvbWFwLXN0YXRlJztcbmltcG9ydCB7IExJTkVBUl9UUkFOU0lUSU9OX1BST1BTIH0gZnJvbSAnLi4vdXRpbHMvbWFwLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgaXNHZW9sb2NhdGlvblN1cHBvcnRlZCB9IGZyb20gJy4uL3V0aWxzL2dlb2xvY2F0ZS11dGlscyc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sRGVmYXVsdFByb3BzLCBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi91c2UtbWFwLWNvbnRyb2wnO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG1hcENvbnRyb2xEZWZhdWx0UHJvcHMsIHtcbiAgY2xhc3NOYW1lOiAnJyxcbiAgbGFiZWw6ICdGaW5kIE15IExvY2F0aW9uJyxcbiAgZGlzYWJsZWRMYWJlbDogJ0xvY2F0aW9uIE5vdCBBdmFpbGFibGUnLFxuICBhdXRvOiBmYWxzZSxcbiAgcG9zaXRpb25PcHRpb25zOiB7XG4gICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSxcbiAgICB0aW1lb3V0OiA2MDAwXG4gIH0sXG4gIGZpdEJvdW5kc09wdGlvbnM6IHtcbiAgICBtYXhab29tOiAxNVxuICB9LFxuICB0cmFja1VzZXJMb2NhdGlvbjogZmFsc2UsXG4gIHNob3dVc2VyTG9jYXRpb246IHRydWUsXG4gIHNob3dBY2N1cmFjeUNpcmNsZTogdHJ1ZSxcbiAgb25HZW9sb2NhdGU6IGZ1bmN0aW9uIG9uR2VvbG9jYXRlKCkge31cbn0pO1xuXG5mdW5jdGlvbiBnZXRCb3VuZHMocG9zaXRpb24pIHtcbiAgdmFyIGNlbnRlciA9IG5ldyBtYXBib3hnbC5MbmdMYXQocG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlKTtcbiAgdmFyIHJhZGl1cyA9IHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeTtcbiAgdmFyIGJvdW5kcyA9IGNlbnRlci50b0JvdW5kcyhyYWRpdXMpO1xuICByZXR1cm4gW1tib3VuZHMuX25lLmxuZywgYm91bmRzLl9uZS5sYXRdLCBbYm91bmRzLl9zdy5sbmcsIGJvdW5kcy5fc3cubGF0XV07XG59XG5cbmZ1bmN0aW9uIHNldHVwTWFwYm94R2VvbG9jYXRlQ29udHJvbChjb250ZXh0LCBwcm9wcywgZ2VvbG9jYXRlQnV0dG9uKSB7XG4gIHZhciBjb250cm9sID0gbmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2wocHJvcHMpO1xuICBjb250cm9sLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY29udHJvbC5fbWFwID0ge1xuICAgIG9uOiBmdW5jdGlvbiBvbigpIHt9LFxuICAgIF9nZXRVSVN0cmluZzogZnVuY3Rpb24gX2dldFVJU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfTtcblxuICBjb250cm9sLl9zZXR1cFVJKHRydWUpO1xuXG4gIGNvbnRyb2wuX21hcCA9IGNvbnRleHQubWFwO1xuICBjb250cm9sLl9nZW9sb2NhdGVCdXR0b24gPSBnZW9sb2NhdGVCdXR0b247XG4gIHZhciBldmVudE1hbmFnZXIgPSBjb250ZXh0LmV2ZW50TWFuYWdlcjtcblxuICBpZiAoY29udHJvbC5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uICYmIGV2ZW50TWFuYWdlcikge1xuICAgIGV2ZW50TWFuYWdlci5vbigncGFuc3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY29udHJvbC5fd2F0Y2hTdGF0ZSA9PT0gJ0FDVElWRV9MT0NLJykge1xuICAgICAgICBjb250cm9sLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICBnZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICBnZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb250cm9sLm9uKCdnZW9sb2NhdGUnLCBwcm9wcy5vbkdlb2xvY2F0ZSk7XG4gIHJldHVybiBjb250cm9sO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYW1lcmEocG9zaXRpb24sIF9yZWYpIHtcbiAgdmFyIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsXG4gICAgICBwcm9wcyA9IF9yZWYucHJvcHM7XG4gIHZhciBib3VuZHMgPSBnZXRCb3VuZHMocG9zaXRpb24pO1xuXG4gIHZhciBfY29udGV4dCR2aWV3cG9ydCRmaXQgPSBjb250ZXh0LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHByb3BzLmZpdEJvdW5kc09wdGlvbnMpLFxuICAgICAgbG9uZ2l0dWRlID0gX2NvbnRleHQkdmlld3BvcnQkZml0LmxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlID0gX2NvbnRleHQkdmlld3BvcnQkZml0LmxhdGl0dWRlLFxuICAgICAgem9vbSA9IF9jb250ZXh0JHZpZXdwb3J0JGZpdC56b29tO1xuXG4gIHZhciBuZXdWaWV3U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0LnZpZXdwb3J0LCB7XG4gICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgIHpvb206IHpvb21cbiAgfSk7XG4gIHZhciBtYXBTdGF0ZSA9IG5ldyBNYXBTdGF0ZShuZXdWaWV3U3RhdGUpO1xuICB2YXIgdmlld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwU3RhdGUuZ2V0Vmlld3BvcnRQcm9wcygpLCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyk7XG4gIHZhciBvblZpZXdwb3J0Q2hhbmdlID0gcHJvcHMub25WaWV3cG9ydENoYW5nZSB8fCBjb250ZXh0Lm9uVmlld3BvcnRDaGFuZ2UgfHwgbm9vcDtcbiAgdmFyIG9uVmlld1N0YXRlQ2hhbmdlID0gcHJvcHMub25WaWV3U3RhdGVDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdTdGF0ZUNoYW5nZSB8fCBub29wO1xuICBvblZpZXdTdGF0ZUNoYW5nZSh7XG4gICAgdmlld1N0YXRlOiB2aWV3U3RhdGVcbiAgfSk7XG4gIG9uVmlld3BvcnRDaGFuZ2Uodmlld1N0YXRlKTtcbn1cblxuZnVuY3Rpb24gR2VvbG9jYXRlQ29udHJvbChwcm9wcykge1xuICB2YXIgdGhpc1JlZiA9IHVzZU1hcENvbnRyb2wocHJvcHMpO1xuICB2YXIgY29udGV4dCA9IHRoaXNSZWYuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IHRoaXNSZWYuY29udGFpbmVyUmVmO1xuICB2YXIgZ2VvbG9jYXRlQnV0dG9uUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgbWFwYm94R2VvbG9jYXRlQ29udHJvbCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBjcmVhdGVNYXBib3hHZW9sb2NhdGVDb250cm9sID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0U3VwcG9ydHNHZW9sb2NhdGlvbiA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udHJvbDtcblxuICAgIGlmIChjb250ZXh0Lm1hcCkge1xuICAgICAgaXNHZW9sb2NhdGlvblN1cHBvcnRlZCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBzZXRTdXBwb3J0c0dlb2xvY2F0aW9uKHJlc3VsdCk7XG5cbiAgICAgICAgaWYgKGdlb2xvY2F0ZUJ1dHRvblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgY29udHJvbCA9IHNldHVwTWFwYm94R2VvbG9jYXRlQ29udHJvbChjb250ZXh0LCBwcm9wcywgZ2VvbG9jYXRlQnV0dG9uUmVmLmN1cnJlbnQpO1xuXG4gICAgICAgICAgY29udHJvbC5fdXBkYXRlQ2FtZXJhID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlQ2FtZXJhKHBvc2l0aW9uLCB0aGlzUmVmKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY3JlYXRlTWFwYm94R2VvbG9jYXRlQ29udHJvbChjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuX2NsZWFyV2F0Y2goKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbY29udGV4dC5tYXBdKTtcbiAgdmFyIHRyaWdnZXJHZW9sb2NhdGUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wpIHtcbiAgICAgIG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wub3B0aW9ucyA9IHRoaXNSZWYucHJvcHM7XG4gICAgICBtYXBib3hHZW9sb2NhdGVDb250cm9sLnRyaWdnZXIoKTtcbiAgICB9XG4gIH0sIFttYXBib3hHZW9sb2NhdGVDb250cm9sXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLmF1dG8pIHtcbiAgICAgIHRyaWdnZXJHZW9sb2NhdGUoKTtcbiAgICB9XG4gIH0sIFttYXBib3hHZW9sb2NhdGVDb250cm9sLCBwcm9wcy5hdXRvXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wpIHtcbiAgICAgIG1hcGJveEdlb2xvY2F0ZUNvbnRyb2wuX29uWm9vbSgpO1xuICAgIH1cbiAgfSwgW2NvbnRleHQudmlld3BvcnQuem9vbV0pO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIGRpc2FibGVkTGFiZWwgPSBwcm9wcy5kaXNhYmxlZExhYmVsLFxuICAgICAgdHJhY2tVc2VyTG9jYXRpb24gPSBwcm9wcy50cmFja1VzZXJMb2NhdGlvbjtcbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJnZW9sb2NhdGUtY29udHJvbFwiLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXBcIixcbiAgICByZWY6IGNvbnRhaW5lclJlZlxuICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICBrZXk6IFwiZ2VvbG9jYXRlXCIsXG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZVwiLFxuICAgIHJlZjogZ2VvbG9jYXRlQnV0dG9uUmVmLFxuICAgIGRpc2FibGVkOiAhc3VwcG9ydHNHZW9sb2NhdGlvbixcbiAgICBcImFyaWEtcHJlc3NlZFwiOiAhdHJhY2tVc2VyTG9jYXRpb24sXG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICB0aXRsZTogc3VwcG9ydHNHZW9sb2NhdGlvbiA/IGxhYmVsIDogZGlzYWJsZWRMYWJlbCxcbiAgICBcImFyaWEtbGFiZWxcIjogc3VwcG9ydHNHZW9sb2NhdGlvbiA/IGxhYmVsIDogZGlzYWJsZWRMYWJlbCxcbiAgICBvbkNsaWNrOiB0cmlnZ2VyR2VvbG9jYXRlXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICB9KSkpKTtcbn1cblxuR2VvbG9jYXRlQ29udHJvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKEdlb2xvY2F0ZUNvbnRyb2wpOyIsImV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbnModmVyc2lvbjEsIHZlcnNpb24yKSB7XG4gIHZhciB2MSA9ICh2ZXJzaW9uMSB8fCAnJykuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgdmFyIHYyID0gKHZlcnNpb24yIHx8ICcnKS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgdmFyIHBhcnQxID0gdjFbaV0gfHwgMDtcbiAgICB2YXIgcGFydDIgPSB2MltpXSB8fCAwO1xuXG4gICAgaWYgKHBhcnQxIDwgcGFydDIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGFydDEgPiBwYXJ0Mikge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcFN0YXRlIGZyb20gJy4uL3V0aWxzL21hcC1zdGF0ZSc7XG5pbXBvcnQgeyBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyB9IGZyb20gJy4uL3V0aWxzL21hcC1jb250cm9sbGVyJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24nO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIHNob3dDb21wYXNzOiB0cnVlLFxuICBzaG93Wm9vbTogdHJ1ZSxcbiAgem9vbUluTGFiZWw6ICdab29tIEluJyxcbiAgem9vbU91dExhYmVsOiAnWm9vbSBPdXQnLFxuICBjb21wYXNzTGFiZWw6ICdSZXNldCBOb3J0aCdcbn0pO1xudmFyIFZFUlNJT05fTEVHQUNZID0gMTtcbnZhciBWRVJTSU9OXzFfNiA9IDI7XG5cbmZ1bmN0aW9uIGdldFVJVmVyc2lvbihtYXBib3hWZXJzaW9uKSB7XG4gIHJldHVybiBjb21wYXJlVmVyc2lvbnMobWFwYm94VmVyc2lvbiwgJzEuNi4wJykgPj0gMCA/IFZFUlNJT05fMV82IDogVkVSU0lPTl9MRUdBQ1k7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZpZXdwb3J0KGNvbnRleHQsIHByb3BzLCBvcHRzKSB7XG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQ7XG4gIHZhciBtYXBTdGF0ZSA9IG5ldyBNYXBTdGF0ZShPYmplY3QuYXNzaWduKHt9LCB2aWV3cG9ydCwgb3B0cykpO1xuICB2YXIgdmlld1N0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgbWFwU3RhdGUuZ2V0Vmlld3BvcnRQcm9wcygpLCBMSU5FQVJfVFJBTlNJVElPTl9QUk9QUyk7XG4gIHZhciBvblZpZXdwb3J0Q2hhbmdlID0gcHJvcHMub25WaWV3cG9ydENoYW5nZSB8fCBjb250ZXh0Lm9uVmlld3BvcnRDaGFuZ2UgfHwgbm9vcDtcbiAgdmFyIG9uVmlld1N0YXRlQ2hhbmdlID0gcHJvcHMub25WaWV3U3RhdGVDaGFuZ2UgfHwgY29udGV4dC5vblZpZXdTdGF0ZUNoYW5nZSB8fCBub29wO1xuICBvblZpZXdTdGF0ZUNoYW5nZSh7XG4gICAgdmlld1N0YXRlOiB2aWV3U3RhdGVcbiAgfSk7XG4gIG9uVmlld3BvcnRDaGFuZ2Uodmlld1N0YXRlKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQnV0dG9uKHR5cGUsIGxhYmVsLCBjYWxsYmFjaywgY2hpbGRyZW4pIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIGtleTogdHlwZSxcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtXCIuY29uY2F0KHR5cGUpLFxuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgdGl0bGU6IGxhYmVsLFxuICAgIG9uQ2xpY2s6IGNhbGxiYWNrXG4gIH0sIGNoaWxkcmVuIHx8IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IFwibWFwYm94Z2wtY3RybC1pY29uXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbXBhc3MoY29udGV4dCkge1xuICB2YXIgdWlWZXJzaW9uID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbnRleHQubWFwID8gZ2V0VUlWZXJzaW9uKGNvbnRleHQubWFwLnZlcnNpb24pIDogVkVSU0lPTl8xXzY7XG4gIH0sIFtjb250ZXh0Lm1hcF0pO1xuICB2YXIgYmVhcmluZyA9IGNvbnRleHQudmlld3BvcnQuYmVhcmluZztcbiAgdmFyIHN0eWxlID0ge1xuICAgIHRyYW5zZm9ybTogXCJyb3RhdGUoXCIuY29uY2F0KC1iZWFyaW5nLCBcImRlZylcIilcbiAgfTtcbiAgcmV0dXJuIHVpVmVyc2lvbiA9PT0gVkVSU0lPTl8xXzYgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIm1hcGJveGdsLWN0cmwtaWNvblwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pIDogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsLWNvbXBhc3MtYXJyb3dcIixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIE5hdmlnYXRpb25Db250cm9sKHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIG9uWm9vbUluID0gZnVuY3Rpb24gb25ab29tSW4oKSB7XG4gICAgdXBkYXRlVmlld3BvcnQoY29udGV4dCwgcHJvcHMsIHtcbiAgICAgIHpvb206IGNvbnRleHQudmlld3BvcnQuem9vbSArIDFcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb25ab29tT3V0ID0gZnVuY3Rpb24gb25ab29tT3V0KCkge1xuICAgIHVwZGF0ZVZpZXdwb3J0KGNvbnRleHQsIHByb3BzLCB7XG4gICAgICB6b29tOiBjb250ZXh0LnZpZXdwb3J0Lnpvb20gLSAxXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uUmVzZXROb3J0aCA9IGZ1bmN0aW9uIG9uUmVzZXROb3J0aCgpIHtcbiAgICB1cGRhdGVWaWV3cG9ydChjb250ZXh0LCBwcm9wcywge1xuICAgICAgYmVhcmluZzogMCxcbiAgICAgIHBpdGNoOiAwXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHNob3dDb21wYXNzID0gcHJvcHMuc2hvd0NvbXBhc3MsXG4gICAgICBzaG93Wm9vbSA9IHByb3BzLnNob3dab29tLFxuICAgICAgem9vbUluTGFiZWwgPSBwcm9wcy56b29tSW5MYWJlbCxcbiAgICAgIHpvb21PdXRMYWJlbCA9IHByb3BzLnpvb21PdXRMYWJlbCxcbiAgICAgIGNvbXBhc3NMYWJlbCA9IHByb3BzLmNvbXBhc3NMYWJlbDtcbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXBcIixcbiAgICByZWY6IGNvbnRhaW5lclJlZlxuICB9LCBzaG93Wm9vbSAmJiByZW5kZXJCdXR0b24oJ3pvb20taW4nLCB6b29tSW5MYWJlbCwgb25ab29tSW4pLCBzaG93Wm9vbSAmJiByZW5kZXJCdXR0b24oJ3pvb20tb3V0Jywgem9vbU91dExhYmVsLCBvblpvb21PdXQpLCBzaG93Q29tcGFzcyAmJiByZW5kZXJCdXR0b24oJ2NvbXBhc3MnLCBjb21wYXNzTGFiZWwsIG9uUmVzZXROb3J0aCwgcmVuZGVyQ29tcGFzcyhjb250ZXh0KSkpKTtcbn1cblxuTmF2aWdhdGlvbkNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhOYXZpZ2F0aW9uQ29udHJvbCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFwYm94Z2wgZnJvbSAnLi4vdXRpbHMvbWFwYm94Z2wnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbERlZmF1bHRQcm9wcywgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4vdXNlLW1hcC1jb250cm9sJztcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBtYXBDb250cm9sRGVmYXVsdFByb3BzLCB7XG4gIGNsYXNzTmFtZTogJycsXG4gIG1heFdpZHRoOiAxMDAsXG4gIHVuaXQ6ICdtZXRyaWMnXG59KTtcblxuZnVuY3Rpb24gU2NhbGVDb250cm9sKHByb3BzKSB7XG4gIHZhciBfdXNlTWFwQ29udHJvbCA9IHVzZU1hcENvbnRyb2wocHJvcHMpLFxuICAgICAgY29udGV4dCA9IF91c2VNYXBDb250cm9sLmNvbnRleHQsXG4gICAgICBjb250YWluZXJSZWYgPSBfdXNlTWFwQ29udHJvbC5jb250YWluZXJSZWY7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgICBtYXBib3hTY2FsZUNvbnRyb2wgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgY3JlYXRlTWFwYm94U2NhbGVDb250cm9sID0gX3VzZVN0YXRlMlsxXTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjb250ZXh0Lm1hcCkge1xuICAgICAgdmFyIGNvbnRyb2wgPSBuZXcgbWFwYm94Z2wuU2NhbGVDb250cm9sKCk7XG4gICAgICBjb250cm9sLl9tYXAgPSBjb250ZXh0Lm1hcDtcbiAgICAgIGNvbnRyb2wuX2NvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY3JlYXRlTWFwYm94U2NhbGVDb250cm9sKGNvbnRyb2wpO1xuICAgIH1cbiAgfSwgW2NvbnRleHQubWFwXSk7XG5cbiAgaWYgKG1hcGJveFNjYWxlQ29udHJvbCkge1xuICAgIG1hcGJveFNjYWxlQ29udHJvbC5vcHRpb25zID0gcHJvcHM7XG5cbiAgICBtYXBib3hTY2FsZUNvbnRyb2wuX29uTW92ZSgpO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LCBwcm9wcy5zdHlsZSk7XG4gIH0sIFtwcm9wcy5zdHlsZV0pO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIGNsYXNzTmFtZTogXCJtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtc2NhbGVcIlxuICB9KSk7XG59XG5cblNjYWxlQ29udHJvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vKFNjYWxlQ29udHJvbCk7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1hcENvbnRyb2wsIHsgbWFwQ29udHJvbFByb3BUeXBlcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbnZhciBwaXhlbFJhdGlvID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNhcHR1cmVTY3JvbGw6IGZhbHNlLFxuICBjYXB0dXJlRHJhZzogZmFsc2UsXG4gIGNhcHR1cmVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVEb3VibGVDbGljazogZmFsc2UsXG4gIGNhcHR1cmVQb2ludGVyTW92ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIENhbnZhc092ZXJsYXkocHJvcHMpIHtcbiAgdmFyIF91c2VNYXBDb250cm9sID0gdXNlTWFwQ29udHJvbChwcm9wcyksXG4gICAgICBjb250ZXh0ID0gX3VzZU1hcENvbnRyb2wuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IF91c2VNYXBDb250cm9sLmNvbnRhaW5lclJlZjtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGN0eCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXREcmF3aW5nQ29udGV4dCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXREcmF3aW5nQ29udGV4dChjb250YWluZXJSZWYuY3VycmVudC5nZXRDb250ZXh0KCcyZCcpKTtcbiAgfSwgW10pO1xuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0LFxuICAgICAgaXNEcmFnZ2luZyA9IGNvbnRleHQuaXNEcmFnZ2luZztcblxuICBpZiAoY3R4KSB7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG4gICAgcHJvcHMucmVkcmF3KHtcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgICAgY3R4OiBjdHgsXG4gICAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLFxuICAgICAgcHJvamVjdDogdmlld3BvcnQucHJvamVjdCxcbiAgICAgIHVucHJvamVjdDogdmlld3BvcnQudW5wcm9qZWN0XG4gICAgfSk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICB3aWR0aDogdmlld3BvcnQud2lkdGggKiBwaXhlbFJhdGlvLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0ICogcGl4ZWxSYXRpbyxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KHZpZXdwb3J0LndpZHRoLCBcInB4XCIpLFxuICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdCh2aWV3cG9ydC5oZWlnaHQsIFwicHhcIiksXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9XG4gIH0pO1xufVxuXG5DYW52YXNPdmVybGF5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IENhbnZhc092ZXJsYXk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi4vY29tcG9uZW50cy91c2UtbWFwLWNvbnRyb2wnO1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY2FwdHVyZVNjcm9sbDogZmFsc2UsXG4gIGNhcHR1cmVEcmFnOiBmYWxzZSxcbiAgY2FwdHVyZUNsaWNrOiBmYWxzZSxcbiAgY2FwdHVyZURvdWJsZUNsaWNrOiBmYWxzZSxcbiAgY2FwdHVyZVBvaW50ZXJNb3ZlOiBmYWxzZVxufTtcblxuZnVuY3Rpb24gSFRNTE92ZXJsYXkocHJvcHMpIHtcbiAgdmFyIF91c2VNYXBDb250cm9sID0gdXNlTWFwQ29udHJvbChwcm9wcyksXG4gICAgICBjb250ZXh0ID0gX3VzZU1hcENvbnRyb2wuY29udGV4dCxcbiAgICAgIGNvbnRhaW5lclJlZiA9IF91c2VNYXBDb250cm9sLmNvbnRhaW5lclJlZjtcblxuICB2YXIgdmlld3BvcnQgPSBjb250ZXh0LnZpZXdwb3J0LFxuICAgICAgaXNEcmFnZ2luZyA9IGNvbnRleHQuaXNEcmFnZ2luZztcblxuICB2YXIgc3R5bGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMCxcbiAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHRcbiAgfSwgcHJvcHMuc3R5bGUpO1xuXG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgcHJvcHMucmVkcmF3KHtcbiAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgaGVpZ2h0OiB2aWV3cG9ydC5oZWlnaHQsXG4gICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZyxcbiAgICBwcm9qZWN0OiB2aWV3cG9ydC5wcm9qZWN0LFxuICAgIHVucHJvamVjdDogdmlld3BvcnQudW5wcm9qZWN0XG4gIH0pKTtcbn1cblxuSFRNTE92ZXJsYXkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgSFRNTE92ZXJsYXk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWFwQ29udHJvbCwgeyBtYXBDb250cm9sUHJvcFR5cGVzIH0gZnJvbSAnLi4vY29tcG9uZW50cy91c2UtbWFwLWNvbnRyb2wnO1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY2FwdHVyZVNjcm9sbDogZmFsc2UsXG4gIGNhcHR1cmVEcmFnOiBmYWxzZSxcbiAgY2FwdHVyZUNsaWNrOiBmYWxzZSxcbiAgY2FwdHVyZURvdWJsZUNsaWNrOiBmYWxzZSxcbiAgY2FwdHVyZVBvaW50ZXJNb3ZlOiBmYWxzZVxufTtcblxuZnVuY3Rpb24gU1ZHT3ZlcmxheShwcm9wcykge1xuICB2YXIgX3VzZU1hcENvbnRyb2wgPSB1c2VNYXBDb250cm9sKHByb3BzKSxcbiAgICAgIGNvbnRleHQgPSBfdXNlTWFwQ29udHJvbC5jb250ZXh0LFxuICAgICAgY29udGFpbmVyUmVmID0gX3VzZU1hcENvbnRyb2wuY29udGFpbmVyUmVmO1xuXG4gIHZhciB2aWV3cG9ydCA9IGNvbnRleHQudmlld3BvcnQsXG4gICAgICBpc0RyYWdnaW5nID0gY29udGV4dC5pc0RyYWdnaW5nO1xuXG4gIHZhciBzdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwXG4gIH0sIHByb3BzLnN0eWxlKTtcblxuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxuICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcy5yZWRyYXcoe1xuICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLFxuICAgIHByb2plY3Q6IHZpZXdwb3J0LnByb2plY3QsXG4gICAgdW5wcm9qZWN0OiB2aWV3cG9ydC51bnByb2plY3RcbiAgfSkpO1xufVxuXG5TVkdPdmVybGF5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IFNWR092ZXJsYXk7IiwiaW1wb3J0IG1hcGJveGdsIGZyb20gJy4vbWFwYm94Z2wnO1xudmFyIHNldFJUTFRleHRQbHVnaW4gPSBtYXBib3hnbCA/IG1hcGJveGdsLnNldFJUTFRleHRQbHVnaW4gOiBmdW5jdGlvbiAoKSB7fTtcbmV4cG9ydCBkZWZhdWx0IHNldFJUTFRleHRQbHVnaW47IiwiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1tYXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnRlcmFjdGl2ZU1hcCB9IGZyb20gJy4vY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1tYXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGF0aWNNYXAgfSBmcm9tICcuL2NvbXBvbmVudHMvc3RhdGljLW1hcCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNvdXJjZSB9IGZyb20gJy4vY29tcG9uZW50cy9zb3VyY2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMYXllciB9IGZyb20gJy4vY29tcG9uZW50cy9sYXllcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJhc2VDb250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL2Jhc2UtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1hcmtlciB9IGZyb20gJy4vY29tcG9uZW50cy9tYXJrZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb3B1cCB9IGZyb20gJy4vY29tcG9uZW50cy9wb3B1cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEF0dHJpYnV0aW9uQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9hdHRyaWJ1dGlvbi1jb250cm9sJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRnVsbHNjcmVlbkNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvZnVsbHNjcmVlbi1jb250cm9sJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR2VvbG9jYXRlQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9nZW9sb2NhdGUtY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdmlnYXRpb25Db250cm9sIH0gZnJvbSAnLi9jb21wb25lbnRzL25hdmlnYXRpb24tY29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNjYWxlQ29udHJvbCB9IGZyb20gJy4vY29tcG9uZW50cy9zY2FsZS1jb250cm9sJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FudmFzT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheXMvY2FudmFzLW92ZXJsYXknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBIVE1MT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheXMvaHRtbC1vdmVybGF5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU1ZHT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheXMvc3ZnLW92ZXJsYXknO1xuZXhwb3J0IHsgVFJBTlNJVElPTl9FVkVOVFMgfSBmcm9tICcuL3V0aWxzL3RyYW5zaXRpb24tbWFuYWdlcic7XG5leHBvcnQgeyBUcmFuc2l0aW9uSW50ZXJwb2xhdG9yLCBMaW5lYXJJbnRlcnBvbGF0b3IsIFZpZXdwb3J0Rmx5VG9JbnRlcnBvbGF0b3IgYXMgRmx5VG9JbnRlcnBvbGF0b3IgfSBmcm9tICcuL3V0aWxzL3RyYW5zaXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXBDb250cm9sbGVyIH0gZnJvbSAnLi91dGlscy9tYXAtY29udHJvbGxlcic7XG5leHBvcnQgeyBXZWJNZXJjYXRvclZpZXdwb3J0IH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNldFJUTFRleHRQbHVnaW4gfSBmcm9tICcuL3V0aWxzL3NldC1ydGwtdGV4dC1wbHVnaW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXBDb250ZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL21hcC1jb250ZXh0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgX3VzZU1hcENvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvdXNlLW1hcC1jb250cm9sJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgX01hcENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWFwLWNvbnRleHQnOyIsIi8qKlxuICogQG1vZHVsZSBoZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBFYXJ0aCBSYWRpdXMgdXNlZCB3aXRoIHRoZSBIYXJ2ZXNpbmUgZm9ybXVsYSBhbmQgYXBwcm94aW1hdGVzIHVzaW5nIGEgc3BoZXJpY2FsIChub24tZWxsaXBzb2lkKSBFYXJ0aC5cbiAqXG4gKiBAbWVtYmVyb2YgaGVscGVyc1xuICogQHR5cGUge251bWJlcn1cbiAqL1xuZXhwb3J0IHZhciBlYXJ0aFJhZGl1cyA9IDYzNzEwMDguODtcbi8qKlxuICogVW5pdCBvZiBtZWFzdXJlbWVudCBmYWN0b3JzIHVzaW5nIGEgc3BoZXJpY2FsIChub24tZWxsaXBzb2lkKSBlYXJ0aCByYWRpdXMuXG4gKlxuICogQG1lbWJlcm9mIGhlbHBlcnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxuZXhwb3J0IHZhciBmYWN0b3JzID0ge1xuICBjZW50aW1ldGVyczogZWFydGhSYWRpdXMgKiAxMDAsXG4gIGNlbnRpbWV0cmVzOiBlYXJ0aFJhZGl1cyAqIDEwMCxcbiAgZGVncmVlczogZWFydGhSYWRpdXMgLyAxMTEzMjUsXG4gIGZlZXQ6IGVhcnRoUmFkaXVzICogMy4yODA4NCxcbiAgaW5jaGVzOiBlYXJ0aFJhZGl1cyAqIDM5LjM3LFxuICBraWxvbWV0ZXJzOiBlYXJ0aFJhZGl1cyAvIDEwMDAsXG4gIGtpbG9tZXRyZXM6IGVhcnRoUmFkaXVzIC8gMTAwMCxcbiAgbWV0ZXJzOiBlYXJ0aFJhZGl1cyxcbiAgbWV0cmVzOiBlYXJ0aFJhZGl1cyxcbiAgbWlsZXM6IGVhcnRoUmFkaXVzIC8gMTYwOS4zNDQsXG4gIG1pbGxpbWV0ZXJzOiBlYXJ0aFJhZGl1cyAqIDEwMDAsXG4gIG1pbGxpbWV0cmVzOiBlYXJ0aFJhZGl1cyAqIDEwMDAsXG4gIG5hdXRpY2FsbWlsZXM6IGVhcnRoUmFkaXVzIC8gMTg1MixcbiAgcmFkaWFuczogMSxcbiAgeWFyZHM6IGVhcnRoUmFkaXVzICogMS4wOTM2XG59O1xuLyoqXG4gKiBVbml0cyBvZiBtZWFzdXJlbWVudCBmYWN0b3JzIGJhc2VkIG9uIDEgbWV0ZXIuXG4gKlxuICogQG1lbWJlcm9mIGhlbHBlcnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxuZXhwb3J0IHZhciB1bml0c0ZhY3RvcnMgPSB7XG4gIGNlbnRpbWV0ZXJzOiAxMDAsXG4gIGNlbnRpbWV0cmVzOiAxMDAsXG4gIGRlZ3JlZXM6IDEgLyAxMTEzMjUsXG4gIGZlZXQ6IDMuMjgwODQsXG4gIGluY2hlczogMzkuMzcsXG4gIGtpbG9tZXRlcnM6IDEgLyAxMDAwLFxuICBraWxvbWV0cmVzOiAxIC8gMTAwMCxcbiAgbWV0ZXJzOiAxLFxuICBtZXRyZXM6IDEsXG4gIG1pbGVzOiAxIC8gMTYwOS4zNDQsXG4gIG1pbGxpbWV0ZXJzOiAxMDAwLFxuICBtaWxsaW1ldHJlczogMTAwMCxcbiAgbmF1dGljYWxtaWxlczogMSAvIDE4NTIsXG4gIHJhZGlhbnM6IDEgLyBlYXJ0aFJhZGl1cyxcbiAgeWFyZHM6IDEuMDkzNjEzM1xufTtcbi8qKlxuICogQXJlYSBvZiBtZWFzdXJlbWVudCBmYWN0b3JzIGJhc2VkIG9uIDEgc3F1YXJlIG1ldGVyLlxuICpcbiAqIEBtZW1iZXJvZiBoZWxwZXJzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgYXJlYUZhY3RvcnMgPSB7XG4gIGFjcmVzOiAwLjAwMDI0NzEwNSxcbiAgY2VudGltZXRlcnM6IDEwMDAwLFxuICBjZW50aW1ldHJlczogMTAwMDAsXG4gIGZlZXQ6IDEwLjc2MzkxMDQxNyxcbiAgaGVjdGFyZXM6IDAuMDAwMSxcbiAgaW5jaGVzOiAxNTUwLjAwMzEwMDAwNixcbiAga2lsb21ldGVyczogMC4wMDAwMDEsXG4gIGtpbG9tZXRyZXM6IDAuMDAwMDAxLFxuICBtZXRlcnM6IDEsXG4gIG1ldHJlczogMSxcbiAgbWlsZXM6IDMuODZlLTcsXG4gIG1pbGxpbWV0ZXJzOiAxMDAwMDAwLFxuICBtaWxsaW1ldHJlczogMTAwMDAwMCxcbiAgeWFyZHM6IDEuMTk1OTkwMDQ2XG59O1xuLyoqXG4gKiBXcmFwcyBhIEdlb0pTT04ge0BsaW5rIEdlb21ldHJ5fSBpbiBhIEdlb0pTT04ge0BsaW5rIEZlYXR1cmV9LlxuICpcbiAqIEBuYW1lIGZlYXR1cmVcbiAqIEBwYXJhbSB7R2VvbWV0cnl9IGdlb21ldHJ5IGlucHV0IGdlb21ldHJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmV9IGEgR2VvSlNPTiBGZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIGdlb21ldHJ5ID0ge1xuICogICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICBcImNvb3JkaW5hdGVzXCI6IFsxMTAsIDUwXVxuICogfTtcbiAqXG4gKiB2YXIgZmVhdHVyZSA9IHR1cmYuZmVhdHVyZShnZW9tZXRyeSk7XG4gKlxuICogLy89ZmVhdHVyZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBmZWF0ID0ge1xuICAgIHR5cGU6IFwiRmVhdHVyZVwiXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuaWQgPT09IDAgfHwgb3B0aW9ucy5pZCkge1xuICAgIGZlYXQuaWQgPSBvcHRpb25zLmlkO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYmJveCkge1xuICAgIGZlYXQuYmJveCA9IG9wdGlvbnMuYmJveDtcbiAgfVxuXG4gIGZlYXQucHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG4gIGZlYXQuZ2VvbWV0cnkgPSBnZW9tO1xuICByZXR1cm4gZmVhdDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIEdlb0pTT04ge0BsaW5rIEdlb21ldHJ5fSBmcm9tIGEgR2VvbWV0cnkgc3RyaW5nIHR5cGUgJiBjb29yZGluYXRlcy5cbiAqIEZvciBHZW9tZXRyeUNvbGxlY3Rpb24gdHlwZSB1c2UgYGhlbHBlcnMuZ2VvbWV0cnlDb2xsZWN0aW9uYFxuICpcbiAqIEBuYW1lIGdlb21ldHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBHZW9tZXRyeSBUeXBlXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGNvb3JkaW5hdGVzIENvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIHtHZW9tZXRyeX0gYSBHZW9KU09OIEdlb21ldHJ5XG4gKiBAZXhhbXBsZVxuICogdmFyIHR5cGUgPSBcIlBvaW50XCI7XG4gKiB2YXIgY29vcmRpbmF0ZXMgPSBbMTEwLCA1MF07XG4gKiB2YXIgZ2VvbWV0cnkgPSB0dXJmLmdlb21ldHJ5KHR5cGUsIGNvb3JkaW5hdGVzKTtcbiAqIC8vID0+IGdlb21ldHJ5XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdlb21ldHJ5KHR5cGUsIGNvb3JkaW5hdGVzLCBfb3B0aW9ucykge1xuICBpZiAoX29wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIF9vcHRpb25zID0ge307XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgIHJldHVybiBwb2ludChjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGxpbmVTdHJpbmcoY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgIHJldHVybiBwb2x5Z29uKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICByZXR1cm4gbXVsdGlQb2ludChjb29yZGluYXRlcykuZ2VvbWV0cnk7XG5cbiAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XG4gICAgICByZXR1cm4gbXVsdGlMaW5lU3RyaW5nKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTtcblxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIHJldHVybiBtdWx0aVBvbHlnb24oY29vcmRpbmF0ZXMpLmdlb21ldHJ5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlICsgXCIgaXMgaW52YWxpZFwiKTtcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFBvaW50fSB7QGxpbmsgRmVhdHVyZX0gZnJvbSBhIFBvc2l0aW9uLlxuICpcbiAqIEBuYW1lIHBvaW50XG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGNvb3JkaW5hdGVzIGxvbmdpdHVkZSwgbGF0aXR1ZGUgcG9zaXRpb24gKGVhY2ggaW4gZGVjaW1hbCBkZWdyZWVzKVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvaW50Pn0gYSBQb2ludCBmZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gdHVyZi5wb2ludChbLTc1LjM0MywgMzkuOTg0XSk7XG4gKlxuICogLy89cG9pbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjb29yZGluYXRlcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5XCIpO1xuICB9XG5cbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nXCIpO1xuICB9XG5cbiAgaWYgKCFpc051bWJlcihjb29yZGluYXRlc1swXSkgfHwgIWlzTnVtYmVyKGNvb3JkaW5hdGVzWzFdKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzXCIpO1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJQb2ludFwiLFxuICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICB9O1xuICByZXR1cm4gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBQb2ludH0ge0BsaW5rIEZlYXR1cmVDb2xsZWN0aW9ufSBmcm9tIGFuIEFycmF5IG9mIFBvaW50IGNvb3JkaW5hdGVzLlxuICpcbiAqIEBuYW1lIHBvaW50c1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9pbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIFRyYW5zbGF0ZSB0aGVzZSBwcm9wZXJ0aWVzIHRvIGVhY2ggRmVhdHVyZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAcmV0dXJucyB7RmVhdHVyZUNvbGxlY3Rpb248UG9pbnQ+fSBQb2ludCBGZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50cyA9IHR1cmYucG9pbnRzKFtcbiAqICAgWy03NSwgMzldLFxuICogICBbLTgwLCA0NV0sXG4gKiAgIFstNzgsIDUwXVxuICogXSk7XG4gKlxuICogLy89cG9pbnRzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50cyhjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGZlYXR1cmVDb2xsZWN0aW9uKGNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgcmV0dXJuIHBvaW50KGNvb3JkcywgcHJvcGVydGllcyk7XG4gIH0pLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBQb2x5Z29ufSB7QGxpbmsgRmVhdHVyZX0gZnJvbSBhbiBBcnJheSBvZiBMaW5lYXJSaW5ncy5cbiAqXG4gKiBAbmFtZSBwb2x5Z29uXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgTGluZWFyUmluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxQb2x5Z29uPn0gUG9seWdvbiBGZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW1tbLTUsIDUyXSwgWy00LCA1Nl0sIFstMiwgNTFdLCBbLTcsIDU0XSwgWy01LCA1Ml1dXSwgeyBuYW1lOiAncG9seTEnIH0pO1xuICpcbiAqIC8vPXBvbHlnb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbihjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBjb29yZGluYXRlc18xID0gY29vcmRpbmF0ZXM7IF9pIDwgY29vcmRpbmF0ZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzXzFbX2ldO1xuXG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy5cIik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nW3JpbmcubGVuZ3RoIC0gMV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIC8vIENoZWNrIGlmIGZpcnN0IHBvaW50IG9mIFBvbHlnb24gY29udGFpbnMgdHdvIG51bWJlcnNcbiAgICAgIGlmIChyaW5nW3JpbmcubGVuZ3RoIC0gMV1bal0gIT09IHJpbmdbMF1bal0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgYW5kIGxhc3QgUG9zaXRpb24gYXJlIG5vdCBlcXVpdmFsZW50LlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZ2VvbSA9IHtcbiAgICB0eXBlOiBcIlBvbHlnb25cIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUG9seWdvbn0ge0BsaW5rIEZlYXR1cmVDb2xsZWN0aW9ufSBmcm9tIGFuIEFycmF5IG9mIFBvbHlnb24gY29vcmRpbmF0ZXMuXG4gKlxuICogQG5hbWUgcG9seWdvbnNcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9seWdvbiBjb29yZGluYXRlc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW29wdGlvbnMuYmJveF0gQm91bmRpbmcgQm94IEFycmF5IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAcmV0dXJucyB7RmVhdHVyZUNvbGxlY3Rpb248UG9seWdvbj59IFBvbHlnb24gRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9seWdvbnMgPSB0dXJmLnBvbHlnb25zKFtcbiAqICAgW1tbLTUsIDUyXSwgWy00LCA1Nl0sIFstMiwgNTFdLCBbLTcsIDU0XSwgWy01LCA1Ml1dXSxcbiAqICAgW1tbLTE1LCA0Ml0sIFstMTQsIDQ2XSwgWy0xMiwgNDFdLCBbLTE3LCA0NF0sIFstMTUsIDQyXV1dLFxuICogXSk7XG4gKlxuICogLy89cG9seWdvbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbnMoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBmZWF0dXJlQ29sbGVjdGlvbihjb29yZGluYXRlcy5tYXAoZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHJldHVybiBwb2x5Z29uKGNvb3JkcywgcHJvcGVydGllcyk7XG4gIH0pLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBMaW5lU3RyaW5nfSB7QGxpbmsgRmVhdHVyZX0gZnJvbSBhbiBBcnJheSBvZiBQb3NpdGlvbnMuXG4gKlxuICogQG5hbWUgbGluZVN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9zaXRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TGluZVN0cmluZz59IExpbmVTdHJpbmcgRmVhdHVyZVxuICogQGV4YW1wbGVcbiAqIHZhciBsaW5lc3RyaW5nMSA9IHR1cmYubGluZVN0cmluZyhbWy0yNCwgNjNdLCBbLTIzLCA2MF0sIFstMjUsIDY1XSwgWy0yMCwgNjldXSwge25hbWU6ICdsaW5lIDEnfSk7XG4gKiB2YXIgbGluZXN0cmluZzIgPSB0dXJmLmxpbmVTdHJpbmcoW1stMTQsIDQzXSwgWy0xMywgNDBdLCBbLTE1LCA0NV0sIFstMTAsIDQ5XV0sIHtuYW1lOiAnbGluZSAyJ30pO1xuICpcbiAqIC8vPWxpbmVzdHJpbmcxXG4gKiAvLz1saW5lc3RyaW5nMlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lU3RyaW5nKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zXCIpO1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJMaW5lU3RyaW5nXCIsXG4gICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gIH07XG4gIHJldHVybiBmZWF0dXJlKGdlb20sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIExpbmVTdHJpbmd9IHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSBhbiBBcnJheSBvZiBMaW5lU3RyaW5nIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBuYW1lIGxpbmVTdHJpbmdzXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgTGluZWFyUmluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlQ29sbGVjdGlvblxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbb3B0aW9ucy5pZF0gSWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAcmV0dXJucyB7RmVhdHVyZUNvbGxlY3Rpb248TGluZVN0cmluZz59IExpbmVTdHJpbmcgRmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgbGluZXN0cmluZ3MgPSB0dXJmLmxpbmVTdHJpbmdzKFtcbiAqICAgW1stMjQsIDYzXSwgWy0yMywgNjBdLCBbLTI1LCA2NV0sIFstMjAsIDY5XV0sXG4gKiAgIFtbLTE0LCA0M10sIFstMTMsIDQwXSwgWy0xNSwgNDVdLCBbLTEwLCA0OV1dXG4gKiBdKTtcbiAqXG4gKiAvLz1saW5lc3RyaW5nc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lU3RyaW5ncyhjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGZlYXR1cmVDb2xsZWN0aW9uKGNvb3JkaW5hdGVzLm1hcChmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgcmV0dXJuIGxpbmVTdHJpbmcoY29vcmRzLCBwcm9wZXJ0aWVzKTtcbiAgfSksIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBUYWtlcyBvbmUgb3IgbW9yZSB7QGxpbmsgRmVhdHVyZXxGZWF0dXJlc30gYW5kIGNyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZUNvbGxlY3Rpb259LlxuICpcbiAqIEBuYW1lIGZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0ZlYXR1cmVbXX0gZmVhdHVyZXMgaW5wdXQgZmVhdHVyZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmVDb2xsZWN0aW9ufSBGZWF0dXJlQ29sbGVjdGlvbiBvZiBGZWF0dXJlc1xuICogQGV4YW1wbGVcbiAqIHZhciBsb2NhdGlvbkEgPSB0dXJmLnBvaW50KFstNzUuMzQzLCAzOS45ODRdLCB7bmFtZTogJ0xvY2F0aW9uIEEnfSk7XG4gKiB2YXIgbG9jYXRpb25CID0gdHVyZi5wb2ludChbLTc1LjgzMywgMzkuMjg0XSwge25hbWU6ICdMb2NhdGlvbiBCJ30pO1xuICogdmFyIGxvY2F0aW9uQyA9IHR1cmYucG9pbnQoWy03NS41MzQsIDM5LjEyM10sIHtuYW1lOiAnTG9jYXRpb24gQyd9KTtcbiAqXG4gKiB2YXIgY29sbGVjdGlvbiA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICBsb2NhdGlvbkEsXG4gKiAgIGxvY2F0aW9uQixcbiAqICAgbG9jYXRpb25DXG4gKiBdKTtcbiAqXG4gKiAvLz1jb2xsZWN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVDb2xsZWN0aW9uKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZmMgPSB7XG4gICAgdHlwZTogXCJGZWF0dXJlQ29sbGVjdGlvblwiXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuaWQpIHtcbiAgICBmYy5pZCA9IG9wdGlvbnMuaWQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy5iYm94KSB7XG4gICAgZmMuYmJveCA9IG9wdGlvbnMuYmJveDtcbiAgfVxuXG4gIGZjLmZlYXR1cmVzID0gZmVhdHVyZXM7XG4gIHJldHVybiBmYztcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBGZWF0dXJlPE11bHRpTGluZVN0cmluZz59IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbXVsdGlMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgTGluZVN0cmluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxNdWx0aUxpbmVTdHJpbmc+fSBhIE11bHRpTGluZVN0cmluZyBmZWF0dXJlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aUxpbmUgPSB0dXJmLm11bHRpTGluZVN0cmluZyhbW1swLDBdLFsxMCwxMF1dXSk7XG4gKlxuICogLy89bXVsdGlMaW5lXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpTGluZVN0cmluZyhjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJNdWx0aUxpbmVTdHJpbmdcIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aVBvaW50Pn0gYmFzZWQgb24gYVxuICogY29vcmRpbmF0ZSBhcnJheS4gUHJvcGVydGllcyBjYW4gYmUgYWRkZWQgb3B0aW9uYWxseS5cbiAqXG4gKiBAbmFtZSBtdWx0aVBvaW50XG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb3NpdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtvcHRpb25zLmJib3hdIEJvdW5kaW5nIEJveCBBcnJheSBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBhc3NvY2lhdGVkIHdpdGggdGhlIEZlYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW29wdGlvbnMuaWRdIElkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxNdWx0aVBvaW50Pn0gYSBNdWx0aVBvaW50IGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpUHQgPSB0dXJmLm11bHRpUG9pbnQoW1swLDBdLFsxMCwxMF1dKTtcbiAqXG4gKiAvLz1tdWx0aVB0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpUG9pbnQoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBnZW9tID0ge1xuICAgIHR5cGU6IFwiTXVsdGlQb2ludFwiLFxuICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICB9O1xuICByZXR1cm4gZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBGZWF0dXJlPE11bHRpUG9seWdvbj59IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbXVsdGlQb2x5Z29uXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvbHlnb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlQb2x5Z29uPn0gYSBtdWx0aXBvbHlnb24gZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbXVsdGlQb2x5ID0gdHVyZi5tdWx0aVBvbHlnb24oW1tbWzAsMF0sWzAsMTBdLFsxMCwxMF0sWzEwLDBdLFswLDBdXV1dKTtcbiAqXG4gKiAvLz1tdWx0aVBvbHlcbiAqXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpUG9seWdvbihjb29yZGluYXRlcywgcHJvcGVydGllcywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGdlb20gPSB7XG4gICAgdHlwZTogXCJNdWx0aVBvbHlnb25cIixcbiAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxHZW9tZXRyeUNvbGxlY3Rpb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIGdlb21ldHJ5Q29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheTxHZW9tZXRyeT59IGdlb21ldHJpZXMgYW4gYXJyYXkgb2YgR2VvSlNPTiBHZW9tZXRyaWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gT3B0aW9uYWwgUGFyYW1ldGVyc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbb3B0aW9ucy5iYm94XSBCb3VuZGluZyBCb3ggQXJyYXkgW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gYXNzb2NpYXRlZCB3aXRoIHRoZSBGZWF0dXJlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtvcHRpb25zLmlkXSBJZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmVhdHVyZVxuICogQHJldHVybnMge0ZlYXR1cmU8R2VvbWV0cnlDb2xsZWN0aW9uPn0gYSBHZW9KU09OIEdlb21ldHJ5Q29sbGVjdGlvbiBGZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHB0ID0gdHVyZi5nZW9tZXRyeShcIlBvaW50XCIsIFsxMDAsIDBdKTtcbiAqIHZhciBsaW5lID0gdHVyZi5nZW9tZXRyeShcIkxpbmVTdHJpbmdcIiwgW1sxMDEsIDBdLCBbMTAyLCAxXV0pO1xuICogdmFyIGNvbGxlY3Rpb24gPSB0dXJmLmdlb21ldHJ5Q29sbGVjdGlvbihbcHQsIGxpbmVdKTtcbiAqXG4gKiAvLyA9PiBjb2xsZWN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdlb21ldHJ5Q29sbGVjdGlvbihnZW9tZXRyaWVzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgZ2VvbSA9IHtcbiAgICB0eXBlOiBcIkdlb21ldHJ5Q29sbGVjdGlvblwiLFxuICAgIGdlb21ldHJpZXM6IGdlb21ldHJpZXNcbiAgfTtcbiAgcmV0dXJuIGZlYXR1cmUoZ2VvbSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG59XG4vKipcbiAqIFJvdW5kIG51bWJlciB0byBwcmVjaXNpb25cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtIE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gUHJlY2lzaW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSByb3VuZGVkIG51bWJlclxuICogQGV4YW1wbGVcbiAqIHR1cmYucm91bmQoMTIwLjQzMjEpXG4gKiAvLz0xMjBcbiAqXG4gKiB0dXJmLnJvdW5kKDEyMC40MzIxLCAyKVxuICogLy89MTIwLjQzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG51bSwgcHJlY2lzaW9uKSB7XG4gIGlmIChwcmVjaXNpb24gPT09IHZvaWQgMCkge1xuICAgIHByZWNpc2lvbiA9IDA7XG4gIH1cblxuICBpZiAocHJlY2lzaW9uICYmICEocHJlY2lzaW9uID49IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwicHJlY2lzaW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cblxuICB2YXIgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24gfHwgMCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKG51bSAqIG11bHRpcGxpZXIpIC8gbXVsdGlwbGllcjtcbn1cbi8qKlxuICogQ29udmVydCBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IChhc3N1bWluZyBhIHNwaGVyaWNhbCBFYXJ0aCkgZnJvbSByYWRpYW5zIHRvIGEgbW9yZSBmcmllbmRseSB1bml0LlxuICogVmFsaWQgdW5pdHM6IG1pbGVzLCBuYXV0aWNhbG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRlcnMsIG1ldHJlcywga2lsb21ldGVycywgY2VudGltZXRlcnMsIGZlZXRcbiAqXG4gKiBAbmFtZSByYWRpYW5zVG9MZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIGluIHJhZGlhbnMgYWNyb3NzIHRoZSBzcGhlcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9XCJraWxvbWV0ZXJzXCJdIGNhbiBiZSBkZWdyZWVzLCByYWRpYW5zLCBtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0cmVzLFxuICogbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gZGlzdGFuY2VcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFkaWFuc1RvTGVuZ3RoKHJhZGlhbnMsIHVuaXRzKSB7XG4gIGlmICh1bml0cyA9PT0gdm9pZCAwKSB7XG4gICAgdW5pdHMgPSBcImtpbG9tZXRlcnNcIjtcbiAgfVxuXG4gIHZhciBmYWN0b3IgPSBmYWN0b3JzW3VuaXRzXTtcblxuICBpZiAoIWZhY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcih1bml0cyArIFwiIHVuaXRzIGlzIGludmFsaWRcIik7XG4gIH1cblxuICByZXR1cm4gcmFkaWFucyAqIGZhY3Rvcjtcbn1cbi8qKlxuICogQ29udmVydCBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IChhc3N1bWluZyBhIHNwaGVyaWNhbCBFYXJ0aCkgZnJvbSBhIHJlYWwtd29ybGQgdW5pdCBpbnRvIHJhZGlhbnNcbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQG5hbWUgbGVuZ3RoVG9SYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgaW4gcmVhbCB1bml0c1xuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1cImtpbG9tZXRlcnNcIl0gY2FuIGJlIGRlZ3JlZXMsIHJhZGlhbnMsIG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRyZXMsXG4gKiBtZXRlcnMsIGtpbG9tZXRyZXMsIGtpbG9tZXRlcnMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSByYWRpYW5zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aFRvUmFkaWFucyhkaXN0YW5jZSwgdW5pdHMpIHtcbiAgaWYgKHVuaXRzID09PSB2b2lkIDApIHtcbiAgICB1bml0cyA9IFwia2lsb21ldGVyc1wiO1xuICB9XG5cbiAgdmFyIGZhY3RvciA9IGZhY3RvcnNbdW5pdHNdO1xuXG4gIGlmICghZmFjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHVuaXRzICsgXCIgdW5pdHMgaXMgaW52YWxpZFwiKTtcbiAgfVxuXG4gIHJldHVybiBkaXN0YW5jZSAvIGZhY3Rvcjtcbn1cbi8qKlxuICogQ29udmVydCBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IChhc3N1bWluZyBhIHNwaGVyaWNhbCBFYXJ0aCkgZnJvbSBhIHJlYWwtd29ybGQgdW5pdCBpbnRvIGRlZ3JlZXNcbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGNlbnRpbWV0ZXJzLCBraWxvbWV0cmVzLCBmZWV0XG4gKlxuICogQG5hbWUgbGVuZ3RoVG9EZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgaW4gcmVhbCB1bml0c1xuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1cImtpbG9tZXRlcnNcIl0gY2FuIGJlIGRlZ3JlZXMsIHJhZGlhbnMsIG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRyZXMsXG4gKiBtZXRlcnMsIGtpbG9tZXRyZXMsIGtpbG9tZXRlcnMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkZWdyZWVzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aFRvRGVncmVlcyhkaXN0YW5jZSwgdW5pdHMpIHtcbiAgcmV0dXJuIHJhZGlhbnNUb0RlZ3JlZXMobGVuZ3RoVG9SYWRpYW5zKGRpc3RhbmNlLCB1bml0cykpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbnkgYmVhcmluZyBhbmdsZSBmcm9tIHRoZSBub3J0aCBsaW5lIGRpcmVjdGlvbiAocG9zaXRpdmUgY2xvY2t3aXNlKVxuICogYW5kIHJldHVybnMgYW4gYW5nbGUgYmV0d2VlbiAwLTM2MCBkZWdyZWVzIChwb3NpdGl2ZSBjbG9ja3dpc2UpLCAwIGJlaW5nIHRoZSBub3J0aCBsaW5lXG4gKlxuICogQG5hbWUgYmVhcmluZ1RvQXppbXV0aFxuICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgYW5nbGUsIGJldHdlZW4gLTE4MCBhbmQgKzE4MCBkZWdyZWVzXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBhbmdsZSBiZXR3ZWVuIDAgYW5kIDM2MCBkZWdyZWVzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJlYXJpbmdUb0F6aW11dGgoYmVhcmluZykge1xuICB2YXIgYW5nbGUgPSBiZWFyaW5nICUgMzYwO1xuXG4gIGlmIChhbmdsZSA8IDApIHtcbiAgICBhbmdsZSArPSAzNjA7XG4gIH1cblxuICByZXR1cm4gYW5nbGU7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIGFuZ2xlIGluIHJhZGlhbnMgdG8gZGVncmVlc1xuICpcbiAqIEBuYW1lIHJhZGlhbnNUb0RlZ3JlZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGRlZ3JlZXMgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYWRpYW5zVG9EZWdyZWVzKHJhZGlhbnMpIHtcbiAgdmFyIGRlZ3JlZXMgPSByYWRpYW5zICUgKDIgKiBNYXRoLlBJKTtcbiAgcmV0dXJuIGRlZ3JlZXMgKiAxODAgLyBNYXRoLlBJO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhbmdsZSBpbiBkZWdyZWVzIHRvIHJhZGlhbnNcbiAqXG4gKiBAbmFtZSBkZWdyZWVzVG9SYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gZGVncmVlcyBhbmdsZSBiZXR3ZWVuIDAgYW5kIDM2MCBkZWdyZWVzXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZ3JlZXNUb1JhZGlhbnMoZGVncmVlcykge1xuICB2YXIgcmFkaWFucyA9IGRlZ3JlZXMgJSAzNjA7XG4gIHJldHVybiByYWRpYW5zICogTWF0aC5QSSAvIDE4MDtcbn1cbi8qKlxuICogQ29udmVydHMgYSBsZW5ndGggdG8gdGhlIHJlcXVlc3RlZCB1bml0LlxuICogVmFsaWQgdW5pdHM6IG1pbGVzLCBuYXV0aWNhbG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRlcnMsIG1ldHJlcywga2lsb21ldGVycywgY2VudGltZXRlcnMsIGZlZXRcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtVbml0c30gW29yaWdpbmFsVW5pdD1cImtpbG9tZXRlcnNcIl0gb2YgdGhlIGxlbmd0aFxuICogQHBhcmFtIHtVbml0c30gW2ZpbmFsVW5pdD1cImtpbG9tZXRlcnNcIl0gcmV0dXJuZWQgdW5pdFxuICogQHJldHVybnMge251bWJlcn0gdGhlIGNvbnZlcnRlZCBsZW5ndGhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExlbmd0aChsZW5ndGgsIG9yaWdpbmFsVW5pdCwgZmluYWxVbml0KSB7XG4gIGlmIChvcmlnaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIG9yaWdpbmFsVW5pdCA9IFwia2lsb21ldGVyc1wiO1xuICB9XG5cbiAgaWYgKGZpbmFsVW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgZmluYWxVbml0ID0gXCJraWxvbWV0ZXJzXCI7XG4gIH1cblxuICBpZiAoIShsZW5ndGggPj0gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJsZW5ndGggbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgfVxuXG4gIHJldHVybiByYWRpYW5zVG9MZW5ndGgobGVuZ3RoVG9SYWRpYW5zKGxlbmd0aCwgb3JpZ2luYWxVbml0KSwgZmluYWxVbml0KTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBhcmVhIHRvIHRoZSByZXF1ZXN0ZWQgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBraWxvbWV0ZXJzLCBraWxvbWV0cmVzLCBtZXRlcnMsIG1ldHJlcywgY2VudGltZXRyZXMsIG1pbGxpbWV0ZXJzLCBhY3JlcywgbWlsZXMsIHlhcmRzLCBmZWV0LCBpbmNoZXMsIGhlY3RhcmVzXG4gKiBAcGFyYW0ge251bWJlcn0gYXJlYSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSB7VW5pdHN9IFtvcmlnaW5hbFVuaXQ9XCJtZXRlcnNcIl0gb2YgdGhlIGRpc3RhbmNlXG4gKiBAcGFyYW0ge1VuaXRzfSBbZmluYWxVbml0PVwia2lsb21ldGVyc1wiXSByZXR1cm5lZCB1bml0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgY29udmVydGVkIGFyZWFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEFyZWEoYXJlYSwgb3JpZ2luYWxVbml0LCBmaW5hbFVuaXQpIHtcbiAgaWYgKG9yaWdpbmFsVW5pdCA9PT0gdm9pZCAwKSB7XG4gICAgb3JpZ2luYWxVbml0ID0gXCJtZXRlcnNcIjtcbiAgfVxuXG4gIGlmIChmaW5hbFVuaXQgPT09IHZvaWQgMCkge1xuICAgIGZpbmFsVW5pdCA9IFwia2lsb21ldGVyc1wiO1xuICB9XG5cbiAgaWYgKCEoYXJlYSA+PSAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImFyZWEgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgfVxuXG4gIHZhciBzdGFydEZhY3RvciA9IGFyZWFGYWN0b3JzW29yaWdpbmFsVW5pdF07XG5cbiAgaWYgKCFzdGFydEZhY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3JpZ2luYWwgdW5pdHNcIik7XG4gIH1cblxuICB2YXIgZmluYWxGYWN0b3IgPSBhcmVhRmFjdG9yc1tmaW5hbFVuaXRdO1xuXG4gIGlmICghZmluYWxGYWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZpbmFsIHVuaXRzXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFyZWEgLyBzdGFydEZhY3RvciAqIGZpbmFsRmFjdG9yO1xufVxuLyoqXG4gKiBpc051bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gbnVtIE51bWJlciB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUvZmFsc2VcbiAqIEBleGFtcGxlXG4gKiB0dXJmLmlzTnVtYmVyKDEyMylcbiAqIC8vPXRydWVcbiAqIHR1cmYuaXNOdW1iZXIoJ2ZvbycpXG4gKiAvLz1mYWxzZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihudW0pIHtcbiAgcmV0dXJuICFpc05hTihudW0pICYmIG51bSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShudW0pO1xufVxuLyoqXG4gKiBpc09iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gaW5wdXQgdmFyaWFibGUgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlL2ZhbHNlXG4gKiBAZXhhbXBsZVxuICogdHVyZi5pc09iamVjdCh7ZWxldmF0aW9uOiAxMH0pXG4gKiAvLz10cnVlXG4gKiB0dXJmLmlzT2JqZWN0KCdmb28nKVxuICogLy89ZmFsc2VcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgcmV0dXJuICEhaW5wdXQgJiYgaW5wdXQuY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn1cbi8qKlxuICogVmFsaWRhdGUgQkJveFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGJib3ggQkJveCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAdGhyb3dzIEVycm9yIGlmIEJCb3ggaXMgbm90IHZhbGlkXG4gKiBAZXhhbXBsZVxuICogdmFsaWRhdGVCQm94KFstMTgwLCAtNDAsIDExMCwgNTBdKVxuICogLy89T0tcbiAqIHZhbGlkYXRlQkJveChbLTE4MCwgLTQwXSlcbiAqIC8vPUVycm9yXG4gKiB2YWxpZGF0ZUJCb3goJ0ZvbycpXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVCQm94KDUpXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVCQm94KG51bGwpXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVCQm94KHVuZGVmaW5lZClcbiAqIC8vPUVycm9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQkJveChiYm94KSB7XG4gIGlmICghYmJveCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImJib3ggaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoYmJveCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYm94IG11c3QgYmUgYW4gQXJyYXlcIik7XG4gIH1cblxuICBpZiAoYmJveC5sZW5ndGggIT09IDQgJiYgYmJveC5sZW5ndGggIT09IDYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYm94IG11c3QgYmUgYW4gQXJyYXkgb2YgNCBvciA2IG51bWJlcnNcIik7XG4gIH1cblxuICBiYm94LmZvckVhY2goZnVuY3Rpb24gKG51bSkge1xuICAgIGlmICghaXNOdW1iZXIobnVtKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmJveCBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzXCIpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIFZhbGlkYXRlIElkXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgSWQgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHRocm93cyBFcnJvciBpZiBJZCBpcyBub3QgdmFsaWRcbiAqIEBleGFtcGxlXG4gKiB2YWxpZGF0ZUlkKFstMTgwLCAtNDAsIDExMCwgNTBdKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlSWQoWy0xODAsIC00MF0pXG4gKiAvLz1FcnJvclxuICogdmFsaWRhdGVJZCgnRm9vJylcbiAqIC8vPU9LXG4gKiB2YWxpZGF0ZUlkKDUpXG4gKiAvLz1PS1xuICogdmFsaWRhdGVJZChudWxsKVxuICogLy89RXJyb3JcbiAqIHZhbGlkYXRlSWQodW5kZWZpbmVkKVxuICogLy89RXJyb3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJZChpZCkge1xuICBpZiAoIWlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaWQgaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoW1wic3RyaW5nXCIsIFwibnVtYmVyXCJdLmluZGV4T2YodHlwZW9mIGlkKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpZCBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nXCIpO1xuICB9XG59IiwiaW1wb3J0IHsgZmVhdHVyZSwgbGluZVN0cmluZywgaXNPYmplY3QsIHBvaW50IH0gZnJvbSAnQHR1cmYvaGVscGVycyc7XG4vKipcbiAqIENhbGxiYWNrIGZvciBjb29yZEVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgY29vcmRFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY3VycmVudENvb3JkIFRoZSBjdXJyZW50IGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvb3JkSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGNvb3JkaW5hdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbXVsdGlGZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIE11bHRpLUZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBjb29yZGluYXRlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgY29vcmRFYWNoXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtleGNsdWRlV3JhcENvb3JkPWZhbHNlXSB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBmaW5hbCBjb29yZGluYXRlIG9mIExpbmVhclJpbmdzIHRoYXQgd3JhcHMgdGhlIHJpbmcgaW4gaXRzIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICB0dXJmLnBvaW50KFsyNiwgMzddLCB7XCJmb29cIjogXCJiYXJcIn0pLFxuICogICB0dXJmLnBvaW50KFszNiwgNTNdLCB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9KVxuICogXSk7XG4gKlxuICogdHVyZi5jb29yZEVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpIHtcbiAqICAgLy89Y3VycmVudENvb3JkXG4gKiAgIC8vPWNvb3JkSW5kZXhcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPWdlb21ldHJ5SW5kZXhcbiAqIH0pO1xuICovXG5cbmZ1bmN0aW9uIGNvb3JkRWFjaChnZW9qc29uLCBjYWxsYmFjaywgZXhjbHVkZVdyYXBDb29yZCkge1xuICAvLyBIYW5kbGVzIG51bGwgR2VvbWV0cnkgLS0gU2tpcHMgdGhpcyBHZW9KU09OXG4gIGlmIChnZW9qc29uID09PSBudWxsKSByZXR1cm47XG4gIHZhciBqLFxuICAgICAgayxcbiAgICAgIGwsXG4gICAgICBnZW9tZXRyeSxcbiAgICAgIHN0b3BHLFxuICAgICAgY29vcmRzLFxuICAgICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24sXG4gICAgICB3cmFwU2hyaW5rID0gMCxcbiAgICAgIGNvb3JkSW5kZXggPSAwLFxuICAgICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24sXG4gICAgICB0eXBlID0gZ2VvanNvbi50eXBlLFxuICAgICAgaXNGZWF0dXJlQ29sbGVjdGlvbiA9IHR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgIGlzRmVhdHVyZSA9IHR5cGUgPT09IFwiRmVhdHVyZVwiLFxuICAgICAgc3RvcCA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aCA6IDE7IC8vIFRoaXMgbG9naWMgbWF5IGxvb2sgYSBsaXR0bGUgd2VpcmQuIFRoZSByZWFzb24gd2h5IGl0IGlzIHRoYXQgd2F5XG4gIC8vIGlzIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gYmUgZmFzdC4gR2VvSlNPTiBzdXBwb3J0cyBtdWx0aXBsZSBraW5kc1xuICAvLyBvZiBvYmplY3RzIGF0IGl0cyByb290OiBGZWF0dXJlQ29sbGVjdGlvbiwgRmVhdHVyZXMsIEdlb21ldHJpZXMuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZyBhbGwgb2YgdGhlbSwgYW5kIHRoYXRcbiAgLy8gbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBgZm9yYCBsb29wcyB5b3Ugc2VlIGJlbG93IGFjdHVhbGx5IGp1c3QgZG9uJ3QgYXBwbHlcbiAgLy8gdG8gY2VydGFpbiBpbnB1dHMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGdpdmUgdGhpcyBqdXN0IGFcbiAgLy8gUG9pbnQgZ2VvbWV0cnksIHRoZW4gYm90aCBsb29wcyBhcmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBhbGwgd2UgZG9cbiAgLy8gaXMgZ3JhZHVhbGx5IHJlbmFtZSB0aGUgaW5wdXQgdW50aWwgaXQncyBjYWxsZWQgJ2dlb21ldHJ5Jy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGFpbXMgdG8gYWxsb2NhdGUgYXMgZmV3IHJlc291cmNlcyBhcyBwb3NzaWJsZToganVzdCBhXG4gIC8vIGZldyBudW1iZXJzIGFuZCBib29sZWFucywgcmF0aGVyIHRoYW4gYW55IHRlbXBvcmFyeSBhcnJheXMgYXMgd291bGRcbiAgLy8gYmUgcmVxdWlyZWQgd2l0aCB0aGUgbm9ybWFsaXphdGlvbiBhcHByb2FjaC5cblxuICBmb3IgKHZhciBmZWF0dXJlSW5kZXggPSAwOyBmZWF0dXJlSW5kZXggPCBzdG9wOyBmZWF0dXJlSW5kZXgrKykge1xuICAgIGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXNbZmVhdHVyZUluZGV4XS5nZW9tZXRyeSA6IGlzRmVhdHVyZSA/IGdlb2pzb24uZ2VvbWV0cnkgOiBnZW9qc29uO1xuICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uID0gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiIDogZmFsc2U7XG4gICAgc3RvcEcgPSBpc0dlb21ldHJ5Q29sbGVjdGlvbiA/IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLmdlb21ldHJpZXMubGVuZ3RoIDogMTtcblxuICAgIGZvciAodmFyIGdlb21JbmRleCA9IDA7IGdlb21JbmRleCA8IHN0b3BHOyBnZW9tSW5kZXgrKykge1xuICAgICAgdmFyIG11bHRpRmVhdHVyZUluZGV4ID0gMDtcbiAgICAgIHZhciBnZW9tZXRyeUluZGV4ID0gMDtcbiAgICAgIGdlb21ldHJ5ID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzW2dlb21JbmRleF0gOiBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbjsgLy8gSGFuZGxlcyBudWxsIEdlb21ldHJ5IC0tIFNraXBzIHRoaXMgZ2VvbWV0cnlcblxuICAgICAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIGNvb3JkcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgdmFyIGdlb21UeXBlID0gZ2VvbWV0cnkudHlwZTtcbiAgICAgIHdyYXBTaHJpbmsgPSBleGNsdWRlV3JhcENvb3JkICYmIChnZW9tVHlwZSA9PT0gXCJQb2x5Z29uXCIgfHwgZ2VvbVR5cGUgPT09IFwiTXVsdGlQb2x5Z29uXCIpID8gMSA6IDA7XG5cbiAgICAgIHN3aXRjaCAoZ2VvbVR5cGUpIHtcbiAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQb2ludFwiOlxuICAgICAgICAgIGlmIChjYWxsYmFjayhjb29yZHMsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGNvb3JkSW5kZXgrKztcbiAgICAgICAgICBtdWx0aUZlYXR1cmVJbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGNvb3Jkc1tqXSwgY29vcmRJbmRleCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSBtdWx0aUZlYXR1cmVJbmRleCsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnZW9tVHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIG11bHRpRmVhdHVyZUluZGV4Kys7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb29yZHNbal0ubGVuZ3RoIC0gd3JhcFNocmluazsgaysrKSB7XG4gICAgICAgICAgICAgIGlmIChjYWxsYmFjayhjb29yZHNbal1ba10sIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb29yZEluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnZW9tVHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICAgIGlmIChnZW9tVHlwZSA9PT0gXCJQb2x5Z29uXCIpIGdlb21ldHJ5SW5kZXgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ2VvbVR5cGUgPT09IFwiUG9seWdvblwiKSBtdWx0aUZlYXR1cmVJbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBnZW9tZXRyeUluZGV4ID0gMDtcblxuICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGNvb3Jkc1tqXS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgY29vcmRzW2pdW2tdLmxlbmd0aCAtIHdyYXBTaHJpbms7IGwrKykge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayhjb29yZHNbal1ba11bbF0sIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvb3JkSW5kZXgrKztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdlb21ldHJ5SW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXVsdGlGZWF0dXJlSW5kZXgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChjb29yZEVhY2goZ2VvbWV0cnkuZ2VvbWV0cmllc1tqXSwgY2FsbGJhY2ssIGV4Y2x1ZGVXcmFwQ29vcmQpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBHZW9tZXRyeSBUeXBlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgY29vcmRSZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBjb29yZFJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjdXJyZW50Q29vcmQgVGhlIGN1cnJlbnQgY29vcmRpbmF0ZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29vcmRJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgY29vcmRpbmF0ZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBTdGFydHMgYXQgaW5kZXggMCwgaWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkLCBhbmQgYXQgaW5kZXggMSBvdGhlcndpc2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aUZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgTXVsdGktRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGNvb3JkaW5hdGVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKVxuICpcbiAqIEBuYW1lIGNvb3JkUmVkdWNlXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEdlb21ldHJ5fEZlYXR1cmV9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBbZXhjbHVkZVdyYXBDb29yZD1mYWxzZV0gd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgZmluYWwgY29vcmRpbmF0ZSBvZiBMaW5lYXJSaW5ncyB0aGF0IHdyYXBzIHRoZSByaW5nIGluIGl0cyBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSByZWR1Y3Rpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtcImZvb1wiOiBcImJhclwifSksXG4gKiAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtcImhlbGxvXCI6IFwid29ybGRcIn0pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLmNvb3JkUmVkdWNlKGZlYXR1cmVzLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkLCBjb29yZEluZGV4LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudENvb3JkXG4gKiAgIC8vPWNvb3JkSW5kZXhcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPWdlb21ldHJ5SW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRDb29yZDtcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gY29vcmRSZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgZXhjbHVkZVdyYXBDb29yZCkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgY29vcmRFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpIHtcbiAgICBpZiAoY29vcmRJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRDb29yZDtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50Q29vcmQsIGNvb3JkSW5kZXgsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpO1xuICB9LCBleGNsdWRlV3JhcENvb3JkKTtcbiAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBwcm9wRWFjaFxuICpcbiAqIEBjYWxsYmFjayBwcm9wRWFjaENhbGxiYWNrXG4gKiBAcGFyYW0ge09iamVjdH0gY3VycmVudFByb3BlcnRpZXMgVGhlIGN1cnJlbnQgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBwcm9wZXJ0aWVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5mb3JFYWNoKClcbiAqXG4gKiBAbmFtZSBwcm9wRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudFByb3BlcnRpZXMsIGZlYXR1cmVJbmRleClcbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYucHJvcEVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBwcm9wRWFjaChnZW9qc29uLCBjYWxsYmFjaykge1xuICB2YXIgaTtcblxuICBzd2l0Y2ggKGdlb2pzb24udHlwZSkge1xuICAgIGNhc2UgXCJGZWF0dXJlQ29sbGVjdGlvblwiOlxuICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKGdlb2pzb24uZmVhdHVyZXNbaV0ucHJvcGVydGllcywgaSkgPT09IGZhbHNlKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmVhdHVyZVwiOlxuICAgICAgY2FsbGJhY2soZ2VvanNvbi5wcm9wZXJ0aWVzLCAwKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBwcm9wUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgcHJvcFJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHsqfSBjdXJyZW50UHJvcGVydGllcyBUaGUgY3VycmVudCBQcm9wZXJ0aWVzIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIHByb3BlcnRpZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0IGludG8gYSBzaW5nbGUgdmFsdWUsXG4gKiBzaW1pbGFyIHRvIGhvdyBBcnJheS5yZWR1Y2Ugd29ya3MuIEhvd2V2ZXIsIGluIHRoaXMgY2FzZSB3ZSBsYXppbHkgcnVuXG4gKiB0aGUgcmVkdWN0aW9uLCBzbyBhbiBhcnJheSBvZiBhbGwgcHJvcGVydGllcyBpcyB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBAbmFtZSBwcm9wUmVkdWNlXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYucG9pbnQoWzM2LCA1M10sIHtoZWxsbzogJ3dvcmxkJ30pXG4gKiBdKTtcbiAqXG4gKiB0dXJmLnByb3BSZWR1Y2UoZmVhdHVyZXMsIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudFByb3BlcnRpZXNcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50UHJvcGVydGllc1xuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBwcm9wUmVkdWNlKGdlb2pzb24sIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHByZXZpb3VzVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIHByb3BFYWNoKGdlb2pzb24sIGZ1bmN0aW9uIChjdXJyZW50UHJvcGVydGllcywgZmVhdHVyZUluZGV4KSB7XG4gICAgaWYgKGZlYXR1cmVJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRQcm9wZXJ0aWVzO2Vsc2UgcHJldmlvdXNWYWx1ZSA9IGNhbGxiYWNrKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRQcm9wZXJ0aWVzLCBmZWF0dXJlSW5kZXgpO1xuICB9KTtcbiAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmZWF0dXJlRWFjaFxuICpcbiAqIEBjYWxsYmFjayBmZWF0dXJlRWFjaENhbGxiYWNrXG4gKiBAcGFyYW0ge0ZlYXR1cmU8YW55Pn0gY3VycmVudEZlYXR1cmUgVGhlIGN1cnJlbnQgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBmZWF0dXJlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG9cbiAqIEFycmF5LmZvckVhY2guXG4gKlxuICogQG5hbWUgZmVhdHVyZUVhY2hcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmVhdHVyZUVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRGZWF0dXJlXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBmZWF0dXJlRWFjaChnZW9qc29uLCBjYWxsYmFjaykge1xuICBpZiAoZ2VvanNvbi50eXBlID09PSBcIkZlYXR1cmVcIikge1xuICAgIGNhbGxiYWNrKGdlb2pzb24sIDApO1xuICB9IGVsc2UgaWYgKGdlb2pzb24udHlwZSA9PT0gXCJGZWF0dXJlQ29sbGVjdGlvblwiKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2FsbGJhY2soZ2VvanNvbi5mZWF0dXJlc1tpXSwgaSkgPT09IGZhbHNlKSBicmVhaztcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGZlYXR1cmVSZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBmZWF0dXJlUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0ZlYXR1cmV9IGN1cnJlbnRGZWF0dXJlIFRoZSBjdXJyZW50IEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cblxuLyoqXG4gKiBSZWR1Y2UgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpLlxuICpcbiAqIEBuYW1lIGZlYXR1cmVSZWR1Y2VcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICB0dXJmLnBvaW50KFsyNiwgMzddLCB7XCJmb29cIjogXCJiYXJcIn0pLFxuICogICB0dXJmLnBvaW50KFszNiwgNTNdLCB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9KVxuICogXSk7XG4gKlxuICogdHVyZi5mZWF0dXJlUmVkdWNlKGZlYXR1cmVzLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRGZWF0dXJlXG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICByZXR1cm4gY3VycmVudEZlYXR1cmVcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZmVhdHVyZVJlZHVjZShnZW9qc29uLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICBmZWF0dXJlRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCkge1xuICAgIGlmIChmZWF0dXJlSW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50RmVhdHVyZTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4KTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBHZXQgYWxsIGNvb3JkaW5hdGVzIGZyb20gYW55IEdlb0pTT04gb2JqZWN0LlxuICpcbiAqIEBuYW1lIGNvb3JkQWxsXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGUgcG9zaXRpb24gYXJyYXlcbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHZhciBjb29yZHMgPSB0dXJmLmNvb3JkQWxsKGZlYXR1cmVzKTtcbiAqIC8vPSBbWzI2LCAzN10sIFszNiwgNTNdXVxuICovXG5cblxuZnVuY3Rpb24gY29vcmRBbGwoZ2VvanNvbikge1xuICB2YXIgY29vcmRzID0gW107XG4gIGNvb3JkRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY29vcmQpIHtcbiAgICBjb29yZHMucHVzaChjb29yZCk7XG4gIH0pO1xuICByZXR1cm4gY29vcmRzO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZ2VvbUVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgZ2VvbUVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtHZW9tZXRyeX0gY3VycmVudEdlb21ldHJ5IFRoZSBjdXJyZW50IEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGZlYXR1cmVQcm9wZXJ0aWVzIFRoZSBjdXJyZW50IEZlYXR1cmUgUHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGZlYXR1cmVCQm94IFRoZSBjdXJyZW50IEZlYXR1cmUgQkJveCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZlYXR1cmVJZCBUaGUgY3VycmVudCBGZWF0dXJlIElkIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIGdlb21ldHJ5IGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5mb3JFYWNoKClcbiAqXG4gKiBAbmFtZSBnZW9tRWFjaFxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihbXG4gKiAgICAgdHVyZi5wb2ludChbMjYsIDM3XSwge2ZvbzogJ2Jhcid9KSxcbiAqICAgICB0dXJmLnBvaW50KFszNiwgNTNdLCB7aGVsbG86ICd3b3JsZCd9KVxuICogXSk7XG4gKlxuICogdHVyZi5nZW9tRWFjaChmZWF0dXJlcywgZnVuY3Rpb24gKGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkge1xuICogICAvLz1jdXJyZW50R2VvbWV0cnlcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPWZlYXR1cmVQcm9wZXJ0aWVzXG4gKiAgIC8vPWZlYXR1cmVCQm94XG4gKiAgIC8vPWZlYXR1cmVJZFxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBnZW9tRWFjaChnZW9qc29uLCBjYWxsYmFjaykge1xuICB2YXIgaSxcbiAgICAgIGosXG4gICAgICBnLFxuICAgICAgZ2VvbWV0cnksXG4gICAgICBzdG9wRyxcbiAgICAgIGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLFxuICAgICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24sXG4gICAgICBmZWF0dXJlUHJvcGVydGllcyxcbiAgICAgIGZlYXR1cmVCQm94LFxuICAgICAgZmVhdHVyZUlkLFxuICAgICAgZmVhdHVyZUluZGV4ID0gMCxcbiAgICAgIGlzRmVhdHVyZUNvbGxlY3Rpb24gPSBnZW9qc29uLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgIGlzRmVhdHVyZSA9IGdlb2pzb24udHlwZSA9PT0gXCJGZWF0dXJlXCIsXG4gICAgICBzdG9wID0gaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoIDogMTsgLy8gVGhpcyBsb2dpYyBtYXkgbG9vayBhIGxpdHRsZSB3ZWlyZC4gVGhlIHJlYXNvbiB3aHkgaXQgaXMgdGhhdCB3YXlcbiAgLy8gaXMgYmVjYXVzZSBpdCdzIHRyeWluZyB0byBiZSBmYXN0LiBHZW9KU09OIHN1cHBvcnRzIG11bHRpcGxlIGtpbmRzXG4gIC8vIG9mIG9iamVjdHMgYXQgaXRzIHJvb3Q6IEZlYXR1cmVDb2xsZWN0aW9uLCBGZWF0dXJlcywgR2VvbWV0cmllcy5cbiAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGhhbmRsaW5nIGFsbCBvZiB0aGVtLCBhbmQgdGhhdFxuICAvLyBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIGBmb3JgIGxvb3BzIHlvdSBzZWUgYmVsb3cgYWN0dWFsbHkganVzdCBkb24ndCBhcHBseVxuICAvLyB0byBjZXJ0YWluIGlucHV0cy4gRm9yIGluc3RhbmNlLCBpZiB5b3UgZ2l2ZSB0aGlzIGp1c3QgYVxuICAvLyBQb2ludCBnZW9tZXRyeSwgdGhlbiBib3RoIGxvb3BzIGFyZSBzaG9ydC1jaXJjdWl0ZWQgYW5kIGFsbCB3ZSBkb1xuICAvLyBpcyBncmFkdWFsbHkgcmVuYW1lIHRoZSBpbnB1dCB1bnRpbCBpdCdzIGNhbGxlZCAnZ2VvbWV0cnknLlxuICAvL1xuICAvLyBUaGlzIGFsc28gYWltcyB0byBhbGxvY2F0ZSBhcyBmZXcgcmVzb3VyY2VzIGFzIHBvc3NpYmxlOiBqdXN0IGFcbiAgLy8gZmV3IG51bWJlcnMgYW5kIGJvb2xlYW5zLCByYXRoZXIgdGhhbiBhbnkgdGVtcG9yYXJ5IGFycmF5cyBhcyB3b3VsZFxuICAvLyBiZSByZXF1aXJlZCB3aXRoIHRoZSBub3JtYWxpemF0aW9uIGFwcHJvYWNoLlxuXG4gIGZvciAoaSA9IDA7IGkgPCBzdG9wOyBpKyspIHtcbiAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbiA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzW2ldLmdlb21ldHJ5IDogaXNGZWF0dXJlID8gZ2VvanNvbi5nZW9tZXRyeSA6IGdlb2pzb247XG4gICAgZmVhdHVyZVByb3BlcnRpZXMgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5wcm9wZXJ0aWVzIDogaXNGZWF0dXJlID8gZ2VvanNvbi5wcm9wZXJ0aWVzIDoge307XG4gICAgZmVhdHVyZUJCb3ggPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gZ2VvanNvbi5mZWF0dXJlc1tpXS5iYm94IDogaXNGZWF0dXJlID8gZ2VvanNvbi5iYm94IDogdW5kZWZpbmVkO1xuICAgIGZlYXR1cmVJZCA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBnZW9qc29uLmZlYXR1cmVzW2ldLmlkIDogaXNGZWF0dXJlID8gZ2VvanNvbi5pZCA6IHVuZGVmaW5lZDtcbiAgICBpc0dlb21ldHJ5Q29sbGVjdGlvbiA9IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uID8gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIiA6IGZhbHNlO1xuICAgIHN0b3BHID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzLmxlbmd0aCA6IDE7XG5cbiAgICBmb3IgKGcgPSAwOyBnIDwgc3RvcEc7IGcrKykge1xuICAgICAgZ2VvbWV0cnkgPSBpc0dlb21ldHJ5Q29sbGVjdGlvbiA/IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLmdlb21ldHJpZXNbZ10gOiBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbjsgLy8gSGFuZGxlIG51bGwgR2VvbWV0cnlcblxuICAgICAgaWYgKGdlb21ldHJ5ID09PSBudWxsKSB7XG4gICAgICAgIGlmIChjYWxsYmFjayhudWxsLCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGdlb21ldHJ5Lmdlb21ldHJpZXNbal0sIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEdlb21ldHJ5IFR5cGVcIik7XG4gICAgICB9XG4gICAgfSAvLyBPbmx5IGluY3JlYXNlIGBmZWF0dXJlSW5kZXhgIHBlciBlYWNoIGZlYXR1cmVcblxuXG4gICAgZmVhdHVyZUluZGV4Kys7XG4gIH1cbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGdlb21SZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBnZW9tUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0dlb21ldHJ5fSBjdXJyZW50R2VvbWV0cnkgVGhlIGN1cnJlbnQgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZVByb3BlcnRpZXMgVGhlIGN1cnJlbnQgRmVhdHVyZSBQcm9wZXJ0aWVzIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZmVhdHVyZUJCb3ggVGhlIGN1cnJlbnQgRmVhdHVyZSBCQm94IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZmVhdHVyZUlkIFRoZSBjdXJyZW50IEZlYXR1cmUgSWQgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGdlb21ldHJ5IGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBnZW9tUmVkdWNlXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgICAgdHVyZi5wb2ludChbMzYsIDUzXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZ2VvbVJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRHZW9tZXRyeSwgZmVhdHVyZUluZGV4LCBmZWF0dXJlUHJvcGVydGllcywgZmVhdHVyZUJCb3gsIGZlYXR1cmVJZCkge1xuICogICAvLz1wcmV2aW91c1ZhbHVlXG4gKiAgIC8vPWN1cnJlbnRHZW9tZXRyeVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89ZmVhdHVyZVByb3BlcnRpZXNcbiAqICAgLy89ZmVhdHVyZUJCb3hcbiAqICAgLy89ZmVhdHVyZUlkXG4gKiAgIHJldHVybiBjdXJyZW50R2VvbWV0cnlcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZ2VvbVJlZHVjZShnZW9qc29uLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICBnZW9tRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY3VycmVudEdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIGZlYXR1cmVQcm9wZXJ0aWVzLCBmZWF0dXJlQkJveCwgZmVhdHVyZUlkKSB7XG4gICAgaWYgKGZlYXR1cmVJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRHZW9tZXRyeTtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50R2VvbWV0cnksIGZlYXR1cmVJbmRleCwgZmVhdHVyZVByb3BlcnRpZXMsIGZlYXR1cmVCQm94LCBmZWF0dXJlSWQpO1xuICB9KTtcbiAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBmbGF0dGVuRWFjaFxuICpcbiAqIEBjYWxsYmFjayBmbGF0dGVuRWFjaENhbGxiYWNrXG4gKiBAcGFyYW0ge0ZlYXR1cmV9IGN1cnJlbnRGZWF0dXJlIFRoZSBjdXJyZW50IGZsYXR0ZW5lZCBmZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBmbGF0dGVuZWQgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvXG4gKiBBcnJheS5mb3JFYWNoLlxuICpcbiAqIEBuYW1lIGZsYXR0ZW5FYWNoXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleClcbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKFtcbiAqICAgICB0dXJmLnBvaW50KFsyNiwgMzddLCB7Zm9vOiAnYmFyJ30pLFxuICogICAgIHR1cmYubXVsdGlQb2ludChbWzQwLCAzMF0sIFszNiwgNTNdXSwge2hlbGxvOiAnd29ybGQnfSlcbiAqIF0pO1xuICpcbiAqIHR1cmYuZmxhdHRlbkVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCkge1xuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89bXVsdGlGZWF0dXJlSW5kZXhcbiAqIH0pO1xuICovXG5cblxuZnVuY3Rpb24gZmxhdHRlbkVhY2goZ2VvanNvbiwgY2FsbGJhY2spIHtcbiAgZ2VvbUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGdlb21ldHJ5LCBmZWF0dXJlSW5kZXgsIHByb3BlcnRpZXMsIGJib3gsIGlkKSB7XG4gICAgLy8gQ2FsbGJhY2sgZm9yIHNpbmdsZSBnZW9tZXRyeVxuICAgIHZhciB0eXBlID0gZ2VvbWV0cnkgPT09IG51bGwgPyBudWxsIDogZ2VvbWV0cnkudHlwZTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgICAgaWYgKGNhbGxiYWNrKGZlYXR1cmUoZ2VvbWV0cnksIHByb3BlcnRpZXMsIHtcbiAgICAgICAgICBiYm94OiBiYm94LFxuICAgICAgICAgIGlkOiBpZFxuICAgICAgICB9KSwgZmVhdHVyZUluZGV4LCAwKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBnZW9tVHlwZTsgLy8gQ2FsbGJhY2sgZm9yIG11bHRpLWdlb21ldHJ5XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICAgIGdlb21UeXBlID0gXCJQb2ludFwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICBnZW9tVHlwZSA9IFwiTGluZVN0cmluZ1wiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgICBnZW9tVHlwZSA9IFwiUG9seWdvblwiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBtdWx0aUZlYXR1cmVJbmRleCA9IDA7IG11bHRpRmVhdHVyZUluZGV4IDwgZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoOyBtdWx0aUZlYXR1cmVJbmRleCsrKSB7XG4gICAgICB2YXIgY29vcmRpbmF0ZSA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzW211bHRpRmVhdHVyZUluZGV4XTtcbiAgICAgIHZhciBnZW9tID0ge1xuICAgICAgICB0eXBlOiBnZW9tVHlwZSxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVcbiAgICAgIH07XG4gICAgICBpZiAoY2FsbGJhY2soZmVhdHVyZShnZW9tLCBwcm9wZXJ0aWVzKSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGZsYXR0ZW5SZWR1Y2VcbiAqXG4gKiBUaGUgZmlyc3QgdGltZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgdmFsdWVzIHByb3ZpZGVkIGFzIGFyZ3VtZW50cyBkZXBlbmRcbiAqIG9uIHdoZXRoZXIgdGhlIHJlZHVjZSBtZXRob2QgaGFzIGFuIGluaXRpYWxWYWx1ZSBhcmd1bWVudC5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQgdG8gdGhlIHJlZHVjZSBtZXRob2Q6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyBpbml0aWFsVmFsdWUuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBJZiBhbiBpbml0aWFsVmFsdWUgaXMgbm90IHByb3ZpZGVkOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIEBjYWxsYmFjayBmbGF0dGVuUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0ZlYXR1cmV9IGN1cnJlbnRGZWF0dXJlIFRoZSBjdXJyZW50IEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGZlYXR1cmVJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgRmVhdHVyZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbXVsdGlGZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIE11bHRpLUZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGZsYXR0ZW5lZCBmZWF0dXJlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKCkuXG4gKlxuICogQG5hbWUgZmxhdHRlblJlZHVjZVxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpXG4gKiBAcGFyYW0geyp9IFtpbml0aWFsVmFsdWVdIFZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgcmVkdWN0aW9uLlxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW1xuICogICAgIHR1cmYucG9pbnQoWzI2LCAzN10sIHtmb286ICdiYXInfSksXG4gKiAgICAgdHVyZi5tdWx0aVBvaW50KFtbNDAsIDMwXSwgWzM2LCA1M11dLCB7aGVsbG86ICd3b3JsZCd9KVxuICogXSk7XG4gKlxuICogdHVyZi5mbGF0dGVuUmVkdWNlKGZlYXR1cmVzLCBmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89bXVsdGlGZWF0dXJlSW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRGZWF0dXJlXG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5SZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgZmxhdHRlbkVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KSB7XG4gICAgaWYgKGZlYXR1cmVJbmRleCA9PT0gMCAmJiBtdWx0aUZlYXR1cmVJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRGZWF0dXJlO2Vsc2UgcHJldmlvdXNWYWx1ZSA9IGNhbGxiYWNrKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4KTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3Igc2VnbWVudEVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgc2VnbWVudEVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlPExpbmVTdHJpbmc+fSBjdXJyZW50U2VnbWVudCBUaGUgY3VycmVudCBTZWdtZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gc2VnbWVudEluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBTZWdtZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIDItdmVydGV4IGxpbmUgc2VnbWVudCBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKiAoTXVsdGkpUG9pbnQgZ2VvbWV0cmllcyBkbyBub3QgY29udGFpbiBzZWdtZW50cyB0aGVyZWZvcmUgdGhleSBhcmUgaWdub3JlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW1tbLTUwLCA1XSwgWy00MCwgLTEwXSwgWy01MCwgLTEwXSwgWy00MCwgNV0sIFstNTAsIDVdXV0pO1xuICpcbiAqIC8vIEl0ZXJhdGUgb3ZlciBHZW9KU09OIGJ5IDItdmVydGV4IHNlZ21lbnRzXG4gKiB0dXJmLnNlZ21lbnRFYWNoKHBvbHlnb24sIGZ1bmN0aW9uIChjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRTZWdtZW50XG4gKiAgIC8vPWZlYXR1cmVJbmRleFxuICogICAvLz1tdWx0aUZlYXR1cmVJbmRleFxuICogICAvLz1nZW9tZXRyeUluZGV4XG4gKiAgIC8vPXNlZ21lbnRJbmRleFxuICogfSk7XG4gKlxuICogLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHNcbiAqIHZhciB0b3RhbCA9IDA7XG4gKiB0dXJmLnNlZ21lbnRFYWNoKHBvbHlnb24sIGZ1bmN0aW9uICgpIHtcbiAqICAgICB0b3RhbCsrO1xuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBzZWdtZW50RWFjaChnZW9qc29uLCBjYWxsYmFjaykge1xuICBmbGF0dGVuRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoZmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCkge1xuICAgIHZhciBzZWdtZW50SW5kZXggPSAwOyAvLyBFeGNsdWRlIG51bGwgR2VvbWV0cmllc1xuXG4gICAgaWYgKCFmZWF0dXJlLmdlb21ldHJ5KSByZXR1cm47IC8vIChNdWx0aSlQb2ludCBnZW9tZXRyaWVzIGRvIG5vdCBjb250YWluIHNlZ21lbnRzIHRoZXJlZm9yZSB0aGV5IGFyZSBpZ25vcmVkIGR1cmluZyB0aGlzIG9wZXJhdGlvbi5cblxuICAgIHZhciB0eXBlID0gZmVhdHVyZS5nZW9tZXRyeS50eXBlO1xuICAgIGlmICh0eXBlID09PSBcIlBvaW50XCIgfHwgdHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHJldHVybjsgLy8gR2VuZXJhdGUgMi12ZXJ0ZXggbGluZSBzZWdtZW50c1xuXG4gICAgdmFyIHByZXZpb3VzQ29vcmRzO1xuICAgIHZhciBwcmV2aW91c0ZlYXR1cmVJbmRleCA9IDA7XG4gICAgdmFyIHByZXZpb3VzTXVsdGlJbmRleCA9IDA7XG4gICAgdmFyIHByZXZHZW9tSW5kZXggPSAwO1xuICAgIGlmIChjb29yZEVhY2goZmVhdHVyZSwgZnVuY3Rpb24gKGN1cnJlbnRDb29yZCwgY29vcmRJbmRleCwgZmVhdHVyZUluZGV4Q29vcmQsIG11bHRpUGFydEluZGV4Q29vcmQsIGdlb21ldHJ5SW5kZXgpIHtcbiAgICAgIC8vIFNpbXVsYXRpbmcgYSBtZXRhLmNvb3JkUmVkdWNlKCkgc2luY2UgYHJlZHVjZWAgb3BlcmF0aW9ucyBjYW5ub3QgYmUgc3RvcHBlZCBieSByZXR1cm5pbmcgYGZhbHNlYFxuICAgICAgaWYgKHByZXZpb3VzQ29vcmRzID09PSB1bmRlZmluZWQgfHwgZmVhdHVyZUluZGV4ID4gcHJldmlvdXNGZWF0dXJlSW5kZXggfHwgbXVsdGlQYXJ0SW5kZXhDb29yZCA+IHByZXZpb3VzTXVsdGlJbmRleCB8fCBnZW9tZXRyeUluZGV4ID4gcHJldkdlb21JbmRleCkge1xuICAgICAgICBwcmV2aW91c0Nvb3JkcyA9IGN1cnJlbnRDb29yZDtcbiAgICAgICAgcHJldmlvdXNGZWF0dXJlSW5kZXggPSBmZWF0dXJlSW5kZXg7XG4gICAgICAgIHByZXZpb3VzTXVsdGlJbmRleCA9IG11bHRpUGFydEluZGV4Q29vcmQ7XG4gICAgICAgIHByZXZHZW9tSW5kZXggPSBnZW9tZXRyeUluZGV4O1xuICAgICAgICBzZWdtZW50SW5kZXggPSAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50U2VnbWVudCA9IGxpbmVTdHJpbmcoW3ByZXZpb3VzQ29vcmRzLCBjdXJyZW50Q29vcmRdLCBmZWF0dXJlLnByb3BlcnRpZXMpO1xuICAgICAgaWYgKGNhbGxiYWNrKGN1cnJlbnRTZWdtZW50LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4LCBzZWdtZW50SW5kZXgpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2VnbWVudEluZGV4Kys7XG4gICAgICBwcmV2aW91c0Nvb3JkcyA9IGN1cnJlbnRDb29yZDtcbiAgICB9KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG4vKipcbiAqIENhbGxiYWNrIGZvciBzZWdtZW50UmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAY2FsbGJhY2sgc2VnbWVudFJlZHVjZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHByZXZpb3VzVmFsdWUgVGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvblxuICogb2YgdGhlIGNhbGxiYWNrLCBvciBpbml0aWFsVmFsdWUsIGlmIHN1cHBsaWVkLlxuICogQHBhcmFtIHtGZWF0dXJlPExpbmVTdHJpbmc+fSBjdXJyZW50U2VnbWVudCBUaGUgY3VycmVudCBTZWdtZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBHZW9tZXRyeSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gc2VnbWVudEluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBTZWdtZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSAyLXZlcnRleCBsaW5lIHNlZ21lbnQgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpXG4gKiAoTXVsdGkpUG9pbnQgZ2VvbWV0cmllcyBkbyBub3QgY29udGFpbiBzZWdtZW50cyB0aGVyZWZvcmUgdGhleSBhcmUgaWdub3JlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtGZWF0dXJlQ29sbGVjdGlvbnxGZWF0dXJlfEdlb21ldHJ5fSBnZW9qc29uIGFueSBHZW9KU09OXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50U2VnbWVudCwgY3VycmVudEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbWy01MCwgNV0sIFstNDAsIC0xMF0sIFstNTAsIC0xMF0sIFstNDAsIDVdLCBbLTUwLCA1XV1dKTtcbiAqXG4gKiAvLyBJdGVyYXRlIG92ZXIgR2VvSlNPTiBieSAyLXZlcnRleCBzZWdtZW50c1xuICogdHVyZi5zZWdtZW50UmVkdWNlKHBvbHlnb24sIGZ1bmN0aW9uIChwcmV2aW91c1NlZ21lbnQsIGN1cnJlbnRTZWdtZW50LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4LCBzZWdtZW50SW5kZXgpIHtcbiAqICAgLy89IHByZXZpb3VzU2VnbWVudFxuICogICAvLz0gY3VycmVudFNlZ21lbnRcbiAqICAgLy89IGZlYXR1cmVJbmRleFxuICogICAvLz0gbXVsdGlGZWF0dXJlSW5kZXhcbiAqICAgLy89IGdlb21ldHJ5SW5kZXhcbiAqICAgLy89IHNlZ21lbnRJbmRleFxuICogICByZXR1cm4gY3VycmVudFNlZ21lbnRcbiAqIH0pO1xuICpcbiAqIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzXG4gKiB2YXIgaW5pdGlhbFZhbHVlID0gMFxuICogdmFyIHRvdGFsID0gdHVyZi5zZWdtZW50UmVkdWNlKHBvbHlnb24sIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlKSB7XG4gKiAgICAgcHJldmlvdXNWYWx1ZSsrO1xuICogICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICogfSwgaW5pdGlhbFZhbHVlKTtcbiAqL1xuXG5cbmZ1bmN0aW9uIHNlZ21lbnRSZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgdmFyIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgc2VnbWVudEVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRTZWdtZW50LCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4LCBzZWdtZW50SW5kZXgpIHtcbiAgICBpZiAoc3RhcnRlZCA9PT0gZmFsc2UgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50U2VnbWVudDtlbHNlIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50U2VnbWVudCwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCwgc2VnbWVudEluZGV4KTtcbiAgICBzdGFydGVkID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgbGluZUVhY2hcbiAqXG4gKiBAY2FsbGJhY2sgbGluZUVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtGZWF0dXJlPExpbmVTdHJpbmc+fSBjdXJyZW50TGluZSBUaGUgY3VycmVudCBMaW5lU3RyaW5nfExpbmVhclJpbmcgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gZmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpRmVhdHVyZUluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBNdWx0aS1GZWF0dXJlIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEdlb21ldHJ5IGJlaW5nIHByb2Nlc3NlZFxuICovXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGxpbmUgb3IgcmluZyBjb29yZGluYXRlcyBpbiBMaW5lU3RyaW5nLCBQb2x5Z29uLCBNdWx0aUxpbmVTdHJpbmcsIE11bHRpUG9seWdvbiBGZWF0dXJlcyBvciBHZW9tZXRyaWVzLFxuICogc2ltaWxhciB0byBBcnJheS5mb3JFYWNoLlxuICpcbiAqIEBuYW1lIGxpbmVFYWNoXG4gKiBAcGFyYW0ge0dlb21ldHJ5fEZlYXR1cmU8TGluZVN0cmluZ3xQb2x5Z29ufE11bHRpTGluZVN0cmluZ3xNdWx0aVBvbHlnb24+fSBnZW9qc29uIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudExpbmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgsIGdlb21ldHJ5SW5kZXgpXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpTGluZSA9IHR1cmYubXVsdGlMaW5lU3RyaW5nKFtcbiAqICAgW1syNiwgMzddLCBbMzUsIDQ1XV0sXG4gKiAgIFtbMzYsIDUzXSwgWzM4LCA1MF0sIFs0MSwgNTVdXVxuICogXSk7XG4gKlxuICogdHVyZi5saW5lRWFjaChtdWx0aUxpbmUsIGZ1bmN0aW9uIChjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkge1xuICogICAvLz1jdXJyZW50TGluZVxuICogICAvLz1mZWF0dXJlSW5kZXhcbiAqICAgLy89bXVsdGlGZWF0dXJlSW5kZXhcbiAqICAgLy89Z2VvbWV0cnlJbmRleFxuICogfSk7XG4gKi9cblxuXG5mdW5jdGlvbiBsaW5lRWFjaChnZW9qc29uLCBjYWxsYmFjaykge1xuICAvLyB2YWxpZGF0aW9uXG4gIGlmICghZ2VvanNvbikgdGhyb3cgbmV3IEVycm9yKFwiZ2VvanNvbiBpcyByZXF1aXJlZFwiKTtcbiAgZmxhdHRlbkVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGZlYXR1cmUsIGZlYXR1cmVJbmRleCwgbXVsdGlGZWF0dXJlSW5kZXgpIHtcbiAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIHZhciB0eXBlID0gZmVhdHVyZS5nZW9tZXRyeS50eXBlO1xuICAgIHZhciBjb29yZHMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgICBpZiAoY2FsbGJhY2soZmVhdHVyZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgMCwgMCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgICAgICBmb3IgKHZhciBnZW9tZXRyeUluZGV4ID0gMDsgZ2VvbWV0cnlJbmRleCA8IGNvb3Jkcy5sZW5ndGg7IGdlb21ldHJ5SW5kZXgrKykge1xuICAgICAgICAgIGlmIChjYWxsYmFjayhsaW5lU3RyaW5nKGNvb3Jkc1tnZW9tZXRyeUluZGV4XSwgZmVhdHVyZS5wcm9wZXJ0aWVzKSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBDYWxsYmFjayBmb3IgbGluZVJlZHVjZVxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSB2YWx1ZXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzIGRlcGVuZFxuICogb24gd2hldGhlciB0aGUgcmVkdWNlIG1ldGhvZCBoYXMgYW4gaW5pdGlhbFZhbHVlIGFyZ3VtZW50LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCB0byB0aGUgcmVkdWNlIG1ldGhvZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIGluaXRpYWxWYWx1ZS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IHByZXNlbnQgaW4gdGhlIGFycmF5LlxuICpcbiAqIElmIGFuIGluaXRpYWxWYWx1ZSBpcyBub3QgcHJvdmlkZWQ6XG4gKiAgLSBUaGUgcHJldmlvdXNWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKiAgLSBUaGUgY3VycmVudFZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogQGNhbGxiYWNrIGxpbmVSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gY3VycmVudExpbmUgVGhlIGN1cnJlbnQgTGluZVN0cmluZ3xMaW5lYXJSaW5nIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gbXVsdGlGZWF0dXJlSW5kZXggVGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIE11bHRpLUZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJbmRleCBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgR2VvbWV0cnkgYmVpbmcgcHJvY2Vzc2VkXG4gKi9cblxuLyoqXG4gKiBSZWR1Y2UgZmVhdHVyZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpLlxuICpcbiAqIEBuYW1lIGxpbmVSZWR1Y2VcbiAqIEBwYXJhbSB7R2VvbWV0cnl8RmVhdHVyZTxMaW5lU3RyaW5nfFBvbHlnb258TXVsdGlMaW5lU3RyaW5nfE11bHRpUG9seWdvbj59IGdlb2pzb24gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50TGluZSwgZmVhdHVyZUluZGV4LCBtdWx0aUZlYXR1cmVJbmRleCwgZ2VvbWV0cnlJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSByZWR1Y3Rpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpUG9seSA9IHR1cmYubXVsdGlQb2x5Z29uKFtcbiAqICAgdHVyZi5wb2x5Z29uKFtbWzEyLDQ4XSxbMiw0MV0sWzI0LDM4XSxbMTIsNDhdXSwgW1s5LDQ0XSxbMTMsNDFdLFsxMyw0NV0sWzksNDRdXV0pLFxuICogICB0dXJmLnBvbHlnb24oW1tbNSwgNV0sIFswLCAwXSwgWzIsIDJdLCBbNCwgNF0sIFs1LCA1XV1dKVxuICogXSk7XG4gKlxuICogdHVyZi5saW5lUmVkdWNlKG11bHRpUG9seSwgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRMaW5lLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudExpbmVcbiAqICAgLy89ZmVhdHVyZUluZGV4XG4gKiAgIC8vPW11bHRpRmVhdHVyZUluZGV4XG4gKiAgIC8vPWdlb21ldHJ5SW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRMaW5lXG4gKiB9KTtcbiAqL1xuXG5cbmZ1bmN0aW9uIGxpbmVSZWR1Y2UoZ2VvanNvbiwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgbGluZUVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGN1cnJlbnRMaW5lLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KSB7XG4gICAgaWYgKGZlYXR1cmVJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRMaW5lO2Vsc2UgcHJldmlvdXNWYWx1ZSA9IGNhbGxiYWNrKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRMaW5lLCBmZWF0dXJlSW5kZXgsIG11bHRpRmVhdHVyZUluZGV4LCBnZW9tZXRyeUluZGV4KTtcbiAgfSk7XG4gIHJldHVybiBwcmV2aW91c1ZhbHVlO1xufVxuLyoqXG4gKiBGaW5kcyBhIHBhcnRpY3VsYXIgMi12ZXJ0ZXggTGluZVN0cmluZyBTZWdtZW50IGZyb20gYSBHZW9KU09OIHVzaW5nIGBAdHVyZi9tZXRhYCBpbmRleGVzLlxuICpcbiAqIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBlcm1pdHRlZC5cbiAqIFBvaW50ICYgTXVsdGlQb2ludCB3aWxsIGFsd2F5cyByZXR1cm4gbnVsbC5cbiAqXG4gKiBAcGFyYW0ge0ZlYXR1cmVDb2xsZWN0aW9ufEZlYXR1cmV8R2VvbWV0cnl9IGdlb2pzb24gQW55IEdlb0pTT04gRmVhdHVyZSBvciBHZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBPcHRpb25hbCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZmVhdHVyZUluZGV4PTBdIEZlYXR1cmUgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tdWx0aUZlYXR1cmVJbmRleD0wXSBNdWx0aS1GZWF0dXJlIEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZ2VvbWV0cnlJbmRleD0wXSBHZW9tZXRyeSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNlZ21lbnRJbmRleD0wXSBTZWdtZW50IEluZGV4XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvcGVydGllcz17fV0gVHJhbnNsYXRlIFByb3BlcnRpZXMgdG8gb3V0cHV0IExpbmVTdHJpbmdcbiAqIEBwYXJhbSB7QkJveH0gW29wdGlvbnMuYmJveD17fV0gVHJhbnNsYXRlIEJCb3ggdG8gb3V0cHV0IExpbmVTdHJpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaWQ9e31dIFRyYW5zbGF0ZSBJZCB0byBvdXRwdXQgTGluZVN0cmluZ1xuICogQHJldHVybnMge0ZlYXR1cmU8TGluZVN0cmluZz59IDItdmVydGV4IEdlb0pTT04gRmVhdHVyZSBMaW5lU3RyaW5nXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpTGluZSA9IHR1cmYubXVsdGlMaW5lU3RyaW5nKFtcbiAqICAgICBbWzEwLCAxMF0sIFs1MCwgMzBdLCBbMzAsIDQwXV0sXG4gKiAgICAgW1stMTAsIC0xMF0sIFstNTAsIC0zMF0sIFstMzAsIC00MF1dXG4gKiBdKTtcbiAqXG4gKiAvLyBGaXJzdCBTZWdtZW50IChkZWZhdWx0cyBhcmUgMClcbiAqIHR1cmYuZmluZFNlZ21lbnQobXVsdGlMaW5lKTtcbiAqIC8vID0+IEZlYXR1cmU8TGluZVN0cmluZzxbWzEwLCAxMF0sIFs1MCwgMzBdXT4+XG4gKlxuICogLy8gRmlyc3QgU2VnbWVudCBvZiAybmQgTXVsdGkgRmVhdHVyZVxuICogdHVyZi5maW5kU2VnbWVudChtdWx0aUxpbmUsIHttdWx0aUZlYXR1cmVJbmRleDogMX0pO1xuICogLy8gPT4gRmVhdHVyZTxMaW5lU3RyaW5nPFtbLTEwLCAtMTBdLCBbLTUwLCAtMzBdXT4+XG4gKlxuICogLy8gTGFzdCBTZWdtZW50IG9mIExhc3QgTXVsdGkgRmVhdHVyZVxuICogdHVyZi5maW5kU2VnbWVudChtdWx0aUxpbmUsIHttdWx0aUZlYXR1cmVJbmRleDogLTEsIHNlZ21lbnRJbmRleDogLTF9KTtcbiAqIC8vID0+IEZlYXR1cmU8TGluZVN0cmluZzxbWy01MCwgLTMwXSwgWy0zMCwgLTQwXV0+PlxuICovXG5cblxuZnVuY3Rpb24gZmluZFNlZ21lbnQoZ2VvanNvbiwgb3B0aW9ucykge1xuICAvLyBPcHRpb25hbCBQYXJhbWV0ZXJzXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIWlzT2JqZWN0KG9wdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIGludmFsaWRcIik7XG4gIHZhciBmZWF0dXJlSW5kZXggPSBvcHRpb25zLmZlYXR1cmVJbmRleCB8fCAwO1xuICB2YXIgbXVsdGlGZWF0dXJlSW5kZXggPSBvcHRpb25zLm11bHRpRmVhdHVyZUluZGV4IHx8IDA7XG4gIHZhciBnZW9tZXRyeUluZGV4ID0gb3B0aW9ucy5nZW9tZXRyeUluZGV4IHx8IDA7XG4gIHZhciBzZWdtZW50SW5kZXggPSBvcHRpb25zLnNlZ21lbnRJbmRleCB8fCAwOyAvLyBGaW5kIEZlYXR1cmVJbmRleFxuXG4gIHZhciBwcm9wZXJ0aWVzID0gb3B0aW9ucy5wcm9wZXJ0aWVzO1xuICB2YXIgZ2VvbWV0cnk7XG5cbiAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHtcbiAgICBjYXNlIFwiRmVhdHVyZUNvbGxlY3Rpb25cIjpcbiAgICAgIGlmIChmZWF0dXJlSW5kZXggPCAwKSBmZWF0dXJlSW5kZXggPSBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aCArIGZlYXR1cmVJbmRleDtcbiAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IGdlb2pzb24uZmVhdHVyZXNbZmVhdHVyZUluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgZ2VvbWV0cnkgPSBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0uZ2VvbWV0cnk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJGZWF0dXJlXCI6XG4gICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCBnZW9qc29uLnByb3BlcnRpZXM7XG4gICAgICBnZW9tZXRyeSA9IGdlb2pzb24uZ2VvbWV0cnk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJQb2ludFwiOlxuICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XG4gICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgZ2VvbWV0cnkgPSBnZW9qc29uO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2VvanNvbiBpcyBpbnZhbGlkXCIpO1xuICB9IC8vIEZpbmQgU2VnbWVudEluZGV4XG5cblxuICBpZiAoZ2VvbWV0cnkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICB2YXIgY29vcmRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG5cbiAgc3dpdGNoIChnZW9tZXRyeS50eXBlKSB7XG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBcIkxpbmVTdHJpbmdcIjpcbiAgICAgIGlmIChzZWdtZW50SW5kZXggPCAwKSBzZWdtZW50SW5kZXggPSBjb29yZHMubGVuZ3RoICsgc2VnbWVudEluZGV4IC0gMTtcbiAgICAgIHJldHVybiBsaW5lU3RyaW5nKFtjb29yZHNbc2VnbWVudEluZGV4XSwgY29vcmRzW3NlZ21lbnRJbmRleCArIDFdXSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG5cbiAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgICAgaWYgKGdlb21ldHJ5SW5kZXggPCAwKSBnZW9tZXRyeUluZGV4ID0gY29vcmRzLmxlbmd0aCArIGdlb21ldHJ5SW5kZXg7XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgMCkgc2VnbWVudEluZGV4ID0gY29vcmRzW2dlb21ldHJ5SW5kZXhdLmxlbmd0aCArIHNlZ21lbnRJbmRleCAtIDE7XG4gICAgICByZXR1cm4gbGluZVN0cmluZyhbY29vcmRzW2dlb21ldHJ5SW5kZXhdW3NlZ21lbnRJbmRleF0sIGNvb3Jkc1tnZW9tZXRyeUluZGV4XVtzZWdtZW50SW5kZXggKyAxXV0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgaWYgKG11bHRpRmVhdHVyZUluZGV4IDwgMCkgbXVsdGlGZWF0dXJlSW5kZXggPSBjb29yZHMubGVuZ3RoICsgbXVsdGlGZWF0dXJlSW5kZXg7XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgMCkgc2VnbWVudEluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBzZWdtZW50SW5kZXggLSAxO1xuICAgICAgcmV0dXJuIGxpbmVTdHJpbmcoW2Nvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bc2VnbWVudEluZGV4XSwgY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtzZWdtZW50SW5kZXggKyAxXV0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgaWYgKG11bHRpRmVhdHVyZUluZGV4IDwgMCkgbXVsdGlGZWF0dXJlSW5kZXggPSBjb29yZHMubGVuZ3RoICsgbXVsdGlGZWF0dXJlSW5kZXg7XG4gICAgICBpZiAoZ2VvbWV0cnlJbmRleCA8IDApIGdlb21ldHJ5SW5kZXggPSBjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdLmxlbmd0aCArIGdlb21ldHJ5SW5kZXg7XG4gICAgICBpZiAoc2VnbWVudEluZGV4IDwgMCkgc2VnbWVudEluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtnZW9tZXRyeUluZGV4XS5sZW5ndGggLSBzZWdtZW50SW5kZXggLSAxO1xuICAgICAgcmV0dXJuIGxpbmVTdHJpbmcoW2Nvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bZ2VvbWV0cnlJbmRleF1bc2VnbWVudEluZGV4XSwgY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtnZW9tZXRyeUluZGV4XVtzZWdtZW50SW5kZXggKyAxXV0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiZ2VvanNvbiBpcyBpbnZhbGlkXCIpO1xufVxuLyoqXG4gKiBGaW5kcyBhIHBhcnRpY3VsYXIgUG9pbnQgZnJvbSBhIEdlb0pTT04gdXNpbmcgYEB0dXJmL21ldGFgIGluZGV4ZXMuXG4gKlxuICogTmVnYXRpdmUgaW5kZXhlcyBhcmUgcGVybWl0dGVkLlxuICpcbiAqIEBwYXJhbSB7RmVhdHVyZUNvbGxlY3Rpb258RmVhdHVyZXxHZW9tZXRyeX0gZ2VvanNvbiBBbnkgR2VvSlNPTiBGZWF0dXJlIG9yIEdlb21ldHJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIE9wdGlvbmFsIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5mZWF0dXJlSW5kZXg9MF0gRmVhdHVyZSBJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm11bHRpRmVhdHVyZUluZGV4PTBdIE11bHRpLUZlYXR1cmUgSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5nZW9tZXRyeUluZGV4PTBdIEdlb21ldHJ5IEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY29vcmRJbmRleD0wXSBDb29yZCBJbmRleFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb3BlcnRpZXM9e31dIFRyYW5zbGF0ZSBQcm9wZXJ0aWVzIHRvIG91dHB1dCBQb2ludFxuICogQHBhcmFtIHtCQm94fSBbb3B0aW9ucy5iYm94PXt9XSBUcmFuc2xhdGUgQkJveCB0byBvdXRwdXQgUG9pbnRcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaWQ9e31dIFRyYW5zbGF0ZSBJZCB0byBvdXRwdXQgUG9pbnRcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvaW50Pn0gMi12ZXJ0ZXggR2VvSlNPTiBGZWF0dXJlIFBvaW50XG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpTGluZSA9IHR1cmYubXVsdGlMaW5lU3RyaW5nKFtcbiAqICAgICBbWzEwLCAxMF0sIFs1MCwgMzBdLCBbMzAsIDQwXV0sXG4gKiAgICAgW1stMTAsIC0xMF0sIFstNTAsIC0zMF0sIFstMzAsIC00MF1dXG4gKiBdKTtcbiAqXG4gKiAvLyBGaXJzdCBTZWdtZW50IChkZWZhdWx0cyBhcmUgMClcbiAqIHR1cmYuZmluZFBvaW50KG11bHRpTGluZSk7XG4gKiAvLyA9PiBGZWF0dXJlPFBvaW50PFsxMCwgMTBdPj5cbiAqXG4gKiAvLyBGaXJzdCBTZWdtZW50IG9mIHRoZSAybmQgTXVsdGktRmVhdHVyZVxuICogdHVyZi5maW5kUG9pbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IDF9KTtcbiAqIC8vID0+IEZlYXR1cmU8UG9pbnQ8Wy0xMCwgLTEwXT4+XG4gKlxuICogLy8gTGFzdCBTZWdtZW50IG9mIGxhc3QgTXVsdGktRmVhdHVyZVxuICogdHVyZi5maW5kUG9pbnQobXVsdGlMaW5lLCB7bXVsdGlGZWF0dXJlSW5kZXg6IC0xLCBjb29yZEluZGV4OiAtMX0pO1xuICogLy8gPT4gRmVhdHVyZTxQb2ludDxbLTMwLCAtNDBdPj5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRQb2ludChnZW9qc29uLCBvcHRpb25zKSB7XG4gIC8vIE9wdGlvbmFsIFBhcmFtZXRlcnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMgaXMgaW52YWxpZFwiKTtcbiAgdmFyIGZlYXR1cmVJbmRleCA9IG9wdGlvbnMuZmVhdHVyZUluZGV4IHx8IDA7XG4gIHZhciBtdWx0aUZlYXR1cmVJbmRleCA9IG9wdGlvbnMubXVsdGlGZWF0dXJlSW5kZXggfHwgMDtcbiAgdmFyIGdlb21ldHJ5SW5kZXggPSBvcHRpb25zLmdlb21ldHJ5SW5kZXggfHwgMDtcbiAgdmFyIGNvb3JkSW5kZXggPSBvcHRpb25zLmNvb3JkSW5kZXggfHwgMDsgLy8gRmluZCBGZWF0dXJlSW5kZXhcblxuICB2YXIgcHJvcGVydGllcyA9IG9wdGlvbnMucHJvcGVydGllcztcbiAgdmFyIGdlb21ldHJ5O1xuXG4gIHN3aXRjaCAoZ2VvanNvbi50eXBlKSB7XG4gICAgY2FzZSBcIkZlYXR1cmVDb2xsZWN0aW9uXCI6XG4gICAgICBpZiAoZmVhdHVyZUluZGV4IDwgMCkgZmVhdHVyZUluZGV4ID0gZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGggKyBmZWF0dXJlSW5kZXg7XG4gICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCBnZW9qc29uLmZlYXR1cmVzW2ZlYXR1cmVJbmRleF0ucHJvcGVydGllcztcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbi5mZWF0dXJlc1tmZWF0dXJlSW5kZXhdLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmVhdHVyZVwiOlxuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgZ2VvanNvbi5wcm9wZXJ0aWVzO1xuICAgICAgZ2VvbWV0cnkgPSBnZW9qc29uLmdlb21ldHJ5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjpcbiAgICAgIGdlb21ldHJ5ID0gZ2VvanNvbjtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImdlb2pzb24gaXMgaW52YWxpZFwiKTtcbiAgfSAvLyBGaW5kIENvb3JkIEluZGV4XG5cblxuICBpZiAoZ2VvbWV0cnkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICB2YXIgY29vcmRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG5cbiAgc3dpdGNoIChnZW9tZXRyeS50eXBlKSB7XG4gICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6XG4gICAgICBpZiAobXVsdGlGZWF0dXJlSW5kZXggPCAwKSBtdWx0aUZlYXR1cmVJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBtdWx0aUZlYXR1cmVJbmRleDtcbiAgICAgIHJldHVybiBwb2ludChjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICBpZiAoY29vcmRJbmRleCA8IDApIGNvb3JkSW5kZXggPSBjb29yZHMubGVuZ3RoICsgY29vcmRJbmRleDtcbiAgICAgIHJldHVybiBwb2ludChjb29yZHNbY29vcmRJbmRleF0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIlBvbHlnb25cIjpcbiAgICAgIGlmIChnZW9tZXRyeUluZGV4IDwgMCkgZ2VvbWV0cnlJbmRleCA9IGNvb3Jkcy5sZW5ndGggKyBnZW9tZXRyeUluZGV4O1xuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzW2dlb21ldHJ5SW5kZXhdLmxlbmd0aCArIGNvb3JkSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW2dlb21ldHJ5SW5kZXhdW2Nvb3JkSW5kZXhdLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTtcblxuICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjpcbiAgICAgIGlmIChtdWx0aUZlYXR1cmVJbmRleCA8IDApIG11bHRpRmVhdHVyZUluZGV4ID0gY29vcmRzLmxlbmd0aCArIG11bHRpRmVhdHVyZUluZGV4O1xuICAgICAgaWYgKGNvb3JkSW5kZXggPCAwKSBjb29yZEluZGV4ID0gY29vcmRzW211bHRpRmVhdHVyZUluZGV4XS5sZW5ndGggKyBjb29yZEluZGV4O1xuICAgICAgcmV0dXJuIHBvaW50KGNvb3Jkc1ttdWx0aUZlYXR1cmVJbmRleF1bY29vcmRJbmRleF0sIHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuXG4gICAgY2FzZSBcIk11bHRpUG9seWdvblwiOlxuICAgICAgaWYgKG11bHRpRmVhdHVyZUluZGV4IDwgMCkgbXVsdGlGZWF0dXJlSW5kZXggPSBjb29yZHMubGVuZ3RoICsgbXVsdGlGZWF0dXJlSW5kZXg7XG4gICAgICBpZiAoZ2VvbWV0cnlJbmRleCA8IDApIGdlb21ldHJ5SW5kZXggPSBjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdLmxlbmd0aCArIGdlb21ldHJ5SW5kZXg7XG4gICAgICBpZiAoY29vcmRJbmRleCA8IDApIGNvb3JkSW5kZXggPSBjb29yZHNbbXVsdGlGZWF0dXJlSW5kZXhdW2dlb21ldHJ5SW5kZXhdLmxlbmd0aCAtIGNvb3JkSW5kZXg7XG4gICAgICByZXR1cm4gcG9pbnQoY29vcmRzW211bHRpRmVhdHVyZUluZGV4XVtnZW9tZXRyeUluZGV4XVtjb29yZEluZGV4XSwgcHJvcGVydGllcywgb3B0aW9ucyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJnZW9qc29uIGlzIGludmFsaWRcIik7XG59XG5cbmV4cG9ydCB7IGNvb3JkQWxsLCBjb29yZEVhY2gsIGNvb3JkUmVkdWNlLCBmZWF0dXJlRWFjaCwgZmVhdHVyZVJlZHVjZSwgZmluZFBvaW50LCBmaW5kU2VnbWVudCwgZmxhdHRlbkVhY2gsIGZsYXR0ZW5SZWR1Y2UsIGdlb21FYWNoLCBnZW9tUmVkdWNlLCBsaW5lRWFjaCwgbGluZVJlZHVjZSwgcHJvcEVhY2gsIHByb3BSZWR1Y2UsIHNlZ21lbnRFYWNoLCBzZWdtZW50UmVkdWNlIH07IiwiaW1wb3J0IHsgY29vcmRFYWNoIH0gZnJvbSBcIkB0dXJmL21ldGFcIjtcbi8qKlxuICogVGFrZXMgYSBzZXQgb2YgZmVhdHVyZXMsIGNhbGN1bGF0ZXMgdGhlIGJib3ggb2YgYWxsIGlucHV0IGZlYXR1cmVzLCBhbmQgcmV0dXJucyBhIGJvdW5kaW5nIGJveC5cbiAqXG4gKiBAbmFtZSBiYm94XG4gKiBAcGFyYW0ge0dlb0pTT059IGdlb2pzb24gYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcmV0dXJucyB7QkJveH0gYmJveCBleHRlbnQgaW4gW21pblgsIG1pblksIG1heFgsIG1heFldIG9yZGVyXG4gKiBAZXhhbXBsZVxuICogdmFyIGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcoW1stNzQsIDQwXSwgWy03OCwgNDJdLCBbLTgyLCAzNV1dKTtcbiAqIHZhciBiYm94ID0gdHVyZi5iYm94KGxpbmUpO1xuICogdmFyIGJib3hQb2x5Z29uID0gdHVyZi5iYm94UG9seWdvbihiYm94KTtcbiAqXG4gKiAvL2FkZFRvTWFwXG4gKiB2YXIgYWRkVG9NYXAgPSBbbGluZSwgYmJveFBvbHlnb25dXG4gKi9cblxuZnVuY3Rpb24gYmJveChnZW9qc29uKSB7XG4gIHZhciByZXN1bHQgPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gIGNvb3JkRWFjaChnZW9qc29uLCBmdW5jdGlvbiAoY29vcmQpIHtcbiAgICBpZiAocmVzdWx0WzBdID4gY29vcmRbMF0pIHtcbiAgICAgIHJlc3VsdFswXSA9IGNvb3JkWzBdO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRbMV0gPiBjb29yZFsxXSkge1xuICAgICAgcmVzdWx0WzFdID0gY29vcmRbMV07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdFsyXSA8IGNvb3JkWzBdKSB7XG4gICAgICByZXN1bHRbMl0gPSBjb29yZFswXTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0WzNdIDwgY29vcmRbMV0pIHtcbiAgICAgIHJlc3VsdFszXSA9IGNvb3JkWzFdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmJib3hbXCJkZWZhdWx0XCJdID0gYmJveDtcbmV4cG9ydCBkZWZhdWx0IGJib3g7IiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbnZhciB1c2VFZmZlY3RPbmNlID0gZnVuY3Rpb24gdXNlRWZmZWN0T25jZShlZmZlY3QpIHtcbiAgdXNlRWZmZWN0KGVmZmVjdCwgW10pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdXNlRWZmZWN0T25jZTsiLCJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRWZmZWN0T25jZSBmcm9tICcuL3VzZUVmZmVjdE9uY2UnO1xuXG52YXIgdXNlVW5tb3VudCA9IGZ1bmN0aW9uIHVzZVVubW91bnQoZm4pIHtcbiAgdmFyIGZuUmVmID0gdXNlUmVmKGZuKTsgLy8gdXBkYXRlIHRoZSByZWYgZWFjaCByZW5kZXIgc28gaWYgaXQgY2hhbmdlIHRoZSBuZXdlc3QgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkXG5cbiAgZm5SZWYuY3VycmVudCA9IGZuO1xuICB1c2VFZmZlY3RPbmNlKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuUmVmLmN1cnJlbnQoKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVVubW91bnQ7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlVW5tb3VudCBmcm9tICcuL3VzZVVubW91bnQnO1xuXG52YXIgdXNlUmFmU3RhdGUgPSBmdW5jdGlvbiB1c2VSYWZTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGZyYW1lID0gdXNlUmVmKDApO1xuXG4gIHZhciBfYSA9IHVzZVN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgICBzdGF0ZSA9IF9hWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfYVsxXTtcblxuICB2YXIgc2V0UmFmU3RhdGUgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZS5jdXJyZW50KTtcbiAgICBmcmFtZS5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFN0YXRlKHZhbHVlKTtcbiAgICB9KTtcbiAgfSwgW10pO1xuICB1c2VVbm1vdW50KGZ1bmN0aW9uICgpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZS5jdXJyZW50KTtcbiAgfSk7XG4gIHJldHVybiBbc3RhdGUsIHNldFJhZlN0YXRlXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVJhZlN0YXRlOyIsImV4cG9ydCB2YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBvbihvYmopIHtcbiAgdmFyIGFyZ3MgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICBpZiAob2JqICYmIG9iai5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIuYXBwbHkob2JqLCBhcmdzKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG9mZihvYmopIHtcbiAgdmFyIGFyZ3MgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICBpZiAob2JqICYmIG9iai5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkob2JqLCBhcmdzKTtcbiAgfVxufVxuZXhwb3J0IHZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydCB2YXIgaXNOYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJzsiLCJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlUmFmU3RhdGUgZnJvbSAnLi91c2VSYWZTdGF0ZSc7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIG9mZiwgb24gfSBmcm9tICcuL21pc2MvdXRpbCc7XG5cbnZhciB1c2VXaW5kb3dTaXplID0gZnVuY3Rpb24gdXNlV2luZG93U2l6ZShpbml0aWFsV2lkdGgsIGluaXRpYWxIZWlnaHQpIHtcbiAgaWYgKGluaXRpYWxXaWR0aCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdGlhbFdpZHRoID0gSW5maW5pdHk7XG4gIH1cblxuICBpZiAoaW5pdGlhbEhlaWdodCA9PT0gdm9pZCAwKSB7XG4gICAgaW5pdGlhbEhlaWdodCA9IEluZmluaXR5O1xuICB9XG5cbiAgdmFyIF9hID0gdXNlUmFmU3RhdGUoe1xuICAgIHdpZHRoOiBpc0Jyb3dzZXIgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IGluaXRpYWxXaWR0aCxcbiAgICBoZWlnaHQ6IGlzQnJvd3NlciA/IHdpbmRvdy5pbm5lckhlaWdodCA6IGluaXRpYWxIZWlnaHRcbiAgfSksXG4gICAgICBzdGF0ZSA9IF9hWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfYVsxXTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIHZhciBoYW5kbGVyXzEgPSBmdW5jdGlvbiBoYW5kbGVyXzEoKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBvbih3aW5kb3csICdyZXNpemUnLCBoYW5kbGVyXzEpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2ZmKHdpbmRvdywgJ3Jlc2l6ZScsIGhhbmRsZXJfMSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW10pO1xuICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1c2VXaW5kb3dTaXplOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciB0ZXJyaXRvcnlGb2N1c0NvbnRhaW5lciA9IFwidGVycml0b3J5Rm9jdXNDb250cm9sLW1vZHVsZS0tdGVycml0b3J5Rm9jdXNDb250YWluZXItLTNOMFhNXCI7IiwiaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuaW1wb3J0IFJlYWN0LCB7TW91c2VFdmVudEhhbmRsZXJ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7X3VzZU1hcENvbnRyb2wgYXMgdXNlTWFwQ29udHJvbH0gZnJvbSAncmVhY3QtbWFwLWdsJztcblxuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vdGVycml0b3J5Rm9jdXNDb250cm9sLm1vZHVsZS5zY3NzJztcbmltcG9ydCAqIGFzIEVYUExPUkVfQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvZXhwbG9yZSc7XG5cbmludGVyZmFjZSBJVGVycml0b3J5Rm9jdXNDb250cm9sIHtcbiAgb25DbGlja1RlcnJpdG9yeUZvY3VzQnV0dG9uOiBNb3VzZUV2ZW50SGFuZGxlcjxIVE1MQnV0dG9uRWxlbWVudD47XG59XG5cbmNvbnN0IFRlcnJpdG9yeUZvY3VzQ29udHJvbCA9ICh7b25DbGlja1RlcnJpdG9yeUZvY3VzQnV0dG9ufTogSVRlcnJpdG9yeUZvY3VzQ29udHJvbCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIGNvbnN0IHtjb250YWluZXJSZWZ9ID0gdXNlTWFwQ29udHJvbCh7XG4gICAgLy8gQHRzLWlnbm9yZSAvLyBUeXBlcyBoYXZlIG5vdCBjYXVnaHQgdXAgeWV0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2dsL3JlYWN0LW1hcC1nbC9pc3N1ZXMvMTQ5MlxuICAgIG9uQ2xpY2s6IG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbixcbiAgfSk7XG5cbiAgY29uc3QgdGVycml0b3JpZXMgPSBbXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuTUFQLkxPV0VSNDhfU0hPUlQpLFxuICAgICAgbG9uZzogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5NQVAuTE9XRVI0OF9MT05HKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3J0OiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLk1BUC5BTEFTS0FfU0hPUlQpLFxuICAgICAgbG9uZzogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5NQVAuQUxBU0tBX0xPTkcpLFxuICAgIH0sXG4gICAge1xuICAgICAgc2hvcnQ6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuTUFQLkhBV0FJSV9TSE9SVCksXG4gICAgICBsb25nOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLk1BUC5IQVdBSUlfTE9ORyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzaG9ydDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5NQVAuUFJfU0hPUlQpLFxuICAgICAgbG9uZzogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5NQVAuUFJfTE9ORyksXG4gICAgfSxcbiAgXTtcbiAgLy8gdGhlIG9mZnNldCBmb3IgdGhpcyBhcnJheSBzaG91bGQgbWFwIHRoZSB0ZXJyaXRvcmllcyB2YXJpYWJsZVxuICBjb25zdCB0ZXJyaXRvcmllc0ljb25DbGFzc05hbWUgPSBbXG4gICAgJ21hcGJveGdsLWN0cmwtem9vbS10by00OCcsXG4gICAgJ21hcGJveGdsLWN0cmwtem9vbS10by1haycsXG4gICAgJ21hcGJveGdsLWN0cmwtem9vbS10by1oaScsXG4gICAgJ21hcGJveGdsLWN0cmwtem9vbS10by1wcicsXG4gIF07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHJlZj17Y29udGFpbmVyUmVmfSBjbGFzc05hbWU9e3N0eWxlcy50ZXJyaXRvcnlGb2N1c0NvbnRhaW5lcn0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17J21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cCd9PlxuICAgICAgICB7dGVycml0b3JpZXMubWFwKCh0ZXJyaXRvcnksIGluZGV4KSA9PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlkPXt0ZXJyaXRvcnkuc2hvcnR9XG4gICAgICAgICAgICBrZXk9e3RlcnJpdG9yeS5zaG9ydH1cbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17J21hcGJveGdsLWN0cmwtaWNvbiAnICsgdGVycml0b3JpZXNJY29uQ2xhc3NOYW1lW2luZGV4XX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e2ludGwuZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZDogJ21hcC50ZXJyaXRvcnlGb2N1cy5mb2N1c09uJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRm9jdXMgb24ge3RlcnJpdG9yeX0nLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdGb2N1cyBvbiB0aGUgYm91bmRzIG9mIGEgc3BlY2lmaWMgdGVycml0b3J5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRlcnJpdG9yeTogdGVycml0b3J5LmxvbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICl9PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnbWFwYm94Z2wtY3RybC1pY29uJ30gYXJpYS1oaWRkZW49e3RydWV9Lz5cbiAgICAgICAgICA8L2J1dHRvbj4sXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRlcnJpdG9yeUZvY3VzQ29udHJvbDtcblxuIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJR1Z1WVdKc1pTMWlZV05yWjNKdmRXNWtQU0p1WlhjZ01DQXdJREkwSURJMElpQm9aV2xuYUhROUlqSTBJaUIyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhkcFpIUm9QU0l5TkNJK1BHYytQSEpsWTNRZ1ptbHNiRDBpYm05dVpTSWdhR1ZwWjJoMFBTSXlOQ0lnZDJsa2RHZzlJakkwSWk4K1BDOW5QanhuUGp4blBqeG5Qanh3WVhSb0lHUTlJazA1TERJeFl6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEUmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEZJT1ZZeU1Yb2dUVEV5TERKRE9DNHhOQ3d5TERVc05TNHhOQ3cxTERsak1Dd3lMak00TERFdU1Ua3NOQzQwTnl3ekxEVXVOelJXTVRjZ1l6QXNNQzQxTlN3d0xqUTFMREVzTVN3eGFEWmpNQzQxTlN3d0xERXRNQzQwTlN3eExURjJMVEl1TWpaak1TNDRNUzB4TGpJM0xETXRNeTR6Tml3ekxUVXVOelJETVRrc05TNHhOQ3d4TlM0NE5pd3lMREV5TERKNklFMHhOQ3d4TXk0M1ZqRTJhQzAwZGkweUxqTWdRemd1TkRnc01USXVOak1zTnl3eE1TNDFNeXczTERsak1DMHlMamMyTERJdU1qUXROU3cxTFRWek5Td3lMakkwTERVc05VTXhOeXd4TVM0ME9Td3hOUzQwT1N3eE1pNDJOU3d4TkN3eE15NDNlaUl2UGp3dlp6NDhMMmMrUEM5blBqd3ZjM1puUGc9PVwiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIG1hcEludHJvQ29udGFpbmVyID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1tYXBJbnRyb0NvbnRhaW5lci0tMUs4ZHVcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9IZWFkZXIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvSGVhZGVyLS0zMkxCc1wiO1xuZXhwb3J0IHZhciBtYXBJbnRyb1RleHQgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvVGV4dC0tVGliOExcIjtcbmV4cG9ydCB2YXIgbWFwSW50cm9MaWdodGJ1bGIgPSBcIm1hcEludHJvZHVjdGlvbi1tb2R1bGUtLW1hcEludHJvTGlnaHRidWxiLS0zTEJ4MFwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93Qm94ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93Qm94LS0zenRFeVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93ID0gXCJtYXBJbnRyb2R1Y3Rpb24tbW9kdWxlLS1kaWRZb3VLbm93LS0zX3ZfaVwiO1xuZXhwb3J0IHZhciBkaWRZb3VLbm93VGV4dCA9IFwibWFwSW50cm9kdWN0aW9uLW1vZHVsZS0tZGlkWW91S25vd1RleHQtLTNzZ0hzXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IGxpZ2h0YnVsYkljb24gZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvbGlnaHRidWxiX291dGxpbmUuc3ZnJztcbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL21hcEludHJvZHVjdGlvbi5tb2R1bGUuc2Nzcyc7XG5pbXBvcnQgKiBhcyBFWFBMT1JFX0NPUFkgZnJvbSAnLi4vZGF0YS9jb3B5L2V4cGxvcmUnO1xuXG5jb25zdCBNYXBJbnRyb2R1Y3Rpb24gPSAoKSA9PiB7XG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8YXNpZGUgY2xhc3NOYW1lPXtzdHlsZXMubWFwSW50cm9Db250YWluZXJ9PlxuICAgICAgPGhlYWRlciBjbGFzc05hbWU9e3N0eWxlcy5tYXBJbnRyb0hlYWRlcn0+XG4gICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5JVElBTF9TVEFURS5USVRMRSl9XG4gICAgICA8L2hlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubWFwSW50cm9UZXh0fT5cbiAgICAgICAgPGltZyBjbGFzc05hbWU9e3N0eWxlcy5tYXBJbnRyb0xpZ2h0YnVsYn0gc3JjPXtsaWdodGJ1bGJJY29ufSBhbHQ9eydpY29uIHNob3dpbmcgYSBsaWdodGJ1bGInfS8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZGlkWW91S25vd0JveH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kaWRZb3VLbm93fT5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5JVElBTF9TVEFURS5ESURfWU9VX0tOT1cpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxjaXRlIGNsYXNzTmFtZT17c3R5bGVzLmRpZFlvdUtub3dUZXh0fT5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5JVElBTF9TVEFURS5DQkdfREVGSU5JVElPTil9XG4gICAgICAgICAgPC9jaXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXBJbnRyb2R1Y3Rpb247XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgYXJlYURldGFpbENvbnRhaW5lciA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWFyZWFEZXRhaWxDb250YWluZXItLVlGVGhSXCI7XG5leHBvcnQgdmFyIGNhdGVnb3JpemF0aW9uID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tY2F0ZWdvcml6YXRpb24tLWhCOUs4XCI7XG5leHBvcnQgdmFyIGNvbW11bml0eU9mRm9jdXMgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1jb21tdW5pdHlPZkZvY3VzLS0yRElXTVwiO1xuZXhwb3J0IHZhciBjb21tdW5pdHlPZkZvY3VzQ2lyY2xlID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tY29tbXVuaXR5T2ZGb2N1c0NpcmNsZS0tMkt6ajVcIjtcbmV4cG9ydCB2YXIgY2Vuc3VzUm93ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tY2Vuc3VzUm93LS0xNjlPOFwiO1xuZXhwb3J0IHZhciBjZW5zdXNMYWJlbCA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWNlbnN1c0xhYmVsLS0zU0MtY1wiO1xuZXhwb3J0IHZhciBjZW5zdXNUZXh0ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0tY2Vuc3VzVGV4dC0tM2oxeGdcIjtcbmV4cG9ydCB2YXIgZGl2aWRlciA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWRpdmlkZXItLTN5dzlVXCI7XG5leHBvcnQgdmFyIGluZGljYXRvckJveE1haW4gPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1pbmRpY2F0b3JCb3hNYWluLS0xM0pEVVwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JCb3hBZGRpdGlvbmFsID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0taW5kaWNhdG9yQm94QWRkaXRpb25hbC0tMzFXVVpcIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yUm93ID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0taW5kaWNhdG9yUm93LS0xdVdCaVwiO1xuZXhwb3J0IHZhciBpbmRpY2F0b3JOYW1lID0gXCJhcmVhRGV0YWlsLW1vZHVsZS0taW5kaWNhdG9yTmFtZS0tMm4wUlNcIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yVmFsdWUgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1pbmRpY2F0b3JWYWx1ZS0tM0V0VlFcIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yU3VwZXJzY3JpcHQgPSBcImFyZWFEZXRhaWwtbW9kdWxlLS1pbmRpY2F0b3JTdXBlcnNjcmlwdC0tMWplV21cIjtcbmV4cG9ydCB2YXIgaW5kaWNhdG9yRGVzYyA9IFwiYXJlYURldGFpbC1tb2R1bGUtLWluZGljYXRvckRlc2MtLTJsUl9kXCI7IiwiXG5pbXBvcnQge0xuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJ21hcGxpYnJlLWdsJztcbmltcG9ydCB7aXNNb2JpbGUgYXMgaXNNb2JpbGVSZWFjdERldmljZURldGVjdH0gZnJvbSAncmVhY3QtZGV2aWNlLWRldGVjdCc7XG5cbmNvbnN0IFhZWl9TVUZGSVggPSAne3p9L3t4fS97eX0ucGJmJztcbmV4cG9ydCBjb25zdCBmZWF0dXJlVVJMRm9yVGlsZXNldE5hbWUgPSAodGlsZXNldE5hbWUgOnN0cmluZyApIDogc3RyaW5nID0+IHtcbiAgLy8gVGhlIGZlYXR1cmUgdGlsZSBiYXNlIFVSTCBjYW4gZWl0aGVyIHBvaW50IGxvY2FsbHkgb3IgdGhlIENETi5cbiAgLy8gVGhpcyBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgREFUQV9TT1VSQ0UgZW52IHZhcmlhYmxlLlxuICBjb25zdCBmZWF0dXJlVGlsZUJhc2VVUkwgPSBwcm9jZXNzLmVudi5EQVRBX1NPVVJDRSA9PT0gJ2xvY2FsJyA/XG4gICAgcHJvY2Vzcy5lbnYuR0FUU0JZX0xPQ0FMX1RJTEVTX0JBU0VfVVJMIDpcbiAgICBwcm9jZXNzLmVudi5HQVRTQllfQ0ROX1RJTEVTX0JBU0VfVVJMO1xuXG4gIHJldHVybiBbXG4gICAgZmVhdHVyZVRpbGVCYXNlVVJMLFxuICAgIHByb2Nlc3MuZW52LkdBVFNCWV9EQVRBX1BJUEVMSU5FX1NDT1JFX1BBVEgsXG4gICAgcHJvY2Vzcy5lbnYuR0FUU0JZX01BUF9USUxFU19QQVRILFxuICAgIHRpbGVzZXROYW1lLFxuICAgIFhZWl9TVUZGSVgsXG4gIF0uam9pbignLycpO1xufTtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTCA9IGZlYXR1cmVVUkxGb3JUaWxlc2V0TmFtZSgnaGlnaCcpO1xuZXhwb3J0IGNvbnN0IEZFQVRVUkVfVElMRV9MT1dfWk9PTV9VUkwgPSBmZWF0dXJlVVJMRm9yVGlsZXNldE5hbWUoJ2xvdycpO1xuXG5cbi8vIFBlcmZvcm1hbmNlIG1hcmtlcnNcbmV4cG9ydCBjb25zdCBQRVJGT1JNQU5DRV9NQVJLRVJfTUFQX0lETEUgPSAnTUFQX0lETEUnO1xuXG4vLyBQcm9wZXJ0aWVzXG5leHBvcnQgY29uc3QgU0NPUkVfUFJPUEVSVFlfSElHSCA9ICdTY29yZSBHJztcbmV4cG9ydCBjb25zdCBTQ09SRV9QUk9QRVJUWV9MT1cgPSAnR19TQ09SRSc7XG5leHBvcnQgY29uc3QgR0VPSURfUFJPUEVSVFkgPSAnR0VPSUQxMCc7XG5leHBvcnQgY29uc3QgSElHSF9TQ09SRV9TT1VSQ0VfTkFNRSA9ICdzY29yZS1oaWdoJztcbmV4cG9ydCBjb25zdCBISUdIX1NDT1JFX0xBWUVSX05BTUUgPSAnc2NvcmUtaGlnaC1sYXllcic7XG5leHBvcnQgY29uc3QgTE9XX1NDT1JFX1NPVVJDRV9OQU1FID0gJ3Njb3JlLWxvdyc7XG5leHBvcnQgY29uc3QgTE9XX1NDT1JFX0xBWUVSX05BTUUgPSAnc2NvcmUtbG93LWxheWVyJztcbmV4cG9ydCBjb25zdCBTRUxFQ1RFRF9QUk9QRVJUWSA9ICdzZWxlY3RlZCc7XG5leHBvcnQgY29uc3QgQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfSElHSExJR0hUX0xBWUVSX05BTUUgPSAnY3VycmVudGx5LXNlbGVjdGVkLWZlYXR1cmUtaGlnaGxpZ2h0LWxheWVyJztcbmV4cG9ydCBjb25zdCBCTE9DS19HUk9VUF9CT1VOREFSWV9MQVlFUl9OQU1FID0gJ2Jsb2NrLWdyb3VwLWJvdW5kYXJ5LWxheWVyJztcblxuXG4vLyBQcm9wZXJ0aWVzXG5leHBvcnQgY29uc3QgUE9WRVJUWV9QUk9QRVJUWV9QRVJDRU5USUxFID0gJ1BvdmVydHkgKExlc3MgdGhhbiAyMDAlIG9mIGZlZGVyYWwgcG92ZXJ0eSBsaW5lKSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IEhPVVNJTkdfQlVSREVOX1BST1BFUlRZX1BFUkNFTlRJTEUgPSAnSG91c2luZyBidXJkZW4gKHBlcmNlbnQpIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgTElOR1VJU1RJQ19JU09MQVRJT05fUFJPUEVSVFlfUEVSQ0VOVElMRSA9ICdMaW5ndWlzdGljIGlzb2xhdGlvbiAocGVyY2VudCkgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBVTkVNUExPWU1FTlRfUFJPUEVSVFlfUEVSQ0VOVElMRSA9ICdVbmVtcGxveWVkIGNpdmlsaWFucyAocGVyY2VudCkgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBUT1RBTF9QT1BVTEFUSU9OID0gJ1RvdGFsIHBvcHVsYXRpb24nO1xuZXhwb3J0IGNvbnN0IEVEVUNBVElPTl9QUk9QRVJUWV9QRVJDRU5USUxFID1cbmBQZXJjZW50IGluZGl2aWR1YWxzIGFnZSAyNSBvciBvdmVyIHdpdGggbGVzcyB0aGFuIGhpZ2ggc2Nob29sIGRlZ3JlZSAocGVyY2VudGlsZSlgO1xuZXhwb3J0IGNvbnN0IENPVU5UWV9OQU1FID0gJ0NvdW50eSBOYW1lJztcbmV4cG9ydCBjb25zdCBTVEFURV9OQU1FID0gJ1N0YXRlIE5hbWUnO1xuZXhwb3J0IGNvbnN0IERJQUJFVEVTX1BFUkNFTlRJTEUgPSAnRGlhZ25vc2VkIGRpYWJldGVzIGFtb25nIGFkdWx0cyBhZ2VkID49MTggeWVhcnMgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBBU1RITUFfUEVSQ0VOVElMRSA9ICdDdXJyZW50IGFzdGhtYSBhbW9uZyBhZHVsdHMgYWdlZCA+PTE4IHllYXJzIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgSEVBUlRfUEVSQ0VOVElMRSA9ICdDb3JvbmFyeSBoZWFydCBkaXNlYXNlIGFtb25nIGFkdWx0cyBhZ2VkID49MTggeWVhcnMgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBMSUZFX1BFUkNFTlRJTEUgPSAnTGlmZSBleHBlY3RhbmN5ICh5ZWFycykgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBUUkFGRklDX1BFUkNFTlRJTEUgPSAnVHJhZmZpYyBwcm94aW1pdHkgYW5kIHZvbHVtZSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IEZFTUFfUEVSQ0VOVElMRSA9ICdGRU1BIFJpc2sgSW5kZXggRXhwZWN0ZWQgQW5udWFsIExvc3MgU2NvcmUgKHBlcmNlbnRpbGUpJztcbmV4cG9ydCBjb25zdCBFTkVSR1lfUEVSQ0VOVElMRSA9ICdFbmVyZ3kgYnVyZGVuIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgV0FTVEVXQVRFUl9QRVJDRU5USUxFID0gJ1dhc3Rld2F0ZXIgZGlzY2hhcmdlIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgTEVBRF9QQUlOVF9QRVJDRU5USUxFID0gJ1BlcmNlbnQgcHJlLTE5NjBzIGhvdXNpbmcgKGxlYWQgcGFpbnQgaW5kaWNhdG9yKSAocGVyY2VudGlsZSknO1xuZXhwb3J0IGNvbnN0IERJRVNFTF9NQVRURVJfUEVSQ0VOVElMRSA9ICdEaWVzZWwgcGFydGljdWxhdGUgbWF0dGVyIChwZXJjZW50aWxlKSc7XG5leHBvcnQgY29uc3QgUE0yNV9QRVJDRU5USUxFID0gJ1BhcnRpY3VsYXRlIG1hdHRlciAoUE0yLjUpIChwZXJjZW50aWxlKSc7XG5cbmV4cG9ydCB0eXBlIEo0MFByb3BlcnRpZXMgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vLyBUaGUgbmFtZSBvZiB0aGUgbGF5ZXIgd2l0aGluIHRoZSB0aWxlcyB0aGF0IGNvbnRhaW5zIHRoZSBzY29yZVxuZXhwb3J0IGNvbnN0IFNDT1JFX1NPVVJDRV9MQVlFUiA9ICdibG9ja3MnO1xuXG4vLyBab29tXG5leHBvcnQgY29uc3QgR0xPQkFMX01JTl9aT09NID0gMztcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUFYX1pPT00gPSAyMjtcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT01fTE9XID0gMztcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUFYX1pPT01fTE9XID0gNztcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUlOX1pPT01fSElHSExJR0hUID0gODtcbmV4cG9ydCBjb25zdCBHTE9CQUxfTUFYX1pPT01fSElHSExJR0hUID0gMjI7XG5leHBvcnQgY29uc3QgR0xPQkFMX01JTl9aT09NX0hJR0ggPSA3O1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfWk9PTV9ISUdIID0gMTE7XG5cbi8vIEJvdW5kc1xuZXhwb3J0IGNvbnN0IEdMT0JBTF9NQVhfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0xODAuMTE4MzA2LCA1LjQ5OTU1MF0sXG4gIFstNjUuMCwgODMuMTYyMTAyXSxcbl07XG5cbmV4cG9ydCBjb25zdCBMT1dFUl80OF9CT1VORFMgOiBMbmdMYXRCb3VuZHNMaWtlID0gW1xuICBbLTEyNC43ODQ0MDc5LCAyNC43NDMzMTk1XSxcbiAgWy02Ni45NTEzODEyLCA0OS4zNDU3ODY4XSxcbl07XG5cbmV4cG9ydCBjb25zdCBBTEFTS0FfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0xODMuODU2ODg4LCA1MC44NzUzMTFdLFxuICBbLTE0MC45MzI2MTcsIDcxLjk1ODc5N10sXG5dO1xuXG5leHBvcnQgY29uc3QgSEFXQUlJX0JPVU5EUyA6IExuZ0xhdEJvdW5kc0xpa2UgPSBbXG4gIFstMTY4LjExODMwNiwgMTguNzQ4MTE1XSxcbiAgWy0xNTQuNzU3ODgxLCAyMi4zNzg0MTNdLFxuXTtcblxuZXhwb3J0IGNvbnN0IFBVRVJUT19SSUNPX0JPVU5EUyA6IExuZ0xhdEJvdW5kc0xpa2UgPSBbXG4gIFstNjcuOTQ1NDA0LCAxNy44ODMyOF0sXG4gIFstNjUuMjIwNzAzLCAxOC41MTU2ODNdLFxuXTtcblxuZXhwb3J0IGNvbnN0IEdVQU1fQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0yMTUuMzg5NzA5LCAxMy4yMjU5MDldLFxuICBbLTIxNS4wNDA4OTQsIDEzLjY2MzMzNV0sXG5dO1xuXG5leHBvcnQgY29uc3QgTUFSSUFOQV9JU0xBTkRfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0yMTUuMzEzNDQ5LCAxNC4wMDc4MDFdLFxuICBbLTIxMy43NDI0MDQsIDE5Ljc1MDMyNl0sXG5dO1xuXG5leHBvcnQgY29uc3QgQU1FUklDQU5fU0FNT0FfQk9VTkRTIDogTG5nTGF0Qm91bmRzTGlrZSA9IFtcbiAgWy0xNzEuMDg5ODc0LCAtMTQuNTQ4Njk5XSxcbiAgWy0xNjguMTQzMywgLTExLjA0NjkzNF0sXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DRU5URVIgPSBbMzIuNDY4NzEyNiwgLTg2LjUwMjEzNl07XG5cbi8vIE9wYWNpdHlcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xBWUVSX09QQUNJVFkgPSAwLjY7XG5cbi8vIENvbG9yc1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUTElORV9DT0xPUiA9ICcjNEVBNUNGJztcbmV4cG9ydCBjb25zdCBNSU5fQ09MT1IgPSAnI0ZGRkZGRic7XG5leHBvcnQgY29uc3QgTUVEX0NPTE9SID0gJyNEMURBRTYnO1xuZXhwb3J0IGNvbnN0IE1BWF9DT0xPUiA9ICcjNzY4RkIzJztcbmV4cG9ydCBjb25zdCBCT1JERVJfSElHSExJR0hUX0NPTE9SID0gJyMwMEJERTMnO1xuZXhwb3J0IGNvbnN0IENVUlJFTlRMWV9TRUxFQ1RFRF9GRUFUVVJFX0xBWUVSX09QQUNJVFkgPSAwLjU7XG5cbi8vIFdpZHRoc1xuZXhwb3J0IGNvbnN0IEhJR0hMSUdIVF9CT1JERVJfV0lEVEggPSA1LjA7XG5leHBvcnQgY29uc3QgQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfV0lEVEggPSAwLjg7XG5cbi8vIFNjb3JlIGJvdW5kYXJpZXNcbmV4cG9ydCBjb25zdCBTQ09SRV9CT1VOREFSWV9MT1cgPSAwLjA7XG5leHBvcnQgY29uc3QgU0NPUkVfQk9VTkRBUllfVEhSRVNIT0xEID0gMC42O1xuZXhwb3J0IGNvbnN0IFNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVEID0gMC43NTtcblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gaXNNb2JpbGVSZWFjdERldmljZURldGVjdDtcbiIsIi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xuLy8gRXh0ZXJuYWwgTGliczpcbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG4vLyBDb21wb25lbnRzOlxuLy8gaW1wb3J0IHtBY2NvcmRpb259IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuLy8gU3R5bGVzIGFuZCBjb25zdGFudHNcbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2FyZWFEZXRhaWwubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2RhdGEvY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIEVYUExPUkVfQ09QWSBmcm9tICcuLi8uLi9kYXRhL2NvcHkvZXhwbG9yZSc7XG5pbXBvcnQgKiBhcyBNRVRIT0RPTE9HWV9DT1BZIGZyb20gJy4uLy4uL2RhdGEvY29weS9tZXRob2RvbG9neSc7XG5cbmV4cG9ydCBjb25zdCByZWFkYWJsZVBlcmNlbnRpbGUgPSAocGVyY2VudGlsZTogbnVtYmVyKSA9PiB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRpbGUgKiAxMDApO1xufTtcblxuLy8gVG9kbzogQWRkIGludGVybmF0aW9uYWxpemF0aW9uIHRvIHN1cGVyc2NyaXB0IHRpY2tldCAjNTgyXG5jb25zdCBnZXRTdXBlcnNjcmlwdE9yZGluYWwgPSAocGVyY2VudGlsZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGVuZ2xpc2hPcmRpbmFsUnVsZXMgPSBuZXcgSW50bC5QbHVyYWxSdWxlcygnZW4nLCB7XG4gICAgdHlwZTogJ29yZGluYWwnLFxuICB9KTtcbiAgY29uc3Qgc3VmZml4ZXMgPSB7XG4gICAgemVybzogJ3RoJyxcbiAgICBvbmU6ICdzdCcsXG4gICAgdHdvOiAnbmQnLFxuICAgIGZldzogJ3JkJyxcbiAgICBtYW55OiAndGgnLFxuICAgIG90aGVyOiAndGgnLFxuICB9O1xuICByZXR1cm4gc3VmZml4ZXNbZW5nbGlzaE9yZGluYWxSdWxlcy5zZWxlY3QocGVyY2VudGlsZSldO1xufTtcblxuaW50ZXJmYWNlIElBcmVhRGV0YWlsUHJvcHMge1xuICBwcm9wZXJ0aWVzOiBjb25zdGFudHMuSjQwUHJvcGVydGllcyxcbn1cblxuY29uc3QgQXJlYURldGFpbCA9ICh7cHJvcGVydGllc306SUFyZWFEZXRhaWxQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICBjb25zdCBbaXNDb21tdW5pdHlGb2N1cywgc2V0SXNDb21tdW5pdHlGb2N1c10gPSBSZWFjdC51c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBzY29yZSA9IHByb3BlcnRpZXNbY29uc3RhbnRzLlNDT1JFX1BST1BFUlRZX0hJR0hdIGFzIG51bWJlcjtcbiAgY29uc3QgYmxvY2tHcm91cCA9IHByb3BlcnRpZXNbY29uc3RhbnRzLkdFT0lEX1BST1BFUlRZXTtcbiAgY29uc3QgcG9wdWxhdGlvbiA9IHByb3BlcnRpZXNbY29uc3RhbnRzLlRPVEFMX1BPUFVMQVRJT05dO1xuICBjb25zdCBjb3VudHlOYW1lID0gcHJvcGVydGllc1tjb25zdGFudHMuQ09VTlRZX05BTUVdO1xuICBjb25zdCBzdGF0ZU5hbWUgPSBwcm9wZXJ0aWVzW2NvbnN0YW50cy5TVEFURV9OQU1FXTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzY29yZSA+PSBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfUFJJT1JJVElaRUQgKSB7XG4gICAgICBzZXRJc0NvbW11bml0eUZvY3VzKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRJc0NvbW11bml0eUZvY3VzKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtzY29yZV0pO1xuXG5cbiAgaW50ZXJmYWNlIGluZGljYXRvckluZm8ge1xuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICB9XG5cbiAgLy8gVG9kbzogVGlja2V0ICMzNjcgd2lsbCBiZSByZXBsYWNpbmcgZGVzY3JpcHRpb25zIHdpdGggWUFNTCBmaWxlXG4gIGNvbnN0IGFyZWFNZWRpYW5JbmNvbWU6aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuQVJFQV9NRURJQU5fSU5DT01FKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5BUkVBX01FRElBTl9JTkNPTUUpLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5QT1ZFUlRZX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBlZHVJbmZvOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLkVEVUNBVElPTiksXG4gICAgZGVzY3JpcHRpb246IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JfREVTQ1JJUFRJT04uRURVQ0FUSU9OKSxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuRURVQ0FUSU9OX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBwb3ZlcnR5OmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLlBPVkVSVFkpLFxuICAgIGRlc2NyaXB0aW9uOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SX0RFU0NSSVBUSU9OLlBPVkVSVFkpLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5QT1ZFUlRZX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBhc3RobWE6aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuQVNUSE1BKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5BU1RITUEpLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5BU1RITUFfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IGRpYWJldGVzOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLkRJQUJFVEVTKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5ESUFCRVRFUyksXG4gICAgdmFsdWU6IHByb3BlcnRpZXNbY29uc3RhbnRzLkRJQUJFVEVTX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBkaWVzZWxQYXJ0TWF0dGVyOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLkRJRVNFTF9QQVJUSUNVTEFURV9NQVRURVIpLFxuICAgIGRlc2NyaXB0aW9uOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SX0RFU0NSSVBUSU9OLkRJRVNFTF9QQVJUSUNVTEFURV9NQVRURVIpLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5ESUVTRUxfTUFUVEVSX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBsaWZlRXhwZWN0OmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLkxJRkVfRVhQRUNUKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5MSUZFX0VYUEVDVCksXG4gICAgdmFsdWU6IHByb3BlcnRpZXNbY29uc3RhbnRzLkxJRkVfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IGVuZXJneUJ1cmRlbjppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SUy5FTkVSR1lfQlVSREVOKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5FTkVSR1lfQlVSREVOKSxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuRU5FUkdZX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBwbTI1OmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLlBNXzJfNSksXG4gICAgZGVzY3JpcHRpb246IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JfREVTQ1JJUFRJT04uUE1fMl81KSxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuUE0yNV9QRVJDRU5USUxFXSxcbiAgfTtcbiAgY29uc3QgbGVhZFBhaW50OmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLkxFQURfUEFJTlQpLFxuICAgIGRlc2NyaXB0aW9uOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SX0RFU0NSSVBUSU9OLkxFQURfUEFJTlQpLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5MRUFEX1BBSU5UX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCB0cmFmZmljVm9sdW1lOmluZGljYXRvckluZm8gPSB7XG4gICAgbGFiZWw6IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JTLlRSQUZGSUNfVk9MVU1FKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5UUkFGRklDX1ZPTFVNRSksXG4gICAgdmFsdWU6IHByb3BlcnRpZXNbY29uc3RhbnRzLlRSQUZGSUNfUEVSQ0VOVElMRV0sXG4gIH07XG4gIGNvbnN0IHdhc3RlV2F0ZXI6aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuV0FTVEVfV0FURVIpLFxuICAgIGRlc2NyaXB0aW9uOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SX0RFU0NSSVBUSU9OLldBU1RFX1dBVEVSKSxcbiAgICB2YWx1ZTogcHJvcGVydGllc1tjb25zdGFudHMuV0FTVEVXQVRFUl9QRVJDRU5USUxFXSxcbiAgfTtcbiAgY29uc3QgZmVtYVJpc2s6aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuRkVNQV9SSVNLKSxcbiAgICBkZXNjcmlwdGlvbjogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUl9ERVNDUklQVElPTi5GRU1BX1JJU0spLFxuICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2NvbnN0YW50cy5GRU1BX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBoZWFydERpc2Vhc2U6aW5kaWNhdG9ySW5mbyA9IHtcbiAgICBsYWJlbDogaW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuSEVBUlRfRElTRUFTRSksXG4gICAgZGVzY3JpcHRpb246IGludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9JTkRJQ0FUT1JfREVTQ1JJUFRJT04uSEVBUlRfRElTRUFTRSksXG4gICAgdmFsdWU6IHByb3BlcnRpZXNbY29uc3RhbnRzLkhFQVJUX1BFUkNFTlRJTEVdLFxuICB9O1xuICBjb25zdCBob3VzZUJ1cmRlbjppbmRpY2F0b3JJbmZvID0ge1xuICAgIGxhYmVsOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SUy5IT1VTRV9CVVJERU4pLFxuICAgIGRlc2NyaXB0aW9uOiBpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SX0RFU0NSSVBUSU9OLkhPVVNFX0JVUkRFTiksXG4gICAgdmFsdWU6IHByb3BlcnRpZXNbY29uc3RhbnRzLkhPVVNJTkdfQlVSREVOX1BST1BFUlRZX1BFUkNFTlRJTEVdLFxuICB9O1xuXG5cbiAgY29uc3QgaW5kaWNhdG9ycyA9IFthcmVhTWVkaWFuSW5jb21lLCBlZHVJbmZvLCBwb3ZlcnR5XTtcbiAgY29uc3QgYWRkaXRpb25hbEluZGljYXRvcnMgPSBbXG4gICAgYXN0aG1hLCBkaWFiZXRlcywgZGllc2VsUGFydE1hdHRlciwgZW5lcmd5QnVyZGVuLCBmZW1hUmlzaywgaGVhcnREaXNlYXNlLFxuICAgIGhvdXNlQnVyZGVuLCBsZWFkUGFpbnQsIGxpZmVFeHBlY3QsIHBtMjUsIHRyYWZmaWNWb2x1bWUsIHdhc3RlV2F0ZXIsXG4gIF07XG5cbiAgcmV0dXJuIChcbiAgICA8YXNpZGUgY2xhc3NOYW1lPXtzdHlsZXMuYXJlYURldGFpbENvbnRhaW5lcn0gZGF0YS1jeT17J2FzaWRlJ30+XG4gICAgICA8dWwgY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzUm93fT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmNlbnN1c0xhYmVsfT5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfQ0JHX0lORk8uQ0VOU1VTX0JMT0NLX0dST1VQKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzVGV4dH0+e2AgJHtibG9ja0dyb3VwfWB9PC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzTGFiZWx9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShFWFBMT1JFX0NPUFkuU0lERV9QQU5FTF9DQkdfSU5GTy5DT1VOVFkpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57YCAke2NvdW50eU5hbWV9YH08L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0NCR19JTkZPLlNUQVRFKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuY2Vuc3VzVGV4dH0+e2AgJHtzdGF0ZU5hbWV9YH08L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNMYWJlbH0+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0NCR19JTkZPLlBPUFVMQVRJT04pfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5jZW5zdXNUZXh0fT57YCAke3BvcHVsYXRpb24udG9Mb2NhbGVTdHJpbmcoKX1gfTwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNhdGVnb3JpemF0aW9ufT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jb21tdW5pdHlPZkZvY3VzfT5cbiAgICAgICAgICB7aXNDb21tdW5pdHlGb2N1cyA/XG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNvbW11bml0eU9mRm9jdXNDaXJjbGV9IC8+XG4gICAgICAgICAgICAgIDxoMz57RVhQTE9SRV9DT1BZLkNPTU1VTklUWS5PRl9GT0NVU308L2gzPlxuICAgICAgICAgICAgPC8+IDpcbiAgICAgICAgICA8aDM+e0VYUExPUkVfQ09QWS5DT01NVU5JVFkuTk9UX09GX0ZPQ1VTfTwvaDM+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPXtcInNlY29uZGFyeVwifT52ZXJzaW9uIHtNRVRIT0RPTE9HWV9DT1BZLlZFUlNJT05fTlVNQkVSfTwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kaXZpZGVyfT5cbiAgICAgICAgPGg2PlxuICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLlNJREVfUEFORUxfSU5ESUNBVE9SUy5JTkRJQ0FUT1JfQ09MVU1OX0hFQURFUil9XG4gICAgICAgIDwvaDY+XG4gICAgICAgIDxoNj5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5TSURFX1BBTkVMX0lORElDQVRPUlMuUEVSQ0VOVElMRV9DT0xVTU5fSEVBREVSKX1cbiAgICAgICAgPC9oNj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8PlxuICAgICAgICB7XG4gICAgICAgICAgaW5kaWNhdG9ycy5tYXAoKGluZGljYXRvcjphbnksIGluZGV4Om51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxsaSBrZXk9e2BpbmQke2luZGV4fWB9IGNsYXNzTmFtZT17c3R5bGVzLmluZGljYXRvckJveE1haW59IGRhdGEtY3k9eydpbmRpY2F0b3JCb3gnfT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JSb3d9PlxuICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JOYW1lfT57aW5kaWNhdG9yLmxhYmVsfTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JWYWx1ZX0+XG4gICAgICAgICAgICAgICAgICB7cmVhZGFibGVQZXJjZW50aWxlKGluZGljYXRvci52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICA8c3VwIGNsYXNzTmFtZT17c3R5bGVzLmluZGljYXRvclN1cGVyc2NyaXB0fT48c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge2dldFN1cGVyc2NyaXB0T3JkaW5hbChyZWFkYWJsZVBlcmNlbnRpbGUoaW5kaWNhdG9yLnZhbHVlKSl9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+PC9zdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9eydzZWNvbmRhcnkgajQwLWluZGljYXRvcid9PlxuICAgICAgICAgICAgICAgIHtpbmRpY2F0b3IuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbGk+O1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIDwvPlxuXG4gICAgICA8PlxuICAgICAgICB7XG4gICAgICAgICAgYWRkaXRpb25hbEluZGljYXRvcnMubWFwKChpbmRpY2F0b3I6YW55LCBpbmRleDpudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8bGlcbiAgICAgICAgICAgICAga2V5PXtgaW5kJHtpbmRleH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JCb3hBZGRpdGlvbmFsfVxuICAgICAgICAgICAgICBkYXRhLWN5PXsnaW5kaWNhdG9yQm94J30+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yUm93fT5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yTmFtZX0+e2luZGljYXRvci5sYWJlbH08L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVmFsdWV9PlxuICAgICAgICAgICAgICAgICAge3JlYWRhYmxlUGVyY2VudGlsZShpbmRpY2F0b3IudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgPHN1cCBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JTdXBlcnNjcmlwdH0+PHNwYW4+XG4gICAgICAgICAgICAgICAgICAgIHtnZXRTdXBlcnNjcmlwdE9yZGluYWwocmVhZGFibGVQZXJjZW50aWxlKGluZGljYXRvci52YWx1ZSkpfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvc3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnc2Vjb25kYXJ5IGo0MC1pbmRpY2F0b3InfT5cbiAgICAgICAgICAgICAgICB7aW5kaWNhdG9yLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2xpPjtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICA8Lz5cblxuICAgICAgey8qIFRlbXBvcmFyaWx5IHJlbW92ZSBBY2NvcmRpb25zIGFuZCBtYXkgcGxhY2UgYmFjayBpbiBsYXRlciwgcmVtb3ZlZCB1bnVzZWRcbiAgICAgIGNsYXNzTmFtZSBwcm9wIGFzIGFzIHN0eWxlcyBhcmUgYmFzZWQgb24gdGhlIGlkIG9mIHRoZSBBY2NvcmRpb24gSXRlbSAqL31cbiAgICAgIHsvKiA8QWNjb3JkaW9uXG4gICAgICAgIG11bHRpc2VsZWN0YWJsZT17dHJ1ZX1cbiAgICAgICAgaXRlbXM9e1xuICAgICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdwcmlvcml0aXphdGlvbi1pbmRpY2F0b3JzJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdJbmRpY2F0b3JzJyxcbiAgICAgICAgICAgICAgY29udGVudDogKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluZGljYXRvcnMubWFwKChpbmRpY2F0b3I6YW55LCBpbmRleDpudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGxpIGtleT17YGluZCR7aW5kZXh9YH0gY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yQm94TWFpbn0gZGF0YS1jeT17J2luZGljYXRvckJveCd9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JSb3d9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yTmFtZX0+e2luZGljYXRvci5sYWJlbH08L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmluZGljYXRvclZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVhZGFibGVQZXJjZW50aWxlKGluZGljYXRvci52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1cCBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JTdXBlcnNjcmlwdH0+PHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z2V0U3VwZXJzY3JpcHRPcmRpbmFsKHJlYWRhYmxlUGVyY2VudGlsZShpbmRpY2F0b3IudmFsdWUpKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9zdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9eydzZWNvbmRhcnkgajQwLWluZGljYXRvcid9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7aW5kaWNhdG9yLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBleHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnYWRkaXRpb25hbC1pbmRpY2F0b3JzJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdBZGRpdGlvbmFsIGluZGljYXRvcnMgKG5vdCB1c2VkIGluIHByaW9yaXRpemF0aW9uKScsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IChcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEluZGljYXRvcnMubWFwKChpbmRpY2F0b3I6YW55LCBpbmRleDpudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtgaW5kJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JCb3hBZGRpdGlvbmFsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PXsnaW5kaWNhdG9yQm94J30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yUm93fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yTmFtZX0+e2luZGljYXRvci5sYWJlbH08L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5kaWNhdG9yVmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JlYWRhYmxlUGVyY2VudGlsZShpbmRpY2F0b3IudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1cCBjbGFzc05hbWU9e3N0eWxlcy5pbmRpY2F0b3JTdXBlcnNjcmlwdH0+PHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRTdXBlcnNjcmlwdE9yZGluYWwocmVhZGFibGVQZXJjZW50aWxlKGluZGljYXRvci52YWx1ZSkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvc3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnc2Vjb25kYXJ5IGo0MC1pbmRpY2F0b3InfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW5kaWNhdG9yLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIH0vPiAqL31cblxuICAgIDwvYXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBcmVhRGV0YWlsO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNYXBJbnRyb2R1Y3Rpb24gZnJvbSAnLi9tYXBJbnRyb2R1Y3Rpb24nO1xuaW1wb3J0IEFyZWFEZXRhaWwgZnJvbSAnLi9BcmVhRGV0YWlsJztcblxuaW50ZXJmYWNlIElNYXBJbmZvUGFuZWxQcm9wcyB7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgZmVhdHVyZVByb3BlcnRpZXM6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSB8IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RlZEZlYXR1cmVJZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkXG4gIH1cblxuY29uc3QgTWFwSW5mb1BhbmVsID0gKHtjbGFzc05hbWUsIGZlYXR1cmVQcm9wZXJ0aWVzLCBzZWxlY3RlZEZlYXR1cmVJZH06SU1hcEluZm9QYW5lbFByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gPlxuICAgICAgeyhmZWF0dXJlUHJvcGVydGllcyAmJiBzZWxlY3RlZEZlYXR1cmVJZCApID9cbiAgICAgICAgICA8QXJlYURldGFpbCBwcm9wZXJ0aWVzPXtmZWF0dXJlUHJvcGVydGllc30gLz4gOlxuICAgICAgICAgIDxNYXBJbnRyb2R1Y3Rpb24gLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hcEluZm9QYW5lbDtcbiIsImltcG9ydCB7U3R5bGUsIEZpbGxQYWludH0gZnJvbSAnbWFwbGlicmUtZ2wnO1xuaW1wb3J0IGNocm9tYSBmcm9tICdjaHJvbWEtanMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uL2RhdGEvY29uc3RhbnRzJztcbmltcG9ydCB7RmxhZ0NvbnRhaW5lcn0gZnJvbSAnLi4vY29udGV4dHMvRmxhZ0NvbnRleHQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaGV4VG9IU0xBKGhleDpzdHJpbmcsIGFscGhhOm51bWJlcikge1xuICByZXR1cm4gY2hyb21hKGhleCkuYWxwaGEoYWxwaGEpLmNzcygnaHNsJyk7XG59XG5cbi8qKlxuICogYE1ha2VQYWludGAgZ2VuZXJhdGVzIGEgem9vbS1mYWRlZCBNYXBsaWJyZSBzdHlsZSBmb3JtYXR0ZWQgbGF5ZXIgZ2l2ZW4gYSBzZXQgb2YgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGQgOiB0aGUgZmllbGQgd2l0aGluIHRoZSBkYXRhIHRvIGNvbnN1bHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5SYW1wIDogdGhlIG1pbmltdW0gdmFsdWUgdGhpcyBjYW4gYXNzdW1lXG4gKiBAcGFyYW0ge251bWJlcn0gbWVkUmFtcCA6IHRoZSBtZWRpdW0gdmFsdWUgdGhpcyBjYW4gYXNzdW1lXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4UmFtcCA6IHRoZSBtYXhpbXVtIHZhbHVlIHRoaXMgY2FuIGFzc3VtZVxuICogQHJldHVybiB7RmlsbFBhaW50fSBhIG1hcGxpYnJlZ2wgZmlsbCBsYXllclxuICoqL1xuZnVuY3Rpb24gbWFrZVBhaW50KHtcbiAgZmllbGQsXG4gIG1pblJhbXAsXG4gIG1lZFJhbXAsXG4gIG1heFJhbXAsXG59OiB7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBtaW5SYW1wOiBudW1iZXI7XG4gICAgbWVkUmFtcDogbnVtYmVyO1xuICAgIG1heFJhbXA6IG51bWJlcjtcbiAgfSk6IEZpbGxQYWludCB7XG4gIGNvbnN0IHBhaW50RGVzY3JpcHRvciA6IEZpbGxQYWludCA9IHtcbiAgICAnZmlsbC1jb2xvcic6IFtcbiAgICAgICdzdGVwJyxcbiAgICAgIFsnZ2V0JywgZmllbGRdLFxuICAgICAgaGV4VG9IU0xBKGNvbnN0YW50cy5NSU5fQ09MT1IsIGNvbnN0YW50cy5ERUZBVUxUX0xBWUVSX09QQUNJVFkgKSxcbiAgICAgIG1pblJhbXAsXG4gICAgICBoZXhUb0hTTEEoY29uc3RhbnRzLk1JTl9DT0xPUiwgY29uc3RhbnRzLkRFRkFVTFRfTEFZRVJfT1BBQ0lUWSApLFxuICAgICAgbWVkUmFtcCxcbiAgICAgIGhleFRvSFNMQShjb25zdGFudHMuTUVEX0NPTE9SLCBjb25zdGFudHMuREVGQVVMVF9MQVlFUl9PUEFDSVRZICksXG4gICAgICBtYXhSYW1wLFxuICAgICAgaGV4VG9IU0xBKGNvbnN0YW50cy5NQVhfQ09MT1IsIGNvbnN0YW50cy5ERUZBVUxUX0xBWUVSX09QQUNJVFkgKSxcbiAgICBdLFxuICB9O1xuICByZXR1cm4gcGFpbnREZXNjcmlwdG9yO1xufVxuXG5jb25zdCBpbWFnZVN1ZmZpeCA9IGNvbnN0YW50cy5pc01vYmlsZSA/ICcnIDogJ0AyeCc7XG5cbmV4cG9ydCBjb25zdCBtYWtlTWFwU3R5bGUgPSAoZmxhZ0NvbnRhaW5lcjogRmxhZ0NvbnRhaW5lcikgOiBTdHlsZSA9PiB7XG4gIHJldHVybiB7XG4gICAgJ3ZlcnNpb24nOiA4LFxuICAgICdzb3VyY2VzJzoge1xuICAgICAgJ2NhcnRvJzoge1xuICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAndGlsZXMnOlxuICAgICAgW1xuICAgICAgICBgaHR0cHM6Ly9hLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9ub2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICAgIGBodHRwczovL2IuYmFzZW1hcHMuY2FydG9jZG4uY29tL2xpZ2h0X25vbGFiZWxzL3t6fS97eH0ve3l9JHtpbWFnZVN1ZmZpeH0ucG5nYCxcbiAgICAgICAgYGh0dHBzOi8vYy5iYXNlbWFwcy5jYXJ0b2Nkbi5jb20vbGlnaHRfbm9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICBgaHR0cHM6Ly9kLmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9ub2xhYmVscy97en0ve3h9L3t5fSR7aW1hZ2VTdWZmaXh9LnBuZ2AsXG4gICAgICBdLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgICAnZ2VvJzoge1xuICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAndGlsZXMnOiBbXG4gICAgICAgICAgJ2h0dHBzOi8vbXQwLmdvb2dsZS5jb20vdnQvbHlycz1wJmhsPWVuJng9e3h9Jnk9e3l9Jno9e3p9JyxcbiAgICAgICAgXSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NLFxuICAgICAgICAnbWF4em9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUFYX1pPT00sXG4gICAgICB9LFxuICAgICAgW2NvbnN0YW50cy5ISUdIX1NDT1JFX1NPVVJDRV9OQU1FXToge1xuICAgICAgLy8gXCJTY29yZS1oaWdoXCIgcmVwcmVzZW50cyB0aGUgZnVsbCBzZXQgb2YgZGF0YVxuICAgICAgLy8gYXQgdGhlIGNlbnN1cyBibG9jayBncm91cCBsZXZlbC4gSXQgaXMgb25seSBzaG93blxuICAgICAgLy8gYXQgaGlnaCB6b29tIGxldmVscyB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMgYXQgbG93ZXIgem9vbXNcbiAgICAgICAgJ3R5cGUnOiAndmVjdG9yJyxcbiAgICAgICAgLy8gT3VyIGN1cnJlbnQgdGlwcGVjYW5vZSBjb21tYW5kIGRvZXMgbm90IHNldCBhbiBpZC5cbiAgICAgICAgLy8gVGhlIGJlbG93IGxpbmUgcHJvbW90ZXMgdGhlIEdFT0lEMTAgcHJvcGVydHkgdG8gdGhlIElEXG4gICAgICAgICdwcm9tb3RlSWQnOiBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksXG4gICAgICAgICd0aWxlcyc6IFtcbiAgICAgICAgICAnaGlnaF90aWxlcycgaW4gZmxhZ0NvbnRhaW5lciA/XG4gICAgICAgICAgY29uc3RhbnRzLmZlYXR1cmVVUkxGb3JUaWxlc2V0TmFtZShmbGFnQ29udGFpbmVyWydoaWdoX3RpbGVzJ10pIDpcbiAgICAgICAgICBjb25zdGFudHMuRkVBVFVSRV9USUxFX0hJR0hfWk9PTV9VUkwsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFNlZXRpbmcgbWF4em9vbSBoZXJlIGVuYWJsZXMgJ292ZXJ6b29taW5nJ1xuICAgICAgICAvLyBlLmcuIGNvbnRpbnVlZCB6b29taW5nIGJleW9uZCB0aGUgbWF4IGJvdW5kcy5cbiAgICAgICAgLy8gTW9yZSBoZXJlOiBodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L292ZXJ6b29tL1xuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT01fSElHSCxcbiAgICAgICAgJ21heHpvb20nOiBjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0hJR0gsXG4gICAgICB9LFxuICAgICAgW2NvbnN0YW50cy5MT1dfU0NPUkVfU09VUkNFX05BTUVdOiB7XG4gICAgICAvLyBcIlNjb3JlLWxvd1wiIHJlcHJlc2VudHMgYSB0aWxlc2V0IGF0IHRoZSBsZXZlbCBvZiBidWNrZXRlZCB0cmFjdHMuXG4gICAgICAvLyBjZW5zdXMgYmxvY2sgZ3JvdXAgaW5mb3JtYXRpb24gaXMgYGRpc3NvbHZlYGQgaW50byB0cmFjdHMsIHRoZW5cbiAgICAgIC8vIGVhY2ggdHJhY3QgaXMgYGRpc3NvbHZlYGQgaW50byBvbmUgb2YgdGVuIGJ1Y2tldHMuIEl0IGlzIG1lYW50XG4gICAgICAvLyB0byBnaXZlIHVzIGEgZmF2b3JhYmxlIHRyYWRlb2ZmIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIGZpZGVsaXR5LlxuICAgICAgICAndHlwZSc6ICd2ZWN0b3InLFxuICAgICAgICAncHJvbW90ZUlkJzogY29uc3RhbnRzLkdFT0lEX1BST1BFUlRZLFxuICAgICAgICAndGlsZXMnOiBbXG4gICAgICAgICAgJ2xvd190aWxlcycgaW4gZmxhZ0NvbnRhaW5lciA/XG4gICAgICAgICAgY29uc3RhbnRzLmZlYXR1cmVVUkxGb3JUaWxlc2V0TmFtZShmbGFnQ29udGFpbmVyWydsb3dfdGlsZXMnXSkgOlxuICAgICAgICAgIGNvbnN0YW50cy5GRUFUVVJFX1RJTEVfTE9XX1pPT01fVVJMLFxuICAgICAgICAvLyBGb3IgbG9jYWwgZGV2ZWxvcG1lbnQsIHVzZTpcbiAgICAgICAgLy8gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9kYXRhL3RsXzIwMTBfYmdfd2l0aF9kYXRhL3t6fS97eH0ve3l9LnBiZicsXG4gICAgICAgIF0sXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9MT1csXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTV9MT1csXG4gICAgICB9LFxuICAgICAgJ2xhYmVscyc6IHtcbiAgICAgICAgJ3R5cGUnOiAncmFzdGVyJyxcbiAgICAgICAgJ3RpbGVzJzogW1xuICAgICAgICAgIGBodHRwczovL2NhcnRvZGItYmFzZW1hcHMtYS5nbG9iYWwuc3NsLmZhc3RseS5uZXQvbGlnaHRfb25seV9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICAgIGBodHRwczovL2NhcnRvZGItYmFzZW1hcHMtYi5nbG9iYWwuc3NsLmZhc3RseS5uZXQvbGlnaHRfb25seV9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICAgIGBodHRwczovL2NhcnRvZGItYmFzZW1hcHMtYy5nbG9iYWwuc3NsLmZhc3RseS5uZXQvbGlnaHRfb25seV9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICAgIGBodHRwczovL2NhcnRvZGItYmFzZW1hcHMtZC5nbG9iYWwuc3NsLmZhc3RseS5uZXQvbGlnaHRfb25seV9sYWJlbHMve3p9L3t4fS97eX0ke2ltYWdlU3VmZml4fS5wbmdgLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgICdsYXllcnMnOiBbXG4gICAgICB7XG4gICAgICAgICdpZCc6ICdjYXJ0bycsXG4gICAgICAgICdzb3VyY2UnOiAnY2FydG8nLFxuICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdpZCc6ICdnZW8nLFxuICAgICAgICAnc291cmNlJzogJ2dlbycsXG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICdsYXlvdXQnOiB7XG4gICAgICAgIC8vIE1ha2UgdGhlIGxheWVyIGludmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICAgICd2aXNpYmlsaXR5JzogJ25vbmUnLFxuICAgICAgICB9LFxuICAgICAgICAnbWluem9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUlOX1pPT00sXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdpZCc6IGNvbnN0YW50cy5ISUdIX1NDT1JFX0xBWUVSX05BTUUsXG4gICAgICAgICdzb3VyY2UnOiBjb25zdGFudHMuSElHSF9TQ09SRV9TT1VSQ0VfTkFNRSxcbiAgICAgICAgJ3NvdXJjZS1sYXllcic6IGNvbnN0YW50cy5TQ09SRV9TT1VSQ0VfTEFZRVIsXG4gICAgICAgICd0eXBlJzogJ2ZpbGwnLFxuICAgICAgICAncGFpbnQnOiBtYWtlUGFpbnQoe1xuICAgICAgICAgIGZpZWxkOiBjb25zdGFudHMuU0NPUkVfUFJPUEVSVFlfSElHSCxcbiAgICAgICAgICBtaW5SYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfTE9XLFxuICAgICAgICAgIG1lZFJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9USFJFU0hPTEQsXG4gICAgICAgICAgbWF4UmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1BSSU9SSVRJWkVELFxuICAgICAgICB9KSxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0hJR0gsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnaWQnOiBjb25zdGFudHMuTE9XX1NDT1JFX0xBWUVSX05BTUUsXG4gICAgICAgICdzb3VyY2UnOiBjb25zdGFudHMuTE9XX1NDT1JFX1NPVVJDRV9OQU1FLFxuICAgICAgICAnc291cmNlLWxheWVyJzogY29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUixcbiAgICAgICAgJ3R5cGUnOiAnZmlsbCcsXG4gICAgICAgICdmaWx0ZXInOiBbJ2FsbCcsXG4gICAgICAgICAgWyc+JywgY29uc3RhbnRzLlNDT1JFX1BST1BFUlRZX0xPVywgY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX1RIUkVTSE9MRF0sXG4gICAgICAgIF0sXG4gICAgICAgICdwYWludCc6IG1ha2VQYWludCh7XG4gICAgICAgICAgZmllbGQ6IGNvbnN0YW50cy5TQ09SRV9QUk9QRVJUWV9MT1csXG4gICAgICAgICAgbWluUmFtcDogY29uc3RhbnRzLlNDT1JFX0JPVU5EQVJZX0xPVyxcbiAgICAgICAgICBtZWRSYW1wOiBjb25zdGFudHMuU0NPUkVfQk9VTkRBUllfVEhSRVNIT0xELFxuICAgICAgICAgIG1heFJhbXA6IGNvbnN0YW50cy5TQ09SRV9CT1VOREFSWV9QUklPUklUSVpFRCxcbiAgICAgICAgfSksXG4gICAgICAgICdtaW56b29tJzogY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9MT1csXG4gICAgICAgICdtYXh6b29tJzogY29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTV9MT1csXG4gICAgICB9LFxuICAgICAge1xuICAgICAgLy8gV2UgcHV0IGxhYmVscyBsYXN0IHRvIGVuc3VyZSBwcm9taW5lbmNlXG4gICAgICAgICdpZCc6ICdsYWJlbHMtb25seS1sYXllcicsXG4gICAgICAgICd0eXBlJzogJ3Jhc3RlcicsXG4gICAgICAgICdzb3VyY2UnOiAnbGFiZWxzJyxcbiAgICAgICAgJ21pbnpvb20nOiBjb25zdGFudHMuR0xPQkFMX01JTl9aT09NLFxuICAgICAgICAnbWF4em9vbSc6IGNvbnN0YW50cy5HTE9CQUxfTUFYX1pPT00sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59O1xuXG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgajQwUG9wdXAgPSBcIko0ME1hcC1tb2R1bGUtLWo0MFBvcHVwLS0zeUpHclwiO1xuZXhwb3J0IHZhciBuYXZpZ2F0aW9uQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tbmF2aWdhdGlvbkNvbnRyb2wtLTJBeWJmXCI7XG5leHBvcnQgdmFyIGZ1bGxzY3JlZW5Db250cm9sID0gXCJKNDBNYXAtbW9kdWxlLS1mdWxsc2NyZWVuQ29udHJvbC0tMVVCS2VcIjtcbmV4cG9ydCB2YXIgZ2VvbG9jYXRlQ29udHJvbCA9IFwiSjQwTWFwLW1vZHVsZS0tZ2VvbG9jYXRlQ29udHJvbC0tM0tWQWtcIjtcbmV4cG9ydCB2YXIgbWFwSW5mb1BhbmVsID0gXCJKNDBNYXAtbW9kdWxlLS1tYXBJbmZvUGFuZWwtLUYzalI0XCI7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIEV4dGVybmFsIExpYnM6XG5pbXBvcnQgUmVhY3QsIHtNb3VzZUV2ZW50LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge01hcCwgTWFwYm94R2VvSlNPTkZlYXR1cmUsIExuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJ21hcGxpYnJlLWdsJztcbmltcG9ydCBSZWFjdE1hcEdMLCB7XG4gIE1hcEV2ZW50LFxuICBWaWV3cG9ydFByb3BzLFxuICBXZWJNZXJjYXRvclZpZXdwb3J0LFxuICBOYXZpZ2F0aW9uQ29udHJvbCxcbiAgR2VvbG9jYXRlQ29udHJvbCxcbiAgUG9wdXAsXG4gIEZseVRvSW50ZXJwb2xhdG9yLFxuICBGdWxsc2NyZWVuQ29udHJvbCxcbiAgTWFwUmVmLCBTb3VyY2UsIExheWVyfSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IGJib3ggZnJvbSAnQHR1cmYvYmJveCc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMy1lYXNlJztcbmltcG9ydCB7aXNNb2JpbGV9IGZyb20gJ3JlYWN0LWRldmljZS1kZXRlY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZVdpbmRvd1NpemV9IGZyb20gJ3JlYWN0LXVzZSc7XG5cbi8vIENvbnRleHRzOlxuaW1wb3J0IHt1c2VGbGFnc30gZnJvbSAnLi4vY29udGV4dHMvRmxhZ0NvbnRleHQnO1xuXG4vLyBDb21wb25lbnRzOlxuaW1wb3J0IFRlcnJpdG9yeUZvY3VzQ29udHJvbCBmcm9tICcuL3RlcnJpdG9yeUZvY3VzQ29udHJvbCc7XG5pbXBvcnQgTWFwSW5mb1BhbmVsIGZyb20gJy4vbWFwSW5mb1BhbmVsJztcbmltcG9ydCBBcmVhRGV0YWlsIGZyb20gJy4vQXJlYURldGFpbCc7XG5cbi8vIFN0eWxlcyBhbmQgY29uc3RhbnRzXG5pbXBvcnQge21ha2VNYXBTdHlsZX0gZnJvbSAnLi4vZGF0YS9tYXBTdHlsZSc7XG5pbXBvcnQgJ21hcGxpYnJlLWdsL2Rpc3QvbWFwbGlicmUtZ2wuY3NzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi9kYXRhL2NvbnN0YW50cyc7XG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9KNDBNYXAubW9kdWxlLnNjc3MnO1xuXG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgQ3lwcmVzcz86IG9iamVjdDtcbiAgICB1bmRlcmx5aW5nTWFwOiBNYXA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIElKNDBJbnRlcmZhY2Uge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSURldGFpbFZpZXdJbnRlcmZhY2Uge1xuICBsYXRpdHVkZTogbnVtYmVyXG4gIGxvbmdpdHVkZTogbnVtYmVyXG4gIHpvb206IG51bWJlclxuICBwcm9wZXJ0aWVzOiBjb25zdGFudHMuSjQwUHJvcGVydGllcyxcbn07XG5cbmNvbnN0IEo0ME1hcCA9ICh7bG9jYXRpb259OiBJSjQwSW50ZXJmYWNlKSA9PiB7XG4gIC8vIEhhc2ggcG9ydGlvbiBvZiBVUkwgaXMgb2YgdGhlIGZvcm0gI3pvb20vbGF0L2xuZ1xuICBjb25zdCBbem9vbSwgbGF0LCBsbmddID0gbG9jYXRpb24uaGFzaC5zbGljZSgxKS5zcGxpdCgnLycpO1xuICBjb25zdCBbdmlld3BvcnQsIHNldFZpZXdwb3J0XSA9IHVzZVN0YXRlPFZpZXdwb3J0UHJvcHM+KHtcbiAgICBsYXRpdHVkZTogbGF0ICYmIHBhcnNlRmxvYXQobGF0KSB8fCBjb25zdGFudHMuREVGQVVMVF9DRU5URVJbMF0sXG4gICAgbG9uZ2l0dWRlOiBsbmcgJiYgcGFyc2VGbG9hdChsbmcpIHx8IGNvbnN0YW50cy5ERUZBVUxUX0NFTlRFUlsxXSxcbiAgICB6b29tOiB6b29tICYmIHBhcnNlRmxvYXQoem9vbSkgfHwgY29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTSxcbiAgfSk7XG5cbiAgY29uc3QgW3NlbGVjdGVkRmVhdHVyZSwgc2V0U2VsZWN0ZWRGZWF0dXJlXSA9IHVzZVN0YXRlPE1hcGJveEdlb0pTT05GZWF0dXJlPigpO1xuICBjb25zdCBbZGV0YWlsVmlld0RhdGEsIHNldERldGFpbFZpZXdEYXRhXSA9IHVzZVN0YXRlPElEZXRhaWxWaWV3SW50ZXJmYWNlPigpO1xuICBjb25zdCBbdHJhbnNpdGlvbkluUHJvZ3Jlc3MsIHNldFRyYW5zaXRpb25JblByb2dyZXNzXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2dlb2xvY2F0aW9uSW5Qcm9ncmVzcywgc2V0R2VvbG9jYXRpb25JblByb2dyZXNzXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzTW9iaWxlTWFwU3RhdGUsIHNldElzTW9iaWxlTWFwU3RhdGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCB7d2lkdGg6IHdpbmRvd1dpZHRofSA9IHVzZVdpbmRvd1NpemUoKTtcblxuICBjb25zdCBtYXBSZWYgPSB1c2VSZWY8TWFwUmVmPihudWxsKTtcbiAgY29uc3QgZmxhZ3MgPSB1c2VGbGFncygpO1xuXG4gIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUlkID0gKHNlbGVjdGVkRmVhdHVyZSAmJiBzZWxlY3RlZEZlYXR1cmUuaWQpIHx8ICcnO1xuICBjb25zdCBmaWx0ZXIgPSB1c2VNZW1vKCgpID0+IFsnaW4nLCBjb25zdGFudHMuR0VPSURfUFJPUEVSVFksIHNlbGVjdGVkRmVhdHVyZUlkXSwgW3NlbGVjdGVkRmVhdHVyZV0pO1xuXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IE1hcEV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZSA9IGV2ZW50LmZlYXR1cmVzICYmIGV2ZW50LmZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlKSB7XG4gICAgICBjb25zdCBbbWluTG5nLCBtaW5MYXQsIG1heExuZywgbWF4TGF0XSA9IGJib3goZmVhdHVyZSk7XG4gICAgICBjb25zdCBuZXdWaWV3UG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KTtcbiAgICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ld1ZpZXdQb3J0LmZpdEJvdW5kcyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICBbbWluTG5nLCBtaW5MYXRdLFxuICAgICAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDQwLFxuICAgICAgICAgIH0sXG4gICAgICApO1xuICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IHNlbGVjdGVkRmVhdHVyZUlkKSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZShmZWF0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGVkRmVhdHVyZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9wdXBJbmZvID0ge1xuICAgICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICB9O1xuICAgICAgZ29Ub1BsYWNlKFtcbiAgICAgICAgW21pbkxuZywgbWluTGF0XSxcbiAgICAgICAgW21heExuZywgbWF4TGF0XSxcbiAgICAgIF0pO1xuICAgICAgc2V0RGV0YWlsVmlld0RhdGEocG9wdXBJbmZvKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Mb2FkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuQ3lwcmVzcyAmJiBtYXBSZWYuY3VycmVudCkge1xuICAgICAgd2luZG93LnVuZGVybHlpbmdNYXAgPSBtYXBSZWYuY3VycmVudC5nZXRNYXAoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNb2JpbGUpIHNldElzTW9iaWxlTWFwU3RhdGUodHJ1ZSk7XG4gIH07XG5cblxuICBjb25zdCBnb1RvUGxhY2UgPSAoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlICkgPT4ge1xuICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCEsIHdpZHRoOiB2aWV3cG9ydC53aWR0aCF9KVxuICAgICAgICAuZml0Qm91bmRzKGJvdW5kcyBhcyBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sIHtcbiAgICAgICAgICBwYWRkaW5nOiAyMCxcbiAgICAgICAgICBvZmZzZXQ6IFswLCAtMTAwXSxcbiAgICAgICAgfSk7XG4gICAgc2V0Vmlld3BvcnQoe1xuICAgICAgLi4udmlld3BvcnQsXG4gICAgICBsb25naXR1ZGUsXG4gICAgICBsYXRpdHVkZSxcbiAgICAgIHpvb20sXG4gICAgICB0cmFuc2l0aW9uRHVyYXRpb246IDEwMDAsXG4gICAgICB0cmFuc2l0aW9uSW50ZXJwb2xhdG9yOiBuZXcgRmx5VG9JbnRlcnBvbGF0b3IoKSxcbiAgICAgIHRyYW5zaXRpb25FYXNpbmc6IGQzLmVhc2VDdWJpYyxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrVGVycml0b3J5Rm9jdXNCdXR0b24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYnV0dG9uSUQgPSBldmVudC50YXJnZXQgJiYgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuaWQ7XG5cbiAgICBzd2l0Y2ggKGJ1dHRvbklEKSB7XG4gICAgICBjYXNlICc0OCc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuTE9XRVJfNDhfQk9VTkRTKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBSyc6XG4gICAgICAgIGdvVG9QbGFjZShjb25zdGFudHMuQUxBU0tBX0JPVU5EUyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSEknOlxuICAgICAgICBnb1RvUGxhY2UoY29uc3RhbnRzLkhBV0FJSV9CT1VORFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BSJzpcbiAgICAgICAgZ29Ub1BsYWNlKGNvbnN0YW50cy5QVUVSVE9fUklDT19CT1VORFMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvblN0YXJ0ID0gKCkgPT4ge1xuICAgIHNldFRyYW5zaXRpb25JblByb2dyZXNzKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9ICgpID0+IHtcbiAgICBzZXRUcmFuc2l0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XG4gIH07XG5cbiAgY29uc3Qgb25HZW9sb2NhdGUgPSAoKSA9PiB7XG4gICAgc2V0R2VvbG9jYXRpb25JblByb2dyZXNzKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrR2VvbG9jYXRlID0gKCkgPT4ge1xuICAgIHNldEdlb2xvY2F0aW9uSW5Qcm9ncmVzcyh0cnVlKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8R3JpZCBjb2w9ezEyfSBkZXNrdG9wPXt7Y29sOiA5fX0+XG4gICAgICAgIDxSZWFjdE1hcEdMXG4gICAgICAgICAgey4uLnZpZXdwb3J0fVxuICAgICAgICAgIG1hcFN0eWxlPXttYWtlTWFwU3R5bGUoZmxhZ3MpfVxuICAgICAgICAgIG1pblpvb209e2NvbnN0YW50cy5HTE9CQUxfTUlOX1pPT019XG4gICAgICAgICAgbWF4Wm9vbT17Y29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTX1cbiAgICAgICAgICBtYXBPcHRpb25zPXt7aGFzaDogdHJ1ZX19XG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBoZWlnaHQ9e3dpbmRvd1dpZHRoIDwgMTAyNCA/ICc0NHZoJyA6ICcxMDAlJ31cbiAgICAgICAgICBkcmFnUm90YXRlPXtmYWxzZX1cbiAgICAgICAgICB0b3VjaFJvdGF0ZT17ZmFsc2V9XG4gICAgICAgICAgaW50ZXJhY3RpdmVMYXllcklkcz17W2NvbnN0YW50cy5ISUdIX1NDT1JFX0xBWUVSX05BTUVdfVxuICAgICAgICAgIG9uVmlld3BvcnRDaGFuZ2U9e3NldFZpZXdwb3J0fVxuICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgb25Mb2FkPXtvbkxvYWR9XG4gICAgICAgICAgb25UcmFuc2l0aW9uU3RhcnQ9e29uVHJhbnNpdGlvblN0YXJ0fVxuICAgICAgICAgIG9uVHJhbnNpdGlvbkVuZD17b25UcmFuc2l0aW9uRW5kfVxuICAgICAgICAgIHJlZj17bWFwUmVmfVxuICAgICAgICAgIGRhdGEtY3k9eydyZWFjdE1hcEdMJ31cbiAgICAgICAgPlxuICAgICAgICAgIDxTb3VyY2VcbiAgICAgICAgICAgIGlkPXtjb25zdGFudHMuSElHSF9TQ09SRV9TT1VSQ0VfTkFNRX1cbiAgICAgICAgICAgIHR5cGU9XCJ2ZWN0b3JcIlxuICAgICAgICAgICAgcHJvbW90ZUlkPXtjb25zdGFudHMuR0VPSURfUFJPUEVSVFl9XG4gICAgICAgICAgICB0aWxlcz17W2NvbnN0YW50cy5GRUFUVVJFX1RJTEVfSElHSF9aT09NX1VSTF19XG4gICAgICAgICAgICBtYXh6b29tPXtjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0hJR0h9XG4gICAgICAgICAgICBtaW56b29tPXtjb25zdGFudHMuR0xPQkFMX01BWF9aT09NX0hJR0h9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPExheWVyXG4gICAgICAgICAgICAgIGlkPXtjb25zdGFudHMuQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfSElHSExJR0hUX0xBWUVSX05BTUV9XG4gICAgICAgICAgICAgIHNvdXJjZS1sYXllcj17Y29uc3RhbnRzLlNDT1JFX1NPVVJDRV9MQVlFUn1cbiAgICAgICAgICAgICAgdHlwZT0nbGluZSdcbiAgICAgICAgICAgICAgcGFpbnQ9e3tcbiAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IGNvbnN0YW50cy5ERUZBVUxUX09VVExJTkVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ2xpbmUtd2lkdGgnOiBjb25zdGFudHMuQ1VSUkVOVExZX1NFTEVDVEVEX0ZFQVRVUkVfTEFZRVJfV0lEVEgsXG4gICAgICAgICAgICAgICAgJ2xpbmUtb3BhY2l0eSc6IGNvbnN0YW50cy5DVVJSRU5UTFlfU0VMRUNURURfRkVBVFVSRV9MQVlFUl9PUEFDSVRZLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBtaW56b29tPXtjb25zdGFudHMuR0xPQkFMX01JTl9aT09NX0hJR0hMSUdIVH1cbiAgICAgICAgICAgICAgbWF4em9vbT17Y29uc3RhbnRzLkdMT0JBTF9NQVhfWk9PTV9ISUdITElHSFR9XG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICA8TGF5ZXJcbiAgICAgICAgICAgICAgaWQ9e2NvbnN0YW50cy5CTE9DS19HUk9VUF9CT1VOREFSWV9MQVlFUl9OQU1FfVxuICAgICAgICAgICAgICB0eXBlPSdsaW5lJ1xuICAgICAgICAgICAgICBzb3VyY2UtbGF5ZXI9e2NvbnN0YW50cy5TQ09SRV9TT1VSQ0VfTEFZRVJ9XG4gICAgICAgICAgICAgIHBhaW50PXt7XG4gICAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiBjb25zdGFudHMuQk9SREVSX0hJR0hMSUdIVF9DT0xPUixcbiAgICAgICAgICAgICAgICAnbGluZS13aWR0aCc6IGNvbnN0YW50cy5ISUdITElHSFRfQk9SREVSX1dJRFRILFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgICAgbWluem9vbT17Y29uc3RhbnRzLkdMT0JBTF9NSU5fWk9PTV9ISUdIfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NvdXJjZT5cbiAgICAgICAgICB7KCdmcycgaW4gZmxhZ3MgJiYgZGV0YWlsVmlld0RhdGEgJiYgIXRyYW5zaXRpb25JblByb2dyZXNzKSAmJiAoXG4gICAgICAgICAgICA8UG9wdXBcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuajQwUG9wdXB9XG4gICAgICAgICAgICAgIHRpcFNpemU9ezV9XG4gICAgICAgICAgICAgIGFuY2hvcj1cInRvcFwiXG4gICAgICAgICAgICAgIGxvbmdpdHVkZT17ZGV0YWlsVmlld0RhdGEubG9uZ2l0dWRlIX1cbiAgICAgICAgICAgICAgbGF0aXR1ZGU9e2RldGFpbFZpZXdEYXRhLmxhdGl0dWRlIX1cbiAgICAgICAgICAgICAgY2xvc2VPbkNsaWNrPXt0cnVlfVxuICAgICAgICAgICAgICBvbkNsb3NlPXtzZXREZXRhaWxWaWV3RGF0YX1cbiAgICAgICAgICAgICAgY2FwdHVyZVNjcm9sbD17dHJ1ZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFyZWFEZXRhaWwgcHJvcGVydGllcz17ZGV0YWlsVmlld0RhdGEucHJvcGVydGllc30gLz5cbiAgICAgICAgICAgIDwvUG9wdXA+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8TmF2aWdhdGlvbkNvbnRyb2xcbiAgICAgICAgICAgIHNob3dDb21wYXNzPXtmYWxzZX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLm5hdmlnYXRpb25Db250cm9sfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgeydnbCcgaW4gZmxhZ3MgPyA8R2VvbG9jYXRlQ29udHJvbFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuZ2VvbG9jYXRlQ29udHJvbH1cbiAgICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucz17e2VuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZX19XG4gICAgICAgICAgICBvbkdlb2xvY2F0ZT17b25HZW9sb2NhdGV9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIC8vIFR5cGVzIGhhdmUgbm90IGNhdWdodCB1cCB5ZXQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlzZ2wvcmVhY3QtbWFwLWdsL2lzc3Vlcy8xNDkyXG4gICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrR2VvbG9jYXRlfVxuICAgICAgICAgIC8+IDogJyd9XG4gICAgICAgICAge2dlb2xvY2F0aW9uSW5Qcm9ncmVzcyA/IDxkaXY+R2VvbG9jYXRpb24gaW4gcHJvZ3Jlc3MuLi48L2Rpdj4gOiAnJ31cbiAgICAgICAgICA8VGVycml0b3J5Rm9jdXNDb250cm9sIG9uQ2xpY2tUZXJyaXRvcnlGb2N1c0J1dHRvbj17b25DbGlja1RlcnJpdG9yeUZvY3VzQnV0dG9ufS8+XG4gICAgICAgICAgeydmcycgaW4gZmxhZ3MgPyA8RnVsbHNjcmVlbkNvbnRyb2wgY2xhc3NOYW1lPXtzdHlsZXMuZnVsbHNjcmVlbkNvbnRyb2x9Lz4gOicnIH1cbiAgICAgICAgPC9SZWFjdE1hcEdMPlxuICAgICAgPC9HcmlkPlxuXG4gICAgICA8R3JpZCBjb2w9ezEyfSBkZXNrdG9wPXt7Y29sOiAzfX0gY2xhc3NOYW1lPXtzdHlsZXMubWFwSW5mb1BhbmVsfT5cbiAgICAgICAgPE1hcEluZm9QYW5lbFxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLm1hcEluZm9QYW5lbH1cbiAgICAgICAgICBmZWF0dXJlUHJvcGVydGllcz17ZGV0YWlsVmlld0RhdGE/LnByb3BlcnRpZXN9XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ9e3NlbGVjdGVkRmVhdHVyZT8uaWR9XG4gICAgICAgIC8+XG4gICAgICA8L0dyaWQ+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKNDBNYXA7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgbWFwQ2FwdGlvblRleHRMaW5rID0gXCJtYXBXcmFwcGVyLW1vZHVsZS0tbWFwQ2FwdGlvblRleHRMaW5rLS0yM2IyblwiOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbXBvcnQgQWxlcnRXcmFwcGVyIGZyb20gJy4uL0FsZXJ0V3JhcHBlcic7XG5pbXBvcnQgSjQwTWFwIGZyb20gJy4uL0o0ME1hcCc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL21hcFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgRVhQTE9SRV9DT1BZIGZyb20gJy4uLy4uL2RhdGEvY29weS9leHBsb3JlJztcblxuaW50ZXJmYWNlIElNYXBXcmFwcGVyUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuY29uc3QgTWFwV3JhcHBlciA9ICh7bG9jYXRpb259OiBJTWFwV3JhcHBlclByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgPEdyaWQgY29sPXsxMn0+XG4gICAgICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXtmYWxzZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e3RydWV9Lz5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9HcmlkPlxuXG4gICAgICA8R3JpZCByb3c+XG4gICAgICAgIDxKNDBNYXAgbG9jYXRpb249e2xvY2F0aW9ufS8+XG4gICAgICA8L0dyaWQ+XG5cbiAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgPEdyaWQgY29sPXs3fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLm1hcENhcHRpb25UZXh0TGlua30+XG4gICAgICAgICAgICB7RVhQTE9SRV9DT1BZLkRPV05MT0FEX0RSQUZULlBBUkFHUkFQSF8xfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7RVhQTE9SRV9DT1BZLkRPV05MT0FEX0RSQUZULlBBUkFHUkFQSF8yfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0dyaWQ+XG4gICAgPC8+XG4gICk7XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IE1hcFdyYXBwZXI7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgbGVnZW5kQ29udGFpbmVyID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1sZWdlbmRDb250YWluZXItLTJGYUtIXCI7XG5leHBvcnQgdmFyIGNvbG9yU3dhdGNoID0gXCJtYXBMZWdlbmQtbW9kdWxlLS1jb2xvclN3YXRjaC0tX1NRd1RcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9tYXBMZWdlbmQubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgRVhQTE9SRV9DT1BZIGZyb20gJy4uLy4uL2RhdGEvY29weS9leHBsb3JlJztcblxuY29uc3QgTWFwTGVnZW5kID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMubGVnZW5kQ29udGFpbmVyfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY29sb3JTd2F0Y2h9IC8+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1oNCd9PlxuICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoRVhQTE9SRV9DT1BZLkxFR0VORC5QUklPUklUWV9MQUJFTCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzc05hbWU9eydzZWNvbmRhcnknfT5cbiAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5MRUdFTkQuUFJJT1JJVFlfREVTQ1JJUFQpfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1hcExlZ2VuZDtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge0dyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9jb21wb25lbnRzL0FsZXJ0V3JhcHBlcic7XG5pbXBvcnQgSG93WW91Q2FuSGVscCBmcm9tICcuLi9jb21wb25lbnRzL0hvd1lvdUNhbkhlbHAnO1xuaW1wb3J0IEo0ME1haW5HcmlkQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvSjQwTWFpbkdyaWRDb250YWluZXInO1xuaW1wb3J0IExheW91dCBmcm9tICcuLi9jb21wb25lbnRzL2xheW91dCc7XG5pbXBvcnQgTWFwV3JhcHBlciBmcm9tICcuLi9jb21wb25lbnRzL01hcFdyYXBwZXInO1xuaW1wb3J0IE1hcExlZ2VuZCBmcm9tICcuLi9jb21wb25lbnRzL01hcExlZ2VuZCc7XG5cbmltcG9ydCAqIGFzIEVYUExPUkVfQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvZXhwbG9yZSc7XG5cbmludGVyZmFjZSBJTWFwUGFnZVByb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufVxuXG5jb25zdCBDRUpTVFBhZ2UgPSAoe2xvY2F0aW9ufTogSU1hcFBhZ2VQcm9wcykgPT4ge1xuICAvLyBXZSB0ZW1wb3JhcmlseSByZW1vdmVkIE1hcENvbnRyb2xzLCB3aGljaCB3b3VsZCBlbmFibGUgeW91IHRvIGBzZXRGZWF0dXJlc2AgYWxzbywgZm9yIG5vd1xuICAvLyAgIFdlIHdpbGwgYnJpbmcgYmFjayBsYXRlciB3aGVuIHdlIGhhdmUgaW50ZXJhY3RpdmUgY29udHJvbHMuXG4gIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG5cblxuICByZXR1cm4gKDxMYXlvdXQgbG9jYXRpb249e2xvY2F0aW9ufSB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5QQUdFX0lOVFJPLlBBR0VfVElMRSl9PlxuICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgIDxBbGVydFdyYXBwZXIgc2hvd0JldGFBbGVydD17dHJ1ZX0gc2hvd0xpbWl0ZWREYXRhQWxlcnQ9e2ZhbHNlfS8+XG4gICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgIDxoMT57aW50bC5mb3JtYXRNZXNzYWdlKEVYUExPUkVfQ09QWS5QQUdFX0lOVFJPLlBBR0VfSEVBRElORyl9PC9oMT5cbiAgICAgIDxHcmlkIHJvdyBjbGFzc05hbWU9eydqNDAtbWItNSd9PlxuICAgICAgICA8R3JpZCBjb2w9ezEyfSB0YWJsZXQ9e3tjb2w6IDZ9fT5cbiAgICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICB7RVhQTE9SRV9DT1BZLlBBR0VfREVTQ1JJUFRJT059XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L0dyaWQ+XG4gICAgICAgIDxHcmlkIGNvbD17MTJ9IHRhYmxldD17e2NvbDogNn19PlxuICAgICAgICAgIDxNYXBMZWdlbmQgLz5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9HcmlkPlxuICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICA8SjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8TWFwV3JhcHBlciBsb2NhdGlvbj17bG9jYXRpb259Lz5cbiAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPEdyaWQgcm93PlxuICAgICAgICA8R3JpZCBjb2w+XG4gICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICA8SG93WW91Q2FuSGVscC8+XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0dyaWQ+XG4gICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgPC9MYXlvdXQ+KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENFSlNUUGFnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1317\n")}}]); \ No newline at end of file diff --git a/803-0bf34ac/component---src-pages-contact-tsx-7f940e0ac0afa9fe32d0.js b/803-0bf34ac/component---src-pages-contact-tsx-7f940e0ac0afa9fe32d0.js new file mode 100644 index 00000000..4c1ca2d8 --- /dev/null +++ b/803-0bf34ac/component---src-pages-contact-tsx-7f940e0ac0afa9fe32d0.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[650],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ components_AlertWrapper; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = "alertWrapper-module--alertWrapper--blPAc";\nvar alertHide = "alertWrapper-module--alertHide--9Ud1N";\nvar alertWarning = "alertWrapper-module--alertWarning--31gxK";\n// EXTERNAL MODULE: ./src/data/copy/common.tsx\nvar common = __webpack_require__(4489);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement("div",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"info"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.BETA_TITLE */.N$.BETA_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.BETA_BODY */.N$.BETA_BODY)),/*#__PURE__*/react.createElement("br",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"warning"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.LIMITED_TITLE */.N$.LIMITED_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.LIMITED_BODY */.N$.LIMITED_BODY)),/*#__PURE__*/react.createElement("br",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiLCJDT01NT05fQ09QWSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBLDhEOzs7O0FDU1AsR0FBTUEsYUFBWSxDQUFHLFFBQWZBLGFBQWUsTUFHSyw2QkFGeEJDLGFBRXdCLENBRnhCQSxhQUV3Qiw2QkFGUixLQUVRLCtDQUR4QkMsb0JBQ3dCLENBRHhCQSxvQkFDd0IsZ0NBREQsS0FDQyx1QkFDeEIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUdBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRUMsWUFBaEIsRUFDR0osYUFBYSxlQUNaLG9CQUFDLFNBQUQsRUFBTyxTQUFTLENBQUUsZUFBbEIsQ0FBbUMsSUFBSSxDQUFDLE1BQXhDLGVBQ0UsNEJBQU0sU0FBUyxDQUFFLHFCQUFqQixFQUF5Q0UsSUFBSSxDQUFDRyxhQUFMLENBQW1CQywyQ0FBbkIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMseUNBQW5CLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQUZKLENBU0dMLG9CQUFvQixlQUNuQixvQkFBQyxTQUFELEVBQU8sU0FBUyxDQUFFLGVBQWxCLENBQW1DLElBQUksQ0FBQyxTQUF4QyxlQUNFLDRCQUFNLFNBQVMsQ0FBRSxxQkFBakIsRUFBeUNDLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMsaURBQW5CLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDSixJQUFJLENBQUNHLGFBQUwsQ0FBbUJDLCtDQUFuQixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FWSixDQURGLENBbUJELENBMUJELENBNEJBLDREQUFlUCxZQUFmIiwiZmlsZSI6IjY3ODAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgYWxlcnRXcmFwcGVyID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydFdyYXBwZXItLWJsUEFjXCI7XG5leHBvcnQgdmFyIGFsZXJ0SGlkZSA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRIaWRlLS05VWQxTlwiO1xuZXhwb3J0IHZhciBhbGVydFdhcm5pbmcgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V2FybmluZy0tMzFneEtcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtBbGVydH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgQ09NTU9OX0NPUFkgZnJvbSAnLi4vLi4vZGF0YS9jb3B5L2NvbW1vbic7XG5cbmludGVyZmFjZSBJQWxlcnRXcmFwcGVyUHJvcHMge1xuICBzaG93QmV0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2VcbiAgc2hvd0xpbWl0ZWREYXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byBmYWxzZVxufVxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbGVydFdyYXBwZXJ9PlxuICAgICAge3Nob3dCZXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJpbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuXG4gICAgICB7c2hvd0xpbWl0ZWREYXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJ3YXJuaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRXcmFwcGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6780\n')},6183:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fo\": function() { return /* binding */ PAGE_INTRO; },\n/* harmony export */ \"lO\": function() { return /* binding */ CONTACT_VIA_EMAIL; },\n/* harmony export */ \"ap\": function() { return /* binding */ FEEDBACK_EMAIL; }\n/* harmony export */ });\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4424);\nvar PAGE_INTRO=(0,react_intl__WEBPACK_IMPORTED_MODULE_0__/* .defineMessages */ .vU)({PAGE_TILE:{id:'contact.page.title.text',defaultMessage:'Contact',description:'contact page title text'},PAGE_HEADING:{id:'contact.page.header.text',defaultMessage:'Contact',description:'contact page header text'},PAGE_SUB_HEADING:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'},PAGE_DESCRIPTION:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'}});var CONTACT_VIA_EMAIL={ID:'contact.general',DESCRIPTION:'Contact page body text',DEFAULT_MESSAGE:\"For general feedback, email {general_email_address}\"};var FEEDBACK_EMAIL='screeningtool.feedback@usds.gov';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvY29udGFjdC50c3g/ZWJlYiJdLCJuYW1lcyI6WyJQQUdFX0lOVFJPIiwiZGVmaW5lTWVzc2FnZXMiLCJQQUdFX1RJTEUiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJQQUdFX0hFQURJTkciLCJQQUdFX1NVQl9IRUFESU5HIiwiUEFHRV9ERVNDUklQVElPTiIsIkNPTlRBQ1RfVklBX0VNQUlMIiwiSUQiLCJERVNDUklQVElPTiIsIkRFRkFVTFRfTUVTU0FHRSIsIkZFRURCQUNLX0VNQUlMIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFTyxHQUFNQSxXQUFVLENBQUdDLG9FQUFjLENBQUMsQ0FDdkNDLFNBQVMsQ0FBRSxDQUNUQyxFQUFFLENBQUUseUJBREssQ0FFVEMsY0FBYyxDQUFFLFNBRlAsQ0FHVEMsV0FBVyxDQUFFLHlCQUhKLENBRDRCLENBTXZDQyxZQUFZLENBQUUsQ0FDWkgsRUFBRSxDQUFFLDBCQURRLENBRVpDLGNBQWMsQ0FBRSxTQUZKLENBR1pDLFdBQVcsQ0FBRSwwQkFIRCxDQU55QixDQVd2Q0UsZ0JBQWdCLENBQUUsQ0FDaEJKLEVBQUUsQ0FBRSw4QkFEWSxDQUVoQkMsY0FBYyxDQUFFLFVBRkEsQ0FHaEJDLFdBQVcsQ0FBRSw4QkFIRyxDQVhxQixDQWdCdkNHLGdCQUFnQixDQUFFLENBQ2hCTCxFQUFFLENBQUUsOEJBRFksQ0FFaEJDLGNBQWMsQ0FBRSxVQUZBLENBR2hCQyxXQUFXLENBQUUsOEJBSEcsQ0FoQnFCLENBQUQsQ0FBakMsQ0F1QkEsR0FBTUksa0JBQWlCLENBQUcsQ0FDL0JDLEVBQUUsQ0FBRSxpQkFEMkIsQ0FFL0JDLFdBQVcsQ0FBRSx3QkFGa0IsQ0FHL0JDLGVBQWUsc0RBSGdCLENBQTFCLENBTUEsR0FBTUMsZUFBYyxDQUFHLGlDQUF2QiIsImZpbGUiOiI2MTgzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmV4cG9ydCBjb25zdCBQQUdFX0lOVFJPID0gZGVmaW5lTWVzc2FnZXMoe1xuICBQQUdFX1RJTEU6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS50aXRsZS50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NvbnRhY3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHRpdGxlIHRleHQnLFxuICB9LFxuICBQQUdFX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5oZWFkZXIudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb250YWN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ2NvbnRhY3QgcGFnZSBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfU1VCX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfREVTQ1JJUFRJT046IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IENPTlRBQ1RfVklBX0VNQUlMID0ge1xuICBJRDogJ2NvbnRhY3QuZ2VuZXJhbCcsXG4gIERFU0NSSVBUSU9OOiAnQ29udGFjdCBwYWdlIGJvZHkgdGV4dCcsXG4gIERFRkFVTFRfTUVTU0FHRTogYEZvciBnZW5lcmFsIGZlZWRiYWNrLCBlbWFpbCB7Z2VuZXJhbF9lbWFpbF9hZGRyZXNzfWAsXG59O1xuXG5leHBvcnQgY29uc3QgRkVFREJBQ0tfRU1BSUwgPSAnc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdic7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6183\n")},440:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2593);\n/* harmony import */ var _trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6780);\n/* harmony import */ var _components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6445);\n/* harmony import */ var _components_layout__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5614);\n/* harmony import */ var _data_copy_contact__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6183);\nvar ContactPage=function ContactPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.useIntl)();return/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_layout__WEBPACK_IMPORTED_MODULE_5__/* .default */ .Z,{location:location,title:intl.formatMessage(_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .PAGE_INTRO.PAGE_TILE */ .fo.PAGE_TILE)},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_AlertWrapper__WEBPACK_IMPORTED_MODULE_3__/* .default */ .Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_components_J40MainGridContainer__WEBPACK_IMPORTED_MODULE_4__/* .default */ .Z,null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{row:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_trussworks_react_uswds__WEBPACK_IMPORTED_MODULE_1__.Grid,{col:true},/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("h1",null,intl.formatMessage(_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .PAGE_INTRO.PAGE_HEADING */ .fo.PAGE_HEADING)),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("h2",null,intl.formatMessage(_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .PAGE_INTRO.PAGE_SUB_HEADING */ .fo.PAGE_SUB_HEADING)),/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",null,/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage,{id:_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .CONTACT_VIA_EMAIL.ID */ .lO.ID,description:_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .CONTACT_VIA_EMAIL.DESCRIPTION */ .lO.DESCRIPTION,defaultMessage:_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .CONTACT_VIA_EMAIL.DEFAULT_MESSAGE */ .lO.DEFAULT_MESSAGE,values:{general_email_address:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("a",{href:"mailto:"+_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .FEEDBACK_EMAIL */ .ap,target:"_blank",rel:"noreferrer"},_data_copy_contact__WEBPACK_IMPORTED_MODULE_6__/* .FEEDBACK_EMAIL */ .ap)}}))))));};/* harmony default export */ __webpack_exports__["default"] = (ContactPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9jb250YWN0LnRzeD9kMDA4Il0sIm5hbWVzIjpbIkNvbnRhY3RQYWdlIiwibG9jYXRpb24iLCJpbnRsIiwidXNlSW50bCIsImZvcm1hdE1lc3NhZ2UiLCJDT05UQUNUX0NPUFkiLCJnZW5lcmFsX2VtYWlsX2FkZHJlc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFjQSxHQUFNQSxZQUFXLENBQUcsUUFBZEEsWUFBYyxNQUFtQyxJQUFqQ0MsU0FBaUMsTUFBakNBLFFBQWlDLENBQ3JELEdBQU1DLEtBQUksQ0FBR0MsMkRBQU8sRUFBcEIsQ0FFQSxtQkFDRSxpREFBQyxnRUFBRCxFQUFRLFFBQVEsQ0FBRUYsUUFBbEIsQ0FBNEIsS0FBSyxDQUFFQyxJQUFJLENBQUNFLGFBQUwsQ0FBbUJDLHdGQUFuQixDQUFuQyxlQUVFLGlEQUFDLDhFQUFELG1CQUNFLGlEQUFDLHNFQUFELEVBQWMsYUFBYSxDQUFFLElBQTdCLENBQW1DLG9CQUFvQixDQUFFLEtBQXpELEVBREYsQ0FGRixjQU1FLGlEQUFDLDhFQUFELG1CQUNFLGlEQUFDLHlEQUFELEVBQU0sR0FBRyxLQUFULGVBQ0UsaURBQUMseURBQUQsRUFBTSxHQUFHLEtBQVQsZUFDRSwyREFDR0gsSUFBSSxDQUFDRSxhQUFMLENBQW1CQyw4RkFBbkIsQ0FESCxDQURGLGNBSUUsMkRBQ0dILElBQUksQ0FBQ0UsYUFBTCxDQUFtQkMsc0dBQW5CLENBREgsQ0FKRixjQU9FLHVFQUNFLGlEQUFDLGdFQUFELEVBQ0UsRUFBRSxDQUFFQSxpRkFETixDQUVFLFdBQVcsQ0FBRUEsbUdBRmYsQ0FHRSxjQUFjLENBQUVBLDJHQUhsQixDQUlFLE1BQU0sQ0FBRSxDQUNOQyxxQkFBcUIsY0FDbkIsc0RBQ0UsSUFBSSxXQUFZRCx3RUFEbEIsQ0FFRSxNQUFNLENBQUMsUUFGVCxDQUdFLEdBQUcsQ0FBQyxZQUhOLEVBSUdBLHdFQUpILENBRkksQ0FKVixFQURGLENBUEYsQ0FERixDQURGLENBTkYsQ0FERixDQW9DRCxDQXZDRCxDQXlDQSwrREFBZUwsV0FBZiIsImZpbGUiOiI0NDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0dyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbmltcG9ydCB7dXNlSW50bCwgRm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9jb21wb25lbnRzL0FsZXJ0V3JhcHBlcic7XG5pbXBvcnQgSjQwTWFpbkdyaWRDb250YWluZXIgZnJvbSAnLi4vY29tcG9uZW50cy9KNDBNYWluR3JpZENvbnRhaW5lcic7XG5pbXBvcnQgTGF5b3V0IGZyb20gJy4uL2NvbXBvbmVudHMvbGF5b3V0JztcblxuaW1wb3J0ICogYXMgQ09OVEFDVF9DT1BZIGZyb20gJy4uL2RhdGEvY29weS9jb250YWN0JztcblxuaW50ZXJmYWNlIElDb250YWN0UGFnZVByb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufVxuXG5jb25zdCBDb250YWN0UGFnZSA9ICh7bG9jYXRpb259OiBJQ29udGFjdFBhZ2VQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIHJldHVybiAoXG4gICAgPExheW91dCBsb2NhdGlvbj17bG9jYXRpb259IHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09OVEFDVF9DT1BZLlBBR0VfSU5UUk8uUEFHRV9USUxFKX0+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgIDxHcmlkIGNvbD5cbiAgICAgICAgICAgIDxoMT5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShDT05UQUNUX0NPUFkuUEFHRV9JTlRSTy5QQUdFX0hFQURJTkcpfVxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShDT05UQUNUX0NPUFkuUEFHRV9JTlRSTy5QQUdFX1NVQl9IRUFESU5HKX1cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBpZD17Q09OVEFDVF9DT1BZLkNPTlRBQ1RfVklBX0VNQUlMLklEfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtDT05UQUNUX0NPUFkuQ09OVEFDVF9WSUFfRU1BSUwuREVTQ1JJUFRJT059XG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U9e0NPTlRBQ1RfQ09QWS5DT05UQUNUX1ZJQV9FTUFJTC5ERUZBVUxUX01FU1NBR0V9XG4gICAgICAgICAgICAgICAgdmFsdWVzPXt7XG4gICAgICAgICAgICAgICAgICBnZW5lcmFsX2VtYWlsX2FkZHJlc3M6XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj17YG1haWx0bzoke0NPTlRBQ1RfQ09QWS5GRUVEQkFDS19FTUFJTH1gfVxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtDT05UQUNUX0NPUFkuRkVFREJBQ0tfRU1BSUx9XG4gICAgICAgICAgICAgICAgICAgIDwvYT4sXG4gICAgICAgICAgICAgICAgfX0vPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8L0xheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRhY3RQYWdlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///440\n')}}]); \ No newline at end of file diff --git a/803-0bf34ac/component---src-pages-index-tsx-d55ad365a816e2b3c6fc.js b/803-0bf34ac/component---src-pages-index-tsx-d55ad365a816e2b3c6fc.js new file mode 100644 index 00000000..ca4ab999 --- /dev/null +++ b/803-0bf34ac/component---src-pages-index-tsx-d55ad365a816e2b3c6fc.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[691],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ components_AlertWrapper; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = "alertWrapper-module--alertWrapper--blPAc";\nvar alertHide = "alertWrapper-module--alertHide--9Ud1N";\nvar alertWarning = "alertWrapper-module--alertWarning--31gxK";\n// EXTERNAL MODULE: ./src/data/copy/common.tsx\nvar common = __webpack_require__(4489);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement("div",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"info"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.BETA_TITLE */.N$.BETA_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.BETA_BODY */.N$.BETA_BODY)),/*#__PURE__*/react.createElement("br",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"warning"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.LIMITED_TITLE */.N$.LIMITED_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.LIMITED_BODY */.N$.LIMITED_BODY)),/*#__PURE__*/react.createElement("br",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiLCJDT01NT05fQ09QWSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBLDhEOzs7O0FDU1AsR0FBTUEsYUFBWSxDQUFHLFFBQWZBLGFBQWUsTUFHSyw2QkFGeEJDLGFBRXdCLENBRnhCQSxhQUV3Qiw2QkFGUixLQUVRLCtDQUR4QkMsb0JBQ3dCLENBRHhCQSxvQkFDd0IsZ0NBREQsS0FDQyx1QkFDeEIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUdBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRUMsWUFBaEIsRUFDR0osYUFBYSxlQUNaLG9CQUFDLFNBQUQsRUFBTyxTQUFTLENBQUUsZUFBbEIsQ0FBbUMsSUFBSSxDQUFDLE1BQXhDLGVBQ0UsNEJBQU0sU0FBUyxDQUFFLHFCQUFqQixFQUF5Q0UsSUFBSSxDQUFDRyxhQUFMLENBQW1CQywyQ0FBbkIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMseUNBQW5CLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQUZKLENBU0dMLG9CQUFvQixlQUNuQixvQkFBQyxTQUFELEVBQU8sU0FBUyxDQUFFLGVBQWxCLENBQW1DLElBQUksQ0FBQyxTQUF4QyxlQUNFLDRCQUFNLFNBQVMsQ0FBRSxxQkFBakIsRUFBeUNDLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMsaURBQW5CLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDSixJQUFJLENBQUNHLGFBQUwsQ0FBbUJDLCtDQUFuQixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FWSixDQURGLENBbUJELENBMUJELENBNEJBLDREQUFlUCxZQUFmIiwiZmlsZSI6IjY3ODAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgYWxlcnRXcmFwcGVyID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydFdyYXBwZXItLWJsUEFjXCI7XG5leHBvcnQgdmFyIGFsZXJ0SGlkZSA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRIaWRlLS05VWQxTlwiO1xuZXhwb3J0IHZhciBhbGVydFdhcm5pbmcgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V2FybmluZy0tMzFneEtcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtBbGVydH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgQ09NTU9OX0NPUFkgZnJvbSAnLi4vLi4vZGF0YS9jb3B5L2NvbW1vbic7XG5cbmludGVyZmFjZSBJQWxlcnRXcmFwcGVyUHJvcHMge1xuICBzaG93QmV0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2VcbiAgc2hvd0xpbWl0ZWREYXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byBmYWxzZVxufVxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbGVydFdyYXBwZXJ9PlxuICAgICAge3Nob3dCZXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJpbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuXG4gICAgICB7c2hvd0xpbWl0ZWREYXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJ3YXJuaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRXcmFwcGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6780\n')},6183:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fo\": function() { return /* binding */ PAGE_INTRO; },\n/* harmony export */ \"lO\": function() { return /* binding */ CONTACT_VIA_EMAIL; },\n/* harmony export */ \"ap\": function() { return /* binding */ FEEDBACK_EMAIL; }\n/* harmony export */ });\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4424);\nvar PAGE_INTRO=(0,react_intl__WEBPACK_IMPORTED_MODULE_0__/* .defineMessages */ .vU)({PAGE_TILE:{id:'contact.page.title.text',defaultMessage:'Contact',description:'contact page title text'},PAGE_HEADING:{id:'contact.page.header.text',defaultMessage:'Contact',description:'contact page header text'},PAGE_SUB_HEADING:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'},PAGE_DESCRIPTION:{id:'contact.page.sub.header.text',defaultMessage:'Email us',description:'contact page sub header text'}});var CONTACT_VIA_EMAIL={ID:'contact.general',DESCRIPTION:'Contact page body text',DEFAULT_MESSAGE:\"For general feedback, email {general_email_address}\"};var FEEDBACK_EMAIL='screeningtool.feedback@usds.gov';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvY29udGFjdC50c3g/ZWJlYiJdLCJuYW1lcyI6WyJQQUdFX0lOVFJPIiwiZGVmaW5lTWVzc2FnZXMiLCJQQUdFX1RJTEUiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiZGVzY3JpcHRpb24iLCJQQUdFX0hFQURJTkciLCJQQUdFX1NVQl9IRUFESU5HIiwiUEFHRV9ERVNDUklQVElPTiIsIkNPTlRBQ1RfVklBX0VNQUlMIiwiSUQiLCJERVNDUklQVElPTiIsIkRFRkFVTFRfTUVTU0FHRSIsIkZFRURCQUNLX0VNQUlMIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFTyxHQUFNQSxXQUFVLENBQUdDLG9FQUFjLENBQUMsQ0FDdkNDLFNBQVMsQ0FBRSxDQUNUQyxFQUFFLENBQUUseUJBREssQ0FFVEMsY0FBYyxDQUFFLFNBRlAsQ0FHVEMsV0FBVyxDQUFFLHlCQUhKLENBRDRCLENBTXZDQyxZQUFZLENBQUUsQ0FDWkgsRUFBRSxDQUFFLDBCQURRLENBRVpDLGNBQWMsQ0FBRSxTQUZKLENBR1pDLFdBQVcsQ0FBRSwwQkFIRCxDQU55QixDQVd2Q0UsZ0JBQWdCLENBQUUsQ0FDaEJKLEVBQUUsQ0FBRSw4QkFEWSxDQUVoQkMsY0FBYyxDQUFFLFVBRkEsQ0FHaEJDLFdBQVcsQ0FBRSw4QkFIRyxDQVhxQixDQWdCdkNHLGdCQUFnQixDQUFFLENBQ2hCTCxFQUFFLENBQUUsOEJBRFksQ0FFaEJDLGNBQWMsQ0FBRSxVQUZBLENBR2hCQyxXQUFXLENBQUUsOEJBSEcsQ0FoQnFCLENBQUQsQ0FBakMsQ0F1QkEsR0FBTUksa0JBQWlCLENBQUcsQ0FDL0JDLEVBQUUsQ0FBRSxpQkFEMkIsQ0FFL0JDLFdBQVcsQ0FBRSx3QkFGa0IsQ0FHL0JDLGVBQWUsc0RBSGdCLENBQTFCLENBTUEsR0FBTUMsZUFBYyxDQUFHLGlDQUF2QiIsImZpbGUiOiI2MTgzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkZWZpbmVNZXNzYWdlc30gZnJvbSAncmVhY3QtaW50bCc7XG5cbmV4cG9ydCBjb25zdCBQQUdFX0lOVFJPID0gZGVmaW5lTWVzc2FnZXMoe1xuICBQQUdFX1RJTEU6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS50aXRsZS50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NvbnRhY3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHRpdGxlIHRleHQnLFxuICB9LFxuICBQQUdFX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5oZWFkZXIudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb250YWN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ2NvbnRhY3QgcGFnZSBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfU1VCX0hFQURJTkc6IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIFBBR0VfREVTQ1JJUFRJT046IHtcbiAgICBpZDogJ2NvbnRhY3QucGFnZS5zdWIuaGVhZGVyLnRleHQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRW1haWwgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29udGFjdCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IENPTlRBQ1RfVklBX0VNQUlMID0ge1xuICBJRDogJ2NvbnRhY3QuZ2VuZXJhbCcsXG4gIERFU0NSSVBUSU9OOiAnQ29udGFjdCBwYWdlIGJvZHkgdGV4dCcsXG4gIERFRkFVTFRfTUVTU0FHRTogYEZvciBnZW5lcmFsIGZlZWRiYWNrLCBlbWFpbCB7Z2VuZXJhbF9lbWFpbF9hZGRyZXNzfWAsXG59O1xuXG5leHBvcnQgY29uc3QgRkVFREJBQ0tfRU1BSUwgPSAnc2NyZWVuaW5ndG9vbC5mZWVkYmFja0B1c2RzLmdvdic7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6183\n")},9697:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ pages; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n;// CONCATENATED MODULE: ./src/components/LinkTypeWrapper/index.tsx\n// eslint-disable-next-line valid-jsdoc\n/**\n * This function wraps the two types of links we have. Internal links and\n * external links. Internal links should use the component, while\n * eternal links can use the standard
tag. This function allows the\n * instance to choose the type of link along with the props necessary to\n * set new tabs, classes.\n *\n * Note - if the link is an external link and will not open in a new\n * browser tab, ensure that hitting the back button works. This has shown to\n * have errors on edge cases (ie, launching the gmail client with mailto links)\n * and it is the recommendation to not have external links open in the same tab.\n *\n * @param props\n * @returns\n */var LinkTypeWrapper=function LinkTypeWrapper(props){if(props.internal){return/*#__PURE__*/react.createElement(gatsby_plugin_intl.Link,{to:\"\"+props.url},props.linkText);}else{return props.openUrlNewTab?/*#__PURE__*/react.createElement(\"a\",{className:props.className,href:props.url,target:\"_blank\",rel:\"noreferrer\"},props.linkText):/*#__PURE__*/react.createElement(\"a\",{className:props.className,href:props.url},props.linkText);}};/* harmony default export */ var components_LinkTypeWrapper = (LinkTypeWrapper);\n// EXTERNAL MODULE: ./cypress/integration/common/helpers.js\nvar helpers = __webpack_require__(2900);\n;// CONCATENATED MODULE: ./src/components/AboutCard/AboutCard.tsx\n// the \"body\" section is the child object to allow for html versus just text\nvar AboutCard=function AboutCard(props){if(props.size==='large'){// large are the cards on top\n// note it uses a top className='j40-aboutcard-lg-card'\nreturn/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(lib.Grid,{row:true,className:'j40-aboutcard-lg-card'},/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:3},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:9},\"data-cy\":(0,helpers/* hyphenizeString */.d)(props.header)+\"-block\"},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h2\",null,props.header),props.children))));}else{// small are the cards on the bottom\n// note it uses a top className='j40-aboutcard-sm-card'\nreturn/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:true},gap:'lg',className:props.className||''},/*#__PURE__*/react.createElement(lib.Grid,{row:true,className:'j40-aboutcard-sm-card'},/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:2},className:'j40-aboutpage-image-container'},/*#__PURE__*/react.createElement(\"img\",{className:'j40-aboutcard-image',alt:props.header,src:props.imgSrc})),/*#__PURE__*/react.createElement(lib.Grid,{tablet:{col:9},\"data-cy\":(0,helpers/* hyphenizeString */.d)(props.header)+\"-block\"},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(\"h3\",null,props.header),props.children,/*#__PURE__*/react.createElement(\"div\",{className:'j40-aboutcard-sm-link'},/*#__PURE__*/react.createElement(components_LinkTypeWrapper,{linkText:props.linkText,internal:props.internal,url:props.url,openUrlNewTab:props.openUrlNewTab,className:'j40-aboutcard-link'})))),/*#__PURE__*/react.createElement(lib.Grid,{col:1},' ')));}};/* harmony default export */ var AboutCard_AboutCard = (AboutCard);\n;// CONCATENATED MODULE: ./src/components/AboutCard/AboutCardsContainer.tsx\n// note: this assumes a J40MainGridContainer container!\nvar AboutCardsContainer=function AboutCardsContainer(props){return/*#__PURE__*/react.createElement(lib.Grid,{row:true,gap:'lg',className:'j40-aboutcard-container '+(props.className||'')},props.children);};/* harmony default export */ var AboutCard_AboutCardsContainer = (AboutCardsContainer);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 5 modules\nvar layout = __webpack_require__(5614);\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.js + 8 modules\nvar react_intl_lib = __webpack_require__(4424);\n;// CONCATENATED MODULE: ./src/data/copy/about.tsx\nvar PAGE=(0,react_intl_lib/* defineMessages */.vU)({TILE:{id:'about.page.title.text',defaultMessage:'About',description:'about page title text'},HEADING:{id:'index.heading.about.us',defaultMessage:'About us',description:'main heading for about page'},HEADING_1:{id:'index.heading.screentool',defaultMessage:'The screening tool',description:'heading for about screening tool'},HEADING1_DESCRIPTION1:{id:'about.page.sub.header.1.text.1',defaultMessage:'On January 27, 2021, President Biden directed the Council on'+' Environmental Quality (CEQ) to create a climate and economic'+' justice screening tool. The purpose of the tool is to help'+' Federal agencies identify disadvantaged communities and provide'+' socioeconomic, environmental, and climate information and data'+' to inform decisions that may affect these communities. The tool'+' identifies disadvantaged communities as communities of focus'+' through publicly available, nationally consistent, high-quality'+' data.',description:'about page sub header text'},HEADING1_DESCRIPTION2:{id:'about.page.sub.header.1.text.2',defaultMessage:'The current version of the tool is in a public beta form and'+' will be updated based on feedback from the public.',description:'about page sub header text'},HEADING_2:{id:'index.heading.justice40',defaultMessage:'The Justice40 Initiative',description:'heading for about justice 40'},HEADING2_DESCRIPTION1:{id:'about.page.sub.header.2.text.1',defaultMessage:'The tool will provide important information for the Justice40'+' Initiative. The goal of the Justice40 Initiative is to provide'+' 40-percent of the overall benefits of certain federal'+' programs in seven key areas to disadvantaged communities.'+' These seven key areas are: climate change, clean energy and'+' energy efficiency, clean transit, affordable and sustainable'+' housing, training and workforce development, the remediation'+' and reduction of legacy pollution, and the development of'+' critical clean water infrastructure.',description:'about page sub header text'},HEADING2_DESCRIPTION2:{id:'about.page.sub.header.2.text.2',defaultMessage:'Read more about the Justice40 Initiative in President Biden’s',description:'about page sub header text'},PRESIDENT_LINK_LABEL:{id:'index.presidentalLinkLabel',defaultMessage:'Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.',description:'Link url to presidential actions executive order. Part of paragraph 2'}});var EXEC_ORDER_LINK='https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/'+'executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/';var GITHUB_LINK='https://github.com/usds/justice40-tool';var HOW_TO_GET_STARTED=(0,react_intl_lib/* defineMessages */.vU)({TITLE:{id:'howToGetStarted.title',defaultMessage:'How to get started',description:'sub heading of page'},FEDERAL_PM_HEADING:{id:'federal.pm.heading',defaultMessage:'Federal program managers',description:'sub heading of page'},FEDERAL_PM_INFO:{id:'federal.pm.info',defaultMessage:'Download the screening tool’s draft list of communities of focus.'+' Explore data that may be useful to your program, and provide'+' feedback on the tool.',description:'sub heading of page'},FEDERAL_PM_LINK_TEXT:{id:'federal.pm.link',defaultMessage:'Go to data & methodology',description:'link text to go to methodology page'},COMMUNITY_MEMBERS_HEADING:{id:'community.members.heading',defaultMessage:'Community members',description:'sub heading of page'},COMMUNITY_MEMBERS_INFO:{id:'community.members.info',defaultMessage:'Explore data about communities of focus in your area, and help '+' provide feedback on the tool.',description:'sub heading of page'},COMMUNITY_MEMBERS_LINK_TEXT:{id:'community.members.link',defaultMessage:'Explore the tool',description:'link to explore the tool page'}});var GET_INVOLVED=(0,react_intl_lib/* defineMessages */.vU)({TITLE:{id:'getInvolved.title',defaultMessage:'Get involved',description:'sub heading of page'},SEND_FEEDBACK_HEADING:{id:'send.feedback.heading',defaultMessage:'Send feedback',description:'sending feedback heading'},SEND_FEEDBACK_INFO:{id:'send.feedback.info',defaultMessage:'Have ideas about how this tool can be improved to better reflect'+' the on-the-ground experiences of your community?',description:'sending feedback information'},JOIN_OSC_HEADING:{id:'join.opensource.heading',defaultMessage:'Join the open source community',description:'join the community heading'},JOIN_OSC_INFO:{id:'join.open.source.info',defaultMessage:'The screening tool’s code is open source, which means it is '+' available for the public to view and contribute to. Anyone can view and contribute on GitHub.',description:'info on joining open source community'},JOIN_OSC_LINK_TEXT:{id:'join.open.source.link',defaultMessage:'Check it out on GitHub',description:'link to github repository'}});\n// EXTERNAL MODULE: ./src/data/copy/contact.tsx\nvar contact = __webpack_require__(6183);\n;// CONCATENATED MODULE: ./src/images/about-usmap-1.svg\n/* harmony default export */ var about_usmap_1 = (__webpack_require__.p + \"static/about-usmap-1-4af6422a4e9622e0eac395f724cc4ee0.svg\");\n;// CONCATENATED MODULE: ./src/images/about-j40-1.svg\n/* harmony default export */ var about_j40_1 = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyMTU0LjcgMjI5Ny40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMTU0LjcgMjI5Ny40OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzFDNTA3Rjt9Cgkuc3Qxe2ZvbnQtZmFtaWx5OidBcmlhbC1Cb2xkTVQnO30KCS5zdDJ7Zm9udC1zaXplOjU4MC4yNHB4O30KCS5zdDN7ZmlsbDpub25lO30KCS5zdDR7ZmlsbDojRkZGRkZGO30KCS5zdDV7ZmlsbDojQ0NDQ0NDO30KCS5zdDZ7Y2xpcC1wYXRoOnVybCgjU1ZHSURfMl8pO30KCS5zdDd7Y2xpcC1wYXRoOnVybCgjU1ZHSURfNF8pO2ZpbGw6I0ZGRkZGRjt9Cgkuc3Q4e2ZpbGw6IzE5NDM3Rjt9Cgkuc3Q5e2ZvbnQtZmFtaWx5OidTb3VyY2VTYW5zUHJvLVNlbWlCb2xkJzt9Cgkuc3QxMHtmb250LXNpemU6Mzk3LjU5OTRweDt9Cjwvc3R5bGU+Cjx0ZXh0IHRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIDEgNTg0Ljk0IDE4MTcuMTMpIiBjbGFzcz0ic3QwIHN0MSBzdDIiPjQwJTwvdGV4dD4KPHJlY3QgeD0iMzE1LjMiIGNsYXNzPSJzdDMiIHdpZHRoPSIxNTY5LjciIGhlaWdodD0iMTU2OS43Ii8+CjxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0xMDc3LjQsODc2LjdjMTA2LjYsMCwyMDAuOCwyNS41LDI3Ny4zLDU4LjljNzAuNiwzMS40LDExNS4xLDEwMiwxMTUuMSwxNzguNnYxMDZINjg0Ljl2LTEwNS4zCgljMC03Ny4yLDQ0LjUtMTQ3LjgsMTE1LjEtMTc4LjZDODc2LjYsOTAyLjIsOTcwLjgsODc2LjcsMTA3Ny40LDg3Ni43eiBNNTU0LjEsODkzYzcyLDAsMTMwLjgtNTguOSwxMzAuOC0xMzAuOAoJUzYyNiw2MzEuNCw1NTQuMSw2MzEuNHMtMTMwLjgsNTguOS0xMzAuOCwxMzAuOFM0ODIuMiw4OTMsNTU0LjEsODkzeiBNNjI4LDk2NWMtMjQuMi0zLjktNDguNC02LjUtNzMuOS02LjUKCWMtNjIuNiwwLTEyNC41LDEyLjktMTgxLjgsMzcuOWMtNDguNCwyMC43LTc5LjgsNjguMy03OS44LDEyMXYxMDIuN2gyOTQuM3YtMTA1LjNDNTg2LjgsMTA2MC41LDYwMS45LDEwMDkuNSw2MjgsOTY1eiBNMTYwMC42LDg5MwoJYzcxLjksMCwxMzAuOC01OC45LDEzMC44LTEzMC44cy01OC45LTEzMC44LTEzMC44LTEzMC44cy0xMzAuOCw1OC45LTEzMC44LDEzMC44UzE1MjguNyw4OTMsMTYwMC42LDg5M0wxNjAwLjYsODkzeiBNMTg2Mi4yLDExMTcuNAoJYzAtNTIuNy0zMS40LTEwMC4zLTc5LjgtMTIxYy01Ny4zLTI1LTExOS4yLTM3LjktMTgxLjgtMzcuOWMtMjUuNSwwLTQ5LjcsMi42LTczLjksNi41YzI2LjIsNDQuNSw0MS4yLDk1LjUsNDEuMiwxNDkuOHYxMDUuM2gyOTQuMwoJTDE4NjIuMiwxMTE3LjR6IE0xMDc3LjQsNDM1LjJjMTA4LjQsMCwxOTYuMiw4Ny45LDE5Ni4yLDE5Ni4ycy04Ny45LDE5Ni4yLTE5Ni4yLDE5Ni4yYy0xMDguNCwwLTE5Ni4yLTg3LjktMTk2LjItMTk2LjJsMCwwCgljLTAuMS0xMDguMiw4Ny41LTE5Ni4xLDE5NS44LTE5Ni4yQzEwNzcuMSw0MzUuMiwxMDc3LjIsNDM1LjIsMTA3Ny40LDQzNS4yeiIvPgo8Y2lyY2xlIGNsYXNzPSJzdDUiIGN4PSIxMDc3LjMiIGN5PSIxMjIzLjYiIHI9IjEwNzMuMiIvPgo8Zz4KCTxkZWZzPgoJCTxwYXRoIGlkPSJTVkdJRF8xXyIgZD0iTTEwOTUuOCw2MDIuOGMxMDIuOCwwLDE4NS44LDgzLDE4NS44LDE4NS44cy04MywxODUuOC0xODUuOCwxODUuOFM5MTAsODkxLjQsOTEwLDc4OC42CgkJCVM5OTMsNjAyLjgsMTA5NS44LDYwMi44eiBNMTgzOC45LDEyNDguN2MwLTUwLjItMjkuNy05NC44LTc1LjYtMTE0LjZjLTUyLjYtMjIuOS0xMTAuOS0zNS45LTE3Mi4yLTM1LjljLTI0LjIsMC00Ny4xLDIuNS03MCw2LjIKCQkJYzI0LjgsNDIuMSwzOSw5MC40LDM5LDE0MS44djk5LjdoMjc4LjdWMTI0OC43eiBNMTU5MS4yLDEwMzYuM2M2OC4xLDAsMTIzLjktNTUuNywxMjMuOS0xMjMuOXMtNTUuNy0xMjMuOS0xMjMuOS0xMjMuOQoJCQlzLTEyMy45LDU1LjctMTIzLjksMTIzLjlTMTUyMy4xLDEwMzYuMywxNTkxLjIsMTAzNi4zeiBNNjcwLjMsMTEwNC40Yy0yMi45LTMuNy00NS44LTYuMi03MC02LjJjLTYxLjMsMC0xMTkuNSwxMy0xNzIuMiwzNS45CgkJCWMtNDUuOCwxOS44LTc1LjYsNjQuNC03NS42LDExNC42djk3LjJoMjc4Ljd2LTk5LjdDNjMxLjMsMTE5NC44LDY0NS41LDExNDYuNSw2NzAuMywxMTA0LjR6IE02MDAuMywxMDM2LjMKCQkJYzY4LjEsMCwxMjMuOS01NS43LDEyMy45LTEyMy45cy01NS43LTEyMy45LTEyMy45LTEyMy45cy0xMjMuOSw1NS43LTEyMy45LDEyMy45UzUzMi4yLDEwMzYuMyw2MDAuMywxMDM2LjN6IE0xMDk1LjgsMTAyMC44CgkJCWMxMDAuOSwwLDE5MC4xLDI0LjIsMjYyLjYsNTUuN2M2Ni45LDI5LjcsMTA5LDk2LjYsMTA5LDE2OS4xdjEwMC4zSDcyNC4ydi05OS43YzAtNzMuMSw0Mi4xLTE0MCwxMDktMTY5LjEKCQkJQzkwNS42LDEwNDQuOSw5OTQuOCwxMDIwLjgsMTA5NS44LDEwMjAuOHoiLz4KCTwvZGVmcz4KCTx1c2UgeGxpbms6aHJlZj0iI1NWR0lEXzFfIiAgc3R5bGU9Im92ZXJmbG93OnZpc2libGU7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGOyIvPgoJPGNsaXBQYXRoIGlkPSJTVkdJRF8yXyI+CgkJPHVzZSB4bGluazpocmVmPSIjU1ZHSURfMV8iICBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiLz4KCTwvY2xpcFBhdGg+Cgk8ZyBjbGFzcz0ic3Q2Ij4KCQk8ZGVmcz4KCQkJPHJlY3QgaWQ9IlNWR0lEXzNfIiB4PSIzNTIuNiIgeT0iMjMxLjIiIHdpZHRoPSIxNDg2LjMiIGhlaWdodD0iMTQ4Ni4zIi8+CgkJPC9kZWZzPgoJCTx1c2UgeGxpbms6aHJlZj0iI1NWR0lEXzNfIiAgc3R5bGU9Im92ZXJmbG93OnZpc2libGU7ZmlsbDojRkZGRkZGOyIvPgoJCTxjbGlwUGF0aCBpZD0iU1ZHSURfNF8iPgoJCQk8dXNlIHhsaW5rOmhyZWY9IiNTVkdJRF8zXyIgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIvPgoJCTwvY2xpcFBhdGg+CgkJPHJlY3QgeD0iNDMiIHk9IjI5My4xIiBjbGFzcz0ic3Q3IiB3aWR0aD0iMjEwNS42IiBoZWlnaHQ9IjEzNjIuNCIvPgoJPC9nPgo8L2c+Cjx0ZXh0IHRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIDEgNzI0LjAzNzYgMTcyNy42MDY0KSIgY2xhc3M9InN0OCBzdDkgc3QxMCI+NDAlPC90ZXh0Pgo8L3N2Zz4K\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/account_balance.svg\n/* harmony default export */ var account_balance = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxnPjxyZWN0IGhlaWdodD0iNyIgd2lkdGg9IjMiIHg9IjQiIHk9IjEwIi8+PHJlY3QgaGVpZ2h0PSI3IiB3aWR0aD0iMyIgeD0iMTAuNSIgeT0iMTAiLz48cmVjdCBoZWlnaHQ9IjMiIHdpZHRoPSIyMCIgeD0iMiIgeT0iMTkiLz48cmVjdCBoZWlnaHQ9IjciIHdpZHRoPSIzIiB4PSIxNyIgeT0iMTAiLz48cG9seWdvbiBwb2ludHM9IjEyLDEgMiw2IDIsOCAyMiw4IDIyLDYiLz48L2c+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/groups.svg\n/* harmony default export */ var groups = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PGc+PHBhdGggZD0iTTEyLDEyLjc1YzEuNjMsMCwzLjA3LDAuMzksNC4yNCwwLjljMS4wOCwwLjQ4LDEuNzYsMS41NiwxLjc2LDIuNzNMMTgsMThINmwwLTEuNjFjMC0xLjE4LDAuNjgtMi4yNiwxLjc2LTIuNzMgQzguOTMsMTMuMTQsMTAuMzcsMTIuNzUsMTIsMTIuNzV6IE00LDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMyLDEyLjEsMi45LDEzLDQsMTN6IE01LjEzLDE0LjEgQzQuNzYsMTQuMDQsNC4zOSwxNCw0LDE0Yy0wLjk5LDAtMS45MywwLjIxLTIuNzgsMC41OEMwLjQ4LDE0LjksMCwxNS42MiwwLDE2LjQzVjE4bDQuNSwwdi0xLjYxQzQuNSwxNS41Niw0LjczLDE0Ljc4LDUuMTMsMTQuMXogTTIwLDEzYzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMxOCwxMi4xLDE4LjksMTMsMjAsMTN6IE0yNCwxNi40M2MwLTAuODEtMC40OC0xLjUzLTEuMjItMS44NSBDMjEuOTMsMTQuMjEsMjAuOTksMTQsMjAsMTRjLTAuMzksMC0wLjc2LDAuMDQtMS4xMywwLjFjMC40LDAuNjgsMC42MywxLjQ2LDAuNjMsMi4yOVYxOGw0LjUsMFYxNi40M3ogTTEyLDZjMS42NiwwLDMsMS4zNCwzLDMgYzAsMS42Ni0xLjM0LDMtMywzcy0zLTEuMzQtMy0zQzksNy4zNCwxMC4zNCw2LDEyLDZ6Ii8+PC9nPjwvc3ZnPg==\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/comment.svg\n/* harmony default export */ var comment = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTIxLjk5IDRjMC0xLjEtLjg5LTItMS45OS0ySDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTRsNCA0LS4wMS0xOHpNMTggMTRINnYtMmgxMnYyem0wLTNINlY5aDEydjJ6bTAtM0g2VjZoMTJ2MnoiLz48L3N2Zz4=\");\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/github.svg\n/* harmony default export */ var github = (\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48L2RlZnM+PHBhdGggaWQ9IkdpdGh1YiIgY2xhc3M9ImNscy0xIiBkPSJNMTIsMkExMCwxMCwwLDAsMCw4Ljg0LDIxLjQ5Yy41LjA5LjY4LS4yMi42OC0uNDhzMC0uODcsMC0xLjdDNi43MywxOS45MSw2LjE0LDE4LDYuMTQsMThBMi42OSwyLjY5LDAsMCwwLDUsMTYuNWMtLjkxLS42Mi4wNy0uNjEuMDctLjYxYTIuMTMsMi4xMywwLDAsMSwxLjUzLDEsMi4xNCwyLjE0LDAsMCwwLDIuOTEuODMsMi4xNiwyLjE2LDAsMCwxLC42My0xLjM0QzgsMTYuMTcsNS42MiwxNS4zMSw1LjYyLDExLjQ4YTMuODksMy44OSwwLDAsMSwxLTIuNjksMy41NywzLjU3LDAsMCwxLC4xLTIuNjRzLjg0LS4yNywyLjc1LDFhOS42Myw5LjYzLDAsMCwxLDUsMGMxLjkxLTEuMjksMi43NS0xLDIuNzUtMWEzLjU3LDMuNTcsMCwwLDEsLjEsMi42NCwzLjg5LDMuODksMCwwLDEsMSwyLjY5YzAsMy44NC0yLjM0LDQuNjgtNC41Nyw0LjkzYTIuMzksMi4zOSwwLDAsMSwuNjgsMS44NWMwLDEuMzQsMCwyLjQyLDAsMi43NXMuMTguNTguNjkuNDhBMTAsMTAsMCwwLDAsMTIsMloiLz48L3N2Zz4=\");\n;// CONCATENATED MODULE: ./src/pages/index.tsx\n// @ts-ignore\n// @ts-ignore\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location,title:intl.formatMessage(PAGE.TILE)},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(\"h1\",{\"data-cy\":'about-page-heading'},intl.formatMessage(PAGE.HEADING)),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_usmap_1,header:intl.formatMessage(PAGE.HEADING_1)},/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(PAGE.HEADING1_DESCRIPTION1)),/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(PAGE.HEADING1_DESCRIPTION2))))),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'large',imgSrc:about_j40_1,header:intl.formatMessage(PAGE.HEADING_2)},/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(PAGE.HEADING2_DESCRIPTION1)),/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(PAGE.HEADING2_DESCRIPTION2),' ',/*#__PURE__*/react.createElement(\"a\",{href:EXEC_ORDER_LINK,target:'_blank',rel:\"noreferrer\"},intl.formatMessage(PAGE.PRESIDENT_LINK_LABEL))))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true,blueBackground:true},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(\"h2\",null,intl.formatMessage(HOW_TO_GET_STARTED.TITLE)),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:account_balance,header:intl.formatMessage(HOW_TO_GET_STARTED.FEDERAL_PM_HEADING),linkText:intl.formatMessage(HOW_TO_GET_STARTED.FEDERAL_PM_LINK_TEXT),url:'/methodology',internal:true},/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(HOW_TO_GET_STARTED.FEDERAL_PM_INFO))),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:groups,header:intl.formatMessage(HOW_TO_GET_STARTED.COMMUNITY_MEMBERS_HEADING),linkText:intl.formatMessage(HOW_TO_GET_STARTED.COMMUNITY_MEMBERS_LINK_TEXT),url:'/cejst',internal:true},/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(HOW_TO_GET_STARTED.COMMUNITY_MEMBERS_INFO)))))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(\"h2\",null,intl.formatMessage(GET_INVOLVED.TITLE)),/*#__PURE__*/react.createElement(AboutCard_AboutCardsContainer,null,/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:comment,header:intl.formatMessage(GET_INVOLVED.SEND_FEEDBACK_HEADING),linkText:\"Email: \"+contact/* FEEDBACK_EMAIL */.ap,url:\"mailto:\"+contact/* FEEDBACK_EMAIL */.ap,openUrlNewTab:true,internal:false},/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(GET_INVOLVED.SEND_FEEDBACK_INFO))),/*#__PURE__*/react.createElement(AboutCard_AboutCard,{size:'small',imgSrc:github,header:intl.formatMessage(GET_INVOLVED.JOIN_OSC_HEADING),linkText:intl.formatMessage(GET_INVOLVED.JOIN_OSC_LINK_TEXT),url:GITHUB_LINK,openUrlNewTab:true,internal:false},/*#__PURE__*/react.createElement(\"p\",null,intl.formatMessage(GET_INVOLVED.JOIN_OSC_INFO))))));};/* harmony default export */ var pages = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0xpbmtUeXBlV3JhcHBlci9pbmRleC50c3g/MzVkNyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmQudHN4PzUwM2YiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9BYm91dENhcmQvQWJvdXRDYXJkc0NvbnRhaW5lci50c3g/N2IzMSIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvYWJvdXQudHN4P2U0MGEiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvaW1hZ2VzL2Fib3V0LXVzbWFwLTEuc3ZnPzFiZTIiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvaW1hZ2VzL2Fib3V0LWo0MC0xLnN2Zz8zYmEzIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9hY2NvdW50X2JhbGFuY2Uuc3ZnPzc1ODUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2dyb3Vwcy5zdmc/MDBlMCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvY29tbWVudC5zdmc/ZmFiMiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ2l0aHViLnN2Zz82YjQ0Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL3BhZ2VzL2luZGV4LnRzeD80MWUwIl0sIm5hbWVzIjpbIkxpbmtUeXBlV3JhcHBlciIsInByb3BzIiwiaW50ZXJuYWwiLCJ1cmwiLCJsaW5rVGV4dCIsIm9wZW5VcmxOZXdUYWIiLCJjbGFzc05hbWUiLCJBYm91dENhcmQiLCJzaXplIiwiY29sIiwiaGVhZGVyIiwiaW1nU3JjIiwiaHlwaGVuaXplU3RyaW5nIiwiY2hpbGRyZW4iLCJBYm91dENhcmRzQ29udGFpbmVyIiwiUEFHRSIsImRlZmluZU1lc3NhZ2VzIiwiVElMRSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsIkhFQURJTkciLCJIRUFESU5HXzEiLCJIRUFESU5HMV9ERVNDUklQVElPTjEiLCJIRUFESU5HMV9ERVNDUklQVElPTjIiLCJIRUFESU5HXzIiLCJIRUFESU5HMl9ERVNDUklQVElPTjEiLCJIRUFESU5HMl9ERVNDUklQVElPTjIiLCJQUkVTSURFTlRfTElOS19MQUJFTCIsIkVYRUNfT1JERVJfTElOSyIsIkdJVEhVQl9MSU5LIiwiSE9XX1RPX0dFVF9TVEFSVEVEIiwiVElUTEUiLCJGRURFUkFMX1BNX0hFQURJTkciLCJGRURFUkFMX1BNX0lORk8iLCJGRURFUkFMX1BNX0xJTktfVEVYVCIsIkNPTU1VTklUWV9NRU1CRVJTX0hFQURJTkciLCJDT01NVU5JVFlfTUVNQkVSU19JTkZPIiwiQ09NTVVOSVRZX01FTUJFUlNfTElOS19URVhUIiwiR0VUX0lOVk9MVkVEIiwiU0VORF9GRUVEQkFDS19IRUFESU5HIiwiU0VORF9GRUVEQkFDS19JTkZPIiwiSk9JTl9PU0NfSEVBRElORyIsIkpPSU5fT1NDX0lORk8iLCJKT0lOX09TQ19MSU5LX1RFWFQiLCJJbmRleFBhZ2UiLCJsb2NhdGlvbiIsImludGwiLCJ1c2VJbnRsIiwiZm9ybWF0TWVzc2FnZSIsIkFCT1VUX0NPUFkiLCJhYm91dFVTTWFwSW1nIiwiYWJvdXRKNDBJbWciLCJhY2NvdW50QmFsYW5jZUljb24iLCJncm91cHNJY29uIiwiY29tbWVudEljb24iLCJDT05UQUNUX0NPUFkiLCJnaXRodWJJY29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0FIVixDQUlFLFFBQVEsQ0FBRUgsSUFBSSxDQUFDRSxhQUFMLENBQW1CQywrQkFBbkIsQ0FKWixDQUtFLEdBQUcsQ0FBRUEsV0FMUCxDQU1FLGFBQWEsQ0FBRSxJQU5qQixDQU9FLFFBQVEsQ0FBRSxLQVBaLGVBUUUsNkJBQ0dILElBQUksQ0FBQ0UsYUFBTCxDQUFtQkMsMEJBQW5CLENBREgsQ0FSRixDQWRGLENBRkYsQ0EvRUYsQ0FERixDQStHRCxDQWxIRCxDQW9IQSwwQ0FBZUwsU0FBZiIsImZpbGUiOiI5Njk3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7TGlua30gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuaW50ZXJmYWNlIElMaW5rVHlwZVdyYXBwZXIge1xuICAgIGxpbmtUZXh0Pzogc3RyaW5nO1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgb3BlblVybE5ld1RhYj86IGJvb2xlYW47XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICB9XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YWxpZC1qc2RvY1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0d28gdHlwZXMgb2YgbGlua3Mgd2UgaGF2ZS4gSW50ZXJuYWwgbGlua3MgYW5kXG4gKiBleHRlcm5hbCBsaW5rcy4gSW50ZXJuYWwgbGlua3Mgc2hvdWxkIHVzZSB0aGUgPExpbms+IGNvbXBvbmVudCwgd2hpbGVcbiAqIGV0ZXJuYWwgbGlua3MgY2FuIHVzZSB0aGUgc3RhbmRhcmQgPGE+IHRhZy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlXG4gKiBpbnN0YW5jZSB0byBjaG9vc2UgdGhlIHR5cGUgb2YgbGluayBhbG9uZyB3aXRoIHRoZSBwcm9wcyBuZWNlc3NhcnkgdG9cbiAqIHNldCBuZXcgdGFicywgY2xhc3Nlcy5cbiAqXG4gKiBOb3RlIC0gaWYgdGhlIGxpbmsgaXMgYW4gZXh0ZXJuYWwgbGluayBhbmQgd2lsbCBub3Qgb3BlbiBpbiBhIG5ld1xuICogYnJvd3NlciB0YWIsIGVuc3VyZSB0aGF0IGhpdHRpbmcgdGhlIGJhY2sgYnV0dG9uIHdvcmtzLiBUaGlzIGhhcyBzaG93biB0b1xuICogaGF2ZSBlcnJvcnMgb24gZWRnZSBjYXNlcyAoaWUsIGxhdW5jaGluZyB0aGUgZ21haWwgY2xpZW50IHdpdGggbWFpbHRvIGxpbmtzKVxuICogYW5kIGl0IGlzIHRoZSByZWNvbW1lbmRhdGlvbiB0byBub3QgaGF2ZSBleHRlcm5hbCBsaW5rcyBvcGVuIGluIHRoZSBzYW1lIHRhYi5cbiAqXG4gKiBAcGFyYW0gcHJvcHNcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IExpbmtUeXBlV3JhcHBlciA9IChwcm9wczpJTGlua1R5cGVXcmFwcGVyKSA9PiB7XG4gIGlmIChwcm9wcy5pbnRlcm5hbCkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGluayB0bz17YCR7cHJvcHMudXJsfWB9PlxuICAgICAgICB7cHJvcHMubGlua1RleHR9XG4gICAgICA8L0xpbms+XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJvcHMub3BlblVybE5ld1RhYiA/XG4gICAgPGFcbiAgICAgIGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfVxuICAgICAgaHJlZj17cHJvcHMudXJsfVxuICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgIHJlbD1cIm5vcmVmZXJyZXJcIj57cHJvcHMubGlua1RleHR9XG4gICAgPC9hPiA6XG4gICAgPGFcbiAgICAgIGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfVxuICAgICAgaHJlZj17cHJvcHMudXJsfT57cHJvcHMubGlua1RleHR9XG4gICAgPC9hPjtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTGlua1R5cGVXcmFwcGVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7R3JpZH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuXG5pbXBvcnQgTGlua1R5cGVXcmFwcGVyIGZyb20gJy4uL0xpbmtUeXBlV3JhcHBlcic7XG5pbXBvcnQge2h5cGhlbml6ZVN0cmluZ30gZnJvbSAnLi4vLi4vLi4vY3lwcmVzcy9pbnRlZ3JhdGlvbi9jb21tb24vaGVscGVycyc7XG5cbi8vIHRoZSBcImJvZHlcIiBzZWN0aW9uIGlzIHRoZSBjaGlsZCBvYmplY3QgdG8gYWxsb3cgZm9yIGh0bWwgdmVyc3VzIGp1c3QgdGV4dFxuaW50ZXJmYWNlIEFib3V0Q2FyZFByb3BzIHtcbiAgaW1nU3JjOiBzdHJpbmc7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBzaXplOiAnc21hbGwnIHwgJ2xhcmdlJztcbiAgbGlua1RleHQ/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgb3BlblVybE5ld1RhYj86IGJvb2xlYW47XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgaW50ZXJuYWw/OmJvb2xlYW47XG4gIC8vIGJvZHk6c3RyaW5nIHwgUmVhY3QuUmVhY3ROb2RlO1xufVxuXG5jb25zdCBBYm91dENhcmQgPSAocHJvcHM6IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPEFib3V0Q2FyZFByb3BzPikgPT4ge1xuICBpZiAocHJvcHMuc2l6ZSA9PT0gJ2xhcmdlJykge1xuICAgIC8vIGxhcmdlIGFyZSB0aGUgY2FyZHMgb24gdG9wXG4gICAgLy8gbm90ZSBpdCB1c2VzIGEgdG9wIGNsYXNzTmFtZT0najQwLWFib3V0Y2FyZC1sZy1jYXJkJ1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IHRydWV9fSBnYXA9eydsZyd9IGNsYXNzTmFtZT17KHByb3BzLmNsYXNzTmFtZSB8fCAnJyl9PlxuICAgICAgICA8R3JpZCByb3cgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1sZy1jYXJkJ30+XG4gICAgICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiAzfX0gY2xhc3NOYW1lPXsnajQwLWFib3V0cGFnZS1pbWFnZS1jb250YWluZXInfT5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXsnajQwLWFib3V0Y2FyZC1pbWFnZSd9XG4gICAgICAgICAgICAgIGFsdD17cHJvcHMuaGVhZGVyfVxuICAgICAgICAgICAgICBzcmM9e3Byb3BzLmltZ1NyY30vPlxuICAgICAgICAgIDwvR3JpZD5cblxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogOX19IGRhdGEtY3k9e2Ake2h5cGhlbml6ZVN0cmluZyhwcm9wcy5oZWFkZXIpfS1ibG9ja2B9PlxuICAgICAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgICAgICA8aDI+e3Byb3BzLmhlYWRlcn08L2gyPlxuICAgICAgICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHNtYWxsIGFyZSB0aGUgY2FyZHMgb24gdGhlIGJvdHRvbVxuICAgIC8vIG5vdGUgaXQgdXNlcyBhIHRvcCBjbGFzc05hbWU9J2o0MC1hYm91dGNhcmQtc20tY2FyZCdcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgdGFibGV0PXt7Y29sOiB0cnVlfX0gZ2FwPXsnbGcnfSBjbGFzc05hbWU9eyhwcm9wcy5jbGFzc05hbWUgfHwgJycpfT5cbiAgICAgICAgPEdyaWQgcm93IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtc20tY2FyZCd9PlxuICAgICAgICAgIDxHcmlkIHRhYmxldD17e2NvbDogMn19IGNsYXNzTmFtZT17J2o0MC1hYm91dHBhZ2UtaW1hZ2UtY29udGFpbmVyJ30+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtaW1hZ2UnfVxuICAgICAgICAgICAgICBhbHQ9e3Byb3BzLmhlYWRlcn1cbiAgICAgICAgICAgICAgc3JjPXtwcm9wcy5pbWdTcmN9Lz5cbiAgICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgICA8R3JpZCB0YWJsZXQ9e3tjb2w6IDl9fSBkYXRhLWN5PXtgJHtoeXBoZW5pemVTdHJpbmcocHJvcHMuaGVhZGVyKX0tYmxvY2tgfT5cbiAgICAgICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICAgICAgPGgzPntwcm9wcy5oZWFkZXJ9PC9oMz5cbiAgICAgICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtc20tbGluayd9PlxuICAgICAgICAgICAgICAgIDxMaW5rVHlwZVdyYXBwZXJcbiAgICAgICAgICAgICAgICAgIGxpbmtUZXh0PXtwcm9wcy5saW5rVGV4dH1cbiAgICAgICAgICAgICAgICAgIGludGVybmFsPXtwcm9wcy5pbnRlcm5hbH1cbiAgICAgICAgICAgICAgICAgIHVybD17cHJvcHMudXJsfVxuICAgICAgICAgICAgICAgICAgb3BlblVybE5ld1RhYj17cHJvcHMub3BlblVybE5ld1RhYn1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtbGluayd9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDxHcmlkIGNvbD17MX0+eycgJ308L0dyaWQ+XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBYm91dENhcmQ7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5cbnR5cGUgQWJvdXRDYXJkc0NvbnRhaW5lclByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuLy8gbm90ZTogdGhpcyBhc3N1bWVzIGEgSjQwTWFpbkdyaWRDb250YWluZXIgY29udGFpbmVyIVxuY29uc3QgQWJvdXRDYXJkc0NvbnRhaW5lciA9IChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48QWJvdXRDYXJkc0NvbnRhaW5lclByb3BzPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHJvdyBnYXA9eydsZyd9IGNsYXNzTmFtZT17J2o0MC1hYm91dGNhcmQtY29udGFpbmVyICcgKyAocHJvcHMuY2xhc3NOYW1lIHx8ICcnKX0+XG4gICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWJvdXRDYXJkc0NvbnRhaW5lcjtcbiIsImltcG9ydCB7ZGVmaW5lTWVzc2FnZXN9IGZyb20gJ3JlYWN0LWludGwnO1xuXG5leHBvcnQgY29uc3QgUEFHRSA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgVElMRToge1xuICAgIGlkOiAnYWJvdXQucGFnZS50aXRsZS50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Fib3V0JyxcbiAgICBkZXNjcmlwdGlvbjogJ2Fib3V0IHBhZ2UgdGl0bGUgdGV4dCcsXG4gIH0sXG4gIEhFQURJTkc6IHtcbiAgICBpZDogJ2luZGV4LmhlYWRpbmcuYWJvdXQudXMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQWJvdXQgdXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnbWFpbiBoZWFkaW5nIGZvciBhYm91dCBwYWdlJyxcbiAgfSxcbiAgSEVBRElOR18xOiB7XG4gICAgaWQ6ICdpbmRleC5oZWFkaW5nLnNjcmVlbnRvb2wnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIHNjcmVlbmluZyB0b29sJyxcbiAgICBkZXNjcmlwdGlvbjogJ2hlYWRpbmcgZm9yIGFib3V0IHNjcmVlbmluZyB0b29sJyxcbiAgfSxcbiAgSEVBRElORzFfREVTQ1JJUFRJT04xOiB7XG4gICAgaWQ6ICdhYm91dC5wYWdlLnN1Yi5oZWFkZXIuMS50ZXh0LjEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnT24gSmFudWFyeSAyNywgMjAyMSwgUHJlc2lkZW50IEJpZGVuIGRpcmVjdGVkIHRoZSBDb3VuY2lsIG9uJytcbiAgICAnIEVudmlyb25tZW50YWwgUXVhbGl0eSAoQ0VRKSB0byBjcmVhdGUgYSBjbGltYXRlIGFuZCBlY29ub21pYycrXG4gICAgJyBqdXN0aWNlIHNjcmVlbmluZyB0b29sLiBUaGUgcHVycG9zZSBvZiB0aGUgdG9vbCBpcyB0byBoZWxwJytcbiAgICAnIEZlZGVyYWwgYWdlbmNpZXMgaWRlbnRpZnkgZGlzYWR2YW50YWdlZCBjb21tdW5pdGllcyBhbmQgcHJvdmlkZScrXG4gICAgJyBzb2Npb2Vjb25vbWljLCBlbnZpcm9ubWVudGFsLCBhbmQgY2xpbWF0ZSBpbmZvcm1hdGlvbiBhbmQgZGF0YScrXG4gICAgJyB0byBpbmZvcm0gZGVjaXNpb25zIHRoYXQgbWF5IGFmZmVjdCB0aGVzZSBjb21tdW5pdGllcy4gVGhlIHRvb2wnK1xuICAgICcgaWRlbnRpZmllcyBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzIGFzIGNvbW11bml0aWVzIG9mIGZvY3VzJytcbiAgICAnIHRocm91Z2ggcHVibGljbHkgYXZhaWxhYmxlLCBuYXRpb25hbGx5IGNvbnNpc3RlbnQsIGhpZ2gtcXVhbGl0eScrXG4gICAgJyBkYXRhLicsXG4gICAgZGVzY3JpcHRpb246ICdhYm91dCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIEhFQURJTkcxX0RFU0NSSVBUSU9OMjoge1xuICAgIGlkOiAnYWJvdXQucGFnZS5zdWIuaGVhZGVyLjEudGV4dC4yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRvb2wgaXMgaW4gYSBwdWJsaWMgYmV0YSBmb3JtIGFuZCcrXG4gICAgJyB3aWxsIGJlIHVwZGF0ZWQgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSB0aGUgcHVibGljLicsXG4gICAgZGVzY3JpcHRpb246ICdhYm91dCBwYWdlIHN1YiBoZWFkZXIgdGV4dCcsXG4gIH0sXG4gIEhFQURJTkdfMjoge1xuICAgIGlkOiAnaW5kZXguaGVhZGluZy5qdXN0aWNlNDAnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIEp1c3RpY2U0MCBJbml0aWF0aXZlJyxcbiAgICBkZXNjcmlwdGlvbjogJ2hlYWRpbmcgZm9yIGFib3V0IGp1c3RpY2UgNDAnLFxuICB9LFxuICBIRUFESU5HMl9ERVNDUklQVElPTjE6IHtcbiAgICBpZDogJ2Fib3V0LnBhZ2Uuc3ViLmhlYWRlci4yLnRleHQuMScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgdG9vbCB3aWxsIHByb3ZpZGUgaW1wb3J0YW50IGluZm9ybWF0aW9uIGZvciB0aGUgSnVzdGljZTQwJytcbiAgICAnIEluaXRpYXRpdmUuIFRoZSBnb2FsIG9mIHRoZSBKdXN0aWNlNDAgSW5pdGlhdGl2ZSBpcyB0byBwcm92aWRlJytcbiAgICAnIDQwLXBlcmNlbnQgb2YgdGhlIG92ZXJhbGwgYmVuZWZpdHMgb2YgY2VydGFpbiBmZWRlcmFsJytcbiAgICAnIHByb2dyYW1zIGluIHNldmVuIGtleSBhcmVhcyB0byBkaXNhZHZhbnRhZ2VkIGNvbW11bml0aWVzLicrXG4gICAgJyBUaGVzZSBzZXZlbiBrZXkgYXJlYXMgYXJlOiBjbGltYXRlIGNoYW5nZSwgY2xlYW4gZW5lcmd5IGFuZCcrXG4gICAgJyBlbmVyZ3kgZWZmaWNpZW5jeSwgY2xlYW4gdHJhbnNpdCwgYWZmb3JkYWJsZSBhbmQgc3VzdGFpbmFibGUnK1xuICAgICcgaG91c2luZywgdHJhaW5pbmcgYW5kIHdvcmtmb3JjZSBkZXZlbG9wbWVudCwgdGhlIHJlbWVkaWF0aW9uJytcbiAgICAnIGFuZCByZWR1Y3Rpb24gb2YgbGVnYWN5IHBvbGx1dGlvbiwgYW5kIHRoZSBkZXZlbG9wbWVudCBvZicrXG4gICAgJyBjcml0aWNhbCBjbGVhbiB3YXRlciBpbmZyYXN0cnVjdHVyZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnYWJvdXQgcGFnZSBzdWIgaGVhZGVyIHRleHQnLFxuICB9LFxuICBIRUFESU5HMl9ERVNDUklQVElPTjI6IHtcbiAgICBpZDogJ2Fib3V0LnBhZ2Uuc3ViLmhlYWRlci4yLnRleHQuMicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdSZWFkIG1vcmUgYWJvdXQgdGhlIEp1c3RpY2U0MCBJbml0aWF0aXZlIGluIFByZXNpZGVudCBCaWRlbuKAmXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnYWJvdXQgcGFnZSBzdWIgaGVhZGVyIHRleHQnLFxuICB9LFxuICBQUkVTSURFTlRfTElOS19MQUJFTDoge1xuICAgIGlkOiAnaW5kZXgucHJlc2lkZW50YWxMaW5rTGFiZWwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXhlY3V0aXZlIE9yZGVyIDE0MDA4IG9uIFRhY2tsaW5nIHRoZSBDbGltYXRlIENyaXNpcyBhdCBIb21lIGFuZCBBYnJvYWQuJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xpbmsgdXJsIHRvIHByZXNpZGVudGlhbCBhY3Rpb25zIGV4ZWN1dGl2ZSBvcmRlci4gUGFydCBvZiBwYXJhZ3JhcGggMicsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IEVYRUNfT1JERVJfTElOSyA9ICdodHRwczovL3d3dy53aGl0ZWhvdXNlLmdvdi9icmllZmluZy1yb29tL3ByZXNpZGVudGlhbC1hY3Rpb25zLzIwMjEvMDEvMjcvJyArXG4gICAgJ2V4ZWN1dGl2ZS1vcmRlci1vbi10YWNrbGluZy10aGUtY2xpbWF0ZS1jcmlzaXMtYXQtaG9tZS1hbmQtYWJyb2FkLyc7XG5cbmV4cG9ydCBjb25zdCBHSVRIVUJfTElOSyA9ICdodHRwczovL2dpdGh1Yi5jb20vdXNkcy9qdXN0aWNlNDAtdG9vbCc7XG5cbmV4cG9ydCBjb25zdCBIT1dfVE9fR0VUX1NUQVJURUQgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFRJVExFOiB7XG4gICAgaWQ6ICdob3dUb0dldFN0YXJ0ZWQudGl0bGUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSG93IHRvIGdldCBzdGFydGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ3N1YiBoZWFkaW5nIG9mIHBhZ2UnLFxuICB9LFxuICBGRURFUkFMX1BNX0hFQURJTkc6IHtcbiAgICBpZDogJ2ZlZGVyYWwucG0uaGVhZGluZycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdGZWRlcmFsIHByb2dyYW0gbWFuYWdlcnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnc3ViIGhlYWRpbmcgb2YgcGFnZScsXG4gIH0sXG4gIEZFREVSQUxfUE1fSU5GTzoge1xuICAgIGlkOiAnZmVkZXJhbC5wbS5pbmZvJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Rvd25sb2FkIHRoZSBzY3JlZW5pbmcgdG9vbOKAmXMgZHJhZnQgbGlzdCBvZiBjb21tdW5pdGllcyBvZiBmb2N1cy4nK1xuICAgICcgRXhwbG9yZSBkYXRhIHRoYXQgbWF5IGJlIHVzZWZ1bCB0byB5b3VyIHByb2dyYW0sIGFuZCBwcm92aWRlJytcbiAgICAnIGZlZWRiYWNrIG9uIHRoZSB0b29sLicsXG4gICAgZGVzY3JpcHRpb246ICdzdWIgaGVhZGluZyBvZiBwYWdlJyxcbiAgfSxcbiAgRkVERVJBTF9QTV9MSU5LX1RFWFQ6IHtcbiAgICBpZDogJ2ZlZGVyYWwucG0ubGluaycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdHbyB0byBkYXRhICYgbWV0aG9kb2xvZ3knLFxuICAgIGRlc2NyaXB0aW9uOiAnbGluayB0ZXh0IHRvIGdvIHRvIG1ldGhvZG9sb2d5IHBhZ2UnLFxuICB9LFxuICBDT01NVU5JVFlfTUVNQkVSU19IRUFESU5HOiB7XG4gICAgaWQ6ICdjb21tdW5pdHkubWVtYmVycy5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NvbW11bml0eSBtZW1iZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ3N1YiBoZWFkaW5nIG9mIHBhZ2UnLFxuICB9LFxuICBDT01NVU5JVFlfTUVNQkVSU19JTkZPOiB7XG4gICAgaWQ6ICdjb21tdW5pdHkubWVtYmVycy5pbmZvJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGxvcmUgZGF0YSBhYm91dCBjb21tdW5pdGllcyBvZiBmb2N1cyBpbiB5b3VyIGFyZWEsIGFuZCBoZWxwICcrXG4gICAgJyBwcm92aWRlIGZlZWRiYWNrIG9uIHRoZSB0b29sLicsXG4gICAgZGVzY3JpcHRpb246ICdzdWIgaGVhZGluZyBvZiBwYWdlJyxcbiAgfSxcbiAgQ09NTVVOSVRZX01FTUJFUlNfTElOS19URVhUOiB7XG4gICAgaWQ6ICdjb21tdW5pdHkubWVtYmVycy5saW5rJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGxvcmUgdGhlIHRvb2wnLFxuICAgIGRlc2NyaXB0aW9uOiAnbGluayB0byBleHBsb3JlIHRoZSB0b29sIHBhZ2UnLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBHRVRfSU5WT0xWRUQgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFRJVExFOiB7XG4gICAgaWQ6ICdnZXRJbnZvbHZlZC50aXRsZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdHZXQgaW52b2x2ZWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnc3ViIGhlYWRpbmcgb2YgcGFnZScsXG4gIH0sXG4gIFNFTkRfRkVFREJBQ0tfSEVBRElORzoge1xuICAgIGlkOiAnc2VuZC5mZWVkYmFjay5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1NlbmQgZmVlZGJhY2snLFxuICAgIGRlc2NyaXB0aW9uOiAnc2VuZGluZyBmZWVkYmFjayBoZWFkaW5nJyxcbiAgfSxcbiAgU0VORF9GRUVEQkFDS19JTkZPOiB7XG4gICAgaWQ6ICdzZW5kLmZlZWRiYWNrLmluZm8nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSGF2ZSBpZGVhcyBhYm91dCBob3cgdGhpcyB0b29sIGNhbiBiZSBpbXByb3ZlZCB0byBiZXR0ZXIgcmVmbGVjdCcrXG4gICAgJyB0aGUgb24tdGhlLWdyb3VuZCBleHBlcmllbmNlcyBvZiB5b3VyIGNvbW11bml0eT8nLFxuICAgIGRlc2NyaXB0aW9uOiAnc2VuZGluZyBmZWVkYmFjayBpbmZvcm1hdGlvbicsXG4gIH0sXG4gIEpPSU5fT1NDX0hFQURJTkc6IHtcbiAgICBpZDogJ2pvaW4ub3BlbnNvdXJjZS5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0pvaW4gdGhlIG9wZW4gc291cmNlIGNvbW11bml0eScsXG4gICAgZGVzY3JpcHRpb246ICdqb2luIHRoZSBjb21tdW5pdHkgaGVhZGluZycsXG4gIH0sXG4gIEpPSU5fT1NDX0lORk86IHtcbiAgICBpZDogJ2pvaW4ub3Blbi5zb3VyY2UuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgc2NyZWVuaW5nIHRvb2zigJlzIGNvZGUgaXMgb3BlbiBzb3VyY2UsIHdoaWNoIG1lYW5zIGl0IGlzICcrXG4gICAgJyBhdmFpbGFibGUgZm9yIHRoZSBwdWJsaWMgdG8gdmlldyBhbmQgY29udHJpYnV0ZSB0by4gQW55b25lIGNhbiB2aWV3IGFuZCBjb250cmlidXRlIG9uIEdpdEh1Yi4nLFxuICAgIGRlc2NyaXB0aW9uOiAnaW5mbyBvbiBqb2luaW5nIG9wZW4gc291cmNlIGNvbW11bml0eScsXG4gIH0sXG4gIEpPSU5fT1NDX0xJTktfVEVYVDoge1xuICAgIGlkOiAnam9pbi5vcGVuLnNvdXJjZS5saW5rJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NoZWNrIGl0IG91dCBvbiBHaXRIdWInLFxuICAgIGRlc2NyaXB0aW9uOiAnbGluayB0byBnaXRodWIgcmVwb3NpdG9yeScsXG4gIH0sXG59KTtcblxuXG4iLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL2Fib3V0LXVzbWFwLTEtNGFmNjQyMmE0ZTk2MjJlMGVhYzM5NWY3MjRjYzRlZTAuc3ZnXCI7IiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlESXpMakF1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJa3hoZVdWeVh6RWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdlRzFzYm5NNmVHeHBibXM5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zaUlIZzlJakJ3ZUNJZ2VUMGlNSEI0SWdvSklIWnBaWGRDYjNnOUlqQWdNQ0F5TVRVMExqY2dNakk1Tnk0MElpQnpkSGxzWlQwaVpXNWhZbXhsTFdKaFkydG5jbTkxYm1RNmJtVjNJREFnTUNBeU1UVTBMamNnTWpJNU55NDBPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6RkROVEEzUmp0OUNna3VjM1F4ZTJadmJuUXRabUZ0YVd4NU9pZEJjbWxoYkMxQ2IyeGtUVlFuTzMwS0NTNXpkREo3Wm05dWRDMXphWHBsT2pVNE1DNHlOSEI0TzMwS0NTNXpkRE43Wm1sc2JEcHViMjVsTzMwS0NTNXpkRFI3Wm1sc2JEb2pSa1pHUmtaR08zMEtDUzV6ZERWN1ptbHNiRG9qUTBORFEwTkRPMzBLQ1M1emREWjdZMnhwY0Mxd1lYUm9PblZ5YkNnalUxWkhTVVJmTWw4cE8zMEtDUzV6ZERkN1kyeHBjQzF3WVhSb09uVnliQ2dqVTFaSFNVUmZORjhwTzJacGJHdzZJMFpHUmtaR1JqdDlDZ2t1YzNRNGUyWnBiR3c2SXpFNU5ETTNSanQ5Q2drdWMzUTVlMlp2Ym5RdFptRnRhV3g1T2lkVGIzVnlZMlZUWVc1elVISnZMVk5sYldsQ2IyeGtKenQ5Q2drdWMzUXhNSHRtYjI1MExYTnBlbVU2TXprM0xqVTVPVFJ3ZUR0OUNqd3ZjM1I1YkdVK0NqeDBaWGgwSUhSeVlXNXpabTl5YlQwaWJXRjBjbWw0S0RFZ01DQXdJREVnTlRnMExqazBJREU0TVRjdU1UTXBJaUJqYkdGemN6MGljM1F3SUhOME1TQnpkRElpUGpRd0pUd3ZkR1Y0ZEQ0S1BISmxZM1FnZUQwaU16RTFMak1pSUdOc1lYTnpQU0p6ZERNaUlIZHBaSFJvUFNJeE5UWTVMamNpSUdobGFXZG9kRDBpTVRVMk9TNDNJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkRFFpSUdROUlrMHhNRGMzTGpRc09EYzJMamRqTVRBMkxqWXNNQ3d5TURBdU9Dd3lOUzQxTERJM055NHpMRFU0TGpsak56QXVOaXd6TVM0MExERXhOUzR4TERFd01pd3hNVFV1TVN3eE56Z3VObll4TURaSU5qZzBMamwyTFRFd05TNHpDZ2xqTUMwM055NHlMRFEwTGpVdE1UUTNMamdzTVRFMUxqRXRNVGM0TGpaRE9EYzJMallzT1RBeUxqSXNPVGN3TGpnc09EYzJMamNzTVRBM055NDBMRGczTmk0M2VpQk5OVFUwTGpFc09Ea3pZemN5TERBc01UTXdMamd0TlRndU9Td3hNekF1T0MweE16QXVPQW9KVXpZeU5pdzJNekV1TkN3MU5UUXVNU3cyTXpFdU5ITXRNVE13TGpnc05UZ3VPUzB4TXpBdU9Dd3hNekF1T0ZNME9ESXVNaXc0T1RNc05UVTBMakVzT0RremVpQk5Oakk0TERrMk5XTXRNalF1TWkwekxqa3RORGd1TkMwMkxqVXROek11T1MwMkxqVUtDV010TmpJdU5pd3dMVEV5TkM0MUxERXlMamt0TVRneExqZ3NNemN1T1dNdE5EZ3VOQ3d5TUM0M0xUYzVMamdzTmpndU15MDNPUzQ0TERFeU1YWXhNREl1TjJneU9UUXVNM1l0TVRBMUxqTkROVGcyTGpnc01UQTJNQzQxTERZd01TNDVMREV3TURrdU5TdzJNamdzT1RZMWVpQk5NVFl3TUM0MkxEZzVNd29KWXpjeExqa3NNQ3d4TXpBdU9DMDFPQzQ1TERFek1DNDRMVEV6TUM0NGN5MDFPQzQ1TFRFek1DNDRMVEV6TUM0NExURXpNQzQ0Y3kweE16QXVPQ3cxT0M0NUxURXpNQzQ0TERFek1DNDRVekUxTWpndU55dzRPVE1zTVRZd01DNDJMRGc1TTB3eE5qQXdMallzT0RremVpQk5NVGcyTWk0eUxERXhNVGN1TkFvSll6QXROVEl1Tnkwek1TNDBMVEV3TUM0ekxUYzVMamd0TVRJeFl5MDFOeTR6TFRJMUxURXhPUzR5TFRNM0xqa3RNVGd4TGpndE16Y3VPV010TWpVdU5Td3dMVFE1TGpjc01pNDJMVGN6TGprc05pNDFZekkyTGpJc05EUXVOU3cwTVM0eUxEazFMalVzTkRFdU1pd3hORGt1T0hZeE1EVXVNMmd5T1RRdU13b0pUREU0TmpJdU1pd3hNVEUzTGpSNklFMHhNRGMzTGpRc05ETTFMakpqTVRBNExqUXNNQ3d4T1RZdU1pdzROeTQ1TERFNU5pNHlMREU1Tmk0eWN5MDROeTQ1TERFNU5pNHlMVEU1Tmk0eUxERTVOaTR5WXkweE1EZ3VOQ3d3TFRFNU5pNHlMVGczTGprdE1UazJMakl0TVRrMkxqSnNNQ3d3Q2dsakxUQXVNUzB4TURndU1pdzROeTQxTFRFNU5pNHhMREU1TlM0NExURTVOaTR5UXpFd056Y3VNU3cwTXpVdU1pd3hNRGMzTGpJc05ETTFMaklzTVRBM055NDBMRFF6TlM0eWVpSXZQZ284WTJseVkyeGxJR05zWVhOelBTSnpkRFVpSUdONFBTSXhNRGMzTGpNaUlHTjVQU0l4TWpJekxqWWlJSEk5SWpFd056TXVNaUl2UGdvOFp6NEtDVHhrWldaelBnb0pDVHh3WVhSb0lHbGtQU0pUVmtkSlJGOHhYeUlnWkQwaVRURXdPVFV1T0N3Mk1ESXVPR014TURJdU9Dd3dMREU0TlM0NExEZ3pMREU0TlM0NExERTROUzQ0Y3kwNE15d3hPRFV1T0MweE9EVXVPQ3d4T0RVdU9GTTVNVEFzT0RreExqUXNPVEV3TERjNE9DNDJDZ2tKQ1ZNNU9UTXNOakF5TGpnc01UQTVOUzQ0TERZd01pNDRlaUJOTVRnek9DNDVMREV5TkRndU4yTXdMVFV3TGpJdE1qa3VOeTA1TkM0NExUYzFMall0TVRFMExqWmpMVFV5TGpZdE1qSXVPUzB4TVRBdU9TMHpOUzQ1TFRFM01pNHlMVE0xTGpsakxUSTBMaklzTUMwME55NHhMREl1TlMwM01DdzJMaklLQ1FrSll6STBMamdzTkRJdU1Td3pPU3c1TUM0MExETTVMREUwTVM0NGRqazVMamRvTWpjNExqZFdNVEkwT0M0M2VpQk5NVFU1TVM0eUxERXdNell1TTJNMk9DNHhMREFzTVRJekxqa3ROVFV1Tnl3eE1qTXVPUzB4TWpNdU9YTXROVFV1TnkweE1qTXVPUzB4TWpNdU9TMHhNak11T1FvSkNRbHpMVEV5TXk0NUxEVTFMamN0TVRJekxqa3NNVEl6TGpsVE1UVXlNeTR4TERFd016WXVNeXd4TlRreExqSXNNVEF6Tmk0emVpQk5OamN3TGpNc01URXdOQzQwWXkweU1pNDVMVE11TnkwME5TNDRMVFl1TWkwM01DMDJMakpqTFRZeExqTXNNQzB4TVRrdU5Td3hNeTB4TnpJdU1pd3pOUzQ1Q2drSkNXTXRORFV1T0N3eE9TNDRMVGMxTGpZc05qUXVOQzAzTlM0MkxERXhOQzQyZGprM0xqSm9NamM0TGpkMkxUazVMamRETmpNeExqTXNNVEU1TkM0NExEWTBOUzQxTERFeE5EWXVOU3cyTnpBdU15d3hNVEEwTGpSNklFMDJNREF1TXl3eE1ETTJMak1LQ1FrSll6WTRMakVzTUN3eE1qTXVPUzAxTlM0M0xERXlNeTQ1TFRFeU15NDVjeTAxTlM0M0xURXlNeTQ1TFRFeU15NDVMVEV5TXk0NWN5MHhNak11T1N3MU5TNDNMVEV5TXk0NUxERXlNeTQ1VXpVek1pNHlMREV3TXpZdU15dzJNREF1TXl3eE1ETTJMak42SUUweE1EazFMamdzTVRBeU1DNDRDZ2tKQ1dNeE1EQXVPU3d3TERFNU1DNHhMREkwTGpJc01qWXlMallzTlRVdU4yTTJOaTQ1TERJNUxqY3NNVEE1TERrMkxqWXNNVEE1TERFMk9TNHhkakV3TUM0elNEY3lOQzR5ZGkwNU9TNDNZekF0TnpNdU1TdzBNaTR4TFRFME1Dd3hNRGt0TVRZNUxqRUtDUWtKUXprd05TNDJMREV3TkRRdU9TdzVPVFF1T0N3eE1ESXdMamdzTVRBNU5TNDRMREV3TWpBdU9Ib2lMejRLQ1R3dlpHVm1jejRLQ1R4MWMyVWdlR3hwYm1zNmFISmxaajBpSTFOV1IwbEVYekZmSWlBZ2MzUjViR1U5SW05MlpYSm1iRzkzT25acGMybGliR1U3Wm1sc2JDMXlkV3hsT21WMlpXNXZaR1E3WTJ4cGNDMXlkV3hsT21WMlpXNXZaR1E3Wm1sc2JEb2pSa1pHUmtaR095SXZQZ29KUEdOc2FYQlFZWFJvSUdsa1BTSlRWa2RKUkY4eVh5SStDZ2tKUEhWelpTQjRiR2x1YXpwb2NtVm1QU0lqVTFaSFNVUmZNVjhpSUNCemRIbHNaVDBpYjNabGNtWnNiM2M2ZG1semFXSnNaVHNpTHo0S0NUd3ZZMnhwY0ZCaGRHZytDZ2s4WnlCamJHRnpjejBpYzNRMklqNEtDUWs4WkdWbWN6NEtDUWtKUEhKbFkzUWdhV1E5SWxOV1IwbEVYek5mSWlCNFBTSXpOVEl1TmlJZ2VUMGlNak14TGpJaUlIZHBaSFJvUFNJeE5EZzJMak1pSUdobGFXZG9kRDBpTVRRNE5pNHpJaTgrQ2drSlBDOWtaV1p6UGdvSkNUeDFjMlVnZUd4cGJtczZhSEpsWmowaUkxTldSMGxFWHpOZklpQWdjM1I1YkdVOUltOTJaWEptYkc5M09uWnBjMmxpYkdVN1ptbHNiRG9qUmtaR1JrWkdPeUl2UGdvSkNUeGpiR2x3VUdGMGFDQnBaRDBpVTFaSFNVUmZORjhpUGdvSkNRazhkWE5sSUhoc2FXNXJPbWh5WldZOUlpTlRWa2RKUkY4elh5SWdJSE4wZVd4bFBTSnZkbVZ5Wm14dmR6cDJhWE5wWW14bE95SXZQZ29KQ1R3dlkyeHBjRkJoZEdnK0Nna0pQSEpsWTNRZ2VEMGlORE1pSUhrOUlqSTVNeTR4SWlCamJHRnpjejBpYzNRM0lpQjNhV1IwYUQwaU1qRXdOUzQySWlCb1pXbG5hSFE5SWpFek5qSXVOQ0l2UGdvSlBDOW5QZ284TDJjK0NqeDBaWGgwSUhSeVlXNXpabTl5YlQwaWJXRjBjbWw0S0RFZ01DQXdJREVnTnpJMExqQXpOellnTVRjeU55NDJNRFkwS1NJZ1kyeGhjM005SW5OME9DQnpkRGtnYzNReE1DSStOREFsUEM5MFpYaDBQZ284TDNOMlp6NEtcIiIsImV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURJMElESTBJaUJvWldsbmFIUTlJakkwSWlCMmFXVjNRbTk0UFNJd0lEQWdNalFnTWpRaUlIZHBaSFJvUFNJeU5DSStQR2MrUEhKbFkzUWdabWxzYkQwaWJtOXVaU0lnYUdWcFoyaDBQU0l5TkNJZ2QybGtkR2c5SWpJMElpOCtQQzluUGp4blBqeG5Qanh5WldOMElHaGxhV2RvZEQwaU55SWdkMmxrZEdnOUlqTWlJSGc5SWpRaUlIazlJakV3SWk4K1BISmxZM1FnYUdWcFoyaDBQU0kzSWlCM2FXUjBhRDBpTXlJZ2VEMGlNVEF1TlNJZ2VUMGlNVEFpTHo0OGNtVmpkQ0JvWldsbmFIUTlJak1pSUhkcFpIUm9QU0l5TUNJZ2VEMGlNaUlnZVQwaU1Ua2lMejQ4Y21WamRDQm9aV2xuYUhROUlqY2lJSGRwWkhSb1BTSXpJaUI0UFNJeE55SWdlVDBpTVRBaUx6NDhjRzlzZVdkdmJpQndiMmx1ZEhNOUlqRXlMREVnTWl3MklESXNPQ0F5TWl3NElESXlMRFlpTHo0OEwyYytQQzluUGp3dmMzWm5QZz09XCIiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlHVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a1BTSnVaWGNnTUNBd0lESTBJREkwSWlCb1pXbG5hSFE5SWpJMElpQjJhV1YzUW05NFBTSXdJREFnTWpRZ01qUWlJSGRwWkhSb1BTSXlOQ0krUEhKbFkzUWdabWxzYkQwaWJtOXVaU0lnYUdWcFoyaDBQU0l5TkNJZ2QybGtkR2c5SWpJMElpOCtQR2MrUEhCaGRHZ2daRDBpVFRFeUxERXlMamMxWXpFdU5qTXNNQ3d6TGpBM0xEQXVNemtzTkM0eU5Dd3dMamxqTVM0d09Dd3dMalE0TERFdU56WXNNUzQxTml3eExqYzJMREl1TnpOTU1UZ3NNVGhJTm13d0xURXVOakZqTUMweExqRTRMREF1TmpndE1pNHlOaXd4TGpjMkxUSXVOek1nUXpndU9UTXNNVE11TVRRc01UQXVNemNzTVRJdU56VXNNVElzTVRJdU56VjZJRTAwTERFell6RXVNU3d3TERJdE1DNDVMREl0TW1Nd0xURXVNUzB3TGprdE1pMHlMVEp6TFRJc01DNDVMVElzTWtNeUxERXlMakVzTWk0NUxERXpMRFFzTVRONklFMDFMakV6TERFMExqRWdRelF1TnpZc01UUXVNRFFzTkM0ek9Td3hOQ3cwTERFMFl5MHdMams1TERBdE1TNDVNeXd3TGpJeExUSXVOemdzTUM0MU9FTXdMalE0TERFMExqa3NNQ3d4TlM0Mk1pd3dMREUyTGpRelZqRTRiRFF1TlN3d2RpMHhMall4UXpRdU5Td3hOUzQxTml3MExqY3pMREUwTGpjNExEVXVNVE1zTVRRdU1Yb2dUVEl3TERFell6RXVNU3d3TERJdE1DNDVMREl0TW1Nd0xURXVNUzB3TGprdE1pMHlMVEp6TFRJc01DNDVMVElzTWtNeE9Dd3hNaTR4TERFNExqa3NNVE1zTWpBc01UTjZJRTB5TkN3eE5pNDBNMk13TFRBdU9ERXRNQzQwT0MweExqVXpMVEV1TWpJdE1TNDROU0JETWpFdU9UTXNNVFF1TWpFc01qQXVPVGtzTVRRc01qQXNNVFJqTFRBdU16a3NNQzB3TGpjMkxEQXVNRFF0TVM0eE15d3dMakZqTUM0MExEQXVOamdzTUM0Mk15d3hMalEyTERBdU5qTXNNaTR5T1ZZeE9HdzBMalVzTUZZeE5pNDBNM29nVFRFeUxEWmpNUzQyTml3d0xETXNNUzR6TkN3ekxETWdZekFzTVM0Mk5pMHhMak0wTERNdE15d3pjeTB6TFRFdU16UXRNeTB6UXprc055NHpOQ3d4TUM0ek5DdzJMREV5TERaNklpOCtQQzluUGp3dmMzWm5QZz09XCIiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlHaGxhV2RvZEQwaU1qUWlJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnZDJsa2RHZzlJakkwSWo0OGNHRjBhQ0JrUFNKTk1DQXdhREkwZGpJMFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K1BIQmhkR2dnWkQwaVRUSXhMams1SURSak1DMHhMakV0TGpnNUxUSXRNUzQ1T1MweVNEUmpMVEV1TVNBd0xUSWdMamt0TWlBeWRqRXlZekFnTVM0eExqa2dNaUF5SURKb01UUnNOQ0EwTFM0d01TMHhPSHBOTVRnZ01UUklObll0TW1neE1uWXllbTB3TFROSU5sWTVhREV5ZGpKNmJUQXRNMGcyVmpab01USjJNbm9pTHo0OEwzTjJaejQ9XCIiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSStQR1JsWm5NK1BITjBlV3hsUGk1amJITXRNWHRtYVd4c0xYSjFiR1U2WlhabGJtOWtaRHQ5UEM5emRIbHNaVDQ4TDJSbFpuTStQSEJoZEdnZ2FXUTlJa2RwZEdoMVlpSWdZMnhoYzNNOUltTnNjeTB4SWlCa1BTSk5NVElzTWtFeE1Dd3hNQ3d3TERBc01DdzRMamcwTERJeExqUTVZeTQxTGpBNUxqWTRMUzR5TWk0Mk9DMHVORGh6TUMwdU9EY3NNQzB4TGpkRE5pNDNNeXd4T1M0NU1TdzJMakUwTERFNExEWXVNVFFzTVRoQk1pNDJPU3d5TGpZNUxEQXNNQ3d3TERVc01UWXVOV010TGpreExTNDJNaTR3TnkwdU5qRXVNRGN0TGpZeFlUSXVNVE1zTWk0eE15d3dMREFzTVN3eExqVXpMREVzTWk0eE5Dd3lMakUwTERBc01Dd3dMREl1T1RFdU9ETXNNaTR4Tml3eUxqRTJMREFzTUN3eExDNDJNeTB4TGpNMFF6Z3NNVFl1TVRjc05TNDJNaXd4TlM0ek1TdzFMall5TERFeExqUTRZVE11T0Rrc015NDRPU3d3TERBc01Td3hMVEl1Tmprc015NDFOeXd6TGpVM0xEQXNNQ3d4TEM0eExUSXVOalJ6TGpnMExTNHlOeXd5TGpjMUxERmhPUzQyTXl3NUxqWXpMREFzTUN3eExEVXNNR014TGpreExURXVNamtzTWk0M05TMHhMREl1TnpVdE1XRXpMalUzTERNdU5UY3NNQ3d3TERFc0xqRXNNaTQyTkN3ekxqZzVMRE11T0Rrc01Dd3dMREVzTVN3eUxqWTVZekFzTXk0NE5DMHlMak0wTERRdU5qZ3ROQzQxTnl3MExqa3pZVEl1TXprc01pNHpPU3d3TERBc01Td3VOamdzTVM0NE5XTXdMREV1TXpRc01Dd3lMalF5TERBc01pNDNOWE11TVRndU5UZ3VOamt1TkRoQk1UQXNNVEFzTUN3d0xEQXNNVElzTWxvaUx6NDhMM04yWno0PVwiIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgQWJvdXRDYXJkIGZyb20gJy4uL2NvbXBvbmVudHMvQWJvdXRDYXJkL0Fib3V0Q2FyZCc7XG5pbXBvcnQgQWJvdXRDYXJkc0NvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0Fib3V0Q2FyZC9BYm91dENhcmRzQ29udGFpbmVyJztcbmltcG9ydCBBbGVydFdyYXBwZXIgZnJvbSAnLi4vY29tcG9uZW50cy9BbGVydFdyYXBwZXInO1xuaW1wb3J0IEo0ME1haW5HcmlkQ29udGFpbmVyIGZyb20gJy4uL2NvbXBvbmVudHMvSjQwTWFpbkdyaWRDb250YWluZXInO1xuaW1wb3J0IExheW91dCBmcm9tICcuLi9jb21wb25lbnRzL2xheW91dCc7XG5cbmltcG9ydCAqIGFzIEFCT1VUX0NPUFkgZnJvbSAnLi4vZGF0YS9jb3B5L2Fib3V0JztcbmltcG9ydCAqIGFzIENPTlRBQ1RfQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvY29udGFjdCc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBhYm91dFVTTWFwSW1nIGZyb20gJy4uL2ltYWdlcy9hYm91dC11c21hcC0xLnN2Zyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgYWJvdXRKNDBJbWcgZnJvbSAnLi4vaW1hZ2VzL2Fib3V0LWo0MC0xLnN2Zyc7XG5pbXBvcnQgYWNjb3VudEJhbGFuY2VJY29uIC8vIEB0cy1pZ25vcmVcbiAgZnJvbSAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvYWNjb3VudF9iYWxhbmNlLnN2Zyc7XG5cbmltcG9ydCBncm91cHNJY29uIGZyb20gLy8gQHRzLWlnbm9yZVxuICAnL25vZGVfbW9kdWxlcy91c3dkcy9kaXN0L2ltZy91c2EtaWNvbnMvZ3JvdXBzLnN2Zyc7XG5cbmltcG9ydCBjb21tZW50SWNvbiBmcm9tIC8vIEB0cy1pZ25vcmVcbiAgJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2NvbW1lbnQuc3ZnJztcblxuaW1wb3J0IGdpdGh1Ykljb24gZnJvbSAvLyBAdHMtaWdub3JlXG4gICcvbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9naXRodWIuc3ZnJztcblxuaW50ZXJmYWNlIEluZGV4UGFnZVByb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uO1xufVxuXG4vLyBtYXJrdXBcbmNvbnN0IEluZGV4UGFnZSA9ICh7bG9jYXRpb259OiBJbmRleFBhZ2VQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIHJldHVybiAoXG4gICAgPExheW91dCBsb2NhdGlvbj17bG9jYXRpb259IHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoQUJPVVRfQ09QWS5QQUdFLlRJTEUpfT5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPEFsZXJ0V3JhcHBlciBzaG93QmV0YUFsZXJ0PXt0cnVlfSBzaG93TGltaXRlZERhdGFBbGVydD17ZmFsc2V9Lz5cbiAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgPGgxIGRhdGEtY3k9eydhYm91dC1wYWdlLWhlYWRpbmcnfT57aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuUEFHRS5IRUFESU5HKX08L2gxPlxuICAgICAgICA8QWJvdXRDYXJkc0NvbnRhaW5lcj5cbiAgICAgICAgICA8QWJvdXRDYXJkXG4gICAgICAgICAgICBzaXplPXsnbGFyZ2UnfVxuICAgICAgICAgICAgaW1nU3JjPXthYm91dFVTTWFwSW1nfVxuICAgICAgICAgICAgaGVhZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2UoQUJPVVRfQ09QWS5QQUdFLkhFQURJTkdfMSl9PlxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLlBBR0UuSEVBRElORzFfREVTQ1JJUFRJT04xKX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuUEFHRS5IRUFESU5HMV9ERVNDUklQVElPTjIpfVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICA8L0Fib3V0Q2FyZD5cbiAgICAgICAgPC9BYm91dENhcmRzQ29udGFpbmVyPlxuXG4gICAgICAgIDxBYm91dENhcmRzQ29udGFpbmVyPlxuICAgICAgICAgIDxBYm91dENhcmRcbiAgICAgICAgICAgIHNpemU9eydsYXJnZSd9XG4gICAgICAgICAgICBpbWdTcmM9e2Fib3V0SjQwSW1nfVxuICAgICAgICAgICAgaGVhZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2UoQUJPVVRfQ09QWS5QQUdFLkhFQURJTkdfMil9PlxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLlBBR0UuSEVBRElORzJfREVTQ1JJUFRJT04xKX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuUEFHRS5IRUFESU5HMl9ERVNDUklQVElPTjIpfVxuICAgICAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICAgICAgPGEgaHJlZj17QUJPVVRfQ09QWS5FWEVDX09SREVSX0xJTkt9IHRhcmdldD17J19ibGFuayd9IHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQUJPVVRfQ09QWS5QQUdFLlBSRVNJREVOVF9MSU5LX0xBQkVMKX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuICAgICAgICA8L0Fib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXJcbiAgICAgICAgZnVsbFdpZHRoPXt0cnVlfVxuICAgICAgICBibHVlQmFja2dyb3VuZD17dHJ1ZX0+XG4gICAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICAgICAgICA8aDI+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuSE9XX1RPX0dFVF9TVEFSVEVELlRJVExFKX1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxBYm91dENhcmRzQ29udGFpbmVyPlxuICAgICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgICBzaXplPXsnc21hbGwnfVxuICAgICAgICAgICAgICBpbWdTcmM9e2FjY291bnRCYWxhbmNlSWNvbn1cbiAgICAgICAgICAgICAgaGVhZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2UoQUJPVVRfQ09QWS5IT1dfVE9fR0VUX1NUQVJURUQuRkVERVJBTF9QTV9IRUFESU5HKX1cbiAgICAgICAgICAgICAgbGlua1RleHQ9e2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkhPV19UT19HRVRfU1RBUlRFRC5GRURFUkFMX1BNX0xJTktfVEVYVCl9XG4gICAgICAgICAgICAgIHVybD17Jy9tZXRob2RvbG9neSd9XG4gICAgICAgICAgICAgIGludGVybmFsPXt0cnVlfT5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkhPV19UT19HRVRfU1RBUlRFRC5GRURFUkFMX1BNX0lORk8pfVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L0Fib3V0Q2FyZD5cblxuICAgICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgICBzaXplPXsnc21hbGwnfVxuICAgICAgICAgICAgICBpbWdTcmM9e2dyb3Vwc0ljb259XG4gICAgICAgICAgICAgIGhlYWRlcj17aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuSE9XX1RPX0dFVF9TVEFSVEVELkNPTU1VTklUWV9NRU1CRVJTX0hFQURJTkcpfVxuICAgICAgICAgICAgICBsaW5rVGV4dD17aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuSE9XX1RPX0dFVF9TVEFSVEVELkNPTU1VTklUWV9NRU1CRVJTX0xJTktfVEVYVCl9XG4gICAgICAgICAgICAgIHVybD17Jy9jZWpzdCd9XG4gICAgICAgICAgICAgIGludGVybmFsPXt0cnVlfT5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkhPV19UT19HRVRfU1RBUlRFRC5DT01NVU5JVFlfTUVNQkVSU19JTkZPKX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9BYm91dENhcmQ+XG4gICAgICAgICAgPC9BYm91dENhcmRzQ29udGFpbmVyPlxuICAgICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8aDI+e2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkdFVF9JTlZPTFZFRC5USVRMRSl9PC9oMj5cbiAgICAgICAgPEFib3V0Q2FyZHNDb250YWluZXI+XG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Y29tbWVudEljb259XG4gICAgICAgICAgICBoZWFkZXI9e2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkdFVF9JTlZPTFZFRC5TRU5EX0ZFRURCQUNLX0hFQURJTkcpfVxuICAgICAgICAgICAgbGlua1RleHQ9e2BFbWFpbDogJHtDT05UQUNUX0NPUFkuRkVFREJBQ0tfRU1BSUx9YH1cbiAgICAgICAgICAgIHVybD17YG1haWx0bzoke0NPTlRBQ1RfQ09QWS5GRUVEQkFDS19FTUFJTH1gfVxuICAgICAgICAgICAgb3BlblVybE5ld1RhYj17dHJ1ZX1cbiAgICAgICAgICAgIGludGVybmFsPXtmYWxzZX0+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkdFVF9JTlZPTFZFRC5TRU5EX0ZFRURCQUNLX0lORk8pfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvQWJvdXRDYXJkPlxuXG4gICAgICAgICAgPEFib3V0Q2FyZFxuICAgICAgICAgICAgc2l6ZT17J3NtYWxsJ31cbiAgICAgICAgICAgIGltZ1NyYz17Z2l0aHViSWNvbn1cbiAgICAgICAgICAgIGhlYWRlcj17aW50bC5mb3JtYXRNZXNzYWdlKEFCT1VUX0NPUFkuR0VUX0lOVk9MVkVELkpPSU5fT1NDX0hFQURJTkcpfVxuICAgICAgICAgICAgbGlua1RleHQ9e2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkdFVF9JTlZPTFZFRC5KT0lOX09TQ19MSU5LX1RFWFQpfVxuICAgICAgICAgICAgdXJsPXtBQk9VVF9DT1BZLkdJVEhVQl9MSU5LfVxuICAgICAgICAgICAgb3BlblVybE5ld1RhYj17dHJ1ZX1cbiAgICAgICAgICAgIGludGVybmFsPXtmYWxzZX0+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShBQk9VVF9DT1BZLkdFVF9JTlZPTFZFRC5KT0lOX09TQ19JTkZPKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L0Fib3V0Q2FyZD5cbiAgICAgICAgPC9BYm91dENhcmRzQ29udGFpbmVyPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8L0xheW91dD4pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW5kZXhQYWdlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9697\n")}}]); \ No newline at end of file diff --git a/803-0bf34ac/component---src-pages-methodology-tsx-4a1498992efe94aa545e.js b/803-0bf34ac/component---src-pages-methodology-tsx-4a1498992efe94aa545e.js new file mode 100644 index 00000000..41115c84 --- /dev/null +++ b/803-0bf34ac/component---src-pages-methodology-tsx-4a1498992efe94aa545e.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[647],{6780:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Z": function() { return /* binding */ components_AlertWrapper; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/alertWrapper.module.scss\n// extracted by mini-css-extract-plugin\nvar alertWrapper = "alertWrapper-module--alertWrapper--blPAc";\nvar alertHide = "alertWrapper-module--alertHide--9Ud1N";\nvar alertWarning = "alertWrapper-module--alertWarning--31gxK";\n// EXTERNAL MODULE: ./src/data/copy/common.tsx\nvar common = __webpack_require__(4489);\n;// CONCATENATED MODULE: ./src/components/AlertWrapper/index.tsx\nvar AlertWrapper=function AlertWrapper(_ref){var _ref$showBetaAlert=_ref.showBetaAlert,showBetaAlert=_ref$showBetaAlert===void 0?false:_ref$showBetaAlert,_ref$showLimitedDataA=_ref.showLimitedDataAlert,showLimitedDataAlert=_ref$showLimitedDataA===void 0?false:_ref$showLimitedDataA;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement("div",{className:alertWrapper},showBetaAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"info"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.BETA_TITLE */.N$.BETA_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.BETA_BODY */.N$.BETA_BODY)),/*#__PURE__*/react.createElement("br",null)),showLimitedDataAlert&&/*#__PURE__*/react.createElement(lib.Alert,{className:\'j40-sitealert\',type:"warning"},/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-title\'},intl.formatMessage(common/* ALERTS.LIMITED_TITLE */.N$.LIMITED_TITLE)),/*#__PURE__*/react.createElement("span",{className:\'j40-sitealert-body\'}," \\u2014 ",intl.formatMessage(common/* ALERTS.LIMITED_BODY */.N$.LIMITED_BODY)),/*#__PURE__*/react.createElement("br",null)));};/* harmony default export */ var components_AlertWrapper = (AlertWrapper);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3M/ZDhjYiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0FsZXJ0V3JhcHBlci9pbmRleC50c3g/NTg5YSJdLCJuYW1lcyI6WyJBbGVydFdyYXBwZXIiLCJzaG93QmV0YUFsZXJ0Iiwic2hvd0xpbWl0ZWREYXRhQWxlcnQiLCJpbnRsIiwidXNlSW50bCIsInN0eWxlcyIsImZvcm1hdE1lc3NhZ2UiLCJDT01NT05fQ09QWSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBLDhEOzs7O0FDU1AsR0FBTUEsYUFBWSxDQUFHLFFBQWZBLGFBQWUsTUFHSyw2QkFGeEJDLGFBRXdCLENBRnhCQSxhQUV3Qiw2QkFGUixLQUVRLCtDQUR4QkMsb0JBQ3dCLENBRHhCQSxvQkFDd0IsZ0NBREQsS0FDQyx1QkFDeEIsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUdBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRUMsWUFBaEIsRUFDR0osYUFBYSxlQUNaLG9CQUFDLFNBQUQsRUFBTyxTQUFTLENBQUUsZUFBbEIsQ0FBbUMsSUFBSSxDQUFDLE1BQXhDLGVBQ0UsNEJBQU0sU0FBUyxDQUFFLHFCQUFqQixFQUF5Q0UsSUFBSSxDQUFDRyxhQUFMLENBQW1CQywyQ0FBbkIsQ0FBekMsQ0FERixjQUVFLDRCQUFNLFNBQVMsQ0FBRSxvQkFBakIsYUFBMkNKLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMseUNBQW5CLENBQTNDLENBRkYsY0FHRSw4QkFIRixDQUZKLENBU0dMLG9CQUFvQixlQUNuQixvQkFBQyxTQUFELEVBQU8sU0FBUyxDQUFFLGVBQWxCLENBQW1DLElBQUksQ0FBQyxTQUF4QyxlQUNFLDRCQUFNLFNBQVMsQ0FBRSxxQkFBakIsRUFBeUNDLElBQUksQ0FBQ0csYUFBTCxDQUFtQkMsaURBQW5CLENBQXpDLENBREYsY0FFRSw0QkFBTSxTQUFTLENBQUUsb0JBQWpCLGFBQTJDSixJQUFJLENBQUNHLGFBQUwsQ0FBbUJDLCtDQUFuQixDQUEzQyxDQUZGLGNBR0UsOEJBSEYsQ0FWSixDQURGLENBbUJELENBMUJELENBNEJBLDREQUFlUCxZQUFmIiwiZmlsZSI6IjY3ODAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgYWxlcnRXcmFwcGVyID0gXCJhbGVydFdyYXBwZXItbW9kdWxlLS1hbGVydFdyYXBwZXItLWJsUEFjXCI7XG5leHBvcnQgdmFyIGFsZXJ0SGlkZSA9IFwiYWxlcnRXcmFwcGVyLW1vZHVsZS0tYWxlcnRIaWRlLS05VWQxTlwiO1xuZXhwb3J0IHZhciBhbGVydFdhcm5pbmcgPSBcImFsZXJ0V3JhcHBlci1tb2R1bGUtLWFsZXJ0V2FybmluZy0tMzFneEtcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtBbGVydH0gZnJvbSAnQHRydXNzd29ya3MvcmVhY3QtdXN3ZHMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdnYXRzYnktcGx1Z2luLWludGwnO1xuXG5pbXBvcnQgKiBhcyBzdHlsZXMgZnJvbSAnLi9hbGVydFdyYXBwZXIubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgQ09NTU9OX0NPUFkgZnJvbSAnLi4vLi4vZGF0YS9jb3B5L2NvbW1vbic7XG5cbmludGVyZmFjZSBJQWxlcnRXcmFwcGVyUHJvcHMge1xuICBzaG93QmV0YUFsZXJ0PzogYm9vbGVhbiwgLy8gZGVmYXVsdHMgdG8gZmFsc2VcbiAgc2hvd0xpbWl0ZWREYXRhQWxlcnQ/OiBib29sZWFuLCAvLyBkZWZhdWx0cyB0byBmYWxzZVxufVxuXG5jb25zdCBBbGVydFdyYXBwZXIgPSAoe1xuICBzaG93QmV0YUFsZXJ0ID0gZmFsc2UsXG4gIHNob3dMaW1pdGVkRGF0YUFsZXJ0ID0gZmFsc2UsXG59OiBJQWxlcnRXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbGVydFdyYXBwZXJ9PlxuICAgICAge3Nob3dCZXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJpbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkJFVEFfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuXG4gICAgICB7c2hvd0xpbWl0ZWREYXRhQWxlcnQgJiYgKFxuICAgICAgICA8QWxlcnQgY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydCd9IHR5cGU9XCJ3YXJuaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnajQwLXNpdGVhbGVydC10aXRsZSd9PntpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfVElUTEUpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eydqNDAtc2l0ZWFsZXJ0LWJvZHknfT4g4oCUIHtpbnRsLmZvcm1hdE1lc3NhZ2UoQ09NTU9OX0NPUFkuQUxFUlRTLkxJTUlURURfQk9EWSl9PC9zcGFuPlxuICAgICAgICAgIDxici8+XG4gICAgICAgIDwvQWxlcnQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRXcmFwcGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6780\n')},5345:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "qX": function() { return /* binding */ PAGE; },\n/* harmony export */ "Xr": function() { return /* binding */ DOWNLOAD_FILE_SIZE; },\n/* harmony export */ "_f": function() { return /* binding */ DOWNLOAD_LAST_UPDATED; },\n/* harmony export */ "IE": function() { return /* binding */ VERSION_NUMBER; },\n/* harmony export */ "iV": function() { return /* binding */ DOWNLOAD_ZIP_URL; },\n/* harmony export */ "uh": function() { return /* binding */ DOWNLOAD_PACKAGE; },\n/* harmony export */ "mj": function() { return /* binding */ DATASETS; },\n/* harmony export */ "it": function() { return /* binding */ DATASET_CARD_LABELS; },\n/* harmony export */ "_F": function() { return /* binding */ INDICATORS; },\n/* harmony export */ "RN": function() { return /* binding */ ADDITIONAL_INDICATORS; },\n/* harmony export */ "Zr": function() { return /* binding */ METHODOLOGY_STEPS; },\n/* harmony export */ "KZ": function() { return /* binding */ COMPLEX_METH_STEPS; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7294);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4424);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9703);\n/* harmony import */ var gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__);\nvar PAGE=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({TILE:{id:\'methodology.page.title.text\',defaultMessage:\'Data and Methodology\',description:\'methodology page title text\'},HEADING:{id:\'methodology.page.header.text\',defaultMessage:\'Methodology\',description:\'methodology page header text\'},DESCRIPTION:{id:\'methodology.page.paragraph.first\',defaultMessage:\'The methodology for identifying communities of focus is currently \'+\'in a draft, pre-decisional form that may change over time as more datasets become available.\',description:\'methodology page paragraph 1\'}});// Download Package\nvar DOWNLOAD_FILE_SIZE=\'111MB\';var DOWNLOAD_LAST_UPDATED=\'10/01/21\';var VERSION_NUMBER=\'0.1\';var DOWNLOAD_ZIP_URL=["https://d3jqyw10j8e7p9.cloudfront.net","data-pipeline/data/score","downloadable/Screening_Tool_Data.zip"].join(\'/\');var DOWNLOAD_PACKAGE={TITLE:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.header.text\',defaultMessage:"Draft communities list v{versionNumber} ({downloadFileSize})",description:\'download packet header text\',values:{versionNumber:VERSION_NUMBER,downloadFileSize:DOWNLOAD_FILE_SIZE}}),DESCRIPTION:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.info.text\'// eslint-disable-next-line max-len\n,defaultMessage:"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).",description:\'download packet info text\',values:{versionNumber:VERSION_NUMBER}}),LAST_UPDATED:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.info.last.updated\',defaultMessage:"Last updated: {downloadLastUpdated} ",description:\'download packet info last updated\',values:{downloadLastUpdated:DOWNLOAD_LAST_UPDATED}}),BUTTON_TEXT:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'downloadPacket.button.text\',defaultMessage:\'Download package\',description:\'download packet button text\'})};// Dataset section\nvar DATASETS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({HEADING:{id:\'datasetContainer.heading\',defaultMessage:\'Datasets used in methodology\',description:\'section heading of which datasets are used in cumulative score\'},INFO:{id:\'datasetContainer.info\',defaultMessage:\'The datasets come from a variety of sources and were selected\'+\' based on relevance, availability, recency, and quality. The datasets seek to\'+\' identify a range of human health, environmental, climate-related, and other\'+\' cumulative impacts on communities.\',description:\'description of the dataset section\'},ADDITIONAL_HEADING:{id:\'datasetContainer.additional.heading\',defaultMessage:\'Additional Indicators\',description:\'additional indicators heading\'},ADDITIONAL_INFO:{id:\'datasetContainer.additional.info\',defaultMessage:\'These datasets provide additional information about each community.\',description:\'additional indicator info\'}});var DATASET_CARD_LABELS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({RESOLUTION:{id:\'datasetCard.dataResolution\',defaultMessage:\'Data resolution: \',description:\'label associated with explaining the card\'},SOURCE:{id:\'datasetCard.dataSource\',defaultMessage:\'Data source: \',description:\'label associated with explaining the card\'},DATE_RANGE:{id:\'datasetCard.dataDateRange\',defaultMessage:\'Data date range: \',description:\'label associated with explaining the card\'}});var INDICATORS=[{indicator:\'Area Median Income\',description:"Median income of the census block group calculated as a percent \\n of the metropolitan area\\u2019s or state\'s median income.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Poverty\',description:"Percent of a block group\'s population in households where the household income"+" is at or below 100% of the federal poverty level.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Education, less than high school education\',description:"Percent of people ages 25 years or older in a block group whose \\n education level is less than a high school diploma.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"}];var ADDITIONAL_INDICATORS=[{indicator:\'Diabetes\',description:"People ages 18 years and older who report having ever been \\n told by a doctor, nurse, or other health professionals that they have \\n diabetes other than diabetes during pregnancy.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Asthma\',description:"Weighted number of respondents people who answer \\u201Cyes\\u201D both \\n to both of the following questions: \\u201CHave you ever been told by a doctor, \\n nurse, or other health professional that you have asthma?\\u201D and the question \\n \\u201CDo you still have asthma?\\u201D",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Heart disease\',description:"People ages 18 years and older who report ever having been told \\n by a doctor, nurse, or other health professionals that they had angina or \\n coronary heart disease.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) PLACES",dataSourceURL:"https://www.cdc.gov/places/index.html",dataDateRange:"2016-2019"},{indicator:\'Life expectancy\',description:"Estimated years of life expectancy.",dataResolution:"Census tract",dataSourceLabel:"Centers for Disease Control and Prevention (CDC) \\n US Small-area Life Expectancy Estimates Project",dataSourceURL:"https://www.cdc.gov/nchs/nvss/usaleep/usaleep.html#data",dataDateRange:"2010-2015"},{indicator:\'Traffic proximity and volume\',description:"Count of vehicles (average annual daily traffic) at major roads \\n within 500 meters, divided by distance in meters (not km).",dataResolution:"Census block group",dataSourceLabel:"Department of Transportation (DOT) traffic data as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2017"},{indicator:\'FEMA Risk Index Expected Annual Loss Score\',description:"Average economic loss in dollars resulting from natural \\n hazards each year. It is calculated for each hazard type and quantifies \\n loss for relevant consequence types: buildings, people, and agriculture.",dataResolution:"Census tract",dataSourceLabel:"Federal Emergency Management Agency (FEMA)",dataSourceURL:"https://hazards.fema.gov/nri/expected-annual-loss",dataDateRange:"2014-2017"},{indicator:\'Energy burden\',description:"Average annual energy cost ($) divided by household income.",dataResolution:"Census tract",dataSourceLabel:"Department of Energy (DOE) LEAD Score",dataSourceURL:"https://www.energy.gov/eere/slsc/low-income-energy-affordability-data-lead-tool",dataDateRange:"2018"},{indicator:\'Housing cost burden\',description:"Households that are low income and spend more than 30% of their \\n income to housing costs.",dataResolution:"Census tract",dataSourceLabel:"Department of Housing & Urban Development\\u2019s \\n (HUD) Comprehensive Housing Affordability Strategy dataset",dataSourceURL:"https://www.huduser.gov/portal/datasets/cp.html",dataDateRange:"2013-2017"},{indicator:\'Wastewater discharge\',description:"RSEI modeled Toxic Concentrations at stream segments within 500 \\n meters, divided by distance in kilometers (km).",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) Risk-Screening \\n Environmental Indicators (RSEI) Model as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2020"},{indicator:\'Lead paint\',description:"Percent of housing units built pre-1960, used as an \\n indicator of potential lead paint exposure in homes.",dataResolution:"Census block group",dataSourceLabel:"Census\'s American Community Survey",dataSourceURL:"https://www.census.gov/programs-surveys/acs",dataDateRange:"2015-2019"},{indicator:\'Diesel particulate matter\',description:"Mixture of particles that is part of diesel exhaust in the air.",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) National Air Toxics Assessment (NATA)\\n as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"5-year estimates, 2015-2019"},{indicator:\'PM2.5\',description:"Fine inhalable particles, with diameters that are generally \\n 2.5 micrometers and smaller.",dataResolution:"Census block group",dataSourceLabel:"Environmental Protection Agency (EPA) Office of Air \\n and Radiation (OAR) fusion of model and monitor data as compiled by EPA\'s EJSCREEN",dataSourceURL:"https://www.epa.gov/ejscreen/technical-documentation-ejscreen",dataDateRange:"2017"}];// Methodology Steps:\nvar METHODOLOGY_STEPS=(0,react_intl__WEBPACK_IMPORTED_MODULE_2__/* .defineMessages */ .vU)({HEADING:{id:\'methodology.steps.heading\',defaultMessage:"Methodology",description:\'heading of methodology section\'},DESCRIPTION_1:{id:\'methodology.steps.description.1\',defaultMessage:\'The methodology for identifying communities of focus is\'+\' calculated at the census block group level. Census block geographical boundaries\'+\' are determined by the U.S. Census Bureau once every ten years. This tool utilizes\'+\' the census block boundaries from 2010.\',description:\'first description text \'},DESCRIPTION_2:{id:\'methodology.steps.description.2\',defaultMessage:\'The following describes the process for identifying communities of focus.\',description:\'second description text\'},STEP_1_HEADING:{id:\'methodology.step.1.heading\',defaultMessage:"Gather datasets",description:\'first step heading\'},STEP_1_INFO:{id:\'methodology.step.1.info\',defaultMessage:"The methodology includes the following inputs that are equally weighted.",description:\'first step info\'},STEP_1_A_HEADING:{id:\'methodology.step.1.a.heading\',defaultMessage:"Percent of Area Median Income",description:\'step 1 a heading\'},STEP_1_A_INFO_1:{id:\'methodology.step.1.a.info.1\',defaultMessage:\'If a census block group is in a metropolitan area, this value is the\'+\' median income of the census block group calculated as a percent of\'+\' the metropolitan area’s median income.\',description:\'step 1 a info 1\'},STEP_1_A_INFO_2:{id:\'methodology.step.1.a.info.2\',defaultMessage:\'If a census block group is not in a metropolitan area, this value is the\'+\' median income of the census block group calculated as a percent of the state’s median\'+\' income.\',description:\'step 1 a info 2\'},STEP_1_B_HEADING:{id:\'methodology.step.1.b.heading\',defaultMessage:"Percent of households below or at 100% of the federal poverty line",description:\'step 1 b heading\'},STEP_1_C_HEADING:{id:\'methodology.step.1.c.heading\',defaultMessage:"The high school degree achievement rate for adults 25 years and older",description:\'step 1 a heading\'},STEP_1_C_INFO:{id:\'methodology.step.1.c.info\',defaultMessage:\'The percent of individuals who are 25 or older who have received a high school degree.\',description:\'step 1 c info\'},STEP_2_HEADING:{id:\'methodology.step.2.heading\',defaultMessage:"Determine communites of focus",description:\'second step heading\'},STEP_2_INFO:{id:\'methodology.step.2.info\',defaultMessage:"Under the existing formula, a census block group will be considered a community of focus if:",description:\'second step info\'}});var FED_POVERTY_LINE_URL=\'https://www.census.gov/topics/income-poverty/poverty/guidance/poverty-measures.html\';// Copy that has links or other HTML tags in them\nvar COMPLEX_METH_STEPS={STEP_2_B_INFO:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'methodology.steps.2.b.info\',description:\'Download the draft list of communities of focus and datasets used.\',defaultMessage:"This is the percent of households in a state with a household income \\n below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated \\n based on the composition of each household (e.g., based on household size), but it does not vary geographically.",values:{federalPovertyLine:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("a",{href:FED_POVERTY_LINE_URL,target:"_blank",rel:"noreferrer"},"federal poverty line")}}),FORMULA:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(gatsby_plugin_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage,{id:\'methodology.steps.2.formula\',description:\'Formala used to calculate communities of focus\',defaultMessage:"{medianIncome} {or} {livingAtPovery} {and} {education}",values:{medianIncome:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",null,"(The median income is less than 80% of the area median income"),or:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"OR"),livingAtPovery:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"households living in poverty (at or below 100% of the federal poverty level) is greater than 20%)"),and:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"AND"),education:/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("p",{className:\'flush\'},"The high school degree achievement rate for adults 25 years and older is greater than 95%")}})};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9kYXRhL2NvcHkvbWV0aG9kb2xvZ3kudHN4P2E0MGYiXSwibmFtZXMiOlsiUEFHRSIsImRlZmluZU1lc3NhZ2VzIiwiVElMRSIsImlkIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZXNjcmlwdGlvbiIsIkhFQURJTkciLCJERVNDUklQVElPTiIsIkRPV05MT0FEX0ZJTEVfU0laRSIsIkRPV05MT0FEX0xBU1RfVVBEQVRFRCIsIlZFUlNJT05fTlVNQkVSIiwiRE9XTkxPQURfWklQX1VSTCIsInByb2Nlc3MiLCJqb2luIiwiRE9XTkxPQURfUEFDS0FHRSIsIlRJVExFIiwidmVyc2lvbk51bWJlciIsImRvd25sb2FkRmlsZVNpemUiLCJMQVNUX1VQREFURUQiLCJkb3dubG9hZExhc3RVcGRhdGVkIiwiQlVUVE9OX1RFWFQiLCJEQVRBU0VUUyIsIklORk8iLCJBRERJVElPTkFMX0hFQURJTkciLCJBRERJVElPTkFMX0lORk8iLCJEQVRBU0VUX0NBUkRfTEFCRUxTIiwiUkVTT0xVVElPTiIsIlNPVVJDRSIsIkRBVEVfUkFOR0UiLCJJTkRJQ0FUT1JTIiwiaW5kaWNhdG9yIiwiZGF0YVJlc29sdXRpb24iLCJkYXRhU291cmNlTGFiZWwiLCJkYXRhU291cmNlVVJMIiwiZGF0YURhdGVSYW5nZSIsIkFERElUSU9OQUxfSU5ESUNBVE9SUyIsIk1FVEhPRE9MT0dZX1NURVBTIiwiREVTQ1JJUFRJT05fMSIsIkRFU0NSSVBUSU9OXzIiLCJTVEVQXzFfSEVBRElORyIsIlNURVBfMV9JTkZPIiwiU1RFUF8xX0FfSEVBRElORyIsIlNURVBfMV9BX0lORk9fMSIsIlNURVBfMV9BX0lORk9fMiIsIlNURVBfMV9CX0hFQURJTkciLCJTVEVQXzFfQ19IRUFESU5HIiwiU1RFUF8xX0NfSU5GTyIsIlNURVBfMl9IRUFESU5HIiwiU1RFUF8yX0lORk8iLCJGRURfUE9WRVJUWV9MSU5FX1VSTCIsIkNPTVBMRVhfTUVUSF9TVEVQUyIsIlNURVBfMl9CX0lORk8iLCJmZWRlcmFsUG92ZXJ0eUxpbmUiLCJGT1JNVUxBIiwibWVkaWFuSW5jb21lIiwib3IiLCJsaXZpbmdBdFBvdmVyeSIsImFuZCIsImVkdWNhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSU8sR0FBTUEsS0FBSSxDQUFHQyxvRUFBYyxDQUFDLENBQ2pDQyxJQUFJLENBQUUsQ0FDSkMsRUFBRSxDQUFFLDZCQURBLENBRUpDLGNBQWMsQ0FBRSxzQkFGWixDQUdKQyxXQUFXLENBQUUsNkJBSFQsQ0FEMkIsQ0FNakNDLE9BQU8sQ0FBRSxDQUNQSCxFQUFFLENBQUUsOEJBREcsQ0FFUEMsY0FBYyxDQUFFLGFBRlQsQ0FHUEMsV0FBVyxDQUFFLDhCQUhOLENBTndCLENBV2pDRSxXQUFXLENBQUUsQ0FDWEosRUFBRSxDQUFFLGtDQURPLENBRVhDLGNBQWMsQ0FBRSxxRUFDZCw4RkFIUyxDQUlYQyxXQUFXLENBQUUsOEJBSkYsQ0FYb0IsQ0FBRCxDQUEzQixDQW9CUDtBQUNPLEdBQU1HLG1CQUFrQixDQUFHLE9BQTNCLENBQ0EsR0FBTUMsc0JBQXFCLENBQUcsVUFBOUIsQ0FDQSxHQUFNQyxlQUFjLENBQUcsS0FBdkIsQ0FFQSxHQUFNQyxpQkFBZ0IsQ0FBRyxDQUM5QkMsdUNBRDhCLENBRTlCQSwwQkFGOEIsQ0FHOUJBLHNDQUg4QixFQUk5QkMsSUFKOEIsQ0FJekIsR0FKeUIsQ0FBekIsQ0FNQSxHQUFNQyxpQkFBZ0IsQ0FBRyxDQUM5QkMsS0FBSyxjQUFFLGlEQUFDLGdFQUFELEVBQ0wsRUFBRSxDQUFFLDRCQURDLENBRUwsY0FBYywrREFGVCxDQUdMLFdBQVcsQ0FBRSw2QkFIUixDQUlMLE1BQU0sQ0FBRyxDQUNQQyxhQUFhLENBQUVOLGNBRFIsQ0FFUE8sZ0JBQWdCLENBQUVULGtCQUZYLENBSkosRUFEdUIsQ0FVOUJELFdBQVcsY0FBRSxpREFBQyxnRUFBRCxFQUNYLEVBQUUsQ0FBRywwQkFDTDtBQUZXLENBR1gsY0FBYyxxSkFISCxDQUlYLFdBQVcsQ0FB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QUErQyxHQUFHLENBQUMsWUFBbkQseUJBRk0sQ0FOSyxFQURpQixDQWNoQ0ksT0FBTyxjQUFFLGlEQUFDLGdFQUFELEVBQ1AsRUFBRSxDQUFFLDZCQURHLENBRVAsV0FBVyxDQUFFLGdEQUZOLENBR1AsY0FBYyx5REFIUCxDQUlQLE1BQU0sQ0FBRSxDQUNOQyxZQUFZLGNBQ1YsMEhBRkksQ0FLTkMsRUFBRSxjQUNBLHNEQUFHLFNBQVMsQ0FBRSxPQUFkLE9BTkksQ0FTTkMsY0FBYyxjQUNaLHNEQUFHLFNBQVMsQ0FBRSxPQUFkLHNHQVZJLENBYU5DLEdBQUcsY0FDRCxzREFBRyxTQUFTLENBQUUsT0FBZCxRQWRJLENBaUJOQyxTQUFTLGNBQ1Asc0RBQUcsU0FBUyxDQUFFLE9BQWQsOEZBbEJJLENBSkQsRUFkdUIsQ0FBM0IiLCJmaWxlIjoiNTM0NS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2RlZmluZU1lc3NhZ2VzfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuZXhwb3J0IGNvbnN0IFBBR0UgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIFRJTEU6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnBhZ2UudGl0bGUudGV4dCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIGFuZCBNZXRob2RvbG9neScsXG4gICAgZGVzY3JpcHRpb246ICdtZXRob2RvbG9neSBwYWdlIHRpdGxlIHRleHQnLFxuICB9LFxuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5wYWdlLmhlYWRlci50ZXh0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ01ldGhvZG9sb2d5JyxcbiAgICBkZXNjcmlwdGlvbjogJ21ldGhvZG9sb2d5IHBhZ2UgaGVhZGVyIHRleHQnLFxuICB9LFxuICBERVNDUklQVElPTjoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kucGFnZS5wYXJhZ3JhcGguZmlyc3QnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIG1ldGhvZG9sb2d5IGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cyBpcyBjdXJyZW50bHkgJyArXG4gICAgICAnaW4gYSBkcmFmdCwgcHJlLWRlY2lzaW9uYWwgZm9ybSB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFzIG1vcmUgZGF0YXNldHMgYmVjb21lIGF2YWlsYWJsZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnbWV0aG9kb2xvZ3kgcGFnZSBwYXJhZ3JhcGggMScsXG4gIH0sXG59KTtcblxuXG4vLyBEb3dubG9hZCBQYWNrYWdlXG5leHBvcnQgY29uc3QgRE9XTkxPQURfRklMRV9TSVpFID0gJzExMU1CJztcbmV4cG9ydCBjb25zdCBET1dOTE9BRF9MQVNUX1VQREFURUQgPSAnMTAvMDEvMjEnO1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fTlVNQkVSID0gJzAuMSc7XG5cbmV4cG9ydCBjb25zdCBET1dOTE9BRF9aSVBfVVJMID0gW1xuICBwcm9jZXNzLmVudi5HQVRTQllfQ0ROX1RJTEVTX0JBU0VfVVJMLFxuICBwcm9jZXNzLmVudi5HQVRTQllfREFUQV9QSVBFTElORV9TQ09SRV9QQVRILFxuICBwcm9jZXNzLmVudi5HQVRTQllfU0NPUkVfRE9XTkxPQURfRklMRV9QQVRILFxuXS5qb2luKCcvJyk7XG5cbmV4cG9ydCBjb25zdCBET1dOTE9BRF9QQUNLQUdFID0ge1xuICBUSVRMRTogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17J2Rvd25sb2FkUGFja2V0LmhlYWRlci50ZXh0J31cbiAgICBkZWZhdWx0TWVzc2FnZT17IGBEcmFmdCBjb21tdW5pdGllcyBsaXN0IHZ7dmVyc2lvbk51bWJlcn0gKHtkb3dubG9hZEZpbGVTaXplfSlgfVxuICAgIGRlc2NyaXB0aW9uPXsnZG93bmxvYWQgcGFja2V0IGhlYWRlciB0ZXh0J31cbiAgICB2YWx1ZXM9IHt7XG4gICAgICB2ZXJzaW9uTnVtYmVyOiBWRVJTSU9OX05VTUJFUixcbiAgICAgIGRvd25sb2FkRmlsZVNpemU6IERPV05MT0FEX0ZJTEVfU0laRSxcbiAgICB9fVxuICAvPixcbiAgREVTQ1JJUFRJT046IDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgaWQ9eyAnZG93bmxvYWRQYWNrZXQuaW5mby50ZXh0J31cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGRlZmF1bHRNZXNzYWdlPSB7YFRoZSBwYWNrYWdlIGluY2x1ZGVzIGRyYWZ0IHZ7dmVyc2lvbk51bWJlcn0gb2YgdGhlIGxpc3Qgb2YgY29tbXVuaXRpZXMgb2YgZm9jdXMgKC5jc3YgYW5kIC54bHN4KSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgbGlzdCAoLnBkZikuYH1cbiAgICBkZXNjcmlwdGlvbj0geydkb3dubG9hZCBwYWNrZXQgaW5mbyB0ZXh0J31cbiAgICB2YWx1ZXM9IHt7XG4gICAgICB2ZXJzaW9uTnVtYmVyOiBWRVJTSU9OX05VTUJFUixcbiAgICB9fVxuICAvPixcbiAgTEFTVF9VUERBVEVEOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsgJ2Rvd25sb2FkUGFja2V0LmluZm8ubGFzdC51cGRhdGVkJ31cbiAgICBkZWZhdWx0TWVzc2FnZT0ge2BMYXN0IHVwZGF0ZWQ6IHtkb3dubG9hZExhc3RVcGRhdGVkfSBgfVxuICAgIGRlc2NyaXB0aW9uPSB7J2Rvd25sb2FkIHBhY2tldCBpbmZvIGxhc3QgdXBkYXRlZCd9XG4gICAgdmFsdWVzPSB7e1xuICAgICAgZG93bmxvYWRMYXN0VXBkYXRlZDogRE9XTkxPQURfTEFTVF9VUERBVEVELFxuICAgIH19XG4gIC8+LFxuICBCVVRUT05fVEVYVDogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17ICdkb3dubG9hZFBhY2tldC5idXR0b24udGV4dCd9XG4gICAgZGVmYXVsdE1lc3NhZ2U9IHsnRG93bmxvYWQgcGFja2FnZSd9XG4gICAgZGVzY3JpcHRpb249IHsnZG93bmxvYWQgcGFja2V0IGJ1dHRvbiB0ZXh0J31cbiAgLz4sXG59O1xuXG5cbi8vIERhdGFzZXQgc2VjdGlvblxuZXhwb3J0IGNvbnN0IERBVEFTRVRTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q29udGFpbmVyLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGF0YXNldHMgdXNlZCBpbiBtZXRob2RvbG9neScsXG4gICAgZGVzY3JpcHRpb246ICdzZWN0aW9uIGhlYWRpbmcgb2Ygd2hpY2ggZGF0YXNldHMgYXJlIHVzZWQgaW4gY3VtdWxhdGl2ZSBzY29yZScsXG4gIH0sXG4gIElORk86IHtcbiAgICBpZDogJ2RhdGFzZXRDb250YWluZXIuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgZGF0YXNldHMgY29tZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZCB3ZXJlIHNlbGVjdGVkJyArXG4gICAgJyBiYXNlZCBvbiByZWxldmFuY2UsIGF2YWlsYWJpbGl0eSwgcmVjZW5jeSwgYW5kIHF1YWxpdHkuIFRoZSBkYXRhc2V0cyBzZWVrIHRvJyArXG4gICAgJyBpZGVudGlmeSBhIHJhbmdlIG9mIGh1bWFuIGhlYWx0aCwgZW52aXJvbm1lbnRhbCwgY2xpbWF0ZS1yZWxhdGVkLCBhbmQgb3RoZXInICtcbiAgICAnIGN1bXVsYXRpdmUgaW1wYWN0cyBvbiBjb21tdW5pdGllcy4nLFxuICAgIGRlc2NyaXB0aW9uOiAnZGVzY3JpcHRpb24gb2YgdGhlIGRhdGFzZXQgc2VjdGlvbicsXG4gIH0sXG4gIEFERElUSU9OQUxfSEVBRElORzoge1xuICAgIGlkOiAnZGF0YXNldENvbnRhaW5lci5hZGRpdGlvbmFsLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQWRkaXRpb25hbCBJbmRpY2F0b3JzJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZGl0aW9uYWwgaW5kaWNhdG9ycyBoZWFkaW5nJyxcbiAgfSxcbiAgQURESVRJT05BTF9JTkZPOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q29udGFpbmVyLmFkZGl0aW9uYWwuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGVzZSBkYXRhc2V0cyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb21tdW5pdHkuJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZGl0aW9uYWwgaW5kaWNhdG9yIGluZm8nLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVRBU0VUX0NBUkRfTEFCRUxTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBSRVNPTFVUSU9OOiB7XG4gICAgaWQ6ICdkYXRhc2V0Q2FyZC5kYXRhUmVzb2x1dGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHJlc29sdXRpb246ICcsXG4gICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gIH0sXG4gIFNPVVJDRToge1xuICAgIGlkOiAnZGF0YXNldENhcmQuZGF0YVNvdXJjZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIHNvdXJjZTogJyxcbiAgICBkZXNjcmlwdGlvbjogJ2xhYmVsIGFzc29jaWF0ZWQgd2l0aCBleHBsYWluaW5nIHRoZSBjYXJkJyxcbiAgfSxcbiAgREFURV9SQU5HRToge1xuICAgIGlkOiAnZGF0YXNldENhcmQuZGF0YURhdGVSYW5nZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEYXRhIGRhdGUgcmFuZ2U6ICcsXG4gICAgZGVzY3JpcHRpb246ICdsYWJlbCBhc3NvY2lhdGVkIHdpdGggZXhwbGFpbmluZyB0aGUgY2FyZCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IElORElDQVRPUlMgPSBbXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdBcmVhIE1lZGlhbiBJbmNvbWUnLFxuICAgIGRlc2NyaXB0aW9uOiBgTWVkaWFuIGluY29tZSBvZiB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IFxuICAgIG9mIHRoZSBtZXRyb3BvbGl0YW4gYXJlYeKAmXMgb3Igc3RhdGUncyBtZWRpYW4gaW5jb21lLmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYENlbnN1cydzIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXlgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvYWNzYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNS0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ1BvdmVydHknLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVyY2VudCBvZiBhIGJsb2NrIGdyb3VwJ3MgcG9wdWxhdGlvbiBpbiBob3VzZWhvbGRzIHdoZXJlIHRoZSBob3VzZWhvbGQgaW5jb21lYCArXG4gICAgYCBpcyBhdCBvciBiZWxvdyAxMDAlIG9mIHRoZSBmZWRlcmFsIHBvdmVydHkgbGV2ZWwuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2Vuc3VzJ3MgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9hY3NgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnRWR1Y2F0aW9uLCBsZXNzIHRoYW4gaGlnaCBzY2hvb2wgZWR1Y2F0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgcGVvcGxlIGFnZXMgMjUgeWVhcnMgb3Igb2xkZXIgaW4gYSBibG9jayBncm91cCB3aG9zZSBcbiAgICBlZHVjYXRpb24gbGV2ZWwgaXMgbGVzcyB0aGFuIGEgaGlnaCBzY2hvb2wgZGlwbG9tYS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBDZW5zdXMncyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL2Fjc2AsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTUtMjAxOWAsXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgQURESVRJT05BTF9JTkRJQ0FUT1JTID0gW1xuICB7XG4gICAgaW5kaWNhdG9yOiAnRGlhYmV0ZXMnLFxuICAgIGRlc2NyaXB0aW9uOiBgUGVvcGxlIGFnZXMgMTggeWVhcnMgYW5kIG9sZGVyIHdobyByZXBvcnQgaGF2aW5nIGV2ZXIgYmVlbiBcbiAgICB0b2xkIGJ5IGEgZG9jdG9yLCBudXJzZSwgb3Igb3RoZXIgaGVhbHRoIHByb2Zlc3Npb25hbHMgdGhhdCB0aGV5IGhhdmUgXG4gICAgZGlhYmV0ZXMgb3RoZXIgdGhhbiBkaWFiZXRlcyBkdXJpbmcgcHJlZ25hbmN5LmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgdHJhY3RgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYENlbnRlcnMgZm9yIERpc2Vhc2UgQ29udHJvbCBhbmQgUHJldmVudGlvbiAoQ0RDKSBQTEFDRVNgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5jZGMuZ292L3BsYWNlcy9pbmRleC5odG1sYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNi0yMDE5YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0FzdGhtYScsXG4gICAgZGVzY3JpcHRpb246IGBXZWlnaHRlZCBudW1iZXIgb2YgcmVzcG9uZGVudHMgcGVvcGxlIHdobyBhbnN3ZXIg4oCceWVz4oCdIGJvdGggXG4gICAgdG8gYm90aCBvZiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczog4oCcSGF2ZSB5b3UgZXZlciBiZWVuIHRvbGQgYnkgYSBkb2N0b3IsIFxuICAgIG51cnNlLCBvciBvdGhlciBoZWFsdGggcHJvZmVzc2lvbmFsIHRoYXQgeW91IGhhdmUgYXN0aG1hP+KAnSBhbmQgdGhlIHF1ZXN0aW9uIFxuICAgIOKAnERvIHlvdSBzdGlsbCBoYXZlIGFzdGhtYT/igJ1gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBDZW50ZXJzIGZvciBEaXNlYXNlIENvbnRyb2wgYW5kIFByZXZlbnRpb24gKENEQykgUExBQ0VTYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2RjLmdvdi9wbGFjZXMvaW5kZXguaHRtbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTYtMjAxOWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdIZWFydCBkaXNlYXNlJyxcbiAgICBkZXNjcmlwdGlvbjogYFBlb3BsZSBhZ2VzIDE4IHllYXJzIGFuZCBvbGRlciB3aG8gcmVwb3J0IGV2ZXIgaGF2aW5nIGJlZW4gdG9sZCBcbiAgICBieSBhIGRvY3RvciwgbnVyc2UsIG9yIG90aGVyIGhlYWx0aCBwcm9mZXNzaW9uYWxzIHRoYXQgdGhleSBoYWQgYW5naW5hIG9yIFxuICAgIGNvcm9uYXJ5IGhlYXJ0IGRpc2Vhc2UuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2VudGVycyBmb3IgRGlzZWFzZSBDb250cm9sIGFuZCBQcmV2ZW50aW9uIChDREMpIFBMQUNFU2AsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNkYy5nb3YvcGxhY2VzL2luZGV4Lmh0bWxgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE2LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnTGlmZSBleHBlY3RhbmN5JyxcbiAgICBkZXNjcmlwdGlvbjogYEVzdGltYXRlZCB5ZWFycyBvZiBsaWZlIGV4cGVjdGFuY3kuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2VudGVycyBmb3IgRGlzZWFzZSBDb250cm9sIGFuZCBQcmV2ZW50aW9uIChDREMpIFxuICAgIFVTIFNtYWxsLWFyZWEgTGlmZSBFeHBlY3RhbmN5IEVzdGltYXRlcyBQcm9qZWN0YCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuY2RjLmdvdi9uY2hzL252c3MvdXNhbGVlcC91c2FsZWVwLmh0bWwjZGF0YWAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTAtMjAxNWAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdUcmFmZmljIHByb3hpbWl0eSBhbmQgdm9sdW1lJyxcbiAgICBkZXNjcmlwdGlvbjogYENvdW50IG9mIHZlaGljbGVzIChhdmVyYWdlIGFubnVhbCBkYWlseSB0cmFmZmljKSBhdCBtYWpvciByb2FkcyBcbiAgICB3aXRoaW4gNTAwIG1ldGVycywgZGl2aWRlZCBieSBkaXN0YW5jZSBpbiBtZXRlcnMgKG5vdCBrbSkuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgRGVwYXJ0bWVudCBvZiBUcmFuc3BvcnRhdGlvbiAoRE9UKSB0cmFmZmljIGRhdGEgYXMgY29tcGlsZWQgYnkgRVBBJ3MgRUpTQ1JFRU5gLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5lcGEuZ292L2Vqc2NyZWVuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uLWVqc2NyZWVuYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxN2AsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdGRU1BIFJpc2sgSW5kZXggRXhwZWN0ZWQgQW5udWFsIExvc3MgU2NvcmUnLFxuICAgIGRlc2NyaXB0aW9uOiBgQXZlcmFnZSBlY29ub21pYyBsb3NzIGluIGRvbGxhcnMgcmVzdWx0aW5nIGZyb20gbmF0dXJhbCBcbiAgICBoYXphcmRzIGVhY2ggeWVhci4gSXQgaXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBoYXphcmQgdHlwZSBhbmQgcXVhbnRpZmllcyBcbiAgICBsb3NzIGZvciByZWxldmFudCBjb25zZXF1ZW5jZSB0eXBlczogYnVpbGRpbmdzLCBwZW9wbGUsIGFuZCBhZ3JpY3VsdHVyZS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBGZWRlcmFsIEVtZXJnZW5jeSBNYW5hZ2VtZW50IEFnZW5jeSAoRkVNQSlgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL2hhemFyZHMuZmVtYS5nb3YvbnJpL2V4cGVjdGVkLWFubnVhbC1sb3NzYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAxNC0yMDE3YCxcbiAgfSxcbiAge1xuICAgIGluZGljYXRvcjogJ0VuZXJneSBidXJkZW4nLFxuICAgIGRlc2NyaXB0aW9uOiBgQXZlcmFnZSBhbm51YWwgZW5lcmd5IGNvc3QgKCQpIGRpdmlkZWQgYnkgaG91c2Vob2xkIGluY29tZS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIHRyYWN0YCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBEZXBhcnRtZW50IG9mIEVuZXJneSAoRE9FKSBMRUFEIFNjb3JlYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuZW5lcmd5Lmdvdi9lZXJlL3Nsc2MvbG93LWluY29tZS1lbmVyZ3ktYWZmb3JkYWJpbGl0eS1kYXRhLWxlYWQtdG9vbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMThgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnSG91c2luZyBjb3N0IGJ1cmRlbicsXG4gICAgZGVzY3JpcHRpb246IGBIb3VzZWhvbGRzIHRoYXQgYXJlIGxvdyBpbmNvbWUgYW5kIHNwZW5kIG1vcmUgdGhhbiAzMCUgb2YgdGhlaXIgXG4gICAgaW5jb21lIHRvIGhvdXNpbmcgY29zdHMuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyB0cmFjdGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgRGVwYXJ0bWVudCBvZiBIb3VzaW5nICYgVXJiYW4gRGV2ZWxvcG1lbnTigJlzIFxuICAgIChIVUQpIENvbXByZWhlbnNpdmUgSG91c2luZyBBZmZvcmRhYmlsaXR5IFN0cmF0ZWd5IGRhdGFzZXRgLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5odWR1c2VyLmdvdi9wb3J0YWwvZGF0YXNldHMvY3AuaHRtbGAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTMtMjAxN2AsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdXYXN0ZXdhdGVyIGRpc2NoYXJnZScsXG4gICAgZGVzY3JpcHRpb246IGBSU0VJIG1vZGVsZWQgVG94aWMgQ29uY2VudHJhdGlvbnMgYXQgc3RyZWFtIHNlZ21lbnRzIHdpdGhpbiA1MDAgXG4gICAgbWV0ZXJzLCBkaXZpZGVkIGJ5IGRpc3RhbmNlIGluIGtpbG9tZXRlcnMgKGttKS5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIFJpc2stU2NyZWVuaW5nIFxuICAgIEVudmlyb25tZW50YWwgSW5kaWNhdG9ycyAoUlNFSSkgTW9kZWwgYXMgY29tcGlsZWQgYnkgRVBBJ3MgRUpTQ1JFRU5gLFxuICAgIGRhdGFTb3VyY2VVUkw6IGBodHRwczovL3d3dy5lcGEuZ292L2Vqc2NyZWVuL3RlY2huaWNhbC1kb2N1bWVudGF0aW9uLWVqc2NyZWVuYCxcbiAgICBkYXRhRGF0ZVJhbmdlOiBgMjAyMGAsXG4gIH0sXG4gIHtcbiAgICBpbmRpY2F0b3I6ICdMZWFkIHBhaW50JyxcbiAgICBkZXNjcmlwdGlvbjogYFBlcmNlbnQgb2YgaG91c2luZyB1bml0cyBidWlsdCBwcmUtMTk2MCwgdXNlZCBhcyBhbiBcbiAgICBpbmRpY2F0b3Igb2YgcG90ZW50aWFsIGxlYWQgcGFpbnQgZXhwb3N1cmUgaW4gaG9tZXMuYCxcbiAgICBkYXRhUmVzb2x1dGlvbjogYENlbnN1cyBibG9jayBncm91cGAsXG4gICAgZGF0YVNvdXJjZUxhYmVsOiBgQ2Vuc3VzJ3MgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleWAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9hY3NgLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnRGllc2VsIHBhcnRpY3VsYXRlIG1hdHRlcicsXG4gICAgZGVzY3JpcHRpb246IGBNaXh0dXJlIG9mIHBhcnRpY2xlcyB0aGF0IGlzIHBhcnQgb2YgZGllc2VsIGV4aGF1c3QgaW4gdGhlIGFpci5gLFxuICAgIGRhdGFSZXNvbHV0aW9uOiBgQ2Vuc3VzIGJsb2NrIGdyb3VwYCxcbiAgICBkYXRhU291cmNlTGFiZWw6IGBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIE5hdGlvbmFsIEFpciBUb3hpY3MgQXNzZXNzbWVudCAoTkFUQSlcbiAgICBhcyBjb21waWxlZCBieSBFUEEncyBFSlNDUkVFTmAsXG4gICAgZGF0YVNvdXJjZVVSTDogYGh0dHBzOi8vd3d3LmVwYS5nb3YvZWpzY3JlZW4vdGVjaG5pY2FsLWRvY3VtZW50YXRpb24tZWpzY3JlZW5gLFxuICAgIGRhdGFEYXRlUmFuZ2U6IGA1LXllYXIgZXN0aW1hdGVzLCAyMDE1LTIwMTlgLFxuICB9LFxuICB7XG4gICAgaW5kaWNhdG9yOiAnUE0yLjUnLFxuICAgIGRlc2NyaXB0aW9uOiBgRmluZSBpbmhhbGFibGUgcGFydGljbGVzLCB3aXRoIGRpYW1ldGVycyB0aGF0IGFyZSBnZW5lcmFsbHkgXG4gICAgMi41IG1pY3JvbWV0ZXJzIGFuZCBzbWFsbGVyLmAsXG4gICAgZGF0YVJlc29sdXRpb246IGBDZW5zdXMgYmxvY2sgZ3JvdXBgLFxuICAgIGRhdGFTb3VyY2VMYWJlbDogYEVudmlyb25tZW50YWwgUHJvdGVjdGlvbiBBZ2VuY3kgKEVQQSkgT2ZmaWNlIG9mIEFpciBcbiAgICBhbmQgUmFkaWF0aW9uIChPQVIpIGZ1c2lvbiBvZiBtb2RlbCBhbmQgbW9uaXRvciBkYXRhIGFzIGNvbXBpbGVkIGJ5IEVQQSdzIEVKU0NSRUVOYCxcbiAgICBkYXRhU291cmNlVVJMOiBgaHR0cHM6Ly93d3cuZXBhLmdvdi9lanNjcmVlbi90ZWNobmljYWwtZG9jdW1lbnRhdGlvbi1lanNjcmVlbmAsXG4gICAgZGF0YURhdGVSYW5nZTogYDIwMTdgLFxuICB9LFxuXG5dO1xuXG5cbi8vIE1ldGhvZG9sb2d5IFN0ZXBzOlxuZXhwb3J0IGNvbnN0IE1FVEhPRE9MT0dZX1NURVBTID0gZGVmaW5lTWVzc2FnZXMoe1xuICBIRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwcy5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYE1ldGhvZG9sb2d5YCxcbiAgICBkZXNjcmlwdGlvbjogJ2hlYWRpbmcgb2YgbWV0aG9kb2xvZ3kgc2VjdGlvbicsXG4gIH0sXG4gIERFU0NSSVBUSU9OXzE6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXBzLmRlc2NyaXB0aW9uLjEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIG1ldGhvZG9sb2d5IGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cyBpcycrXG4gICAgICcgY2FsY3VsYXRlZCBhdCB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGxldmVsLiBDZW5zdXMgYmxvY2sgZ2VvZ3JhcGhpY2FsIGJvdW5kYXJpZXMnK1xuICAgICAnIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBVLlMuIENlbnN1cyBCdXJlYXUgb25jZSBldmVyeSB0ZW4geWVhcnMuIFRoaXMgdG9vbCB1dGlsaXplcycrXG4gICAgICcgdGhlIGNlbnN1cyBibG9jayBib3VuZGFyaWVzIGZyb20gMjAxMC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnZmlyc3QgZGVzY3JpcHRpb24gdGV4dCAnLFxuICB9LFxuICBERVNDUklQVElPTl8yOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwcy5kZXNjcmlwdGlvbi4yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBwcm9jZXNzIGZvciBpZGVudGlmeWluZyBjb21tdW5pdGllcyBvZiBmb2N1cy4nLFxuICAgIGRlc2NyaXB0aW9uOiAnc2Vjb25kIGRlc2NyaXB0aW9uIHRleHQnLFxuICB9LFxuICBTVEVQXzFfSEVBRElORzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgR2F0aGVyIGRhdGFzZXRzYCxcbiAgICBkZXNjcmlwdGlvbjogJ2ZpcnN0IHN0ZXAgaGVhZGluZycsXG4gIH0sXG4gIFNURVBfMV9JTkZPOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IGBUaGUgbWV0aG9kb2xvZ3kgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBpbnB1dHMgdGhhdCBhcmUgZXF1YWxseSB3ZWlnaHRlZC5gLFxuICAgIGRlc2NyaXB0aW9uOiAnZmlyc3Qgc3RlcCBpbmZvJyxcbiAgfSxcbiAgU1RFUF8xX0FfSEVBRElORzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmEuaGVhZGluZycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IGBQZXJjZW50IG9mIEFyZWEgTWVkaWFuIEluY29tZWAsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYSBoZWFkaW5nJyxcbiAgfSxcbiAgU1RFUF8xX0FfSU5GT18xOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYS5pbmZvLjEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgYSBjZW5zdXMgYmxvY2sgZ3JvdXAgaXMgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYSwgdGhpcyB2YWx1ZSBpcyB0aGUnK1xuICAgICcgbWVkaWFuIGluY29tZSBvZiB0aGUgY2Vuc3VzIGJsb2NrIGdyb3VwIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50IG9mJytcbiAgICAnIHRoZSBtZXRyb3BvbGl0YW4gYXJlYeKAmXMgbWVkaWFuIGluY29tZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnc3RlcCAxIGEgaW5mbyAxJyxcbiAgfSxcbiAgU1RFUF8xX0FfSU5GT18yOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYS5pbmZvLjInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSWYgYSBjZW5zdXMgYmxvY2sgZ3JvdXAgaXMgbm90IGluIGEgbWV0cm9wb2xpdGFuIGFyZWEsIHRoaXMgdmFsdWUgaXMgdGhlJytcbiAgICAnIG1lZGlhbiBpbmNvbWUgb2YgdGhlIGNlbnN1cyBibG9jayBncm91cCBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudCBvZiB0aGUgc3RhdGXigJlzIG1lZGlhbicrXG4gICAgJyBpbmNvbWUuJyxcbiAgICBkZXNjcmlwdGlvbjogJ3N0ZXAgMSBhIGluZm8gMicsXG4gIH0sXG4gIFNURVBfMV9CX0hFQURJTkc6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXAuMS5iLmhlYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgUGVyY2VudCBvZiBob3VzZWhvbGRzIGJlbG93IG9yIGF0IDEwMCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsaW5lYCxcbiAgICBkZXNjcmlwdGlvbjogJ3N0ZXAgMSBiIGhlYWRpbmcnLFxuICB9LFxuICBTVEVQXzFfQ19IRUFESU5HOiB7XG4gICAgaWQ6ICdtZXRob2RvbG9neS5zdGVwLjEuYy5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYFRoZSBoaWdoIHNjaG9vbCBkZWdyZWUgYWNoaWV2ZW1lbnQgcmF0ZSBmb3IgYWR1bHRzIDI1IHllYXJzIGFuZCBvbGRlcmAsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYSBoZWFkaW5nJyxcbiAgfSxcbiAgU1RFUF8xX0NfSU5GTzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4xLmMuaW5mbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgcGVyY2VudCBvZiBpbmRpdmlkdWFscyB3aG8gYXJlIDI1IG9yIG9sZGVyIHdobyBoYXZlIHJlY2VpdmVkIGEgaGlnaCBzY2hvb2wgZGVncmVlLicsXG4gICAgZGVzY3JpcHRpb246ICdzdGVwIDEgYyBpbmZvJyxcbiAgfSxcbiAgU1RFUF8yX0hFQURJTkc6IHtcbiAgICBpZDogJ21ldGhvZG9sb2d5LnN0ZXAuMi5oZWFkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogYERldGVybWluZSBjb21tdW5pdGVzIG9mIGZvY3VzYCxcbiAgICBkZXNjcmlwdGlvbjogJ3NlY29uZCBzdGVwIGhlYWRpbmcnLFxuICB9LFxuICBTVEVQXzJfSU5GTzoge1xuICAgIGlkOiAnbWV0aG9kb2xvZ3kuc3RlcC4yLmluZm8nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiBgVW5kZXIgdGhlIGV4aXN0aW5nIGZvcm11bGEsIGEgY2Vuc3VzIGJsb2NrIGdyb3VwIHdpbGwgYmUgY29uc2lkZXJlZCBhIGNvbW11bml0eSBvZiBmb2N1cyBpZjpgLFxuICAgIGRlc2NyaXB0aW9uOiAnc2Vjb25kIHN0ZXAgaW5mbycsXG4gIH0sXG59KTtcblxuY29uc3QgRkVEX1BPVkVSVFlfTElORV9VUkwgPSAnaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi90b3BpY3MvaW5jb21lLXBvdmVydHkvcG92ZXJ0eS9ndWlkYW5jZS9wb3ZlcnR5LW1lYXN1cmVzLmh0bWwnO1xuXG4vLyBDb3B5IHRoYXQgaGFzIGxpbmtzIG9yIG90aGVyIEhUTUwgdGFncyBpbiB0aGVtXG5leHBvcnQgY29uc3QgQ09NUExFWF9NRVRIX1NURVBTID0ge1xuICBTVEVQXzJfQl9JTkZPOiA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgIGlkPXsnbWV0aG9kb2xvZ3kuc3RlcHMuMi5iLmluZm8nfVxuICAgIGRlc2NyaXB0aW9uPXsnRG93bmxvYWQgdGhlIGRyYWZ0IGxpc3Qgb2YgY29tbXVuaXRpZXMgb2YgZm9jdXMgYW5kIGRhdGFzZXRzIHVzZWQuJ31cbiAgICBkZWZhdWx0TWVzc2FnZT17YFRoaXMgaXMgdGhlIHBlcmNlbnQgb2YgaG91c2Vob2xkcyBpbiBhIHN0YXRlIHdpdGggYSBob3VzZWhvbGQgaW5jb21lIFxuICAgIGJlbG93IG9yIGF0IDEwMCUgb2YgdGhlIHtmZWRlcmFsUG92ZXJ0eUxpbmV9LiBUaGlzIGZlZGVyYWwgcG92ZXJ0eSBsaW5lIGlzIGNhbGN1bGF0ZWQgXG4gICAgYmFzZWQgb24gdGhlIGNvbXBvc2l0aW9uIG9mIGVhY2ggaG91c2Vob2xkIChlLmcuLCBiYXNlZCBvbiBob3VzZWhvbGQgc2l6ZSksIGJ1dCBpdCBkb2VzIG5vdCB2YXJ5IGdlb2dyYXBoaWNhbGx5LmB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBmZWRlcmFsUG92ZXJ0eUxpbmU6XG4gICAgICA8YSBocmVmPXtGRURfUE9WRVJUWV9MSU5FX1VSTH0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICBmZWRlcmFsIHBvdmVydHkgbGluZVxuICAgICAgPC9hPixcbiAgICB9fVxuICAvPixcbiAgRk9STVVMQTogPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICBpZD17J21ldGhvZG9sb2d5LnN0ZXBzLjIuZm9ybXVsYSd9XG4gICAgZGVzY3JpcHRpb249eydGb3JtYWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbW11bml0aWVzIG9mIGZvY3VzJ31cbiAgICBkZWZhdWx0TWVzc2FnZT17YHttZWRpYW5JbmNvbWV9IHtvcn0ge2xpdmluZ0F0UG92ZXJ5fSB7YW5kfSB7ZWR1Y2F0aW9ufWB9XG4gICAgdmFsdWVzPXt7XG4gICAgICBtZWRpYW5JbmNvbWU6XG4gICAgICAgIDxwPlxuICAgICAgICAgKFRoZSBtZWRpYW4gaW5jb21lIGlzIGxlc3MgdGhhbiA4MCUgb2YgdGhlIGFyZWEgbWVkaWFuIGluY29tZVxuICAgICAgICA8L3A+LFxuICAgICAgb3I6XG4gICAgICAgIDxwIGNsYXNzTmFtZT17J2ZsdXNoJ30+XG4gICAgICAgICAgT1JcbiAgICAgICAgPC9wPixcbiAgICAgIGxpdmluZ0F0UG92ZXJ5OlxuICAgICAgICA8cCBjbGFzc05hbWU9eydmbHVzaCd9PlxuICAgICAgICAgIGhvdXNlaG9sZHMgbGl2aW5nIGluIHBvdmVydHkgKGF0IG9yIGJlbG93IDEwMCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsZXZlbCkgaXMgZ3JlYXRlciB0aGFuIDIwJSlcbiAgICAgICAgPC9wPixcbiAgICAgIGFuZDpcbiAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmx1c2gnfT5cbiAgICAgICAgICBBTkRcbiAgICAgICAgPC9wPixcbiAgICAgIGVkdWNhdGlvbjpcbiAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmx1c2gnfT5cbiAgICAgICAgICBUaGUgaGlnaCBzY2hvb2wgZGVncmVlIGFjaGlldmVtZW50IHJhdGUgZm9yIGFkdWx0cyAyNSB5ZWFycyBhbmQgb2xkZXIgaXMgZ3JlYXRlciB0aGFuIDk1JVxuICAgICAgICA8L3A+LFxuICAgIH19XG4gIC8+LFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5345\n')},1095:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "default": function() { return /* binding */ pages_methodology; }\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/@trussworks/react-uswds/lib/index.js\nvar lib = __webpack_require__(2593);\n// EXTERNAL MODULE: ./node_modules/gatsby-plugin-intl/index.js\nvar gatsby_plugin_intl = __webpack_require__(9703);\n// EXTERNAL MODULE: ./src/components/AlertWrapper/index.tsx + 1 modules\nvar AlertWrapper = __webpack_require__(6780);\n;// CONCATENATED MODULE: ./src/components/DatasetCard/datasetCard.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetCard = "datasetCard-module--datasetCard--26okZ";\nvar datasetCardAdditional = "datasetCard-module--datasetCardAdditional--tbj7T";\nvar datasetCardIndicator = "datasetCard-module--datasetCardIndicator--14lIn";\nvar datasetCardWhatIsIt = "datasetCard-module--datasetCardWhatIsIt--2J87w";\nvar datasetCardList = "datasetCard-module--datasetCardList--Ok3_o";\nvar datasetCardListItem = "datasetCard-module--datasetCardListItem--rMDxc";\nvar datasetCardDescription = "datasetCard-module--datasetCardDescription--2agib";\nvar datasetCardLabels = "datasetCard-module--datasetCardLabels--3jLC0";\n// EXTERNAL MODULE: ./src/data/copy/methodology.tsx\nvar methodology = __webpack_require__(5345);\n;// CONCATENATED MODULE: ./src/components/DatasetCard/index.tsx\nvar DatasetCard=function DatasetCard(_ref){var datasetCardProps=_ref.datasetCardProps,additionalIndicator=_ref.additionalIndicator;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement("div",{className:additionalIndicator?datasetCardAdditional:datasetCard},/*#__PURE__*/react.createElement("h3",{className:datasetCardIndicator},datasetCardProps.indicator),/*#__PURE__*/react.createElement("div",{className:datasetCardDescription},datasetCardProps.description),/*#__PURE__*/react.createElement("ul",{className:datasetCardList},/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(methodology/* DATASET_CARD_LABELS.SOURCE */.it.SOURCE)),/*#__PURE__*/react.createElement("a",{href:datasetCardProps.dataSourceURL,target:\'_blank\',rel:"noreferrer"},datasetCardProps.dataSourceLabel)),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(methodology/* DATASET_CARD_LABELS.RESOLUTION */.it.RESOLUTION)),datasetCardProps.dataResolution),/*#__PURE__*/react.createElement("li",{className:datasetCardListItem},/*#__PURE__*/react.createElement("span",{className:datasetCardLabels},intl.formatMessage(methodology/* DATASET_CARD_LABELS.DATE_RANGE */.it.DATE_RANGE)),datasetCardProps.dataDateRange)));};/* harmony default export */ var components_DatasetCard = (DatasetCard);\n// EXTERNAL MODULE: ./src/components/J40MainGridContainer.tsx\nvar J40MainGridContainer = __webpack_require__(6445);\n// EXTERNAL MODULE: ./cypress/integration/common/helpers.js\nvar helpers = __webpack_require__(2900);\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/dsContainer.module.scss\n// extracted by mini-css-extract-plugin\nvar datasetCardsContainer = "dsContainer-module--datasetCardsContainer--129oj";\n;// CONCATENATED MODULE: ./src/components/DatasetContainer/index.tsx\nvar DatasetContainer=function DatasetContainer(){var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true,blueBackground:true},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{dataCy:(0,helpers/* hyphenizeString */.d)(methodology/* DATASETS.HEADING.defaultMessage */.mj.HEADING.defaultMessage)+"-block"},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:12},/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:false,showLimitedDataAlert:true}),/*#__PURE__*/react.createElement("h2",null,intl.formatMessage(methodology/* DATASETS.HEADING */.mj.HEADING)))),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:7},className:\'j40-mb-3\'},/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* DATASETS.INFO */.mj.INFO)))),/*#__PURE__*/react.createElement("div",{className:datasetCardsContainer},methodology/* INDICATORS.map */._F.map(function(card){return/*#__PURE__*/react.createElement(components_DatasetCard,{key:card.indicator,datasetCardProps:card,additionalIndicator:false});})))),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{fullWidth:true,blueBackground:false},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,{dataCy:(0,helpers/* hyphenizeString */.d)(methodology/* DATASETS.ADDITIONAL_HEADING.defaultMessage */.mj.ADDITIONAL_HEADING.defaultMessage)+"-block"},/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:12},/*#__PURE__*/react.createElement("h2",null,intl.formatMessage(methodology/* DATASETS.ADDITIONAL_HEADING */.mj.ADDITIONAL_HEADING)))),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:7},className:\'j40-mb-3\'},/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* DATASETS.ADDITIONAL_INFO */.mj.ADDITIONAL_INFO)))),/*#__PURE__*/react.createElement("div",{className:datasetCardsContainer},methodology/* ADDITIONAL_INDICATORS.map */.RN.map(function(card){return/*#__PURE__*/react.createElement(components_DatasetCard,{key:card.indicator,datasetCardProps:card,additionalIndicator:true});})))));};/* harmony default export */ var components_DatasetContainer = (DatasetContainer);\n;// CONCATENATED MODULE: ./src/components/DownloadPacket/downloadPacket.module.scss\n// extracted by mini-css-extract-plugin\nvar downloadBoxContainer = "downloadPacket-module--downloadBoxContainer--UoPKM";\nvar downloadBox = "downloadPacket-module--downloadBox--2-B6M";\nvar downloadBoxTextBox = "downloadPacket-module--downloadBoxTextBox--Z0Akn";\nvar downloadBoxTitle = "downloadPacket-module--downloadBoxTitle--337bU";\nvar downloadBoxText = "downloadPacket-module--downloadBoxText--5qHMU";\nvar downloadBoxButtonContainer = "downloadPacket-module--downloadBoxButtonContainer--38z4b";\nvar downloadBoxButton = "downloadPacket-module--downloadBoxButton--dtKkR";\nvar downloadPacketText = "downloadPacket-module--downloadPacketText--2LLgi";\n;// CONCATENATED MODULE: ./node_modules/uswds/dist/img/usa-icons/file_download.svg\n/* harmony default export */ var file_download = ("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz48L3N2Zz4=");\n;// CONCATENATED MODULE: ./src/components/DownloadPacket/index.tsx\n// @ts-ignore\nvar DownloadPacket=function DownloadPacket(){return/*#__PURE__*/react.createElement(lib.Grid,null,/*#__PURE__*/react.createElement("div",{className:downloadBoxContainer},/*#__PURE__*/react.createElement("div",{className:downloadBox},/*#__PURE__*/react.createElement("div",{className:downloadBoxTextBox},/*#__PURE__*/react.createElement("div",{className:downloadBoxTitle},methodology/* DOWNLOAD_PACKAGE.TITLE */.uh.TITLE),/*#__PURE__*/react.createElement("div",{className:downloadBoxText},methodology/* DOWNLOAD_PACKAGE.DESCRIPTION */.uh.DESCRIPTION,\' \',/*#__PURE__*/react.createElement("span",null,methodology/* DOWNLOAD_PACKAGE.LAST_UPDATED */.uh.LAST_UPDATED)),/*#__PURE__*/react.createElement("div",{className:downloadBoxButtonContainer},/*#__PURE__*/react.createElement("a",{"data-cy":\'download-link\',href:methodology/* DOWNLOAD_ZIP_URL */.iV},/*#__PURE__*/react.createElement(lib.Button,{className:downloadBoxButton,type:"button"},/*#__PURE__*/react.createElement("div",null,/*#__PURE__*/react.createElement("img",{src:file_download,alt:\'download icon for download package\'})),/*#__PURE__*/react.createElement("div",{className:downloadPacketText},methodology/* DOWNLOAD_PACKAGE.BUTTON_TEXT */.uh.BUTTON_TEXT))))))));};/* harmony default export */ var components_DownloadPacket = (DownloadPacket);\n// EXTERNAL MODULE: ./src/components/layout.tsx + 5 modules\nvar layout = __webpack_require__(5614);\n;// CONCATENATED MODULE: ./src/components/scoreStepsList.tsx\nvar ScoreStepsList=function ScoreStepsList(){var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(react.Fragment,null,/*#__PURE__*/react.createElement("h2",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.HEADING */.Zr.HEADING)),/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:7},/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.DESCRIPTION_1 */.Zr.DESCRIPTION_1)),/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.DESCRIPTION_2 */.Zr.DESCRIPTION_2)))),/*#__PURE__*/react.createElement(lib.ProcessList,null,/*#__PURE__*/react.createElement(lib.ProcessListItem,null,/*#__PURE__*/react.createElement(lib.ProcessListHeading,{type:"h3"},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_HEADING */.Zr.STEP_1_HEADING)),/*#__PURE__*/react.createElement("p",null,\' \'),/*#__PURE__*/react.createElement("p",{className:\'flush\'},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_INFO */.Zr.STEP_1_INFO)),/*#__PURE__*/react.createElement("h4",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_A_HEADING */.Zr.STEP_1_A_HEADING)),/*#__PURE__*/react.createElement("p",{className:\'flush\'},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_A_INFO_1 */.Zr.STEP_1_A_INFO_1)),/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_A_INFO_2 */.Zr.STEP_1_A_INFO_2)),/*#__PURE__*/react.createElement("h4",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_B_HEADING */.Zr.STEP_1_B_HEADING)),methodology/* COMPLEX_METH_STEPS.STEP_2_B_INFO */.KZ.STEP_2_B_INFO,/*#__PURE__*/react.createElement("h4",null,intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_C_HEADING */.Zr.STEP_1_C_HEADING)),/*#__PURE__*/react.createElement("p",{className:\'flush\'},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_1_C_INFO */.Zr.STEP_1_C_INFO))),/*#__PURE__*/react.createElement(lib.ProcessListItem,null,/*#__PURE__*/react.createElement(lib.ProcessListHeading,{type:"h3"},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_2_HEADING */.Zr.STEP_2_HEADING)),/*#__PURE__*/react.createElement("p",null,\' \'),/*#__PURE__*/react.createElement("p",{className:\'flush\'},intl.formatMessage(methodology/* METHODOLOGY_STEPS.STEP_2_INFO */.Zr.STEP_2_INFO)),methodology/* COMPLEX_METH_STEPS.FORMULA */.KZ.FORMULA)));};/* harmony default export */ var scoreStepsList = (ScoreStepsList);\n;// CONCATENATED MODULE: ./src/pages/methodology.tsx\n// markup\nvar IndexPage=function IndexPage(_ref){var location=_ref.location;var intl=(0,gatsby_plugin_intl.useIntl)();return/*#__PURE__*/react.createElement(layout/* default */.Z,{location:location,title:intl.formatMessage(methodology/* PAGE.TILE */.qX.TILE)},/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(AlertWrapper/* default */.Z,{showBetaAlert:true,showLimitedDataAlert:false})),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement("h1",null,intl.formatMessage(methodology/* PAGE.HEADING */.qX.HEADING)),/*#__PURE__*/react.createElement(lib.Grid,{row:true,gap:true,className:\'j40-mb-5\'},/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:6}},/*#__PURE__*/react.createElement("section",null,/*#__PURE__*/react.createElement("p",null,intl.formatMessage(methodology/* PAGE.DESCRIPTION */.qX.DESCRIPTION)))),/*#__PURE__*/react.createElement(lib.Grid,{col:12,tablet:{col:6}},/*#__PURE__*/react.createElement(components_DownloadPacket,null)))),/*#__PURE__*/react.createElement(components_DatasetContainer,null),/*#__PURE__*/react.createElement(J40MainGridContainer/* default */.Z,null,/*#__PURE__*/react.createElement(lib.Grid,{row:true},/*#__PURE__*/react.createElement(lib.Grid,{col:true},/*#__PURE__*/react.createElement(scoreStepsList,null)))));};/* harmony default export */ var pages_methodology = (IndexPage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDYXJkL2RhdGFzZXRDYXJkLm1vZHVsZS5zY3NzPzFkYjUiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9EYXRhc2V0Q2FyZC9pbmRleC50c3g/NTBlYyIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvZHNDb250YWluZXIubW9kdWxlLnNjc3M/YzMzOCIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9jb21wb25lbnRzL0RhdGFzZXRDb250YWluZXIvaW5kZXgudHN4PzBjN2QiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9Eb3dubG9hZFBhY2tldC9kb3dubG9hZFBhY2tldC5tb2R1bGUuc2Nzcz85ZTUwIiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vbm9kZV9tb2R1bGVzL3Vzd2RzL2Rpc3QvaW1nL3VzYS1pY29ucy9maWxlX2Rvd25sb2FkLnN2Zz8yMjc5Iiwid2VicGFjazovL2p1c3RpY2U0MC10b29sLy4vc3JjL2NvbXBvbmVudHMvRG93bmxvYWRQYWNrZXQvaW5kZXgudHN4Pzc2MGQiLCJ3ZWJwYWNrOi8vanVzdGljZTQwLXRvb2wvLi9zcmMvY29tcG9uZW50cy9zY29yZVN0ZXBzTGlzdC50c3g/ODQ1NiIsIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL3NyYy9wYWdlcy9tZXRob2RvbG9neS50c3g/OTQ3MCJdLCJuYW1lcyI6WyJEYXRhc2V0Q2FyZCIsImRhdGFzZXRDYXJkUHJvcHMiLCJhZGRpdGlvbmFsSW5kaWNhdG9yIiwiaW50bCIsInVzZUludGwiLCJzdHlsZXMiLCJpbmRpY2F0b3IiLCJkZXNjcmlwdGlvbiIsImZvcm1hdE1lc3NhZ2UiLCJNRVRIT0RPTE9HWV9DT1BZIiwiZGF0YVNvdXJjZVVSTCIsImRhdGFTb3VyY2VMYWJlbCIsImRhdGFSZXNvbHV0aW9uIiwiZGF0YURhdGVSYW5nZSIsIkRhdGFzZXRDb250YWluZXIiLCJoeXBoZW5pemVTdHJpbmciLCJjb2wiLCJjYXJkIiwiRG93bmxvYWRQYWNrZXQiLCJkb3dubG9hZEljb24iLCJTY29yZVN0ZXBzTGlzdCIsIkluZGV4UGFnZSIsImxvY2F0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RTs7OztBQ0dQLEdBQU1BLFlBQVcsQ0FBRyxRQUFkQSxZQUFjLE1BQStELElBQTdEQyxpQkFBNkQsTUFBN0RBLGdCQUE2RCxDQUEzQ0MsbUJBQTJDLE1BQTNDQSxtQkFBMkMsQ0FDakYsR0FBTUMsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUVBLG1CQUNFLDJCQUFLLFNBQVMsQ0FBRUYsbUJBQW1CLENBQUdHLHFCQUFILENBQWtDQSxXQUFyRSxlQUNFLDBCQUFJLFNBQVMsQ0FBRUEsb0JBQWYsRUFBNkNKLGdCQUFnQixDQUFDSyxTQUE5RCxDQURGLGNBRUUsMkJBQUssU0FBUyxDQUFFRCxzQkFBaEIsRUFDR0osZ0JBQWdCLENBQUNNLFdBRHBCLENBRkYsY0FNRSwwQkFBSSxTQUFTLENBQUVGLGVBQWYsZUFDRSwwQkFBSSxTQUFTLENBQUVBLG1CQUFmLGVBQ0UsNEJBQU0sU0FBUyxDQUFFQSxpQkFBakIsRUFDR0YsSUFBSSxDQUFDSyxhQUFMLENBQW1CQyxxREFBbkIsQ0FESCxDQURGLGNBSUUseUJBQUcsSUFBSSxDQUFFUixnQkFBZ0IsQ0FBQ1MsYUFBMUIsQ0FBeUMsTUFBTSxDQUFFLFFBQWpELENBQTJELEdBQUcsQ0FBQyxZQUEvRCxFQUNHVCxnQkFBZ0IsQ0FBQ1UsZUFEcEIsQ0FKRixDQURGLGNBU0UsMEJBQUksU0FBUyxDQUFFTixtQkFBZixlQUNFLDRCQUFNLFNBQVMsQ0FBRUEsaUJBQWpCLEVBQ0dGLElBQUksQ0FBQ0ssYUFBTCxDQUFtQkMsNkRBQW5C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LE1BQS9CQSxRQUErQixDQUNqRCxHQUFNbkIsS0FBSSxDQUFHQyw4QkFBTyxFQUFwQixDQUVBLG1CQUNFLG9CQUFDLHFCQUFELEVBQVEsUUFBUSxDQUFFa0IsUUFBbEIsQ0FBNEIsS0FBSyxDQUFFbkIsSUFBSSxDQUFDSyxhQUFMLENBQW1CQyxrQ0FBbkIsQ0FBbkMsZUFFRSxvQkFBQyxtQ0FBRCxtQkFDRSxvQkFBQywyQkFBRCxFQUFjLGFBQWEsQ0FBRSxJQUE3QixDQUFtQyxvQkFBb0IsQ0FBRSxLQUF6RCxFQURGLENBRkYsY0FNRSxvQkFBQyxtQ0FBRCxtQkFDRSw4QkFBS04sSUFBSSxDQUFDSyxhQUFMLENBQW1CQyx3Q0FBbkIsQ0FBTCxDQURGLGNBRUUsb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxDQUFVLEdBQUcsS0FBYixDQUFjLFNBQVMsQ0FBRSxVQUF6QixlQUNFLG9CQUFDLFFBQUQsRUFBTSxHQUFHLENBQUUsRUFBWCxDQUFlLE1BQU0sQ0FBRSxDQUFDTyxHQUFHLENBQUUsQ0FBTixDQUF2QixlQUNFLGdEQUNFLDZCQUNHYixJQUFJLENBQUNLLGFBQUwsQ0FBbUJDLGdEQUFuQixDQURILENBREYsQ0FERixDQURGLGNBUUUsb0JBQUMsUUFBRCxFQUFNLEdBQUcsQ0FBRSxFQUFYLENBQWUsTUFBTSxDQUFFLENBQUNPLEdBQUcsQ0FBRSxDQUFOLENBQXZCLGVBQ0Usb0JBQUMseUJBQUQsTUFERixDQVJGLENBRkYsQ0FORixjQXNCRSxvQkFBQywyQkFBRCxNQXRCRixjQXdCRSxvQkFBQyxtQ0FBRCxtQkFDRSxvQkFBQyxRQUFELEVBQU0sR0FBRyxLQUFULGVBQ0Usb0JBQUMsUUFBRCxFQUFNLEdBQUcsS0FBVCxlQUNFLG9CQUFDLGNBQUQsTUFERixDQURGLENBREYsQ0F4QkYsQ0FERixDQWtDRCxDQXJDRCxDQXVDQSxzREFBZUssU0FBZiIsImZpbGUiOiIxMDk1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkLS0yNm9rWlwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZEFkZGl0aW9uYWwgPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmRBZGRpdGlvbmFsLS10Ymo3VFwiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZEluZGljYXRvciA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZEluZGljYXRvci0tMTRsSW5cIjtcbmV4cG9ydCB2YXIgZGF0YXNldENhcmRXaGF0SXNJdCA9IFwiZGF0YXNldENhcmQtbW9kdWxlLS1kYXRhc2V0Q2FyZFdoYXRJc0l0LS0ySjg3d1wiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZExpc3QgPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmRMaXN0LS1PazNfb1wiO1xuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZExpc3RJdGVtID0gXCJkYXRhc2V0Q2FyZC1tb2R1bGUtLWRhdGFzZXRDYXJkTGlzdEl0ZW0tLXJNRHhjXCI7XG5leHBvcnQgdmFyIGRhdGFzZXRDYXJkRGVzY3JpcHRpb24gPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmREZXNjcmlwdGlvbi0tMmFnaWJcIjtcbmV4cG9ydCB2YXIgZGF0YXNldENhcmRMYWJlbHMgPSBcImRhdGFzZXRDYXJkLW1vZHVsZS0tZGF0YXNldENhcmRMYWJlbHMtLTNqTEMwXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vZGF0YXNldENhcmQubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgTUVUSE9ET0xPR1lfQ09QWSBmcm9tICcuLi8uLi9kYXRhL2NvcHkvbWV0aG9kb2xvZ3knO1xuXG5pbnRlcmZhY2UgSURhdGFzZXRDYXJkUHJvcHMge1xuICBkYXRhc2V0Q2FyZFByb3BzOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH1cbiAgYWRkaXRpb25hbEluZGljYXRvcjogYm9vbGVhblxufVxuXG5jb25zdCBEYXRhc2V0Q2FyZCA9ICh7ZGF0YXNldENhcmRQcm9wcywgYWRkaXRpb25hbEluZGljYXRvcn06SURhdGFzZXRDYXJkUHJvcHMpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXthZGRpdGlvbmFsSW5kaWNhdG9yID8gc3R5bGVzLmRhdGFzZXRDYXJkQWRkaXRpb25hbCA6IHN0eWxlcy5kYXRhc2V0Q2FyZH0+XG4gICAgICA8aDMgY2xhc3NOYW1lPXtzdHlsZXMuZGF0YXNldENhcmRJbmRpY2F0b3J9PntkYXRhc2V0Q2FyZFByb3BzLmluZGljYXRvcn08L2gzPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZERlc2NyaXB0aW9ufT5cbiAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGVzY3JpcHRpb259XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHVsIGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkTGlzdH0+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuREFUQVNFVF9DQVJEX0xBQkVMUy5TT1VSQ0UpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YSBocmVmPXtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VVUkx9IHRhcmdldD17J19ibGFuayd9IHJlbD1cIm5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgIHtkYXRhc2V0Q2FyZFByb3BzLmRhdGFTb3VyY2VMYWJlbH1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuREFUQVNFVF9DQVJEX0xBQkVMUy5SRVNPTFVUSU9OKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGF0YVJlc29sdXRpb259XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExpc3RJdGVtfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5kYXRhc2V0Q2FyZExhYmVsc30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuREFUQVNFVF9DQVJEX0xBQkVMUy5EQVRFX1JBTkdFKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2RhdGFzZXRDYXJkUHJvcHMuZGF0YURhdGVSYW5nZX1cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhc2V0Q2FyZDtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHZhciBkYXRhc2V0Q2FyZHNDb250YWluZXIgPSBcImRzQ29udGFpbmVyLW1vZHVsZS0tZGF0YXNldENhcmRzQ29udGFpbmVyLS0xMjlvalwiOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5pbXBvcnQge0dyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW1wb3J0IEFsZXJ0V3JhcHBlciBmcm9tICcuLi9BbGVydFdyYXBwZXInO1xuaW1wb3J0IERhdGFzZXRDYXJkIGZyb20gJy4uL0RhdGFzZXRDYXJkJztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9KNDBNYWluR3JpZENvbnRhaW5lcic7XG5pbXBvcnQge2h5cGhlbml6ZVN0cmluZ30gZnJvbSAnLi4vLi4vLi4vY3lwcmVzcy9pbnRlZ3JhdGlvbi9jb21tb24vaGVscGVycyc7XG5cbmltcG9ydCAqIGFzIHN0eWxlcyBmcm9tICcuL2RzQ29udGFpbmVyLm1vZHVsZS5zY3NzJztcbmltcG9ydCAqIGFzIE1FVEhPRE9MT0dZX0NPUFkgZnJvbSAnLi4vLi4vZGF0YS9jb3B5L21ldGhvZG9sb2d5JztcblxuXG5jb25zdCBEYXRhc2V0Q29udGFpbmVyID0gKCkgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxKNDBNYWluR3JpZENvbnRhaW5lciBmdWxsV2lkdGg9e3RydWV9IGJsdWVCYWNrZ3JvdW5kPXt0cnVlfT5cbiAgICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyXG4gICAgICAgICAgZGF0YUN5PXtgJHtoeXBoZW5pemVTdHJpbmcoTUVUSE9ET0xPR1lfQ09QWS5EQVRBU0VUUy5IRUFESU5HLmRlZmF1bHRNZXNzYWdlKX0tYmxvY2tgfT5cblxuICAgICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICAgIDxHcmlkIGNvbD17MTJ9PlxuICAgICAgICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e2ZhbHNlfSBzaG93TGltaXRlZERhdGFBbGVydD17dHJ1ZX0vPlxuICAgICAgICAgICAgICA8aDI+e2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLkRBVEFTRVRTLkhFQURJTkcpfTwvaDI+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9HcmlkPlxuXG4gICAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgICAgPEdyaWQgY29sPXsxMn0gdGFibGV0PXt7Y29sOiA3fX0gY2xhc3NOYW1lPXsnajQwLW1iLTMnfT5cbiAgICAgICAgICAgICAgPHA+e2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLkRBVEFTRVRTLklORk8pfTwvcD5cbiAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkc0NvbnRhaW5lcn0+XG4gICAgICAgICAgICB7TUVUSE9ET0xPR1lfQ09QWS5JTkRJQ0FUT1JTLm1hcCgoY2FyZCkgPT4gPERhdGFzZXRDYXJkXG4gICAgICAgICAgICAgIGtleT17Y2FyZC5pbmRpY2F0b3J9XG4gICAgICAgICAgICAgIGRhdGFzZXRDYXJkUHJvcHM9e2NhcmR9XG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxJbmRpY2F0b3I9e2ZhbHNlfVxuICAgICAgICAgICAgLz4pfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvSjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXIgZnVsbFdpZHRoPXt0cnVlfSBibHVlQmFja2dyb3VuZD17ZmFsc2V9ID5cbiAgICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyXG4gICAgICAgICAgZGF0YUN5PXtgJHtoeXBoZW5pemVTdHJpbmcoTUVUSE9ET0xPR1lfQ09QWS5EQVRBU0VUUy5BRERJVElPTkFMX0hFQURJTkcuZGVmYXVsdE1lc3NhZ2UpfS1ibG9ja2B9PlxuXG4gICAgICAgICAgPEdyaWQgcm93PlxuICAgICAgICAgICAgPEdyaWQgY29sPXsxMn0+XG4gICAgICAgICAgICAgIDxoMj57aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuREFUQVNFVFMuQURESVRJT05BTF9IRUFESU5HKX08L2gyPlxuICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDwvR3JpZD5cblxuICAgICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICAgIDxHcmlkIGNvbD17MTJ9IHRhYmxldD17e2NvbDogN319IGNsYXNzTmFtZT17J2o0MC1tYi0zJ30+XG4gICAgICAgICAgICAgIDxwPntpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5EQVRBU0VUUy5BRERJVElPTkFMX0lORk8pfTwvcD5cbiAgICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICA8L0dyaWQ+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRhdGFzZXRDYXJkc0NvbnRhaW5lcn0+XG4gICAgICAgICAgICB7TUVUSE9ET0xPR1lfQ09QWS5BRERJVElPTkFMX0lORElDQVRPUlMubWFwKChjYXJkKSA9PiA8RGF0YXNldENhcmRcbiAgICAgICAgICAgICAga2V5PXtjYXJkLmluZGljYXRvcn1cbiAgICAgICAgICAgICAgZGF0YXNldENhcmRQcm9wcz17Y2FyZH1cbiAgICAgICAgICAgICAgYWRkaXRpb25hbEluZGljYXRvcj17dHJ1ZX1cbiAgICAgICAgICAgIC8+KX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L0o0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFzZXRDb250YWluZXI7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB2YXIgZG93bmxvYWRCb3hDb250YWluZXIgPSBcImRvd25sb2FkUGFja2V0LW1vZHVsZS0tZG93bmxvYWRCb3hDb250YWluZXItLVVvUEtNXCI7XG5leHBvcnQgdmFyIGRvd25sb2FkQm94ID0gXCJkb3dubG9hZFBhY2tldC1tb2R1bGUtLWRvd25sb2FkQm94LS0yLUI2TVwiO1xuZXhwb3J0IHZhciBkb3dubG9hZEJveFRleHRCb3ggPSBcImRvd25sb2FkUGFja2V0LW1vZHVsZS0tZG93bmxvYWRCb3hUZXh0Qm94LS1aMEFrblwiO1xuZXhwb3J0IHZhciBkb3dubG9hZEJveFRpdGxlID0gXCJkb3dubG9hZFBhY2tldC1tb2R1bGUtLWRvd25sb2FkQm94VGl0bGUtLTMzN2JVXCI7XG5leHBvcnQgdmFyIGRvd25sb2FkQm94VGV4dCA9IFwiZG93bmxvYWRQYWNrZXQtbW9kdWxlLS1kb3dubG9hZEJveFRleHQtLTVxSE1VXCI7XG5leHBvcnQgdmFyIGRvd25sb2FkQm94QnV0dG9uQ29udGFpbmVyID0gXCJkb3dubG9hZFBhY2tldC1tb2R1bGUtLWRvd25sb2FkQm94QnV0dG9uQ29udGFpbmVyLS0zOHo0YlwiO1xuZXhwb3J0IHZhciBkb3dubG9hZEJveEJ1dHRvbiA9IFwiZG93bmxvYWRQYWNrZXQtbW9kdWxlLS1kb3dubG9hZEJveEJ1dHRvbi0tZHRLa1JcIjtcbmV4cG9ydCB2YXIgZG93bmxvYWRQYWNrZXRUZXh0ID0gXCJkb3dubG9hZFBhY2tldC1tb2R1bGUtLWRvd25sb2FkUGFja2V0VGV4dC0tMkxMZ2lcIjsiLCJleHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlHaGxhV2RvZEQwaU1qUWlJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnZDJsa2RHZzlJakkwSWo0OGNHRjBhQ0JrUFNKTk1DQXdhREkwZGpJMFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K1BIQmhkR2dnWkQwaVRURTVJRGxvTFRSV00wZzVkalpJTld3M0lEY2dOeTAzZWswMUlERTRkakpvTVRSMkxUSklOWG9pTHo0OEwzTjJaejQ9XCIiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtCdXR0b24sIEdyaWR9IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcblxuaW1wb3J0ICogYXMgc3R5bGVzIGZyb20gJy4vZG93bmxvYWRQYWNrZXQubW9kdWxlLnNjc3MnO1xuaW1wb3J0ICogYXMgTUVUSE9ET0xPR1lfQ09QWSBmcm9tICcuLi8uLi9kYXRhL2NvcHkvbWV0aG9kb2xvZ3knO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZG93bmxvYWRJY29uIGZyb20gJy9ub2RlX21vZHVsZXMvdXN3ZHMvZGlzdC9pbWcvdXNhLWljb25zL2ZpbGVfZG93bmxvYWQuc3ZnJztcblxuY29uc3QgRG93bmxvYWRQYWNrZXQgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQ+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRvd25sb2FkQm94Q29udGFpbmVyfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kb3dubG9hZEJveH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kb3dubG9hZEJveFRleHRCb3h9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kb3dubG9hZEJveFRpdGxlfT5cbiAgICAgICAgICAgICAge01FVEhPRE9MT0dZX0NPUFkuRE9XTkxPQURfUEFDS0FHRS5USVRMRX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5kb3dubG9hZEJveFRleHR9PlxuICAgICAgICAgICAgICB7TUVUSE9ET0xPR1lfQ09QWS5ET1dOTE9BRF9QQUNLQUdFLkRFU0NSSVBUSU9OfVxuICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICB7TUVUSE9ET0xPR1lfQ09QWS5ET1dOTE9BRF9QQUNLQUdFLkxBU1RfVVBEQVRFRH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmRvd25sb2FkQm94QnV0dG9uQ29udGFpbmVyfT5cbiAgICAgICAgICAgICAgPGEgZGF0YS1jeT17J2Rvd25sb2FkLWxpbmsnfSBocmVmPXtNRVRIT0RPTE9HWV9DT1BZLkRPV05MT0FEX1pJUF9VUkx9PlxuICAgICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPXtzdHlsZXMuZG93bmxvYWRCb3hCdXR0b259IHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPXtkb3dubG9hZEljb259IGFsdD17J2Rvd25sb2FkIGljb24gZm9yIGRvd25sb2FkIHBhY2thZ2UnfS8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuZG93bmxvYWRQYWNrZXRUZXh0fT5cbiAgICAgICAgICAgICAgICAgICAge01FVEhPRE9MT0dZX0NPUFkuRE9XTkxPQURfUEFDS0FHRS5CVVRUT05fVEVYVH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEb3dubG9hZFBhY2tldDtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBQcm9jZXNzTGlzdCxcbiAgUHJvY2Vzc0xpc3RJdGVtLFxuICBQcm9jZXNzTGlzdEhlYWRpbmcsXG4gIEdyaWQsXG59IGZyb20gJ0B0cnVzc3dvcmtzL3JlYWN0LXVzd2RzJztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAnZ2F0c2J5LXBsdWdpbi1pbnRsJztcblxuaW1wb3J0ICogYXMgTUVUSE9ET0xPR1lfQ09QWSBmcm9tICcuLi9kYXRhL2NvcHkvbWV0aG9kb2xvZ3knO1xuXG5jb25zdCBTY29yZVN0ZXBzTGlzdCA9ICgpID0+IHtcbiAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8aDI+XG4gICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5NRVRIT0RPTE9HWV9TVEVQUy5IRUFESU5HKX1cbiAgICAgIDwvaDI+XG4gICAgICA8R3JpZCByb3c+XG4gICAgICAgIDxHcmlkIGNvbD17N30+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuTUVUSE9ET0xPR1lfU1RFUFMuREVTQ1JJUFRJT05fMSl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLk1FVEhPRE9MT0dZX1NURVBTLkRFU0NSSVBUSU9OXzIpfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9HcmlkPlxuXG4gICAgICA8UHJvY2Vzc0xpc3Q+XG5cbiAgICAgICAgey8qIFN0ZXAgMSAqL31cbiAgICAgICAgPFByb2Nlc3NMaXN0SXRlbT5cblxuICAgICAgICAgIDxQcm9jZXNzTGlzdEhlYWRpbmcgdHlwZT1cImgzXCI+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuTUVUSE9ET0xPR1lfU1RFUFMuU1RFUF8xX0hFQURJTkcpfVxuICAgICAgICAgIDwvUHJvY2Vzc0xpc3RIZWFkaW5nPlxuICAgICAgICAgIDxwPnsnICd9PC9wPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT17J2ZsdXNoJ30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuTUVUSE9ET0xPR1lfU1RFUFMuU1RFUF8xX0lORk8pfVxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIHsvKiBTdGVwIDEgQSAqL31cbiAgICAgICAgICA8aDQ+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuTUVUSE9ET0xPR1lfU1RFUFMuU1RFUF8xX0FfSEVBRElORyl9XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9eydmbHVzaCd9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLk1FVEhPRE9MT0dZX1NURVBTLlNURVBfMV9BX0lORk9fMSl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLk1FVEhPRE9MT0dZX1NURVBTLlNURVBfMV9BX0lORk9fMil9XG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgey8qIFN0ZXAgMSBCICovfVxuICAgICAgICAgIDxoND5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5NRVRIT0RPTE9HWV9TVEVQUy5TVEVQXzFfQl9IRUFESU5HKX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIHtNRVRIT0RPTE9HWV9DT1BZLkNPTVBMRVhfTUVUSF9TVEVQUy5TVEVQXzJfQl9JTkZPfVxuXG4gICAgICAgICAgey8qIFN0ZXAgMSBDICovfVxuICAgICAgICAgIDxoND5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5NRVRIT0RPTE9HWV9TVEVQUy5TVEVQXzFfQ19IRUFESU5HKX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT17J2ZsdXNoJ30+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKE1FVEhPRE9MT0dZX0NPUFkuTUVUSE9ET0xPR1lfU1RFUFMuU1RFUF8xX0NfSU5GTyl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L1Byb2Nlc3NMaXN0SXRlbT5cblxuICAgICAgICB7LyogU3RlcCAyICovfVxuICAgICAgICA8UHJvY2Vzc0xpc3RJdGVtPlxuXG4gICAgICAgICAgPFByb2Nlc3NMaXN0SGVhZGluZyB0eXBlPVwiaDNcIj5cbiAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5NRVRIT0RPTE9HWV9TVEVQUy5TVEVQXzJfSEVBRElORyl9XG4gICAgICAgICAgPC9Qcm9jZXNzTGlzdEhlYWRpbmc+XG5cbiAgICAgICAgICA8cD57JyAnfTwvcD5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9eydmbHVzaCd9PlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLk1FVEhPRE9MT0dZX1NURVBTLlNURVBfMl9JTkZPKX1cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICB7TUVUSE9ET0xPR1lfQ09QWS5DT01QTEVYX01FVEhfU1RFUFMuRk9STVVMQX1cblxuICAgICAgICA8L1Byb2Nlc3NMaXN0SXRlbT5cblxuICAgICAgPC9Qcm9jZXNzTGlzdD5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNjb3JlU3RlcHNMaXN0O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtHcmlkfSBmcm9tICdAdHJ1c3N3b3Jrcy9yZWFjdC11c3dkcyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ2dhdHNieS1wbHVnaW4taW50bCc7XG5cbmltcG9ydCBBbGVydFdyYXBwZXIgZnJvbSAnLi4vY29tcG9uZW50cy9BbGVydFdyYXBwZXInO1xuaW1wb3J0IERhdGFzZXRDb250YWluZXIgZnJvbSAnLi4vY29tcG9uZW50cy9EYXRhc2V0Q29udGFpbmVyJztcbmltcG9ydCBEb3dubG9hZFBhY2tldCBmcm9tICcuLi9jb21wb25lbnRzL0Rvd25sb2FkUGFja2V0JztcbmltcG9ydCBKNDBNYWluR3JpZENvbnRhaW5lciBmcm9tICcuLi9jb21wb25lbnRzL0o0ME1haW5HcmlkQ29udGFpbmVyJztcbmltcG9ydCBMYXlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuaW1wb3J0IFNjb3JlU3RlcHNMaXN0IGZyb20gJy4uL2NvbXBvbmVudHMvc2NvcmVTdGVwc0xpc3QnO1xuXG5pbXBvcnQgKiBhcyBNRVRIT0RPTE9HWV9DT1BZIGZyb20gJy4uL2RhdGEvY29weS9tZXRob2RvbG9neSc7XG5cbmludGVyZmFjZSBNZXRob2RQYWdlUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb247XG59XG5cbi8vIG1hcmt1cFxuY29uc3QgSW5kZXhQYWdlID0gKHtsb2NhdGlvbn06IE1ldGhvZFBhZ2VQcm9wcykgPT4ge1xuICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuXG4gIHJldHVybiAoXG4gICAgPExheW91dCBsb2NhdGlvbj17bG9jYXRpb259IHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5QQUdFLlRJTEUpfT5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8QWxlcnRXcmFwcGVyIHNob3dCZXRhQWxlcnQ9e3RydWV9IHNob3dMaW1pdGVkRGF0YUFsZXJ0PXtmYWxzZX0vPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPEo0ME1haW5HcmlkQ29udGFpbmVyPlxuICAgICAgICA8aDE+e2ludGwuZm9ybWF0TWVzc2FnZShNRVRIT0RPTE9HWV9DT1BZLlBBR0UuSEVBRElORyl9PC9oMT5cbiAgICAgICAgPEdyaWQgcm93IGdhcCBjbGFzc05hbWU9eydqNDAtbWItNSd9PlxuICAgICAgICAgIDxHcmlkIGNvbD17MTJ9IHRhYmxldD17e2NvbDogNn19PlxuICAgICAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2UoTUVUSE9ET0xPR1lfQ09QWS5QQUdFLkRFU0NSSVBUSU9OKX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgICA8R3JpZCBjb2w9ezEyfSB0YWJsZXQ9e3tjb2w6IDZ9fT5cbiAgICAgICAgICAgIDxEb3dubG9hZFBhY2tldCAvPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cblxuICAgICAgPERhdGFzZXRDb250YWluZXIvPlxuXG4gICAgICA8SjQwTWFpbkdyaWRDb250YWluZXI+XG4gICAgICAgIDxHcmlkIHJvdz5cbiAgICAgICAgICA8R3JpZCBjb2w+XG4gICAgICAgICAgICA8U2NvcmVTdGVwc0xpc3QvPlxuICAgICAgICAgIDwvR3JpZD5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgPC9KNDBNYWluR3JpZENvbnRhaW5lcj5cbiAgICA8L0xheW91dD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4UGFnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1095\n')}}]); \ No newline at end of file diff --git a/803-0bf34ac/contact/index.html b/803-0bf34ac/contact/index.html new file mode 100644 index 00000000..6a86f392 --- /dev/null +++ b/803-0bf34ac/contact/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/d94c0b71-011c029866557a05ad48.js b/803-0bf34ac/d94c0b71-011c029866557a05ad48.js new file mode 100644 index 00000000..f5e31c8f --- /dev/null +++ b/803-0bf34ac/d94c0b71-011c029866557a05ad48.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[644],{9910:function(module,__unused_webpack_exports,__webpack_require__){eval('__webpack_require__(5438);\n\n/* MapLibre GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v1.15.0/LICENSE.txt */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n \'use strict\';\n /* eslint-disable */\n\n var shared, worker, maplibregl; // define gets called three times: one for each chunk. we rely on the order\n // they\'re imported to know which is which\n\n function define(_, chunk) {\n if (!shared) {\n shared = chunk;\n } else if (!worker) {\n worker = chunk;\n } else {\n var workerBundleString = \'var sharedChunk = {}; (\' + shared + \')(sharedChunk); (\' + worker + \')(sharedChunk);\';\n var sharedChunk = {};\n shared(sharedChunk);\n maplibregl = chunk(sharedChunk);\n\n if (typeof window !== \'undefined\') {\n maplibregl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], {\n type: \'text/javascript\'\n }));\n }\n }\n }\n\n define(["exports"], function (t) {\n "use strict";\n\n function e(t, e) {\n return t(e = {\n exports: {}\n }, e.exports), e.exports;\n }\n\n var r = n;\n\n function n(t, e, r, n) {\n this.cx = 3 * t, this.bx = 3 * (r - t) - this.cx, this.ax = 1 - this.cx - this.bx, this.cy = 3 * e, this.by = 3 * (n - e) - this.cy, this.ay = 1 - this.cy - this.by, this.p1x = t, this.p1y = n, this.p2x = r, this.p2y = n;\n }\n\n n.prototype.sampleCurveX = function (t) {\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n }, n.prototype.sampleCurveY = function (t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n }, n.prototype.sampleCurveDerivativeX = function (t) {\n return (3 * this.ax * t + 2 * this.bx) * t + this.cx;\n }, n.prototype.solveCurveX = function (t, e) {\n var r, n, i, a, o;\n\n for (void 0 === e && (e = 1e-6), i = t, o = 0; o < 8; o++) {\n if (a = this.sampleCurveX(i) - t, Math.abs(a) < e) return i;\n var s = this.sampleCurveDerivativeX(i);\n if (Math.abs(s) < 1e-6) break;\n i -= a / s;\n }\n\n if ((i = t) < (r = 0)) return r;\n if (i > (n = 1)) return n;\n\n for (; r < n;) {\n if (a = this.sampleCurveX(i), Math.abs(a - t) < e) return i;\n t > a ? r = i : n = i, i = .5 * (n - r) + r;\n }\n\n return i;\n }, n.prototype.solve = function (t, e) {\n return this.sampleCurveY(this.solveCurveX(t, e));\n };\n var i = a;\n\n function a(t, e) {\n this.x = t, this.y = e;\n }\n\n a.prototype = {\n clone: function clone() {\n return new a(this.x, this.y);\n },\n add: function add(t) {\n return this.clone()._add(t);\n },\n sub: function sub(t) {\n return this.clone()._sub(t);\n },\n multByPoint: function multByPoint(t) {\n return this.clone()._multByPoint(t);\n },\n divByPoint: function divByPoint(t) {\n return this.clone()._divByPoint(t);\n },\n mult: function mult(t) {\n return this.clone()._mult(t);\n },\n div: function div(t) {\n return this.clone()._div(t);\n },\n rotate: function rotate(t) {\n return this.clone()._rotate(t);\n },\n rotateAround: function rotateAround(t, e) {\n return this.clone()._rotateAround(t, e);\n },\n matMult: function matMult(t) {\n return this.clone()._matMult(t);\n },\n unit: function unit() {\n return this.clone()._unit();\n },\n perp: function perp() {\n return this.clone()._perp();\n },\n round: function round() {\n return this.clone()._round();\n },\n mag: function mag() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n equals: function equals(t) {\n return this.x === t.x && this.y === t.y;\n },\n dist: function dist(t) {\n return Math.sqrt(this.distSqr(t));\n },\n distSqr: function distSqr(t) {\n var e = t.x - this.x,\n r = t.y - this.y;\n return e * e + r * r;\n },\n angle: function angle() {\n return Math.atan2(this.y, this.x);\n },\n angleTo: function angleTo(t) {\n return Math.atan2(this.y - t.y, this.x - t.x);\n },\n angleWith: function angleWith(t) {\n return this.angleWithSep(t.x, t.y);\n },\n angleWithSep: function angleWithSep(t, e) {\n return Math.atan2(this.x * e - this.y * t, this.x * t + this.y * e);\n },\n _matMult: function _matMult(t) {\n var e = t[2] * this.x + t[3] * this.y;\n return this.x = t[0] * this.x + t[1] * this.y, this.y = e, this;\n },\n _add: function _add(t) {\n return this.x += t.x, this.y += t.y, this;\n },\n _sub: function _sub(t) {\n return this.x -= t.x, this.y -= t.y, this;\n },\n _mult: function _mult(t) {\n return this.x *= t, this.y *= t, this;\n },\n _div: function _div(t) {\n return this.x /= t, this.y /= t, this;\n },\n _multByPoint: function _multByPoint(t) {\n return this.x *= t.x, this.y *= t.y, this;\n },\n _divByPoint: function _divByPoint(t) {\n return this.x /= t.x, this.y /= t.y, this;\n },\n _unit: function _unit() {\n return this._div(this.mag()), this;\n },\n _perp: function _perp() {\n var t = this.y;\n return this.y = this.x, this.x = -t, this;\n },\n _rotate: function _rotate(t) {\n var e = Math.cos(t),\n r = Math.sin(t),\n n = r * this.x + e * this.y;\n return this.x = e * this.x - r * this.y, this.y = n, this;\n },\n _rotateAround: function _rotateAround(t, e) {\n var r = Math.cos(t),\n n = Math.sin(t),\n i = e.y + n * (this.x - e.x) + r * (this.y - e.y);\n return this.x = e.x + r * (this.x - e.x) - n * (this.y - e.y), this.y = i, this;\n },\n _round: function _round() {\n return this.x = Math.round(this.x), this.y = Math.round(this.y), this;\n }\n }, a.convert = function (t) {\n return t instanceof a ? t : Array.isArray(t) ? new a(t[0], t[1]) : t;\n };\n var o = "undefined" != typeof self ? self : {},\n s = Math.pow(2, 53) - 1;\n\n function u(t, e, n, i) {\n var a = new r(t, e, n, i);\n return function (t) {\n return a.solve(t);\n };\n }\n\n var l = u(.25, .1, .25, 1);\n\n function p(t, e, r) {\n return Math.min(r, Math.max(e, t));\n }\n\n function c(t, e, r) {\n var n = r - e,\n i = ((t - e) % n + n) % n + e;\n return i === e ? r : i;\n }\n\n function h(t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n for (var n = 0, i = e; n < i.length; n += 1) {\n var a = i[n];\n\n for (var o in a) {\n t[o] = a[o];\n }\n }\n\n return t;\n }\n\n var f = 1;\n\n function y() {\n return f++;\n }\n\n function d() {\n return function t(e) {\n return e ? (e ^ 16 * Math.random() >> e / 4).toString(16) : ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, t);\n }();\n }\n\n function m(t) {\n return !!t && /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t);\n }\n\n function v(t, e) {\n t.forEach(function (t) {\n e[t] && (e[t] = e[t].bind(e));\n });\n }\n\n function g(t, e) {\n return -1 !== t.indexOf(e, t.length - e.length);\n }\n\n function x(t, e, r) {\n var n = {};\n\n for (var i in t) {\n n[i] = e.call(r || this, t[i], i, t);\n }\n\n return n;\n }\n\n function b(t, e, r) {\n var n = {};\n\n for (var i in t) {\n e.call(r || this, t[i], i, t) && (n[i] = t[i]);\n }\n\n return n;\n }\n\n function w(t) {\n return Array.isArray(t) ? t.map(w) : "object" == typeof t && t ? x(t, w) : t;\n }\n\n var _ = {};\n\n function A(t) {\n _[t] || ("undefined" != typeof console && console.warn(t), _[t] = !0);\n }\n\n function S(t, e, r) {\n return (r.y - t.y) * (e.x - t.x) > (e.y - t.y) * (r.x - t.x);\n }\n\n function k(t) {\n for (var e = 0, r = 0, n = t.length, i = n - 1, a = void 0, o = void 0; r < n; i = r++) {\n e += ((o = t[i]).x - (a = t[r]).x) * (a.y + o.y);\n }\n\n return e;\n }\n\n function I() {\n return "undefined" != typeof WorkerGlobalScope && "undefined" != typeof self && self instanceof WorkerGlobalScope;\n }\n\n function z(t) {\n var e = {};\n\n if (t.replace(/(?:^|(?:\\s*\\,\\s*))([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\"((?:[^"\\\\]|\\\\.)*)\\")))?/g, function (t, r, n, i) {\n var a = n || i;\n return e[r] = !a || a.toLowerCase(), "";\n }), e["max-age"]) {\n var r = parseInt(e["max-age"], 10);\n isNaN(r) ? delete e["max-age"] : e["max-age"] = r;\n }\n\n return e;\n }\n\n var C = null;\n\n function E(t) {\n if (null == C) {\n var e = t.navigator ? t.navigator.userAgent : null;\n C = !!t.safari || !(!e || !(/\\b(iPad|iPhone|iPod)\\b/.test(e) || e.match("Safari") && !e.match("Chrome")));\n }\n\n return C;\n }\n\n function P(t) {\n try {\n var e = o[t];\n return e.setItem("_mapbox_test_", 1), e.removeItem("_mapbox_test_"), !0;\n } catch (t) {\n return !1;\n }\n }\n\n var M,\n B,\n T,\n V,\n F = o.performance && o.performance.now ? o.performance.now.bind(o.performance) : Date.now.bind(Date),\n D = o.requestAnimationFrame || o.mozRequestAnimationFrame || o.webkitRequestAnimationFrame || o.msRequestAnimationFrame,\n L = o.cancelAnimationFrame || o.mozCancelAnimationFrame || o.webkitCancelAnimationFrame || o.msCancelAnimationFrame,\n R = {\n now: F,\n frame: function frame(t) {\n var e = D(t);\n return {\n cancel: function cancel() {\n return L(e);\n }\n };\n },\n getImageData: function getImageData(t, e) {\n void 0 === e && (e = 0);\n var r = o.document.createElement("canvas"),\n n = r.getContext("2d");\n if (!n) throw new Error("failed to create canvas 2d context");\n return r.width = t.width, r.height = t.height, n.drawImage(t, 0, 0, t.width, t.height), n.getImageData(-e, -e, t.width + 2 * e, t.height + 2 * e);\n },\n resolveURL: function resolveURL(t) {\n return M || (M = o.document.createElement("a")), M.href = t, M.href;\n },\n hardwareConcurrency: o.navigator && o.navigator.hardwareConcurrency || 4,\n\n get devicePixelRatio() {\n return o.devicePixelRatio;\n },\n\n get prefersReducedMotion() {\n return !!o.matchMedia && (null == B && (B = o.matchMedia("(prefers-reduced-motion: reduce)")), B.matches);\n }\n\n },\n O = {\n API_URL: "https://api.mapbox.com",\n\n get EVENTS_URL() {\n return this.API_URL ? 0 === this.API_URL.indexOf("https://api.mapbox.cn") ? "https://events.mapbox.cn/events/v2" : 0 === this.API_URL.indexOf("https://api.mapbox.com") ? "https://events.mapbox.com/events/v2" : null : null;\n },\n\n FEEDBACK_URL: "https://apps.mapbox.com/feedback",\n REQUIRE_ACCESS_TOKEN: !0,\n ACCESS_TOKEN: null,\n MAX_PARALLEL_IMAGE_REQUESTS: 16,\n REGISTERED_PROTOCOLS: {}\n },\n U = {\n supported: !1,\n testSupport: function testSupport(t) {\n !j && V && (q ? N(t) : T = t);\n }\n },\n j = !1,\n q = !1;\n\n function N(t) {\n var e = t.createTexture();\n t.bindTexture(t.TEXTURE_2D, e);\n\n try {\n if (t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, t.RGBA, t.UNSIGNED_BYTE, V), t.isContextLost()) return;\n U.supported = !0;\n } catch (t) {}\n\n t.deleteTexture(e), j = !0;\n }\n\n o.document && ((V = o.document.createElement("img")).onload = function () {\n T && N(T), T = null, q = !0;\n }, V.onerror = function () {\n j = !0, T = null;\n }, V.src = "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=");\n\n var K = "01",\n G = function G(t, e) {\n this._transformRequestFn = t, this._customAccessToken = e, this._createSkuToken();\n };\n\n function Z(t) {\n return 0 === t.indexOf("mapbox:");\n }\n\n G.prototype._createSkuToken = function () {\n var t = function () {\n for (var t = "", e = 0; e < 10; e++) {\n t += "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[Math.floor(62 * Math.random())];\n }\n\n return {\n token: ["1", K, t].join(""),\n tokenExpiresAt: Date.now() + 432e5\n };\n }();\n\n this._skuToken = t.token, this._skuTokenExpiresAt = t.tokenExpiresAt;\n }, G.prototype._isSkuTokenExpired = function () {\n return Date.now() > this._skuTokenExpiresAt;\n }, G.prototype.transformRequest = function (t, e) {\n return this._transformRequestFn && this._transformRequestFn(t, e) || {\n url: t\n };\n }, G.prototype.normalizeStyleURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/styles/v1" + r.path, this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeGlyphsURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/fonts/v1" + r.path, this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeSourceURL = function (t, e) {\n if (!Z(t)) return t;\n var r = Y(t);\n return r.path = "/v4/" + r.authority + ".json", r.params.push("secure"), this._makeAPIURL(r, this._customAccessToken || e);\n }, G.prototype.normalizeSpriteURL = function (t, e, r, n) {\n var i = Y(t);\n return Z(t) ? (i.path = "/styles/v1" + i.path + "/sprite" + e + r, this._makeAPIURL(i, this._customAccessToken || n)) : (i.path += "" + e + r, $(i));\n }, G.prototype.normalizeTileURL = function (t, e) {\n if (this._isSkuTokenExpired() && this._createSkuToken(), t && !Z(t)) return t;\n var r = Y(t);\n r.path = r.path.replace(/(\\.(png|jpg)\\d*)(?=$)/, (R.devicePixelRatio >= 2 || 512 === e ? "@2x" : "") + (U.supported ? ".webp" : "$1")), r.path = r.path.replace(/^.+\\/v4\\//, "/"), r.path = "/v4" + r.path;\n\n var n = this._customAccessToken || function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n var n = r[e].match(/^access_token=(.*)$/);\n if (n) return n[1];\n }\n\n return null;\n }(r.params) || O.ACCESS_TOKEN;\n\n return O.REQUIRE_ACCESS_TOKEN && n && this._skuToken && r.params.push("sku=" + this._skuToken), this._makeAPIURL(r, n);\n }, G.prototype.canonicalizeTileURL = function (t, e) {\n var r = Y(t);\n if (!r.path.match(/(^\\/v4\\/)/) || !r.path.match(/\\.[\\w]+$/)) return t;\n var n = "mapbox://tiles/";\n n += r.path.replace("/v4/", "");\n var i = r.params;\n return e && (i = i.filter(function (t) {\n return !t.match(/^access_token=/);\n })), i.length && (n += "?" + i.join("&")), n;\n }, G.prototype.canonicalizeTileset = function (t, e) {\n for (var r = !!e && Z(e), n = [], i = 0, a = t.tiles || []; i < a.length; i += 1) {\n var o = a[i];\n J(o) ? n.push(this.canonicalizeTileURL(o, r)) : n.push(o);\n }\n\n return n;\n }, G.prototype._makeAPIURL = function (t, e) {\n var r = "See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes",\n n = Y(O.API_URL);\n\n if (t.protocol = n.protocol, t.authority = n.authority, "http" === t.protocol) {\n var i = t.params.indexOf("secure");\n i >= 0 && t.params.splice(i, 1);\n }\n\n if ("/" !== n.path && (t.path = "" + n.path + t.path), !O.REQUIRE_ACCESS_TOKEN) return $(t);\n if (!(e = e || O.ACCESS_TOKEN)) throw new Error("An API access token is required to use Mapbox GL. " + r);\n if ("s" === e[0]) throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + r);\n return t.params = t.params.filter(function (t) {\n return -1 === t.indexOf("access_token");\n }), t.params.push("access_token=" + e), $(t);\n }, G.prototype.setTransformRequest = function (t) {\n this._transformRequestFn = t;\n };\n var X = /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;\n\n function J(t) {\n return X.test(t);\n }\n\n var H = /^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;\n\n function Y(t) {\n var e = t.match(H);\n if (!e) throw new Error("Unable to parse URL object");\n return {\n protocol: e[1],\n authority: e[2],\n path: e[3] || "/",\n params: e[4] ? e[4].split("&") : []\n };\n }\n\n function $(t) {\n var e = t.params.length ? "?" + t.params.join("&") : "";\n return t.protocol + "://" + t.authority + t.path + e;\n }\n\n function W(t) {\n if (!t) return null;\n var e = t.split(".");\n if (!e || 3 !== e.length) return null;\n\n try {\n return JSON.parse(decodeURIComponent(o.atob(e[1]).split("").map(function (t) {\n return "%" + ("00" + t.charCodeAt(0).toString(16)).slice(-2);\n }).join("")));\n } catch (t) {\n return null;\n }\n }\n\n var Q = function Q(t) {\n this.type = t, this.anonId = null, this.eventData = {}, this.queue = [], this.pendingRequest = null;\n };\n\n Q.prototype.getStorageKey = function (t) {\n var e,\n r = W(O.ACCESS_TOKEN);\n return e = r && r.u ? o.btoa(encodeURIComponent(r.u).replace(/%([0-9A-F]{2})/g, function (t, e) {\n return String.fromCharCode(Number("0x" + e));\n })) : O.ACCESS_TOKEN || "", t ? "mapbox.eventData." + t + ":" + e : "mapbox.eventData:" + e;\n }, Q.prototype.fetchEventData = function () {\n var t = P("localStorage"),\n e = this.getStorageKey(),\n r = this.getStorageKey("uuid");\n if (t) try {\n var n = o.localStorage.getItem(e);\n n && (this.eventData = JSON.parse(n));\n var i = o.localStorage.getItem(r);\n i && (this.anonId = i);\n } catch (t) {\n A("Unable to read from LocalStorage");\n }\n }, Q.prototype.saveEventData = function () {\n var t = P("localStorage"),\n e = this.getStorageKey(),\n r = this.getStorageKey("uuid");\n if (t) try {\n o.localStorage.setItem(r, this.anonId), Object.keys(this.eventData).length >= 1 && o.localStorage.setItem(e, JSON.stringify(this.eventData));\n } catch (t) {\n A("Unable to write to LocalStorage");\n }\n }, Q.prototype.processRequests = function (t) {}, Q.prototype.postEvent = function (t, e, r, n) {\n var i = this;\n\n if (O.EVENTS_URL) {\n var a = Y(O.EVENTS_URL);\n a.params.push("access_token=" + (n || O.ACCESS_TOKEN || ""));\n var o = {\n event: this.type,\n created: new Date(t).toISOString(),\n sdkIdentifier: "mapbox-gl-js",\n sdkVersion: "1.15.0",\n skuId: K,\n userId: this.anonId\n },\n s = e ? h(o, e) : o,\n u = {\n url: $(a),\n headers: {\n "Content-Type": "text/plain"\n },\n body: JSON.stringify([s])\n };\n this.pendingRequest = _t(u, function (t) {\n i.pendingRequest = null, r(t), i.saveEventData(), i.processRequests(n);\n });\n }\n }, Q.prototype.queueRequest = function (t, e) {\n this.queue.push(t), this.processRequests(e);\n };\n\n var tt,\n et,\n rt = function (t) {\n function e() {\n t.call(this, "map.load"), this.success = {}, this.skuToken = "";\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.postMapLoadEvent = function (t, e, r, n) {\n this.skuToken = r, (O.EVENTS_URL && n || O.ACCESS_TOKEN && Array.isArray(t) && t.some(function (t) {\n return Z(t) || J(t);\n })) && this.queueRequest({\n id: e,\n timestamp: Date.now()\n }, n);\n }, e.prototype.processRequests = function (t) {\n var e = this;\n\n if (!this.pendingRequest && 0 !== this.queue.length) {\n var r = this.queue.shift(),\n n = r.id,\n i = r.timestamp;\n n && this.success[n] || (this.anonId || this.fetchEventData(), m(this.anonId) || (this.anonId = d()), this.postEvent(i, {\n skuToken: this.skuToken\n }, function (t) {\n t || n && (e.success[n] = !0);\n }, t));\n }\n }, e;\n }(Q),\n nt = new (function (t) {\n function e(e) {\n t.call(this, "appUserTurnstile"), this._customAccessToken = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.postTurnstileEvent = function (t, e) {\n O.EVENTS_URL && O.ACCESS_TOKEN && Array.isArray(t) && t.some(function (t) {\n return Z(t) || J(t);\n }) && this.queueRequest(Date.now(), e);\n }, e.prototype.processRequests = function (t) {\n var e = this;\n\n if (!this.pendingRequest && 0 !== this.queue.length) {\n this.anonId && this.eventData.lastSuccess && this.eventData.tokenU || this.fetchEventData();\n var r = W(O.ACCESS_TOKEN),\n n = r ? r.u : O.ACCESS_TOKEN,\n i = n !== this.eventData.tokenU;\n m(this.anonId) || (this.anonId = d(), i = !0);\n var a = this.queue.shift();\n\n if (this.eventData.lastSuccess) {\n var o = new Date(this.eventData.lastSuccess),\n s = new Date(a),\n u = (a - this.eventData.lastSuccess) / 864e5;\n i = i || u >= 1 || u < -1 || o.getDate() !== s.getDate();\n } else i = !0;\n\n if (!i) return this.processRequests();\n this.postEvent(a, {\n "enabled.telemetry": !1\n }, function (t) {\n t || (e.eventData.lastSuccess = a, e.eventData.tokenU = n);\n }, t);\n }\n }, e;\n }(Q))(),\n it = nt.postTurnstileEvent.bind(nt),\n at = new rt(),\n ot = at.postMapLoadEvent.bind(at),\n st = 500,\n ut = 50;\n\n function lt() {\n o.caches && !tt && (tt = o.caches.open("mapbox-tiles"));\n }\n\n function pt(t) {\n var e = t.indexOf("?");\n return e < 0 ? t : t.slice(0, e);\n }\n\n var ct,\n ht = 1 / 0;\n\n function ft() {\n return null == ct && (ct = o.OffscreenCanvas && new o.OffscreenCanvas(1, 1).getContext("2d") && "function" == typeof o.createImageBitmap), ct;\n }\n\n var yt = {\n Unknown: "Unknown",\n Style: "Style",\n Source: "Source",\n Tile: "Tile",\n Glyphs: "Glyphs",\n SpriteImage: "SpriteImage",\n SpriteJSON: "SpriteJSON",\n Image: "Image"\n };\n "function" == typeof Object.freeze && Object.freeze(yt);\n\n var dt = function (t) {\n function e(e, r, n) {\n 401 === r && J(n) && (e += ": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes"), t.call(this, e), this.status = r, this.url = n, this.name = this.constructor.name, this.message = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.toString = function () {\n return this.name + ": " + this.message + " (" + this.status + "): " + this.url;\n }, e;\n }(Error),\n mt = I() ? function () {\n return self.worker && self.worker.referrer;\n } : function () {\n return ("blob:" === o.location.protocol ? o.parent : o).location.href;\n };\n\n function vt(t, e) {\n var r,\n n = new o.AbortController(),\n i = new o.Request(t.url, {\n method: t.method || "GET",\n body: t.body,\n credentials: t.credentials,\n headers: t.headers,\n referrer: mt(),\n signal: n.signal\n }),\n a = !1,\n s = !1,\n u = (r = i.url).indexOf("sku=") > 0 && J(r);\n "json" === t.type && i.headers.set("Accept", "application/json");\n\n var l = function l(r, n, a) {\n if (!s) {\n if (r && "SecurityError" !== r.message && A(r), n && a) return p(n);\n var l = Date.now();\n o.fetch(i).then(function (r) {\n if (r.ok) {\n var n = u ? r.clone() : null;\n return p(r, n, l);\n }\n\n return e(new dt(r.statusText, r.status, t.url));\n }).catch(function (t) {\n 20 !== t.code && e(new Error(t.message));\n });\n }\n },\n p = function p(r, n, u) {\n ("arrayBuffer" === t.type ? r.arrayBuffer() : "json" === t.type ? r.json() : r.text()).then(function (t) {\n s || (n && u && function (t, e, r) {\n if (lt(), tt) {\n var n = {\n status: e.status,\n statusText: e.statusText,\n headers: new o.Headers()\n };\n e.headers.forEach(function (t, e) {\n return n.headers.set(e, t);\n });\n var i = z(e.headers.get("Cache-Control") || "");\n i["no-store"] || (i["max-age"] && n.headers.set("Expires", new Date(r + 1e3 * i["max-age"]).toUTCString()), new Date(n.headers.get("Expires")).getTime() - r < 42e4 || function (t, e) {\n if (void 0 === et) try {\n new Response(new ReadableStream()), et = !0;\n } catch (t) {\n et = !1;\n }\n et ? e(t.body) : t.blob().then(e);\n }(e, function (e) {\n var r = new o.Response(e, n);\n lt(), tt && tt.then(function (e) {\n return e.put(pt(t.url), r);\n }).catch(function (t) {\n return A(t.message);\n });\n }));\n }\n }(i, n, u), a = !0, e(null, t, r.headers.get("Cache-Control"), r.headers.get("Expires")));\n }).catch(function (t) {\n s || e(new Error(t.message));\n });\n };\n\n return u ? function (t, e) {\n if (lt(), !tt) return e(null);\n var r = pt(t.url);\n tt.then(function (t) {\n t.match(r).then(function (n) {\n var i = function (t) {\n if (!t) return !1;\n var e = new Date(t.headers.get("Expires") || 0),\n r = z(t.headers.get("Cache-Control") || "");\n return e > Date.now() && !r["no-cache"];\n }(n);\n\n t.delete(r), i && t.put(r, n.clone()), e(null, n, i);\n }).catch(e);\n }).catch(e);\n }(i, l) : l(null, null), {\n cancel: function cancel() {\n s = !0, a || n.abort();\n }\n };\n }\n\n var gt,\n xt,\n bt = function bt(t, e) {\n if (/:\\/\\//.test(t.url) && !/^https?:|^file:/.test(t.url)) {\n if (I() && self.worker && self.worker.actor) return self.worker.actor.send("getResource", t, e);\n\n if (!I()) {\n var r = t.url.substring(0, t.url.indexOf("://"));\n return (O.REGISTERED_PROTOCOLS[r] || vt)(t, e);\n }\n }\n\n if (!(/^file:/.test(n = t.url) || /^file:/.test(mt()) && !/^\\w+:/.test(n))) {\n if (o.fetch && o.Request && o.AbortController && o.Request.prototype.hasOwnProperty("signal")) return vt(t, e);\n if (I() && self.worker && self.worker.actor) return self.worker.actor.send("getResource", t, e, void 0, !0);\n }\n\n var n;\n return function (t, e) {\n var r = new o.XMLHttpRequest();\n\n for (var n in r.open(t.method || "GET", t.url, !0), "arrayBuffer" === t.type && (r.responseType = "arraybuffer"), t.headers) {\n r.setRequestHeader(n, t.headers[n]);\n }\n\n return "json" === t.type && (r.responseType = "text", r.setRequestHeader("Accept", "application/json")), r.withCredentials = "include" === t.credentials, r.onerror = function () {\n e(new Error(r.statusText));\n }, r.onload = function () {\n if ((r.status >= 200 && r.status < 300 || 0 === r.status) && null !== r.response) {\n var n = r.response;\n if ("json" === t.type) try {\n n = JSON.parse(r.response);\n } catch (t) {\n return e(t);\n }\n e(null, n, r.getResponseHeader("Cache-Control"), r.getResponseHeader("Expires"));\n } else e(new dt(r.statusText, r.status, t.url));\n }, r.send(t.body), {\n cancel: function cancel() {\n return r.abort();\n }\n };\n }(t, e);\n },\n wt = function wt(t, e) {\n return bt(h(t, {\n type: "arrayBuffer"\n }), e);\n },\n _t = function _t(t, e) {\n return bt(h(t, {\n method: "POST"\n }), e);\n },\n At = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";\n\n gt = [], xt = 0;\n\n var St = function St(t, e) {\n if (U.supported && (t.headers || (t.headers = {}), t.headers.accept = "image/webp,*/*"), xt >= O.MAX_PARALLEL_IMAGE_REQUESTS) {\n var r = {\n requestParameters: t,\n callback: e,\n cancelled: !1,\n cancel: function cancel() {\n this.cancelled = !0;\n }\n };\n return gt.push(r), r;\n }\n\n xt++;\n\n var n = !1,\n i = function i() {\n if (!n) for (n = !0, xt--; gt.length && xt < O.MAX_PARALLEL_IMAGE_REQUESTS;) {\n var t = gt.shift();\n t.cancelled || (t.cancel = St(t.requestParameters, t.callback).cancel);\n }\n },\n a = wt(t, function (t, r, n, a) {\n i(), t ? e(t) : r && (ft() ? function (t, e) {\n var r = new o.Blob([new Uint8Array(t)], {\n type: "image/png"\n });\n o.createImageBitmap(r).then(function (t) {\n e(null, t);\n }).catch(function (t) {\n e(new Error("Could not load image because of " + t.message + ". Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));\n });\n }(r, e) : function (t, e, r, n) {\n var i = new o.Image(),\n a = o.URL;\n i.onload = function () {\n e(null, i), a.revokeObjectURL(i.src), i.onload = null, o.requestAnimationFrame(function () {\n i.src = At;\n });\n }, i.onerror = function () {\n return e(new Error("Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."));\n };\n var s = new o.Blob([new Uint8Array(t)], {\n type: "image/png"\n });\n i.cacheControl = r, i.expires = n, i.src = t.byteLength ? a.createObjectURL(s) : At;\n }(r, e, n, a));\n });\n\n return {\n cancel: function cancel() {\n a.cancel(), i();\n }\n };\n };\n\n function kt(t, e, r) {\n r[t] && -1 !== r[t].indexOf(e) || (r[t] = r[t] || [], r[t].push(e));\n }\n\n function It(t, e, r) {\n if (r && r[t]) {\n var n = r[t].indexOf(e);\n -1 !== n && r[t].splice(n, 1);\n }\n }\n\n var zt = function zt(t, e) {\n void 0 === e && (e = {}), h(this, e), this.type = t;\n },\n Ct = function (t) {\n function e(e, r) {\n void 0 === r && (r = {}), t.call(this, "error", h({\n error: e\n }, r));\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(zt),\n Et = function Et() {};\n\n Et.prototype.on = function (t, e) {\n return this._listeners = this._listeners || {}, kt(t, e, this._listeners), this;\n }, Et.prototype.off = function (t, e) {\n return It(t, e, this._listeners), It(t, e, this._oneTimeListeners), this;\n }, Et.prototype.once = function (t, e) {\n return this._oneTimeListeners = this._oneTimeListeners || {}, kt(t, e, this._oneTimeListeners), this;\n }, Et.prototype.fire = function (t, e) {\n "string" == typeof t && (t = new zt(t, e || {}));\n var r = t.type;\n\n if (this.listens(r)) {\n t.target = this;\n\n for (var n = 0, i = this._listeners && this._listeners[r] ? this._listeners[r].slice() : []; n < i.length; n += 1) {\n i[n].call(this, t);\n }\n\n for (var a = 0, o = this._oneTimeListeners && this._oneTimeListeners[r] ? this._oneTimeListeners[r].slice() : []; a < o.length; a += 1) {\n var s = o[a];\n It(r, s, this._oneTimeListeners), s.call(this, t);\n }\n\n var u = this._eventedParent;\n u && (h(t, "function" == typeof this._eventedParentData ? this._eventedParentData() : this._eventedParentData), u.fire(t));\n } else t instanceof Ct && console.error(t.error);\n\n return this;\n }, Et.prototype.listens = function (t) {\n return this._listeners && this._listeners[t] && this._listeners[t].length > 0 || this._oneTimeListeners && this._oneTimeListeners[t] && this._oneTimeListeners[t].length > 0 || this._eventedParent && this._eventedParent.listens(t);\n }, Et.prototype.setEventedParent = function (t, e) {\n return this._eventedParent = t, this._eventedParentData = e, this;\n };\n\n var Pt = {\n $version: 8,\n $root: {\n version: {\n required: !0,\n type: "enum",\n values: [8]\n },\n name: {\n type: "string"\n },\n metadata: {\n type: "*"\n },\n center: {\n type: "array",\n value: "number"\n },\n zoom: {\n type: "number"\n },\n bearing: {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees"\n },\n pitch: {\n type: "number",\n default: 0,\n units: "degrees"\n },\n light: {\n type: "light"\n },\n sources: {\n required: !0,\n type: "sources"\n },\n sprite: {\n type: "string"\n },\n glyphs: {\n type: "string"\n },\n transition: {\n type: "transition"\n },\n layers: {\n required: !0,\n type: "array",\n value: "layer"\n }\n },\n sources: {\n "*": {\n type: "source"\n }\n },\n source: ["source_vector", "source_raster", "source_raster_dem", "source_geojson", "source_video", "source_image"],\n source_vector: {\n type: {\n required: !0,\n type: "enum",\n values: {\n vector: {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n scheme: {\n type: "enum",\n values: {\n xyz: {},\n tms: {}\n },\n default: "xyz"\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n attribution: {\n type: "string"\n },\n promoteId: {\n type: "promoteId"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_raster: {\n type: {\n required: !0,\n type: "enum",\n values: {\n raster: {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n tileSize: {\n type: "number",\n default: 512,\n units: "pixels"\n },\n scheme: {\n type: "enum",\n values: {\n xyz: {},\n tms: {}\n },\n default: "xyz"\n },\n attribution: {\n type: "string"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_raster_dem: {\n type: {\n required: !0,\n type: "enum",\n values: {\n "raster-dem": {}\n }\n },\n url: {\n type: "string"\n },\n tiles: {\n type: "array",\n value: "string"\n },\n bounds: {\n type: "array",\n value: "number",\n length: 4,\n default: [-180, -85.051129, 180, 85.051129]\n },\n minzoom: {\n type: "number",\n default: 0\n },\n maxzoom: {\n type: "number",\n default: 22\n },\n tileSize: {\n type: "number",\n default: 512,\n units: "pixels"\n },\n attribution: {\n type: "string"\n },\n encoding: {\n type: "enum",\n values: {\n terrarium: {},\n mapbox: {}\n },\n default: "mapbox"\n },\n volatile: {\n type: "boolean",\n default: !1\n },\n "*": {\n type: "*"\n }\n },\n source_geojson: {\n type: {\n required: !0,\n type: "enum",\n values: {\n geojson: {}\n }\n },\n data: {\n type: "*"\n },\n maxzoom: {\n type: "number",\n default: 18\n },\n attribution: {\n type: "string"\n },\n buffer: {\n type: "number",\n default: 128,\n maximum: 512,\n minimum: 0\n },\n filter: {\n type: "*"\n },\n tolerance: {\n type: "number",\n default: .375\n },\n cluster: {\n type: "boolean",\n default: !1\n },\n clusterRadius: {\n type: "number",\n default: 50,\n minimum: 0\n },\n clusterMaxZoom: {\n type: "number"\n },\n clusterMinPoints: {\n type: "number"\n },\n clusterProperties: {\n type: "*"\n },\n lineMetrics: {\n type: "boolean",\n default: !1\n },\n generateId: {\n type: "boolean",\n default: !1\n },\n promoteId: {\n type: "promoteId"\n }\n },\n source_video: {\n type: {\n required: !0,\n type: "enum",\n values: {\n video: {}\n }\n },\n urls: {\n required: !0,\n type: "array",\n value: "string"\n },\n coordinates: {\n required: !0,\n type: "array",\n length: 4,\n value: {\n type: "array",\n length: 2,\n value: "number"\n }\n }\n },\n source_image: {\n type: {\n required: !0,\n type: "enum",\n values: {\n image: {}\n }\n },\n url: {\n required: !0,\n type: "string"\n },\n coordinates: {\n required: !0,\n type: "array",\n length: 4,\n value: {\n type: "array",\n length: 2,\n value: "number"\n }\n }\n },\n layer: {\n id: {\n type: "string",\n required: !0\n },\n type: {\n type: "enum",\n values: {\n fill: {},\n line: {},\n symbol: {},\n circle: {},\n heatmap: {},\n "fill-extrusion": {},\n raster: {},\n hillshade: {},\n background: {}\n },\n required: !0\n },\n metadata: {\n type: "*"\n },\n source: {\n type: "string"\n },\n "source-layer": {\n type: "string"\n },\n minzoom: {\n type: "number",\n minimum: 0,\n maximum: 24\n },\n maxzoom: {\n type: "number",\n minimum: 0,\n maximum: 24\n },\n filter: {\n type: "filter"\n },\n layout: {\n type: "layout"\n },\n paint: {\n type: "paint"\n }\n },\n layout: ["layout_fill", "layout_line", "layout_circle", "layout_heatmap", "layout_fill-extrusion", "layout_symbol", "layout_raster", "layout_hillshade", "layout_background"],\n layout_background: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_fill: {\n "fill-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_circle: {\n "circle-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_heatmap: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n "layout_fill-extrusion": {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_line: {\n "line-cap": {\n type: "enum",\n values: {\n butt: {},\n round: {},\n square: {}\n },\n default: "butt",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-join": {\n type: "enum",\n values: {\n bevel: {},\n round: {},\n miter: {}\n },\n default: "miter",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "line-miter-limit": {\n type: "number",\n default: 2,\n requires: [{\n "line-join": "miter"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-round-limit": {\n type: "number",\n default: 1.05,\n requires: [{\n "line-join": "round"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_symbol: {\n "symbol-placement": {\n type: "enum",\n values: {\n point: {},\n line: {},\n "line-center": {}\n },\n default: "point",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-spacing": {\n type: "number",\n default: 250,\n minimum: 1,\n units: "pixels",\n requires: [{\n "symbol-placement": "line"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-avoid-edges": {\n type: "boolean",\n default: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "symbol-sort-key": {\n type: "number",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "symbol-z-order": {\n type: "enum",\n values: {\n auto: {},\n "viewport-y": {},\n source: {}\n },\n default: "auto",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-allow-overlap": {\n type: "boolean",\n default: !1,\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-ignore-placement": {\n type: "boolean",\n default: !1,\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-optional": {\n type: "boolean",\n default: !1,\n requires: ["icon-image", "text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-rotation-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-size": {\n type: "number",\n default: 1,\n minimum: 0,\n units: "factor of the original icon size",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-text-fit": {\n type: "enum",\n values: {\n none: {},\n width: {},\n height: {},\n both: {}\n },\n default: "none",\n requires: ["icon-image", "text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-text-fit-padding": {\n type: "array",\n value: "number",\n length: 4,\n default: [0, 0, 0, 0],\n units: "pixels",\n requires: ["icon-image", "text-field", {\n "icon-text-fit": ["both", "width", "height"]\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-image": {\n type: "resolvedImage",\n tokens: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-rotate": {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-padding": {\n type: "number",\n default: 2,\n minimum: 0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-keep-upright": {\n type: "boolean",\n default: !1,\n requires: ["icon-image", {\n "icon-rotation-alignment": "map"\n }, {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-offset": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-anchor": {\n type: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n default: "center",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "icon-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-rotation-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {},\n auto: {}\n },\n default: "auto",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-field": {\n type: "formatted",\n default: "",\n tokens: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-font": {\n type: "array",\n value: "string",\n default: ["Open Sans Regular", "Arial Unicode MS Regular"],\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-size": {\n type: "number",\n default: 16,\n minimum: 0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-max-width": {\n type: "number",\n default: 10,\n minimum: 0,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-line-height": {\n type: "number",\n default: 1.2,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-letter-spacing": {\n type: "number",\n default: 0,\n units: "ems",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-justify": {\n type: "enum",\n values: {\n auto: {},\n left: {},\n center: {},\n right: {}\n },\n default: "center",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-radial-offset": {\n type: "number",\n units: "ems",\n default: 0,\n requires: ["text-field"],\n "property-type": "data-driven",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n }\n },\n "text-variable-anchor": {\n type: "array",\n value: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n requires: ["text-field", {\n "symbol-placement": ["point"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-anchor": {\n type: "enum",\n values: {\n center: {},\n left: {},\n right: {},\n top: {},\n bottom: {},\n "top-left": {},\n "top-right": {},\n "bottom-left": {},\n "bottom-right": {}\n },\n default: "center",\n requires: ["text-field", {\n "!": "text-variable-anchor"\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-max-angle": {\n type: "number",\n default: 45,\n units: "degrees",\n requires: ["text-field", {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-writing-mode": {\n type: "array",\n value: "enum",\n values: {\n horizontal: {},\n vertical: {}\n },\n requires: ["text-field", {\n "symbol-placement": ["point"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-rotate": {\n type: "number",\n default: 0,\n period: 360,\n units: "degrees",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-padding": {\n type: "number",\n default: 2,\n minimum: 0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-keep-upright": {\n type: "boolean",\n default: !0,\n requires: ["text-field", {\n "text-rotation-alignment": "map"\n }, {\n "symbol-placement": ["line", "line-center"]\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-transform": {\n type: "enum",\n values: {\n none: {},\n uppercase: {},\n lowercase: {}\n },\n default: "none",\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-offset": {\n type: "array",\n value: "number",\n units: "ems",\n length: 2,\n default: [0, 0],\n requires: ["text-field", {\n "!": "text-radial-offset"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature"]\n },\n "property-type": "data-driven"\n },\n "text-allow-overlap": {\n type: "boolean",\n default: !1,\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-ignore-placement": {\n type: "boolean",\n default: !1,\n requires: ["text-field"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-optional": {\n type: "boolean",\n default: !1,\n requires: ["text-field", "icon-image"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_raster: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n layout_hillshade: {\n visibility: {\n type: "enum",\n values: {\n visible: {},\n none: {}\n },\n default: "visible",\n "property-type": "constant"\n }\n },\n filter: {\n type: "array",\n value: "*"\n },\n filter_operator: {\n type: "enum",\n values: {\n "==": {},\n "!=": {},\n ">": {},\n ">=": {},\n "<": {},\n "<=": {},\n in: {},\n "!in": {},\n all: {},\n any: {},\n none: {},\n has: {},\n "!has": {},\n within: {}\n }\n },\n geometry_type: {\n type: "enum",\n values: {\n Point: {},\n LineString: {},\n Polygon: {}\n }\n },\n function: {\n expression: {\n type: "expression"\n },\n stops: {\n type: "array",\n value: "function_stop"\n },\n base: {\n type: "number",\n default: 1,\n minimum: 0\n },\n property: {\n type: "string",\n default: "$zoom"\n },\n type: {\n type: "enum",\n values: {\n identity: {},\n exponential: {},\n interval: {},\n categorical: {}\n },\n default: "exponential"\n },\n colorSpace: {\n type: "enum",\n values: {\n rgb: {},\n lab: {},\n hcl: {}\n },\n default: "rgb"\n },\n default: {\n type: "*",\n required: !1\n }\n },\n function_stop: {\n type: "array",\n minimum: 0,\n maximum: 24,\n value: ["number", "color"],\n length: 2\n },\n expression: {\n type: "array",\n value: "*",\n minimum: 1\n },\n light: {\n anchor: {\n type: "enum",\n default: "viewport",\n values: {\n map: {},\n viewport: {}\n },\n "property-type": "data-constant",\n transition: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n }\n },\n position: {\n type: "array",\n default: [1.15, 210, 30],\n length: 3,\n value: "number",\n "property-type": "data-constant",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n }\n },\n color: {\n type: "color",\n "property-type": "data-constant",\n default: "#ffffff",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n transition: !0\n },\n intensity: {\n type: "number",\n "property-type": "data-constant",\n default: .5,\n minimum: 0,\n maximum: 1,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n transition: !0\n }\n },\n paint: ["paint_fill", "paint_line", "paint_circle", "paint_heatmap", "paint_fill-extrusion", "paint_symbol", "paint_raster", "paint_hillshade", "paint_background"],\n paint_fill: {\n "fill-antialias": {\n type: "boolean",\n default: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "fill-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-outline-color": {\n type: "color",\n transition: !0,\n requires: [{\n "!": "fill-pattern"\n }, {\n "fill-antialias": !0\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["fill-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n }\n },\n "paint_fill-extrusion": {\n "fill-extrusion-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "fill-extrusion-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["fill-extrusion-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "fill-extrusion-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n },\n "fill-extrusion-height": {\n type: "number",\n default: 0,\n minimum: 0,\n units: "meters",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-base": {\n type: "number",\n default: 0,\n minimum: 0,\n units: "meters",\n transition: !0,\n requires: ["fill-extrusion-height"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "fill-extrusion-vertical-gradient": {\n type: "boolean",\n default: !0,\n transition: !1,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_line: {\n "line-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "line-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["line-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "line-width": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-gap-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-offset": {\n type: "number",\n default: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "line-dasharray": {\n type: "array",\n value: "number",\n minimum: 0,\n transition: !0,\n units: "line widths",\n requires: [{\n "!": "line-pattern"\n }],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "cross-faded"\n },\n "line-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n },\n "property-type": "cross-faded-data-driven"\n },\n "line-gradient": {\n type: "color",\n transition: !1,\n requires: [{\n "!": "line-dasharray"\n }, {\n "!": "line-pattern"\n }, {\n source: "geojson",\n has: {\n lineMetrics: !0\n }\n }],\n expression: {\n interpolated: !0,\n parameters: ["line-progress"]\n },\n "property-type": "color-ramp"\n }\n },\n paint_circle: {\n "circle-radius": {\n type: "number",\n default: 5,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-blur": {\n type: "number",\n default: 0,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["circle-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-pitch-scale": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-pitch-alignment": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "viewport",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "circle-stroke-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-stroke-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "circle-stroke-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n }\n },\n paint_heatmap: {\n "heatmap-radius": {\n type: "number",\n default: 30,\n minimum: 1,\n transition: !0,\n units: "pixels",\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "heatmap-weight": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "heatmap-intensity": {\n type: "number",\n default: 1,\n minimum: 0,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "heatmap-color": {\n type: "color",\n default: ["interpolate", ["linear"], ["heatmap-density"], 0, "rgba(0, 0, 255, 0)", .1, "royalblue", .3, "cyan", .5, "lime", .7, "yellow", 1, "red"],\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["heatmap-density"]\n },\n "property-type": "color-ramp"\n },\n "heatmap-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_symbol: {\n "icon-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-color": {\n type: "color",\n default: "rgba(0, 0, 0, 0)",\n transition: !0,\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-halo-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "icon-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n requires: ["icon-image"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "icon-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["icon-image", "icon-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n overridable: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-color": {\n type: "color",\n default: "rgba(0, 0, 0, 0)",\n transition: !0,\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-width": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-halo-blur": {\n type: "number",\n default: 0,\n minimum: 0,\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom", "feature", "feature-state"]\n },\n "property-type": "data-driven"\n },\n "text-translate": {\n type: "array",\n value: "number",\n length: 2,\n default: [0, 0],\n transition: !0,\n units: "pixels",\n requires: ["text-field"],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "text-translate-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "map",\n requires: ["text-field", "text-translate"],\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_raster: {\n "raster-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-hue-rotate": {\n type: "number",\n default: 0,\n period: 360,\n transition: !0,\n units: "degrees",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-brightness-min": {\n type: "number",\n default: 0,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-brightness-max": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-saturation": {\n type: "number",\n default: 0,\n minimum: -1,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-contrast": {\n type: "number",\n default: 0,\n minimum: -1,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-resampling": {\n type: "enum",\n values: {\n linear: {},\n nearest: {}\n },\n default: "linear",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "raster-fade-duration": {\n type: "number",\n default: 300,\n minimum: 0,\n transition: !1,\n units: "milliseconds",\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_hillshade: {\n "hillshade-illumination-direction": {\n type: "number",\n default: 335,\n minimum: 0,\n maximum: 359,\n transition: !1,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-illumination-anchor": {\n type: "enum",\n values: {\n map: {},\n viewport: {}\n },\n default: "viewport",\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-exaggeration": {\n type: "number",\n default: .5,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-shadow-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-highlight-color": {\n type: "color",\n default: "#FFFFFF",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "hillshade-accent-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n paint_background: {\n "background-color": {\n type: "color",\n default: "#000000",\n transition: !0,\n requires: [{\n "!": "background-pattern"\n }],\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n },\n "background-pattern": {\n type: "resolvedImage",\n transition: !0,\n expression: {\n interpolated: !1,\n parameters: ["zoom"]\n },\n "property-type": "cross-faded"\n },\n "background-opacity": {\n type: "number",\n default: 1,\n minimum: 0,\n maximum: 1,\n transition: !0,\n expression: {\n interpolated: !0,\n parameters: ["zoom"]\n },\n "property-type": "data-constant"\n }\n },\n transition: {\n duration: {\n type: "number",\n default: 300,\n minimum: 0,\n units: "milliseconds"\n },\n delay: {\n type: "number",\n default: 0,\n minimum: 0,\n units: "milliseconds"\n }\n },\n "property-type": {\n "data-driven": {\n type: "property-type"\n },\n "cross-faded": {\n type: "property-type"\n },\n "cross-faded-data-driven": {\n type: "property-type"\n },\n "color-ramp": {\n type: "property-type"\n },\n "data-constant": {\n type: "property-type"\n },\n constant: {\n type: "property-type"\n }\n },\n promoteId: {\n "*": {\n type: "string"\n }\n }\n },\n Mt = function Mt(t, e, r, n) {\n this.message = (t ? t + ": " : "") + r, n && (this.identifier = n), null != e && e.__line__ && (this.line = e.__line__);\n };\n\n function Bt(t) {\n var e = t.value;\n return e ? [new Mt(t.key, e, "constants have been deprecated as of v8")] : [];\n }\n\n function Tt(t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n for (var n = 0, i = e; n < i.length; n += 1) {\n var a = i[n];\n\n for (var o in a) {\n t[o] = a[o];\n }\n }\n\n return t;\n }\n\n function Vt(t) {\n return t instanceof Number || t instanceof String || t instanceof Boolean ? t.valueOf() : t;\n }\n\n function Ft(t) {\n if (Array.isArray(t)) return t.map(Ft);\n\n if (t instanceof Object && !(t instanceof Number || t instanceof String || t instanceof Boolean)) {\n var e = {};\n\n for (var r in t) {\n e[r] = Ft(t[r]);\n }\n\n return e;\n }\n\n return Vt(t);\n }\n\n var Dt = function (t) {\n function e(e, r) {\n t.call(this, r), this.message = r, this.key = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(Error),\n Lt = function Lt(t, e) {\n void 0 === e && (e = []), this.parent = t, this.bindings = {};\n\n for (var r = 0, n = e; r < n.length; r += 1) {\n var i = n[r];\n this.bindings[i[0]] = i[1];\n }\n };\n\n Lt.prototype.concat = function (t) {\n return new Lt(this, t);\n }, Lt.prototype.get = function (t) {\n if (this.bindings[t]) return this.bindings[t];\n if (this.parent) return this.parent.get(t);\n throw new Error(t + " not found in scope.");\n }, Lt.prototype.has = function (t) {\n return !!this.bindings[t] || !!this.parent && this.parent.has(t);\n };\n var Rt = {\n kind: "null"\n },\n Ot = {\n kind: "number"\n },\n Ut = {\n kind: "string"\n },\n jt = {\n kind: "boolean"\n },\n qt = {\n kind: "color"\n },\n Nt = {\n kind: "object"\n },\n Kt = {\n kind: "value"\n },\n Gt = {\n kind: "collator"\n },\n Zt = {\n kind: "formatted"\n },\n Xt = {\n kind: "resolvedImage"\n };\n\n function Jt(t, e) {\n return {\n kind: "array",\n itemType: t,\n N: e\n };\n }\n\n function Ht(t) {\n if ("array" === t.kind) {\n var e = Ht(t.itemType);\n return "number" == typeof t.N ? "array<" + e + ", " + t.N + ">" : "value" === t.itemType.kind ? "array" : "array<" + e + ">";\n }\n\n return t.kind;\n }\n\n var Yt = [Rt, Ot, Ut, jt, qt, Zt, Nt, Jt(Kt), Xt];\n\n function $t(t, e) {\n if ("error" === e.kind) return null;\n\n if ("array" === t.kind) {\n if ("array" === e.kind && (0 === e.N && "value" === e.itemType.kind || !$t(t.itemType, e.itemType)) && ("number" != typeof t.N || t.N === e.N)) return null;\n } else {\n if (t.kind === e.kind) return null;\n if ("value" === t.kind) for (var r = 0, n = Yt; r < n.length; r += 1) {\n if (!$t(n[r], e)) return null;\n }\n }\n\n return "Expected " + Ht(t) + " but found " + Ht(e) + " instead.";\n }\n\n function Wt(t, e) {\n return e.some(function (e) {\n return e.kind === t.kind;\n });\n }\n\n function Qt(t, e) {\n return e.some(function (e) {\n return "null" === e ? null === t : "array" === e ? Array.isArray(t) : "object" === e ? t && !Array.isArray(t) && "object" == typeof t : e === typeof t;\n });\n }\n\n var te = e(function (t, e) {\n var r = {\n transparent: [0, 0, 0, 0],\n aliceblue: [240, 248, 255, 1],\n antiquewhite: [250, 235, 215, 1],\n aqua: [0, 255, 255, 1],\n aquamarine: [127, 255, 212, 1],\n azure: [240, 255, 255, 1],\n beige: [245, 245, 220, 1],\n bisque: [255, 228, 196, 1],\n black: [0, 0, 0, 1],\n blanchedalmond: [255, 235, 205, 1],\n blue: [0, 0, 255, 1],\n blueviolet: [138, 43, 226, 1],\n brown: [165, 42, 42, 1],\n burlywood: [222, 184, 135, 1],\n cadetblue: [95, 158, 160, 1],\n chartreuse: [127, 255, 0, 1],\n chocolate: [210, 105, 30, 1],\n coral: [255, 127, 80, 1],\n cornflowerblue: [100, 149, 237, 1],\n cornsilk: [255, 248, 220, 1],\n crimson: [220, 20, 60, 1],\n cyan: [0, 255, 255, 1],\n darkblue: [0, 0, 139, 1],\n darkcyan: [0, 139, 139, 1],\n darkgoldenrod: [184, 134, 11, 1],\n darkgray: [169, 169, 169, 1],\n darkgreen: [0, 100, 0, 1],\n darkgrey: [169, 169, 169, 1],\n darkkhaki: [189, 183, 107, 1],\n darkmagenta: [139, 0, 139, 1],\n darkolivegreen: [85, 107, 47, 1],\n darkorange: [255, 140, 0, 1],\n darkorchid: [153, 50, 204, 1],\n darkred: [139, 0, 0, 1],\n darksalmon: [233, 150, 122, 1],\n darkseagreen: [143, 188, 143, 1],\n darkslateblue: [72, 61, 139, 1],\n darkslategray: [47, 79, 79, 1],\n darkslategrey: [47, 79, 79, 1],\n darkturquoise: [0, 206, 209, 1],\n darkviolet: [148, 0, 211, 1],\n deeppink: [255, 20, 147, 1],\n deepskyblue: [0, 191, 255, 1],\n dimgray: [105, 105, 105, 1],\n dimgrey: [105, 105, 105, 1],\n dodgerblue: [30, 144, 255, 1],\n firebrick: [178, 34, 34, 1],\n floralwhite: [255, 250, 240, 1],\n forestgreen: [34, 139, 34, 1],\n fuchsia: [255, 0, 255, 1],\n gainsboro: [220, 220, 220, 1],\n ghostwhite: [248, 248, 255, 1],\n gold: [255, 215, 0, 1],\n goldenrod: [218, 165, 32, 1],\n gray: [128, 128, 128, 1],\n green: [0, 128, 0, 1],\n greenyellow: [173, 255, 47, 1],\n grey: [128, 128, 128, 1],\n honeydew: [240, 255, 240, 1],\n hotpink: [255, 105, 180, 1],\n indianred: [205, 92, 92, 1],\n indigo: [75, 0, 130, 1],\n ivory: [255, 255, 240, 1],\n khaki: [240, 230, 140, 1],\n lavender: [230, 230, 250, 1],\n lavenderblush: [255, 240, 245, 1],\n lawngreen: [124, 252, 0, 1],\n lemonchiffon: [255, 250, 205, 1],\n lightblue: [173, 216, 230, 1],\n lightcoral: [240, 128, 128, 1],\n lightcyan: [224, 255, 255, 1],\n lightgoldenrodyellow: [250, 250, 210, 1],\n lightgray: [211, 211, 211, 1],\n lightgreen: [144, 238, 144, 1],\n lightgrey: [211, 211, 211, 1],\n lightpink: [255, 182, 193, 1],\n lightsalmon: [255, 160, 122, 1],\n lightseagreen: [32, 178, 170, 1],\n lightskyblue: [135, 206, 250, 1],\n lightslategray: [119, 136, 153, 1],\n lightslategrey: [119, 136, 153, 1],\n lightsteelblue: [176, 196, 222, 1],\n lightyellow: [255, 255, 224, 1],\n lime: [0, 255, 0, 1],\n limegreen: [50, 205, 50, 1],\n linen: [250, 240, 230, 1],\n magenta: [255, 0, 255, 1],\n maroon: [128, 0, 0, 1],\n mediumaquamarine: [102, 205, 170, 1],\n mediumblue: [0, 0, 205, 1],\n mediumorchid: [186, 85, 211, 1],\n mediumpurple: [147, 112, 219, 1],\n mediumseagreen: [60, 179, 113, 1],\n mediumslateblue: [123, 104, 238, 1],\n mediumspringgreen: [0, 250, 154, 1],\n mediumturquoise: [72, 209, 204, 1],\n mediumvioletred: [199, 21, 133, 1],\n midnightblue: [25, 25, 112, 1],\n mintcream: [245, 255, 250, 1],\n mistyrose: [255, 228, 225, 1],\n moccasin: [255, 228, 181, 1],\n navajowhite: [255, 222, 173, 1],\n navy: [0, 0, 128, 1],\n oldlace: [253, 245, 230, 1],\n olive: [128, 128, 0, 1],\n olivedrab: [107, 142, 35, 1],\n orange: [255, 165, 0, 1],\n orangered: [255, 69, 0, 1],\n orchid: [218, 112, 214, 1],\n palegoldenrod: [238, 232, 170, 1],\n palegreen: [152, 251, 152, 1],\n paleturquoise: [175, 238, 238, 1],\n palevioletred: [219, 112, 147, 1],\n papayawhip: [255, 239, 213, 1],\n peachpuff: [255, 218, 185, 1],\n peru: [205, 133, 63, 1],\n pink: [255, 192, 203, 1],\n plum: [221, 160, 221, 1],\n powderblue: [176, 224, 230, 1],\n purple: [128, 0, 128, 1],\n rebeccapurple: [102, 51, 153, 1],\n red: [255, 0, 0, 1],\n rosybrown: [188, 143, 143, 1],\n royalblue: [65, 105, 225, 1],\n saddlebrown: [139, 69, 19, 1],\n salmon: [250, 128, 114, 1],\n sandybrown: [244, 164, 96, 1],\n seagreen: [46, 139, 87, 1],\n seashell: [255, 245, 238, 1],\n sienna: [160, 82, 45, 1],\n silver: [192, 192, 192, 1],\n skyblue: [135, 206, 235, 1],\n slateblue: [106, 90, 205, 1],\n slategray: [112, 128, 144, 1],\n slategrey: [112, 128, 144, 1],\n snow: [255, 250, 250, 1],\n springgreen: [0, 255, 127, 1],\n steelblue: [70, 130, 180, 1],\n tan: [210, 180, 140, 1],\n teal: [0, 128, 128, 1],\n thistle: [216, 191, 216, 1],\n tomato: [255, 99, 71, 1],\n turquoise: [64, 224, 208, 1],\n violet: [238, 130, 238, 1],\n wheat: [245, 222, 179, 1],\n white: [255, 255, 255, 1],\n whitesmoke: [245, 245, 245, 1],\n yellow: [255, 255, 0, 1],\n yellowgreen: [154, 205, 50, 1]\n };\n\n function n(t) {\n return (t = Math.round(t)) < 0 ? 0 : t > 255 ? 255 : t;\n }\n\n function i(t) {\n return n("%" === t[t.length - 1] ? parseFloat(t) / 100 * 255 : parseInt(t));\n }\n\n function a(t) {\n return (e = "%" === t[t.length - 1] ? parseFloat(t) / 100 : parseFloat(t)) < 0 ? 0 : e > 1 ? 1 : e;\n var e;\n }\n\n function o(t, e, r) {\n return r < 0 ? r += 1 : r > 1 && (r -= 1), 6 * r < 1 ? t + (e - t) * r * 6 : 2 * r < 1 ? e : 3 * r < 2 ? t + (e - t) * (2 / 3 - r) * 6 : t;\n }\n\n try {\n e.parseCSSColor = function (t) {\n var e,\n s = t.replace(/ /g, "").toLowerCase();\n if (s in r) return r[s].slice();\n if ("#" === s[0]) return 4 === s.length ? (e = parseInt(s.substr(1), 16)) >= 0 && e <= 4095 ? [(3840 & e) >> 4 | (3840 & e) >> 8, 240 & e | (240 & e) >> 4, 15 & e | (15 & e) << 4, 1] : null : 7 === s.length && (e = parseInt(s.substr(1), 16)) >= 0 && e <= 16777215 ? [(16711680 & e) >> 16, (65280 & e) >> 8, 255 & e, 1] : null;\n var u = s.indexOf("("),\n l = s.indexOf(")");\n\n if (-1 !== u && l + 1 === s.length) {\n var p = s.substr(0, u),\n c = s.substr(u + 1, l - (u + 1)).split(","),\n h = 1;\n\n switch (p) {\n case "rgba":\n if (4 !== c.length) return null;\n h = a(c.pop());\n\n case "rgb":\n return 3 !== c.length ? null : [i(c[0]), i(c[1]), i(c[2]), h];\n\n case "hsla":\n if (4 !== c.length) return null;\n h = a(c.pop());\n\n case "hsl":\n if (3 !== c.length) return null;\n var f = (parseFloat(c[0]) % 360 + 360) % 360 / 360,\n y = a(c[1]),\n d = a(c[2]),\n m = d <= .5 ? d * (y + 1) : d + y - d * y,\n v = 2 * d - m;\n return [n(255 * o(v, m, f + 1 / 3)), n(255 * o(v, m, f)), n(255 * o(v, m, f - 1 / 3)), h];\n\n default:\n return null;\n }\n }\n\n return null;\n };\n } catch (t) {}\n }).parseCSSColor,\n ee = function ee(t, e, r, n) {\n void 0 === n && (n = 1), this.r = t, this.g = e, this.b = r, this.a = n;\n };\n\n ee.parse = function (t) {\n if (t) {\n if (t instanceof ee) return t;\n\n if ("string" == typeof t) {\n var e = te(t);\n if (e) return new ee(e[0] / 255 * e[3], e[1] / 255 * e[3], e[2] / 255 * e[3], e[3]);\n }\n }\n }, ee.prototype.toString = function () {\n var t = this.toArray(),\n e = t[1],\n r = t[2],\n n = t[3];\n return "rgba(" + Math.round(t[0]) + "," + Math.round(e) + "," + Math.round(r) + "," + n + ")";\n }, ee.prototype.toArray = function () {\n var t = this.a;\n return 0 === t ? [0, 0, 0, 0] : [255 * this.r / t, 255 * this.g / t, 255 * this.b / t, t];\n }, ee.black = new ee(0, 0, 0, 1), ee.white = new ee(1, 1, 1, 1), ee.transparent = new ee(0, 0, 0, 0), ee.red = new ee(1, 0, 0, 1);\n\n var re = function re(t, e, r) {\n this.sensitivity = t ? e ? "variant" : "case" : e ? "accent" : "base", this.locale = r, this.collator = new Intl.Collator(this.locale ? this.locale : [], {\n sensitivity: this.sensitivity,\n usage: "search"\n });\n };\n\n re.prototype.compare = function (t, e) {\n return this.collator.compare(t, e);\n }, re.prototype.resolvedLocale = function () {\n return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale;\n };\n\n var ne = function ne(t, e, r, n, i) {\n this.text = t, this.image = e, this.scale = r, this.fontStack = n, this.textColor = i;\n },\n ie = function ie(t) {\n this.sections = t;\n };\n\n ie.fromString = function (t) {\n return new ie([new ne(t, null, null, null, null)]);\n }, ie.prototype.isEmpty = function () {\n return 0 === this.sections.length || !this.sections.some(function (t) {\n return 0 !== t.text.length || t.image && 0 !== t.image.name.length;\n });\n }, ie.factory = function (t) {\n return t instanceof ie ? t : ie.fromString(t);\n }, ie.prototype.toString = function () {\n return 0 === this.sections.length ? "" : this.sections.map(function (t) {\n return t.text;\n }).join("");\n }, ie.prototype.serialize = function () {\n for (var t = ["format"], e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n if (n.image) t.push(["image", n.image.name]);else {\n t.push(n.text);\n var i = {};\n n.fontStack && (i["text-font"] = ["literal", n.fontStack.split(",")]), n.scale && (i["font-scale"] = n.scale), n.textColor && (i["text-color"] = ["rgba"].concat(n.textColor.toArray())), t.push(i);\n }\n }\n\n return t;\n };\n\n var ae = function ae(t) {\n this.name = t.name, this.available = t.available;\n };\n\n function oe(t, e, r, n) {\n return "number" == typeof t && t >= 0 && t <= 255 && "number" == typeof e && e >= 0 && e <= 255 && "number" == typeof r && r >= 0 && r <= 255 ? void 0 === n || "number" == typeof n && n >= 0 && n <= 1 ? null : "Invalid rgba value [" + [t, e, r, n].join(", ") + "]: \'a\' must be between 0 and 1." : "Invalid rgba value [" + ("number" == typeof n ? [t, e, r, n] : [t, e, r]).join(", ") + "]: \'r\', \'g\', and \'b\' must be between 0 and 255.";\n }\n\n function se(t) {\n if (null === t) return !0;\n if ("string" == typeof t) return !0;\n if ("boolean" == typeof t) return !0;\n if ("number" == typeof t) return !0;\n if (t instanceof ee) return !0;\n if (t instanceof re) return !0;\n if (t instanceof ie) return !0;\n if (t instanceof ae) return !0;\n\n if (Array.isArray(t)) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (!se(r[e])) return !1;\n }\n\n return !0;\n }\n\n if ("object" == typeof t) {\n for (var n in t) {\n if (!se(t[n])) return !1;\n }\n\n return !0;\n }\n\n return !1;\n }\n\n function ue(t) {\n if (null === t) return Rt;\n if ("string" == typeof t) return Ut;\n if ("boolean" == typeof t) return jt;\n if ("number" == typeof t) return Ot;\n if (t instanceof ee) return qt;\n if (t instanceof re) return Gt;\n if (t instanceof ie) return Zt;\n if (t instanceof ae) return Xt;\n\n if (Array.isArray(t)) {\n for (var e, r = t.length, n = 0, i = t; n < i.length; n += 1) {\n var a = ue(i[n]);\n\n if (e) {\n if (e === a) continue;\n e = Kt;\n break;\n }\n\n e = a;\n }\n\n return Jt(e || Kt, r);\n }\n\n return Nt;\n }\n\n function le(t) {\n var e = typeof t;\n return null === t ? "" : "string" === e || "number" === e || "boolean" === e ? String(t) : t instanceof ee || t instanceof ie || t instanceof ae ? t.toString() : JSON.stringify(t);\n }\n\n ae.prototype.toString = function () {\n return this.name;\n }, ae.fromString = function (t) {\n return t ? new ae({\n name: t,\n available: !1\n }) : null;\n }, ae.prototype.serialize = function () {\n return ["image", this.name];\n };\n\n var pe = function pe(t, e) {\n this.type = t, this.value = e;\n };\n\n pe.parse = function (t, e) {\n if (2 !== t.length) return e.error("\'literal\' expression requires exactly one argument, but found " + (t.length - 1) + " instead.");\n if (!se(t[1])) return e.error("invalid value");\n var r = t[1],\n n = ue(r),\n i = e.expectedType;\n return "array" !== n.kind || 0 !== n.N || !i || "array" !== i.kind || "number" == typeof i.N && 0 !== i.N || (n = i), new pe(n, r);\n }, pe.prototype.evaluate = function () {\n return this.value;\n }, pe.prototype.eachChild = function () {}, pe.prototype.outputDefined = function () {\n return !0;\n }, pe.prototype.serialize = function () {\n return "array" === this.type.kind || "object" === this.type.kind ? ["literal", this.value] : this.value instanceof ee ? ["rgba"].concat(this.value.toArray()) : this.value instanceof ie ? this.value.serialize() : this.value;\n };\n\n var ce = function ce(t) {\n this.name = "ExpressionEvaluationError", this.message = t;\n };\n\n ce.prototype.toJSON = function () {\n return this.message;\n };\n\n var he = {\n string: Ut,\n number: Ot,\n boolean: jt,\n object: Nt\n },\n fe = function fe(t, e) {\n this.type = t, this.args = e;\n };\n\n fe.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r,\n n = 1,\n i = t[0];\n\n if ("array" === i) {\n var a, o;\n\n if (t.length > 2) {\n var s = t[1];\n if ("string" != typeof s || !(s in he) || "object" === s) return e.error(\'The item type argument of "array" must be one of string, number, boolean\', 1);\n a = he[s], n++;\n } else a = Kt;\n\n if (t.length > 3) {\n if (null !== t[2] && ("number" != typeof t[2] || t[2] < 0 || t[2] !== Math.floor(t[2]))) return e.error(\'The length argument to "array" must be a positive integer literal\', 2);\n o = t[2], n++;\n }\n\n r = Jt(a, o);\n } else r = he[i];\n\n for (var u = []; n < t.length; n++) {\n var l = e.parse(t[n], n, Kt);\n if (!l) return null;\n u.push(l);\n }\n\n return new fe(r, u);\n }, fe.prototype.evaluate = function (t) {\n for (var e = 0; e < this.args.length; e++) {\n var r = this.args[e].evaluate(t);\n if (!$t(this.type, ue(r))) return r;\n if (e === this.args.length - 1) throw new ce("Expected value to be of type " + Ht(this.type) + ", but found " + Ht(ue(r)) + " instead.");\n }\n\n return null;\n }, fe.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, fe.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, fe.prototype.serialize = function () {\n var t = this.type,\n e = [t.kind];\n\n if ("array" === t.kind) {\n var r = t.itemType;\n\n if ("string" === r.kind || "number" === r.kind || "boolean" === r.kind) {\n e.push(r.kind);\n var n = t.N;\n ("number" == typeof n || this.args.length > 1) && e.push(n);\n }\n }\n\n return e.concat(this.args.map(function (t) {\n return t.serialize();\n }));\n };\n\n var ye = function ye(t) {\n this.type = Zt, this.sections = t;\n };\n\n ye.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r = t[1];\n if (!Array.isArray(r) && "object" == typeof r) return e.error("First argument must be an image or text section.");\n\n for (var n = [], i = !1, a = 1; a <= t.length - 1; ++a) {\n var o = t[a];\n\n if (i && "object" == typeof o && !Array.isArray(o)) {\n i = !1;\n var s = null;\n if (o["font-scale"] && !(s = e.parse(o["font-scale"], 1, Ot))) return null;\n var u = null;\n if (o["text-font"] && !(u = e.parse(o["text-font"], 1, Jt(Ut)))) return null;\n var l = null;\n if (o["text-color"] && !(l = e.parse(o["text-color"], 1, qt))) return null;\n var p = n[n.length - 1];\n p.scale = s, p.font = u, p.textColor = l;\n } else {\n var c = e.parse(t[a], 1, Kt);\n if (!c) return null;\n var h = c.type.kind;\n if ("string" !== h && "value" !== h && "null" !== h && "resolvedImage" !== h) return e.error("Formatted text type must be \'string\', \'value\', \'image\' or \'null\'.");\n i = !0, n.push({\n content: c,\n scale: null,\n font: null,\n textColor: null\n });\n }\n }\n\n return new ye(n);\n }, ye.prototype.evaluate = function (t) {\n return new ie(this.sections.map(function (e) {\n var r = e.content.evaluate(t);\n return ue(r) === Xt ? new ne("", r, null, null, null) : new ne(le(r), null, e.scale ? e.scale.evaluate(t) : null, e.font ? e.font.evaluate(t).join(",") : null, e.textColor ? e.textColor.evaluate(t) : null);\n }));\n }, ye.prototype.eachChild = function (t) {\n for (var e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n t(n.content), n.scale && t(n.scale), n.font && t(n.font), n.textColor && t(n.textColor);\n }\n }, ye.prototype.outputDefined = function () {\n return !1;\n }, ye.prototype.serialize = function () {\n for (var t = ["format"], e = 0, r = this.sections; e < r.length; e += 1) {\n var n = r[e];\n t.push(n.content.serialize());\n var i = {};\n n.scale && (i["font-scale"] = n.scale.serialize()), n.font && (i["text-font"] = n.font.serialize()), n.textColor && (i["text-color"] = n.textColor.serialize()), t.push(i);\n }\n\n return t;\n };\n\n var de = function de(t) {\n this.type = Xt, this.input = t;\n };\n\n de.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected two arguments.");\n var r = e.parse(t[1], 1, Ut);\n return r ? new de(r) : e.error("No image name provided.");\n }, de.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t),\n r = ae.fromString(e);\n return r && t.availableImages && (r.available = t.availableImages.indexOf(e) > -1), r;\n }, de.prototype.eachChild = function (t) {\n t(this.input);\n }, de.prototype.outputDefined = function () {\n return !1;\n }, de.prototype.serialize = function () {\n return ["image", this.input.serialize()];\n };\n\n var me = {\n "to-boolean": jt,\n "to-color": qt,\n "to-number": Ot,\n "to-string": Ut\n },\n ve = function ve(t, e) {\n this.type = t, this.args = e;\n };\n\n ve.parse = function (t, e) {\n if (t.length < 2) return e.error("Expected at least one argument.");\n var r = t[0];\n if (("to-boolean" === r || "to-string" === r) && 2 !== t.length) return e.error("Expected one argument.");\n\n for (var n = me[r], i = [], a = 1; a < t.length; a++) {\n var o = e.parse(t[a], a, Kt);\n if (!o) return null;\n i.push(o);\n }\n\n return new ve(n, i);\n }, ve.prototype.evaluate = function (t) {\n if ("boolean" === this.type.kind) return Boolean(this.args[0].evaluate(t));\n\n if ("color" === this.type.kind) {\n for (var e, r, n = 0, i = this.args; n < i.length; n += 1) {\n if (r = null, (e = i[n].evaluate(t)) instanceof ee) return e;\n\n if ("string" == typeof e) {\n var a = t.parseColor(e);\n if (a) return a;\n } else if (Array.isArray(e) && !(r = e.length < 3 || e.length > 4 ? "Invalid rbga value " + JSON.stringify(e) + ": expected an array containing either three or four numeric values." : oe(e[0], e[1], e[2], e[3]))) return new ee(e[0] / 255, e[1] / 255, e[2] / 255, e[3]);\n }\n\n throw new ce(r || "Could not parse color from value \'" + ("string" == typeof e ? e : String(JSON.stringify(e))) + "\'");\n }\n\n if ("number" === this.type.kind) {\n for (var o = null, s = 0, u = this.args; s < u.length; s += 1) {\n if (null === (o = u[s].evaluate(t))) return 0;\n var l = Number(o);\n if (!isNaN(l)) return l;\n }\n\n throw new ce("Could not convert " + JSON.stringify(o) + " to number.");\n }\n\n return "formatted" === this.type.kind ? ie.fromString(le(this.args[0].evaluate(t))) : "resolvedImage" === this.type.kind ? ae.fromString(le(this.args[0].evaluate(t))) : le(this.args[0].evaluate(t));\n }, ve.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, ve.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, ve.prototype.serialize = function () {\n if ("formatted" === this.type.kind) return new ye([{\n content: this.args[0],\n scale: null,\n font: null,\n textColor: null\n }]).serialize();\n if ("resolvedImage" === this.type.kind) return new de(this.args[0]).serialize();\n var t = ["to-" + this.type.kind];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var ge = ["Unknown", "Point", "LineString", "Polygon"],\n xe = function xe() {\n this.globals = null, this.feature = null, this.featureState = null, this.formattedSection = null, this._parseColorCache = {}, this.availableImages = null, this.canonical = null;\n };\n\n xe.prototype.id = function () {\n return this.feature && "id" in this.feature ? this.feature.id : null;\n }, xe.prototype.geometryType = function () {\n return this.feature ? "number" == typeof this.feature.type ? ge[this.feature.type] : this.feature.type : null;\n }, xe.prototype.geometry = function () {\n return this.feature && "geometry" in this.feature ? this.feature.geometry : null;\n }, xe.prototype.canonicalID = function () {\n return this.canonical;\n }, xe.prototype.properties = function () {\n return this.feature && this.feature.properties || {};\n }, xe.prototype.parseColor = function (t) {\n var e = this._parseColorCache[t];\n return e || (e = this._parseColorCache[t] = ee.parse(t)), e;\n };\n\n var be = function be(t, e, r, n) {\n this.name = t, this.type = e, this._evaluate = r, this.args = n;\n };\n\n be.prototype.evaluate = function (t) {\n return this._evaluate(t, this.args);\n }, be.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, be.prototype.outputDefined = function () {\n return !1;\n }, be.prototype.serialize = function () {\n return [this.name].concat(this.args.map(function (t) {\n return t.serialize();\n }));\n }, be.parse = function (t, e) {\n var r,\n n = t[0],\n i = be.definitions[n];\n if (!i) return e.error(\'Unknown expression "\' + n + \'". If you wanted a literal array, use ["literal", [...]].\', 0);\n\n for (var a = Array.isArray(i) ? i[0] : i.type, o = Array.isArray(i) ? [[i[1], i[2]]] : i.overloads, s = o.filter(function (e) {\n var r = e[0];\n return !Array.isArray(r) || r.length === t.length - 1;\n }), u = null, l = 0, p = s; l < p.length; l += 1) {\n var c = p[l],\n h = c[0],\n f = c[1];\n u = new qe(e.registry, e.path, null, e.scope);\n\n for (var y = [], d = !1, m = 1; m < t.length; m++) {\n var v = t[m],\n g = Array.isArray(h) ? h[m - 1] : h.type,\n x = u.parse(v, 1 + y.length, g);\n\n if (!x) {\n d = !0;\n break;\n }\n\n y.push(x);\n }\n\n if (!d) if (Array.isArray(h) && h.length !== y.length) u.error("Expected " + h.length + " arguments, but found " + y.length + " instead.");else {\n for (var b = 0; b < y.length; b++) {\n var w = Array.isArray(h) ? h[b] : h.type,\n _ = y[b];\n u.concat(b + 1).checkSubtype(w, _.type);\n }\n\n if (0 === u.errors.length) return new be(n, a, f, y);\n }\n }\n\n if (1 === s.length) (r = e.errors).push.apply(r, u.errors);else {\n for (var A = (s.length ? s : o).map(function (t) {\n var e;\n return e = t[0], Array.isArray(e) ? "(" + e.map(Ht).join(", ") + ")" : "(" + Ht(e.type) + "...)";\n }).join(" | "), S = [], k = 1; k < t.length; k++) {\n var I = e.parse(t[k], 1 + S.length);\n if (!I) return null;\n S.push(Ht(I.type));\n }\n\n e.error("Expected arguments of type " + A + ", but found (" + S.join(", ") + ") instead.");\n }\n return null;\n }, be.register = function (t, e) {\n for (var r in be.definitions = e, e) {\n t[r] = be;\n }\n };\n\n var we = function we(t, e, r) {\n this.type = Gt, this.locale = r, this.caseSensitive = t, this.diacriticSensitive = e;\n };\n\n function _e(t, e) {\n t[0] = Math.min(t[0], e[0]), t[1] = Math.min(t[1], e[1]), t[2] = Math.max(t[2], e[0]), t[3] = Math.max(t[3], e[1]);\n }\n\n function Ae(t, e) {\n return !(t[0] <= e[0] || t[2] >= e[2] || t[1] <= e[1] || t[3] >= e[3]);\n }\n\n function Se(t, e) {\n var r = (180 + t[0]) / 360,\n n = (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + t[1] * Math.PI / 360))) / 360,\n i = Math.pow(2, e.z);\n return [Math.round(r * i * 8192), Math.round(n * i * 8192)];\n }\n\n function ke(t, e, r) {\n return e[1] > t[1] != r[1] > t[1] && t[0] < (r[0] - e[0]) * (t[1] - e[1]) / (r[1] - e[1]) + e[0];\n }\n\n function Ie(t, e) {\n for (var r, n, i, a, o, s, u, l = !1, p = 0, c = e.length; p < c; p++) {\n for (var h = e[p], f = 0, y = h.length; f < y - 1; f++) {\n if ((a = (r = t)[0] - (n = h[f])[0]) * (u = r[1] - (i = h[f + 1])[1]) - (s = r[0] - i[0]) * (o = r[1] - n[1]) == 0 && a * s <= 0 && o * u <= 0) return !1;\n ke(t, h[f], h[f + 1]) && (l = !l);\n }\n }\n\n return l;\n }\n\n function ze(t, e) {\n for (var r = 0; r < e.length; r++) {\n if (Ie(t, e[r])) return !0;\n }\n\n return !1;\n }\n\n function Ce(t, e, r, n) {\n var i = n[0] - r[0],\n a = n[1] - r[1],\n o = (t[0] - r[0]) * a - i * (t[1] - r[1]),\n s = (e[0] - r[0]) * a - i * (e[1] - r[1]);\n return o > 0 && s < 0 || o < 0 && s > 0;\n }\n\n function Ee(t, e, r) {\n for (var n = 0, i = r; n < i.length; n += 1) {\n for (var a = i[n], o = 0; o < a.length - 1; ++o) {\n if (0 != (c = [(p = a[o + 1])[0] - (l = a[o])[0], p[1] - l[1]])[0] * (h = [(u = e)[0] - (s = t)[0], u[1] - s[1]])[1] - c[1] * h[0] && Ce(s, u, l, p) && Ce(l, p, s, u)) return !0;\n }\n }\n\n var s, u, l, p, c, h;\n return !1;\n }\n\n function Pe(t, e) {\n for (var r = 0; r < t.length; ++r) {\n if (!Ie(t[r], e)) return !1;\n }\n\n for (var n = 0; n < t.length - 1; ++n) {\n if (Ee(t[n], t[n + 1], e)) return !1;\n }\n\n return !0;\n }\n\n function Me(t, e) {\n for (var r = 0; r < e.length; r++) {\n if (Pe(t, e[r])) return !0;\n }\n\n return !1;\n }\n\n function Be(t, e, r) {\n for (var n = [], i = 0; i < t.length; i++) {\n for (var a = [], o = 0; o < t[i].length; o++) {\n var s = Se(t[i][o], r);\n _e(e, s), a.push(s);\n }\n\n n.push(a);\n }\n\n return n;\n }\n\n function Te(t, e, r) {\n for (var n = [], i = 0; i < t.length; i++) {\n var a = Be(t[i], e, r);\n n.push(a);\n }\n\n return n;\n }\n\n function Ve(t, e, r, n) {\n if (t[0] < r[0] || t[0] > r[2]) {\n var i = .5 * n,\n a = t[0] - r[0] > i ? -n : r[0] - t[0] > i ? n : 0;\n 0 === a && (a = t[0] - r[2] > i ? -n : r[2] - t[0] > i ? n : 0), t[0] += a;\n }\n\n _e(e, t);\n }\n\n function Fe(t, e, r, n) {\n for (var i = 8192 * Math.pow(2, n.z), a = [8192 * n.x, 8192 * n.y], o = [], s = 0, u = t; s < u.length; s += 1) {\n for (var l = 0, p = u[s]; l < p.length; l += 1) {\n var c = p[l],\n h = [c.x + a[0], c.y + a[1]];\n Ve(h, e, r, i), o.push(h);\n }\n }\n\n return o;\n }\n\n function De(t, e, r, n) {\n for (var i, a = 8192 * Math.pow(2, n.z), o = [8192 * n.x, 8192 * n.y], s = [], u = 0, l = t; u < l.length; u += 1) {\n for (var p = [], c = 0, h = l[u]; c < h.length; c += 1) {\n var f = h[c],\n y = [f.x + o[0], f.y + o[1]];\n _e(e, y), p.push(y);\n }\n\n s.push(p);\n }\n\n if (e[2] - e[0] <= a / 2) {\n (i = e)[0] = i[1] = 1 / 0, i[2] = i[3] = -1 / 0;\n\n for (var d = 0, m = s; d < m.length; d += 1) {\n for (var v = 0, g = m[d]; v < g.length; v += 1) {\n Ve(g[v], e, r, a);\n }\n }\n }\n\n return s;\n }\n\n we.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected one argument.");\n var r = t[1];\n if ("object" != typeof r || Array.isArray(r)) return e.error("Collator options argument must be an object.");\n var n = e.parse(void 0 !== r["case-sensitive"] && r["case-sensitive"], 1, jt);\n if (!n) return null;\n var i = e.parse(void 0 !== r["diacritic-sensitive"] && r["diacritic-sensitive"], 1, jt);\n if (!i) return null;\n var a = null;\n return r.locale && !(a = e.parse(r.locale, 1, Ut)) ? null : new we(n, i, a);\n }, we.prototype.evaluate = function (t) {\n return new re(this.caseSensitive.evaluate(t), this.diacriticSensitive.evaluate(t), this.locale ? this.locale.evaluate(t) : null);\n }, we.prototype.eachChild = function (t) {\n t(this.caseSensitive), t(this.diacriticSensitive), this.locale && t(this.locale);\n }, we.prototype.outputDefined = function () {\n return !1;\n }, we.prototype.serialize = function () {\n var t = {};\n return t["case-sensitive"] = this.caseSensitive.serialize(), t["diacritic-sensitive"] = this.diacriticSensitive.serialize(), this.locale && (t.locale = this.locale.serialize()), ["collator", t];\n };\n\n var Le = function Le(t, e) {\n this.type = jt, this.geojson = t, this.geometries = e;\n };\n\n function Re(t) {\n if (t instanceof be) {\n if ("get" === t.name && 1 === t.args.length) return !1;\n if ("feature-state" === t.name) return !1;\n if ("has" === t.name && 1 === t.args.length) return !1;\n if ("properties" === t.name || "geometry-type" === t.name || "id" === t.name) return !1;\n if (/^filter-/.test(t.name)) return !1;\n }\n\n if (t instanceof Le) return !1;\n var e = !0;\n return t.eachChild(function (t) {\n e && !Re(t) && (e = !1);\n }), e;\n }\n\n function Oe(t) {\n if (t instanceof be && "feature-state" === t.name) return !1;\n var e = !0;\n return t.eachChild(function (t) {\n e && !Oe(t) && (e = !1);\n }), e;\n }\n\n function Ue(t, e) {\n if (t instanceof be && e.indexOf(t.name) >= 0) return !1;\n var r = !0;\n return t.eachChild(function (t) {\n r && !Ue(t, e) && (r = !1);\n }), r;\n }\n\n Le.parse = function (t, e) {\n if (2 !== t.length) return e.error("\'within\' expression requires exactly one argument, but found " + (t.length - 1) + " instead.");\n\n if (se(t[1])) {\n var r = t[1];\n if ("FeatureCollection" === r.type) for (var n = 0; n < r.features.length; ++n) {\n var i = r.features[n].geometry.type;\n if ("Polygon" === i || "MultiPolygon" === i) return new Le(r, r.features[n].geometry);\n } else if ("Feature" === r.type) {\n var a = r.geometry.type;\n if ("Polygon" === a || "MultiPolygon" === a) return new Le(r, r.geometry);\n } else if ("Polygon" === r.type || "MultiPolygon" === r.type) return new Le(r, r);\n }\n\n return e.error("\'within\' expression requires valid geojson object that contains polygon geometry type.");\n }, Le.prototype.evaluate = function (t) {\n if (null != t.geometry() && null != t.canonicalID()) {\n if ("Point" === t.geometryType()) return function (t, e) {\n var r = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n n = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n i = t.canonicalID();\n\n if ("Polygon" === e.type) {\n var a = Be(e.coordinates, n, i),\n o = Fe(t.geometry(), r, n, i);\n if (!Ae(r, n)) return !1;\n\n for (var s = 0, u = o; s < u.length; s += 1) {\n if (!Ie(u[s], a)) return !1;\n }\n }\n\n if ("MultiPolygon" === e.type) {\n var l = Te(e.coordinates, n, i),\n p = Fe(t.geometry(), r, n, i);\n if (!Ae(r, n)) return !1;\n\n for (var c = 0, h = p; c < h.length; c += 1) {\n if (!ze(h[c], l)) return !1;\n }\n }\n\n return !0;\n }(t, this.geometries);\n if ("LineString" === t.geometryType()) return function (t, e) {\n var r = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n n = [1 / 0, 1 / 0, -1 / 0, -1 / 0],\n i = t.canonicalID();\n\n if ("Polygon" === e.type) {\n var a = Be(e.coordinates, n, i),\n o = De(t.geometry(), r, n, i);\n if (!Ae(r, n)) return !1;\n\n for (var s = 0, u = o; s < u.length; s += 1) {\n if (!Pe(u[s], a)) return !1;\n }\n }\n\n if ("MultiPolygon" === e.type) {\n var l = Te(e.coordinates, n, i),\n p = De(t.geometry(), r, n, i);\n if (!Ae(r, n)) return !1;\n\n for (var c = 0, h = p; c < h.length; c += 1) {\n if (!Me(h[c], l)) return !1;\n }\n }\n\n return !0;\n }(t, this.geometries);\n }\n\n return !1;\n }, Le.prototype.eachChild = function () {}, Le.prototype.outputDefined = function () {\n return !0;\n }, Le.prototype.serialize = function () {\n return ["within", this.geojson];\n };\n\n var je = function je(t, e) {\n this.type = e.type, this.name = t, this.boundExpression = e;\n };\n\n je.parse = function (t, e) {\n if (2 !== t.length || "string" != typeof t[1]) return e.error("\'var\' expression requires exactly one string literal argument.");\n var r = t[1];\n return e.scope.has(r) ? new je(r, e.scope.get(r)) : e.error(\'Unknown variable "\' + r + \'". Make sure "\' + r + \'" has been bound in an enclosing "let" expression before using it.\', 1);\n }, je.prototype.evaluate = function (t) {\n return this.boundExpression.evaluate(t);\n }, je.prototype.eachChild = function () {}, je.prototype.outputDefined = function () {\n return !1;\n }, je.prototype.serialize = function () {\n return ["var", this.name];\n };\n\n var qe = function qe(t, e, r, n, i) {\n void 0 === e && (e = []), void 0 === n && (n = new Lt()), void 0 === i && (i = []), this.registry = t, this.path = e, this.key = e.map(function (t) {\n return "[" + t + "]";\n }).join(""), this.scope = n, this.errors = i, this.expectedType = r;\n };\n\n function Ne(t, e) {\n for (var r, n = t.length - 1, i = 0, a = n, o = 0; i <= a;) {\n if ((r = t[o = Math.floor((i + a) / 2)]) <= e) {\n if (o === n || e < t[o + 1]) return o;\n i = o + 1;\n } else {\n if (!(r > e)) throw new ce("Input is not a number.");\n a = o - 1;\n }\n }\n\n return 0;\n }\n\n qe.prototype.parse = function (t, e, r, n, i) {\n return void 0 === i && (i = {}), e ? this.concat(e, r, n)._parse(t, i) : this._parse(t, i);\n }, qe.prototype._parse = function (t, e) {\n function r(t, e, r) {\n return "assert" === r ? new fe(e, [t]) : "coerce" === r ? new ve(e, [t]) : t;\n }\n\n if (null !== t && "string" != typeof t && "boolean" != typeof t && "number" != typeof t || (t = ["literal", t]), Array.isArray(t)) {\n if (0 === t.length) return this.error(\'Expected an array with at least one element. If you wanted a literal array, use ["literal", []].\');\n var n = t[0];\n if ("string" != typeof n) return this.error("Expression name must be a string, but found " + typeof n + \' instead. If you wanted a literal array, use ["literal", [...]].\', 0), null;\n var i = this.registry[n];\n\n if (i) {\n var a = i.parse(t, this);\n if (!a) return null;\n\n if (this.expectedType) {\n var o = this.expectedType,\n s = a.type;\n if ("string" !== o.kind && "number" !== o.kind && "boolean" !== o.kind && "object" !== o.kind && "array" !== o.kind || "value" !== s.kind) {\n if ("color" !== o.kind && "formatted" !== o.kind && "resolvedImage" !== o.kind || "value" !== s.kind && "string" !== s.kind) {\n if (this.checkSubtype(o, s)) return null;\n } else a = r(a, o, e.typeAnnotation || "coerce");\n } else a = r(a, o, e.typeAnnotation || "assert");\n }\n\n if (!(a instanceof pe) && "resolvedImage" !== a.type.kind && function t(e) {\n if (e instanceof je) return t(e.boundExpression);\n if (e instanceof be && "error" === e.name) return !1;\n if (e instanceof we) return !1;\n if (e instanceof Le) return !1;\n var r = e instanceof ve || e instanceof fe,\n n = !0;\n return e.eachChild(function (e) {\n n = r ? n && t(e) : n && e instanceof pe;\n }), !!n && Re(e) && Ue(e, ["zoom", "heatmap-density", "line-progress", "accumulated", "is-supported-script"]);\n }(a)) {\n var u = new xe();\n\n try {\n a = new pe(a.type, a.evaluate(u));\n } catch (t) {\n return this.error(t.message), null;\n }\n }\n\n return a;\n }\n\n return this.error(\'Unknown expression "\' + n + \'". If you wanted a literal array, use ["literal", [...]].\', 0);\n }\n\n return this.error(void 0 === t ? "\'undefined\' value invalid. Use null instead." : "object" == typeof t ? \'Bare objects invalid. Use ["literal", {...}] instead.\' : "Expected an array, but found " + typeof t + " instead.");\n }, qe.prototype.concat = function (t, e, r) {\n var n = "number" == typeof t ? this.path.concat(t) : this.path,\n i = r ? this.scope.concat(r) : this.scope;\n return new qe(this.registry, n, e || null, i, this.errors);\n }, qe.prototype.error = function (t) {\n for (var e = [], r = arguments.length - 1; r-- > 0;) {\n e[r] = arguments[r + 1];\n }\n\n var n = "" + this.key + e.map(function (t) {\n return "[" + t + "]";\n }).join("");\n this.errors.push(new Dt(n, t));\n }, qe.prototype.checkSubtype = function (t, e) {\n var r = $t(t, e);\n return r && this.error(r), r;\n };\n\n var Ke = function Ke(t, e, r) {\n this.type = t, this.input = e, this.labels = [], this.outputs = [];\n\n for (var n = 0, i = r; n < i.length; n += 1) {\n var a = i[n],\n o = a[1];\n this.labels.push(a[0]), this.outputs.push(o);\n }\n };\n\n function Ge(t, e, r) {\n return t * (1 - r) + e * r;\n }\n\n Ke.parse = function (t, e) {\n if (t.length - 1 < 4) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if ((t.length - 1) % 2 != 0) return e.error("Expected an even number of arguments.");\n var r = e.parse(t[1], 1, Ot);\n if (!r) return null;\n var n = [],\n i = null;\n e.expectedType && "value" !== e.expectedType.kind && (i = e.expectedType);\n\n for (var a = 1; a < t.length; a += 2) {\n var o = 1 === a ? -1 / 0 : t[a],\n s = t[a + 1],\n u = a,\n l = a + 1;\n if ("number" != typeof o) return e.error(\'Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.\', u);\n if (n.length && n[n.length - 1][0] >= o) return e.error(\'Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.\', u);\n var p = e.parse(s, l, i);\n if (!p) return null;\n i = i || p.type, n.push([o, p]);\n }\n\n return new Ke(i, r, n);\n }, Ke.prototype.evaluate = function (t) {\n var e = this.labels,\n r = this.outputs;\n if (1 === e.length) return r[0].evaluate(t);\n var n = this.input.evaluate(t);\n if (n <= e[0]) return r[0].evaluate(t);\n var i = e.length;\n return n >= e[i - 1] ? r[i - 1].evaluate(t) : r[Ne(e, n)].evaluate(t);\n }, Ke.prototype.eachChild = function (t) {\n t(this.input);\n\n for (var e = 0, r = this.outputs; e < r.length; e += 1) {\n t(r[e]);\n }\n }, Ke.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n });\n }, Ke.prototype.serialize = function () {\n for (var t = ["step", this.input.serialize()], e = 0; e < this.labels.length; e++) {\n e > 0 && t.push(this.labels[e]), t.push(this.outputs[e].serialize());\n }\n\n return t;\n };\n var Ze = Object.freeze({\n __proto__: null,\n number: Ge,\n color: function color(t, e, r) {\n return new ee(Ge(t.r, e.r, r), Ge(t.g, e.g, r), Ge(t.b, e.b, r), Ge(t.a, e.a, r));\n },\n array: function array(t, e, r) {\n return t.map(function (t, n) {\n return Ge(t, e[n], r);\n });\n }\n }),\n Xe = 6 / 29 * 3 * (6 / 29),\n Je = Math.PI / 180,\n He = 180 / Math.PI;\n\n function Ye(t) {\n return t > .008856451679035631 ? Math.pow(t, 1 / 3) : t / Xe + 4 / 29;\n }\n\n function $e(t) {\n return t > 6 / 29 ? t * t * t : Xe * (t - 4 / 29);\n }\n\n function We(t) {\n return 255 * (t <= .0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - .055);\n }\n\n function Qe(t) {\n return (t /= 255) <= .04045 ? t / 12.92 : Math.pow((t + .055) / 1.055, 2.4);\n }\n\n function tr(t) {\n var e = Qe(t.r),\n r = Qe(t.g),\n n = Qe(t.b),\n i = Ye((.4124564 * e + .3575761 * r + .1804375 * n) / .95047),\n a = Ye((.2126729 * e + .7151522 * r + .072175 * n) / 1);\n return {\n l: 116 * a - 16,\n a: 500 * (i - a),\n b: 200 * (a - Ye((.0193339 * e + .119192 * r + .9503041 * n) / 1.08883)),\n alpha: t.a\n };\n }\n\n function er(t) {\n var e = (t.l + 16) / 116,\n r = isNaN(t.a) ? e : e + t.a / 500,\n n = isNaN(t.b) ? e : e - t.b / 200;\n return e = 1 * $e(e), r = .95047 * $e(r), n = 1.08883 * $e(n), new ee(We(3.2404542 * r - 1.5371385 * e - .4985314 * n), We(-.969266 * r + 1.8760108 * e + .041556 * n), We(.0556434 * r - .2040259 * e + 1.0572252 * n), t.alpha);\n }\n\n function rr(t, e, r) {\n var n = e - t;\n return t + r * (n > 180 || n < -180 ? n - 360 * Math.round(n / 360) : n);\n }\n\n var nr = {\n forward: tr,\n reverse: er,\n interpolate: function interpolate(t, e, r) {\n return {\n l: Ge(t.l, e.l, r),\n a: Ge(t.a, e.a, r),\n b: Ge(t.b, e.b, r),\n alpha: Ge(t.alpha, e.alpha, r)\n };\n }\n },\n ir = {\n forward: function forward(t) {\n var e = tr(t),\n r = e.l,\n n = e.a,\n i = e.b,\n a = Math.atan2(i, n) * He;\n return {\n h: a < 0 ? a + 360 : a,\n c: Math.sqrt(n * n + i * i),\n l: r,\n alpha: t.a\n };\n },\n reverse: function reverse(t) {\n var e = t.h * Je,\n r = t.c;\n return er({\n l: t.l,\n a: Math.cos(e) * r,\n b: Math.sin(e) * r,\n alpha: t.alpha\n });\n },\n interpolate: function interpolate(t, e, r) {\n return {\n h: rr(t.h, e.h, r),\n c: Ge(t.c, e.c, r),\n l: Ge(t.l, e.l, r),\n alpha: Ge(t.alpha, e.alpha, r)\n };\n }\n },\n ar = Object.freeze({\n __proto__: null,\n lab: nr,\n hcl: ir\n }),\n or = function or(t, e, r, n, i) {\n this.type = t, this.operator = e, this.interpolation = r, this.input = n, this.labels = [], this.outputs = [];\n\n for (var a = 0, o = i; a < o.length; a += 1) {\n var s = o[a],\n u = s[1];\n this.labels.push(s[0]), this.outputs.push(u);\n }\n };\n\n function sr(t, e, r, n) {\n var i = n - r,\n a = t - r;\n return 0 === i ? 0 : 1 === e ? a / i : (Math.pow(e, a) - 1) / (Math.pow(e, i) - 1);\n }\n\n or.interpolationFactor = function (t, e, n, i) {\n var a = 0;\n if ("exponential" === t.name) a = sr(e, t.base, n, i);else if ("linear" === t.name) a = sr(e, 1, n, i);else if ("cubic-bezier" === t.name) {\n var o = t.controlPoints;\n a = new r(o[0], o[1], o[2], o[3]).solve(sr(e, 1, n, i));\n }\n return a;\n }, or.parse = function (t, e) {\n var r = t[0],\n n = t[1],\n i = t[2],\n a = t.slice(3);\n if (!Array.isArray(n) || 0 === n.length) return e.error("Expected an interpolation type expression.", 1);\n if ("linear" === n[0]) n = {\n name: "linear"\n };else if ("exponential" === n[0]) {\n var o = n[1];\n if ("number" != typeof o) return e.error("Exponential interpolation requires a numeric base.", 1, 1);\n n = {\n name: "exponential",\n base: o\n };\n } else {\n if ("cubic-bezier" !== n[0]) return e.error("Unknown interpolation type " + String(n[0]), 1, 0);\n var s = n.slice(1);\n if (4 !== s.length || s.some(function (t) {\n return "number" != typeof t || t < 0 || t > 1;\n })) return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.", 1);\n n = {\n name: "cubic-bezier",\n controlPoints: s\n };\n }\n if (t.length - 1 < 4) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if ((t.length - 1) % 2 != 0) return e.error("Expected an even number of arguments.");\n if (!(i = e.parse(i, 2, Ot))) return null;\n var u = [],\n l = null;\n "interpolate-hcl" === r || "interpolate-lab" === r ? l = qt : e.expectedType && "value" !== e.expectedType.kind && (l = e.expectedType);\n\n for (var p = 0; p < a.length; p += 2) {\n var c = a[p],\n h = a[p + 1],\n f = p + 3,\n y = p + 4;\n if ("number" != typeof c) return e.error(\'Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.\', f);\n if (u.length && u[u.length - 1][0] >= c) return e.error(\'Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.\', f);\n var d = e.parse(h, y, l);\n if (!d) return null;\n l = l || d.type, u.push([c, d]);\n }\n\n return "number" === l.kind || "color" === l.kind || "array" === l.kind && "number" === l.itemType.kind && "number" == typeof l.N ? new or(l, r, n, i, u) : e.error("Type " + Ht(l) + " is not interpolatable.");\n }, or.prototype.evaluate = function (t) {\n var e = this.labels,\n r = this.outputs;\n if (1 === e.length) return r[0].evaluate(t);\n var n = this.input.evaluate(t);\n if (n <= e[0]) return r[0].evaluate(t);\n var i = e.length;\n if (n >= e[i - 1]) return r[i - 1].evaluate(t);\n var a = Ne(e, n),\n o = or.interpolationFactor(this.interpolation, n, e[a], e[a + 1]),\n s = r[a].evaluate(t),\n u = r[a + 1].evaluate(t);\n return "interpolate" === this.operator ? Ze[this.type.kind.toLowerCase()](s, u, o) : "interpolate-hcl" === this.operator ? ir.reverse(ir.interpolate(ir.forward(s), ir.forward(u), o)) : nr.reverse(nr.interpolate(nr.forward(s), nr.forward(u), o));\n }, or.prototype.eachChild = function (t) {\n t(this.input);\n\n for (var e = 0, r = this.outputs; e < r.length; e += 1) {\n t(r[e]);\n }\n }, or.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n });\n }, or.prototype.serialize = function () {\n var t;\n t = "linear" === this.interpolation.name ? ["linear"] : "exponential" === this.interpolation.name ? 1 === this.interpolation.base ? ["linear"] : ["exponential", this.interpolation.base] : ["cubic-bezier"].concat(this.interpolation.controlPoints);\n\n for (var e = [this.operator, t, this.input.serialize()], r = 0; r < this.labels.length; r++) {\n e.push(this.labels[r], this.outputs[r].serialize());\n }\n\n return e;\n };\n\n var ur = function ur(t, e) {\n this.type = t, this.args = e;\n };\n\n ur.parse = function (t, e) {\n if (t.length < 2) return e.error("Expectected at least one argument.");\n var r = null,\n n = e.expectedType;\n n && "value" !== n.kind && (r = n);\n\n for (var i = [], a = 0, o = t.slice(1); a < o.length; a += 1) {\n var s = e.parse(o[a], 1 + i.length, r, void 0, {\n typeAnnotation: "omit"\n });\n if (!s) return null;\n r = r || s.type, i.push(s);\n }\n\n var u = n && i.some(function (t) {\n return $t(n, t.type);\n });\n return new ur(u ? Kt : r, i);\n }, ur.prototype.evaluate = function (t) {\n for (var e, r = null, n = 0, i = 0, a = this.args; i < a.length && (n++, (r = a[i].evaluate(t)) && r instanceof ae && !r.available && (e || (e = r.name), r = null, n === this.args.length && (r = e)), null === r); i += 1) {\n ;\n }\n\n return r;\n }, ur.prototype.eachChild = function (t) {\n this.args.forEach(t);\n }, ur.prototype.outputDefined = function () {\n return this.args.every(function (t) {\n return t.outputDefined();\n });\n }, ur.prototype.serialize = function () {\n var t = ["coalesce"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var lr = function lr(t, e) {\n this.type = e.type, this.bindings = [].concat(t), this.result = e;\n };\n\n lr.prototype.evaluate = function (t) {\n return this.result.evaluate(t);\n }, lr.prototype.eachChild = function (t) {\n for (var e = 0, r = this.bindings; e < r.length; e += 1) {\n t(r[e][1]);\n }\n\n t(this.result);\n }, lr.parse = function (t, e) {\n if (t.length < 4) return e.error("Expected at least 3 arguments, but found " + (t.length - 1) + " instead.");\n\n for (var r = [], n = 1; n < t.length - 1; n += 2) {\n var i = t[n];\n if ("string" != typeof i) return e.error("Expected string, but found " + typeof i + " instead.", n);\n if (/[^a-zA-Z0-9_]/.test(i)) return e.error("Variable names must contain only alphanumeric characters or \'_\'.", n);\n var a = e.parse(t[n + 1], n + 1);\n if (!a) return null;\n r.push([i, a]);\n }\n\n var o = e.parse(t[t.length - 1], t.length - 1, e.expectedType, r);\n return o ? new lr(r, o) : null;\n }, lr.prototype.outputDefined = function () {\n return this.result.outputDefined();\n }, lr.prototype.serialize = function () {\n for (var t = ["let"], e = 0, r = this.bindings; e < r.length; e += 1) {\n var n = r[e];\n t.push(n[0], n[1].serialize());\n }\n\n return t.push(this.result.serialize()), t;\n };\n\n var pr = function pr(t, e, r) {\n this.type = t, this.index = e, this.input = r;\n };\n\n pr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected 2 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Ot),\n n = e.parse(t[2], 2, Jt(e.expectedType || Kt));\n return r && n ? new pr(n.type.itemType, r, n) : null;\n }, pr.prototype.evaluate = function (t) {\n var e = this.index.evaluate(t),\n r = this.input.evaluate(t);\n if (e < 0) throw new ce("Array index out of bounds: " + e + " < 0.");\n if (e >= r.length) throw new ce("Array index out of bounds: " + e + " > " + (r.length - 1) + ".");\n if (e !== Math.floor(e)) throw new ce("Array index must be an integer, but found " + e + " instead.");\n return r[e];\n }, pr.prototype.eachChild = function (t) {\n t(this.index), t(this.input);\n }, pr.prototype.outputDefined = function () {\n return !1;\n }, pr.prototype.serialize = function () {\n return ["at", this.index.serialize(), this.input.serialize()];\n };\n\n var cr = function cr(t, e) {\n this.type = jt, this.needle = t, this.haystack = e;\n };\n\n cr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected 2 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Kt),\n n = e.parse(t[2], 2, Kt);\n return r && n ? Wt(r.type, [jt, Ut, Ot, Rt, Kt]) ? new cr(r, n) : e.error("Expected first argument to be of type boolean, string, number or null, but found " + Ht(r.type) + " instead") : null;\n }, cr.prototype.evaluate = function (t) {\n var e = this.needle.evaluate(t),\n r = this.haystack.evaluate(t);\n if (!r) return !1;\n if (!Qt(e, ["boolean", "string", "number", "null"])) throw new ce("Expected first argument to be of type boolean, string, number or null, but found " + Ht(ue(e)) + " instead.");\n if (!Qt(r, ["string", "array"])) throw new ce("Expected second argument to be of type array or string, but found " + Ht(ue(r)) + " instead.");\n return r.indexOf(e) >= 0;\n }, cr.prototype.eachChild = function (t) {\n t(this.needle), t(this.haystack);\n }, cr.prototype.outputDefined = function () {\n return !0;\n }, cr.prototype.serialize = function () {\n return ["in", this.needle.serialize(), this.haystack.serialize()];\n };\n\n var hr = function hr(t, e, r) {\n this.type = Ot, this.needle = t, this.haystack = e, this.fromIndex = r;\n };\n\n hr.parse = function (t, e) {\n if (t.length <= 2 || t.length >= 5) return e.error("Expected 3 or 4 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Kt),\n n = e.parse(t[2], 2, Kt);\n if (!r || !n) return null;\n if (!Wt(r.type, [jt, Ut, Ot, Rt, Kt])) return e.error("Expected first argument to be of type boolean, string, number or null, but found " + Ht(r.type) + " instead");\n\n if (4 === t.length) {\n var i = e.parse(t[3], 3, Ot);\n return i ? new hr(r, n, i) : null;\n }\n\n return new hr(r, n);\n }, hr.prototype.evaluate = function (t) {\n var e = this.needle.evaluate(t),\n r = this.haystack.evaluate(t);\n if (!Qt(e, ["boolean", "string", "number", "null"])) throw new ce("Expected first argument to be of type boolean, string, number or null, but found " + Ht(ue(e)) + " instead.");\n if (!Qt(r, ["string", "array"])) throw new ce("Expected second argument to be of type array or string, but found " + Ht(ue(r)) + " instead.");\n\n if (this.fromIndex) {\n var n = this.fromIndex.evaluate(t);\n return r.indexOf(e, n);\n }\n\n return r.indexOf(e);\n }, hr.prototype.eachChild = function (t) {\n t(this.needle), t(this.haystack), this.fromIndex && t(this.fromIndex);\n }, hr.prototype.outputDefined = function () {\n return !1;\n }, hr.prototype.serialize = function () {\n if (null != this.fromIndex && void 0 !== this.fromIndex) {\n var t = this.fromIndex.serialize();\n return ["index-of", this.needle.serialize(), this.haystack.serialize(), t];\n }\n\n return ["index-of", this.needle.serialize(), this.haystack.serialize()];\n };\n\n var fr = function fr(t, e, r, n, i, a) {\n this.inputType = t, this.type = e, this.input = r, this.cases = n, this.outputs = i, this.otherwise = a;\n };\n\n fr.parse = function (t, e) {\n if (t.length < 5) return e.error("Expected at least 4 arguments, but found only " + (t.length - 1) + ".");\n if (t.length % 2 != 1) return e.error("Expected an even number of arguments.");\n var r, n;\n e.expectedType && "value" !== e.expectedType.kind && (n = e.expectedType);\n\n for (var i = {}, a = [], o = 2; o < t.length - 1; o += 2) {\n var s = t[o],\n u = t[o + 1];\n Array.isArray(s) || (s = [s]);\n var l = e.concat(o);\n if (0 === s.length) return l.error("Expected at least one branch label.");\n\n for (var p = 0, c = s; p < c.length; p += 1) {\n var h = c[p];\n if ("number" != typeof h && "string" != typeof h) return l.error("Branch labels must be numbers or strings.");\n if ("number" == typeof h && Math.abs(h) > Number.MAX_SAFE_INTEGER) return l.error("Branch labels must be integers no larger than " + Number.MAX_SAFE_INTEGER + ".");\n if ("number" == typeof h && Math.floor(h) !== h) return l.error("Numeric branch labels must be integer values.");\n\n if (r) {\n if (l.checkSubtype(r, ue(h))) return null;\n } else r = ue(h);\n\n if (void 0 !== i[String(h)]) return l.error("Branch labels must be unique.");\n i[String(h)] = a.length;\n }\n\n var f = e.parse(u, o, n);\n if (!f) return null;\n n = n || f.type, a.push(f);\n }\n\n var y = e.parse(t[1], 1, Kt);\n if (!y) return null;\n var d = e.parse(t[t.length - 1], t.length - 1, n);\n return d ? "value" !== y.type.kind && e.concat(1).checkSubtype(r, y.type) ? null : new fr(r, n, y, i, a, d) : null;\n }, fr.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t);\n return (ue(e) === this.inputType && this.outputs[this.cases[e]] || this.otherwise).evaluate(t);\n }, fr.prototype.eachChild = function (t) {\n t(this.input), this.outputs.forEach(t), t(this.otherwise);\n }, fr.prototype.outputDefined = function () {\n return this.outputs.every(function (t) {\n return t.outputDefined();\n }) && this.otherwise.outputDefined();\n }, fr.prototype.serialize = function () {\n for (var t = this, e = ["match", this.input.serialize()], r = [], n = {}, i = 0, a = Object.keys(this.cases).sort(); i < a.length; i += 1) {\n var o = a[i];\n void 0 === (c = n[this.cases[o]]) ? (n[this.cases[o]] = r.length, r.push([this.cases[o], [o]])) : r[c][1].push(o);\n }\n\n for (var s = function s(e) {\n return "number" === t.inputType.kind ? Number(e) : e;\n }, u = 0, l = r; u < l.length; u += 1) {\n var p = l[u],\n c = p[0],\n h = p[1];\n e.push(1 === h.length ? s(h[0]) : h.map(s)), e.push(this.outputs[outputIndex$1].serialize());\n }\n\n return e.push(this.otherwise.serialize()), e;\n };\n\n var yr = function yr(t, e, r) {\n this.type = t, this.branches = e, this.otherwise = r;\n };\n\n yr.parse = function (t, e) {\n if (t.length < 4) return e.error("Expected at least 3 arguments, but found only " + (t.length - 1) + ".");\n if (t.length % 2 != 0) return e.error("Expected an odd number of arguments.");\n var r;\n e.expectedType && "value" !== e.expectedType.kind && (r = e.expectedType);\n\n for (var n = [], i = 1; i < t.length - 1; i += 2) {\n var a = e.parse(t[i], i, jt);\n if (!a) return null;\n var o = e.parse(t[i + 1], i + 1, r);\n if (!o) return null;\n n.push([a, o]), r = r || o.type;\n }\n\n var s = e.parse(t[t.length - 1], t.length - 1, r);\n return s ? new yr(r, n, s) : null;\n }, yr.prototype.evaluate = function (t) {\n for (var e = 0, r = this.branches; e < r.length; e += 1) {\n var n = r[e],\n i = n[1];\n if (n[0].evaluate(t)) return i.evaluate(t);\n }\n\n return this.otherwise.evaluate(t);\n }, yr.prototype.eachChild = function (t) {\n for (var e = 0, r = this.branches; e < r.length; e += 1) {\n var n = r[e],\n i = n[1];\n t(n[0]), t(i);\n }\n\n t(this.otherwise);\n }, yr.prototype.outputDefined = function () {\n return this.branches.every(function (t) {\n return t[1].outputDefined();\n }) && this.otherwise.outputDefined();\n }, yr.prototype.serialize = function () {\n var t = ["case"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n\n var dr = function dr(t, e, r, n) {\n this.type = t, this.input = e, this.beginIndex = r, this.endIndex = n;\n };\n\n function mr(t, e) {\n return "==" === t || "!=" === t ? "boolean" === e.kind || "string" === e.kind || "number" === e.kind || "null" === e.kind || "value" === e.kind : "string" === e.kind || "number" === e.kind || "value" === e.kind;\n }\n\n function vr(t, e, r, n) {\n return 0 === n.compare(e, r);\n }\n\n function gr(t, e, r) {\n var n = "==" !== t && "!=" !== t;\n return function () {\n function i(t, e, r) {\n this.type = jt, this.lhs = t, this.rhs = e, this.collator = r, this.hasUntypedArgument = "value" === t.type.kind || "value" === e.type.kind;\n }\n\n return i.parse = function (t, e) {\n if (3 !== t.length && 4 !== t.length) return e.error("Expected two or three arguments.");\n var r = t[0],\n a = e.parse(t[1], 1, Kt);\n if (!a) return null;\n if (!mr(r, a.type)) return e.concat(1).error(\'"\' + r + "\\" comparisons are not supported for type \'" + Ht(a.type) + "\'.");\n var o = e.parse(t[2], 2, Kt);\n if (!o) return null;\n if (!mr(r, o.type)) return e.concat(2).error(\'"\' + r + "\\" comparisons are not supported for type \'" + Ht(o.type) + "\'.");\n if (a.type.kind !== o.type.kind && "value" !== a.type.kind && "value" !== o.type.kind) return e.error("Cannot compare types \'" + Ht(a.type) + "\' and \'" + Ht(o.type) + "\'.");\n n && ("value" === a.type.kind && "value" !== o.type.kind ? a = new fe(o.type, [a]) : "value" !== a.type.kind && "value" === o.type.kind && (o = new fe(a.type, [o])));\n var s = null;\n\n if (4 === t.length) {\n if ("string" !== a.type.kind && "string" !== o.type.kind && "value" !== a.type.kind && "value" !== o.type.kind) return e.error("Cannot use collator to compare non-string types.");\n if (!(s = e.parse(t[3], 3, Gt))) return null;\n }\n\n return new i(a, o, s);\n }, i.prototype.evaluate = function (i) {\n var a = this.lhs.evaluate(i),\n o = this.rhs.evaluate(i);\n\n if (n && this.hasUntypedArgument) {\n var s = ue(a),\n u = ue(o);\n if (s.kind !== u.kind || "string" !== s.kind && "number" !== s.kind) throw new ce(\'Expected arguments for "\' + t + \'" to be (string, string) or (number, number), but found (\' + s.kind + ", " + u.kind + ") instead.");\n }\n\n if (this.collator && !n && this.hasUntypedArgument) {\n var l = ue(a),\n p = ue(o);\n if ("string" !== l.kind || "string" !== p.kind) return e(i, a, o);\n }\n\n return this.collator ? r(i, a, o, this.collator.evaluate(i)) : e(i, a, o);\n }, i.prototype.eachChild = function (t) {\n t(this.lhs), t(this.rhs), this.collator && t(this.collator);\n }, i.prototype.outputDefined = function () {\n return !0;\n }, i.prototype.serialize = function () {\n var e = [t];\n return this.eachChild(function (t) {\n e.push(t.serialize());\n }), e;\n }, i;\n }();\n }\n\n dr.parse = function (t, e) {\n if (t.length <= 2 || t.length >= 5) return e.error("Expected 3 or 4 arguments, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1, Kt),\n n = e.parse(t[2], 2, Ot);\n if (!r || !n) return null;\n if (!Wt(r.type, [Jt(Kt), Ut, Kt])) return e.error("Expected first argument to be of type array or string, but found " + Ht(r.type) + " instead");\n\n if (4 === t.length) {\n var i = e.parse(t[3], 3, Ot);\n return i ? new dr(r.type, r, n, i) : null;\n }\n\n return new dr(r.type, r, n);\n }, dr.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t),\n r = this.beginIndex.evaluate(t);\n if (!Qt(e, ["string", "array"])) throw new ce("Expected first argument to be of type array or string, but found " + Ht(ue(e)) + " instead.");\n\n if (this.endIndex) {\n var n = this.endIndex.evaluate(t);\n return e.slice(r, n);\n }\n\n return e.slice(r);\n }, dr.prototype.eachChild = function (t) {\n t(this.input), t(this.beginIndex), this.endIndex && t(this.endIndex);\n }, dr.prototype.outputDefined = function () {\n return !1;\n }, dr.prototype.serialize = function () {\n if (null != this.endIndex && void 0 !== this.endIndex) {\n var t = this.endIndex.serialize();\n return ["slice", this.input.serialize(), this.beginIndex.serialize(), t];\n }\n\n return ["slice", this.input.serialize(), this.beginIndex.serialize()];\n };\n\n var xr = gr("==", function (t, e, r) {\n return e === r;\n }, vr),\n br = gr("!=", function (t, e, r) {\n return e !== r;\n }, function (t, e, r, n) {\n return !vr(0, e, r, n);\n }),\n wr = gr("<", function (t, e, r) {\n return e < r;\n }, function (t, e, r, n) {\n return n.compare(e, r) < 0;\n }),\n _r = gr(">", function (t, e, r) {\n return e > r;\n }, function (t, e, r, n) {\n return n.compare(e, r) > 0;\n }),\n Ar = gr("<=", function (t, e, r) {\n return e <= r;\n }, function (t, e, r, n) {\n return n.compare(e, r) <= 0;\n }),\n Sr = gr(">=", function (t, e, r) {\n return e >= r;\n }, function (t, e, r, n) {\n return n.compare(e, r) >= 0;\n }),\n kr = function kr(t, e, r, n, i) {\n this.type = Ut, this.number = t, this.locale = e, this.currency = r, this.minFractionDigits = n, this.maxFractionDigits = i;\n };\n\n kr.parse = function (t, e) {\n if (3 !== t.length) return e.error("Expected two arguments.");\n var r = e.parse(t[1], 1, Ot);\n if (!r) return null;\n var n = t[2];\n if ("object" != typeof n || Array.isArray(n)) return e.error("NumberFormat options argument must be an object.");\n var i = null;\n if (n.locale && !(i = e.parse(n.locale, 1, Ut))) return null;\n var a = null;\n if (n.currency && !(a = e.parse(n.currency, 1, Ut))) return null;\n var o = null;\n if (n["min-fraction-digits"] && !(o = e.parse(n["min-fraction-digits"], 1, Ot))) return null;\n var s = null;\n return n["max-fraction-digits"] && !(s = e.parse(n["max-fraction-digits"], 1, Ot)) ? null : new kr(r, i, a, o, s);\n }, kr.prototype.evaluate = function (t) {\n return new Intl.NumberFormat(this.locale ? this.locale.evaluate(t) : [], {\n style: this.currency ? "currency" : "decimal",\n currency: this.currency ? this.currency.evaluate(t) : void 0,\n minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(t) : void 0,\n maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(t) : void 0\n }).format(this.number.evaluate(t));\n }, kr.prototype.eachChild = function (t) {\n t(this.number), this.locale && t(this.locale), this.currency && t(this.currency), this.minFractionDigits && t(this.minFractionDigits), this.maxFractionDigits && t(this.maxFractionDigits);\n }, kr.prototype.outputDefined = function () {\n return !1;\n }, kr.prototype.serialize = function () {\n var t = {};\n return this.locale && (t.locale = this.locale.serialize()), this.currency && (t.currency = this.currency.serialize()), this.minFractionDigits && (t["min-fraction-digits"] = this.minFractionDigits.serialize()), this.maxFractionDigits && (t["max-fraction-digits"] = this.maxFractionDigits.serialize()), ["number-format", this.number.serialize(), t];\n };\n\n var Ir = function Ir(t) {\n this.type = Ot, this.input = t;\n };\n\n Ir.parse = function (t, e) {\n if (2 !== t.length) return e.error("Expected 1 argument, but found " + (t.length - 1) + " instead.");\n var r = e.parse(t[1], 1);\n return r ? "array" !== r.type.kind && "string" !== r.type.kind && "value" !== r.type.kind ? e.error("Expected argument of type string or array, but found " + Ht(r.type) + " instead.") : new Ir(r) : null;\n }, Ir.prototype.evaluate = function (t) {\n var e = this.input.evaluate(t);\n if ("string" == typeof e) return e.length;\n if (Array.isArray(e)) return e.length;\n throw new ce("Expected value to be of type string or array, but found " + Ht(ue(e)) + " instead.");\n }, Ir.prototype.eachChild = function (t) {\n t(this.input);\n }, Ir.prototype.outputDefined = function () {\n return !1;\n }, Ir.prototype.serialize = function () {\n var t = ["length"];\n return this.eachChild(function (e) {\n t.push(e.serialize());\n }), t;\n };\n var zr = {\n "==": xr,\n "!=": br,\n ">": _r,\n "<": wr,\n ">=": Sr,\n "<=": Ar,\n array: fe,\n at: pr,\n boolean: fe,\n case: yr,\n coalesce: ur,\n collator: we,\n format: ye,\n image: de,\n in: cr,\n "index-of": hr,\n interpolate: or,\n "interpolate-hcl": or,\n "interpolate-lab": or,\n length: Ir,\n let: lr,\n literal: pe,\n match: fr,\n number: fe,\n "number-format": kr,\n object: fe,\n slice: dr,\n step: Ke,\n string: fe,\n "to-boolean": ve,\n "to-color": ve,\n "to-number": ve,\n "to-string": ve,\n var: je,\n within: Le\n };\n\n function Cr(t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = e[3];\n r = r.evaluate(t), n = n.evaluate(t), i = i.evaluate(t);\n var o = a ? a.evaluate(t) : 1,\n s = oe(r, n, i, o);\n if (s) throw new ce(s);\n return new ee(r / 255 * o, n / 255 * o, i / 255 * o, o);\n }\n\n function Er(t, e) {\n return t in e;\n }\n\n function Pr(t, e) {\n var r = e[t];\n return void 0 === r ? null : r;\n }\n\n function Mr(t) {\n return {\n type: t\n };\n }\n\n function Br(t) {\n return {\n result: "success",\n value: t\n };\n }\n\n function Tr(t) {\n return {\n result: "error",\n value: t\n };\n }\n\n function Vr(t) {\n return "data-driven" === t["property-type"] || "cross-faded-data-driven" === t["property-type"];\n }\n\n function Fr(t) {\n return !!t.expression && t.expression.parameters.indexOf("zoom") > -1;\n }\n\n function Dr(t) {\n return !!t.expression && t.expression.interpolated;\n }\n\n function Lr(t) {\n return t instanceof Number ? "number" : t instanceof String ? "string" : t instanceof Boolean ? "boolean" : Array.isArray(t) ? "array" : null === t ? "null" : typeof t;\n }\n\n function Rr(t) {\n return "object" == typeof t && null !== t && !Array.isArray(t);\n }\n\n function Or(t) {\n return t;\n }\n\n function Ur(t, e, r) {\n return void 0 !== t ? t : void 0 !== e ? e : void 0 !== r ? r : void 0;\n }\n\n function jr(t, e, r, n, i) {\n return Ur(typeof r === i ? n[r] : void 0, t.default, e.default);\n }\n\n function qr(t, e, r) {\n if ("number" !== Lr(r)) return Ur(t.default, e.default);\n var n = t.stops.length;\n if (1 === n) return t.stops[0][1];\n if (r <= t.stops[0][0]) return t.stops[0][1];\n if (r >= t.stops[n - 1][0]) return t.stops[n - 1][1];\n var i = Ne(t.stops.map(function (t) {\n return t[0];\n }), r);\n return t.stops[i][1];\n }\n\n function Nr(t, e, r) {\n var n = void 0 !== t.base ? t.base : 1;\n if ("number" !== Lr(r)) return Ur(t.default, e.default);\n var i = t.stops.length;\n if (1 === i) return t.stops[0][1];\n if (r <= t.stops[0][0]) return t.stops[0][1];\n if (r >= t.stops[i - 1][0]) return t.stops[i - 1][1];\n\n var a = Ne(t.stops.map(function (t) {\n return t[0];\n }), r),\n o = function (t, e, r, n) {\n var i = n - r,\n a = t - r;\n return 0 === i ? 0 : 1 === e ? a / i : (Math.pow(e, a) - 1) / (Math.pow(e, i) - 1);\n }(r, n, t.stops[a][0], t.stops[a + 1][0]),\n s = t.stops[a][1],\n u = t.stops[a + 1][1],\n l = Ze[e.type] || Or;\n\n if (t.colorSpace && "rgb" !== t.colorSpace) {\n var p = ar[t.colorSpace];\n\n l = function l(t, e) {\n return p.reverse(p.interpolate(p.forward(t), p.forward(e), o));\n };\n }\n\n return "function" == typeof s.evaluate ? {\n evaluate: function evaluate() {\n for (var t = [], e = arguments.length; e--;) {\n t[e] = arguments[e];\n }\n\n var r = s.evaluate.apply(void 0, t),\n n = u.evaluate.apply(void 0, t);\n if (void 0 !== r && void 0 !== n) return l(r, n, o);\n }\n } : l(s, u, o);\n }\n\n function Kr(t, e, r) {\n return "color" === e.type ? r = ee.parse(r) : "formatted" === e.type ? r = ie.fromString(r.toString()) : "resolvedImage" === e.type ? r = ae.fromString(r.toString()) : Lr(r) === e.type || "enum" === e.type && e.values[r] || (r = void 0), Ur(r, t.default, e.default);\n }\n\n be.register(zr, {\n error: [{\n kind: "error"\n }, [Ut], function (t, e) {\n throw new ce(e[0].evaluate(t));\n }],\n typeof: [Ut, [Kt], function (t, e) {\n return Ht(ue(e[0].evaluate(t)));\n }],\n "to-rgba": [Jt(Ot, 4), [qt], function (t, e) {\n return e[0].evaluate(t).toArray();\n }],\n rgb: [qt, [Ot, Ot, Ot], Cr],\n rgba: [qt, [Ot, Ot, Ot, Ot], Cr],\n has: {\n type: jt,\n overloads: [[[Ut], function (t, e) {\n return Er(e[0].evaluate(t), t.properties());\n }], [[Ut, Nt], function (t, e) {\n var r = e[1];\n return Er(e[0].evaluate(t), r.evaluate(t));\n }]]\n },\n get: {\n type: Kt,\n overloads: [[[Ut], function (t, e) {\n return Pr(e[0].evaluate(t), t.properties());\n }], [[Ut, Nt], function (t, e) {\n var r = e[1];\n return Pr(e[0].evaluate(t), r.evaluate(t));\n }]]\n },\n "feature-state": [Kt, [Ut], function (t, e) {\n return Pr(e[0].evaluate(t), t.featureState || {});\n }],\n properties: [Nt, [], function (t) {\n return t.properties();\n }],\n "geometry-type": [Ut, [], function (t) {\n return t.geometryType();\n }],\n id: [Kt, [], function (t) {\n return t.id();\n }],\n zoom: [Ot, [], function (t) {\n return t.globals.zoom;\n }],\n "heatmap-density": [Ot, [], function (t) {\n return t.globals.heatmapDensity || 0;\n }],\n "line-progress": [Ot, [], function (t) {\n return t.globals.lineProgress || 0;\n }],\n accumulated: [Kt, [], function (t) {\n return void 0 === t.globals.accumulated ? null : t.globals.accumulated;\n }],\n "+": [Ot, Mr(Ot), function (t, e) {\n for (var r = 0, n = 0, i = e; n < i.length; n += 1) {\n r += i[n].evaluate(t);\n }\n\n return r;\n }],\n "*": [Ot, Mr(Ot), function (t, e) {\n for (var r = 1, n = 0, i = e; n < i.length; n += 1) {\n r *= i[n].evaluate(t);\n }\n\n return r;\n }],\n "-": {\n type: Ot,\n overloads: [[[Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) - r.evaluate(t);\n }], [[Ot], function (t, e) {\n return -e[0].evaluate(t);\n }]]\n },\n "/": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) / r.evaluate(t);\n }],\n "%": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) % r.evaluate(t);\n }],\n ln2: [Ot, [], function () {\n return Math.LN2;\n }],\n pi: [Ot, [], function () {\n return Math.PI;\n }],\n e: [Ot, [], function () {\n return Math.E;\n }],\n "^": [Ot, [Ot, Ot], function (t, e) {\n var r = e[1];\n return Math.pow(e[0].evaluate(t), r.evaluate(t));\n }],\n sqrt: [Ot, [Ot], function (t, e) {\n return Math.sqrt(e[0].evaluate(t));\n }],\n log10: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t)) / Math.LN10;\n }],\n ln: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t));\n }],\n log2: [Ot, [Ot], function (t, e) {\n return Math.log(e[0].evaluate(t)) / Math.LN2;\n }],\n sin: [Ot, [Ot], function (t, e) {\n return Math.sin(e[0].evaluate(t));\n }],\n cos: [Ot, [Ot], function (t, e) {\n return Math.cos(e[0].evaluate(t));\n }],\n tan: [Ot, [Ot], function (t, e) {\n return Math.tan(e[0].evaluate(t));\n }],\n asin: [Ot, [Ot], function (t, e) {\n return Math.asin(e[0].evaluate(t));\n }],\n acos: [Ot, [Ot], function (t, e) {\n return Math.acos(e[0].evaluate(t));\n }],\n atan: [Ot, [Ot], function (t, e) {\n return Math.atan(e[0].evaluate(t));\n }],\n min: [Ot, Mr(Ot), function (t, e) {\n return Math.min.apply(Math, e.map(function (e) {\n return e.evaluate(t);\n }));\n }],\n max: [Ot, Mr(Ot), function (t, e) {\n return Math.max.apply(Math, e.map(function (e) {\n return e.evaluate(t);\n }));\n }],\n abs: [Ot, [Ot], function (t, e) {\n return Math.abs(e[0].evaluate(t));\n }],\n round: [Ot, [Ot], function (t, e) {\n var r = e[0].evaluate(t);\n return r < 0 ? -Math.round(-r) : Math.round(r);\n }],\n floor: [Ot, [Ot], function (t, e) {\n return Math.floor(e[0].evaluate(t));\n }],\n ceil: [Ot, [Ot], function (t, e) {\n return Math.ceil(e[0].evaluate(t));\n }],\n "filter-==": [jt, [Ut, Kt], function (t, e) {\n var r = e[0],\n n = e[1];\n return t.properties()[r.value] === n.value;\n }],\n "filter-id-==": [jt, [Kt], function (t, e) {\n var r = e[0];\n return t.id() === r.value;\n }],\n "filter-type-==": [jt, [Ut], function (t, e) {\n var r = e[0];\n return t.geometryType() === r.value;\n }],\n "filter-<": [jt, [Ut, Kt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i < a;\n }],\n "filter-id-<": [jt, [Kt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n < i;\n }],\n "filter->": [jt, [Ut, Kt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i > a;\n }],\n "filter-id->": [jt, [Kt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n > i;\n }],\n "filter-<=": [jt, [Ut, Kt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i <= a;\n }],\n "filter-id-<=": [jt, [Kt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n <= i;\n }],\n "filter->=": [jt, [Ut, Kt], function (t, e) {\n var r = e[0],\n n = e[1],\n i = t.properties()[r.value],\n a = n.value;\n return typeof i == typeof a && i >= a;\n }],\n "filter-id->=": [jt, [Kt], function (t, e) {\n var r = e[0],\n n = t.id(),\n i = r.value;\n return typeof n == typeof i && n >= i;\n }],\n "filter-has": [jt, [Kt], function (t, e) {\n return e[0].value in t.properties();\n }],\n "filter-has-id": [jt, [], function (t) {\n return null !== t.id() && void 0 !== t.id();\n }],\n "filter-type-in": [jt, [Jt(Ut)], function (t, e) {\n return e[0].value.indexOf(t.geometryType()) >= 0;\n }],\n "filter-id-in": [jt, [Jt(Kt)], function (t, e) {\n return e[0].value.indexOf(t.id()) >= 0;\n }],\n "filter-in-small": [jt, [Ut, Jt(Kt)], function (t, e) {\n var r = e[0];\n return e[1].value.indexOf(t.properties()[r.value]) >= 0;\n }],\n "filter-in-large": [jt, [Ut, Jt(Kt)], function (t, e) {\n var r = e[0],\n n = e[1];\n return function (t, e, r, n) {\n for (; r <= n;) {\n var i = r + n >> 1;\n if (e[i] === t) return !0;\n e[i] > t ? n = i - 1 : r = i + 1;\n }\n\n return !1;\n }(t.properties()[r.value], n.value, 0, n.value.length - 1);\n }],\n all: {\n type: jt,\n overloads: [[[jt, jt], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) && r.evaluate(t);\n }], [Mr(jt), function (t, e) {\n for (var r = 0, n = e; r < n.length; r += 1) {\n if (!n[r].evaluate(t)) return !1;\n }\n\n return !0;\n }]]\n },\n any: {\n type: jt,\n overloads: [[[jt, jt], function (t, e) {\n var r = e[1];\n return e[0].evaluate(t) || r.evaluate(t);\n }], [Mr(jt), function (t, e) {\n for (var r = 0, n = e; r < n.length; r += 1) {\n if (n[r].evaluate(t)) return !0;\n }\n\n return !1;\n }]]\n },\n "!": [jt, [jt], function (t, e) {\n return !e[0].evaluate(t);\n }],\n "is-supported-script": [jt, [Ut], function (t, e) {\n var r = t.globals && t.globals.isSupportedScript;\n return !r || r(e[0].evaluate(t));\n }],\n upcase: [Ut, [Ut], function (t, e) {\n return e[0].evaluate(t).toUpperCase();\n }],\n downcase: [Ut, [Ut], function (t, e) {\n return e[0].evaluate(t).toLowerCase();\n }],\n concat: [Ut, Mr(Kt), function (t, e) {\n return e.map(function (e) {\n return le(e.evaluate(t));\n }).join("");\n }],\n "resolved-locale": [Ut, [Gt], function (t, e) {\n return e[0].evaluate(t).resolvedLocale();\n }]\n });\n\n var Gr = function Gr(t, e) {\n this.expression = t, this._warningHistory = {}, this._evaluator = new xe(), this._defaultValue = e ? function (t) {\n return "color" === t.type && Rr(t.default) ? new ee(0, 0, 0, 0) : "color" === t.type ? ee.parse(t.default) || null : void 0 === t.default ? null : t.default;\n }(e) : null, this._enumValues = e && "enum" === e.type ? e.values : null;\n };\n\n function Zr(t) {\n return Array.isArray(t) && t.length > 0 && "string" == typeof t[0] && t[0] in zr;\n }\n\n function Xr(t, e) {\n var r = new qe(zr, [], e ? function (t) {\n var e = {\n color: qt,\n string: Ut,\n number: Ot,\n enum: Ut,\n boolean: jt,\n formatted: Zt,\n resolvedImage: Xt\n };\n return "array" === t.type ? Jt(e[t.value] || Kt, t.length) : e[t.type];\n }(e) : void 0),\n n = r.parse(t, void 0, void 0, void 0, e && "string" === e.type ? {\n typeAnnotation: "coerce"\n } : void 0);\n return n ? Br(new Gr(n, e)) : Tr(r.errors);\n }\n\n Gr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._evaluator.globals = t, this._evaluator.feature = e, this._evaluator.featureState = r, this._evaluator.canonical = n, this._evaluator.availableImages = i || null, this._evaluator.formattedSection = a, this.expression.evaluate(this._evaluator);\n }, Gr.prototype.evaluate = function (t, e, r, n, i, a) {\n this._evaluator.globals = t, this._evaluator.feature = e || null, this._evaluator.featureState = r || null, this._evaluator.canonical = n, this._evaluator.availableImages = i || null, this._evaluator.formattedSection = a || null;\n\n try {\n var o = this.expression.evaluate(this._evaluator);\n if (null == o || "number" == typeof o && o != o) return this._defaultValue;\n if (this._enumValues && !(o in this._enumValues)) throw new ce("Expected value to be one of " + Object.keys(this._enumValues).map(function (t) {\n return JSON.stringify(t);\n }).join(", ") + ", but found " + JSON.stringify(o) + " instead.");\n return o;\n } catch (t) {\n return this._warningHistory[t.message] || (this._warningHistory[t.message] = !0, "undefined" != typeof console && console.warn(t.message)), this._defaultValue;\n }\n };\n\n var Jr = function Jr(t, e) {\n this.kind = t, this._styleExpression = e, this.isStateDependent = "constant" !== t && !Oe(e.expression);\n };\n\n Jr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluateWithoutErrorHandling(t, e, r, n, i, a);\n }, Jr.prototype.evaluate = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluate(t, e, r, n, i, a);\n };\n\n var Hr = function Hr(t, e, r, n) {\n this.kind = t, this.zoomStops = r, this._styleExpression = e, this.isStateDependent = "camera" !== t && !Oe(e.expression), this.interpolationType = n;\n };\n\n function Yr(t, e) {\n if ("error" === (t = Xr(t, e)).result) return t;\n var r = t.value.expression,\n n = Re(r);\n if (!n && !Vr(e)) return Tr([new Dt("", "data expressions not supported")]);\n var i = Ue(r, ["zoom"]);\n if (!i && !Fr(e)) return Tr([new Dt("", "zoom expressions not supported")]);\n\n var a = function t(e) {\n var r = null;\n if (e instanceof lr) r = t(e.result);else if (e instanceof ur) for (var n = 0, i = e.args; n < i.length && !(r = t(i[n])); n += 1) {\n ;\n } else (e instanceof Ke || e instanceof or) && e.input instanceof be && "zoom" === e.input.name && (r = e);\n return r instanceof Dt || e.eachChild(function (e) {\n var n = t(e);\n n instanceof Dt ? r = n : !r && n ? r = new Dt("", \'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.\') : r && n && r !== n && (r = new Dt("", \'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.\'));\n }), r;\n }(r);\n\n return a || i ? a instanceof Dt ? Tr([a]) : a instanceof or && !Dr(e) ? Tr([new Dt("", \'"interpolate" expressions cannot be used with this property\')]) : Br(a ? new Hr(n ? "camera" : "composite", t.value, a.labels, a instanceof or ? a.interpolation : void 0) : new Jr(n ? "constant" : "source", t.value)) : Tr([new Dt("", \'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.\')]);\n }\n\n Hr.prototype.evaluateWithoutErrorHandling = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluateWithoutErrorHandling(t, e, r, n, i, a);\n }, Hr.prototype.evaluate = function (t, e, r, n, i, a) {\n return this._styleExpression.evaluate(t, e, r, n, i, a);\n }, Hr.prototype.interpolationFactor = function (t, e, r) {\n return this.interpolationType ? or.interpolationFactor(this.interpolationType, t, e, r) : 0;\n };\n\n var $r = function $r(t, e) {\n this._parameters = t, this._specification = e, Tt(this, function t(e, r) {\n var n,\n i,\n a,\n o = "color" === r.type,\n s = e.stops && "object" == typeof e.stops[0][0],\n u = s || !(s || void 0 !== e.property),\n l = e.type || (Dr(r) ? "exponential" : "interval");\n if (o && ((e = Tt({}, e)).stops && (e.stops = e.stops.map(function (t) {\n return [t[0], ee.parse(t[1])];\n })), e.default = ee.parse(e.default ? e.default : r.default)), e.colorSpace && "rgb" !== e.colorSpace && !ar[e.colorSpace]) throw new Error("Unknown color space: " + e.colorSpace);\n if ("exponential" === l) n = Nr;else if ("interval" === l) n = qr;else if ("categorical" === l) {\n n = jr, i = Object.create(null);\n\n for (var p = 0, c = e.stops; p < c.length; p += 1) {\n var h = c[p];\n i[h[0]] = h[1];\n }\n\n a = typeof e.stops[0][0];\n } else {\n if ("identity" !== l) throw new Error(\'Unknown function type "\' + l + \'"\');\n n = Kr;\n }\n\n if (s) {\n for (var f = {}, y = [], d = 0; d < e.stops.length; d++) {\n var m = e.stops[d],\n v = m[0].zoom;\n void 0 === f[v] && (f[v] = {\n zoom: v,\n type: e.type,\n property: e.property,\n default: e.default,\n stops: []\n }, y.push(v)), f[v].stops.push([m[0].value, m[1]]);\n }\n\n for (var g = [], x = 0, b = y; x < b.length; x += 1) {\n var w = b[x];\n g.push([f[w].zoom, t(f[w], r)]);\n }\n\n var _ = {\n name: "linear"\n };\n return {\n kind: "composite",\n interpolationType: _,\n interpolationFactor: or.interpolationFactor.bind(void 0, _),\n zoomStops: g.map(function (t) {\n return t[0];\n }),\n evaluate: function evaluate(t, n) {\n var i = t.zoom;\n return Nr({\n stops: g,\n base: e.base\n }, r, i).evaluate(i, n);\n }\n };\n }\n\n if (u) {\n var A = "exponential" === l ? {\n name: "exponential",\n base: void 0 !== e.base ? e.base : 1\n } : null;\n return {\n kind: "camera",\n interpolationType: A,\n interpolationFactor: or.interpolationFactor.bind(void 0, A),\n zoomStops: e.stops.map(function (t) {\n return t[0];\n }),\n evaluate: function evaluate(t) {\n return n(e, r, t.zoom, i, a);\n }\n };\n }\n\n return {\n kind: "source",\n evaluate: function evaluate(t, o) {\n var s = o && o.properties ? o.properties[e.property] : void 0;\n return void 0 === s ? Ur(e.default, r.default) : n(e, r, s, i, a);\n }\n };\n }(this._parameters, this._specification));\n };\n\n function Wr(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec || {},\n i = t.objectElementValidators || {},\n a = t.style,\n o = t.styleSpec,\n s = [],\n u = Lr(r);\n if ("object" !== u) return [new Mt(e, r, "object expected, " + u + " found")];\n\n for (var l in r) {\n var p = l.split(".")[0],\n c = n[p] || n["*"],\n h = void 0;\n if (i[p]) h = i[p];else if (n[p]) h = Sn;else if (i["*"]) h = i["*"];else {\n if (!n["*"]) {\n s.push(new Mt(e, r[l], \'unknown property "\' + l + \'"\'));\n continue;\n }\n\n h = Sn;\n }\n s = s.concat(h({\n key: (e ? e + "." : e) + l,\n value: r[l],\n valueSpec: c,\n style: a,\n styleSpec: o,\n object: r,\n objectKey: l\n }, r));\n }\n\n for (var f in n) {\n i[f] || n[f].required && void 0 === n[f].default && void 0 === r[f] && s.push(new Mt(e, r, \'missing required property "\' + f + \'"\'));\n }\n\n return s;\n }\n\n function Qr(t) {\n var e = t.value,\n r = t.valueSpec,\n n = t.style,\n i = t.styleSpec,\n a = t.key,\n o = t.arrayElementValidator || Sn;\n if ("array" !== Lr(e)) return [new Mt(a, e, "array expected, " + Lr(e) + " found")];\n if (r.length && e.length !== r.length) return [new Mt(a, e, "array length " + r.length + " expected, length " + e.length + " found")];\n if (r["min-length"] && e.length < r["min-length"]) return [new Mt(a, e, "array length at least " + r["min-length"] + " expected, length " + e.length + " found")];\n var s = {\n type: r.value,\n values: r.values\n };\n i.$version < 7 && (s.function = r.function), "object" === Lr(r.value) && (s = r.value);\n\n for (var u = [], l = 0; l < e.length; l++) {\n u = u.concat(o({\n array: e,\n arrayIndex: l,\n value: e[l],\n valueSpec: s,\n style: n,\n styleSpec: i,\n key: a + "[" + l + "]"\n }));\n }\n\n return u;\n }\n\n function tn(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec,\n i = Lr(r);\n return "number" === i && r != r && (i = "NaN"), "number" !== i ? [new Mt(e, r, "number expected, " + i + " found")] : "minimum" in n && r < n.minimum ? [new Mt(e, r, r + " is less than the minimum value " + n.minimum)] : "maximum" in n && r > n.maximum ? [new Mt(e, r, r + " is greater than the maximum value " + n.maximum)] : [];\n }\n\n function en(t) {\n var e,\n r,\n n,\n i = t.valueSpec,\n a = Vt(t.value.type),\n o = {},\n s = "categorical" !== a && void 0 === t.value.property,\n u = !s,\n l = "array" === Lr(t.value.stops) && "array" === Lr(t.value.stops[0]) && "object" === Lr(t.value.stops[0][0]),\n p = Wr({\n key: t.key,\n value: t.value,\n valueSpec: t.styleSpec.function,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n stops: function stops(t) {\n if ("identity" === a) return [new Mt(t.key, t.value, \'identity function may not have a "stops" property\')];\n var e = [],\n r = t.value;\n return e = e.concat(Qr({\n key: t.key,\n value: r,\n valueSpec: t.valueSpec,\n style: t.style,\n styleSpec: t.styleSpec,\n arrayElementValidator: c\n })), "array" === Lr(r) && 0 === r.length && e.push(new Mt(t.key, r, "array must have at least one stop")), e;\n },\n default: function _default(t) {\n return Sn({\n key: t.key,\n value: t.value,\n valueSpec: i,\n style: t.style,\n styleSpec: t.styleSpec\n });\n }\n }\n });\n return "identity" === a && s && p.push(new Mt(t.key, t.value, \'missing required property "property"\')), "identity" === a || t.value.stops || p.push(new Mt(t.key, t.value, \'missing required property "stops"\')), "exponential" === a && t.valueSpec.expression && !Dr(t.valueSpec) && p.push(new Mt(t.key, t.value, "exponential functions not supported")), t.styleSpec.$version >= 8 && (u && !Vr(t.valueSpec) ? p.push(new Mt(t.key, t.value, "property functions not supported")) : s && !Fr(t.valueSpec) && p.push(new Mt(t.key, t.value, "zoom functions not supported"))), "categorical" !== a && !l || void 0 !== t.value.property || p.push(new Mt(t.key, t.value, \'"property" property is required\')), p;\n\n function c(t) {\n var e = [],\n a = t.value,\n s = t.key;\n if ("array" !== Lr(a)) return [new Mt(s, a, "array expected, " + Lr(a) + " found")];\n if (2 !== a.length) return [new Mt(s, a, "array length 2 expected, length " + a.length + " found")];\n\n if (l) {\n if ("object" !== Lr(a[0])) return [new Mt(s, a, "object expected, " + Lr(a[0]) + " found")];\n if (void 0 === a[0].zoom) return [new Mt(s, a, "object stop key must have zoom")];\n if (void 0 === a[0].value) return [new Mt(s, a, "object stop key must have value")];\n if (n && n > Vt(a[0].zoom)) return [new Mt(s, a[0].zoom, "stop zoom values must appear in ascending order")];\n Vt(a[0].zoom) !== n && (n = Vt(a[0].zoom), r = void 0, o = {}), e = e.concat(Wr({\n key: s + "[0]",\n value: a[0],\n valueSpec: {\n zoom: {}\n },\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n zoom: tn,\n value: h\n }\n }));\n } else e = e.concat(h({\n key: s + "[0]",\n value: a[0],\n valueSpec: {},\n style: t.style,\n styleSpec: t.styleSpec\n }, a));\n\n return Zr(Ft(a[1])) ? e.concat([new Mt(s + "[1]", a[1], "expressions are not allowed in function stops.")]) : e.concat(Sn({\n key: s + "[1]",\n value: a[1],\n valueSpec: i,\n style: t.style,\n styleSpec: t.styleSpec\n }));\n }\n\n function h(t, n) {\n var s = Lr(t.value),\n u = Vt(t.value),\n l = null !== t.value ? t.value : n;\n\n if (e) {\n if (s !== e) return [new Mt(t.key, l, s + " stop domain type must match previous stop domain type " + e)];\n } else e = s;\n\n if ("number" !== s && "string" !== s && "boolean" !== s) return [new Mt(t.key, l, "stop domain value must be a number, string, or boolean")];\n\n if ("number" !== s && "categorical" !== a) {\n var p = "number expected, " + s + " found";\n return Vr(i) && void 0 === a && (p += \'\\nIf you intended to use a categorical function, specify `"type": "categorical"`.\'), [new Mt(t.key, l, p)];\n }\n\n return "categorical" !== a || "number" !== s || isFinite(u) && Math.floor(u) === u ? "categorical" !== a && "number" === s && void 0 !== r && u < r ? [new Mt(t.key, l, "stop domain values must appear in ascending order")] : (r = u, "categorical" === a && u in o ? [new Mt(t.key, l, "stop domain values must be unique")] : (o[u] = !0, [])) : [new Mt(t.key, l, "integer expected, found " + u)];\n }\n }\n\n function rn(t) {\n var e = ("property" === t.expressionContext ? Yr : Xr)(Ft(t.value), t.valueSpec);\n if ("error" === e.result) return e.value.map(function (e) {\n return new Mt("" + t.key + e.key, t.value, e.message);\n });\n var r = e.value.expression || e.value._styleExpression.expression;\n if ("property" === t.expressionContext && "text-font" === t.propertyKey && !r.outputDefined()) return [new Mt(t.key, t.value, \'Invalid data expression for "\' + t.propertyKey + \'". Output values must be contained as literals within the expression.\')];\n if ("property" === t.expressionContext && "layout" === t.propertyType && !Oe(r)) return [new Mt(t.key, t.value, \'"feature-state" data expressions are not supported with layout properties.\')];\n if ("filter" === t.expressionContext && !Oe(r)) return [new Mt(t.key, t.value, \'"feature-state" data expressions are not supported with filters.\')];\n\n if (t.expressionContext && 0 === t.expressionContext.indexOf("cluster")) {\n if (!Ue(r, ["zoom", "feature-state"])) return [new Mt(t.key, t.value, \'"zoom" and "feature-state" expressions are not supported with cluster properties.\')];\n if ("cluster-initial" === t.expressionContext && !Re(r)) return [new Mt(t.key, t.value, "Feature data expressions are not supported with initial expression part of cluster properties.")];\n }\n\n return [];\n }\n\n function nn(t) {\n var e = t.key,\n r = t.value,\n n = t.valueSpec,\n i = [];\n return Array.isArray(n.values) ? -1 === n.values.indexOf(Vt(r)) && i.push(new Mt(e, r, "expected one of [" + n.values.join(", ") + "], " + JSON.stringify(r) + " found")) : -1 === Object.keys(n.values).indexOf(Vt(r)) && i.push(new Mt(e, r, "expected one of [" + Object.keys(n.values).join(", ") + "], " + JSON.stringify(r) + " found")), i;\n }\n\n function an(t) {\n if (!0 === t || !1 === t) return !0;\n if (!Array.isArray(t) || 0 === t.length) return !1;\n\n switch (t[0]) {\n case "has":\n return t.length >= 2 && "$id" !== t[1] && "$type" !== t[1];\n\n case "in":\n return t.length >= 3 && ("string" != typeof t[1] || Array.isArray(t[2]));\n\n case "!in":\n case "!has":\n case "none":\n return !1;\n\n case "==":\n case "!=":\n case ">":\n case ">=":\n case "<":\n case "<=":\n return 3 !== t.length || Array.isArray(t[1]) || Array.isArray(t[2]);\n\n case "any":\n case "all":\n for (var e = 0, r = t.slice(1); e < r.length; e += 1) {\n var n = r[e];\n if (!an(n) && "boolean" != typeof n) return !1;\n }\n\n return !0;\n\n default:\n return !0;\n }\n }\n\n $r.deserialize = function (t) {\n return new $r(t._parameters, t._specification);\n }, $r.serialize = function (t) {\n return {\n _parameters: t._parameters,\n _specification: t._specification\n };\n };\n var on = {\n type: "boolean",\n default: !1,\n transition: !1,\n "property-type": "data-driven",\n expression: {\n interpolated: !1,\n parameters: ["zoom", "feature"]\n }\n };\n\n function sn(t) {\n if (null == t) return {\n filter: function filter() {\n return !0;\n },\n needGeometry: !1\n };\n an(t) || (t = ln(t));\n var e = Xr(t, on);\n if ("error" === e.result) throw new Error(e.value.map(function (t) {\n return t.key + ": " + t.message;\n }).join(", "));\n return {\n filter: function filter(t, r, n) {\n return e.value.evaluate(t, r, {}, n);\n },\n needGeometry: function t(e) {\n if (!Array.isArray(e)) return !1;\n if ("within" === e[0]) return !0;\n\n for (var r = 1; r < e.length; r++) {\n if (t(e[r])) return !0;\n }\n\n return !1;\n }(t)\n };\n }\n\n function un(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function ln(t) {\n if (!t) return !0;\n var e,\n r = t[0];\n return t.length <= 1 ? "any" !== r : "==" === r ? pn(t[1], t[2], "==") : "!=" === r ? fn(pn(t[1], t[2], "==")) : "<" === r || ">" === r || "<=" === r || ">=" === r ? pn(t[1], t[2], r) : "any" === r ? (e = t.slice(1), ["any"].concat(e.map(ln))) : "all" === r ? ["all"].concat(t.slice(1).map(ln)) : "none" === r ? ["all"].concat(t.slice(1).map(ln).map(fn)) : "in" === r ? cn(t[1], t.slice(2)) : "!in" === r ? fn(cn(t[1], t.slice(2))) : "has" === r ? hn(t[1]) : "!has" === r ? fn(hn(t[1])) : "within" !== r || t;\n }\n\n function pn(t, e, r) {\n switch (t) {\n case "$type":\n return ["filter-type-" + r, e];\n\n case "$id":\n return ["filter-id-" + r, e];\n\n default:\n return ["filter-" + r, t, e];\n }\n }\n\n function cn(t, e) {\n if (0 === e.length) return !1;\n\n switch (t) {\n case "$type":\n return ["filter-type-in", ["literal", e]];\n\n case "$id":\n return ["filter-id-in", ["literal", e]];\n\n default:\n return e.length > 200 && !e.some(function (t) {\n return typeof t != typeof e[0];\n }) ? ["filter-in-large", t, ["literal", e.sort(un)]] : ["filter-in-small", t, ["literal", e]];\n }\n }\n\n function hn(t) {\n switch (t) {\n case "$type":\n return !0;\n\n case "$id":\n return ["filter-has-id"];\n\n default:\n return ["filter-has", t];\n }\n }\n\n function fn(t) {\n return ["!", t];\n }\n\n function yn(t) {\n return an(Ft(t.value)) ? rn(Tt({}, t, {\n expressionContext: "filter",\n valueSpec: {\n value: "boolean"\n }\n })) : function t(e) {\n var r = e.value,\n n = e.key;\n if ("array" !== Lr(r)) return [new Mt(n, r, "array expected, " + Lr(r) + " found")];\n var i,\n a = e.styleSpec,\n o = [];\n if (r.length < 1) return [new Mt(n, r, "filter array must have at least 1 element")];\n\n switch (o = o.concat(nn({\n key: n + "[0]",\n value: r[0],\n valueSpec: a.filter_operator,\n style: e.style,\n styleSpec: e.styleSpec\n })), Vt(r[0])) {\n case "<":\n case "<=":\n case ">":\n case ">=":\n r.length >= 2 && "$type" === Vt(r[1]) && o.push(new Mt(n, r, \'"$type" cannot be use with operator "\' + r[0] + \'"\'));\n\n case "==":\n case "!=":\n 3 !== r.length && o.push(new Mt(n, r, \'filter array for operator "\' + r[0] + \'" must have 3 elements\'));\n\n case "in":\n case "!in":\n r.length >= 2 && "string" !== (i = Lr(r[1])) && o.push(new Mt(n + "[1]", r[1], "string expected, " + i + " found"));\n\n for (var s = 2; s < r.length; s++) {\n i = Lr(r[s]), "$type" === Vt(r[1]) ? o = o.concat(nn({\n key: n + "[" + s + "]",\n value: r[s],\n valueSpec: a.geometry_type,\n style: e.style,\n styleSpec: e.styleSpec\n })) : "string" !== i && "number" !== i && "boolean" !== i && o.push(new Mt(n + "[" + s + "]", r[s], "string, number, or boolean expected, " + i + " found"));\n }\n\n break;\n\n case "any":\n case "all":\n case "none":\n for (var u = 1; u < r.length; u++) {\n o = o.concat(t({\n key: n + "[" + u + "]",\n value: r[u],\n style: e.style,\n styleSpec: e.styleSpec\n }));\n }\n\n break;\n\n case "has":\n case "!has":\n i = Lr(r[1]), 2 !== r.length ? o.push(new Mt(n, r, \'filter array for "\' + r[0] + \'" operator must have 2 elements\')) : "string" !== i && o.push(new Mt(n + "[1]", r[1], "string expected, " + i + " found"));\n break;\n\n case "within":\n i = Lr(r[1]), 2 !== r.length ? o.push(new Mt(n, r, \'filter array for "\' + r[0] + \'" operator must have 2 elements\')) : "object" !== i && o.push(new Mt(n + "[1]", r[1], "object expected, " + i + " found"));\n }\n\n return o;\n }(t);\n }\n\n function dn(t, e) {\n var r = t.key,\n n = t.style,\n i = t.styleSpec,\n a = t.value,\n o = t.objectKey,\n s = i[e + "_" + t.layerType];\n if (!s) return [];\n var u = o.match(/^(.*)-transition$/);\n if ("paint" === e && u && s[u[1]] && s[u[1]].transition) return Sn({\n key: r,\n value: a,\n valueSpec: i.transition,\n style: n,\n styleSpec: i\n });\n var l,\n p = t.valueSpec || s[o];\n if (!p) return [new Mt(r, a, \'unknown property "\' + o + \'"\')];\n if ("string" === Lr(a) && Vr(p) && !p.tokens && (l = /^{([^}]+)}$/.exec(a))) return [new Mt(r, a, \'"\' + o + \'" does not support interpolation syntax\\nUse an identity property function instead: `{ "type": "identity", "property": \' + JSON.stringify(l[1]) + " }`.")];\n var c = [];\n return "symbol" === t.layerType && ("text-field" === o && n && !n.glyphs && c.push(new Mt(r, a, \'use of "text-field" requires a style "glyphs" property\')), "text-font" === o && Rr(Ft(a)) && "identity" === Vt(a.type) && c.push(new Mt(r, a, \'"text-font" does not support identity functions\'))), c.concat(Sn({\n key: t.key,\n value: a,\n valueSpec: p,\n style: n,\n styleSpec: i,\n expressionContext: "property",\n propertyType: e,\n propertyKey: o\n }));\n }\n\n function mn(t) {\n return dn(t, "paint");\n }\n\n function vn(t) {\n return dn(t, "layout");\n }\n\n function gn(t) {\n var e = [],\n r = t.value,\n n = t.key,\n i = t.style,\n a = t.styleSpec;\n r.type || r.ref || e.push(new Mt(n, r, \'either "type" or "ref" is required\'));\n var o,\n s = Vt(r.type),\n u = Vt(r.ref);\n if (r.id) for (var l = Vt(r.id), p = 0; p < t.arrayIndex; p++) {\n var c = i.layers[p];\n Vt(c.id) === l && e.push(new Mt(n, r.id, \'duplicate layer id "\' + r.id + \'", previously used at line \' + c.id.__line__));\n }\n if ("ref" in r) ["type", "source", "source-layer", "filter", "layout"].forEach(function (t) {\n t in r && e.push(new Mt(n, r[t], \'"\' + t + \'" is prohibited for ref layers\'));\n }), i.layers.forEach(function (t) {\n Vt(t.id) === u && (o = t);\n }), o ? o.ref ? e.push(new Mt(n, r.ref, "ref cannot reference another ref layer")) : s = Vt(o.type) : e.push(new Mt(n, r.ref, \'ref layer "\' + u + \'" not found\'));else if ("background" !== s) if (r.source) {\n var h = i.sources && i.sources[r.source],\n f = h && Vt(h.type);\n h ? "vector" === f && "raster" === s ? e.push(new Mt(n, r.source, \'layer "\' + r.id + \'" requires a raster source\')) : "raster" === f && "raster" !== s ? e.push(new Mt(n, r.source, \'layer "\' + r.id + \'" requires a vector source\')) : "vector" !== f || r["source-layer"] ? "raster-dem" === f && "hillshade" !== s ? e.push(new Mt(n, r.source, "raster-dem source can only be used with layer type \'hillshade\'.")) : "line" !== s || !r.paint || !r.paint["line-gradient"] || "geojson" === f && h.lineMetrics || e.push(new Mt(n, r, \'layer "\' + r.id + \'" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled.\')) : e.push(new Mt(n, r, \'layer "\' + r.id + \'" must specify a "source-layer"\')) : e.push(new Mt(n, r.source, \'source "\' + r.source + \'" not found\'));\n } else e.push(new Mt(n, r, \'missing required property "source"\'));\n return e = e.concat(Wr({\n key: n,\n value: r,\n valueSpec: a.layer,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _() {\n return [];\n },\n type: function type() {\n return Sn({\n key: n + ".type",\n value: r.type,\n valueSpec: a.layer.type,\n style: t.style,\n styleSpec: t.styleSpec,\n object: r,\n objectKey: "type"\n });\n },\n filter: yn,\n layout: function layout(t) {\n return Wr({\n layer: r,\n key: t.key,\n value: t.value,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _(t) {\n return vn(Tt({\n layerType: s\n }, t));\n }\n }\n });\n },\n paint: function paint(t) {\n return Wr({\n layer: r,\n key: t.key,\n value: t.value,\n style: t.style,\n styleSpec: t.styleSpec,\n objectElementValidators: {\n "*": function _(t) {\n return mn(Tt({\n layerType: s\n }, t));\n }\n }\n });\n }\n }\n }));\n }\n\n function xn(t) {\n var e = t.value,\n r = t.key,\n n = Lr(e);\n return "string" !== n ? [new Mt(r, e, "string expected, " + n + " found")] : [];\n }\n\n var bn = {\n promoteId: function promoteId(t) {\n var e = t.key,\n r = t.value;\n if ("string" === Lr(r)) return xn({\n key: e,\n value: r\n });\n var n = [];\n\n for (var i in r) {\n n.push.apply(n, xn({\n key: e + "." + i,\n value: r[i]\n }));\n }\n\n return n;\n }\n };\n\n function wn(t) {\n var e = t.value,\n r = t.key,\n n = t.styleSpec,\n i = t.style;\n if (!e.type) return [new Mt(r, e, \'"type" is required\')];\n var a,\n o = Vt(e.type);\n\n switch (o) {\n case "vector":\n case "raster":\n case "raster-dem":\n return Wr({\n key: r,\n value: e,\n valueSpec: n["source_" + o.replace("-", "_")],\n style: t.style,\n styleSpec: n,\n objectElementValidators: bn\n });\n\n case "geojson":\n if (a = Wr({\n key: r,\n value: e,\n valueSpec: n.source_geojson,\n style: i,\n styleSpec: n,\n objectElementValidators: bn\n }), e.cluster) for (var s in e.clusterProperties) {\n var u = e.clusterProperties[s],\n l = u[0],\n p = "string" == typeof l ? [l, ["accumulated"], ["get", s]] : l;\n a.push.apply(a, rn({\n key: r + "." + s + ".map",\n value: u[1],\n expressionContext: "cluster-map"\n })), a.push.apply(a, rn({\n key: r + "." + s + ".reduce",\n value: p,\n expressionContext: "cluster-reduce"\n }));\n }\n return a;\n\n case "video":\n return Wr({\n key: r,\n value: e,\n valueSpec: n.source_video,\n style: i,\n styleSpec: n\n });\n\n case "image":\n return Wr({\n key: r,\n value: e,\n valueSpec: n.source_image,\n style: i,\n styleSpec: n\n });\n\n case "canvas":\n return [new Mt(r, null, "Please use runtime APIs to add canvas sources, rather than including them in stylesheets.", "source.canvas")];\n\n default:\n return nn({\n key: r + ".type",\n value: e.type,\n valueSpec: {\n values: ["vector", "raster", "raster-dem", "geojson", "video", "image"]\n },\n style: i,\n styleSpec: n\n });\n }\n }\n\n function _n(t) {\n var e = t.value,\n r = t.styleSpec,\n n = r.light,\n i = t.style,\n a = [],\n o = Lr(e);\n if (void 0 === e) return a;\n if ("object" !== o) return a.concat([new Mt("light", e, "object expected, " + o + " found")]);\n\n for (var s in e) {\n var u = s.match(/^(.*)-transition$/);\n a = a.concat(u && n[u[1]] && n[u[1]].transition ? Sn({\n key: s,\n value: e[s],\n valueSpec: r.transition,\n style: i,\n styleSpec: r\n }) : n[s] ? Sn({\n key: s,\n value: e[s],\n valueSpec: n[s],\n style: i,\n styleSpec: r\n }) : [new Mt(s, e[s], \'unknown property "\' + s + \'"\')]);\n }\n\n return a;\n }\n\n var An = {\n "*": function _() {\n return [];\n },\n array: Qr,\n boolean: function boolean(t) {\n var e = t.value,\n r = t.key,\n n = Lr(e);\n return "boolean" !== n ? [new Mt(r, e, "boolean expected, " + n + " found")] : [];\n },\n number: tn,\n color: function color(t) {\n var e = t.key,\n r = t.value,\n n = Lr(r);\n return "string" !== n ? [new Mt(e, r, "color expected, " + n + " found")] : null === te(r) ? [new Mt(e, r, \'color expected, "\' + r + \'" found\')] : [];\n },\n constants: Bt,\n enum: nn,\n filter: yn,\n function: en,\n layer: gn,\n object: Wr,\n source: wn,\n light: _n,\n string: xn,\n formatted: function formatted(t) {\n return 0 === xn(t).length ? [] : rn(t);\n },\n resolvedImage: function resolvedImage(t) {\n return 0 === xn(t).length ? [] : rn(t);\n }\n };\n\n function Sn(t) {\n var e = t.value,\n r = t.valueSpec,\n n = t.styleSpec;\n return r.expression && Rr(Vt(e)) ? en(t) : r.expression && Zr(Ft(e)) ? rn(t) : r.type && An[r.type] ? An[r.type](t) : Wr(Tt({}, t, {\n valueSpec: r.type ? n[r.type] : r\n }));\n }\n\n function kn(t) {\n var e = t.value,\n r = t.key,\n n = xn(t);\n return n.length || (-1 === e.indexOf("{fontstack}") && n.push(new Mt(r, e, \'"glyphs" url must include a "{fontstack}" token\')), -1 === e.indexOf("{range}") && n.push(new Mt(r, e, \'"glyphs" url must include a "{range}" token\'))), n;\n }\n\n function In(t, e) {\n void 0 === e && (e = Pt);\n var r = [];\n return r = r.concat(Sn({\n key: "",\n value: t,\n valueSpec: e.$root,\n styleSpec: e,\n style: t,\n objectElementValidators: {\n glyphs: kn,\n "*": function _() {\n return [];\n }\n }\n })), t.constants && (r = r.concat(Bt({\n key: "constants",\n value: t.constants,\n style: t,\n styleSpec: e\n }))), zn(r);\n }\n\n function zn(t) {\n return [].concat(t).sort(function (t, e) {\n return t.line - e.line;\n });\n }\n\n function Cn(t) {\n return function () {\n for (var e = [], r = arguments.length; r--;) {\n e[r] = arguments[r];\n }\n\n return zn(t.apply(this, e));\n };\n }\n\n In.source = Cn(wn), In.light = Cn(_n), In.layer = Cn(gn), In.filter = Cn(yn), In.paintProperty = Cn(mn), In.layoutProperty = Cn(vn);\n var En = In,\n Pn = En.light,\n Mn = En.paintProperty,\n Bn = En.layoutProperty;\n\n function Tn(t, e) {\n var r = !1;\n if (e && e.length) for (var n = 0, i = e; n < i.length; n += 1) {\n t.fire(new Ct(new Error(i[n].message))), r = !0;\n }\n return r;\n }\n\n var Vn = Fn;\n\n function Fn(t, e, r) {\n var n = this.cells = [];\n\n if (t instanceof ArrayBuffer) {\n this.arrayBuffer = t;\n var i = new Int32Array(this.arrayBuffer);\n t = i[0], this.d = (e = i[1]) + 2 * (r = i[2]);\n\n for (var a = 0; a < this.d * this.d; a++) {\n var o = i[3 + a],\n s = i[3 + a + 1];\n n.push(o === s ? null : i.subarray(o, s));\n }\n\n var u = i[3 + n.length + 1];\n this.keys = i.subarray(i[3 + n.length], u), this.bboxes = i.subarray(u), this.insert = this._insertReadonly;\n } else {\n this.d = e + 2 * r;\n\n for (var l = 0; l < this.d * this.d; l++) {\n n.push([]);\n }\n\n this.keys = [], this.bboxes = [];\n }\n\n this.n = e, this.extent = t, this.padding = r, this.scale = e / t, this.uid = 0;\n var p = r / e * t;\n this.min = -p, this.max = t + p;\n }\n\n Fn.prototype.insert = function (t, e, r, n, i) {\n this._forEachCell(e, r, n, i, this._insertCell, this.uid++), this.keys.push(t), this.bboxes.push(e), this.bboxes.push(r), this.bboxes.push(n), this.bboxes.push(i);\n }, Fn.prototype._insertReadonly = function () {\n throw "Cannot insert into a GridIndex created from an ArrayBuffer.";\n }, Fn.prototype._insertCell = function (t, e, r, n, i, a) {\n this.cells[i].push(a);\n }, Fn.prototype.query = function (t, e, r, n, i) {\n var a = this.min,\n o = this.max;\n if (t <= a && e <= a && o <= r && o <= n && !i) return Array.prototype.slice.call(this.keys);\n var s = [];\n return this._forEachCell(t, e, r, n, this._queryCell, s, {}, i), s;\n }, Fn.prototype._queryCell = function (t, e, r, n, i, a, o, s) {\n var u = this.cells[i];\n if (null !== u) for (var l = this.keys, p = this.bboxes, c = 0; c < u.length; c++) {\n var h = u[c];\n\n if (void 0 === o[h]) {\n var f = 4 * h;\n (s ? s(p[f + 0], p[f + 1], p[f + 2], p[f + 3]) : t <= p[f + 2] && e <= p[f + 3] && r >= p[f + 0] && n >= p[f + 1]) ? (o[h] = !0, a.push(l[h])) : o[h] = !1;\n }\n }\n }, Fn.prototype._forEachCell = function (t, e, r, n, i, a, o, s) {\n for (var u = this._convertToCellCoord(t), l = this._convertToCellCoord(e), p = this._convertToCellCoord(r), c = this._convertToCellCoord(n), h = u; h <= p; h++) {\n for (var f = l; f <= c; f++) {\n var y = this.d * f + h;\n if ((!s || s(this._convertFromCellCoord(h), this._convertFromCellCoord(f), this._convertFromCellCoord(h + 1), this._convertFromCellCoord(f + 1))) && i.call(this, t, e, r, n, y, a, o, s)) return;\n }\n }\n }, Fn.prototype._convertFromCellCoord = function (t) {\n return (t - this.padding) / this.scale;\n }, Fn.prototype._convertToCellCoord = function (t) {\n return Math.max(0, Math.min(this.d - 1, Math.floor(t * this.scale) + this.padding));\n }, Fn.prototype.toArrayBuffer = function () {\n if (this.arrayBuffer) return this.arrayBuffer;\n\n for (var t = this.cells, e = 3 + this.cells.length + 1 + 1, r = 0, n = 0; n < this.cells.length; n++) {\n r += this.cells[n].length;\n }\n\n var i = new Int32Array(e + r + this.keys.length + this.bboxes.length);\n i[0] = this.extent, i[1] = this.n, i[2] = this.padding;\n\n for (var a = e, o = 0; o < t.length; o++) {\n var s = t[o];\n i[3 + o] = a, i.set(s, a), a += s.length;\n }\n\n return i[3 + t.length] = a, i.set(this.keys, a), i[3 + t.length + 1] = a += this.keys.length, i.set(this.bboxes, a), a += this.bboxes.length, i.buffer;\n };\n var Dn = o.ImageData,\n Ln = o.ImageBitmap,\n Rn = {};\n\n function On(t, e, r) {\n void 0 === r && (r = {}), Object.defineProperty(e, "_classRegistryKey", {\n value: t,\n writeable: !1\n }), Rn[t] = {\n klass: e,\n omit: r.omit || [],\n shallow: r.shallow || []\n };\n }\n\n for (var Un in On("Object", Object), Vn.serialize = function (t, e) {\n var r = t.toArrayBuffer();\n return e && e.push(r), {\n buffer: r\n };\n }, Vn.deserialize = function (t) {\n return new Vn(t.buffer);\n }, On("Grid", Vn), On("Color", ee), On("Error", Error), On("ResolvedImage", ae), On("StylePropertyFunction", $r), On("StyleExpression", Gr, {\n omit: ["_evaluator"]\n }), On("ZoomDependentExpression", Hr), On("ZoomConstantExpression", Jr), On("CompoundExpression", be, {\n omit: ["_evaluate"]\n }), zr) {\n zr[Un]._classRegistryKey || On("Expression_" + Un, zr[Un]);\n }\n\n function jn(t) {\n return t && "undefined" != typeof ArrayBuffer && (t instanceof ArrayBuffer || t.constructor && "ArrayBuffer" === t.constructor.name);\n }\n\n function qn(t) {\n return Ln && t instanceof Ln;\n }\n\n function Nn(t, e) {\n if (null == t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || t instanceof Boolean || t instanceof Number || t instanceof String || t instanceof Date || t instanceof RegExp) return t;\n if (jn(t) || qn(t)) return e && e.push(t), t;\n\n if (ArrayBuffer.isView(t)) {\n var r = t;\n return e && e.push(r.buffer), r;\n }\n\n if (t instanceof Dn) return e && e.push(t.data.buffer), t;\n\n if (Array.isArray(t)) {\n for (var n = [], i = 0, a = t; i < a.length; i += 1) {\n n.push(Nn(a[i], e));\n }\n\n return n;\n }\n\n if ("object" == typeof t) {\n var o = t.constructor,\n s = o._classRegistryKey;\n if (!s) throw new Error("can\'t serialize object of unregistered class");\n var u = o.serialize ? o.serialize(t, e) : {};\n\n if (!o.serialize) {\n for (var l in t) {\n if (t.hasOwnProperty(l) && !(Rn[s].omit.indexOf(l) >= 0)) {\n var p = t[l];\n u[l] = Rn[s].shallow.indexOf(l) >= 0 ? p : Nn(p, e);\n }\n }\n\n t instanceof Error && (u.message = t.message);\n }\n\n if (u.$name) throw new Error("$name property is reserved for worker serialization logic.");\n return "Object" !== s && (u.$name = s), u;\n }\n\n throw new Error("can\'t serialize object of type " + typeof t);\n }\n\n function Kn(t) {\n if (null == t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || t instanceof Boolean || t instanceof Number || t instanceof String || t instanceof Date || t instanceof RegExp || jn(t) || qn(t) || ArrayBuffer.isView(t) || t instanceof Dn) return t;\n if (Array.isArray(t)) return t.map(Kn);\n\n if ("object" == typeof t) {\n var e = t.$name || "Object",\n r = Rn[e].klass;\n if (!r) throw new Error("can\'t deserialize unregistered class " + e);\n if (r.deserialize) return r.deserialize(t);\n\n for (var n = Object.create(r.prototype), i = 0, a = Object.keys(t); i < a.length; i += 1) {\n var o = a[i];\n\n if ("$name" !== o) {\n var s = t[o];\n n[o] = Rn[e].shallow.indexOf(o) >= 0 ? s : Kn(s);\n }\n }\n\n return n;\n }\n\n throw new Error("can\'t deserialize object of type " + typeof t);\n }\n\n var Gn = function Gn() {\n this.first = !0;\n };\n\n Gn.prototype.update = function (t, e) {\n var r = Math.floor(t);\n return this.first ? (this.first = !1, this.lastIntegerZoom = r, this.lastIntegerZoomTime = 0, this.lastZoom = t, this.lastFloorZoom = r, !0) : (this.lastFloorZoom > r ? (this.lastIntegerZoom = r + 1, this.lastIntegerZoomTime = e) : this.lastFloorZoom < r && (this.lastIntegerZoom = r, this.lastIntegerZoomTime = e), t !== this.lastZoom && (this.lastZoom = t, this.lastFloorZoom = r, !0));\n };\n\n var Zn = {\n "Latin-1 Supplement": function Latin1Supplement(t) {\n return t >= 128 && t <= 255;\n },\n Arabic: function Arabic(t) {\n return t >= 1536 && t <= 1791;\n },\n "Arabic Supplement": function ArabicSupplement(t) {\n return t >= 1872 && t <= 1919;\n },\n "Arabic Extended-A": function ArabicExtendedA(t) {\n return t >= 2208 && t <= 2303;\n },\n "Hangul Jamo": function HangulJamo(t) {\n return t >= 4352 && t <= 4607;\n },\n "Unified Canadian Aboriginal Syllabics": function UnifiedCanadianAboriginalSyllabics(t) {\n return t >= 5120 && t <= 5759;\n },\n Khmer: function Khmer(t) {\n return t >= 6016 && t <= 6143;\n },\n "Unified Canadian Aboriginal Syllabics Extended": function UnifiedCanadianAboriginalSyllabicsExtended(t) {\n return t >= 6320 && t <= 6399;\n },\n "General Punctuation": function GeneralPunctuation(t) {\n return t >= 8192 && t <= 8303;\n },\n "Letterlike Symbols": function LetterlikeSymbols(t) {\n return t >= 8448 && t <= 8527;\n },\n "Number Forms": function NumberForms(t) {\n return t >= 8528 && t <= 8591;\n },\n "Miscellaneous Technical": function MiscellaneousTechnical(t) {\n return t >= 8960 && t <= 9215;\n },\n "Control Pictures": function ControlPictures(t) {\n return t >= 9216 && t <= 9279;\n },\n "Optical Character Recognition": function OpticalCharacterRecognition(t) {\n return t >= 9280 && t <= 9311;\n },\n "Enclosed Alphanumerics": function EnclosedAlphanumerics(t) {\n return t >= 9312 && t <= 9471;\n },\n "Geometric Shapes": function GeometricShapes(t) {\n return t >= 9632 && t <= 9727;\n },\n "Miscellaneous Symbols": function MiscellaneousSymbols(t) {\n return t >= 9728 && t <= 9983;\n },\n "Miscellaneous Symbols and Arrows": function MiscellaneousSymbolsAndArrows(t) {\n return t >= 11008 && t <= 11263;\n },\n "CJK Radicals Supplement": function CJKRadicalsSupplement(t) {\n return t >= 11904 && t <= 12031;\n },\n "Kangxi Radicals": function KangxiRadicals(t) {\n return t >= 12032 && t <= 12255;\n },\n "Ideographic Description Characters": function IdeographicDescriptionCharacters(t) {\n return t >= 12272 && t <= 12287;\n },\n "CJK Symbols and Punctuation": function CJKSymbolsAndPunctuation(t) {\n return t >= 12288 && t <= 12351;\n },\n Hiragana: function Hiragana(t) {\n return t >= 12352 && t <= 12447;\n },\n Katakana: function Katakana(t) {\n return t >= 12448 && t <= 12543;\n },\n Bopomofo: function Bopomofo(t) {\n return t >= 12544 && t <= 12591;\n },\n "Hangul Compatibility Jamo": function HangulCompatibilityJamo(t) {\n return t >= 12592 && t <= 12687;\n },\n Kanbun: function Kanbun(t) {\n return t >= 12688 && t <= 12703;\n },\n "Bopomofo Extended": function BopomofoExtended(t) {\n return t >= 12704 && t <= 12735;\n },\n "CJK Strokes": function CJKStrokes(t) {\n return t >= 12736 && t <= 12783;\n },\n "Katakana Phonetic Extensions": function KatakanaPhoneticExtensions(t) {\n return t >= 12784 && t <= 12799;\n },\n "Enclosed CJK Letters and Months": function EnclosedCJKLettersAndMonths(t) {\n return t >= 12800 && t <= 13055;\n },\n "CJK Compatibility": function CJKCompatibility(t) {\n return t >= 13056 && t <= 13311;\n },\n "CJK Unified Ideographs Extension A": function CJKUnifiedIdeographsExtensionA(t) {\n return t >= 13312 && t <= 19903;\n },\n "Yijing Hexagram Symbols": function YijingHexagramSymbols(t) {\n return t >= 19904 && t <= 19967;\n },\n "CJK Unified Ideographs": function CJKUnifiedIdeographs(t) {\n return t >= 19968 && t <= 40959;\n },\n "Yi Syllables": function YiSyllables(t) {\n return t >= 40960 && t <= 42127;\n },\n "Yi Radicals": function YiRadicals(t) {\n return t >= 42128 && t <= 42191;\n },\n "Hangul Jamo Extended-A": function HangulJamoExtendedA(t) {\n return t >= 43360 && t <= 43391;\n },\n "Hangul Syllables": function HangulSyllables(t) {\n return t >= 44032 && t <= 55215;\n },\n "Hangul Jamo Extended-B": function HangulJamoExtendedB(t) {\n return t >= 55216 && t <= 55295;\n },\n "Private Use Area": function PrivateUseArea(t) {\n return t >= 57344 && t <= 63743;\n },\n "CJK Compatibility Ideographs": function CJKCompatibilityIdeographs(t) {\n return t >= 63744 && t <= 64255;\n },\n "Arabic Presentation Forms-A": function ArabicPresentationFormsA(t) {\n return t >= 64336 && t <= 65023;\n },\n "Vertical Forms": function VerticalForms(t) {\n return t >= 65040 && t <= 65055;\n },\n "CJK Compatibility Forms": function CJKCompatibilityForms(t) {\n return t >= 65072 && t <= 65103;\n },\n "Small Form Variants": function SmallFormVariants(t) {\n return t >= 65104 && t <= 65135;\n },\n "Arabic Presentation Forms-B": function ArabicPresentationFormsB(t) {\n return t >= 65136 && t <= 65279;\n },\n "Halfwidth and Fullwidth Forms": function HalfwidthAndFullwidthForms(t) {\n return t >= 65280 && t <= 65519;\n }\n };\n\n function Xn(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (Jn(r[e].charCodeAt(0))) return !0;\n }\n\n return !1;\n }\n\n function Jn(t) {\n return !(746 !== t && 747 !== t && (t < 4352 || !(Zn["Bopomofo Extended"](t) || Zn.Bopomofo(t) || Zn["CJK Compatibility Forms"](t) && !(t >= 65097 && t <= 65103) || Zn["CJK Compatibility Ideographs"](t) || Zn["CJK Compatibility"](t) || Zn["CJK Radicals Supplement"](t) || Zn["CJK Strokes"](t) || !(!Zn["CJK Symbols and Punctuation"](t) || t >= 12296 && t <= 12305 || t >= 12308 && t <= 12319 || 12336 === t) || Zn["CJK Unified Ideographs Extension A"](t) || Zn["CJK Unified Ideographs"](t) || Zn["Enclosed CJK Letters and Months"](t) || Zn["Hangul Compatibility Jamo"](t) || Zn["Hangul Jamo Extended-A"](t) || Zn["Hangul Jamo Extended-B"](t) || Zn["Hangul Jamo"](t) || Zn["Hangul Syllables"](t) || Zn.Hiragana(t) || Zn["Ideographic Description Characters"](t) || Zn.Kanbun(t) || Zn["Kangxi Radicals"](t) || Zn["Katakana Phonetic Extensions"](t) || Zn.Katakana(t) && 12540 !== t || !(!Zn["Halfwidth and Fullwidth Forms"](t) || 65288 === t || 65289 === t || 65293 === t || t >= 65306 && t <= 65310 || 65339 === t || 65341 === t || 65343 === t || t >= 65371 && t <= 65503 || 65507 === t || t >= 65512 && t <= 65519) || !(!Zn["Small Form Variants"](t) || t >= 65112 && t <= 65118 || t >= 65123 && t <= 65126) || Zn["Unified Canadian Aboriginal Syllabics"](t) || Zn["Unified Canadian Aboriginal Syllabics Extended"](t) || Zn["Vertical Forms"](t) || Zn["Yijing Hexagram Symbols"](t) || Zn["Yi Syllables"](t) || Zn["Yi Radicals"](t))));\n }\n\n function Hn(t) {\n return !(Jn(t) || function (t) {\n return !!(Zn["Latin-1 Supplement"](t) && (167 === t || 169 === t || 174 === t || 177 === t || 188 === t || 189 === t || 190 === t || 215 === t || 247 === t) || Zn["General Punctuation"](t) && (8214 === t || 8224 === t || 8225 === t || 8240 === t || 8241 === t || 8251 === t || 8252 === t || 8258 === t || 8263 === t || 8264 === t || 8265 === t || 8273 === t) || Zn["Letterlike Symbols"](t) || Zn["Number Forms"](t) || Zn["Miscellaneous Technical"](t) && (t >= 8960 && t <= 8967 || t >= 8972 && t <= 8991 || t >= 8996 && t <= 9e3 || 9003 === t || t >= 9085 && t <= 9114 || t >= 9150 && t <= 9165 || 9167 === t || t >= 9169 && t <= 9179 || t >= 9186 && t <= 9215) || Zn["Control Pictures"](t) && 9251 !== t || Zn["Optical Character Recognition"](t) || Zn["Enclosed Alphanumerics"](t) || Zn["Geometric Shapes"](t) || Zn["Miscellaneous Symbols"](t) && !(t >= 9754 && t <= 9759) || Zn["Miscellaneous Symbols and Arrows"](t) && (t >= 11026 && t <= 11055 || t >= 11088 && t <= 11097 || t >= 11192 && t <= 11243) || Zn["CJK Symbols and Punctuation"](t) || Zn.Katakana(t) || Zn["Private Use Area"](t) || Zn["CJK Compatibility Forms"](t) || Zn["Small Form Variants"](t) || Zn["Halfwidth and Fullwidth Forms"](t) || 8734 === t || 8756 === t || 8757 === t || t >= 9984 && t <= 10087 || t >= 10102 && t <= 10131 || 65532 === t || 65533 === t);\n }(t));\n }\n\n function Yn(t) {\n return t >= 1424 && t <= 2303 || Zn["Arabic Presentation Forms-A"](t) || Zn["Arabic Presentation Forms-B"](t);\n }\n\n function $n(t, e) {\n return !(!e && Yn(t) || t >= 2304 && t <= 3583 || t >= 3840 && t <= 4255 || Zn.Khmer(t));\n }\n\n function Wn(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (Yn(r[e].charCodeAt(0))) return !0;\n }\n\n return !1;\n }\n\n var Qn = null,\n ti = "unavailable",\n ei = null,\n ri = function ri(t) {\n t && "string" == typeof t && t.indexOf("NetworkError") > -1 && (ti = "error"), Qn && Qn(t);\n };\n\n function ni() {\n ii.fire(new zt("pluginStateChange", {\n pluginStatus: ti,\n pluginURL: ei\n }));\n }\n\n var ii = new Et(),\n ai = function ai() {\n return ti;\n },\n oi = function oi() {\n if ("deferred" !== ti || !ei) throw new Error("rtl-text-plugin cannot be downloaded unless a pluginURL is specified");\n ti = "loading", ni(), ei && wt({\n url: ei\n }, function (t) {\n t ? ri(t) : (ti = "loaded", ni());\n });\n },\n si = {\n applyArabicShaping: null,\n processBidirectionalText: null,\n processStyledBidirectionalText: null,\n isLoaded: function isLoaded() {\n return "loaded" === ti || null != si.applyArabicShaping;\n },\n isLoading: function isLoading() {\n return "loading" === ti;\n },\n setState: function setState(t) {\n ti = t.pluginStatus, ei = t.pluginURL;\n },\n isParsed: function isParsed() {\n return null != si.applyArabicShaping && null != si.processBidirectionalText && null != si.processStyledBidirectionalText;\n },\n getPluginURL: function getPluginURL() {\n return ei;\n }\n },\n ui = function ui(t, e) {\n this.zoom = t, e ? (this.now = e.now, this.fadeDuration = e.fadeDuration, this.zoomHistory = e.zoomHistory, this.transition = e.transition) : (this.now = 0, this.fadeDuration = 0, this.zoomHistory = new Gn(), this.transition = {});\n };\n\n ui.prototype.isSupportedScript = function (t) {\n return function (t, e) {\n for (var r = 0, n = t; r < n.length; r += 1) {\n if (!$n(n[r].charCodeAt(0), e)) return !1;\n }\n\n return !0;\n }(t, si.isLoaded());\n }, ui.prototype.crossFadingFactor = function () {\n return 0 === this.fadeDuration ? 1 : Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1);\n }, ui.prototype.getCrossfadeParameters = function () {\n var t = this.zoom,\n e = t - Math.floor(t),\n r = this.crossFadingFactor();\n return t > this.zoomHistory.lastIntegerZoom ? {\n fromScale: 2,\n toScale: 1,\n t: e + (1 - e) * r\n } : {\n fromScale: .5,\n toScale: 1,\n t: 1 - (1 - r) * e\n };\n };\n\n var li = function li(t, e) {\n this.property = t, this.value = e, this.expression = function (t, e) {\n if (Rr(t)) return new $r(t, e);\n\n if (Zr(t)) {\n var r = Yr(t, e);\n if ("error" === r.result) throw new Error(r.value.map(function (t) {\n return t.key + ": " + t.message;\n }).join(", "));\n return r.value;\n }\n\n var n = t;\n return "string" == typeof t && "color" === e.type && (n = ee.parse(t)), {\n kind: "constant",\n evaluate: function evaluate() {\n return n;\n }\n };\n }(void 0 === e ? t.specification.default : e, t.specification);\n };\n\n li.prototype.isDataDriven = function () {\n return "source" === this.expression.kind || "composite" === this.expression.kind;\n }, li.prototype.possiblyEvaluate = function (t, e, r) {\n return this.property.possiblyEvaluate(this, t, e, r);\n };\n\n var pi = function pi(t) {\n this.property = t, this.value = new li(t, void 0);\n };\n\n pi.prototype.transitioned = function (t, e) {\n return new hi(this.property, this.value, e, h({}, t.transition, this.transition), t.now);\n }, pi.prototype.untransitioned = function () {\n return new hi(this.property, this.value, null, {}, 0);\n };\n\n var ci = function ci(t) {\n this._properties = t, this._values = Object.create(t.defaultTransitionablePropertyValues);\n };\n\n ci.prototype.getValue = function (t) {\n return w(this._values[t].value.value);\n }, ci.prototype.setValue = function (t, e) {\n this._values.hasOwnProperty(t) || (this._values[t] = new pi(this._values[t].property)), this._values[t].value = new li(this._values[t].property, null === e ? void 0 : w(e));\n }, ci.prototype.getTransition = function (t) {\n return w(this._values[t].transition);\n }, ci.prototype.setTransition = function (t, e) {\n this._values.hasOwnProperty(t) || (this._values[t] = new pi(this._values[t].property)), this._values[t].transition = w(e) || void 0;\n }, ci.prototype.serialize = function () {\n for (var t = {}, e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e],\n i = this.getValue(n);\n void 0 !== i && (t[n] = i);\n var a = this.getTransition(n);\n void 0 !== a && (t[n + "-transition"] = a);\n }\n\n return t;\n }, ci.prototype.transitioned = function (t, e) {\n for (var r = new fi(this._properties), n = 0, i = Object.keys(this._values); n < i.length; n += 1) {\n var a = i[n];\n r._values[a] = this._values[a].transitioned(t, e._values[a]);\n }\n\n return r;\n }, ci.prototype.untransitioned = function () {\n for (var t = new fi(this._properties), e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e];\n t._values[n] = this._values[n].untransitioned();\n }\n\n return t;\n };\n\n var hi = function hi(t, e, r, n, i) {\n this.property = t, this.value = e, this.begin = i + n.delay || 0, this.end = this.begin + n.duration || 0, t.specification.transition && (n.delay || n.duration) && (this.prior = r);\n };\n\n hi.prototype.possiblyEvaluate = function (t, e, r) {\n var n = t.now || 0,\n i = this.value.possiblyEvaluate(t, e, r),\n a = this.prior;\n\n if (a) {\n if (n > this.end) return this.prior = null, i;\n if (this.value.isDataDriven()) return this.prior = null, i;\n if (n < this.begin) return a.possiblyEvaluate(t, e, r);\n var o = (n - this.begin) / (this.end - this.begin);\n return this.property.interpolate(a.possiblyEvaluate(t, e, r), i, function (t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var e = t * t,\n r = e * t;\n return 4 * (t < .5 ? r : 3 * (t - e) + r - .75);\n }(o));\n }\n\n return i;\n };\n\n var fi = function fi(t) {\n this._properties = t, this._values = Object.create(t.defaultTransitioningPropertyValues);\n };\n\n fi.prototype.possiblyEvaluate = function (t, e, r) {\n for (var n = new mi(this._properties), i = 0, a = Object.keys(this._values); i < a.length; i += 1) {\n var o = a[i];\n n._values[o] = this._values[o].possiblyEvaluate(t, e, r);\n }\n\n return n;\n }, fi.prototype.hasTransition = function () {\n for (var t = 0, e = Object.keys(this._values); t < e.length; t += 1) {\n if (this._values[e[t]].prior) return !0;\n }\n\n return !1;\n };\n\n var yi = function yi(t) {\n this._properties = t, this._values = Object.create(t.defaultPropertyValues);\n };\n\n yi.prototype.getValue = function (t) {\n return w(this._values[t].value);\n }, yi.prototype.setValue = function (t, e) {\n this._values[t] = new li(this._values[t].property, null === e ? void 0 : w(e));\n }, yi.prototype.serialize = function () {\n for (var t = {}, e = 0, r = Object.keys(this._values); e < r.length; e += 1) {\n var n = r[e],\n i = this.getValue(n);\n void 0 !== i && (t[n] = i);\n }\n\n return t;\n }, yi.prototype.possiblyEvaluate = function (t, e, r) {\n for (var n = new mi(this._properties), i = 0, a = Object.keys(this._values); i < a.length; i += 1) {\n var o = a[i];\n n._values[o] = this._values[o].possiblyEvaluate(t, e, r);\n }\n\n return n;\n };\n\n var di = function di(t, e, r) {\n this.property = t, this.value = e, this.parameters = r;\n };\n\n di.prototype.isConstant = function () {\n return "constant" === this.value.kind;\n }, di.prototype.constantOr = function (t) {\n return "constant" === this.value.kind ? this.value.value : t;\n }, di.prototype.evaluate = function (t, e, r, n) {\n return this.property.evaluate(this.value, this.parameters, t, e, r, n);\n };\n\n var mi = function mi(t) {\n this._properties = t, this._values = Object.create(t.defaultPossiblyEvaluatedValues);\n };\n\n mi.prototype.get = function (t) {\n return this._values[t];\n };\n\n var vi = function vi(t) {\n this.specification = t;\n };\n\n vi.prototype.possiblyEvaluate = function (t, e) {\n return t.expression.evaluate(e);\n }, vi.prototype.interpolate = function (t, e, r) {\n var n = Ze[this.specification.type];\n return n ? n(t, e, r) : t;\n };\n\n var gi = function gi(t, e) {\n this.specification = t, this.overrides = e;\n };\n\n gi.prototype.possiblyEvaluate = function (t, e, r, n) {\n return new di(this, "constant" === t.expression.kind || "camera" === t.expression.kind ? {\n kind: "constant",\n value: t.expression.evaluate(e, null, {}, r, n)\n } : t.expression, e);\n }, gi.prototype.interpolate = function (t, e, r) {\n if ("constant" !== t.value.kind || "constant" !== e.value.kind) return t;\n if (void 0 === t.value.value || void 0 === e.value.value) return new di(this, {\n kind: "constant",\n value: void 0\n }, t.parameters);\n var n = Ze[this.specification.type];\n return n ? new di(this, {\n kind: "constant",\n value: n(t.value.value, e.value.value, r)\n }, t.parameters) : t;\n }, gi.prototype.evaluate = function (t, e, r, n, i, a) {\n return "constant" === t.kind ? t.value : t.evaluate(e, r, n, i, a);\n };\n\n var xi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.possiblyEvaluate = function (t, e, r, n) {\n if (void 0 === t.value) return new di(this, {\n kind: "constant",\n value: void 0\n }, e);\n\n if ("constant" === t.expression.kind) {\n var i = t.expression.evaluate(e, null, {}, r, n),\n a = "resolvedImage" === t.property.specification.type && "string" != typeof i ? i.name : i,\n o = this._calculate(a, a, a, e);\n\n return new di(this, {\n kind: "constant",\n value: o\n }, e);\n }\n\n if ("camera" === t.expression.kind) {\n var s = this._calculate(t.expression.evaluate({\n zoom: e.zoom - 1\n }), t.expression.evaluate({\n zoom: e.zoom\n }), t.expression.evaluate({\n zoom: e.zoom + 1\n }), e);\n\n return new di(this, {\n kind: "constant",\n value: s\n }, e);\n }\n\n return new di(this, t.expression, e);\n }, e.prototype.evaluate = function (t, e, r, n, i, a) {\n if ("source" === t.kind) {\n var o = t.evaluate(e, r, n, i, a);\n return this._calculate(o, o, o, e);\n }\n\n return "composite" === t.kind ? this._calculate(t.evaluate({\n zoom: Math.floor(e.zoom) - 1\n }, r, n), t.evaluate({\n zoom: Math.floor(e.zoom)\n }, r, n), t.evaluate({\n zoom: Math.floor(e.zoom) + 1\n }, r, n), e) : t.value;\n }, e.prototype._calculate = function (t, e, r, n) {\n return n.zoom > n.zoomHistory.lastIntegerZoom ? {\n from: t,\n to: e\n } : {\n from: r,\n to: e\n };\n }, e.prototype.interpolate = function (t) {\n return t;\n }, e;\n }(gi),\n bi = function bi(t) {\n this.specification = t;\n };\n\n bi.prototype.possiblyEvaluate = function (t, e, r, n) {\n if (void 0 !== t.value) {\n if ("constant" === t.expression.kind) {\n var i = t.expression.evaluate(e, null, {}, r, n);\n return this._calculate(i, i, i, e);\n }\n\n return this._calculate(t.expression.evaluate(new ui(Math.floor(e.zoom - 1), e)), t.expression.evaluate(new ui(Math.floor(e.zoom), e)), t.expression.evaluate(new ui(Math.floor(e.zoom + 1), e)), e);\n }\n }, bi.prototype._calculate = function (t, e, r, n) {\n return n.zoom > n.zoomHistory.lastIntegerZoom ? {\n from: t,\n to: e\n } : {\n from: r,\n to: e\n };\n }, bi.prototype.interpolate = function (t) {\n return t;\n };\n\n var wi = function wi(t) {\n this.specification = t;\n };\n\n wi.prototype.possiblyEvaluate = function (t, e, r, n) {\n return !!t.expression.evaluate(e, null, {}, r, n);\n }, wi.prototype.interpolate = function () {\n return !1;\n };\n\n var _i = function _i(t) {\n for (var e in this.properties = t, this.defaultPropertyValues = {}, this.defaultTransitionablePropertyValues = {}, this.defaultTransitioningPropertyValues = {}, this.defaultPossiblyEvaluatedValues = {}, this.overridableProperties = [], t) {\n var r = t[e];\n r.specification.overridable && this.overridableProperties.push(e);\n var n = this.defaultPropertyValues[e] = new li(r, void 0),\n i = this.defaultTransitionablePropertyValues[e] = new pi(r);\n this.defaultTransitioningPropertyValues[e] = i.untransitioned(), this.defaultPossiblyEvaluatedValues[e] = n.possiblyEvaluate({});\n }\n };\n\n On("DataDrivenProperty", gi), On("DataConstantProperty", vi), On("CrossFadedDataDrivenProperty", xi), On("CrossFadedProperty", bi), On("ColorRampProperty", wi);\n\n var Ai = function (t) {\n function e(e, r) {\n if (t.call(this), this.id = e.id, this.type = e.type, this._featureFilter = {\n filter: function filter() {\n return !0;\n },\n needGeometry: !1\n }, "custom" !== e.type && (this.metadata = (e = e).metadata, this.minzoom = e.minzoom, this.maxzoom = e.maxzoom, "background" !== e.type && (this.source = e.source, this.sourceLayer = e["source-layer"], this.filter = e.filter), r.layout && (this._unevaluatedLayout = new yi(r.layout)), r.paint)) {\n for (var n in this._transitionablePaint = new ci(r.paint), e.paint) {\n this.setPaintProperty(n, e.paint[n], {\n validate: !1\n });\n }\n\n for (var i in e.layout) {\n this.setLayoutProperty(i, e.layout[i], {\n validate: !1\n });\n }\n\n this._transitioningPaint = this._transitionablePaint.untransitioned(), this.paint = new mi(r.paint);\n }\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getCrossfadeParameters = function () {\n return this._crossfadeParameters;\n }, e.prototype.getLayoutProperty = function (t) {\n return "visibility" === t ? this.visibility : this._unevaluatedLayout.getValue(t);\n }, e.prototype.setLayoutProperty = function (t, e, r) {\n void 0 === r && (r = {}), null != e && this._validate(Bn, "layers." + this.id + ".layout." + t, t, e, r) || ("visibility" !== t ? this._unevaluatedLayout.setValue(t, e) : this.visibility = e);\n }, e.prototype.getPaintProperty = function (t) {\n return g(t, "-transition") ? this._transitionablePaint.getTransition(t.slice(0, -"-transition".length)) : this._transitionablePaint.getValue(t);\n }, e.prototype.setPaintProperty = function (t, e, r) {\n if (void 0 === r && (r = {}), null != e && this._validate(Mn, "layers." + this.id + ".paint." + t, t, e, r)) return !1;\n if (g(t, "-transition")) return this._transitionablePaint.setTransition(t.slice(0, -"-transition".length), e || void 0), !1;\n var n = this._transitionablePaint._values[t],\n i = "cross-faded-data-driven" === n.property.specification["property-type"],\n a = n.value.isDataDriven(),\n o = n.value;\n this._transitionablePaint.setValue(t, e), this._handleSpecialPaintPropertyUpdate(t);\n var s = this._transitionablePaint._values[t].value;\n return s.isDataDriven() || a || i || this._handleOverridablePaintPropertyUpdate(t, o, s);\n }, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {}, e.prototype._handleOverridablePaintPropertyUpdate = function (t, e, r) {\n return !1;\n }, e.prototype.isHidden = function (t) {\n return !!(this.minzoom && t < this.minzoom) || !!(this.maxzoom && t >= this.maxzoom) || "none" === this.visibility;\n }, e.prototype.updateTransitions = function (t) {\n this._transitioningPaint = this._transitionablePaint.transitioned(t, this._transitioningPaint);\n }, e.prototype.hasTransition = function () {\n return this._transitioningPaint.hasTransition();\n }, e.prototype.recalculate = function (t, e) {\n t.getCrossfadeParameters && (this._crossfadeParameters = t.getCrossfadeParameters()), this._unevaluatedLayout && (this.layout = this._unevaluatedLayout.possiblyEvaluate(t, void 0, e)), this.paint = this._transitioningPaint.possiblyEvaluate(t, void 0, e);\n }, e.prototype.serialize = function () {\n var t = {\n id: this.id,\n type: this.type,\n source: this.source,\n "source-layer": this.sourceLayer,\n metadata: this.metadata,\n minzoom: this.minzoom,\n maxzoom: this.maxzoom,\n filter: this.filter,\n layout: this._unevaluatedLayout && this._unevaluatedLayout.serialize(),\n paint: this._transitionablePaint && this._transitionablePaint.serialize()\n };\n return this.visibility && (t.layout = t.layout || {}, t.layout.visibility = this.visibility), b(t, function (t, e) {\n return !(void 0 === t || "layout" === e && !Object.keys(t).length || "paint" === e && !Object.keys(t).length);\n });\n }, e.prototype._validate = function (t, e, r, n, i) {\n return void 0 === i && (i = {}), (!i || !1 !== i.validate) && Tn(this, t.call(En, {\n key: e,\n layerType: this.type,\n objectKey: r,\n value: n,\n styleSpec: Pt,\n style: {\n glyphs: !0,\n sprite: !0\n }\n }));\n }, e.prototype.is3D = function () {\n return !1;\n }, e.prototype.isTileClipped = function () {\n return !1;\n }, e.prototype.hasOffscreenPass = function () {\n return !1;\n }, e.prototype.resize = function () {}, e.prototype.isStateDependent = function () {\n for (var t in this.paint._values) {\n var e = this.paint.get(t);\n if (e instanceof di && Vr(e.property.specification) && ("source" === e.value.kind || "composite" === e.value.kind) && e.value.isStateDependent) return !0;\n }\n\n return !1;\n }, e;\n }(Et),\n Si = {\n Int8: Int8Array,\n Uint8: Uint8Array,\n Int16: Int16Array,\n Uint16: Uint16Array,\n Int32: Int32Array,\n Uint32: Uint32Array,\n Float32: Float32Array\n },\n ki = function ki(t, e) {\n this._structArray = t, this._pos1 = e * this.size, this._pos2 = this._pos1 / 2, this._pos4 = this._pos1 / 4, this._pos8 = this._pos1 / 8;\n },\n Ii = function Ii() {\n this.isTransferred = !1, this.capacity = -1, this.resize(0);\n };\n\n function zi(t, e) {\n void 0 === e && (e = 1);\n var r = 0,\n n = 0;\n return {\n members: t.map(function (t) {\n var i = Si[t.type].BYTES_PER_ELEMENT,\n a = r = Ci(r, Math.max(e, i)),\n o = t.components || 1;\n return n = Math.max(n, i), r += i * o, {\n name: t.name,\n type: t.type,\n components: o,\n offset: a\n };\n }),\n size: Ci(r, Math.max(n, e)),\n alignment: e\n };\n }\n\n function Ci(t, e) {\n return Math.ceil(t / e) * e;\n }\n\n Ii.serialize = function (t, e) {\n return t._trim(), e && (t.isTransferred = !0, e.push(t.arrayBuffer)), {\n length: t.length,\n arrayBuffer: t.arrayBuffer\n };\n }, Ii.deserialize = function (t) {\n var e = Object.create(this.prototype);\n return e.arrayBuffer = t.arrayBuffer, e.length = t.length, e.capacity = t.arrayBuffer.byteLength / e.bytesPerElement, e._refreshViews(), e;\n }, Ii.prototype._trim = function () {\n this.length !== this.capacity && (this.capacity = this.length, this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement), this._refreshViews());\n }, Ii.prototype.clear = function () {\n this.length = 0;\n }, Ii.prototype.resize = function (t) {\n this.reserve(t), this.length = t;\n }, Ii.prototype.reserve = function (t) {\n if (t > this.capacity) {\n this.capacity = Math.max(t, Math.floor(5 * this.capacity), 128), this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n var e = this.uint8;\n this._refreshViews(), e && this.uint8.set(e);\n }\n }, Ii.prototype._refreshViews = function () {\n throw new Error("_refreshViews() must be implemented by each concrete StructArray layout");\n };\n\n var Ei = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.int16[n + 0] = e, this.int16[n + 1] = r, t;\n }, e;\n }(Ii);\n\n Ei.prototype.bytesPerElement = 4, On("StructArrayLayout2i4", Ei);\n\n var Pi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 4 * t;\n return this.int16[a + 0] = e, this.int16[a + 1] = r, this.int16[a + 2] = n, this.int16[a + 3] = i, t;\n }, e;\n }(Ii);\n\n Pi.prototype.bytesPerElement = 8, On("StructArrayLayout4i8", Pi);\n\n var Mi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 6 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.int16[s + 2] = n, this.int16[s + 3] = i, this.int16[s + 4] = a, this.int16[s + 5] = o, t;\n }, e;\n }(Ii);\n\n Mi.prototype.bytesPerElement = 12, On("StructArrayLayout2i4i12", Mi);\n\n var Bi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 4 * t,\n u = 8 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.uint8[u + 4] = n, this.uint8[u + 5] = i, this.uint8[u + 6] = a, this.uint8[u + 7] = o, t;\n }, e;\n }(Ii);\n\n Bi.prototype.bytesPerElement = 8, On("StructArrayLayout2i4ub8", Bi);\n\n var Ti = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.float32[n + 0] = e, this.float32[n + 1] = r, t;\n }, e;\n }(Ii);\n\n Ti.prototype.bytesPerElement = 8, On("StructArrayLayout2f8", Ti);\n\n var Vi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l) {\n var p = this.length;\n return this.resize(p + 1), this.emplace(p, t, e, r, n, i, a, o, s, u, l);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = 10 * t;\n return this.uint16[c + 0] = e, this.uint16[c + 1] = r, this.uint16[c + 2] = n, this.uint16[c + 3] = i, this.uint16[c + 4] = a, this.uint16[c + 5] = o, this.uint16[c + 6] = s, this.uint16[c + 7] = u, this.uint16[c + 8] = l, this.uint16[c + 9] = p, t;\n }, e;\n }(Ii);\n\n Vi.prototype.bytesPerElement = 20, On("StructArrayLayout10ui20", Vi);\n\n var Fi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c) {\n var h = this.length;\n return this.resize(h + 1), this.emplace(h, t, e, r, n, i, a, o, s, u, l, p, c);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h) {\n var f = 12 * t;\n return this.int16[f + 0] = e, this.int16[f + 1] = r, this.int16[f + 2] = n, this.int16[f + 3] = i, this.uint16[f + 4] = a, this.uint16[f + 5] = o, this.uint16[f + 6] = s, this.uint16[f + 7] = u, this.int16[f + 8] = l, this.int16[f + 9] = p, this.int16[f + 10] = c, this.int16[f + 11] = h, t;\n }, e;\n }(Ii);\n\n Fi.prototype.bytesPerElement = 24, On("StructArrayLayout4i4ui4i24", Fi);\n\n var Di = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.float32[i + 0] = e, this.float32[i + 1] = r, this.float32[i + 2] = n, t;\n }, e;\n }(Ii);\n\n Di.prototype.bytesPerElement = 12, On("StructArrayLayout3f12", Di);\n\n var Li = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.uint32[1 * t + 0] = e, t;\n }, e;\n }(Ii);\n\n Li.prototype.bytesPerElement = 4, On("StructArrayLayout1ul4", Li);\n\n var Ri = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u) {\n var l = this.length;\n return this.resize(l + 1), this.emplace(l, t, e, r, n, i, a, o, s, u);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l) {\n var p = 10 * t,\n c = 5 * t;\n return this.int16[p + 0] = e, this.int16[p + 1] = r, this.int16[p + 2] = n, this.int16[p + 3] = i, this.int16[p + 4] = a, this.int16[p + 5] = o, this.uint32[c + 3] = s, this.uint16[p + 8] = u, this.uint16[p + 9] = l, t;\n }, e;\n }(Ii);\n\n Ri.prototype.bytesPerElement = 20, On("StructArrayLayout6i1ul2ui20", Ri);\n\n var Oi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a) {\n var o = this.length;\n return this.resize(o + 1), this.emplace(o, t, e, r, n, i, a);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o) {\n var s = 6 * t;\n return this.int16[s + 0] = e, this.int16[s + 1] = r, this.int16[s + 2] = n, this.int16[s + 3] = i, this.int16[s + 4] = a, this.int16[s + 5] = o, t;\n }, e;\n }(Ii);\n\n Oi.prototype.bytesPerElement = 12, On("StructArrayLayout2i2i2i12", Oi);\n\n var Ui = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i) {\n var a = this.length;\n return this.resize(a + 1), this.emplace(a, t, e, r, n, i);\n }, e.prototype.emplace = function (t, e, r, n, i, a) {\n var o = 4 * t,\n s = 8 * t;\n return this.float32[o + 0] = e, this.float32[o + 1] = r, this.float32[o + 2] = n, this.int16[s + 6] = i, this.int16[s + 7] = a, t;\n }, e;\n }(Ii);\n\n Ui.prototype.bytesPerElement = 16, On("StructArrayLayout2f1f2i16", Ui);\n\n var ji = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 12 * t,\n o = 3 * t;\n return this.uint8[a + 0] = e, this.uint8[a + 1] = r, this.float32[o + 1] = n, this.float32[o + 2] = i, t;\n }, e;\n }(Ii);\n\n ji.prototype.bytesPerElement = 12, On("StructArrayLayout2ub2f12", ji);\n\n var qi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.uint16[i + 0] = e, this.uint16[i + 1] = r, this.uint16[i + 2] = n, t;\n }, e;\n }(Ii);\n\n qi.prototype.bytesPerElement = 6, On("StructArrayLayout3ui6", qi);\n\n var Ni = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m) {\n var v = this.length;\n return this.resize(v + 1), this.emplace(v, t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v) {\n var g = 24 * t,\n x = 12 * t,\n b = 48 * t;\n return this.int16[g + 0] = e, this.int16[g + 1] = r, this.uint16[g + 2] = n, this.uint16[g + 3] = i, this.uint32[x + 2] = a, this.uint32[x + 3] = o, this.uint32[x + 4] = s, this.uint16[g + 10] = u, this.uint16[g + 11] = l, this.uint16[g + 12] = p, this.float32[x + 7] = c, this.float32[x + 8] = h, this.uint8[b + 36] = f, this.uint8[b + 37] = y, this.uint8[b + 38] = d, this.uint32[x + 10] = m, this.int16[g + 22] = v, t;\n }, e;\n }(Ii);\n\n Ni.prototype.bytesPerElement = 48, On("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48", Ni);\n\n var Ki = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z) {\n var C = this.length;\n return this.resize(C + 1), this.emplace(C, t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z);\n }, e.prototype.emplace = function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, A, S, k, I, z, C) {\n var E = 34 * t,\n P = 17 * t;\n return this.int16[E + 0] = e, this.int16[E + 1] = r, this.int16[E + 2] = n, this.int16[E + 3] = i, this.int16[E + 4] = a, this.int16[E + 5] = o, this.int16[E + 6] = s, this.int16[E + 7] = u, this.uint16[E + 8] = l, this.uint16[E + 9] = p, this.uint16[E + 10] = c, this.uint16[E + 11] = h, this.uint16[E + 12] = f, this.uint16[E + 13] = y, this.uint16[E + 14] = d, this.uint16[E + 15] = m, this.uint16[E + 16] = v, this.uint16[E + 17] = g, this.uint16[E + 18] = x, this.uint16[E + 19] = b, this.uint16[E + 20] = w, this.uint16[E + 21] = _, this.uint16[E + 22] = A, this.uint32[P + 12] = S, this.float32[P + 13] = k, this.float32[P + 14] = I, this.float32[P + 15] = z, this.float32[P + 16] = C, t;\n }, e;\n }(Ii);\n\n Ki.prototype.bytesPerElement = 68, On("StructArrayLayout8i15ui1ul4f68", Ki);\n\n var Gi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.float32[1 * t + 0] = e, t;\n }, e;\n }(Ii);\n\n Gi.prototype.bytesPerElement = 4, On("StructArrayLayout1f4", Gi);\n\n var Zi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.int16 = new Int16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 3 * t;\n return this.int16[i + 0] = e, this.int16[i + 1] = r, this.int16[i + 2] = n, t;\n }, e;\n }(Ii);\n\n Zi.prototype.bytesPerElement = 6, On("StructArrayLayout3i6", Zi);\n\n var Xi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint32 = new Uint32Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r) {\n var n = this.length;\n return this.resize(n + 1), this.emplace(n, t, e, r);\n }, e.prototype.emplace = function (t, e, r, n) {\n var i = 4 * t;\n return this.uint32[2 * t + 0] = e, this.uint16[i + 2] = r, this.uint16[i + 3] = n, t;\n }, e;\n }(Ii);\n\n Xi.prototype.bytesPerElement = 8, On("StructArrayLayout1ul2ui8", Xi);\n\n var Ji = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e) {\n var r = this.length;\n return this.resize(r + 1), this.emplace(r, t, e);\n }, e.prototype.emplace = function (t, e, r) {\n var n = 2 * t;\n return this.uint16[n + 0] = e, this.uint16[n + 1] = r, t;\n }, e;\n }(Ii);\n\n Ji.prototype.bytesPerElement = 4, On("StructArrayLayout2ui4", Ji);\n\n var Hi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.uint16 = new Uint16Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t) {\n var e = this.length;\n return this.resize(e + 1), this.emplace(e, t);\n }, e.prototype.emplace = function (t, e) {\n return this.uint16[1 * t + 0] = e, t;\n }, e;\n }(Ii);\n\n Hi.prototype.bytesPerElement = 2, On("StructArrayLayout1ui2", Hi);\n\n var Yi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._refreshViews = function () {\n this.uint8 = new Uint8Array(this.arrayBuffer), this.float32 = new Float32Array(this.arrayBuffer);\n }, e.prototype.emplaceBack = function (t, e, r, n) {\n var i = this.length;\n return this.resize(i + 1), this.emplace(i, t, e, r, n);\n }, e.prototype.emplace = function (t, e, r, n, i) {\n var a = 4 * t;\n return this.float32[a + 0] = e, this.float32[a + 1] = r, this.float32[a + 2] = n, this.float32[a + 3] = i, t;\n }, e;\n }(Ii);\n\n Yi.prototype.bytesPerElement = 16, On("StructArrayLayout4f16", Yi);\n\n var $i = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorPointX: {\n configurable: !0\n },\n anchorPointY: {\n configurable: !0\n },\n x1: {\n configurable: !0\n },\n y1: {\n configurable: !0\n },\n x2: {\n configurable: !0\n },\n y2: {\n configurable: !0\n },\n featureIndex: {\n configurable: !0\n },\n sourceLayerIndex: {\n configurable: !0\n },\n bucketIndex: {\n configurable: !0\n },\n anchorPoint: {\n configurable: !0\n }\n };\n return r.anchorPointX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorPointY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.x1.get = function () {\n return this._structArray.int16[this._pos2 + 2];\n }, r.y1.get = function () {\n return this._structArray.int16[this._pos2 + 3];\n }, r.x2.get = function () {\n return this._structArray.int16[this._pos2 + 4];\n }, r.y2.get = function () {\n return this._structArray.int16[this._pos2 + 5];\n }, r.featureIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 3];\n }, r.sourceLayerIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 8];\n }, r.bucketIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 9];\n }, r.anchorPoint.get = function () {\n return new i(this.anchorPointX, this.anchorPointY);\n }, Object.defineProperties(e.prototype, r), e;\n }(ki);\n\n $i.prototype.size = 20;\n\n var Wi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new $i(this, t);\n }, e;\n }(Ri);\n\n On("CollisionBoxArray", Wi);\n\n var Qi = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorX: {\n configurable: !0\n },\n anchorY: {\n configurable: !0\n },\n glyphStartIndex: {\n configurable: !0\n },\n numGlyphs: {\n configurable: !0\n },\n vertexStartIndex: {\n configurable: !0\n },\n lineStartIndex: {\n configurable: !0\n },\n lineLength: {\n configurable: !0\n },\n segment: {\n configurable: !0\n },\n lowerSize: {\n configurable: !0\n },\n upperSize: {\n configurable: !0\n },\n lineOffsetX: {\n configurable: !0\n },\n lineOffsetY: {\n configurable: !0\n },\n writingMode: {\n configurable: !0\n },\n placedOrientation: {\n configurable: !0\n },\n hidden: {\n configurable: !0\n },\n crossTileID: {\n configurable: !0\n },\n associatedIconIndex: {\n configurable: !0\n }\n };\n return r.anchorX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.glyphStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 2];\n }, r.numGlyphs.get = function () {\n return this._structArray.uint16[this._pos2 + 3];\n }, r.vertexStartIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 2];\n }, r.lineStartIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 3];\n }, r.lineLength.get = function () {\n return this._structArray.uint32[this._pos4 + 4];\n }, r.segment.get = function () {\n return this._structArray.uint16[this._pos2 + 10];\n }, r.lowerSize.get = function () {\n return this._structArray.uint16[this._pos2 + 11];\n }, r.upperSize.get = function () {\n return this._structArray.uint16[this._pos2 + 12];\n }, r.lineOffsetX.get = function () {\n return this._structArray.float32[this._pos4 + 7];\n }, r.lineOffsetY.get = function () {\n return this._structArray.float32[this._pos4 + 8];\n }, r.writingMode.get = function () {\n return this._structArray.uint8[this._pos1 + 36];\n }, r.placedOrientation.get = function () {\n return this._structArray.uint8[this._pos1 + 37];\n }, r.placedOrientation.set = function (t) {\n this._structArray.uint8[this._pos1 + 37] = t;\n }, r.hidden.get = function () {\n return this._structArray.uint8[this._pos1 + 38];\n }, r.hidden.set = function (t) {\n this._structArray.uint8[this._pos1 + 38] = t;\n }, r.crossTileID.get = function () {\n return this._structArray.uint32[this._pos4 + 10];\n }, r.crossTileID.set = function (t) {\n this._structArray.uint32[this._pos4 + 10] = t;\n }, r.associatedIconIndex.get = function () {\n return this._structArray.int16[this._pos2 + 22];\n }, Object.defineProperties(e.prototype, r), e;\n }(ki);\n\n Qi.prototype.size = 48;\n\n var ta = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new Qi(this, t);\n }, e;\n }(Ni);\n\n On("PlacedSymbolArray", ta);\n\n var ea = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n anchorX: {\n configurable: !0\n },\n anchorY: {\n configurable: !0\n },\n rightJustifiedTextSymbolIndex: {\n configurable: !0\n },\n centerJustifiedTextSymbolIndex: {\n configurable: !0\n },\n leftJustifiedTextSymbolIndex: {\n configurable: !0\n },\n verticalPlacedTextSymbolIndex: {\n configurable: !0\n },\n placedIconSymbolIndex: {\n configurable: !0\n },\n verticalPlacedIconSymbolIndex: {\n configurable: !0\n },\n key: {\n configurable: !0\n },\n textBoxStartIndex: {\n configurable: !0\n },\n textBoxEndIndex: {\n configurable: !0\n },\n verticalTextBoxStartIndex: {\n configurable: !0\n },\n verticalTextBoxEndIndex: {\n configurable: !0\n },\n iconBoxStartIndex: {\n configurable: !0\n },\n iconBoxEndIndex: {\n configurable: !0\n },\n verticalIconBoxStartIndex: {\n configurable: !0\n },\n verticalIconBoxEndIndex: {\n configurable: !0\n },\n featureIndex: {\n configurable: !0\n },\n numHorizontalGlyphVertices: {\n configurable: !0\n },\n numVerticalGlyphVertices: {\n configurable: !0\n },\n numIconVertices: {\n configurable: !0\n },\n numVerticalIconVertices: {\n configurable: !0\n },\n useRuntimeCollisionCircles: {\n configurable: !0\n },\n crossTileID: {\n configurable: !0\n },\n textBoxScale: {\n configurable: !0\n },\n textOffset0: {\n configurable: !0\n },\n textOffset1: {\n configurable: !0\n },\n collisionCircleDiameter: {\n configurable: !0\n }\n };\n return r.anchorX.get = function () {\n return this._structArray.int16[this._pos2 + 0];\n }, r.anchorY.get = function () {\n return this._structArray.int16[this._pos2 + 1];\n }, r.rightJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 2];\n }, r.centerJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 3];\n }, r.leftJustifiedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 4];\n }, r.verticalPlacedTextSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 5];\n }, r.placedIconSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 6];\n }, r.verticalPlacedIconSymbolIndex.get = function () {\n return this._structArray.int16[this._pos2 + 7];\n }, r.key.get = function () {\n return this._structArray.uint16[this._pos2 + 8];\n }, r.textBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 9];\n }, r.textBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 10];\n }, r.verticalTextBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 11];\n }, r.verticalTextBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 12];\n }, r.iconBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 13];\n }, r.iconBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 14];\n }, r.verticalIconBoxStartIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 15];\n }, r.verticalIconBoxEndIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 16];\n }, r.featureIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 17];\n }, r.numHorizontalGlyphVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 18];\n }, r.numVerticalGlyphVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 19];\n }, r.numIconVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 20];\n }, r.numVerticalIconVertices.get = function () {\n return this._structArray.uint16[this._pos2 + 21];\n }, r.useRuntimeCollisionCircles.get = function () {\n return this._structArray.uint16[this._pos2 + 22];\n }, r.crossTileID.get = function () {\n return this._structArray.uint32[this._pos4 + 12];\n }, r.crossTileID.set = function (t) {\n this._structArray.uint32[this._pos4 + 12] = t;\n }, r.textBoxScale.get = function () {\n return this._structArray.float32[this._pos4 + 13];\n }, r.textOffset0.get = function () {\n return this._structArray.float32[this._pos4 + 14];\n }, r.textOffset1.get = function () {\n return this._structArray.float32[this._pos4 + 15];\n }, r.collisionCircleDiameter.get = function () {\n return this._structArray.float32[this._pos4 + 16];\n }, Object.defineProperties(e.prototype, r), e;\n }(ki);\n\n ea.prototype.size = 68;\n\n var ra = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new ea(this, t);\n }, e;\n }(Ki);\n\n On("SymbolInstanceArray", ra);\n\n var na = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getoffsetX = function (t) {\n return this.float32[1 * t + 0];\n }, e;\n }(Gi);\n\n On("GlyphOffsetArray", na);\n\n var ia = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getx = function (t) {\n return this.int16[3 * t + 0];\n }, e.prototype.gety = function (t) {\n return this.int16[3 * t + 1];\n }, e.prototype.gettileUnitDistanceFromAnchor = function (t) {\n return this.int16[3 * t + 2];\n }, e;\n }(Zi);\n\n On("SymbolLineVertexArray", ia);\n\n var aa = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var r = {\n featureIndex: {\n configurable: !0\n },\n sourceLayerIndex: {\n configurable: !0\n },\n bucketIndex: {\n configurable: !0\n }\n };\n return r.featureIndex.get = function () {\n return this._structArray.uint32[this._pos4 + 0];\n }, r.sourceLayerIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 2];\n }, r.bucketIndex.get = function () {\n return this._structArray.uint16[this._pos2 + 3];\n }, Object.defineProperties(e.prototype, r), e;\n }(ki);\n\n aa.prototype.size = 8;\n\n var oa = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.get = function (t) {\n return new aa(this, t);\n }, e;\n }(Xi);\n\n On("FeatureIndexArray", oa);\n\n var sa = zi([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }], 4).members,\n ua = function ua(t) {\n void 0 === t && (t = []), this.segments = t;\n };\n\n function la(t, e) {\n return 256 * (t = p(Math.floor(t), 0, 255)) + p(Math.floor(e), 0, 255);\n }\n\n ua.prototype.prepareSegment = function (t, e, r, n) {\n var i = this.segments[this.segments.length - 1];\n return t > ua.MAX_VERTEX_ARRAY_LENGTH && A("Max vertices per segment is " + ua.MAX_VERTEX_ARRAY_LENGTH + ": bucket requested " + t), (!i || i.vertexLength + t > ua.MAX_VERTEX_ARRAY_LENGTH || i.sortKey !== n) && (i = {\n vertexOffset: e.length,\n primitiveOffset: r.length,\n vertexLength: 0,\n primitiveLength: 0\n }, void 0 !== n && (i.sortKey = n), this.segments.push(i)), i;\n }, ua.prototype.get = function () {\n return this.segments;\n }, ua.prototype.destroy = function () {\n for (var t = 0, e = this.segments; t < e.length; t += 1) {\n var r = e[t];\n\n for (var n in r.vaos) {\n r.vaos[n].destroy();\n }\n }\n }, ua.simpleSegment = function (t, e, r, n) {\n return new ua([{\n vertexOffset: t,\n primitiveOffset: e,\n vertexLength: r,\n primitiveLength: n,\n vaos: {},\n sortKey: 0\n }]);\n }, ua.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1, On("SegmentVector", ua);\n var pa = zi([{\n name: "a_pattern_from",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pattern_to",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pixel_ratio_from",\n components: 1,\n type: "Uint16"\n }, {\n name: "a_pixel_ratio_to",\n components: 1,\n type: "Uint16"\n }]),\n ca = e(function (t) {\n t.exports = function (t, e) {\n var r, n, i, a, o, s, u, l;\n\n for (n = t.length - (r = 3 & t.length), i = e, o = 3432918353, s = 461845907, l = 0; l < n;) {\n u = 255 & t.charCodeAt(l) | (255 & t.charCodeAt(++l)) << 8 | (255 & t.charCodeAt(++l)) << 16 | (255 & t.charCodeAt(++l)) << 24, ++l, i = 27492 + (65535 & (a = 5 * (65535 & (i = (i ^= u = (65535 & (u = (u = (65535 & u) * o + (((u >>> 16) * o & 65535) << 16) & 4294967295) << 15 | u >>> 17)) * s + (((u >>> 16) * s & 65535) << 16) & 4294967295) << 13 | i >>> 19)) + ((5 * (i >>> 16) & 65535) << 16) & 4294967295)) + ((58964 + (a >>> 16) & 65535) << 16);\n }\n\n switch (u = 0, r) {\n case 3:\n u ^= (255 & t.charCodeAt(l + 2)) << 16;\n\n case 2:\n u ^= (255 & t.charCodeAt(l + 1)) << 8;\n\n case 1:\n i ^= u = (65535 & (u = (u = (65535 & (u ^= 255 & t.charCodeAt(l))) * o + (((u >>> 16) * o & 65535) << 16) & 4294967295) << 15 | u >>> 17)) * s + (((u >>> 16) * s & 65535) << 16) & 4294967295;\n }\n\n return i ^= t.length, i = 2246822507 * (65535 & (i ^= i >>> 16)) + ((2246822507 * (i >>> 16) & 65535) << 16) & 4294967295, i = 3266489909 * (65535 & (i ^= i >>> 13)) + ((3266489909 * (i >>> 16) & 65535) << 16) & 4294967295, (i ^= i >>> 16) >>> 0;\n };\n }),\n ha = e(function (t) {\n t.exports = function (t, e) {\n for (var r, n = t.length, i = e ^ n, a = 0; n >= 4;) {\n r = 1540483477 * (65535 & (r = 255 & t.charCodeAt(a) | (255 & t.charCodeAt(++a)) << 8 | (255 & t.charCodeAt(++a)) << 16 | (255 & t.charCodeAt(++a)) << 24)) + ((1540483477 * (r >>> 16) & 65535) << 16), i = 1540483477 * (65535 & i) + ((1540483477 * (i >>> 16) & 65535) << 16) ^ (r = 1540483477 * (65535 & (r ^= r >>> 24)) + ((1540483477 * (r >>> 16) & 65535) << 16)), n -= 4, ++a;\n }\n\n switch (n) {\n case 3:\n i ^= (255 & t.charCodeAt(a + 2)) << 16;\n\n case 2:\n i ^= (255 & t.charCodeAt(a + 1)) << 8;\n\n case 1:\n i = 1540483477 * (65535 & (i ^= 255 & t.charCodeAt(a))) + ((1540483477 * (i >>> 16) & 65535) << 16);\n }\n\n return i = 1540483477 * (65535 & (i ^= i >>> 13)) + ((1540483477 * (i >>> 16) & 65535) << 16), (i ^= i >>> 15) >>> 0;\n };\n }),\n fa = ca,\n ya = ha;\n fa.murmur3 = ca, fa.murmur2 = ya;\n\n var da = function da() {\n this.ids = [], this.positions = [], this.indexed = !1;\n };\n\n da.prototype.add = function (t, e, r, n) {\n this.ids.push(va(t)), this.positions.push(e, r, n);\n }, da.prototype.getPositions = function (t) {\n for (var e = va(t), r = 0, n = this.ids.length - 1; r < n;) {\n var i = r + n >> 1;\n this.ids[i] >= e ? n = i : r = i + 1;\n }\n\n for (var a = []; this.ids[r] === e;) {\n a.push({\n index: this.positions[3 * r],\n start: this.positions[3 * r + 1],\n end: this.positions[3 * r + 2]\n }), r++;\n }\n\n return a;\n }, da.serialize = function (t, e) {\n var r = new Float64Array(t.ids),\n n = new Uint32Array(t.positions);\n return function t(e, r, n, i) {\n for (; n < i;) {\n for (var a = e[n + i >> 1], o = n - 1, s = i + 1;;) {\n do {\n o++;\n } while (e[o] < a);\n\n do {\n s--;\n } while (e[s] > a);\n\n if (o >= s) break;\n ga(e, o, s), ga(r, 3 * o, 3 * s), ga(r, 3 * o + 1, 3 * s + 1), ga(r, 3 * o + 2, 3 * s + 2);\n }\n\n s - n < i - s ? (t(e, r, n, s), n = s + 1) : (t(e, r, s + 1, i), i = s);\n }\n }(r, n, 0, r.length - 1), e && e.push(r.buffer, n.buffer), {\n ids: r,\n positions: n\n };\n }, da.deserialize = function (t) {\n var e = new da();\n return e.ids = t.ids, e.positions = t.positions, e.indexed = !0, e;\n };\n var ma = Math.pow(2, 53) - 1;\n\n function va(t) {\n var e = +t;\n return !isNaN(e) && e <= ma ? e : fa(String(t));\n }\n\n function ga(t, e, r) {\n var n = t[e];\n t[e] = t[r], t[r] = n;\n }\n\n On("FeaturePositionMap", da);\n\n var xa = function xa(t, e) {\n this.gl = t.gl, this.location = e;\n },\n ba = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n this.current !== t && (this.current = t, this.gl.uniform1i(this.location, t));\n }, e;\n }(xa),\n wa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n this.current !== t && (this.current = t, this.gl.uniform1f(this.location, t));\n }, e;\n }(xa),\n _a = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] || (this.current = t, this.gl.uniform2f(this.location, t[0], t[1]));\n }, e;\n }(xa),\n Aa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] && t[2] === this.current[2] || (this.current = t, this.gl.uniform3f(this.location, t[0], t[1], t[2]));\n }, e;\n }(xa),\n Sa = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = [0, 0, 0, 0];\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t[0] === this.current[0] && t[1] === this.current[1] && t[2] === this.current[2] && t[3] === this.current[3] || (this.current = t, this.gl.uniform4f(this.location, t[0], t[1], t[2], t[3]));\n }, e;\n }(xa),\n ka = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = ee.transparent;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n t.r === this.current.r && t.g === this.current.g && t.b === this.current.b && t.a === this.current.a || (this.current = t, this.gl.uniform4f(this.location, t.r, t.g, t.b, t.a));\n }, e;\n }(xa),\n Ia = new Float32Array(16),\n za = function (t) {\n function e(e, r) {\n t.call(this, e, r), this.current = Ia;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n if (t[12] !== this.current[12] || t[0] !== this.current[0]) return this.current = t, void this.gl.uniformMatrix4fv(this.location, !1, t);\n\n for (var e = 1; e < 16; e++) {\n if (t[e] !== this.current[e]) {\n this.current = t, this.gl.uniformMatrix4fv(this.location, !1, t);\n break;\n }\n }\n }, e;\n }(xa);\n\n function Ca(t) {\n return [la(255 * t.r, 255 * t.g), la(255 * t.b, 255 * t.a)];\n }\n\n var Ea = function Ea(t, e, r) {\n this.value = t, this.uniformNames = e.map(function (t) {\n return "u_" + t;\n }), this.type = r;\n };\n\n Ea.prototype.setUniform = function (t, e, r) {\n t.set(r.constantOr(this.value));\n }, Ea.prototype.getBinding = function (t, e, r) {\n return "color" === this.type ? new ka(t, e) : new wa(t, e);\n };\n\n var Pa = function Pa(t, e) {\n this.uniformNames = e.map(function (t) {\n return "u_" + t;\n }), this.patternFrom = null, this.patternTo = null, this.pixelRatioFrom = 1, this.pixelRatioTo = 1;\n };\n\n Pa.prototype.setConstantPatternPositions = function (t, e) {\n this.pixelRatioFrom = e.pixelRatio, this.pixelRatioTo = t.pixelRatio, this.patternFrom = e.tlbr, this.patternTo = t.tlbr;\n }, Pa.prototype.setUniform = function (t, e, r, n) {\n var i = "u_pattern_to" === n ? this.patternTo : "u_pattern_from" === n ? this.patternFrom : "u_pixel_ratio_to" === n ? this.pixelRatioTo : "u_pixel_ratio_from" === n ? this.pixelRatioFrom : null;\n i && t.set(i);\n }, Pa.prototype.getBinding = function (t, e, r) {\n return "u_pattern" === r.substr(0, 9) ? new Sa(t, e) : new wa(t, e);\n };\n\n var Ma = function Ma(t, e, r, n) {\n this.expression = t, this.type = r, this.maxValue = 0, this.paintVertexAttributes = e.map(function (t) {\n return {\n name: "a_" + t,\n type: "Float32",\n components: "color" === r ? 2 : 1,\n offset: 0\n };\n }), this.paintVertexArray = new n();\n };\n\n Ma.prototype.populatePaintArray = function (t, e, r, n, i) {\n var a = this.paintVertexArray.length,\n o = this.expression.evaluate(new ui(0), e, {}, n, [], i);\n this.paintVertexArray.resize(t), this._setPaintValue(a, t, o);\n }, Ma.prototype.updatePaintArray = function (t, e, r, n) {\n var i = this.expression.evaluate({\n zoom: 0\n }, r, n);\n\n this._setPaintValue(t, e, i);\n }, Ma.prototype._setPaintValue = function (t, e, r) {\n if ("color" === this.type) for (var n = Ca(r), i = t; i < e; i++) {\n this.paintVertexArray.emplace(i, n[0], n[1]);\n } else {\n for (var a = t; a < e; a++) {\n this.paintVertexArray.emplace(a, r);\n }\n\n this.maxValue = Math.max(this.maxValue, Math.abs(r));\n }\n }, Ma.prototype.upload = function (t) {\n this.paintVertexArray && this.paintVertexArray.arrayBuffer && (this.paintVertexBuffer && this.paintVertexBuffer.buffer ? this.paintVertexBuffer.updateData(this.paintVertexArray) : this.paintVertexBuffer = t.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent));\n }, Ma.prototype.destroy = function () {\n this.paintVertexBuffer && this.paintVertexBuffer.destroy();\n };\n\n var Ba = function Ba(t, e, r, n, i, a) {\n this.expression = t, this.uniformNames = e.map(function (t) {\n return "u_" + t + "_t";\n }), this.type = r, this.useIntegerZoom = n, this.zoom = i, this.maxValue = 0, this.paintVertexAttributes = e.map(function (t) {\n return {\n name: "a_" + t,\n type: "Float32",\n components: "color" === r ? 4 : 2,\n offset: 0\n };\n }), this.paintVertexArray = new a();\n };\n\n Ba.prototype.populatePaintArray = function (t, e, r, n, i) {\n var a = this.expression.evaluate(new ui(this.zoom), e, {}, n, [], i),\n o = this.expression.evaluate(new ui(this.zoom + 1), e, {}, n, [], i),\n s = this.paintVertexArray.length;\n this.paintVertexArray.resize(t), this._setPaintValue(s, t, a, o);\n }, Ba.prototype.updatePaintArray = function (t, e, r, n) {\n var i = this.expression.evaluate({\n zoom: this.zoom\n }, r, n),\n a = this.expression.evaluate({\n zoom: this.zoom + 1\n }, r, n);\n\n this._setPaintValue(t, e, i, a);\n }, Ba.prototype._setPaintValue = function (t, e, r, n) {\n if ("color" === this.type) for (var i = Ca(r), a = Ca(n), o = t; o < e; o++) {\n this.paintVertexArray.emplace(o, i[0], i[1], a[0], a[1]);\n } else {\n for (var s = t; s < e; s++) {\n this.paintVertexArray.emplace(s, r, n);\n }\n\n this.maxValue = Math.max(this.maxValue, Math.abs(r), Math.abs(n));\n }\n }, Ba.prototype.upload = function (t) {\n this.paintVertexArray && this.paintVertexArray.arrayBuffer && (this.paintVertexBuffer && this.paintVertexBuffer.buffer ? this.paintVertexBuffer.updateData(this.paintVertexArray) : this.paintVertexBuffer = t.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent));\n }, Ba.prototype.destroy = function () {\n this.paintVertexBuffer && this.paintVertexBuffer.destroy();\n }, Ba.prototype.setUniform = function (t, e) {\n var r = this.useIntegerZoom ? Math.floor(e.zoom) : e.zoom,\n n = p(this.expression.interpolationFactor(r, this.zoom, this.zoom + 1), 0, 1);\n t.set(n);\n }, Ba.prototype.getBinding = function (t, e, r) {\n return new wa(t, e);\n };\n\n var Ta = function Ta(t, e, r, n, i, a) {\n this.expression = t, this.type = e, this.useIntegerZoom = r, this.zoom = n, this.layerId = a, this.zoomInPaintVertexArray = new i(), this.zoomOutPaintVertexArray = new i();\n };\n\n Ta.prototype.populatePaintArray = function (t, e, r) {\n var n = this.zoomInPaintVertexArray.length;\n this.zoomInPaintVertexArray.resize(t), this.zoomOutPaintVertexArray.resize(t), this._setPaintValues(n, t, e.patterns && e.patterns[this.layerId], r);\n }, Ta.prototype.updatePaintArray = function (t, e, r, n, i) {\n this._setPaintValues(t, e, r.patterns && r.patterns[this.layerId], i);\n }, Ta.prototype._setPaintValues = function (t, e, r, n) {\n if (n && r) {\n var i = n[r.min],\n a = n[r.mid],\n o = n[r.max];\n if (i && a && o) for (var s = t; s < e; s++) {\n this.zoomInPaintVertexArray.emplace(s, a.tl[0], a.tl[1], a.br[0], a.br[1], i.tl[0], i.tl[1], i.br[0], i.br[1], a.pixelRatio, i.pixelRatio), this.zoomOutPaintVertexArray.emplace(s, a.tl[0], a.tl[1], a.br[0], a.br[1], o.tl[0], o.tl[1], o.br[0], o.br[1], a.pixelRatio, o.pixelRatio);\n }\n }\n }, Ta.prototype.upload = function (t) {\n this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer && (this.zoomInPaintVertexBuffer = t.createVertexBuffer(this.zoomInPaintVertexArray, pa.members, this.expression.isStateDependent), this.zoomOutPaintVertexBuffer = t.createVertexBuffer(this.zoomOutPaintVertexArray, pa.members, this.expression.isStateDependent));\n }, Ta.prototype.destroy = function () {\n this.zoomOutPaintVertexBuffer && this.zoomOutPaintVertexBuffer.destroy(), this.zoomInPaintVertexBuffer && this.zoomInPaintVertexBuffer.destroy();\n };\n\n var Va = function Va(t, e, r) {\n this.binders = {}, this._buffers = [];\n var n = [];\n\n for (var i in t.paint._values) {\n if (r(i)) {\n var a = t.paint.get(i);\n\n if (a instanceof di && Vr(a.property.specification)) {\n var o = Da(i, t.type),\n s = a.value,\n u = a.property.specification.type,\n l = a.property.useIntegerZoom,\n p = a.property.specification["property-type"],\n c = "cross-faded" === p || "cross-faded-data-driven" === p;\n if ("constant" === s.kind) this.binders[i] = c ? new Pa(s.value, o) : new Ea(s.value, o, u), n.push("/u_" + i);else if ("source" === s.kind || c) {\n var h = La(i, u, "source");\n this.binders[i] = c ? new Ta(s, u, l, e, h, t.id) : new Ma(s, o, u, h), n.push("/a_" + i);\n } else {\n var f = La(i, u, "composite");\n this.binders[i] = new Ba(s, o, u, l, e, f), n.push("/z_" + i);\n }\n }\n }\n }\n\n this.cacheKey = n.sort().join("");\n };\n\n Va.prototype.getMaxValue = function (t) {\n var e = this.binders[t];\n return e instanceof Ma || e instanceof Ba ? e.maxValue : 0;\n }, Va.prototype.populatePaintArrays = function (t, e, r, n, i) {\n for (var a in this.binders) {\n var o = this.binders[a];\n (o instanceof Ma || o instanceof Ba || o instanceof Ta) && o.populatePaintArray(t, e, r, n, i);\n }\n }, Va.prototype.setConstantPatternPositions = function (t, e) {\n for (var r in this.binders) {\n var n = this.binders[r];\n n instanceof Pa && n.setConstantPatternPositions(t, e);\n }\n }, Va.prototype.updatePaintArrays = function (t, e, r, n, i) {\n var a = !1;\n\n for (var o in t) {\n for (var s = 0, u = e.getPositions(o); s < u.length; s += 1) {\n var l = u[s],\n p = r.feature(l.index);\n\n for (var c in this.binders) {\n var h = this.binders[c];\n\n if ((h instanceof Ma || h instanceof Ba || h instanceof Ta) && !0 === h.expression.isStateDependent) {\n var f = n.paint.get(c);\n h.expression = f.value, h.updatePaintArray(l.start, l.end, p, t[o], i), a = !0;\n }\n }\n }\n }\n\n return a;\n }, Va.prototype.defines = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n (r instanceof Ea || r instanceof Pa) && t.push.apply(t, r.uniformNames.map(function (t) {\n return "#define HAS_UNIFORM_" + t;\n }));\n }\n\n return t;\n }, Va.prototype.getBinderAttributes = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n if (r instanceof Ma || r instanceof Ba) for (var n = 0; n < r.paintVertexAttributes.length; n++) {\n t.push(r.paintVertexAttributes[n].name);\n } else if (r instanceof Ta) for (var i = 0; i < pa.members.length; i++) {\n t.push(pa.members[i].name);\n }\n }\n\n return t;\n }, Va.prototype.getBinderUniforms = function () {\n var t = [];\n\n for (var e in this.binders) {\n var r = this.binders[e];\n if (r instanceof Ea || r instanceof Pa || r instanceof Ba) for (var n = 0, i = r.uniformNames; n < i.length; n += 1) {\n t.push(i[n]);\n }\n }\n\n return t;\n }, Va.prototype.getPaintVertexBuffers = function () {\n return this._buffers;\n }, Va.prototype.getUniforms = function (t, e) {\n var r = [];\n\n for (var n in this.binders) {\n var i = this.binders[n];\n if (i instanceof Ea || i instanceof Pa || i instanceof Ba) for (var a = 0, o = i.uniformNames; a < o.length; a += 1) {\n var s = o[a];\n\n if (e[s]) {\n var u = i.getBinding(t, e[s], s);\n r.push({\n name: s,\n property: n,\n binding: u\n });\n }\n }\n }\n\n return r;\n }, Va.prototype.setUniforms = function (t, e, r, n) {\n for (var i = 0, a = e; i < a.length; i += 1) {\n var o = a[i],\n s = o.name,\n u = o.property;\n this.binders[u].setUniform(o.binding, n, r.get(u), s);\n }\n }, Va.prototype.updatePaintBuffers = function (t) {\n for (var e in this._buffers = [], this.binders) {\n var r = this.binders[e];\n\n if (t && r instanceof Ta) {\n var n = 2 === t.fromScale ? r.zoomInPaintVertexBuffer : r.zoomOutPaintVertexBuffer;\n n && this._buffers.push(n);\n } else (r instanceof Ma || r instanceof Ba) && r.paintVertexBuffer && this._buffers.push(r.paintVertexBuffer);\n }\n }, Va.prototype.upload = function (t) {\n for (var e in this.binders) {\n var r = this.binders[e];\n (r instanceof Ma || r instanceof Ba || r instanceof Ta) && r.upload(t);\n }\n\n this.updatePaintBuffers();\n }, Va.prototype.destroy = function () {\n for (var t in this.binders) {\n var e = this.binders[t];\n (e instanceof Ma || e instanceof Ba || e instanceof Ta) && e.destroy();\n }\n };\n\n var Fa = function Fa(t, e, r) {\n void 0 === r && (r = function r() {\n return !0;\n }), this.programConfigurations = {};\n\n for (var n = 0, i = t; n < i.length; n += 1) {\n var a = i[n];\n this.programConfigurations[a.id] = new Va(a, e, r);\n }\n\n this.needsUpload = !1, this._featureMap = new da(), this._bufferOffset = 0;\n };\n\n function Da(t, e) {\n return {\n "text-opacity": ["opacity"],\n "icon-opacity": ["opacity"],\n "text-color": ["fill_color"],\n "icon-color": ["fill_color"],\n "text-halo-color": ["halo_color"],\n "icon-halo-color": ["halo_color"],\n "text-halo-blur": ["halo_blur"],\n "icon-halo-blur": ["halo_blur"],\n "text-halo-width": ["halo_width"],\n "icon-halo-width": ["halo_width"],\n "line-gap-width": ["gapwidth"],\n "line-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"],\n "fill-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"],\n "fill-extrusion-pattern": ["pattern_to", "pattern_from", "pixel_ratio_to", "pixel_ratio_from"]\n }[t] || [t.replace(e + "-", "").replace(/-/g, "_")];\n }\n\n function La(t, e, r) {\n var n = {\n color: {\n source: Ti,\n composite: Yi\n },\n number: {\n source: Gi,\n composite: Ti\n }\n },\n i = function (t) {\n return {\n "line-pattern": {\n source: Vi,\n composite: Vi\n },\n "fill-pattern": {\n source: Vi,\n composite: Vi\n },\n "fill-extrusion-pattern": {\n source: Vi,\n composite: Vi\n }\n }[t];\n }(t);\n\n return i && i[r] || n[e][r];\n }\n\n Fa.prototype.populatePaintArrays = function (t, e, r, n, i, a) {\n for (var o in this.programConfigurations) {\n this.programConfigurations[o].populatePaintArrays(t, e, n, i, a);\n }\n\n void 0 !== e.id && this._featureMap.add(e.id, r, this._bufferOffset, t), this._bufferOffset = t, this.needsUpload = !0;\n }, Fa.prototype.updatePaintArrays = function (t, e, r, n) {\n for (var i = 0, a = r; i < a.length; i += 1) {\n var o = a[i];\n this.needsUpload = this.programConfigurations[o.id].updatePaintArrays(t, this._featureMap, e, o, n) || this.needsUpload;\n }\n }, Fa.prototype.get = function (t) {\n return this.programConfigurations[t];\n }, Fa.prototype.upload = function (t) {\n if (this.needsUpload) {\n for (var e in this.programConfigurations) {\n this.programConfigurations[e].upload(t);\n }\n\n this.needsUpload = !1;\n }\n }, Fa.prototype.destroy = function () {\n for (var t in this.programConfigurations) {\n this.programConfigurations[t].destroy();\n }\n }, On("ConstantBinder", Ea), On("CrossFadedConstantBinder", Pa), On("SourceExpressionBinder", Ma), On("CrossFadedCompositeBinder", Ta), On("CompositeExpressionBinder", Ba), On("ProgramConfiguration", Va, {\n omit: ["_buffers"]\n }), On("ProgramConfigurationSet", Fa);\n var Ra = Math.pow(2, 14) - 1,\n Oa = -Ra - 1;\n\n function Ua(t) {\n for (var e = 8192 / t.extent, r = t.loadGeometry(), n = 0; n < r.length; n++) {\n for (var i = r[n], a = 0; a < i.length; a++) {\n var o = i[a],\n s = Math.round(o.x * e),\n u = Math.round(o.y * e);\n o.x = p(s, Oa, Ra), o.y = p(u, Oa, Ra), (s < o.x || s > o.x + 1 || u < o.y || u > o.y + 1) && A("Geometry exceeds allowed extent, reduce your vector tile buffer size");\n }\n }\n\n return r;\n }\n\n function ja(t, e) {\n return {\n type: t.type,\n id: t.id,\n properties: t.properties,\n geometry: e ? Ua(t) : []\n };\n }\n\n function qa(t, e, r, n, i) {\n t.emplaceBack(2 * e + (n + 1) / 2, 2 * r + (i + 1) / 2);\n }\n\n var Na = function Na(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.layoutVertexArray = new Ei(), this.indexArray = new qi(), this.segments = new ua(), this.programConfigurations = new Fa(t.layers, t.zoom), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n function Ka(t, e) {\n for (var r = 0; r < t.length; r++) {\n if (Qa(e, t[r])) return !0;\n }\n\n for (var n = 0; n < e.length; n++) {\n if (Qa(t, e[n])) return !0;\n }\n\n return !!Ja(t, e);\n }\n\n function Ga(t, e, r) {\n return !!Qa(t, e) || !!Ya(e, t, r);\n }\n\n function Za(t, e) {\n if (1 === t.length) return Wa(e, t[0]);\n\n for (var r = 0; r < e.length; r++) {\n for (var n = e[r], i = 0; i < n.length; i++) {\n if (Qa(t, n[i])) return !0;\n }\n }\n\n for (var a = 0; a < t.length; a++) {\n if (Wa(e, t[a])) return !0;\n }\n\n for (var o = 0; o < e.length; o++) {\n if (Ja(t, e[o])) return !0;\n }\n\n return !1;\n }\n\n function Xa(t, e, r) {\n if (t.length > 1) {\n if (Ja(t, e)) return !0;\n\n for (var n = 0; n < e.length; n++) {\n if (Ya(e[n], t, r)) return !0;\n }\n }\n\n for (var i = 0; i < t.length; i++) {\n if (Ya(t[i], e, r)) return !0;\n }\n\n return !1;\n }\n\n function Ja(t, e) {\n if (0 === t.length || 0 === e.length) return !1;\n\n for (var r = 0; r < t.length - 1; r++) {\n for (var n = t[r], i = t[r + 1], a = 0; a < e.length - 1; a++) {\n if (Ha(n, i, e[a], e[a + 1])) return !0;\n }\n }\n\n return !1;\n }\n\n function Ha(t, e, r, n) {\n return S(t, r, n) !== S(e, r, n) && S(t, e, r) !== S(t, e, n);\n }\n\n function Ya(t, e, r) {\n var n = r * r;\n if (1 === e.length) return t.distSqr(e[0]) < n;\n\n for (var i = 1; i < e.length; i++) {\n if ($a(t, e[i - 1], e[i]) < n) return !0;\n }\n\n return !1;\n }\n\n function $a(t, e, r) {\n var n = e.distSqr(r);\n if (0 === n) return t.distSqr(e);\n var i = ((t.x - e.x) * (r.x - e.x) + (t.y - e.y) * (r.y - e.y)) / n;\n return t.distSqr(i < 0 ? e : i > 1 ? r : r.sub(e)._mult(i)._add(e));\n }\n\n function Wa(t, e) {\n for (var r, n, i, a = !1, o = 0; o < t.length; o++) {\n for (var s = 0, u = (r = t[o]).length - 1; s < r.length; u = s++) {\n (n = r[s]).y > e.y != (i = r[u]).y > e.y && e.x < (i.x - n.x) * (e.y - n.y) / (i.y - n.y) + n.x && (a = !a);\n }\n }\n\n return a;\n }\n\n function Qa(t, e) {\n for (var r = !1, n = 0, i = t.length - 1; n < t.length; i = n++) {\n var a = t[n],\n o = t[i];\n a.y > e.y != o.y > e.y && e.x < (o.x - a.x) * (e.y - a.y) / (o.y - a.y) + a.x && (r = !r);\n }\n\n return r;\n }\n\n function to(t, e, r) {\n var n = r[0],\n i = r[2];\n if (t.x < n.x && e.x < n.x || t.x > i.x && e.x > i.x || t.y < n.y && e.y < n.y || t.y > i.y && e.y > i.y) return !1;\n var a = S(t, e, r[0]);\n return a !== S(t, e, r[1]) || a !== S(t, e, r[2]) || a !== S(t, e, r[3]);\n }\n\n function eo(t, e, r) {\n var n = e.paint.get(t).value;\n return "constant" === n.kind ? n.value : r.programConfigurations.get(e.id).getMaxValue(t);\n }\n\n function ro(t) {\n return Math.sqrt(t[0] * t[0] + t[1] * t[1]);\n }\n\n function no(t, e, r, n, a) {\n if (!e[0] && !e[1]) return t;\n\n var o = i.convert(e)._mult(a);\n\n "viewport" === r && o._rotate(-n);\n\n for (var s = [], u = 0; u < t.length; u++) {\n s.push(t[u].sub(o));\n }\n\n return s;\n }\n\n Na.prototype.populate = function (t, e, r) {\n var n = this.layers[0],\n i = [],\n a = null,\n o = !1;\n "circle" === n.type && (o = !(a = n.layout.get("circle-sort-key")).isConstant());\n\n for (var s = 0, u = t; s < u.length; s += 1) {\n var l = u[s],\n p = l.feature,\n c = l.id,\n h = l.index,\n f = l.sourceLayerIndex,\n y = this.layers[0]._featureFilter.needGeometry,\n d = ja(p, y);\n\n if (this.layers[0]._featureFilter.filter(new ui(this.zoom), d, r)) {\n var m = o ? a.evaluate(d, {}, r) : void 0,\n v = {\n id: c,\n properties: p.properties,\n type: p.type,\n sourceLayerIndex: f,\n index: h,\n geometry: y ? d.geometry : Ua(p),\n patterns: {},\n sortKey: m\n };\n i.push(v);\n }\n }\n\n o && i.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var g = 0, x = i; g < x.length; g += 1) {\n var b = x[g],\n w = b.geometry,\n _ = b.index,\n A = b.sourceLayerIndex,\n S = t[_].feature;\n this.addFeature(b, w, _, r), e.featureIndex.insert(S, w, _, A, this.index);\n }\n }, Na.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, Na.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, Na.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, Na.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, sa), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, Na.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, Na.prototype.addFeature = function (t, e, r, n) {\n for (var i = 0, a = e; i < a.length; i += 1) {\n for (var o = 0, s = a[i]; o < s.length; o += 1) {\n var u = s[o],\n l = u.x,\n p = u.y;\n\n if (!(l < 0 || l >= 8192 || p < 0 || p >= 8192)) {\n var c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, t.sortKey),\n h = c.vertexLength;\n qa(this.layoutVertexArray, l, p, -1, -1), qa(this.layoutVertexArray, l, p, 1, -1), qa(this.layoutVertexArray, l, p, 1, 1), qa(this.layoutVertexArray, l, p, -1, 1), this.indexArray.emplaceBack(h, h + 1, h + 2), this.indexArray.emplaceBack(h, h + 3, h + 2), c.vertexLength += 4, c.primitiveLength += 2;\n }\n }\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, {}, n);\n }, On("CircleBucket", Na, {\n omit: ["layers"]\n });\n var io = new _i({\n "circle-sort-key": new gi(Pt.layout_circle["circle-sort-key"])\n }),\n ao = {\n paint: new _i({\n "circle-radius": new gi(Pt.paint_circle["circle-radius"]),\n "circle-color": new gi(Pt.paint_circle["circle-color"]),\n "circle-blur": new gi(Pt.paint_circle["circle-blur"]),\n "circle-opacity": new gi(Pt.paint_circle["circle-opacity"]),\n "circle-translate": new vi(Pt.paint_circle["circle-translate"]),\n "circle-translate-anchor": new vi(Pt.paint_circle["circle-translate-anchor"]),\n "circle-pitch-scale": new vi(Pt.paint_circle["circle-pitch-scale"]),\n "circle-pitch-alignment": new vi(Pt.paint_circle["circle-pitch-alignment"]),\n "circle-stroke-width": new gi(Pt.paint_circle["circle-stroke-width"]),\n "circle-stroke-color": new gi(Pt.paint_circle["circle-stroke-color"]),\n "circle-stroke-opacity": new gi(Pt.paint_circle["circle-stroke-opacity"])\n }),\n layout: io\n },\n oo = "undefined" != typeof Float32Array ? Float32Array : Array;\n\n function so(t) {\n return t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = 1, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 1, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, t;\n }\n\n function uo(t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3],\n s = e[4],\n u = e[5],\n l = e[6],\n p = e[7],\n c = e[8],\n h = e[9],\n f = e[10],\n y = e[11],\n d = e[12],\n m = e[13],\n v = e[14],\n g = e[15],\n x = r[0],\n b = r[1],\n w = r[2],\n _ = r[3];\n return t[0] = x * n + b * s + w * c + _ * d, t[1] = x * i + b * u + w * h + _ * m, t[2] = x * a + b * l + w * f + _ * v, t[3] = x * o + b * p + w * y + _ * g, t[4] = (x = r[4]) * n + (b = r[5]) * s + (w = r[6]) * c + (_ = r[7]) * d, t[5] = x * i + b * u + w * h + _ * m, t[6] = x * a + b * l + w * f + _ * v, t[7] = x * o + b * p + w * y + _ * g, t[8] = (x = r[8]) * n + (b = r[9]) * s + (w = r[10]) * c + (_ = r[11]) * d, t[9] = x * i + b * u + w * h + _ * m, t[10] = x * a + b * l + w * f + _ * v, t[11] = x * o + b * p + w * y + _ * g, t[12] = (x = r[12]) * n + (b = r[13]) * s + (w = r[14]) * c + (_ = r[15]) * d, t[13] = x * i + b * u + w * h + _ * m, t[14] = x * a + b * l + w * f + _ * v, t[15] = x * o + b * p + w * y + _ * g, t;\n }\n\n Math.hypot || (Math.hypot = function () {\n for (var t = arguments, e = 0, r = arguments.length; r--;) {\n e += t[r] * t[r];\n }\n\n return Math.sqrt(e);\n });\n var lo,\n po = uo;\n\n function co(t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3];\n return t[0] = r[0] * n + r[4] * i + r[8] * a + r[12] * o, t[1] = r[1] * n + r[5] * i + r[9] * a + r[13] * o, t[2] = r[2] * n + r[6] * i + r[10] * a + r[14] * o, t[3] = r[3] * n + r[7] * i + r[11] * a + r[15] * o, t;\n }\n\n lo = new oo(3), oo != Float32Array && (lo[0] = 0, lo[1] = 0, lo[2] = 0), function () {\n var t = new oo(4);\n oo != Float32Array && (t[0] = 0, t[1] = 0, t[2] = 0, t[3] = 0);\n }();\n var ho = (function () {\n var t = new oo(2);\n oo != Float32Array && (t[0] = 0, t[1] = 0);\n }(), function (t) {\n function e(e) {\n t.call(this, e, ao);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new Na(t);\n }, e.prototype.queryRadius = function (t) {\n var e = t;\n return eo("circle-radius", this, e) + eo("circle-stroke-width", this, e) + ro(this.paint.get("circle-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, i, a, o, s) {\n for (var u = no(t, this.paint.get("circle-translate"), this.paint.get("circle-translate-anchor"), a.angle, o), l = this.paint.get("circle-radius").evaluate(e, r) + this.paint.get("circle-stroke-width").evaluate(e, r), p = "map" === this.paint.get("circle-pitch-alignment"), c = p ? u : function (t, e) {\n return t.map(function (t) {\n return fo(t, e);\n });\n }(u, s), h = p ? l * o : l, f = 0, y = n; f < y.length; f += 1) {\n for (var d = 0, m = y[f]; d < m.length; d += 1) {\n var v = m[d],\n g = p ? v : fo(v, s),\n x = h,\n b = co([], [v.x, v.y, 0, 1], s);\n if ("viewport" === this.paint.get("circle-pitch-scale") && "map" === this.paint.get("circle-pitch-alignment") ? x *= b[3] / a.cameraToCenterDistance : "map" === this.paint.get("circle-pitch-scale") && "viewport" === this.paint.get("circle-pitch-alignment") && (x *= a.cameraToCenterDistance / b[3]), Ga(c, g, x)) return !0;\n }\n }\n\n return !1;\n }, e;\n }(Ai));\n\n function fo(t, e) {\n var r = co([], [t.x, t.y, 0, 1], e);\n return new i(r[0] / r[3], r[1] / r[3]);\n }\n\n var yo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(Na);\n\n function mo(t, e, r, n) {\n var i = e.width,\n a = e.height;\n\n if (n) {\n if (n instanceof Uint8ClampedArray) n = new Uint8Array(n.buffer);else if (n.length !== i * a * r) throw new RangeError("mismatched image size");\n } else n = new Uint8Array(i * a * r);\n\n return t.width = i, t.height = a, t.data = n, t;\n }\n\n function vo(t, e, r) {\n var n = e.width,\n i = e.height;\n\n if (n !== t.width || i !== t.height) {\n var a = mo({}, {\n width: n,\n height: i\n }, r);\n go(t, a, {\n x: 0,\n y: 0\n }, {\n x: 0,\n y: 0\n }, {\n width: Math.min(t.width, n),\n height: Math.min(t.height, i)\n }, r), t.width = n, t.height = i, t.data = a.data;\n }\n }\n\n function go(t, e, r, n, i, a) {\n if (0 === i.width || 0 === i.height) return e;\n if (i.width > t.width || i.height > t.height || r.x > t.width - i.width || r.y > t.height - i.height) throw new RangeError("out of range source coordinates for image copy");\n if (i.width > e.width || i.height > e.height || n.x > e.width - i.width || n.y > e.height - i.height) throw new RangeError("out of range destination coordinates for image copy");\n\n for (var o = t.data, s = e.data, u = 0; u < i.height; u++) {\n for (var l = ((r.y + u) * t.width + r.x) * a, p = ((n.y + u) * e.width + n.x) * a, c = 0; c < i.width * a; c++) {\n s[p + c] = o[l + c];\n }\n }\n\n return e;\n }\n\n On("HeatmapBucket", yo, {\n omit: ["layers"]\n });\n\n var xo = function xo(t, e) {\n mo(this, t, 1, e);\n };\n\n xo.prototype.resize = function (t) {\n vo(this, t, 1);\n }, xo.prototype.clone = function () {\n return new xo({\n width: this.width,\n height: this.height\n }, new Uint8Array(this.data));\n }, xo.copy = function (t, e, r, n, i) {\n go(t, e, r, n, i, 1);\n };\n\n var bo = function bo(t, e) {\n mo(this, t, 4, e);\n };\n\n bo.prototype.resize = function (t) {\n vo(this, t, 4);\n }, bo.prototype.replace = function (t, e) {\n e ? this.data.set(t) : this.data = t instanceof Uint8ClampedArray ? new Uint8Array(t.buffer) : t;\n }, bo.prototype.clone = function () {\n return new bo({\n width: this.width,\n height: this.height\n }, new Uint8Array(this.data));\n }, bo.copy = function (t, e, r, n, i) {\n go(t, e, r, n, i, 4);\n }, On("AlphaImage", xo), On("RGBAImage", bo);\n var wo = {\n paint: new _i({\n "heatmap-radius": new gi(Pt.paint_heatmap["heatmap-radius"]),\n "heatmap-weight": new gi(Pt.paint_heatmap["heatmap-weight"]),\n "heatmap-intensity": new vi(Pt.paint_heatmap["heatmap-intensity"]),\n "heatmap-color": new wi(Pt.paint_heatmap["heatmap-color"]),\n "heatmap-opacity": new vi(Pt.paint_heatmap["heatmap-opacity"])\n })\n };\n\n function _o(t) {\n var e = {},\n r = t.resolution || 256,\n n = t.clips ? t.clips.length : 1,\n i = t.image || new bo({\n width: r,\n height: n\n }),\n a = function a(r, n, _a2) {\n e[t.evaluationKey] = _a2;\n var o = t.expression.evaluate(e);\n i.data[r + n + 0] = Math.floor(255 * o.r / o.a), i.data[r + n + 1] = Math.floor(255 * o.g / o.a), i.data[r + n + 2] = Math.floor(255 * o.b / o.a), i.data[r + n + 3] = Math.floor(255 * o.a);\n };\n\n if (t.clips) for (var o = 0, s = 0; o < n; ++o, s += 4 * r) {\n for (var u = 0, l = 0; u < r; u++, l += 4) {\n var p = u / (r - 1),\n c = t.clips[o];\n a(s, l, c.start * (1 - p) + c.end * p);\n }\n } else for (var h = 0, f = 0; h < r; h++, f += 4) {\n a(0, f, h / (r - 1));\n }\n return i;\n }\n\n var Ao = function (t) {\n function e(e) {\n t.call(this, e, wo), this._updateColorRamp();\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new yo(t);\n }, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {\n "heatmap-color" === t && this._updateColorRamp();\n }, e.prototype._updateColorRamp = function () {\n this.colorRamp = _o({\n expression: this._transitionablePaint._values["heatmap-color"].value.expression,\n evaluationKey: "heatmapDensity",\n image: this.colorRamp\n }), this.colorRampTexture = null;\n }, e.prototype.resize = function () {\n this.heatmapFbo && (this.heatmapFbo.destroy(), this.heatmapFbo = null);\n }, e.prototype.queryRadius = function () {\n return 0;\n }, e.prototype.queryIntersectsFeature = function () {\n return !1;\n }, e.prototype.hasOffscreenPass = function () {\n return 0 !== this.paint.get("heatmap-opacity") && "none" !== this.visibility;\n }, e;\n }(Ai),\n So = {\n paint: new _i({\n "hillshade-illumination-direction": new vi(Pt.paint_hillshade["hillshade-illumination-direction"]),\n "hillshade-illumination-anchor": new vi(Pt.paint_hillshade["hillshade-illumination-anchor"]),\n "hillshade-exaggeration": new vi(Pt.paint_hillshade["hillshade-exaggeration"]),\n "hillshade-shadow-color": new vi(Pt.paint_hillshade["hillshade-shadow-color"]),\n "hillshade-highlight-color": new vi(Pt.paint_hillshade["hillshade-highlight-color"]),\n "hillshade-accent-color": new vi(Pt.paint_hillshade["hillshade-accent-color"])\n })\n },\n ko = function (t) {\n function e(e) {\n t.call(this, e, So);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.hasOffscreenPass = function () {\n return 0 !== this.paint.get("hillshade-exaggeration") && "none" !== this.visibility;\n }, e;\n }(Ai),\n Io = zi([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }], 4).members,\n zo = Eo,\n Co = Eo;\n\n function Eo(t, e, r) {\n r = r || 2;\n var n,\n i,\n a,\n o,\n s,\n u,\n l,\n p = e && e.length,\n c = p ? e[0] * r : t.length,\n h = Po(t, 0, c, r, !0),\n f = [];\n if (!h || h.next === h.prev) return f;\n\n if (p && (h = function (t, e, r, n) {\n var i,\n a,\n o,\n s = [];\n\n for (i = 0, a = e.length; i < a; i++) {\n (o = Po(t, e[i] * n, i < a - 1 ? e[i + 1] * n : t.length, n, !1)) === o.next && (o.steiner = !0), s.push(jo(o));\n }\n\n for (s.sort(Lo), i = 0; i < s.length; i++) {\n Ro(s[i], r), r = Mo(r, r.next);\n }\n\n return r;\n }(t, e, h, r)), t.length > 80 * r) {\n n = a = t[0], i = o = t[1];\n\n for (var y = r; y < c; y += r) {\n (s = t[y]) < n && (n = s), (u = t[y + 1]) < i && (i = u), s > a && (a = s), u > o && (o = u);\n }\n\n l = 0 !== (l = Math.max(a - n, o - i)) ? 1 / l : 0;\n }\n\n return Bo(h, f, r, n, i, l), f;\n }\n\n function Po(t, e, r, n, i) {\n var a, o;\n if (i === ts(t, e, r, n) > 0) for (a = e; a < r; a += n) {\n o = $o(a, t[a], t[a + 1], o);\n } else for (a = r - n; a >= e; a -= n) {\n o = $o(a, t[a], t[a + 1], o);\n }\n return o && Go(o, o.next) && (Wo(o), o = o.next), o;\n }\n\n function Mo(t, e) {\n if (!t) return t;\n e || (e = t);\n var r,\n n = t;\n\n do {\n if (r = !1, n.steiner || !Go(n, n.next) && 0 !== Ko(n.prev, n, n.next)) n = n.next;else {\n if (Wo(n), (n = e = n.prev) === n.next) break;\n r = !0;\n }\n } while (r || n !== e);\n\n return e;\n }\n\n function Bo(t, e, r, n, i, a, o) {\n if (t) {\n !o && a && function (t, e, r, n) {\n var i = t;\n\n do {\n null === i.z && (i.z = Uo(i.x, i.y, e, r, n)), i.prevZ = i.prev, i.nextZ = i.next, i = i.next;\n } while (i !== t);\n\n i.prevZ.nextZ = null, i.prevZ = null, function (t) {\n var e,\n r,\n n,\n i,\n a,\n o,\n s,\n u,\n l = 1;\n\n do {\n for (r = t, t = null, a = null, o = 0; r;) {\n for (o++, n = r, s = 0, e = 0; e < l && (s++, n = n.nextZ); e++) {\n ;\n }\n\n for (u = l; s > 0 || u > 0 && n;) {\n 0 !== s && (0 === u || !n || r.z <= n.z) ? (i = r, r = r.nextZ, s--) : (i = n, n = n.nextZ, u--), a ? a.nextZ = i : t = i, i.prevZ = a, a = i;\n }\n\n r = n;\n }\n\n a.nextZ = null, l *= 2;\n } while (o > 1);\n }(i);\n }(t, n, i, a);\n\n for (var s, u, l = t; t.prev !== t.next;) {\n if (s = t.prev, u = t.next, a ? Vo(t, n, i, a) : To(t)) e.push(s.i / r), e.push(t.i / r), e.push(u.i / r), Wo(t), t = u.next, l = u.next;else if ((t = u) === l) {\n o ? 1 === o ? Bo(t = Fo(Mo(t), e, r), e, r, n, i, a, 2) : 2 === o && Do(t, e, r, n, i, a) : Bo(Mo(t), e, r, n, i, a, 1);\n break;\n }\n }\n }\n }\n\n function To(t) {\n var e = t.prev,\n r = t,\n n = t.next;\n if (Ko(e, r, n) >= 0) return !1;\n\n for (var i = t.next.next; i !== t.prev;) {\n if (qo(e.x, e.y, r.x, r.y, n.x, n.y, i.x, i.y) && Ko(i.prev, i, i.next) >= 0) return !1;\n i = i.next;\n }\n\n return !0;\n }\n\n function Vo(t, e, r, n) {\n var i = t.prev,\n a = t,\n o = t.next;\n if (Ko(i, a, o) >= 0) return !1;\n\n for (var s = i.x > a.x ? i.x > o.x ? i.x : o.x : a.x > o.x ? a.x : o.x, u = i.y > a.y ? i.y > o.y ? i.y : o.y : a.y > o.y ? a.y : o.y, l = Uo(i.x < a.x ? i.x < o.x ? i.x : o.x : a.x < o.x ? a.x : o.x, i.y < a.y ? i.y < o.y ? i.y : o.y : a.y < o.y ? a.y : o.y, e, r, n), p = Uo(s, u, e, r, n), c = t.prevZ, h = t.nextZ; c && c.z >= l && h && h.z <= p;) {\n if (c !== t.prev && c !== t.next && qo(i.x, i.y, a.x, a.y, o.x, o.y, c.x, c.y) && Ko(c.prev, c, c.next) >= 0) return !1;\n if (c = c.prevZ, h !== t.prev && h !== t.next && qo(i.x, i.y, a.x, a.y, o.x, o.y, h.x, h.y) && Ko(h.prev, h, h.next) >= 0) return !1;\n h = h.nextZ;\n }\n\n for (; c && c.z >= l;) {\n if (c !== t.prev && c !== t.next && qo(i.x, i.y, a.x, a.y, o.x, o.y, c.x, c.y) && Ko(c.prev, c, c.next) >= 0) return !1;\n c = c.prevZ;\n }\n\n for (; h && h.z <= p;) {\n if (h !== t.prev && h !== t.next && qo(i.x, i.y, a.x, a.y, o.x, o.y, h.x, h.y) && Ko(h.prev, h, h.next) >= 0) return !1;\n h = h.nextZ;\n }\n\n return !0;\n }\n\n function Fo(t, e, r) {\n var n = t;\n\n do {\n var i = n.prev,\n a = n.next.next;\n !Go(i, a) && Zo(i, n, n.next, a) && Ho(i, a) && Ho(a, i) && (e.push(i.i / r), e.push(n.i / r), e.push(a.i / r), Wo(n), Wo(n.next), n = t = a), n = n.next;\n } while (n !== t);\n\n return Mo(n);\n }\n\n function Do(t, e, r, n, i, a) {\n var o = t;\n\n do {\n for (var s = o.next.next; s !== o.prev;) {\n if (o.i !== s.i && No(o, s)) {\n var u = Yo(o, s);\n return o = Mo(o, o.next), u = Mo(u, u.next), Bo(o, e, r, n, i, a), void Bo(u, e, r, n, i, a);\n }\n\n s = s.next;\n }\n\n o = o.next;\n } while (o !== t);\n }\n\n function Lo(t, e) {\n return t.x - e.x;\n }\n\n function Ro(t, e) {\n if (e = function (t, e) {\n var r,\n n = e,\n i = t.x,\n a = t.y,\n o = -1 / 0;\n\n do {\n if (a <= n.y && a >= n.next.y && n.next.y !== n.y) {\n var s = n.x + (a - n.y) * (n.next.x - n.x) / (n.next.y - n.y);\n\n if (s <= i && s > o) {\n if (o = s, s === i) {\n if (a === n.y) return n;\n if (a === n.next.y) return n.next;\n }\n\n r = n.x < n.next.x ? n : n.next;\n }\n }\n\n n = n.next;\n } while (n !== e);\n\n if (!r) return null;\n if (i === o) return r;\n var u,\n l = r,\n p = r.x,\n c = r.y,\n h = 1 / 0;\n n = r;\n\n do {\n i >= n.x && n.x >= p && i !== n.x && qo(a < c ? i : o, a, p, c, a < c ? o : i, a, n.x, n.y) && (u = Math.abs(a - n.y) / (i - n.x), Ho(n, t) && (u < h || u === h && (n.x > r.x || n.x === r.x && Oo(r, n))) && (r = n, h = u)), n = n.next;\n } while (n !== l);\n\n return r;\n }(t, e)) {\n var r = Yo(e, t);\n Mo(e, e.next), Mo(r, r.next);\n }\n }\n\n function Oo(t, e) {\n return Ko(t.prev, t, e.prev) < 0 && Ko(e.next, t, t.next) < 0;\n }\n\n function Uo(t, e, r, n, i) {\n return (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - r) * i) | t << 8)) | t << 4)) | t << 2)) | t << 1)) | (e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - n) * i) | e << 8)) | e << 4)) | e << 2)) | e << 1)) << 1;\n }\n\n function jo(t) {\n var e = t,\n r = t;\n\n do {\n (e.x < r.x || e.x === r.x && e.y < r.y) && (r = e), e = e.next;\n } while (e !== t);\n\n return r;\n }\n\n function qo(t, e, r, n, i, a, o, s) {\n return (i - o) * (e - s) - (t - o) * (a - s) >= 0 && (t - o) * (n - s) - (r - o) * (e - s) >= 0 && (r - o) * (a - s) - (i - o) * (n - s) >= 0;\n }\n\n function No(t, e) {\n return t.next.i !== e.i && t.prev.i !== e.i && !function (t, e) {\n var r = t;\n\n do {\n if (r.i !== t.i && r.next.i !== t.i && r.i !== e.i && r.next.i !== e.i && Zo(r, r.next, t, e)) return !0;\n r = r.next;\n } while (r !== t);\n\n return !1;\n }(t, e) && (Ho(t, e) && Ho(e, t) && function (t, e) {\n var r = t,\n n = !1,\n i = (t.x + e.x) / 2,\n a = (t.y + e.y) / 2;\n\n do {\n r.y > a != r.next.y > a && r.next.y !== r.y && i < (r.next.x - r.x) * (a - r.y) / (r.next.y - r.y) + r.x && (n = !n), r = r.next;\n } while (r !== t);\n\n return n;\n }(t, e) && (Ko(t.prev, t, e.prev) || Ko(t, e.prev, e)) || Go(t, e) && Ko(t.prev, t, t.next) > 0 && Ko(e.prev, e, e.next) > 0);\n }\n\n function Ko(t, e, r) {\n return (e.y - t.y) * (r.x - e.x) - (e.x - t.x) * (r.y - e.y);\n }\n\n function Go(t, e) {\n return t.x === e.x && t.y === e.y;\n }\n\n function Zo(t, e, r, n) {\n var i = Jo(Ko(t, e, r)),\n a = Jo(Ko(t, e, n)),\n o = Jo(Ko(r, n, t)),\n s = Jo(Ko(r, n, e));\n return i !== a && o !== s || !(0 !== i || !Xo(t, r, e)) || !(0 !== a || !Xo(t, n, e)) || !(0 !== o || !Xo(r, t, n)) || !(0 !== s || !Xo(r, e, n));\n }\n\n function Xo(t, e, r) {\n return e.x <= Math.max(t.x, r.x) && e.x >= Math.min(t.x, r.x) && e.y <= Math.max(t.y, r.y) && e.y >= Math.min(t.y, r.y);\n }\n\n function Jo(t) {\n return t > 0 ? 1 : t < 0 ? -1 : 0;\n }\n\n function Ho(t, e) {\n return Ko(t.prev, t, t.next) < 0 ? Ko(t, e, t.next) >= 0 && Ko(t, t.prev, e) >= 0 : Ko(t, e, t.prev) < 0 || Ko(t, t.next, e) < 0;\n }\n\n function Yo(t, e) {\n var r = new Qo(t.i, t.x, t.y),\n n = new Qo(e.i, e.x, e.y),\n i = t.next,\n a = e.prev;\n return t.next = e, e.prev = t, r.next = i, i.prev = r, n.next = r, r.prev = n, a.next = n, n.prev = a, n;\n }\n\n function $o(t, e, r, n) {\n var i = new Qo(t, e, r);\n return n ? (i.next = n.next, i.prev = n, n.next.prev = i, n.next = i) : (i.prev = i, i.next = i), i;\n }\n\n function Wo(t) {\n t.next.prev = t.prev, t.prev.next = t.next, t.prevZ && (t.prevZ.nextZ = t.nextZ), t.nextZ && (t.nextZ.prevZ = t.prevZ);\n }\n\n function Qo(t, e, r) {\n this.i = t, this.x = e, this.y = r, this.prev = null, this.next = null, this.z = null, this.prevZ = null, this.nextZ = null, this.steiner = !1;\n }\n\n function ts(t, e, r, n) {\n for (var i = 0, a = e, o = r - n; a < r; a += n) {\n i += (t[o] - t[a]) * (t[a + 1] + t[o + 1]), o = a;\n }\n\n return i;\n }\n\n function es(t, e, r, n, i) {\n !function t(e, r, n, i, a) {\n for (; i > n;) {\n if (i - n > 600) {\n var o = i - n + 1,\n s = r - n + 1,\n u = Math.log(o),\n l = .5 * Math.exp(2 * u / 3),\n p = .5 * Math.sqrt(u * l * (o - l) / o) * (s - o / 2 < 0 ? -1 : 1);\n t(e, r, Math.max(n, Math.floor(r - s * l / o + p)), Math.min(i, Math.floor(r + (o - s) * l / o + p)), a);\n }\n\n var c = e[r],\n h = n,\n f = i;\n\n for (rs(e, n, r), a(e[i], c) > 0 && rs(e, n, i); h < f;) {\n for (rs(e, h, f), h++, f--; a(e[h], c) < 0;) {\n h++;\n }\n\n for (; a(e[f], c) > 0;) {\n f--;\n }\n }\n\n 0 === a(e[n], c) ? rs(e, n, f) : rs(e, ++f, i), f <= r && (n = f + 1), r <= f && (i = f - 1);\n }\n }(t, e, r || 0, n || t.length - 1, i || ns);\n }\n\n function rs(t, e, r) {\n var n = t[e];\n t[e] = t[r], t[r] = n;\n }\n\n function ns(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function is(t, e) {\n var r = t.length;\n if (r <= 1) return [t];\n\n for (var n, i, a = [], o = 0; o < r; o++) {\n var s = k(t[o]);\n 0 !== s && (t[o].area = Math.abs(s), void 0 === i && (i = s < 0), i === s < 0 ? (n && a.push(n), n = [t[o]]) : n.push(t[o]));\n }\n\n if (n && a.push(n), e > 1) for (var u = 0; u < a.length; u++) {\n a[u].length <= e || (es(a[u], e, 1, a[u].length - 1, as), a[u] = a[u].slice(0, e));\n }\n return a;\n }\n\n function as(t, e) {\n return e.area - t.area;\n }\n\n function os(t, e, r) {\n for (var n = r.patternDependencies, i = !1, a = 0, o = e; a < o.length; a += 1) {\n var s = o[a].paint.get(t + "-pattern");\n s.isConstant() || (i = !0);\n var u = s.constantOr(null);\n u && (i = !0, n[u.to] = !0, n[u.from] = !0);\n }\n\n return i;\n }\n\n function ss(t, e, r, n, i) {\n for (var a = i.patternDependencies, o = 0, s = e; o < s.length; o += 1) {\n var u = s[o],\n l = u.paint.get(t + "-pattern").value;\n\n if ("constant" !== l.kind) {\n var p = l.evaluate({\n zoom: n - 1\n }, r, {}, i.availableImages),\n c = l.evaluate({\n zoom: n\n }, r, {}, i.availableImages),\n h = l.evaluate({\n zoom: n + 1\n }, r, {}, i.availableImages);\n c = c && c.name ? c.name : c, h = h && h.name ? h.name : h, a[p = p && p.name ? p.name : p] = !0, a[c] = !0, a[h] = !0, r.patterns[u.id] = {\n min: p,\n mid: c,\n max: h\n };\n }\n }\n\n return r;\n }\n\n Eo.deviation = function (t, e, r, n) {\n var i = e && e.length,\n a = Math.abs(ts(t, 0, i ? e[0] * r : t.length, r));\n if (i) for (var o = 0, s = e.length; o < s; o++) {\n a -= Math.abs(ts(t, e[o] * r, o < s - 1 ? e[o + 1] * r : t.length, r));\n }\n var u = 0;\n\n for (o = 0; o < n.length; o += 3) {\n var l = n[o] * r,\n p = n[o + 1] * r,\n c = n[o + 2] * r;\n u += Math.abs((t[l] - t[c]) * (t[p + 1] - t[l + 1]) - (t[l] - t[p]) * (t[c + 1] - t[l + 1]));\n }\n\n return 0 === a && 0 === u ? 0 : Math.abs((u - a) / a);\n }, Eo.flatten = function (t) {\n for (var e = t[0][0].length, r = {\n vertices: [],\n holes: [],\n dimensions: e\n }, n = 0, i = 0; i < t.length; i++) {\n for (var a = 0; a < t[i].length; a++) {\n for (var o = 0; o < e; o++) {\n r.vertices.push(t[i][a][o]);\n }\n }\n\n i > 0 && r.holes.push(n += t[i - 1].length);\n }\n\n return r;\n }, zo.default = Co;\n\n var us = function us(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.patternFeatures = [], this.layoutVertexArray = new Ei(), this.indexArray = new qi(), this.indexArray2 = new Ji(), this.programConfigurations = new Fa(t.layers, t.zoom), this.segments = new ua(), this.segments2 = new ua(), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n us.prototype.populate = function (t, e, r) {\n this.hasPattern = os("fill", this.layers, e);\n\n for (var n = this.layers[0].layout.get("fill-sort-key"), i = !n.isConstant(), a = [], o = 0, s = t; o < s.length; o += 1) {\n var u = s[o],\n l = u.feature,\n p = u.id,\n c = u.index,\n h = u.sourceLayerIndex,\n f = this.layers[0]._featureFilter.needGeometry,\n y = ja(l, f);\n\n if (this.layers[0]._featureFilter.filter(new ui(this.zoom), y, r)) {\n var d = i ? n.evaluate(y, {}, r, e.availableImages) : void 0,\n m = {\n id: p,\n properties: l.properties,\n type: l.type,\n sourceLayerIndex: h,\n index: c,\n geometry: f ? y.geometry : Ua(l),\n patterns: {},\n sortKey: d\n };\n a.push(m);\n }\n }\n\n i && a.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var v = 0, g = a; v < g.length; v += 1) {\n var x = g[v],\n b = x.geometry,\n w = x.index,\n _ = x.sourceLayerIndex;\n\n if (this.hasPattern) {\n var A = ss("fill", this.layers, x, this.zoom, e);\n this.patternFeatures.push(A);\n } else this.addFeature(x, b, w, r, {});\n\n e.featureIndex.insert(t[w].feature, b, w, _, this.index);\n }\n }, us.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, us.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.patternFeatures; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, us.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, us.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, us.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, Io), this.indexBuffer = t.createIndexBuffer(this.indexArray), this.indexBuffer2 = t.createIndexBuffer(this.indexArray2)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, us.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.indexBuffer2.destroy(), this.programConfigurations.destroy(), this.segments.destroy(), this.segments2.destroy());\n }, us.prototype.addFeature = function (t, e, r, n, i) {\n for (var a = 0, o = is(e, 500); a < o.length; a += 1) {\n for (var s = o[a], u = 0, l = 0, p = s; l < p.length; l += 1) {\n u += p[l].length;\n }\n\n for (var c = this.segments.prepareSegment(u, this.layoutVertexArray, this.indexArray), h = c.vertexLength, f = [], y = [], d = 0, m = s; d < m.length; d += 1) {\n var v = m[d];\n\n if (0 !== v.length) {\n v !== s[0] && y.push(f.length / 2);\n var g = this.segments2.prepareSegment(v.length, this.layoutVertexArray, this.indexArray2),\n x = g.vertexLength;\n this.layoutVertexArray.emplaceBack(v[0].x, v[0].y), this.indexArray2.emplaceBack(x + v.length - 1, x), f.push(v[0].x), f.push(v[0].y);\n\n for (var b = 1; b < v.length; b++) {\n this.layoutVertexArray.emplaceBack(v[b].x, v[b].y), this.indexArray2.emplaceBack(x + b - 1, x + b), f.push(v[b].x), f.push(v[b].y);\n }\n\n g.vertexLength += v.length, g.primitiveLength += v.length;\n }\n }\n\n for (var w = zo(f, y), _ = 0; _ < w.length; _ += 3) {\n this.indexArray.emplaceBack(h + w[_], h + w[_ + 1], h + w[_ + 2]);\n }\n\n c.vertexLength += u, c.primitiveLength += w.length / 3;\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, On("FillBucket", us, {\n omit: ["layers", "patternFeatures"]\n });\n\n var ls = new _i({\n "fill-sort-key": new gi(Pt.layout_fill["fill-sort-key"])\n }),\n ps = {\n paint: new _i({\n "fill-antialias": new vi(Pt.paint_fill["fill-antialias"]),\n "fill-opacity": new gi(Pt.paint_fill["fill-opacity"]),\n "fill-color": new gi(Pt.paint_fill["fill-color"]),\n "fill-outline-color": new gi(Pt.paint_fill["fill-outline-color"]),\n "fill-translate": new vi(Pt.paint_fill["fill-translate"]),\n "fill-translate-anchor": new vi(Pt.paint_fill["fill-translate-anchor"]),\n "fill-pattern": new xi(Pt.paint_fill["fill-pattern"])\n }),\n layout: ls\n },\n cs = function (t) {\n function e(e) {\n t.call(this, e, ps);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.recalculate = function (e, r) {\n t.prototype.recalculate.call(this, e, r);\n var n = this.paint._values["fill-outline-color"];\n "constant" === n.value.kind && void 0 === n.value.value && (this.paint._values["fill-outline-color"] = this.paint._values["fill-color"]);\n }, e.prototype.createBucket = function (t) {\n return new us(t);\n }, e.prototype.queryRadius = function () {\n return ro(this.paint.get("fill-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, i, a, o) {\n return Za(no(t, this.paint.get("fill-translate"), this.paint.get("fill-translate-anchor"), a.angle, o), n);\n }, e.prototype.isTileClipped = function () {\n return !0;\n }, e;\n }(Ai),\n hs = zi([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_normal_ed",\n components: 4,\n type: "Int16"\n }], 4).members,\n fs = ys;\n\n function ys(t, e, r, n, i) {\n this.properties = {}, this.extent = r, this.type = 0, this._pbf = t, this._geometry = -1, this._keys = n, this._values = i, t.readFields(ds, this, e);\n }\n\n function ds(t, e, r) {\n 1 == t ? e.id = r.readVarint() : 2 == t ? function (t, e) {\n for (var r = t.readVarint() + t.pos; t.pos < r;) {\n var n = e._keys[t.readVarint()],\n i = e._values[t.readVarint()];\n\n e.properties[n] = i;\n }\n }(r, e) : 3 == t ? e.type = r.readVarint() : 4 == t && (e._geometry = r.pos);\n }\n\n function ms(t) {\n for (var e, r, n = 0, i = 0, a = t.length, o = a - 1; i < a; o = i++) {\n n += ((r = t[o]).x - (e = t[i]).x) * (e.y + r.y);\n }\n\n return n;\n }\n\n ys.types = ["Unknown", "Point", "LineString", "Polygon"], ys.prototype.loadGeometry = function () {\n var t = this._pbf;\n t.pos = this._geometry;\n\n for (var e, r = t.readVarint() + t.pos, n = 1, a = 0, o = 0, s = 0, u = []; t.pos < r;) {\n if (a <= 0) {\n var l = t.readVarint();\n n = 7 & l, a = l >> 3;\n }\n\n if (a--, 1 === n || 2 === n) o += t.readSVarint(), s += t.readSVarint(), 1 === n && (e && u.push(e), e = []), e.push(new i(o, s));else {\n if (7 !== n) throw new Error("unknown command " + n);\n e && e.push(e[0].clone());\n }\n }\n\n return e && u.push(e), u;\n }, ys.prototype.bbox = function () {\n var t = this._pbf;\n t.pos = this._geometry;\n\n for (var e = t.readVarint() + t.pos, r = 1, n = 0, i = 0, a = 0, o = 1 / 0, s = -1 / 0, u = 1 / 0, l = -1 / 0; t.pos < e;) {\n if (n <= 0) {\n var p = t.readVarint();\n r = 7 & p, n = p >> 3;\n }\n\n if (n--, 1 === r || 2 === r) (i += t.readSVarint()) < o && (o = i), i > s && (s = i), (a += t.readSVarint()) < u && (u = a), a > l && (l = a);else if (7 !== r) throw new Error("unknown command " + r);\n }\n\n return [o, u, s, l];\n }, ys.prototype.toGeoJSON = function (t, e, r) {\n var n,\n i,\n a = this.extent * Math.pow(2, r),\n o = this.extent * t,\n s = this.extent * e,\n u = this.loadGeometry(),\n l = ys.types[this.type];\n\n function p(t) {\n for (var e = 0; e < t.length; e++) {\n var r = t[e];\n t[e] = [360 * (r.x + o) / a - 180, 360 / Math.PI * Math.atan(Math.exp((180 - 360 * (r.y + s) / a) * Math.PI / 180)) - 90];\n }\n }\n\n switch (this.type) {\n case 1:\n var c = [];\n\n for (n = 0; n < u.length; n++) {\n c[n] = u[n][0];\n }\n\n p(u = c);\n break;\n\n case 2:\n for (n = 0; n < u.length; n++) {\n p(u[n]);\n }\n\n break;\n\n case 3:\n for (u = function (t) {\n var e = t.length;\n if (e <= 1) return [t];\n\n for (var r, n, i = [], a = 0; a < e; a++) {\n var o = ms(t[a]);\n 0 !== o && (void 0 === n && (n = o < 0), n === o < 0 ? (r && i.push(r), r = [t[a]]) : r.push(t[a]));\n }\n\n return r && i.push(r), i;\n }(u), n = 0; n < u.length; n++) {\n for (i = 0; i < u[n].length; i++) {\n p(u[n][i]);\n }\n }\n\n }\n\n 1 === u.length ? u = u[0] : l = "Multi" + l;\n var h = {\n type: "Feature",\n geometry: {\n type: l,\n coordinates: u\n },\n properties: this.properties\n };\n return "id" in this && (h.id = this.id), h;\n };\n var vs = gs;\n\n function gs(t, e) {\n this.version = 1, this.name = null, this.extent = 4096, this.length = 0, this._pbf = t, this._keys = [], this._values = [], this._features = [], t.readFields(xs, this, e), this.length = this._features.length;\n }\n\n function xs(t, e, r) {\n 15 === t ? e.version = r.readVarint() : 1 === t ? e.name = r.readString() : 5 === t ? e.extent = r.readVarint() : 2 === t ? e._features.push(r.pos) : 3 === t ? e._keys.push(r.readString()) : 4 === t && e._values.push(function (t) {\n for (var e = null, r = t.readVarint() + t.pos; t.pos < r;) {\n var n = t.readVarint() >> 3;\n e = 1 === n ? t.readString() : 2 === n ? t.readFloat() : 3 === n ? t.readDouble() : 4 === n ? t.readVarint64() : 5 === n ? t.readVarint() : 6 === n ? t.readSVarint() : 7 === n ? t.readBoolean() : null;\n }\n\n return e;\n }(r));\n }\n\n function bs(t, e, r) {\n if (3 === t) {\n var n = new vs(r, r.readVarint() + r.pos);\n n.length && (e[n.name] = n);\n }\n }\n\n gs.prototype.feature = function (t) {\n if (t < 0 || t >= this._features.length) throw new Error("feature index out of bounds");\n this._pbf.pos = this._features[t];\n\n var e = this._pbf.readVarint() + this._pbf.pos;\n\n return new fs(this._pbf, e, this.extent, this._keys, this._values);\n };\n\n var ws = {\n VectorTile: function VectorTile(t, e) {\n this.layers = t.readFields(bs, {}, e);\n },\n VectorTileFeature: fs,\n VectorTileLayer: vs\n },\n _s = ws.VectorTileFeature.types,\n As = Math.pow(2, 13);\n\n function Ss(t, e, r, n, i, a, o, s) {\n t.emplaceBack(e, r, 2 * Math.floor(n * As) + o, i * As * 2, a * As * 2, Math.round(s));\n }\n\n var ks = function ks(t) {\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.layoutVertexArray = new Mi(), this.indexArray = new qi(), this.programConfigurations = new Fa(t.layers, t.zoom), this.segments = new ua(), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n function Is(t, e) {\n return t.x === e.x && (t.x < 0 || t.x > 8192) || t.y === e.y && (t.y < 0 || t.y > 8192);\n }\n\n ks.prototype.populate = function (t, e, r) {\n this.features = [], this.hasPattern = os("fill-extrusion", this.layers, e);\n\n for (var n = 0, i = t; n < i.length; n += 1) {\n var a = i[n],\n o = a.feature,\n s = a.id,\n u = a.index,\n l = a.sourceLayerIndex,\n p = this.layers[0]._featureFilter.needGeometry,\n c = ja(o, p);\n\n if (this.layers[0]._featureFilter.filter(new ui(this.zoom), c, r)) {\n var h = {\n id: s,\n sourceLayerIndex: l,\n index: u,\n geometry: p ? c.geometry : Ua(o),\n properties: o.properties,\n type: o.type,\n patterns: {}\n };\n this.hasPattern ? this.features.push(ss("fill-extrusion", this.layers, h, this.zoom, e)) : this.addFeature(h, h.geometry, u, r, {}), e.featureIndex.insert(o, h.geometry, u, l, this.index, !0);\n }\n }\n }, ks.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.features; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, ks.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, ks.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, ks.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, ks.prototype.upload = function (t) {\n this.uploaded || (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, hs), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, ks.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, ks.prototype.addFeature = function (t, e, r, n, i) {\n for (var a = 0, o = is(e, 500); a < o.length; a += 1) {\n for (var s = o[a], u = 0, l = 0, p = s; l < p.length; l += 1) {\n u += p[l].length;\n }\n\n for (var c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray), h = 0, f = s; h < f.length; h += 1) {\n var y = f[h];\n if (0 !== y.length && !((B = y).every(function (t) {\n return t.x < 0;\n }) || B.every(function (t) {\n return t.x > 8192;\n }) || B.every(function (t) {\n return t.y < 0;\n }) || B.every(function (t) {\n return t.y > 8192;\n }))) for (var d = 0, m = 0; m < y.length; m++) {\n var v = y[m];\n\n if (m >= 1) {\n var g = y[m - 1];\n\n if (!Is(v, g)) {\n c.vertexLength + 4 > ua.MAX_VERTEX_ARRAY_LENGTH && (c = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray));\n\n var x = v.sub(g)._perp()._unit(),\n b = g.dist(v);\n\n d + b > 32768 && (d = 0), Ss(this.layoutVertexArray, v.x, v.y, x.x, x.y, 0, 0, d), Ss(this.layoutVertexArray, v.x, v.y, x.x, x.y, 0, 1, d), Ss(this.layoutVertexArray, g.x, g.y, x.x, x.y, 0, 0, d += b), Ss(this.layoutVertexArray, g.x, g.y, x.x, x.y, 0, 1, d);\n var w = c.vertexLength;\n this.indexArray.emplaceBack(w, w + 2, w + 1), this.indexArray.emplaceBack(w + 1, w + 2, w + 3), c.vertexLength += 4, c.primitiveLength += 2;\n }\n }\n }\n }\n\n if (c.vertexLength + u > ua.MAX_VERTEX_ARRAY_LENGTH && (c = this.segments.prepareSegment(u, this.layoutVertexArray, this.indexArray)), "Polygon" === _s[t.type]) {\n for (var _ = [], A = [], S = c.vertexLength, k = 0, I = s; k < I.length; k += 1) {\n var z = I[k];\n\n if (0 !== z.length) {\n z !== s[0] && A.push(_.length / 2);\n\n for (var C = 0; C < z.length; C++) {\n var E = z[C];\n Ss(this.layoutVertexArray, E.x, E.y, 0, 0, 1, 1, 0), _.push(E.x), _.push(E.y);\n }\n }\n }\n\n for (var P = zo(_, A), M = 0; M < P.length; M += 3) {\n this.indexArray.emplaceBack(S + P[M], S + P[M + 2], S + P[M + 1]);\n }\n\n c.primitiveLength += P.length / 3, c.vertexLength += u;\n }\n }\n\n var B;\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, On("FillExtrusionBucket", ks, {\n omit: ["layers", "features"]\n });\n\n var zs = {\n paint: new _i({\n "fill-extrusion-opacity": new vi(Pt["paint_fill-extrusion"]["fill-extrusion-opacity"]),\n "fill-extrusion-color": new gi(Pt["paint_fill-extrusion"]["fill-extrusion-color"]),\n "fill-extrusion-translate": new vi(Pt["paint_fill-extrusion"]["fill-extrusion-translate"]),\n "fill-extrusion-translate-anchor": new vi(Pt["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),\n "fill-extrusion-pattern": new xi(Pt["paint_fill-extrusion"]["fill-extrusion-pattern"]),\n "fill-extrusion-height": new gi(Pt["paint_fill-extrusion"]["fill-extrusion-height"]),\n "fill-extrusion-base": new gi(Pt["paint_fill-extrusion"]["fill-extrusion-base"]),\n "fill-extrusion-vertical-gradient": new vi(Pt["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"])\n })\n },\n Cs = function (t) {\n function e(e) {\n t.call(this, e, zs);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.createBucket = function (t) {\n return new ks(t);\n }, e.prototype.queryRadius = function () {\n return ro(this.paint.get("fill-extrusion-translate"));\n }, e.prototype.is3D = function () {\n return !0;\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, a, o, s, u) {\n var l = no(t, this.paint.get("fill-extrusion-translate"), this.paint.get("fill-extrusion-translate-anchor"), o.angle, s),\n p = this.paint.get("fill-extrusion-height").evaluate(e, r),\n c = this.paint.get("fill-extrusion-base").evaluate(e, r),\n h = function (t, e, r, n) {\n for (var a = [], o = 0, s = t; o < s.length; o += 1) {\n var u = s[o],\n l = [u.x, u.y, 0, 1];\n co(l, l, e), a.push(new i(l[0] / l[3], l[1] / l[3]));\n }\n\n return a;\n }(l, u),\n f = function (t, e, r, n) {\n for (var a = [], o = [], s = n[8] * e, u = n[9] * e, l = n[10] * e, p = n[11] * e, c = n[8] * r, h = n[9] * r, f = n[10] * r, y = n[11] * r, d = 0, m = t; d < m.length; d += 1) {\n for (var v = [], g = [], x = 0, b = m[d]; x < b.length; x += 1) {\n var w = b[x],\n _ = w.x,\n A = w.y,\n S = n[0] * _ + n[4] * A + n[12],\n k = n[1] * _ + n[5] * A + n[13],\n I = n[2] * _ + n[6] * A + n[14],\n z = n[3] * _ + n[7] * A + n[15],\n C = I + l,\n E = z + p,\n P = S + c,\n M = k + h,\n B = I + f,\n T = z + y,\n V = new i((S + s) / E, (k + u) / E);\n V.z = C / E, v.push(V);\n var F = new i(P / T, M / T);\n F.z = B / T, g.push(F);\n }\n\n a.push(v), o.push(g);\n }\n\n return [a, o];\n }(n, c, p, u);\n\n return function (t, e, r) {\n var n = 1 / 0;\n Za(r, e) && (n = Ps(r, e[0]));\n\n for (var i = 0; i < e.length; i++) {\n for (var a = e[i], o = t[i], s = 0; s < a.length - 1; s++) {\n var u = a[s],\n l = [u, a[s + 1], o[s + 1], o[s], u];\n Ka(r, l) && (n = Math.min(n, Ps(r, l)));\n }\n }\n\n return n !== 1 / 0 && n;\n }(f[0], f[1], h);\n }, e;\n }(Ai);\n\n function Es(t, e) {\n return t.x * e.x + t.y * e.y;\n }\n\n function Ps(t, e) {\n if (1 === t.length) {\n for (var r, n = 0, i = e[n++]; !r || i.equals(r);) {\n if (!(r = e[n++])) return 1 / 0;\n }\n\n for (; n < e.length; n++) {\n var a = e[n],\n o = t[0],\n s = r.sub(i),\n u = a.sub(i),\n l = o.sub(i),\n p = Es(s, s),\n c = Es(s, u),\n h = Es(u, u),\n f = Es(l, s),\n y = Es(l, u),\n d = p * h - c * c,\n m = (h * f - c * y) / d,\n v = (p * y - c * f) / d,\n g = i.z * (1 - m - v) + r.z * m + a.z * v;\n if (isFinite(g)) return g;\n }\n\n return 1 / 0;\n }\n\n for (var x = 1 / 0, b = 0, w = e; b < w.length; b += 1) {\n x = Math.min(x, w[b].z);\n }\n\n return x;\n }\n\n var Ms = zi([{\n name: "a_pos_normal",\n components: 2,\n type: "Int16"\n }, {\n name: "a_data",\n components: 4,\n type: "Uint8"\n }], 4).members,\n Bs = zi([{\n name: "a_uv_x",\n components: 1,\n type: "Float32"\n }, {\n name: "a_split_index",\n components: 1,\n type: "Float32"\n }]).members,\n Ts = ws.VectorTileFeature.types,\n Vs = Math.cos(Math.PI / 180 * 37.5),\n Fs = Math.pow(2, 14) / .5,\n Ds = function Ds(t) {\n var e = this;\n this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.hasPattern = !1, this.patternFeatures = [], this.lineClipsArray = [], this.gradients = {}, this.layers.forEach(function (t) {\n e.gradients[t.id] = {};\n }), this.layoutVertexArray = new Bi(), this.layoutVertexArray2 = new Ti(), this.indexArray = new qi(), this.programConfigurations = new Fa(t.layers, t.zoom), this.segments = new ua(), this.maxLineLength = 0, this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n });\n };\n\n Ds.prototype.populate = function (t, e, r) {\n this.hasPattern = os("line", this.layers, e);\n\n for (var n = this.layers[0].layout.get("line-sort-key"), i = !n.isConstant(), a = [], o = 0, s = t; o < s.length; o += 1) {\n var u = s[o],\n l = u.feature,\n p = u.id,\n c = u.index,\n h = u.sourceLayerIndex,\n f = this.layers[0]._featureFilter.needGeometry,\n y = ja(l, f);\n\n if (this.layers[0]._featureFilter.filter(new ui(this.zoom), y, r)) {\n var d = i ? n.evaluate(y, {}, r) : void 0,\n m = {\n id: p,\n properties: l.properties,\n type: l.type,\n sourceLayerIndex: h,\n index: c,\n geometry: f ? y.geometry : Ua(l),\n patterns: {},\n sortKey: d\n };\n a.push(m);\n }\n }\n\n i && a.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var v = 0, g = a; v < g.length; v += 1) {\n var x = g[v],\n b = x.geometry,\n w = x.index,\n _ = x.sourceLayerIndex;\n\n if (this.hasPattern) {\n var A = ss("line", this.layers, x, this.zoom, e);\n this.patternFeatures.push(A);\n } else this.addFeature(x, b, w, r, {});\n\n e.featureIndex.insert(t[w].feature, b, w, _, this.index);\n }\n }, Ds.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && this.programConfigurations.updatePaintArrays(t, e, this.stateDependentLayers, r);\n }, Ds.prototype.addFeatures = function (t, e, r) {\n for (var n = 0, i = this.patternFeatures; n < i.length; n += 1) {\n var a = i[n];\n this.addFeature(a, a.geometry, a.index, e, r);\n }\n }, Ds.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length;\n }, Ds.prototype.uploadPending = function () {\n return !this.uploaded || this.programConfigurations.needsUpload;\n }, Ds.prototype.upload = function (t) {\n this.uploaded || (0 !== this.layoutVertexArray2.length && (this.layoutVertexBuffer2 = t.createVertexBuffer(this.layoutVertexArray2, Bs)), this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, Ms), this.indexBuffer = t.createIndexBuffer(this.indexArray)), this.programConfigurations.upload(t), this.uploaded = !0;\n }, Ds.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy());\n }, Ds.prototype.lineFeatureClips = function (t) {\n if (t.properties && t.properties.hasOwnProperty("mapbox_clip_start") && t.properties.hasOwnProperty("mapbox_clip_end")) return {\n start: +t.properties.mapbox_clip_start,\n end: +t.properties.mapbox_clip_end\n };\n }, Ds.prototype.addFeature = function (t, e, r, n, i) {\n var a = this.layers[0].layout,\n o = a.get("line-join").evaluate(t, {}),\n s = a.get("line-cap"),\n u = a.get("line-miter-limit"),\n l = a.get("line-round-limit");\n this.lineClips = this.lineFeatureClips(t);\n\n for (var p = 0, c = e; p < c.length; p += 1) {\n this.addLine(c[p], t, o, s, u, l);\n }\n\n this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, t, r, i, n);\n }, Ds.prototype.addLine = function (t, e, r, n, i, a) {\n if (this.distance = 0, this.scaledDistance = 0, this.totalDistance = 0, this.lineClips) {\n this.lineClipsArray.push(this.lineClips);\n\n for (var o = 0; o < t.length - 1; o++) {\n this.totalDistance += t[o].dist(t[o + 1]);\n }\n\n this.updateScaledDistance(), this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);\n }\n\n for (var s = "Polygon" === Ts[e.type], u = t.length; u >= 2 && t[u - 1].equals(t[u - 2]);) {\n u--;\n }\n\n for (var l = 0; l < u - 1 && t[l].equals(t[l + 1]);) {\n l++;\n }\n\n if (!(u < (s ? 3 : 2))) {\n "bevel" === r && (i = 1.05);\n var p,\n c = this.overscaling <= 16 ? 122880 / (512 * this.overscaling) : 0,\n h = this.segments.prepareSegment(10 * u, this.layoutVertexArray, this.indexArray),\n f = void 0,\n y = void 0,\n d = void 0,\n m = void 0;\n this.e1 = this.e2 = -1, s && (m = t[l].sub(p = t[u - 2])._unit()._perp());\n\n for (var v = l; v < u; v++) {\n if (!(y = v === u - 1 ? s ? t[l + 1] : void 0 : t[v + 1]) || !t[v].equals(y)) {\n m && (d = m), p && (f = p), p = t[v], m = y ? y.sub(p)._unit()._perp() : d;\n var g = (d = d || m).add(m);\n 0 === g.x && 0 === g.y || g._unit();\n\n var x = d.x * m.x + d.y * m.y,\n b = g.x * m.x + g.y * m.y,\n w = 0 !== b ? 1 / b : 1 / 0,\n _ = 2 * Math.sqrt(2 - 2 * b),\n A = b < Vs && f && y,\n S = d.x * m.y - d.y * m.x > 0;\n\n if (A && v > l) {\n var k = p.dist(f);\n\n if (k > 2 * c) {\n var I = p.sub(p.sub(f)._mult(c / k)._round());\n this.updateDistance(f, I), this.addCurrentVertex(I, d, 0, 0, h), f = I;\n }\n }\n\n var z = f && y,\n C = z ? r : s ? "butt" : n;\n if (z && "round" === C && (w < a ? C = "miter" : w <= 2 && (C = "fakeround")), "miter" === C && w > i && (C = "bevel"), "bevel" === C && (w > 2 && (C = "flipbevel"), w < i && (C = "miter")), f && this.updateDistance(f, p), "miter" === C) g._mult(w), this.addCurrentVertex(p, g, 0, 0, h);else if ("flipbevel" === C) {\n if (w > 100) g = m.mult(-1);else {\n var E = w * d.add(m).mag() / d.sub(m).mag();\n\n g._perp()._mult(E * (S ? -1 : 1));\n }\n this.addCurrentVertex(p, g, 0, 0, h), this.addCurrentVertex(p, g.mult(-1), 0, 0, h);\n } else if ("bevel" === C || "fakeround" === C) {\n var P = -Math.sqrt(w * w - 1),\n M = S ? P : 0,\n B = S ? 0 : P;\n if (f && this.addCurrentVertex(p, d, M, B, h), "fakeround" === C) for (var T = Math.round(180 * _ / Math.PI / 20), V = 1; V < T; V++) {\n var F = V / T;\n\n if (.5 !== F) {\n var D = F - .5;\n F += F * D * (F - 1) * ((1.0904 + x * (x * (3.55645 - 1.43519 * x) - 3.2452)) * D * D + (.848013 + x * (.215638 * x - 1.06021)));\n }\n\n var L = m.sub(d)._mult(F)._add(d)._unit()._mult(S ? -1 : 1);\n\n this.addHalfVertex(p, L.x, L.y, !1, S, 0, h);\n }\n y && this.addCurrentVertex(p, m, -M, -B, h);\n } else if ("butt" === C) this.addCurrentVertex(p, g, 0, 0, h);else if ("square" === C) {\n var R = f ? 1 : -1;\n this.addCurrentVertex(p, g, R, R, h);\n } else "round" === C && (f && (this.addCurrentVertex(p, d, 0, 0, h), this.addCurrentVertex(p, d, 1, 1, h, !0)), y && (this.addCurrentVertex(p, m, -1, -1, h, !0), this.addCurrentVertex(p, m, 0, 0, h)));\n\n if (A && v < u - 1) {\n var O = p.dist(y);\n\n if (O > 2 * c) {\n var U = p.add(y.sub(p)._mult(c / O)._round());\n this.updateDistance(p, U), this.addCurrentVertex(U, m, 0, 0, h), p = U;\n }\n }\n }\n }\n }\n }, Ds.prototype.addCurrentVertex = function (t, e, r, n, i, a) {\n void 0 === a && (a = !1);\n var o = e.y * n - e.x,\n s = -e.y - e.x * n;\n this.addHalfVertex(t, e.x + e.y * r, e.y - e.x * r, a, !1, r, i), this.addHalfVertex(t, o, s, a, !0, -n, i), this.distance > Fs / 2 && 0 === this.totalDistance && (this.distance = 0, this.addCurrentVertex(t, e, r, n, i, a));\n }, Ds.prototype.addHalfVertex = function (t, e, r, n, i, a, o) {\n var s = .5 * (this.lineClips ? this.scaledDistance * (Fs - 1) : this.scaledDistance);\n this.layoutVertexArray.emplaceBack((t.x << 1) + (n ? 1 : 0), (t.y << 1) + (i ? 1 : 0), Math.round(63 * e) + 128, Math.round(63 * r) + 128, 1 + (0 === a ? 0 : a < 0 ? -1 : 1) | (63 & s) << 2, s >> 6), this.lineClips && this.layoutVertexArray2.emplaceBack((this.scaledDistance - this.lineClips.start) / (this.lineClips.end - this.lineClips.start), this.lineClipsArray.length);\n var u = o.vertexLength++;\n this.e1 >= 0 && this.e2 >= 0 && (this.indexArray.emplaceBack(this.e1, this.e2, u), o.primitiveLength++), i ? this.e2 = u : this.e1 = u;\n }, Ds.prototype.updateScaledDistance = function () {\n this.scaledDistance = this.lineClips ? this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance : this.distance;\n }, Ds.prototype.updateDistance = function (t, e) {\n this.distance += t.dist(e), this.updateScaledDistance();\n }, On("LineBucket", Ds, {\n omit: ["layers", "patternFeatures"]\n });\n var Ls = new _i({\n "line-cap": new vi(Pt.layout_line["line-cap"]),\n "line-join": new gi(Pt.layout_line["line-join"]),\n "line-miter-limit": new vi(Pt.layout_line["line-miter-limit"]),\n "line-round-limit": new vi(Pt.layout_line["line-round-limit"]),\n "line-sort-key": new gi(Pt.layout_line["line-sort-key"])\n }),\n Rs = {\n paint: new _i({\n "line-opacity": new gi(Pt.paint_line["line-opacity"]),\n "line-color": new gi(Pt.paint_line["line-color"]),\n "line-translate": new vi(Pt.paint_line["line-translate"]),\n "line-translate-anchor": new vi(Pt.paint_line["line-translate-anchor"]),\n "line-width": new gi(Pt.paint_line["line-width"]),\n "line-gap-width": new gi(Pt.paint_line["line-gap-width"]),\n "line-offset": new gi(Pt.paint_line["line-offset"]),\n "line-blur": new gi(Pt.paint_line["line-blur"]),\n "line-dasharray": new bi(Pt.paint_line["line-dasharray"]),\n "line-pattern": new xi(Pt.paint_line["line-pattern"]),\n "line-gradient": new wi(Pt.paint_line["line-gradient"])\n }),\n layout: Ls\n },\n Os = new (function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.possiblyEvaluate = function (e, r) {\n return r = new ui(Math.floor(r.zoom), {\n now: r.now,\n fadeDuration: r.fadeDuration,\n zoomHistory: r.zoomHistory,\n transition: r.transition\n }), t.prototype.possiblyEvaluate.call(this, e, r);\n }, e.prototype.evaluate = function (e, r, n, i) {\n return r = h({}, r, {\n zoom: Math.floor(r.zoom)\n }), t.prototype.evaluate.call(this, e, r, n, i);\n }, e;\n }(gi))(Rs.paint.properties["line-width"].specification);\n Os.useIntegerZoom = !0;\n\n var Us = function (t) {\n function e(e) {\n t.call(this, e, Rs), this.gradientVersion = 0;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._handleSpecialPaintPropertyUpdate = function (t) {\n "line-gradient" === t && (this.stepInterpolant = this._transitionablePaint._values["line-gradient"].value.expression._styleExpression.expression instanceof Ke, this.gradientVersion = (this.gradientVersion + 1) % s);\n }, e.prototype.gradientExpression = function () {\n return this._transitionablePaint._values["line-gradient"].value.expression;\n }, e.prototype.recalculate = function (e, r) {\n t.prototype.recalculate.call(this, e, r), this.paint._values["line-floorwidth"] = Os.possiblyEvaluate(this._transitioningPaint._values["line-width"].value, e);\n }, e.prototype.createBucket = function (t) {\n return new Ds(t);\n }, e.prototype.queryRadius = function (t) {\n var e = t,\n r = js(eo("line-width", this, e), eo("line-gap-width", this, e)),\n n = eo("line-offset", this, e);\n return r / 2 + Math.abs(n) + ro(this.paint.get("line-translate"));\n }, e.prototype.queryIntersectsFeature = function (t, e, r, n, a, o, s) {\n var u = no(t, this.paint.get("line-translate"), this.paint.get("line-translate-anchor"), o.angle, s),\n l = s / 2 * js(this.paint.get("line-width").evaluate(e, r), this.paint.get("line-gap-width").evaluate(e, r)),\n p = this.paint.get("line-offset").evaluate(e, r);\n return p && (n = function (t, e) {\n for (var r = [], n = new i(0, 0), a = 0; a < t.length; a++) {\n for (var o = t[a], s = [], u = 0; u < o.length; u++) {\n var l = o[u],\n p = o[u + 1],\n c = 0 === u ? n : l.sub(o[u - 1])._unit()._perp(),\n h = u === o.length - 1 ? n : p.sub(l)._unit()._perp(),\n f = c._add(h)._unit();\n\n f._mult(1 / (f.x * h.x + f.y * h.y)), s.push(f._mult(e)._add(l));\n }\n\n r.push(s);\n }\n\n return r;\n }(n, p * s)), function (t, e, r) {\n for (var n = 0; n < e.length; n++) {\n var i = e[n];\n if (t.length >= 3) for (var a = 0; a < i.length; a++) {\n if (Qa(t, i[a])) return !0;\n }\n if (Xa(t, i, r)) return !0;\n }\n\n return !1;\n }(u, n, l);\n }, e.prototype.isTileClipped = function () {\n return !0;\n }, e;\n }(Ai);\n\n function js(t, e) {\n return e > 0 ? e + 2 * t : t;\n }\n\n var qs = zi([{\n name: "a_pos_offset",\n components: 4,\n type: "Int16"\n }, {\n name: "a_data",\n components: 4,\n type: "Uint16"\n }, {\n name: "a_pixeloffset",\n components: 4,\n type: "Int16"\n }], 4),\n Ns = zi([{\n name: "a_projected_pos",\n components: 3,\n type: "Float32"\n }], 4),\n Ks = (zi([{\n name: "a_fade_opacity",\n components: 1,\n type: "Uint32"\n }], 4), zi([{\n name: "a_placed",\n components: 2,\n type: "Uint8"\n }, {\n name: "a_shift",\n components: 2,\n type: "Float32"\n }])),\n Gs = (zi([{\n type: "Int16",\n name: "anchorPointX"\n }, {\n type: "Int16",\n name: "anchorPointY"\n }, {\n type: "Int16",\n name: "x1"\n }, {\n type: "Int16",\n name: "y1"\n }, {\n type: "Int16",\n name: "x2"\n }, {\n type: "Int16",\n name: "y2"\n }, {\n type: "Uint32",\n name: "featureIndex"\n }, {\n type: "Uint16",\n name: "sourceLayerIndex"\n }, {\n type: "Uint16",\n name: "bucketIndex"\n }]), zi([{\n name: "a_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_anchor_pos",\n components: 2,\n type: "Int16"\n }, {\n name: "a_extrude",\n components: 2,\n type: "Int16"\n }], 4)),\n Zs = zi([{\n name: "a_pos",\n components: 2,\n type: "Float32"\n }, {\n name: "a_radius",\n components: 1,\n type: "Float32"\n }, {\n name: "a_flags",\n components: 2,\n type: "Int16"\n }], 4);\n\n function Xs(t, e, r) {\n return t.sections.forEach(function (t) {\n t.text = function (t, e, r) {\n var n = e.layout.get("text-transform").evaluate(r, {});\n return "uppercase" === n ? t = t.toLocaleUpperCase() : "lowercase" === n && (t = t.toLocaleLowerCase()), si.applyArabicShaping && (t = si.applyArabicShaping(t)), t;\n }(t.text, e, r);\n }), t;\n }\n\n zi([{\n name: "triangle",\n components: 3,\n type: "Uint16"\n }]), zi([{\n type: "Int16",\n name: "anchorX"\n }, {\n type: "Int16",\n name: "anchorY"\n }, {\n type: "Uint16",\n name: "glyphStartIndex"\n }, {\n type: "Uint16",\n name: "numGlyphs"\n }, {\n type: "Uint32",\n name: "vertexStartIndex"\n }, {\n type: "Uint32",\n name: "lineStartIndex"\n }, {\n type: "Uint32",\n name: "lineLength"\n }, {\n type: "Uint16",\n name: "segment"\n }, {\n type: "Uint16",\n name: "lowerSize"\n }, {\n type: "Uint16",\n name: "upperSize"\n }, {\n type: "Float32",\n name: "lineOffsetX"\n }, {\n type: "Float32",\n name: "lineOffsetY"\n }, {\n type: "Uint8",\n name: "writingMode"\n }, {\n type: "Uint8",\n name: "placedOrientation"\n }, {\n type: "Uint8",\n name: "hidden"\n }, {\n type: "Uint32",\n name: "crossTileID"\n }, {\n type: "Int16",\n name: "associatedIconIndex"\n }]), zi([{\n type: "Int16",\n name: "anchorX"\n }, {\n type: "Int16",\n name: "anchorY"\n }, {\n type: "Int16",\n name: "rightJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "centerJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "leftJustifiedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "verticalPlacedTextSymbolIndex"\n }, {\n type: "Int16",\n name: "placedIconSymbolIndex"\n }, {\n type: "Int16",\n name: "verticalPlacedIconSymbolIndex"\n }, {\n type: "Uint16",\n name: "key"\n }, {\n type: "Uint16",\n name: "textBoxStartIndex"\n }, {\n type: "Uint16",\n name: "textBoxEndIndex"\n }, {\n type: "Uint16",\n name: "verticalTextBoxStartIndex"\n }, {\n type: "Uint16",\n name: "verticalTextBoxEndIndex"\n }, {\n type: "Uint16",\n name: "iconBoxStartIndex"\n }, {\n type: "Uint16",\n name: "iconBoxEndIndex"\n }, {\n type: "Uint16",\n name: "verticalIconBoxStartIndex"\n }, {\n type: "Uint16",\n name: "verticalIconBoxEndIndex"\n }, {\n type: "Uint16",\n name: "featureIndex"\n }, {\n type: "Uint16",\n name: "numHorizontalGlyphVertices"\n }, {\n type: "Uint16",\n name: "numVerticalGlyphVertices"\n }, {\n type: "Uint16",\n name: "numIconVertices"\n }, {\n type: "Uint16",\n name: "numVerticalIconVertices"\n }, {\n type: "Uint16",\n name: "useRuntimeCollisionCircles"\n }, {\n type: "Uint32",\n name: "crossTileID"\n }, {\n type: "Float32",\n name: "textBoxScale"\n }, {\n type: "Float32",\n components: 2,\n name: "textOffset"\n }, {\n type: "Float32",\n name: "collisionCircleDiameter"\n }]), zi([{\n type: "Float32",\n name: "offsetX"\n }]), zi([{\n type: "Int16",\n name: "x"\n }, {\n type: "Int16",\n name: "y"\n }, {\n type: "Int16",\n name: "tileUnitDistanceFromAnchor"\n }]);\n\n var Js = {\n "!": "︕",\n "#": "#",\n $: "$",\n "%": "%",\n "&": "&",\n "(": "︵",\n ")": "︶",\n "*": "*",\n "+": "+",\n ",": "︐",\n "-": "︲",\n ".": "・",\n "/": "/",\n ":": "︓",\n ";": "︔",\n "<": "︿",\n "=": "=",\n ">": "﹀",\n "?": "︖",\n "@": "@",\n "[": "﹇",\n "\\\\": "\",\n "]": "﹈",\n "^": "^",\n _: "︳",\n "`": "`",\n "{": "︷",\n "|": "―",\n "}": "︸",\n "~": "~",\n "¢": "¢",\n "£": "£",\n "¥": "¥",\n "¦": "¦",\n "¬": "¬",\n "¯": " ̄",\n "–": "︲",\n "—": "︱",\n "‘": "﹃",\n "’": "﹄",\n "“": "﹁",\n "”": "﹂",\n "…": "︙",\n "‧": "・",\n "₩": "₩",\n "、": "︑",\n "。": "︒",\n "〈": "︿",\n "〉": "﹀",\n "《": "︽",\n "》": "︾",\n "「": "﹁",\n "」": "﹂",\n "『": "﹃",\n "』": "﹄",\n "【": "︻",\n "】": "︼",\n "〔": "︹",\n "〕": "︺",\n "〖": "︗",\n "〗": "︘",\n "!": "︕",\n "(": "︵",\n ")": "︶",\n ",": "︐",\n "-": "︲",\n ".": "・",\n ":": "︓",\n ";": "︔",\n "<": "︿",\n ">": "﹀",\n "?": "︖",\n "[": "﹇",\n "]": "﹈",\n "_": "︳",\n "{": "︷",\n "|": "―",\n "}": "︸",\n "⦅": "︵",\n "⦆": "︶",\n "。": "︒",\n "「": "﹁",\n "」": "﹂"\n },\n Hs = function Hs(t, e, r, n, i) {\n var a,\n o,\n s = 8 * i - n - 1,\n u = (1 << s) - 1,\n l = u >> 1,\n p = -7,\n c = r ? i - 1 : 0,\n h = r ? -1 : 1,\n f = t[e + c];\n\n for (c += h, a = f & (1 << -p) - 1, f >>= -p, p += s; p > 0; a = 256 * a + t[e + c], c += h, p -= 8) {\n ;\n }\n\n for (o = a & (1 << -p) - 1, a >>= -p, p += n; p > 0; o = 256 * o + t[e + c], c += h, p -= 8) {\n ;\n }\n\n if (0 === a) a = 1 - l;else {\n if (a === u) return o ? NaN : 1 / 0 * (f ? -1 : 1);\n o += Math.pow(2, n), a -= l;\n }\n return (f ? -1 : 1) * o * Math.pow(2, a - n);\n },\n Ys = function Ys(t, e, r, n, i, a) {\n var o,\n s,\n u,\n l = 8 * a - i - 1,\n p = (1 << l) - 1,\n c = p >> 1,\n h = 23 === i ? Math.pow(2, -24) - Math.pow(2, -77) : 0,\n f = n ? 0 : a - 1,\n y = n ? 1 : -1,\n d = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0;\n\n for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (s = isNaN(e) ? 1 : 0, o = p) : (o = Math.floor(Math.log(e) / Math.LN2), e * (u = Math.pow(2, -o)) < 1 && (o--, u *= 2), (e += o + c >= 1 ? h / u : h * Math.pow(2, 1 - c)) * u >= 2 && (o++, u /= 2), o + c >= p ? (s = 0, o = p) : o + c >= 1 ? (s = (e * u - 1) * Math.pow(2, i), o += c) : (s = e * Math.pow(2, c - 1) * Math.pow(2, i), o = 0)); i >= 8; t[r + f] = 255 & s, f += y, s /= 256, i -= 8) {\n ;\n }\n\n for (o = o << i | s, l += i; l > 0; t[r + f] = 255 & o, f += y, o /= 256, l -= 8) {\n ;\n }\n\n t[r + f - y] |= 128 * d;\n },\n $s = Ws;\n\n function Ws(t) {\n this.buf = ArrayBuffer.isView && ArrayBuffer.isView(t) ? t : new Uint8Array(t || 0), this.pos = 0, this.type = 0, this.length = this.buf.length;\n }\n\n Ws.Varint = 0, Ws.Fixed64 = 1, Ws.Bytes = 2, Ws.Fixed32 = 5;\n var Qs = "undefined" == typeof TextDecoder ? null : new TextDecoder("utf8");\n\n function tu(t) {\n return t.type === Ws.Bytes ? t.readVarint() + t.pos : t.pos + 1;\n }\n\n function eu(t, e, r) {\n return r ? 4294967296 * e + (t >>> 0) : 4294967296 * (e >>> 0) + (t >>> 0);\n }\n\n function ru(t, e, r) {\n var n = e <= 16383 ? 1 : e <= 2097151 ? 2 : e <= 268435455 ? 3 : Math.floor(Math.log(e) / (7 * Math.LN2));\n r.realloc(n);\n\n for (var i = r.pos - 1; i >= t; i--) {\n r.buf[i + n] = r.buf[i];\n }\n }\n\n function nu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeVarint(t[r]);\n }\n }\n\n function iu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSVarint(t[r]);\n }\n }\n\n function au(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFloat(t[r]);\n }\n }\n\n function ou(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeDouble(t[r]);\n }\n }\n\n function su(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeBoolean(t[r]);\n }\n }\n\n function uu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFixed32(t[r]);\n }\n }\n\n function lu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSFixed32(t[r]);\n }\n }\n\n function pu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeFixed64(t[r]);\n }\n }\n\n function cu(t, e) {\n for (var r = 0; r < t.length; r++) {\n e.writeSFixed64(t[r]);\n }\n }\n\n function hu(t, e) {\n return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) + 16777216 * t[e + 3];\n }\n\n function fu(t, e, r) {\n t[r] = e, t[r + 1] = e >>> 8, t[r + 2] = e >>> 16, t[r + 3] = e >>> 24;\n }\n\n function yu(t, e) {\n return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) + (t[e + 3] << 24);\n }\n\n function du(t, e, r) {\n 1 === t && r.readMessage(mu, e);\n }\n\n function mu(t, e, r) {\n if (3 === t) {\n var n = r.readMessage(vu, {}),\n i = n.width,\n a = n.height,\n o = n.left,\n s = n.top,\n u = n.advance;\n e.push({\n id: n.id,\n bitmap: new xo({\n width: i + 6,\n height: a + 6\n }, n.bitmap),\n metrics: {\n width: i,\n height: a,\n left: o,\n top: s,\n advance: u\n }\n });\n }\n }\n\n function vu(t, e, r) {\n 1 === t ? e.id = r.readVarint() : 2 === t ? e.bitmap = r.readBytes() : 3 === t ? e.width = r.readVarint() : 4 === t ? e.height = r.readVarint() : 5 === t ? e.left = r.readSVarint() : 6 === t ? e.top = r.readSVarint() : 7 === t && (e.advance = r.readVarint());\n }\n\n function gu(t) {\n for (var e = 0, r = 0, n = 0, i = t; n < i.length; n += 1) {\n var a = i[n];\n e += a.w * a.h, r = Math.max(r, a.w);\n }\n\n t.sort(function (t, e) {\n return e.h - t.h;\n });\n\n for (var o = [{\n x: 0,\n y: 0,\n w: Math.max(Math.ceil(Math.sqrt(e / .95)), r),\n h: 1 / 0\n }], s = 0, u = 0, l = 0, p = t; l < p.length; l += 1) {\n for (var c = p[l], h = o.length - 1; h >= 0; h--) {\n var f = o[h];\n\n if (!(c.w > f.w || c.h > f.h)) {\n if (c.x = f.x, c.y = f.y, u = Math.max(u, c.y + c.h), s = Math.max(s, c.x + c.w), c.w === f.w && c.h === f.h) {\n var y = o.pop();\n h < o.length && (o[h] = y);\n } else c.h === f.h ? (f.x += c.w, f.w -= c.w) : c.w === f.w ? (f.y += c.h, f.h -= c.h) : (o.push({\n x: f.x + c.w,\n y: f.y,\n w: f.w - c.w,\n h: c.h\n }), f.y += c.h, f.h -= c.h);\n\n break;\n }\n }\n }\n\n return {\n w: s,\n h: u,\n fill: e / (s * u) || 0\n };\n }\n\n Ws.prototype = {\n destroy: function destroy() {\n this.buf = null;\n },\n readFields: function readFields(t, e, r) {\n for (r = r || this.length; this.pos < r;) {\n var n = this.readVarint(),\n i = n >> 3,\n a = this.pos;\n this.type = 7 & n, t(i, e, this), this.pos === a && this.skip(n);\n }\n\n return e;\n },\n readMessage: function readMessage(t, e) {\n return this.readFields(t, e, this.readVarint() + this.pos);\n },\n readFixed32: function readFixed32() {\n var t = hu(this.buf, this.pos);\n return this.pos += 4, t;\n },\n readSFixed32: function readSFixed32() {\n var t = yu(this.buf, this.pos);\n return this.pos += 4, t;\n },\n readFixed64: function readFixed64() {\n var t = hu(this.buf, this.pos) + 4294967296 * hu(this.buf, this.pos + 4);\n return this.pos += 8, t;\n },\n readSFixed64: function readSFixed64() {\n var t = hu(this.buf, this.pos) + 4294967296 * yu(this.buf, this.pos + 4);\n return this.pos += 8, t;\n },\n readFloat: function readFloat() {\n var t = Hs(this.buf, this.pos, !0, 23, 4);\n return this.pos += 4, t;\n },\n readDouble: function readDouble() {\n var t = Hs(this.buf, this.pos, !0, 52, 8);\n return this.pos += 8, t;\n },\n readVarint: function readVarint(t) {\n var e,\n r,\n n = this.buf;\n return e = 127 & (r = n[this.pos++]), r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 7, r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 14, r < 128 ? e : (e |= (127 & (r = n[this.pos++])) << 21, r < 128 ? e : function (t, e, r) {\n var n,\n i,\n a = r.buf;\n if (n = (112 & (i = a[r.pos++])) >> 4, i < 128) return eu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 3, i < 128) return eu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 10, i < 128) return eu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 17, i < 128) return eu(t, n, e);\n if (n |= (127 & (i = a[r.pos++])) << 24, i < 128) return eu(t, n, e);\n if (n |= (1 & (i = a[r.pos++])) << 31, i < 128) return eu(t, n, e);\n throw new Error("Expected varint not more than 10 bytes");\n }(e |= (15 & (r = n[this.pos])) << 28, t, this))));\n },\n readVarint64: function readVarint64() {\n return this.readVarint(!0);\n },\n readSVarint: function readSVarint() {\n var t = this.readVarint();\n return t % 2 == 1 ? (t + 1) / -2 : t / 2;\n },\n readBoolean: function readBoolean() {\n return Boolean(this.readVarint());\n },\n readString: function readString() {\n var t = this.readVarint() + this.pos,\n e = this.pos;\n return this.pos = t, t - e >= 12 && Qs ? function (t, e, r) {\n return Qs.decode(t.subarray(e, r));\n }(this.buf, e, t) : function (t, e, r) {\n for (var n = "", i = e; i < r;) {\n var a,\n o,\n s,\n u = t[i],\n l = null,\n p = u > 239 ? 4 : u > 223 ? 3 : u > 191 ? 2 : 1;\n if (i + p > r) break;\n 1 === p ? u < 128 && (l = u) : 2 === p ? 128 == (192 & (a = t[i + 1])) && (l = (31 & u) << 6 | 63 & a) <= 127 && (l = null) : 3 === p ? (o = t[i + 2], 128 == (192 & (a = t[i + 1])) && 128 == (192 & o) && ((l = (15 & u) << 12 | (63 & a) << 6 | 63 & o) <= 2047 || l >= 55296 && l <= 57343) && (l = null)) : 4 === p && (o = t[i + 2], s = t[i + 3], 128 == (192 & (a = t[i + 1])) && 128 == (192 & o) && 128 == (192 & s) && ((l = (15 & u) << 18 | (63 & a) << 12 | (63 & o) << 6 | 63 & s) <= 65535 || l >= 1114112) && (l = null)), null === l ? (l = 65533, p = 1) : l > 65535 && (l -= 65536, n += String.fromCharCode(l >>> 10 & 1023 | 55296), l = 56320 | 1023 & l), n += String.fromCharCode(l), i += p;\n }\n\n return n;\n }(this.buf, e, t);\n },\n readBytes: function readBytes() {\n var t = this.readVarint() + this.pos,\n e = this.buf.subarray(this.pos, t);\n return this.pos = t, e;\n },\n readPackedVarint: function readPackedVarint(t, e) {\n if (this.type !== Ws.Bytes) return t.push(this.readVarint(e));\n var r = tu(this);\n\n for (t = t || []; this.pos < r;) {\n t.push(this.readVarint(e));\n }\n\n return t;\n },\n readPackedSVarint: function readPackedSVarint(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readSVarint());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSVarint());\n }\n\n return t;\n },\n readPackedBoolean: function readPackedBoolean(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readBoolean());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readBoolean());\n }\n\n return t;\n },\n readPackedFloat: function readPackedFloat(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readFloat());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFloat());\n }\n\n return t;\n },\n readPackedDouble: function readPackedDouble(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readDouble());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readDouble());\n }\n\n return t;\n },\n readPackedFixed32: function readPackedFixed32(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readFixed32());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFixed32());\n }\n\n return t;\n },\n readPackedSFixed32: function readPackedSFixed32(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readSFixed32());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSFixed32());\n }\n\n return t;\n },\n readPackedFixed64: function readPackedFixed64(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readFixed64());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readFixed64());\n }\n\n return t;\n },\n readPackedSFixed64: function readPackedSFixed64(t) {\n if (this.type !== Ws.Bytes) return t.push(this.readSFixed64());\n var e = tu(this);\n\n for (t = t || []; this.pos < e;) {\n t.push(this.readSFixed64());\n }\n\n return t;\n },\n skip: function skip(t) {\n var e = 7 & t;\n if (e === Ws.Varint) for (; this.buf[this.pos++] > 127;) {\n ;\n } else if (e === Ws.Bytes) this.pos = this.readVarint() + this.pos;else if (e === Ws.Fixed32) this.pos += 4;else {\n if (e !== Ws.Fixed64) throw new Error("Unimplemented type: " + e);\n this.pos += 8;\n }\n },\n writeTag: function writeTag(t, e) {\n this.writeVarint(t << 3 | e);\n },\n realloc: function realloc(t) {\n for (var e = this.length || 16; e < this.pos + t;) {\n e *= 2;\n }\n\n if (e !== this.length) {\n var r = new Uint8Array(e);\n r.set(this.buf), this.buf = r, this.length = e;\n }\n },\n finish: function finish() {\n return this.length = this.pos, this.pos = 0, this.buf.subarray(0, this.length);\n },\n writeFixed32: function writeFixed32(t) {\n this.realloc(4), fu(this.buf, t, this.pos), this.pos += 4;\n },\n writeSFixed32: function writeSFixed32(t) {\n this.realloc(4), fu(this.buf, t, this.pos), this.pos += 4;\n },\n writeFixed64: function writeFixed64(t) {\n this.realloc(8), fu(this.buf, -1 & t, this.pos), fu(this.buf, Math.floor(t * (1 / 4294967296)), this.pos + 4), this.pos += 8;\n },\n writeSFixed64: function writeSFixed64(t) {\n this.realloc(8), fu(this.buf, -1 & t, this.pos), fu(this.buf, Math.floor(t * (1 / 4294967296)), this.pos + 4), this.pos += 8;\n },\n writeVarint: function writeVarint(t) {\n (t = +t || 0) > 268435455 || t < 0 ? function (t, e) {\n var r, n;\n if (t >= 0 ? (r = t % 4294967296 | 0, n = t / 4294967296 | 0) : (n = ~(-t / 4294967296), 4294967295 ^ (r = ~(-t % 4294967296)) ? r = r + 1 | 0 : (r = 0, n = n + 1 | 0)), t >= 0x10000000000000000 || t < -0x10000000000000000) throw new Error("Given varint doesn\'t fit into 10 bytes");\n e.realloc(10), function (t, e, r) {\n r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, t >>>= 7, r.buf[r.pos++] = 127 & t | 128, r.buf[r.pos] = 127 & (t >>>= 7);\n }(r, 0, e), function (t, e) {\n var r = (7 & t) << 4;\n e.buf[e.pos++] |= r | ((t >>>= 3) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t | ((t >>>= 7) ? 128 : 0), t && (e.buf[e.pos++] = 127 & t)))));\n }(n, e);\n }(t, this) : (this.realloc(4), this.buf[this.pos++] = 127 & t | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = 127 & (t >>>= 7) | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = 127 & (t >>>= 7) | (t > 127 ? 128 : 0), t <= 127 || (this.buf[this.pos++] = t >>> 7 & 127))));\n },\n writeSVarint: function writeSVarint(t) {\n this.writeVarint(t < 0 ? 2 * -t - 1 : 2 * t);\n },\n writeBoolean: function writeBoolean(t) {\n this.writeVarint(Boolean(t));\n },\n writeString: function writeString(t) {\n t = String(t), this.realloc(4 * t.length), this.pos++;\n var e = this.pos;\n\n this.pos = function (t, e, r) {\n for (var n, i, a = 0; a < e.length; a++) {\n if ((n = e.charCodeAt(a)) > 55295 && n < 57344) {\n if (!i) {\n n > 56319 || a + 1 === e.length ? (t[r++] = 239, t[r++] = 191, t[r++] = 189) : i = n;\n continue;\n }\n\n if (n < 56320) {\n t[r++] = 239, t[r++] = 191, t[r++] = 189, i = n;\n continue;\n }\n\n n = i - 55296 << 10 | n - 56320 | 65536, i = null;\n } else i && (t[r++] = 239, t[r++] = 191, t[r++] = 189, i = null);\n\n n < 128 ? t[r++] = n : (n < 2048 ? t[r++] = n >> 6 | 192 : (n < 65536 ? t[r++] = n >> 12 | 224 : (t[r++] = n >> 18 | 240, t[r++] = n >> 12 & 63 | 128), t[r++] = n >> 6 & 63 | 128), t[r++] = 63 & n | 128);\n }\n\n return r;\n }(this.buf, t, this.pos);\n\n var r = this.pos - e;\n r >= 128 && ru(e, r, this), this.pos = e - 1, this.writeVarint(r), this.pos += r;\n },\n writeFloat: function writeFloat(t) {\n this.realloc(4), Ys(this.buf, t, this.pos, !0, 23, 4), this.pos += 4;\n },\n writeDouble: function writeDouble(t) {\n this.realloc(8), Ys(this.buf, t, this.pos, !0, 52, 8), this.pos += 8;\n },\n writeBytes: function writeBytes(t) {\n var e = t.length;\n this.writeVarint(e), this.realloc(e);\n\n for (var r = 0; r < e; r++) {\n this.buf[this.pos++] = t[r];\n }\n },\n writeRawMessage: function writeRawMessage(t, e) {\n this.pos++;\n var r = this.pos;\n t(e, this);\n var n = this.pos - r;\n n >= 128 && ru(r, n, this), this.pos = r - 1, this.writeVarint(n), this.pos += n;\n },\n writeMessage: function writeMessage(t, e, r) {\n this.writeTag(t, Ws.Bytes), this.writeRawMessage(e, r);\n },\n writePackedVarint: function writePackedVarint(t, e) {\n e.length && this.writeMessage(t, nu, e);\n },\n writePackedSVarint: function writePackedSVarint(t, e) {\n e.length && this.writeMessage(t, iu, e);\n },\n writePackedBoolean: function writePackedBoolean(t, e) {\n e.length && this.writeMessage(t, su, e);\n },\n writePackedFloat: function writePackedFloat(t, e) {\n e.length && this.writeMessage(t, au, e);\n },\n writePackedDouble: function writePackedDouble(t, e) {\n e.length && this.writeMessage(t, ou, e);\n },\n writePackedFixed32: function writePackedFixed32(t, e) {\n e.length && this.writeMessage(t, uu, e);\n },\n writePackedSFixed32: function writePackedSFixed32(t, e) {\n e.length && this.writeMessage(t, lu, e);\n },\n writePackedFixed64: function writePackedFixed64(t, e) {\n e.length && this.writeMessage(t, pu, e);\n },\n writePackedSFixed64: function writePackedSFixed64(t, e) {\n e.length && this.writeMessage(t, cu, e);\n },\n writeBytesField: function writeBytesField(t, e) {\n this.writeTag(t, Ws.Bytes), this.writeBytes(e);\n },\n writeFixed32Field: function writeFixed32Field(t, e) {\n this.writeTag(t, Ws.Fixed32), this.writeFixed32(e);\n },\n writeSFixed32Field: function writeSFixed32Field(t, e) {\n this.writeTag(t, Ws.Fixed32), this.writeSFixed32(e);\n },\n writeFixed64Field: function writeFixed64Field(t, e) {\n this.writeTag(t, Ws.Fixed64), this.writeFixed64(e);\n },\n writeSFixed64Field: function writeSFixed64Field(t, e) {\n this.writeTag(t, Ws.Fixed64), this.writeSFixed64(e);\n },\n writeVarintField: function writeVarintField(t, e) {\n this.writeTag(t, Ws.Varint), this.writeVarint(e);\n },\n writeSVarintField: function writeSVarintField(t, e) {\n this.writeTag(t, Ws.Varint), this.writeSVarint(e);\n },\n writeStringField: function writeStringField(t, e) {\n this.writeTag(t, Ws.Bytes), this.writeString(e);\n },\n writeFloatField: function writeFloatField(t, e) {\n this.writeTag(t, Ws.Fixed32), this.writeFloat(e);\n },\n writeDoubleField: function writeDoubleField(t, e) {\n this.writeTag(t, Ws.Fixed64), this.writeDouble(e);\n },\n writeBooleanField: function writeBooleanField(t, e) {\n this.writeVarintField(t, Boolean(e));\n }\n };\n\n var xu = function xu(t, e) {\n var r = e.pixelRatio,\n n = e.version,\n i = e.stretchX,\n a = e.stretchY,\n o = e.content;\n this.paddedRect = t, this.pixelRatio = r, this.stretchX = i, this.stretchY = a, this.content = o, this.version = n;\n },\n bu = {\n tl: {\n configurable: !0\n },\n br: {\n configurable: !0\n },\n tlbr: {\n configurable: !0\n },\n displaySize: {\n configurable: !0\n }\n };\n\n bu.tl.get = function () {\n return [this.paddedRect.x + 1, this.paddedRect.y + 1];\n }, bu.br.get = function () {\n return [this.paddedRect.x + this.paddedRect.w - 1, this.paddedRect.y + this.paddedRect.h - 1];\n }, bu.tlbr.get = function () {\n return this.tl.concat(this.br);\n }, bu.displaySize.get = function () {\n return [(this.paddedRect.w - 2) / this.pixelRatio, (this.paddedRect.h - 2) / this.pixelRatio];\n }, Object.defineProperties(xu.prototype, bu);\n\n var wu = function wu(t, e) {\n var r = {},\n n = {};\n this.haveRenderCallbacks = [];\n var i = [];\n this.addImages(t, r, i), this.addImages(e, n, i);\n var a = gu(i),\n o = new bo({\n width: a.w || 1,\n height: a.h || 1\n });\n\n for (var s in t) {\n var u = t[s],\n l = r[s].paddedRect;\n bo.copy(u.data, o, {\n x: 0,\n y: 0\n }, {\n x: l.x + 1,\n y: l.y + 1\n }, u.data);\n }\n\n for (var p in e) {\n var c = e[p],\n h = n[p].paddedRect,\n f = h.x + 1,\n y = h.y + 1,\n d = c.data.width,\n m = c.data.height;\n bo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f,\n y: y\n }, c.data), bo.copy(c.data, o, {\n x: 0,\n y: m - 1\n }, {\n x: f,\n y: y - 1\n }, {\n width: d,\n height: 1\n }), bo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f,\n y: y + m\n }, {\n width: d,\n height: 1\n }), bo.copy(c.data, o, {\n x: d - 1,\n y: 0\n }, {\n x: f - 1,\n y: y\n }, {\n width: 1,\n height: m\n }), bo.copy(c.data, o, {\n x: 0,\n y: 0\n }, {\n x: f + d,\n y: y\n }, {\n width: 1,\n height: m\n });\n }\n\n this.image = o, this.iconPositions = r, this.patternPositions = n;\n };\n\n wu.prototype.addImages = function (t, e, r) {\n for (var n in t) {\n var i = t[n],\n a = {\n x: 0,\n y: 0,\n w: i.data.width + 2,\n h: i.data.height + 2\n };\n r.push(a), e[n] = new xu(a, i), i.hasRenderCallback && this.haveRenderCallbacks.push(n);\n }\n }, wu.prototype.patchUpdatedImages = function (t, e) {\n for (var r in t.dispatchRenderCallbacks(this.haveRenderCallbacks), t.updatedImages) {\n this.patchUpdatedImage(this.iconPositions[r], t.getImage(r), e), this.patchUpdatedImage(this.patternPositions[r], t.getImage(r), e);\n }\n }, wu.prototype.patchUpdatedImage = function (t, e, r) {\n if (t && e && t.version !== e.version) {\n t.version = e.version;\n var n = t.tl;\n r.update(e.data, void 0, {\n x: n[0],\n y: n[1]\n });\n }\n }, On("ImagePosition", xu), On("ImageAtlas", wu);\n\n var _u = {\n horizontal: 1,\n vertical: 2,\n horizontalOnly: 3\n },\n Au = function Au() {\n this.scale = 1, this.fontStack = "", this.imageName = null;\n };\n\n Au.forText = function (t, e) {\n var r = new Au();\n return r.scale = t || 1, r.fontStack = e, r;\n }, Au.forImage = function (t) {\n var e = new Au();\n return e.imageName = t, e;\n };\n\n var Su = function Su() {\n this.text = "", this.sectionIndex = [], this.sections = [], this.imageSectionID = null;\n };\n\n function ku(t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d) {\n var m,\n v = Su.fromFeature(t, i);\n c === _u.vertical && v.verticalizePunctuation();\n var g = si.processBidirectionalText,\n x = si.processStyledBidirectionalText;\n\n if (g && 1 === v.sections.length) {\n m = [];\n\n for (var b = 0, w = g(v.toString(), Bu(v, l, a, e, n, f, y)); b < w.length; b += 1) {\n var _ = w[b],\n A = new Su();\n A.text = _, A.sections = v.sections;\n\n for (var S = 0; S < _.length; S++) {\n A.sectionIndex.push(0);\n }\n\n m.push(A);\n }\n } else if (x) {\n m = [];\n\n for (var k = 0, I = x(v.text, v.sectionIndex, Bu(v, l, a, e, n, f, y)); k < I.length; k += 1) {\n var z = I[k],\n C = new Su();\n C.text = z[0], C.sectionIndex = z[1], C.sections = v.sections, m.push(C);\n }\n } else m = function (t, e) {\n for (var r = [], n = t.text, i = 0, a = 0, o = e; a < o.length; a += 1) {\n var s = o[a];\n r.push(t.substring(i, s)), i = s;\n }\n\n return i < n.length && r.push(t.substring(i, n.length)), r;\n }(v, Bu(v, l, a, e, n, f, y));\n\n var E = [],\n P = {\n positionedLines: E,\n text: v.toString(),\n top: p[1],\n bottom: p[1],\n left: p[0],\n right: p[0],\n writingMode: c,\n iconsInText: !1,\n verticalizable: !1\n };\n return function (t, e, r, n, i, a, o, s, u, l, p, c) {\n for (var h = 0, f = -17, y = 0, d = 0, m = "right" === s ? 1 : "left" === s ? 0 : .5, v = 0, g = 0, x = i; g < x.length; g += 1) {\n var b = x[g];\n b.trim();\n\n var w = b.getMaxScale(),\n _ = 24 * (w - 1),\n A = {\n positionedGlyphs: [],\n lineOffset: 0\n };\n\n t.positionedLines[v] = A;\n var S = A.positionedGlyphs,\n k = 0;\n\n if (b.length()) {\n for (var I = 0; I < b.length(); I++) {\n var z = b.getSection(I),\n C = b.getSectionIndex(I),\n E = b.getCharCode(I),\n P = 0,\n M = null,\n B = null,\n T = null,\n V = 24,\n F = !(u === _u.horizontal || !p && !Jn(E) || p && (Iu[E] || (K = E, Zn.Arabic(K) || Zn["Arabic Supplement"](K) || Zn["Arabic Extended-A"](K) || Zn["Arabic Presentation Forms-A"](K) || Zn["Arabic Presentation Forms-B"](K))));\n\n if (z.imageName) {\n var D = n[z.imageName];\n if (!D) continue;\n T = z.imageName, t.iconsInText = t.iconsInText || !0, B = D.paddedRect;\n var L = D.displaySize;\n z.scale = 24 * z.scale / c, P = _ + (24 - L[1] * z.scale), V = (M = {\n width: L[0],\n height: L[1],\n left: 1,\n top: -3,\n advance: F ? L[1] : L[0]\n }).advance;\n var R = F ? L[0] * z.scale - 24 * w : L[1] * z.scale - 24 * w;\n R > 0 && R > k && (k = R);\n } else {\n var O = r[z.fontStack],\n U = O && O[E];\n if (U && U.rect) B = U.rect, M = U.metrics;else {\n var j = e[z.fontStack],\n q = j && j[E];\n if (!q) continue;\n M = q.metrics;\n }\n P = 24 * (w - z.scale);\n }\n\n F ? (t.verticalizable = !0, S.push({\n glyph: E,\n imageName: T,\n x: h,\n y: f + P,\n vertical: F,\n scale: z.scale,\n fontStack: z.fontStack,\n sectionIndex: C,\n metrics: M,\n rect: B\n }), h += V * z.scale + l) : (S.push({\n glyph: E,\n imageName: T,\n x: h,\n y: f + P,\n vertical: F,\n scale: z.scale,\n fontStack: z.fontStack,\n sectionIndex: C,\n metrics: M,\n rect: B\n }), h += M.advance * z.scale + l);\n }\n\n 0 !== S.length && (y = Math.max(h - l, y), Vu(S, 0, S.length - 1, m, k)), h = 0;\n var N = a * w + k;\n A.lineOffset = Math.max(k, _), f += N, d = Math.max(N, d), ++v;\n } else f += a, ++v;\n }\n\n var K,\n G = f - -17,\n Z = Tu(o),\n X = Z.horizontalAlign,\n J = Z.verticalAlign;\n (function (t, e, r, n, i, a, o, s, u) {\n var l,\n p = (e - r) * i;\n l = a !== o ? -s * n - -17 : (-n * u + .5) * o;\n\n for (var c = 0, h = t; c < h.length; c += 1) {\n for (var f = 0, y = h[c].positionedGlyphs; f < y.length; f += 1) {\n var d = y[f];\n d.x += p, d.y += l;\n }\n }\n })(t.positionedLines, m, X, J, y, d, a, G, i.length), t.top += -J * G, t.bottom = t.top + G, t.left += -X * y, t.right = t.left + y;\n }(P, e, r, n, m, o, s, u, c, l, h, d), !function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (0 !== r[e].positionedGlyphs.length) return !1;\n }\n\n return !0;\n }(E) && P;\n }\n\n Su.fromFeature = function (t, e) {\n for (var r = new Su(), n = 0; n < t.sections.length; n++) {\n var i = t.sections[n];\n i.image ? r.addImageSection(i) : r.addTextSection(i, e);\n }\n\n return r;\n }, Su.prototype.length = function () {\n return this.text.length;\n }, Su.prototype.getSection = function (t) {\n return this.sections[this.sectionIndex[t]];\n }, Su.prototype.getSectionIndex = function (t) {\n return this.sectionIndex[t];\n }, Su.prototype.getCharCode = function (t) {\n return this.text.charCodeAt(t);\n }, Su.prototype.verticalizePunctuation = function () {\n this.text = function (t) {\n for (var e = "", r = 0; r < t.length; r++) {\n var n = t.charCodeAt(r + 1) || null,\n i = t.charCodeAt(r - 1) || null;\n e += n && Hn(n) && !Js[t[r + 1]] || i && Hn(i) && !Js[t[r - 1]] || !Js[t[r]] ? t[r] : Js[t[r]];\n }\n\n return e;\n }(this.text);\n }, Su.prototype.trim = function () {\n for (var t = 0, e = 0; e < this.text.length && Iu[this.text.charCodeAt(e)]; e++) {\n t++;\n }\n\n for (var r = this.text.length, n = this.text.length - 1; n >= 0 && n >= t && Iu[this.text.charCodeAt(n)]; n--) {\n r--;\n }\n\n this.text = this.text.substring(t, r), this.sectionIndex = this.sectionIndex.slice(t, r);\n }, Su.prototype.substring = function (t, e) {\n var r = new Su();\n return r.text = this.text.substring(t, e), r.sectionIndex = this.sectionIndex.slice(t, e), r.sections = this.sections, r;\n }, Su.prototype.toString = function () {\n return this.text;\n }, Su.prototype.getMaxScale = function () {\n var t = this;\n return this.sectionIndex.reduce(function (e, r) {\n return Math.max(e, t.sections[r].scale);\n }, 0);\n }, Su.prototype.addTextSection = function (t, e) {\n this.text += t.text, this.sections.push(Au.forText(t.scale, t.fontStack || e));\n\n for (var r = this.sections.length - 1, n = 0; n < t.text.length; ++n) {\n this.sectionIndex.push(r);\n }\n }, Su.prototype.addImageSection = function (t) {\n var e = t.image ? t.image.name : "";\n\n if (0 !== e.length) {\n var r = this.getNextImageSectionCharCode();\n r ? (this.text += String.fromCharCode(r), this.sections.push(Au.forImage(e)), this.sectionIndex.push(this.sections.length - 1)) : A("Reached maximum number of images 6401");\n } else A("Can\'t add FormattedSection with an empty image.");\n }, Su.prototype.getNextImageSectionCharCode = function () {\n return this.imageSectionID ? this.imageSectionID >= 63743 ? null : ++this.imageSectionID : (this.imageSectionID = 57344, this.imageSectionID);\n };\n var Iu = {\n 9: !0,\n 10: !0,\n 11: !0,\n 12: !0,\n 13: !0,\n 32: !0\n },\n zu = {};\n\n function Cu(t, e, r, n, i, a) {\n if (e.imageName) {\n var o = n[e.imageName];\n return o ? o.displaySize[0] * e.scale * 24 / a + i : 0;\n }\n\n var s = r[e.fontStack],\n u = s && s[t];\n return u ? u.metrics.advance * e.scale + i : 0;\n }\n\n function Eu(t, e, r, n) {\n var i = Math.pow(t - e, 2);\n return n ? t < e ? i / 2 : 2 * i : i + Math.abs(r) * r;\n }\n\n function Pu(t, e, r) {\n var n = 0;\n return 10 === t && (n -= 1e4), r && (n += 150), 40 !== t && 65288 !== t || (n += 50), 41 !== e && 65289 !== e || (n += 50), n;\n }\n\n function Mu(t, e, r, n, i, a) {\n for (var o = null, s = Eu(e, r, i, a), u = 0, l = n; u < l.length; u += 1) {\n var p = l[u],\n c = Eu(e - p.x, r, i, a) + p.badness;\n c <= s && (o = p, s = c);\n }\n\n return {\n index: t,\n x: e,\n priorBreak: o,\n badness: s\n };\n }\n\n function Bu(t, e, r, n, i, a, o) {\n if ("point" !== a) return [];\n if (!t) return [];\n\n for (var s, u = [], l = function (t, e, r, n, i, a) {\n for (var o = 0, s = 0; s < t.length(); s++) {\n var u = t.getSection(s);\n o += Cu(t.getCharCode(s), u, n, i, e, a);\n }\n\n return o / Math.max(1, Math.ceil(o / r));\n }(t, e, r, n, i, o), p = t.text.indexOf("​") >= 0, c = 0, h = 0; h < t.length(); h++) {\n var f = t.getSection(h),\n y = t.getCharCode(h);\n\n if (Iu[y] || (c += Cu(y, f, n, i, e, o)), h < t.length() - 1) {\n var d = !((s = y) < 11904 || !(Zn["Bopomofo Extended"](s) || Zn.Bopomofo(s) || Zn["CJK Compatibility Forms"](s) || Zn["CJK Compatibility Ideographs"](s) || Zn["CJK Compatibility"](s) || Zn["CJK Radicals Supplement"](s) || Zn["CJK Strokes"](s) || Zn["CJK Symbols and Punctuation"](s) || Zn["CJK Unified Ideographs Extension A"](s) || Zn["CJK Unified Ideographs"](s) || Zn["Enclosed CJK Letters and Months"](s) || Zn["Halfwidth and Fullwidth Forms"](s) || Zn.Hiragana(s) || Zn["Ideographic Description Characters"](s) || Zn["Kangxi Radicals"](s) || Zn["Katakana Phonetic Extensions"](s) || Zn.Katakana(s) || Zn["Vertical Forms"](s) || Zn["Yi Radicals"](s) || Zn["Yi Syllables"](s)));\n (zu[y] || d || f.imageName) && u.push(Mu(h + 1, c, l, u, Pu(y, t.getCharCode(h + 1), d && p), !1));\n }\n }\n\n return function t(e) {\n return e ? t(e.priorBreak).concat(e.index) : [];\n }(Mu(t.length(), c, l, u, 0, !0));\n }\n\n function Tu(t) {\n var e = .5,\n r = .5;\n\n switch (t) {\n case "right":\n case "top-right":\n case "bottom-right":\n e = 1;\n break;\n\n case "left":\n case "top-left":\n case "bottom-left":\n e = 0;\n }\n\n switch (t) {\n case "bottom":\n case "bottom-right":\n case "bottom-left":\n r = 1;\n break;\n\n case "top":\n case "top-right":\n case "top-left":\n r = 0;\n }\n\n return {\n horizontalAlign: e,\n verticalAlign: r\n };\n }\n\n function Vu(t, e, r, n, i) {\n if (n || i) for (var a = t[r], o = (t[r].x + a.metrics.advance * a.scale) * n, s = e; s <= r; s++) {\n t[s].x -= o, t[s].y += i;\n }\n }\n\n function Fu(t, e, r, n, i, a) {\n var o,\n s = t.image;\n\n if (s.content) {\n var u = s.content,\n l = s.pixelRatio || 1;\n o = [u[0] / l, u[1] / l, s.displaySize[0] - u[2] / l, s.displaySize[1] - u[3] / l];\n }\n\n var p,\n c,\n h,\n f,\n y = e.left * a,\n d = e.right * a;\n "width" === r || "both" === r ? (f = i[0] + y - n[3], c = i[0] + d + n[1]) : c = (f = i[0] + (y + d - s.displaySize[0]) / 2) + s.displaySize[0];\n var m = e.top * a,\n v = e.bottom * a;\n return "height" === r || "both" === r ? (p = i[1] + m - n[0], h = i[1] + v + n[2]) : h = (p = i[1] + (m + v - s.displaySize[1]) / 2) + s.displaySize[1], {\n image: s,\n top: p,\n right: c,\n bottom: h,\n left: f,\n collisionPadding: o\n };\n }\n\n zu[10] = !0, zu[32] = !0, zu[38] = !0, zu[40] = !0, zu[41] = !0, zu[43] = !0, zu[45] = !0, zu[47] = !0, zu[173] = !0, zu[183] = !0, zu[8203] = !0, zu[8208] = !0, zu[8211] = !0, zu[8231] = !0;\n\n var Du = function (t) {\n function e(e, r, n, i) {\n t.call(this, e, r), this.angle = n, void 0 !== i && (this.segment = i);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.clone = function () {\n return new e(this.x, this.y, this.angle, this.segment);\n }, e;\n }(i);\n\n function Lu(t, e) {\n var r = e.expression;\n if ("constant" === r.kind) return {\n kind: "constant",\n layoutSize: r.evaluate(new ui(t + 1))\n };\n if ("source" === r.kind) return {\n kind: "source"\n };\n\n for (var n = r.zoomStops, i = r.interpolationType, a = 0; a < n.length && n[a] <= t;) {\n a++;\n }\n\n for (var o = a = Math.max(0, a - 1); o < n.length && n[o] < t + 1;) {\n o++;\n }\n\n o = Math.min(n.length - 1, o);\n var s = n[a],\n u = n[o];\n return "composite" === r.kind ? {\n kind: "composite",\n minZoom: s,\n maxZoom: u,\n interpolationType: i\n } : {\n kind: "camera",\n minZoom: s,\n maxZoom: u,\n minSize: r.evaluate(new ui(s)),\n maxSize: r.evaluate(new ui(u)),\n interpolationType: i\n };\n }\n\n function Ru(t, e, r) {\n var n = e.uSize,\n i = r.lowerSize;\n return "source" === t.kind ? i / 128 : "composite" === t.kind ? Ge(i / 128, r.upperSize / 128, e.uSizeT) : n;\n }\n\n function Ou(t, e) {\n var r = 0,\n n = 0;\n if ("constant" === t.kind) n = t.layoutSize;else if ("source" !== t.kind) {\n var i = t.interpolationType,\n a = i ? p(or.interpolationFactor(i, e, t.minZoom, t.maxZoom), 0, 1) : 0;\n "camera" === t.kind ? n = Ge(t.minSize, t.maxSize, a) : r = a;\n }\n return {\n uSizeT: r,\n uSize: n\n };\n }\n\n On("Anchor", Du);\n var Uu = Object.freeze({\n __proto__: null,\n getSizeData: Lu,\n evaluateSizeForFeature: Ru,\n evaluateSizeForZoom: Ou,\n SIZE_PACK_FACTOR: 128\n });\n\n function ju(t, e, r, n, i) {\n if (void 0 === e.segment) return !0;\n\n for (var a = e, o = e.segment + 1, s = 0; s > -r / 2;) {\n if (--o < 0) return !1;\n s -= t[o].dist(a), a = t[o];\n }\n\n s += t[o].dist(t[o + 1]), o++;\n\n for (var u = [], l = 0; s < r / 2;) {\n var p = t[o],\n c = t[o + 1];\n if (!c) return !1;\n var h = t[o - 1].angleTo(p) - p.angleTo(c);\n\n for (h = Math.abs((h + 3 * Math.PI) % (2 * Math.PI) - Math.PI), u.push({\n distance: s,\n angleDelta: h\n }), l += h; s - u[0].distance > n;) {\n l -= u.shift().angleDelta;\n }\n\n if (l > i) return !1;\n o++, s += p.dist(c);\n }\n\n return !0;\n }\n\n function qu(t) {\n for (var e = 0, r = 0; r < t.length - 1; r++) {\n e += t[r].dist(t[r + 1]);\n }\n\n return e;\n }\n\n function Nu(t, e, r) {\n return t ? .6 * e * r : 0;\n }\n\n function Ku(t, e) {\n return Math.max(t ? t.right - t.left : 0, e ? e.right - e.left : 0);\n }\n\n function Gu(t, e, r, n, i, a) {\n for (var o = Nu(r, i, a), s = Ku(r, n) * a, u = 0, l = qu(t) / 2, p = 0; p < t.length - 1; p++) {\n var c = t[p],\n h = t[p + 1],\n f = c.dist(h);\n\n if (u + f > l) {\n var y = (l - u) / f,\n d = Ge(c.x, h.x, y),\n m = Ge(c.y, h.y, y),\n v = new Du(d, m, h.angleTo(c), p);\n return v._round(), !o || ju(t, v, s, o, e) ? v : void 0;\n }\n\n u += f;\n }\n }\n\n function Zu(t, e, r, n, i, a, o, s, u) {\n var l = Nu(n, a, o),\n p = Ku(n, i),\n c = p * o,\n h = 0 === t[0].x || t[0].x === u || 0 === t[0].y || t[0].y === u;\n return e - c < e / 4 && (e = c + e / 4), function t(e, r, n, i, a, o, s, u, l) {\n for (var p = o / 2, c = qu(e), h = 0, f = r - n, y = [], d = 0; d < e.length - 1; d++) {\n for (var m = e[d], v = e[d + 1], g = m.dist(v), x = v.angleTo(m); f + n < h + g;) {\n var b = ((f += n) - h) / g,\n w = Ge(m.x, v.x, b),\n _ = Ge(m.y, v.y, b);\n\n if (w >= 0 && w < l && _ >= 0 && _ < l && f - p >= 0 && f + p <= c) {\n var A = new Du(w, _, x, d);\n A._round(), i && !ju(e, A, o, i, a) || y.push(A);\n }\n }\n\n h += g;\n }\n\n return u || y.length || s || (y = t(e, h / 2, n, i, a, o, s, !0, l)), y;\n }(t, h ? e / 2 * s % e : (p / 2 + 2 * a) * o * s % e, e, l, r, c, h, !1, u);\n }\n\n function Xu(t, e, r, n, a) {\n for (var o = [], s = 0; s < t.length; s++) {\n for (var u = t[s], l = void 0, p = 0; p < u.length - 1; p++) {\n var c = u[p],\n h = u[p + 1];\n c.x < e && h.x < e || (c.x < e ? c = new i(e, c.y + (e - c.x) / (h.x - c.x) * (h.y - c.y))._round() : h.x < e && (h = new i(e, c.y + (e - c.x) / (h.x - c.x) * (h.y - c.y))._round()), c.y < r && h.y < r || (c.y < r ? c = new i(c.x + (r - c.y) / (h.y - c.y) * (h.x - c.x), r)._round() : h.y < r && (h = new i(c.x + (r - c.y) / (h.y - c.y) * (h.x - c.x), r)._round()), c.x >= n && h.x >= n || (c.x >= n ? c = new i(n, c.y + (n - c.x) / (h.x - c.x) * (h.y - c.y))._round() : h.x >= n && (h = new i(n, c.y + (n - c.x) / (h.x - c.x) * (h.y - c.y))._round()), c.y >= a && h.y >= a || (c.y >= a ? c = new i(c.x + (a - c.y) / (h.y - c.y) * (h.x - c.x), a)._round() : h.y >= a && (h = new i(c.x + (a - c.y) / (h.y - c.y) * (h.x - c.x), a)._round()), l && c.equals(l[l.length - 1]) || o.push(l = [c]), l.push(h)))));\n }\n }\n\n return o;\n }\n\n function Ju(t, e, r, n) {\n var a = [],\n o = t.image,\n s = o.pixelRatio,\n u = o.paddedRect.w - 2,\n l = o.paddedRect.h - 2,\n p = t.right - t.left,\n c = t.bottom - t.top,\n h = o.stretchX || [[0, u]],\n f = o.stretchY || [[0, l]],\n y = function y(t, e) {\n return t + e[1] - e[0];\n },\n d = h.reduce(y, 0),\n m = f.reduce(y, 0),\n v = u - d,\n g = l - m,\n x = 0,\n b = d,\n w = 0,\n _ = m,\n A = 0,\n S = v,\n k = 0,\n I = g;\n\n if (o.content && n) {\n var z = o.content;\n x = Hu(h, 0, z[0]), w = Hu(f, 0, z[1]), b = Hu(h, z[0], z[2]), _ = Hu(f, z[1], z[3]), A = z[0] - x, k = z[1] - w, S = z[2] - z[0] - b, I = z[3] - z[1] - _;\n }\n\n var C = function C(n, a, u, l) {\n var h = $u(n.stretch - x, b, p, t.left),\n f = Wu(n.fixed - A, S, n.stretch, d),\n y = $u(a.stretch - w, _, c, t.top),\n v = Wu(a.fixed - k, I, a.stretch, m),\n g = $u(u.stretch - x, b, p, t.left),\n z = Wu(u.fixed - A, S, u.stretch, d),\n C = $u(l.stretch - w, _, c, t.top),\n E = Wu(l.fixed - k, I, l.stretch, m),\n P = new i(h, y),\n M = new i(g, y),\n B = new i(g, C),\n T = new i(h, C),\n V = new i(f / s, v / s),\n F = new i(z / s, E / s),\n D = e * Math.PI / 180;\n\n if (D) {\n var L = Math.sin(D),\n R = Math.cos(D),\n O = [R, -L, L, R];\n P._matMult(O), M._matMult(O), T._matMult(O), B._matMult(O);\n }\n\n var U = n.stretch + n.fixed,\n j = a.stretch + a.fixed;\n return {\n tl: P,\n tr: M,\n bl: T,\n br: B,\n tex: {\n x: o.paddedRect.x + 1 + U,\n y: o.paddedRect.y + 1 + j,\n w: u.stretch + u.fixed - U,\n h: l.stretch + l.fixed - j\n },\n writingMode: void 0,\n glyphOffset: [0, 0],\n sectionIndex: 0,\n pixelOffsetTL: V,\n pixelOffsetBR: F,\n minFontScaleX: S / s / p,\n minFontScaleY: I / s / c,\n isSDF: r\n };\n };\n\n if (n && (o.stretchX || o.stretchY)) for (var E = Yu(h, v, d), P = Yu(f, g, m), M = 0; M < E.length - 1; M++) {\n for (var B = E[M], T = E[M + 1], V = 0; V < P.length - 1; V++) {\n a.push(C(B, P[V], T, P[V + 1]));\n }\n } else a.push(C({\n fixed: 0,\n stretch: -1\n }, {\n fixed: 0,\n stretch: -1\n }, {\n fixed: 0,\n stretch: u + 1\n }, {\n fixed: 0,\n stretch: l + 1\n }));\n return a;\n }\n\n function Hu(t, e, r) {\n for (var n = 0, i = 0, a = t; i < a.length; i += 1) {\n var o = a[i];\n n += Math.max(e, Math.min(r, o[1])) - Math.max(e, Math.min(r, o[0]));\n }\n\n return n;\n }\n\n function Yu(t, e, r) {\n for (var n = [{\n fixed: -1,\n stretch: 0\n }], i = 0, a = t; i < a.length; i += 1) {\n var o = a[i],\n s = o[0],\n u = o[1],\n l = n[n.length - 1];\n n.push({\n fixed: s - l.stretch,\n stretch: l.stretch\n }), n.push({\n fixed: s - l.stretch,\n stretch: l.stretch + (u - s)\n });\n }\n\n return n.push({\n fixed: e + 1,\n stretch: r\n }), n;\n }\n\n function $u(t, e, r, n) {\n return t / e * r + n;\n }\n\n function Wu(t, e, r, n) {\n return t - e * r / n;\n }\n\n var Qu = function Qu(t, e, r, n, a, o, s, u, l, p) {\n if (this.boxStartIndex = t.length, l) {\n var c = o.top,\n h = o.bottom,\n f = o.collisionPadding;\n f && (c -= f[1], h += f[3]);\n var y = h - c;\n y > 0 && (y = Math.max(10, y), this.circleDiameter = y);\n } else {\n var d = o.top * s - u,\n m = o.bottom * s + u,\n v = o.left * s - u,\n g = o.right * s + u,\n x = o.collisionPadding;\n\n if (x && (v -= x[0] * s, d -= x[1] * s, g += x[2] * s, m += x[3] * s), p) {\n var b = new i(v, d),\n w = new i(g, d),\n _ = new i(v, m),\n A = new i(g, m),\n S = p * Math.PI / 180;\n\n b._rotate(S), w._rotate(S), _._rotate(S), A._rotate(S), v = Math.min(b.x, w.x, _.x, A.x), g = Math.max(b.x, w.x, _.x, A.x), d = Math.min(b.y, w.y, _.y, A.y), m = Math.max(b.y, w.y, _.y, A.y);\n }\n\n t.emplaceBack(e.x, e.y, v, d, g, m, r, n, a);\n }\n\n this.boxEndIndex = t.length;\n },\n tl = function tl(t, e) {\n if (void 0 === t && (t = []), void 0 === e && (e = el), this.data = t, this.length = this.data.length, this.compare = e, this.length > 0) for (var r = (this.length >> 1) - 1; r >= 0; r--) {\n this._down(r);\n }\n };\n\n function el(t, e) {\n return t < e ? -1 : t > e ? 1 : 0;\n }\n\n function rl(t, e, r) {\n void 0 === e && (e = 1), void 0 === r && (r = !1);\n\n for (var n = 1 / 0, a = 1 / 0, o = -1 / 0, s = -1 / 0, u = t[0], l = 0; l < u.length; l++) {\n var p = u[l];\n (!l || p.x < n) && (n = p.x), (!l || p.y < a) && (a = p.y), (!l || p.x > o) && (o = p.x), (!l || p.y > s) && (s = p.y);\n }\n\n var c = Math.min(o - n, s - a),\n h = c / 2,\n f = new tl([], nl);\n if (0 === c) return new i(n, a);\n\n for (var y = n; y < o; y += c) {\n for (var d = a; d < s; d += c) {\n f.push(new il(y + h, d + h, h, t));\n }\n }\n\n for (var m = function (t) {\n for (var e = 0, r = 0, n = 0, i = t[0], a = 0, o = i.length, s = o - 1; a < o; s = a++) {\n var u = i[a],\n l = i[s],\n p = u.x * l.y - l.x * u.y;\n r += (u.x + l.x) * p, n += (u.y + l.y) * p, e += 3 * p;\n }\n\n return new il(r / e, n / e, 0, t);\n }(t), v = f.length; f.length;) {\n var g = f.pop();\n (g.d > m.d || !m.d) && (m = g, r && console.log("found best %d after %d probes", Math.round(1e4 * g.d) / 1e4, v)), g.max - m.d <= e || (f.push(new il(g.p.x - (h = g.h / 2), g.p.y - h, h, t)), f.push(new il(g.p.x + h, g.p.y - h, h, t)), f.push(new il(g.p.x - h, g.p.y + h, h, t)), f.push(new il(g.p.x + h, g.p.y + h, h, t)), v += 4);\n }\n\n return r && (console.log("num probes: " + v), console.log("best distance: " + m.d)), m.p;\n }\n\n function nl(t, e) {\n return e.max - t.max;\n }\n\n function il(t, e, r, n) {\n this.p = new i(t, e), this.h = r, this.d = function (t, e) {\n for (var r = !1, n = 1 / 0, i = 0; i < e.length; i++) {\n for (var a = e[i], o = 0, s = a.length, u = s - 1; o < s; u = o++) {\n var l = a[o],\n p = a[u];\n l.y > t.y != p.y > t.y && t.x < (p.x - l.x) * (t.y - l.y) / (p.y - l.y) + l.x && (r = !r), n = Math.min(n, $a(t, l, p));\n }\n }\n\n return (r ? 1 : -1) * Math.sqrt(n);\n }(this.p, n), this.max = this.d + this.h * Math.SQRT2;\n }\n\n tl.prototype.push = function (t) {\n this.data.push(t), this.length++, this._up(this.length - 1);\n }, tl.prototype.pop = function () {\n if (0 !== this.length) {\n var t = this.data[0],\n e = this.data.pop();\n return this.length--, this.length > 0 && (this.data[0] = e, this._down(0)), t;\n }\n }, tl.prototype.peek = function () {\n return this.data[0];\n }, tl.prototype._up = function (t) {\n for (var e = this.data, r = this.compare, n = e[t]; t > 0;) {\n var i = t - 1 >> 1,\n a = e[i];\n if (r(n, a) >= 0) break;\n e[t] = a, t = i;\n }\n\n e[t] = n;\n }, tl.prototype._down = function (t) {\n for (var e = this.data, r = this.compare, n = this.length >> 1, i = e[t]; t < n;) {\n var a = 1 + (t << 1),\n o = e[a],\n s = a + 1;\n if (s < this.length && r(e[s], o) < 0 && (a = s, o = e[s]), r(o, i) >= 0) break;\n e[t] = o, t = a;\n }\n\n e[t] = i;\n };\n var al = Number.POSITIVE_INFINITY;\n\n function ol(t, e) {\n return e[1] !== al ? function (t, e, r) {\n var n = 0,\n i = 0;\n\n switch (e = Math.abs(e), r = Math.abs(r), t) {\n case "top-right":\n case "top-left":\n case "top":\n i = r - 7;\n break;\n\n case "bottom-right":\n case "bottom-left":\n case "bottom":\n i = 7 - r;\n }\n\n switch (t) {\n case "top-right":\n case "bottom-right":\n case "right":\n n = -e;\n break;\n\n case "top-left":\n case "bottom-left":\n case "left":\n n = e;\n }\n\n return [n, i];\n }(t, e[0], e[1]) : function (t, e) {\n var r = 0,\n n = 0;\n e < 0 && (e = 0);\n var i = e / Math.sqrt(2);\n\n switch (t) {\n case "top-right":\n case "top-left":\n n = i - 7;\n break;\n\n case "bottom-right":\n case "bottom-left":\n n = 7 - i;\n break;\n\n case "bottom":\n n = 7 - e;\n break;\n\n case "top":\n n = e - 7;\n }\n\n switch (t) {\n case "top-right":\n case "bottom-right":\n r = -i;\n break;\n\n case "top-left":\n case "bottom-left":\n r = i;\n break;\n\n case "left":\n r = e;\n break;\n\n case "right":\n r = -e;\n }\n\n return [r, n];\n }(t, e[0]);\n }\n\n function sl(t) {\n switch (t) {\n case "right":\n case "top-right":\n case "bottom-right":\n return "right";\n\n case "left":\n case "top-left":\n case "bottom-left":\n return "left";\n }\n\n return "center";\n }\n\n function ul(t, e, r, n, a, o, s, u, l, p, c, h, f, y, d) {\n var m = function (t, e, r, n, a, o, s, u) {\n for (var l = n.layout.get("text-rotate").evaluate(o, {}) * Math.PI / 180, p = [], c = 0, h = e.positionedLines; c < h.length; c += 1) {\n for (var f = h[c], y = 0, d = f.positionedGlyphs; y < d.length; y += 1) {\n var m = d[y];\n\n if (m.rect) {\n var v = m.rect || {},\n g = 4,\n x = !0,\n b = 1,\n w = 0,\n _ = (a || u) && m.vertical,\n A = m.metrics.advance * m.scale / 2;\n\n if (u && e.verticalizable && (w = f.lineOffset / 2 - (m.imageName ? -(24 - m.metrics.width * m.scale) / 2 : 24 * (m.scale - 1))), m.imageName) {\n var S = s[m.imageName];\n x = S.sdf, g = 1 / (b = S.pixelRatio);\n }\n\n var k = a ? [m.x + A, m.y] : [0, 0],\n I = a ? [0, 0] : [m.x + A + r[0], m.y + r[1] - w],\n z = [0, 0];\n _ && (z = I, I = [0, 0]);\n var C = (m.metrics.left - g) * m.scale - A + I[0],\n E = (-m.metrics.top - g) * m.scale + I[1],\n P = C + v.w * m.scale / b,\n M = E + v.h * m.scale / b,\n B = new i(C, E),\n T = new i(P, E),\n V = new i(C, M),\n F = new i(P, M);\n\n if (_) {\n var D = new i(-A, A - -17),\n L = -Math.PI / 2,\n R = 12 - A,\n O = new i(22 - R, -(m.imageName ? R : 0)),\n U = new (Function.prototype.bind.apply(i, [null].concat(z)))();\n B._rotateAround(L, D)._add(O)._add(U), T._rotateAround(L, D)._add(O)._add(U), V._rotateAround(L, D)._add(O)._add(U), F._rotateAround(L, D)._add(O)._add(U);\n }\n\n if (l) {\n var j = Math.sin(l),\n q = Math.cos(l),\n N = [q, -j, j, q];\n B._matMult(N), T._matMult(N), V._matMult(N), F._matMult(N);\n }\n\n var K = new i(0, 0),\n G = new i(0, 0);\n p.push({\n tl: B,\n tr: T,\n bl: V,\n br: F,\n tex: v,\n writingMode: e.writingMode,\n glyphOffset: k,\n sectionIndex: m.sectionIndex,\n isSDF: x,\n pixelOffsetTL: K,\n pixelOffsetBR: G,\n minFontScaleX: 0,\n minFontScaleY: 0\n });\n }\n }\n }\n\n return p;\n }(0, r, u, a, o, s, n, t.allowVerticalPlacement),\n v = t.textSizeData,\n g = null;\n\n "source" === v.kind ? (g = [128 * a.layout.get("text-size").evaluate(s, {})])[0] > 32640 && A(t.layerIds[0] + \': Value for "text-size" is >= 255. Reduce your "text-size".\') : "composite" === v.kind && ((g = [128 * y.compositeTextSizes[0].evaluate(s, {}, d), 128 * y.compositeTextSizes[1].evaluate(s, {}, d)])[0] > 32640 || g[1] > 32640) && A(t.layerIds[0] + \': Value for "text-size" is >= 255. Reduce your "text-size".\'), t.addSymbols(t.text, m, g, u, o, s, p, e, l.lineStartIndex, l.lineLength, f, d);\n\n for (var x = 0, b = c; x < b.length; x += 1) {\n h[b[x]] = t.text.placedSymbolArray.length - 1;\n }\n\n return 4 * m.length;\n }\n\n function ll(t) {\n for (var e in t) {\n return t[e];\n }\n\n return null;\n }\n\n function pl(t, e, r, n) {\n var i = t.compareText;\n\n if (e in i) {\n for (var a = i[e], o = a.length - 1; o >= 0; o--) {\n if (n.dist(a[o]) < r) return !0;\n }\n } else i[e] = [];\n\n return i[e].push(n), !1;\n }\n\n var cl = ws.VectorTileFeature.types,\n hl = [{\n name: "a_fade_opacity",\n components: 1,\n type: "Uint8",\n offset: 0\n }];\n\n function fl(t, e, r, n, i, a, o, s, u, l, p, c, h) {\n var f = s ? Math.min(32640, Math.round(s[0])) : 0,\n y = s ? Math.min(32640, Math.round(s[1])) : 0;\n t.emplaceBack(e, r, Math.round(32 * n), Math.round(32 * i), a, o, (f << 1) + (u ? 1 : 0), y, 16 * l, 16 * p, 256 * c, 256 * h);\n }\n\n function yl(t, e, r) {\n t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r), t.emplaceBack(e.x, e.y, r);\n }\n\n function dl(t) {\n for (var e = 0, r = t.sections; e < r.length; e += 1) {\n if (Wn(r[e].text)) return !0;\n }\n\n return !1;\n }\n\n var ml = function ml(t) {\n this.layoutVertexArray = new Fi(), this.indexArray = new qi(), this.programConfigurations = t, this.segments = new ua(), this.dynamicLayoutVertexArray = new Di(), this.opacityVertexArray = new Li(), this.placedSymbolArray = new ta();\n };\n\n ml.prototype.isEmpty = function () {\n return 0 === this.layoutVertexArray.length && 0 === this.indexArray.length && 0 === this.dynamicLayoutVertexArray.length && 0 === this.opacityVertexArray.length;\n }, ml.prototype.upload = function (t, e, r, n) {\n this.isEmpty() || (r && (this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, qs.members), this.indexBuffer = t.createIndexBuffer(this.indexArray, e), this.dynamicLayoutVertexBuffer = t.createVertexBuffer(this.dynamicLayoutVertexArray, Ns.members, !0), this.opacityVertexBuffer = t.createVertexBuffer(this.opacityVertexArray, hl, !0), this.opacityVertexBuffer.itemSize = 1), (r || n) && this.programConfigurations.upload(t));\n }, ml.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.programConfigurations.destroy(), this.segments.destroy(), this.dynamicLayoutVertexBuffer.destroy(), this.opacityVertexBuffer.destroy());\n }, On("SymbolBuffers", ml);\n\n var vl = function vl(t, e, r) {\n this.layoutVertexArray = new t(), this.layoutAttributes = e, this.indexArray = new r(), this.segments = new ua(), this.collisionVertexArray = new ji();\n };\n\n vl.prototype.upload = function (t) {\n this.layoutVertexBuffer = t.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes), this.indexBuffer = t.createIndexBuffer(this.indexArray), this.collisionVertexBuffer = t.createVertexBuffer(this.collisionVertexArray, Ks.members, !0);\n }, vl.prototype.destroy = function () {\n this.layoutVertexBuffer && (this.layoutVertexBuffer.destroy(), this.indexBuffer.destroy(), this.segments.destroy(), this.collisionVertexBuffer.destroy());\n }, On("CollisionBuffers", vl);\n\n var gl = function gl(t) {\n this.collisionBoxArray = t.collisionBoxArray, this.zoom = t.zoom, this.overscaling = t.overscaling, this.layers = t.layers, this.layerIds = this.layers.map(function (t) {\n return t.id;\n }), this.index = t.index, this.pixelRatio = t.pixelRatio, this.sourceLayerIndex = t.sourceLayerIndex, this.hasPattern = !1, this.hasRTLText = !1, this.sortKeyRanges = [], this.collisionCircleArray = [], this.placementInvProjMatrix = so([]), this.placementViewportMatrix = so([]);\n var e = this.layers[0]._unevaluatedLayout._values;\n this.textSizeData = Lu(this.zoom, e["text-size"]), this.iconSizeData = Lu(this.zoom, e["icon-size"]);\n var r = this.layers[0].layout,\n n = r.get("symbol-sort-key"),\n i = r.get("symbol-z-order");\n this.canOverlap = r.get("text-allow-overlap") || r.get("icon-allow-overlap") || r.get("text-ignore-placement") || r.get("icon-ignore-placement"), this.sortFeaturesByKey = "viewport-y" !== i && !n.isConstant(), this.sortFeaturesByY = ("viewport-y" === i || "auto" === i && !this.sortFeaturesByKey) && this.canOverlap, "point" === r.get("symbol-placement") && (this.writingModes = r.get("text-writing-mode").map(function (t) {\n return _u[t];\n })), this.stateDependentLayerIds = this.layers.filter(function (t) {\n return t.isStateDependent();\n }).map(function (t) {\n return t.id;\n }), this.sourceID = t.sourceID;\n };\n\n gl.prototype.createArrays = function () {\n this.text = new ml(new Fa(this.layers, this.zoom, function (t) {\n return /^text/.test(t);\n })), this.icon = new ml(new Fa(this.layers, this.zoom, function (t) {\n return /^icon/.test(t);\n })), this.glyphOffsetArray = new na(), this.lineVertexArray = new ia(), this.symbolInstances = new ra();\n }, gl.prototype.calculateGlyphDependencies = function (t, e, r, n, i) {\n for (var a = 0; a < t.length; a++) {\n if (e[t.charCodeAt(a)] = !0, (r || n) && i) {\n var o = Js[t.charAt(a)];\n o && (e[o.charCodeAt(0)] = !0);\n }\n }\n }, gl.prototype.populate = function (t, e, r) {\n var n = this.layers[0],\n i = n.layout,\n a = i.get("text-font"),\n o = i.get("text-field"),\n s = i.get("icon-image"),\n u = ("constant" !== o.value.kind || o.value.value instanceof ie && !o.value.value.isEmpty() || o.value.value.toString().length > 0) && ("constant" !== a.value.kind || a.value.value.length > 0),\n l = "constant" !== s.value.kind || !!s.value.value || Object.keys(s.parameters).length > 0,\n p = i.get("symbol-sort-key");\n\n if (this.features = [], u || l) {\n for (var c = e.iconDependencies, h = e.glyphDependencies, f = e.availableImages, y = new ui(this.zoom), d = 0, m = t; d < m.length; d += 1) {\n var v = m[d],\n g = v.feature,\n x = v.id,\n b = v.index,\n w = v.sourceLayerIndex,\n _ = n._featureFilter.needGeometry,\n A = ja(g, _);\n\n if (n._featureFilter.filter(y, A, r)) {\n _ || (A.geometry = Ua(g));\n var S = void 0;\n\n if (u) {\n var k = n.getValueAndResolveTokens("text-field", A, r, f),\n I = ie.factory(k);\n dl(I) && (this.hasRTLText = !0), (!this.hasRTLText || "unavailable" === ai() || this.hasRTLText && si.isParsed()) && (S = Xs(I, n, A));\n }\n\n var z = void 0;\n\n if (l) {\n var C = n.getValueAndResolveTokens("icon-image", A, r, f);\n z = C instanceof ae ? C : ae.fromString(C);\n }\n\n if (S || z) {\n var E = this.sortFeaturesByKey ? p.evaluate(A, {}, r) : void 0;\n\n if (this.features.push({\n id: x,\n text: S,\n icon: z,\n index: b,\n sourceLayerIndex: w,\n geometry: A.geometry,\n properties: g.properties,\n type: cl[g.type],\n sortKey: E\n }), z && (c[z.name] = !0), S) {\n var P = a.evaluate(A, {}, r).join(","),\n M = "map" === i.get("text-rotation-alignment") && "point" !== i.get("symbol-placement");\n this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(_u.vertical) >= 0;\n\n for (var B = 0, T = S.sections; B < T.length; B += 1) {\n var V = T[B];\n if (V.image) c[V.image.name] = !0;else {\n var F = Xn(S.toString()),\n D = V.fontStack || P,\n L = h[D] = h[D] || {};\n this.calculateGlyphDependencies(V.text, L, M, this.allowVerticalPlacement, F);\n }\n }\n }\n }\n }\n }\n\n "line" === i.get("symbol-placement") && (this.features = function (t) {\n var e = {},\n r = {},\n n = [],\n i = 0;\n\n function a(e) {\n n.push(t[e]), i++;\n }\n\n function o(t, e, i) {\n var a = r[t];\n return delete r[t], r[e] = a, n[a].geometry[0].pop(), n[a].geometry[0] = n[a].geometry[0].concat(i[0]), a;\n }\n\n function s(t, r, i) {\n var a = e[r];\n return delete e[r], e[t] = a, n[a].geometry[0].shift(), n[a].geometry[0] = i[0].concat(n[a].geometry[0]), a;\n }\n\n function u(t, e, r) {\n var n = r ? e[0][e[0].length - 1] : e[0][0];\n return t + ":" + n.x + ":" + n.y;\n }\n\n for (var l = 0; l < t.length; l++) {\n var p = t[l],\n c = p.geometry,\n h = p.text ? p.text.toString() : null;\n\n if (h) {\n var f = u(h, c),\n y = u(h, c, !0);\n\n if (f in r && y in e && r[f] !== e[y]) {\n var d = s(f, y, c),\n m = o(f, y, n[d].geometry);\n delete e[f], delete r[y], r[u(h, n[m].geometry, !0)] = m, n[d].geometry = null;\n } else f in r ? o(f, y, c) : y in e ? s(f, y, c) : (a(l), e[f] = i - 1, r[y] = i - 1);\n } else a(l);\n }\n\n return n.filter(function (t) {\n return t.geometry;\n });\n }(this.features)), this.sortFeaturesByKey && this.features.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n }\n }, gl.prototype.update = function (t, e, r) {\n this.stateDependentLayers.length && (this.text.programConfigurations.updatePaintArrays(t, e, this.layers, r), this.icon.programConfigurations.updatePaintArrays(t, e, this.layers, r));\n }, gl.prototype.isEmpty = function () {\n return 0 === this.symbolInstances.length && !this.hasRTLText;\n }, gl.prototype.uploadPending = function () {\n return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;\n }, gl.prototype.upload = function (t) {\n !this.uploaded && this.hasDebugData() && (this.textCollisionBox.upload(t), this.iconCollisionBox.upload(t)), this.text.upload(t, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload), this.icon.upload(t, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload), this.uploaded = !0;\n }, gl.prototype.destroyDebugData = function () {\n this.textCollisionBox.destroy(), this.iconCollisionBox.destroy();\n }, gl.prototype.destroy = function () {\n this.text.destroy(), this.icon.destroy(), this.hasDebugData() && this.destroyDebugData();\n }, gl.prototype.addToLineVertexArray = function (t, e) {\n var r = this.lineVertexArray.length;\n\n if (void 0 !== t.segment) {\n for (var n = t.dist(e[t.segment + 1]), i = t.dist(e[t.segment]), a = {}, o = t.segment + 1; o < e.length; o++) {\n a[o] = {\n x: e[o].x,\n y: e[o].y,\n tileUnitDistanceFromAnchor: n\n }, o < e.length - 1 && (n += e[o + 1].dist(e[o]));\n }\n\n for (var s = t.segment || 0; s >= 0; s--) {\n a[s] = {\n x: e[s].x,\n y: e[s].y,\n tileUnitDistanceFromAnchor: i\n }, s > 0 && (i += e[s - 1].dist(e[s]));\n }\n\n for (var u = 0; u < e.length; u++) {\n var l = a[u];\n this.lineVertexArray.emplaceBack(l.x, l.y, l.tileUnitDistanceFromAnchor);\n }\n }\n\n return {\n lineStartIndex: r,\n lineLength: this.lineVertexArray.length - r\n };\n }, gl.prototype.addSymbols = function (t, e, r, n, i, a, o, s, u, l, p, c) {\n for (var h = t.indexArray, f = t.layoutVertexArray, y = t.segments.prepareSegment(4 * e.length, f, h, this.canOverlap ? a.sortKey : void 0), d = this.glyphOffsetArray.length, m = y.vertexLength, v = this.allowVerticalPlacement && o === _u.vertical ? Math.PI / 2 : 0, g = a.text && a.text.sections, x = 0; x < e.length; x++) {\n var b = e[x],\n w = b.tl,\n _ = b.tr,\n A = b.bl,\n S = b.br,\n k = b.tex,\n I = b.pixelOffsetTL,\n z = b.pixelOffsetBR,\n C = b.minFontScaleX,\n E = b.minFontScaleY,\n P = b.glyphOffset,\n M = b.isSDF,\n B = b.sectionIndex,\n T = y.vertexLength,\n V = P[1];\n fl(f, s.x, s.y, w.x, V + w.y, k.x, k.y, r, M, I.x, I.y, C, E), fl(f, s.x, s.y, _.x, V + _.y, k.x + k.w, k.y, r, M, z.x, I.y, C, E), fl(f, s.x, s.y, A.x, V + A.y, k.x, k.y + k.h, r, M, I.x, z.y, C, E), fl(f, s.x, s.y, S.x, V + S.y, k.x + k.w, k.y + k.h, r, M, z.x, z.y, C, E), yl(t.dynamicLayoutVertexArray, s, v), h.emplaceBack(T, T + 1, T + 2), h.emplaceBack(T + 1, T + 2, T + 3), y.vertexLength += 4, y.primitiveLength += 2, this.glyphOffsetArray.emplaceBack(P[0]), x !== e.length - 1 && B === e[x + 1].sectionIndex || t.programConfigurations.populatePaintArrays(f.length, a, a.index, {}, c, g && g[B]);\n }\n\n t.placedSymbolArray.emplaceBack(s.x, s.y, d, this.glyphOffsetArray.length - d, m, u, l, s.segment, r ? r[0] : 0, r ? r[1] : 0, n[0], n[1], o, 0, !1, 0, p);\n }, gl.prototype._addCollisionDebugVertex = function (t, e, r, n, i, a) {\n return e.emplaceBack(0, 0), t.emplaceBack(r.x, r.y, n, i, Math.round(a.x), Math.round(a.y));\n }, gl.prototype.addCollisionDebugVertices = function (t, e, r, n, a, o, s) {\n var u = a.segments.prepareSegment(4, a.layoutVertexArray, a.indexArray),\n l = u.vertexLength,\n p = a.layoutVertexArray,\n c = a.collisionVertexArray,\n h = s.anchorX,\n f = s.anchorY;\n this._addCollisionDebugVertex(p, c, o, h, f, new i(t, e)), this._addCollisionDebugVertex(p, c, o, h, f, new i(r, e)), this._addCollisionDebugVertex(p, c, o, h, f, new i(r, n)), this._addCollisionDebugVertex(p, c, o, h, f, new i(t, n)), u.vertexLength += 4;\n var y = a.indexArray;\n y.emplaceBack(l, l + 1), y.emplaceBack(l + 1, l + 2), y.emplaceBack(l + 2, l + 3), y.emplaceBack(l + 3, l), u.primitiveLength += 4;\n }, gl.prototype.addDebugCollisionBoxes = function (t, e, r, n) {\n for (var i = t; i < e; i++) {\n var a = this.collisionBoxArray.get(i);\n this.addCollisionDebugVertices(a.x1, a.y1, a.x2, a.y2, n ? this.textCollisionBox : this.iconCollisionBox, a.anchorPoint, r);\n }\n }, gl.prototype.generateCollisionDebugBuffers = function () {\n this.hasDebugData() && this.destroyDebugData(), this.textCollisionBox = new vl(Oi, Gs.members, Ji), this.iconCollisionBox = new vl(Oi, Gs.members, Ji);\n\n for (var t = 0; t < this.symbolInstances.length; t++) {\n var e = this.symbolInstances.get(t);\n this.addDebugCollisionBoxes(e.textBoxStartIndex, e.textBoxEndIndex, e, !0), this.addDebugCollisionBoxes(e.verticalTextBoxStartIndex, e.verticalTextBoxEndIndex, e, !0), this.addDebugCollisionBoxes(e.iconBoxStartIndex, e.iconBoxEndIndex, e, !1), this.addDebugCollisionBoxes(e.verticalIconBoxStartIndex, e.verticalIconBoxEndIndex, e, !1);\n }\n }, gl.prototype._deserializeCollisionBoxesForSymbol = function (t, e, r, n, i, a, o, s, u) {\n for (var l = {}, p = e; p < r; p++) {\n var c = t.get(p);\n l.textBox = {\n x1: c.x1,\n y1: c.y1,\n x2: c.x2,\n y2: c.y2,\n anchorPointX: c.anchorPointX,\n anchorPointY: c.anchorPointY\n }, l.textFeatureIndex = c.featureIndex;\n break;\n }\n\n for (var h = n; h < i; h++) {\n var f = t.get(h);\n l.verticalTextBox = {\n x1: f.x1,\n y1: f.y1,\n x2: f.x2,\n y2: f.y2,\n anchorPointX: f.anchorPointX,\n anchorPointY: f.anchorPointY\n }, l.verticalTextFeatureIndex = f.featureIndex;\n break;\n }\n\n for (var y = a; y < o; y++) {\n var d = t.get(y);\n l.iconBox = {\n x1: d.x1,\n y1: d.y1,\n x2: d.x2,\n y2: d.y2,\n anchorPointX: d.anchorPointX,\n anchorPointY: d.anchorPointY\n }, l.iconFeatureIndex = d.featureIndex;\n break;\n }\n\n for (var m = s; m < u; m++) {\n var v = t.get(m);\n l.verticalIconBox = {\n x1: v.x1,\n y1: v.y1,\n x2: v.x2,\n y2: v.y2,\n anchorPointX: v.anchorPointX,\n anchorPointY: v.anchorPointY\n }, l.verticalIconFeatureIndex = v.featureIndex;\n break;\n }\n\n return l;\n }, gl.prototype.deserializeCollisionBoxes = function (t) {\n this.collisionArrays = [];\n\n for (var e = 0; e < this.symbolInstances.length; e++) {\n var r = this.symbolInstances.get(e);\n this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(t, r.textBoxStartIndex, r.textBoxEndIndex, r.verticalTextBoxStartIndex, r.verticalTextBoxEndIndex, r.iconBoxStartIndex, r.iconBoxEndIndex, r.verticalIconBoxStartIndex, r.verticalIconBoxEndIndex));\n }\n }, gl.prototype.hasTextData = function () {\n return this.text.segments.get().length > 0;\n }, gl.prototype.hasIconData = function () {\n return this.icon.segments.get().length > 0;\n }, gl.prototype.hasDebugData = function () {\n return this.textCollisionBox && this.iconCollisionBox;\n }, gl.prototype.hasTextCollisionBoxData = function () {\n return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0;\n }, gl.prototype.hasIconCollisionBoxData = function () {\n return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0;\n }, gl.prototype.addIndicesForPlacedSymbol = function (t, e) {\n for (var r = t.placedSymbolArray.get(e), n = r.vertexStartIndex + 4 * r.numGlyphs, i = r.vertexStartIndex; i < n; i += 4) {\n t.indexArray.emplaceBack(i, i + 1, i + 2), t.indexArray.emplaceBack(i + 1, i + 2, i + 3);\n }\n }, gl.prototype.getSortedSymbolIndexes = function (t) {\n if (this.sortedAngle === t && void 0 !== this.symbolInstanceIndexes) return this.symbolInstanceIndexes;\n\n for (var e = Math.sin(t), r = Math.cos(t), n = [], i = [], a = [], o = 0; o < this.symbolInstances.length; ++o) {\n a.push(o);\n var s = this.symbolInstances.get(o);\n n.push(0 | Math.round(e * s.anchorX + r * s.anchorY)), i.push(s.featureIndex);\n }\n\n return a.sort(function (t, e) {\n return n[t] - n[e] || i[e] - i[t];\n }), a;\n }, gl.prototype.addToSortKeyRanges = function (t, e) {\n var r = this.sortKeyRanges[this.sortKeyRanges.length - 1];\n r && r.sortKey === e ? r.symbolInstanceEnd = t + 1 : this.sortKeyRanges.push({\n sortKey: e,\n symbolInstanceStart: t,\n symbolInstanceEnd: t + 1\n });\n }, gl.prototype.sortFeatures = function (t) {\n var e = this;\n\n if (this.sortFeaturesByY && this.sortedAngle !== t && !(this.text.segments.get().length > 1 || this.icon.segments.get().length > 1)) {\n this.symbolInstanceIndexes = this.getSortedSymbolIndexes(t), this.sortedAngle = t, this.text.indexArray.clear(), this.icon.indexArray.clear(), this.featureSortOrder = [];\n\n for (var r = 0, n = this.symbolInstanceIndexes; r < n.length; r += 1) {\n var i = this.symbolInstances.get(n[r]);\n this.featureSortOrder.push(i.featureIndex), [i.rightJustifiedTextSymbolIndex, i.centerJustifiedTextSymbolIndex, i.leftJustifiedTextSymbolIndex].forEach(function (t, r, n) {\n t >= 0 && n.indexOf(t) === r && e.addIndicesForPlacedSymbol(e.text, t);\n }), i.verticalPlacedTextSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.text, i.verticalPlacedTextSymbolIndex), i.placedIconSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.icon, i.placedIconSymbolIndex), i.verticalPlacedIconSymbolIndex >= 0 && this.addIndicesForPlacedSymbol(this.icon, i.verticalPlacedIconSymbolIndex);\n }\n\n this.text.indexBuffer && this.text.indexBuffer.updateData(this.text.indexArray), this.icon.indexBuffer && this.icon.indexBuffer.updateData(this.icon.indexArray);\n }\n }, On("SymbolBucket", gl, {\n omit: ["layers", "collisionBoxArray", "features", "compareText"]\n }), gl.MAX_GLYPHS = 65535, gl.addDynamicAttributes = yl;\n\n var xl = new _i({\n "symbol-placement": new vi(Pt.layout_symbol["symbol-placement"]),\n "symbol-spacing": new vi(Pt.layout_symbol["symbol-spacing"]),\n "symbol-avoid-edges": new vi(Pt.layout_symbol["symbol-avoid-edges"]),\n "symbol-sort-key": new gi(Pt.layout_symbol["symbol-sort-key"]),\n "symbol-z-order": new vi(Pt.layout_symbol["symbol-z-order"]),\n "icon-allow-overlap": new vi(Pt.layout_symbol["icon-allow-overlap"]),\n "icon-ignore-placement": new vi(Pt.layout_symbol["icon-ignore-placement"]),\n "icon-optional": new vi(Pt.layout_symbol["icon-optional"]),\n "icon-rotation-alignment": new vi(Pt.layout_symbol["icon-rotation-alignment"]),\n "icon-size": new gi(Pt.layout_symbol["icon-size"]),\n "icon-text-fit": new vi(Pt.layout_symbol["icon-text-fit"]),\n "icon-text-fit-padding": new vi(Pt.layout_symbol["icon-text-fit-padding"]),\n "icon-image": new gi(Pt.layout_symbol["icon-image"]),\n "icon-rotate": new gi(Pt.layout_symbol["icon-rotate"]),\n "icon-padding": new vi(Pt.layout_symbol["icon-padding"]),\n "icon-keep-upright": new vi(Pt.layout_symbol["icon-keep-upright"]),\n "icon-offset": new gi(Pt.layout_symbol["icon-offset"]),\n "icon-anchor": new gi(Pt.layout_symbol["icon-anchor"]),\n "icon-pitch-alignment": new vi(Pt.layout_symbol["icon-pitch-alignment"]),\n "text-pitch-alignment": new vi(Pt.layout_symbol["text-pitch-alignment"]),\n "text-rotation-alignment": new vi(Pt.layout_symbol["text-rotation-alignment"]),\n "text-field": new gi(Pt.layout_symbol["text-field"]),\n "text-font": new gi(Pt.layout_symbol["text-font"]),\n "text-size": new gi(Pt.layout_symbol["text-size"]),\n "text-max-width": new gi(Pt.layout_symbol["text-max-width"]),\n "text-line-height": new vi(Pt.layout_symbol["text-line-height"]),\n "text-letter-spacing": new gi(Pt.layout_symbol["text-letter-spacing"]),\n "text-justify": new gi(Pt.layout_symbol["text-justify"]),\n "text-radial-offset": new gi(Pt.layout_symbol["text-radial-offset"]),\n "text-variable-anchor": new vi(Pt.layout_symbol["text-variable-anchor"]),\n "text-anchor": new gi(Pt.layout_symbol["text-anchor"]),\n "text-max-angle": new vi(Pt.layout_symbol["text-max-angle"]),\n "text-writing-mode": new vi(Pt.layout_symbol["text-writing-mode"]),\n "text-rotate": new gi(Pt.layout_symbol["text-rotate"]),\n "text-padding": new vi(Pt.layout_symbol["text-padding"]),\n "text-keep-upright": new vi(Pt.layout_symbol["text-keep-upright"]),\n "text-transform": new gi(Pt.layout_symbol["text-transform"]),\n "text-offset": new gi(Pt.layout_symbol["text-offset"]),\n "text-allow-overlap": new vi(Pt.layout_symbol["text-allow-overlap"]),\n "text-ignore-placement": new vi(Pt.layout_symbol["text-ignore-placement"]),\n "text-optional": new vi(Pt.layout_symbol["text-optional"])\n }),\n bl = {\n paint: new _i({\n "icon-opacity": new gi(Pt.paint_symbol["icon-opacity"]),\n "icon-color": new gi(Pt.paint_symbol["icon-color"]),\n "icon-halo-color": new gi(Pt.paint_symbol["icon-halo-color"]),\n "icon-halo-width": new gi(Pt.paint_symbol["icon-halo-width"]),\n "icon-halo-blur": new gi(Pt.paint_symbol["icon-halo-blur"]),\n "icon-translate": new vi(Pt.paint_symbol["icon-translate"]),\n "icon-translate-anchor": new vi(Pt.paint_symbol["icon-translate-anchor"]),\n "text-opacity": new gi(Pt.paint_symbol["text-opacity"]),\n "text-color": new gi(Pt.paint_symbol["text-color"], {\n runtimeType: qt,\n getOverride: function getOverride(t) {\n return t.textColor;\n },\n hasOverride: function hasOverride(t) {\n return !!t.textColor;\n }\n }),\n "text-halo-color": new gi(Pt.paint_symbol["text-halo-color"]),\n "text-halo-width": new gi(Pt.paint_symbol["text-halo-width"]),\n "text-halo-blur": new gi(Pt.paint_symbol["text-halo-blur"]),\n "text-translate": new vi(Pt.paint_symbol["text-translate"]),\n "text-translate-anchor": new vi(Pt.paint_symbol["text-translate-anchor"])\n }),\n layout: xl\n },\n wl = function wl(t) {\n this.type = t.property.overrides ? t.property.overrides.runtimeType : Rt, this.defaultValue = t;\n };\n\n wl.prototype.evaluate = function (t) {\n if (t.formattedSection) {\n var e = this.defaultValue.property.overrides;\n if (e && e.hasOverride(t.formattedSection)) return e.getOverride(t.formattedSection);\n }\n\n return t.feature && t.featureState ? this.defaultValue.evaluate(t.feature, t.featureState) : this.defaultValue.property.specification.default;\n }, wl.prototype.eachChild = function (t) {\n this.defaultValue.isConstant() || t(this.defaultValue.value._styleExpression.expression);\n }, wl.prototype.outputDefined = function () {\n return !1;\n }, wl.prototype.serialize = function () {\n return null;\n }, On("FormatSectionOverride", wl, {\n omit: ["defaultValue"]\n });\n\n var _l = function (t) {\n function e(e) {\n t.call(this, e, bl);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.recalculate = function (e, r) {\n if (t.prototype.recalculate.call(this, e, r), "auto" === this.layout.get("icon-rotation-alignment") && (this.layout._values["icon-rotation-alignment"] = "point" !== this.layout.get("symbol-placement") ? "map" : "viewport"), "auto" === this.layout.get("text-rotation-alignment") && (this.layout._values["text-rotation-alignment"] = "point" !== this.layout.get("symbol-placement") ? "map" : "viewport"), "auto" === this.layout.get("text-pitch-alignment") && (this.layout._values["text-pitch-alignment"] = this.layout.get("text-rotation-alignment")), "auto" === this.layout.get("icon-pitch-alignment") && (this.layout._values["icon-pitch-alignment"] = this.layout.get("icon-rotation-alignment")), "point" === this.layout.get("symbol-placement")) {\n var n = this.layout.get("text-writing-mode");\n\n if (n) {\n for (var i = [], a = 0, o = n; a < o.length; a += 1) {\n var s = o[a];\n i.indexOf(s) < 0 && i.push(s);\n }\n\n this.layout._values["text-writing-mode"] = i;\n } else this.layout._values["text-writing-mode"] = ["horizontal"];\n }\n\n this._setPaintOverrides();\n }, e.prototype.getValueAndResolveTokens = function (t, e, r, n) {\n var i = this.layout.get(t).evaluate(e, {}, r, n),\n a = this._unevaluatedLayout._values[t];\n return a.isDataDriven() || Zr(a.value) || !i ? i : function (t, e) {\n return e.replace(/{([^{}]+)}/g, function (e, r) {\n return r in t ? String(t[r]) : "";\n });\n }(e.properties, i);\n }, e.prototype.createBucket = function (t) {\n return new gl(t);\n }, e.prototype.queryRadius = function () {\n return 0;\n }, e.prototype.queryIntersectsFeature = function () {\n return !1;\n }, e.prototype._setPaintOverrides = function () {\n for (var t = 0, r = bl.paint.overridableProperties; t < r.length; t += 1) {\n var n = r[t];\n\n if (e.hasPaintOverride(this.layout, n)) {\n var i,\n a = this.paint.get(n),\n o = new wl(a),\n s = new Gr(o, a.property.specification);\n i = "constant" === a.value.kind || "source" === a.value.kind ? new Jr("source", s) : new Hr("composite", s, a.value.zoomStops, a.value._interpolationType), this.paint._values[n] = new di(a.property, i, a.parameters);\n }\n }\n }, e.prototype._handleOverridablePaintPropertyUpdate = function (t, r, n) {\n return !(!this.layout || r.isDataDriven() || n.isDataDriven()) && e.hasPaintOverride(this.layout, t);\n }, e.hasPaintOverride = function (t, e) {\n var r = t.get("text-field"),\n n = bl.paint.properties[e],\n i = !1,\n a = function a(t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (n.overrides && n.overrides.hasOverride(r[e])) return void (i = !0);\n }\n };\n\n if ("constant" === r.value.kind && r.value.value instanceof ie) a(r.value.value.sections);else if ("source" === r.value.kind) {\n var o = function o(t) {\n i || (t instanceof pe && ue(t.value) === Zt ? a(t.value.sections) : t instanceof ye ? a(t.sections) : t.eachChild(o));\n },\n s = r.value;\n\n s._styleExpression && o(s._styleExpression.expression);\n }\n return i;\n }, e;\n }(Ai),\n Al = {\n paint: new _i({\n "background-color": new vi(Pt.paint_background["background-color"]),\n "background-pattern": new bi(Pt.paint_background["background-pattern"]),\n "background-opacity": new vi(Pt.paint_background["background-opacity"])\n })\n },\n Sl = function (t) {\n function e(e) {\n t.call(this, e, Al);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(Ai),\n kl = {\n paint: new _i({\n "raster-opacity": new vi(Pt.paint_raster["raster-opacity"]),\n "raster-hue-rotate": new vi(Pt.paint_raster["raster-hue-rotate"]),\n "raster-brightness-min": new vi(Pt.paint_raster["raster-brightness-min"]),\n "raster-brightness-max": new vi(Pt.paint_raster["raster-brightness-max"]),\n "raster-saturation": new vi(Pt.paint_raster["raster-saturation"]),\n "raster-contrast": new vi(Pt.paint_raster["raster-contrast"]),\n "raster-resampling": new vi(Pt.paint_raster["raster-resampling"]),\n "raster-fade-duration": new vi(Pt.paint_raster["raster-fade-duration"])\n })\n },\n Il = function (t) {\n function e(e) {\n t.call(this, e, kl);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(Ai),\n zl = function (t) {\n function e(e) {\n t.call(this, e, {}), this.implementation = e;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.is3D = function () {\n return "3d" === this.implementation.renderingMode;\n }, e.prototype.hasOffscreenPass = function () {\n return void 0 !== this.implementation.prerender;\n }, e.prototype.recalculate = function () {}, e.prototype.updateTransitions = function () {}, e.prototype.hasTransition = function () {}, e.prototype.serialize = function () {}, e.prototype.onAdd = function (t) {\n this.implementation.onAdd && this.implementation.onAdd(t, t.painter.context.gl);\n }, e.prototype.onRemove = function (t) {\n this.implementation.onRemove && this.implementation.onRemove(t, t.painter.context.gl);\n }, e;\n }(Ai),\n Cl = {\n circle: ho,\n heatmap: Ao,\n hillshade: ko,\n fill: cs,\n "fill-extrusion": Cs,\n line: Us,\n symbol: _l,\n background: Sl,\n raster: Il\n },\n El = o.HTMLImageElement,\n Pl = o.HTMLCanvasElement,\n Ml = o.HTMLVideoElement,\n Bl = o.ImageData,\n Tl = o.ImageBitmap,\n Vl = function Vl(t, e, r, n) {\n this.context = t, this.format = r, this.texture = t.gl.createTexture(), this.update(e, n);\n };\n\n Vl.prototype.update = function (t, e, r) {\n var n = t.width,\n i = t.height,\n a = !(this.size && this.size[0] === n && this.size[1] === i || r),\n o = this.context,\n s = o.gl;\n if (this.useMipmap = Boolean(e && e.useMipmap), s.bindTexture(s.TEXTURE_2D, this.texture), o.pixelStoreUnpackFlipY.set(!1), o.pixelStoreUnpack.set(1), o.pixelStoreUnpackPremultiplyAlpha.set(this.format === s.RGBA && (!e || !1 !== e.premultiply)), a) this.size = [n, i], t instanceof El || t instanceof Pl || t instanceof Ml || t instanceof Bl || Tl && t instanceof Tl ? s.texImage2D(s.TEXTURE_2D, 0, this.format, this.format, s.UNSIGNED_BYTE, t) : s.texImage2D(s.TEXTURE_2D, 0, this.format, n, i, 0, this.format, s.UNSIGNED_BYTE, t.data);else {\n var u = r || {\n x: 0,\n y: 0\n },\n l = u.x,\n p = u.y;\n t instanceof El || t instanceof Pl || t instanceof Ml || t instanceof Bl || Tl && t instanceof Tl ? s.texSubImage2D(s.TEXTURE_2D, 0, l, p, s.RGBA, s.UNSIGNED_BYTE, t) : s.texSubImage2D(s.TEXTURE_2D, 0, l, p, n, i, s.RGBA, s.UNSIGNED_BYTE, t.data);\n }\n this.useMipmap && this.isSizePowerOfTwo() && s.generateMipmap(s.TEXTURE_2D);\n }, Vl.prototype.bind = function (t, e, r) {\n var n = this.context.gl;\n n.bindTexture(n.TEXTURE_2D, this.texture), r !== n.LINEAR_MIPMAP_NEAREST || this.isSizePowerOfTwo() || (r = n.LINEAR), t !== this.filter && (n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, t), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, r || t), this.filter = t), e !== this.wrap && (n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, e), n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, e), this.wrap = e);\n }, Vl.prototype.isSizePowerOfTwo = function () {\n return this.size[0] === this.size[1] && Math.log(this.size[0]) / Math.LN2 % 1 == 0;\n }, Vl.prototype.destroy = function () {\n this.context.gl.deleteTexture(this.texture), this.texture = null;\n };\n\n var Fl = function Fl(t) {\n var e = this;\n this._callback = t, this._triggered = !1, "undefined" != typeof MessageChannel && (this._channel = new MessageChannel(), this._channel.port2.onmessage = function () {\n e._triggered = !1, e._callback();\n });\n };\n\n Fl.prototype.trigger = function () {\n var t = this;\n this._triggered || (this._triggered = !0, this._channel ? this._channel.port1.postMessage(!0) : setTimeout(function () {\n t._triggered = !1, t._callback();\n }, 0));\n }, Fl.prototype.remove = function () {\n delete this._channel, this._callback = function () {};\n };\n\n var Dl = function Dl(t, e, r) {\n this.target = t, this.parent = e, this.mapId = r, this.callbacks = {}, this.tasks = {}, this.taskQueue = [], this.cancelCallbacks = {}, v(["receive", "process"], this), this.invoker = new Fl(this.process), this.target.addEventListener("message", this.receive, !1), this.globalScope = I() ? t : o;\n };\n\n function Ll(t, e, r) {\n var n = 2 * Math.PI * 6378137 / 256 / Math.pow(2, r);\n return [t * n - 2 * Math.PI * 6378137 / 2, e * n - 2 * Math.PI * 6378137 / 2];\n }\n\n Dl.prototype.send = function (t, e, r, n, i) {\n var a = this;\n void 0 === i && (i = !1);\n var o = Math.round(1e18 * Math.random()).toString(36).substring(0, 10);\n r && (this.callbacks[o] = r);\n var s = E(this.globalScope) ? void 0 : [];\n return this.target.postMessage({\n id: o,\n type: t,\n hasCallback: !!r,\n targetMapId: n,\n mustQueue: i,\n sourceMapId: this.mapId,\n data: Nn(e, s)\n }, s), {\n cancel: function cancel() {\n r && delete a.callbacks[o], a.target.postMessage({\n id: o,\n type: "",\n targetMapId: n,\n sourceMapId: a.mapId\n });\n }\n };\n }, Dl.prototype.receive = function (t) {\n var e = t.data,\n r = e.id;\n if (r && (!e.targetMapId || this.mapId === e.targetMapId)) if ("" === e.type) {\n delete this.tasks[r];\n var n = this.cancelCallbacks[r];\n delete this.cancelCallbacks[r], n && n();\n } else I() || e.mustQueue ? (this.tasks[r] = e, this.taskQueue.push(r), this.invoker.trigger()) : this.processTask(r, e);\n }, Dl.prototype.process = function () {\n if (this.taskQueue.length) {\n var t = this.taskQueue.shift(),\n e = this.tasks[t];\n delete this.tasks[t], this.taskQueue.length && this.invoker.trigger(), e && this.processTask(t, e);\n }\n }, Dl.prototype.processTask = function (t, e) {\n var r = this;\n\n if ("" === e.type) {\n var n = this.callbacks[t];\n delete this.callbacks[t], n && (e.error ? n(Kn(e.error)) : n(null, Kn(e.data)));\n } else {\n var i = !1,\n a = E(this.globalScope) ? void 0 : [],\n o = e.hasCallback ? function (e, n) {\n i = !0, delete r.cancelCallbacks[t], r.target.postMessage({\n id: t,\n type: "",\n sourceMapId: r.mapId,\n error: e ? Nn(e) : null,\n data: Nn(n, a)\n }, a);\n } : function (t) {\n i = !0;\n },\n s = null,\n u = Kn(e.data);\n if (this.parent[e.type]) s = this.parent[e.type](e.sourceMapId, u, o);else if (this.parent.getWorkerSource) {\n var l = e.type.split(".");\n s = this.parent.getWorkerSource(e.sourceMapId, l[0], u.source)[l[1]](u, o);\n } else o(new Error("Could not find function " + e.type));\n !i && s && s.cancel && (this.cancelCallbacks[t] = s.cancel);\n }\n }, Dl.prototype.remove = function () {\n this.invoker.remove(), this.target.removeEventListener("message", this.receive, !1);\n };\n\n var Rl = function Rl(t, e) {\n t && (e ? this.setSouthWest(t).setNorthEast(e) : 4 === t.length ? this.setSouthWest([t[0], t[1]]).setNorthEast([t[2], t[3]]) : this.setSouthWest(t[0]).setNorthEast(t[1]));\n };\n\n Rl.prototype.setNorthEast = function (t) {\n return this._ne = t instanceof Ol ? new Ol(t.lng, t.lat) : Ol.convert(t), this;\n }, Rl.prototype.setSouthWest = function (t) {\n return this._sw = t instanceof Ol ? new Ol(t.lng, t.lat) : Ol.convert(t), this;\n }, Rl.prototype.extend = function (t) {\n var e,\n r,\n n = this._sw,\n i = this._ne;\n if (t instanceof Ol) e = t, r = t;else {\n if (!(t instanceof Rl)) return Array.isArray(t) ? 4 === t.length || t.every(Array.isArray) ? this.extend(Rl.convert(t)) : this.extend(Ol.convert(t)) : this;\n if (r = t._ne, !(e = t._sw) || !r) return this;\n }\n return n || i ? (n.lng = Math.min(e.lng, n.lng), n.lat = Math.min(e.lat, n.lat), i.lng = Math.max(r.lng, i.lng), i.lat = Math.max(r.lat, i.lat)) : (this._sw = new Ol(e.lng, e.lat), this._ne = new Ol(r.lng, r.lat)), this;\n }, Rl.prototype.getCenter = function () {\n return new Ol((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n }, Rl.prototype.getSouthWest = function () {\n return this._sw;\n }, Rl.prototype.getNorthEast = function () {\n return this._ne;\n }, Rl.prototype.getNorthWest = function () {\n return new Ol(this.getWest(), this.getNorth());\n }, Rl.prototype.getSouthEast = function () {\n return new Ol(this.getEast(), this.getSouth());\n }, Rl.prototype.getWest = function () {\n return this._sw.lng;\n }, Rl.prototype.getSouth = function () {\n return this._sw.lat;\n }, Rl.prototype.getEast = function () {\n return this._ne.lng;\n }, Rl.prototype.getNorth = function () {\n return this._ne.lat;\n }, Rl.prototype.toArray = function () {\n return [this._sw.toArray(), this._ne.toArray()];\n }, Rl.prototype.toString = function () {\n return "LngLatBounds(" + this._sw.toString() + ", " + this._ne.toString() + ")";\n }, Rl.prototype.isEmpty = function () {\n return !(this._sw && this._ne);\n }, Rl.prototype.contains = function (t) {\n var e = Ol.convert(t),\n r = e.lng,\n n = e.lat,\n i = this._sw.lng <= r && r <= this._ne.lng;\n return this._sw.lng > this._ne.lng && (i = this._sw.lng >= r && r >= this._ne.lng), this._sw.lat <= n && n <= this._ne.lat && i;\n }, Rl.convert = function (t) {\n return !t || t instanceof Rl ? t : new Rl(t);\n };\n\n var Ol = function Ol(t, e) {\n if (isNaN(t) || isNaN(e)) throw new Error("Invalid LngLat object: (" + t + ", " + e + ")");\n if (this.lng = +t, this.lat = +e, this.lat > 90 || this.lat < -90) throw new Error("Invalid LngLat latitude value: must be between -90 and 90");\n };\n\n Ol.prototype.wrap = function () {\n return new Ol(c(this.lng, -180, 180), this.lat);\n }, Ol.prototype.toArray = function () {\n return [this.lng, this.lat];\n }, Ol.prototype.toString = function () {\n return "LngLat(" + this.lng + ", " + this.lat + ")";\n }, Ol.prototype.distanceTo = function (t) {\n var e = Math.PI / 180,\n r = this.lat * e,\n n = t.lat * e,\n i = Math.sin(r) * Math.sin(n) + Math.cos(r) * Math.cos(n) * Math.cos((t.lng - this.lng) * e);\n return 6371008.8 * Math.acos(Math.min(i, 1));\n }, Ol.prototype.toBounds = function (t) {\n void 0 === t && (t = 0);\n var e = 360 * t / 40075017,\n r = e / Math.cos(Math.PI / 180 * this.lat);\n return new Rl(new Ol(this.lng - r, this.lat - e), new Ol(this.lng + r, this.lat + e));\n }, Ol.convert = function (t) {\n if (t instanceof Ol) return t;\n if (Array.isArray(t) && (2 === t.length || 3 === t.length)) return new Ol(Number(t[0]), Number(t[1]));\n if (!Array.isArray(t) && "object" == typeof t && null !== t) return new Ol(Number("lng" in t ? t.lng : t.lon), Number(t.lat));\n throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]");\n };\n var Ul = 2 * Math.PI * 6371008.8;\n\n function jl(t) {\n return Ul * Math.cos(t * Math.PI / 180);\n }\n\n function ql(t) {\n return (180 + t) / 360;\n }\n\n function Nl(t) {\n return (180 - 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + t * Math.PI / 360))) / 360;\n }\n\n function Kl(t, e) {\n return t / jl(e);\n }\n\n function Gl(t) {\n return 360 / Math.PI * Math.atan(Math.exp((180 - 360 * t) * Math.PI / 180)) - 90;\n }\n\n var Zl = function Zl(t, e, r) {\n void 0 === r && (r = 0), this.x = +t, this.y = +e, this.z = +r;\n };\n\n Zl.fromLngLat = function (t, e) {\n void 0 === e && (e = 0);\n var r = Ol.convert(t);\n return new Zl(ql(r.lng), Nl(r.lat), Kl(e, r.lat));\n }, Zl.prototype.toLngLat = function () {\n return new Ol(360 * this.x - 180, Gl(this.y));\n }, Zl.prototype.toAltitude = function () {\n return this.z * jl(Gl(this.y));\n }, Zl.prototype.meterInMercatorCoordinateUnits = function () {\n return 1 / Ul * (t = Gl(this.y), 1 / Math.cos(t * Math.PI / 180));\n var t;\n };\n\n var Xl = function Xl(t, e, r) {\n this.z = t, this.x = e, this.y = r, this.key = Yl(0, t, t, e, r);\n };\n\n Xl.prototype.equals = function (t) {\n return this.z === t.z && this.x === t.x && this.y === t.y;\n }, Xl.prototype.url = function (t, e) {\n var r,\n n,\n i,\n a,\n o,\n s = (n = this.y, i = this.z, a = Ll(256 * (r = this.x), 256 * (n = Math.pow(2, i) - n - 1), i), o = Ll(256 * (r + 1), 256 * (n + 1), i), a[0] + "," + a[1] + "," + o[0] + "," + o[1]),\n u = function (t, e, r) {\n for (var n, i = "", a = t; a > 0; a--) {\n i += (e & (n = 1 << a - 1) ? 1 : 0) + (r & n ? 2 : 0);\n }\n\n return i;\n }(this.z, this.x, this.y);\n\n return t[(this.x + this.y) % t.length].replace("{prefix}", (this.x % 16).toString(16) + (this.y % 16).toString(16)).replace("{z}", String(this.z)).replace("{x}", String(this.x)).replace("{y}", String("tms" === e ? Math.pow(2, this.z) - this.y - 1 : this.y)).replace("{quadkey}", u).replace("{bbox-epsg-3857}", s);\n }, Xl.prototype.getTilePoint = function (t) {\n var e = Math.pow(2, this.z);\n return new i(8192 * (t.x * e - this.x), 8192 * (t.y * e - this.y));\n }, Xl.prototype.toString = function () {\n return this.z + "/" + this.x + "/" + this.y;\n };\n\n var Jl = function Jl(t, e) {\n this.wrap = t, this.canonical = e, this.key = Yl(t, e.z, e.z, e.x, e.y);\n },\n Hl = function Hl(t, e, r, n, i) {\n this.overscaledZ = t, this.wrap = e, this.canonical = new Xl(r, +n, +i), this.key = Yl(e, t, r, n, i);\n };\n\n function Yl(t, e, r, n, i) {\n (t *= 2) < 0 && (t = -1 * t - 1);\n var a = 1 << r;\n return (a * a * t + a * i + n).toString(36) + r.toString(36) + e.toString(36);\n }\n\n Hl.prototype.equals = function (t) {\n return this.overscaledZ === t.overscaledZ && this.wrap === t.wrap && this.canonical.equals(t.canonical);\n }, Hl.prototype.scaledTo = function (t) {\n var e = this.canonical.z - t;\n return t > this.canonical.z ? new Hl(t, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y) : new Hl(t, this.wrap, t, this.canonical.x >> e, this.canonical.y >> e);\n }, Hl.prototype.calculateScaledKey = function (t, e) {\n var r = this.canonical.z - t;\n return t > this.canonical.z ? Yl(this.wrap * +e, t, this.canonical.z, this.canonical.x, this.canonical.y) : Yl(this.wrap * +e, t, t, this.canonical.x >> r, this.canonical.y >> r);\n }, Hl.prototype.isChildOf = function (t) {\n if (t.wrap !== this.wrap) return !1;\n var e = this.canonical.z - t.canonical.z;\n return 0 === t.overscaledZ || t.overscaledZ < this.overscaledZ && t.canonical.x === this.canonical.x >> e && t.canonical.y === this.canonical.y >> e;\n }, Hl.prototype.children = function (t) {\n if (this.overscaledZ >= t) return [new Hl(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)];\n var e = this.canonical.z + 1,\n r = 2 * this.canonical.x,\n n = 2 * this.canonical.y;\n return [new Hl(e, this.wrap, e, r, n), new Hl(e, this.wrap, e, r + 1, n), new Hl(e, this.wrap, e, r, n + 1), new Hl(e, this.wrap, e, r + 1, n + 1)];\n }, Hl.prototype.isLessThan = function (t) {\n return this.wrap < t.wrap || !(this.wrap > t.wrap) && (this.overscaledZ < t.overscaledZ || !(this.overscaledZ > t.overscaledZ) && (this.canonical.x < t.canonical.x || !(this.canonical.x > t.canonical.x) && this.canonical.y < t.canonical.y));\n }, Hl.prototype.wrapped = function () {\n return new Hl(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);\n }, Hl.prototype.unwrapTo = function (t) {\n return new Hl(this.overscaledZ, t, this.canonical.z, this.canonical.x, this.canonical.y);\n }, Hl.prototype.overscaleFactor = function () {\n return Math.pow(2, this.overscaledZ - this.canonical.z);\n }, Hl.prototype.toUnwrapped = function () {\n return new Jl(this.wrap, this.canonical);\n }, Hl.prototype.toString = function () {\n return this.overscaledZ + "/" + this.canonical.x + "/" + this.canonical.y;\n }, Hl.prototype.getTilePoint = function (t) {\n return this.canonical.getTilePoint(new Zl(t.x - this.wrap, t.y));\n }, On("CanonicalTileID", Xl), On("OverscaledTileID", Hl, {\n omit: ["posMatrix"]\n });\n\n var $l = function $l(t, e, r) {\n if (this.uid = t, e.height !== e.width) throw new RangeError("DEM tiles must be square");\n if (r && "mapbox" !== r && "terrarium" !== r) return A(\'"\' + r + \'" is not a valid encoding type. Valid types include "mapbox" and "terrarium".\');\n this.stride = e.height;\n var n = this.dim = e.height - 2;\n this.data = new Uint32Array(e.data.buffer), this.encoding = r || "mapbox";\n\n for (var i = 0; i < n; i++) {\n this.data[this._idx(-1, i)] = this.data[this._idx(0, i)], this.data[this._idx(n, i)] = this.data[this._idx(n - 1, i)], this.data[this._idx(i, -1)] = this.data[this._idx(i, 0)], this.data[this._idx(i, n)] = this.data[this._idx(i, n - 1)];\n }\n\n this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)], this.data[this._idx(n, -1)] = this.data[this._idx(n - 1, 0)], this.data[this._idx(-1, n)] = this.data[this._idx(0, n - 1)], this.data[this._idx(n, n)] = this.data[this._idx(n - 1, n - 1)];\n };\n\n $l.prototype.get = function (t, e) {\n var r = new Uint8Array(this.data.buffer),\n n = 4 * this._idx(t, e);\n\n return ("terrarium" === this.encoding ? this._unpackTerrarium : this._unpackMapbox)(r[n], r[n + 1], r[n + 2]);\n }, $l.prototype.getUnpackVector = function () {\n return "terrarium" === this.encoding ? [256, 1, 1 / 256, 32768] : [6553.6, 25.6, .1, 1e4];\n }, $l.prototype._idx = function (t, e) {\n if (t < -1 || t >= this.dim + 1 || e < -1 || e >= this.dim + 1) throw new RangeError("out of range source coordinates for DEM data");\n return (e + 1) * this.stride + (t + 1);\n }, $l.prototype._unpackMapbox = function (t, e, r) {\n return (256 * t * 256 + 256 * e + r) / 10 - 1e4;\n }, $l.prototype._unpackTerrarium = function (t, e, r) {\n return 256 * t + e + r / 256 - 32768;\n }, $l.prototype.getPixels = function () {\n return new bo({\n width: this.stride,\n height: this.stride\n }, new Uint8Array(this.data.buffer));\n }, $l.prototype.backfillBorder = function (t, e, r) {\n if (this.dim !== t.dim) throw new Error("dem dimension mismatch");\n var n = e * this.dim,\n i = e * this.dim + this.dim,\n a = r * this.dim,\n o = r * this.dim + this.dim;\n\n switch (e) {\n case -1:\n n = i - 1;\n break;\n\n case 1:\n i = n + 1;\n }\n\n switch (r) {\n case -1:\n a = o - 1;\n break;\n\n case 1:\n o = a + 1;\n }\n\n for (var s = -e * this.dim, u = -r * this.dim, l = a; l < o; l++) {\n for (var p = n; p < i; p++) {\n this.data[this._idx(p, l)] = t.data[this._idx(p + s, l + u)];\n }\n }\n }, On("DEMData", $l);\n\n var Wl = function Wl(t) {\n this._stringToNumber = {}, this._numberToString = [];\n\n for (var e = 0; e < t.length; e++) {\n var r = t[e];\n this._stringToNumber[r] = e, this._numberToString[e] = r;\n }\n };\n\n Wl.prototype.encode = function (t) {\n return this._stringToNumber[t];\n }, Wl.prototype.decode = function (t) {\n return this._numberToString[t];\n };\n\n var Ql = function Ql(t, e, r, n, i) {\n this.type = "Feature", this._vectorTileFeature = t, t._z = e, t._x = r, t._y = n, this.properties = t.properties, this.id = i;\n },\n tp = {\n geometry: {\n configurable: !0\n }\n };\n\n tp.geometry.get = function () {\n return void 0 === this._geometry && (this._geometry = this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x, this._vectorTileFeature._y, this._vectorTileFeature._z).geometry), this._geometry;\n }, tp.geometry.set = function (t) {\n this._geometry = t;\n }, Ql.prototype.toJSON = function () {\n var t = {\n geometry: this.geometry\n };\n\n for (var e in this) {\n "_geometry" !== e && "_vectorTileFeature" !== e && (t[e] = this[e]);\n }\n\n return t;\n }, Object.defineProperties(Ql.prototype, tp);\n\n var ep = function ep() {\n this.state = {}, this.stateChanges = {}, this.deletedStates = {};\n };\n\n ep.prototype.updateState = function (t, e, r) {\n var n = String(e);\n if (this.stateChanges[t] = this.stateChanges[t] || {}, this.stateChanges[t][n] = this.stateChanges[t][n] || {}, h(this.stateChanges[t][n], r), null === this.deletedStates[t]) for (var i in this.deletedStates[t] = {}, this.state[t]) {\n i !== n && (this.deletedStates[t][i] = null);\n } else if (this.deletedStates[t] && null === this.deletedStates[t][n]) for (var a in this.deletedStates[t][n] = {}, this.state[t][n]) {\n r[a] || (this.deletedStates[t][n][a] = null);\n } else for (var o in r) {\n this.deletedStates[t] && this.deletedStates[t][n] && null === this.deletedStates[t][n][o] && delete this.deletedStates[t][n][o];\n }\n }, ep.prototype.removeFeatureState = function (t, e, r) {\n if (null !== this.deletedStates[t]) {\n var n = String(e);\n if (this.deletedStates[t] = this.deletedStates[t] || {}, r && void 0 !== e) null !== this.deletedStates[t][n] && (this.deletedStates[t][n] = this.deletedStates[t][n] || {}, this.deletedStates[t][n][r] = null);else if (void 0 !== e) {\n if (this.stateChanges[t] && this.stateChanges[t][n]) for (r in this.deletedStates[t][n] = {}, this.stateChanges[t][n]) {\n this.deletedStates[t][n][r] = null;\n } else this.deletedStates[t][n] = null;\n } else this.deletedStates[t] = null;\n }\n }, ep.prototype.getState = function (t, e) {\n var r = String(e),\n n = h({}, (this.state[t] || {})[r], (this.stateChanges[t] || {})[r]);\n if (null === this.deletedStates[t]) return {};\n\n if (this.deletedStates[t]) {\n var i = this.deletedStates[t][e];\n if (null === i) return {};\n\n for (var a in i) {\n delete n[a];\n }\n }\n\n return n;\n }, ep.prototype.initializeTileState = function (t, e) {\n t.setFeatureState(this.state, e);\n }, ep.prototype.coalesceChanges = function (t, e) {\n var r = {};\n\n for (var n in this.stateChanges) {\n this.state[n] = this.state[n] || {};\n var i = {};\n\n for (var a in this.stateChanges[n]) {\n this.state[n][a] || (this.state[n][a] = {}), h(this.state[n][a], this.stateChanges[n][a]), i[a] = this.state[n][a];\n }\n\n r[n] = i;\n }\n\n for (var o in this.deletedStates) {\n this.state[o] = this.state[o] || {};\n var s = {};\n if (null === this.deletedStates[o]) for (var u in this.state[o]) {\n s[u] = {}, this.state[o][u] = {};\n } else for (var l in this.deletedStates[o]) {\n if (null === this.deletedStates[o][l]) this.state[o][l] = {};else for (var p = 0, c = Object.keys(this.deletedStates[o][l]); p < c.length; p += 1) {\n delete this.state[o][l][c[p]];\n }\n s[l] = this.state[o][l];\n }\n r[o] = r[o] || {}, h(r[o], s);\n }\n\n if (this.stateChanges = {}, this.deletedStates = {}, 0 !== Object.keys(r).length) for (var f in t) {\n t[f].setFeatureState(r, e);\n }\n };\n\n var rp = function rp(t, e) {\n this.tileID = t, this.x = t.canonical.x, this.y = t.canonical.y, this.z = t.canonical.z, this.grid = new Vn(8192, 16, 0), this.grid3D = new Vn(8192, 16, 0), this.featureIndexArray = new oa(), this.promoteId = e;\n };\n\n function np(t, e, r, n, i) {\n return x(t, function (t, a) {\n var o = e instanceof mi ? e.get(a) : null;\n return o && o.evaluate ? o.evaluate(r, n, i) : o;\n });\n }\n\n function ip(t) {\n for (var e = 1 / 0, r = 1 / 0, n = -1 / 0, i = -1 / 0, a = 0, o = t; a < o.length; a += 1) {\n var s = o[a];\n e = Math.min(e, s.x), r = Math.min(r, s.y), n = Math.max(n, s.x), i = Math.max(i, s.y);\n }\n\n return {\n minX: e,\n minY: r,\n maxX: n,\n maxY: i\n };\n }\n\n function ap(t, e) {\n return e - t;\n }\n\n rp.prototype.insert = function (t, e, r, n, i, a) {\n var o = this.featureIndexArray.length;\n this.featureIndexArray.emplaceBack(r, n, i);\n\n for (var s = a ? this.grid3D : this.grid, u = 0; u < e.length; u++) {\n for (var l = e[u], p = [1 / 0, 1 / 0, -1 / 0, -1 / 0], c = 0; c < l.length; c++) {\n var h = l[c];\n p[0] = Math.min(p[0], h.x), p[1] = Math.min(p[1], h.y), p[2] = Math.max(p[2], h.x), p[3] = Math.max(p[3], h.y);\n }\n\n p[0] < 8192 && p[1] < 8192 && p[2] >= 0 && p[3] >= 0 && s.insert(o, p[0], p[1], p[2], p[3]);\n }\n }, rp.prototype.loadVTLayers = function () {\n return this.vtLayers || (this.vtLayers = new ws.VectorTile(new $s(this.rawTileData)).layers, this.sourceLayerCoder = new Wl(this.vtLayers ? Object.keys(this.vtLayers).sort() : ["_geojsonTileLayer"])), this.vtLayers;\n }, rp.prototype.query = function (t, e, r, n) {\n var a = this;\n this.loadVTLayers();\n\n for (var o = t.params || {}, s = 8192 / t.tileSize / t.scale, u = sn(o.filter), l = t.queryGeometry, p = t.queryPadding * s, c = ip(l), h = this.grid.query(c.minX - p, c.minY - p, c.maxX + p, c.maxY + p), f = ip(t.cameraQueryGeometry), y = this.grid3D.query(f.minX - p, f.minY - p, f.maxX + p, f.maxY + p, function (e, r, n, a) {\n return function (t, e, r, n, a) {\n for (var o = 0, s = t; o < s.length; o += 1) {\n var u = s[o];\n if (e <= u.x && r <= u.y && n >= u.x && a >= u.y) return !0;\n }\n\n var l = [new i(e, r), new i(e, a), new i(n, a), new i(n, r)];\n if (t.length > 2) for (var p = 0, c = l; p < c.length; p += 1) {\n if (Qa(t, c[p])) return !0;\n }\n\n for (var h = 0; h < t.length - 1; h++) {\n if (to(t[h], t[h + 1], l)) return !0;\n }\n\n return !1;\n }(t.cameraQueryGeometry, e - p, r - p, n + p, a + p);\n }), d = 0, m = y; d < m.length; d += 1) {\n h.push(m[d]);\n }\n\n h.sort(ap);\n\n for (var v, g = {}, x = function x(i) {\n var p = h[i];\n\n if (p !== v) {\n v = p;\n var c = a.featureIndexArray.get(p),\n f = null;\n a.loadMatchingFeature(g, c.bucketIndex, c.sourceLayerIndex, c.featureIndex, u, o.layers, o.availableImages, e, r, n, function (e, r, n) {\n return f || (f = Ua(e)), r.queryIntersectsFeature(l, e, n, f, a.z, t.transform, s, t.pixelPosMatrix);\n });\n }\n }, b = 0; b < h.length; b++) {\n x(b);\n }\n\n return g;\n }, rp.prototype.loadMatchingFeature = function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = this.bucketLayerIDs[e];\n\n if (!a || function (t, e) {\n for (var r = 0; r < t.length; r++) {\n if (e.indexOf(t[r]) >= 0) return !0;\n }\n\n return !1;\n }(a, c)) {\n var f = this.sourceLayerCoder.decode(r),\n y = this.vtLayers[f].feature(n);\n\n if (i.needGeometry) {\n var d = ja(y, !0);\n if (!i.filter(new ui(this.tileID.overscaledZ), d, this.tileID.canonical)) return;\n } else if (!i.filter(new ui(this.tileID.overscaledZ), y)) return;\n\n for (var m = this.getId(y, f), v = 0; v < c.length; v++) {\n var g = c[v];\n\n if (!(a && a.indexOf(g) < 0)) {\n var x = s[g];\n\n if (x) {\n var b = {};\n void 0 !== m && l && (b = l.getState(x.sourceLayer || "_geojsonTileLayer", m));\n var w = h({}, u[g]);\n w.paint = np(w.paint, x.paint, y, b, o), w.layout = np(w.layout, x.layout, y, b, o);\n\n var _ = !p || p(y, x, b);\n\n if (_) {\n var A = new Ql(y, this.z, this.x, this.y, m);\n A.layer = w;\n var S = t[g];\n void 0 === S && (S = t[g] = []), S.push({\n featureIndex: n,\n feature: A,\n intersectionZ: _\n });\n }\n }\n }\n }\n }\n }, rp.prototype.lookupSymbolFeatures = function (t, e, r, n, i, a, o, s) {\n var u = {};\n this.loadVTLayers();\n\n for (var l = sn(i), p = 0, c = t; p < c.length; p += 1) {\n this.loadMatchingFeature(u, r, n, c[p], l, a, o, s, e);\n }\n\n return u;\n }, rp.prototype.hasLayer = function (t) {\n for (var e = 0, r = this.bucketLayerIDs; e < r.length; e += 1) {\n for (var n = 0, i = r[e]; n < i.length; n += 1) {\n if (t === i[n]) return !0;\n }\n }\n\n return !1;\n }, rp.prototype.getId = function (t, e) {\n var r = t.id;\n return this.promoteId && "boolean" == typeof (r = t.properties["string" == typeof this.promoteId ? this.promoteId : this.promoteId[e]]) && (r = Number(r)), r;\n }, On("FeatureIndex", rp, {\n omit: ["rawTileData", "sourceLayerCoder"]\n });\n\n var op = function op(t, e) {\n this.tileID = t, this.uid = y(), this.uses = 0, this.tileSize = e, this.buckets = {}, this.expirationTime = null, this.queryPadding = 0, this.hasSymbolBuckets = !1, this.hasRTLText = !1, this.dependencies = {}, this.expiredRequestCount = 0, this.state = "loading";\n };\n\n op.prototype.registerFadeDuration = function (t) {\n var e = t + this.timeAdded;\n e < R.now() || this.fadeEndTime && e < this.fadeEndTime || (this.fadeEndTime = e);\n }, op.prototype.wasRequested = function () {\n return "errored" === this.state || "loaded" === this.state || "reloading" === this.state;\n }, op.prototype.loadVectorData = function (t, e, r) {\n if (this.hasData() && this.unloadVectorData(), this.state = "loaded", t) {\n for (var n in t.featureIndex && (this.latestFeatureIndex = t.featureIndex, t.rawTileData ? (this.latestRawTileData = t.rawTileData, this.latestFeatureIndex.rawTileData = t.rawTileData) : this.latestRawTileData && (this.latestFeatureIndex.rawTileData = this.latestRawTileData)), this.collisionBoxArray = t.collisionBoxArray, this.buckets = function (t, e) {\n var r = {};\n if (!e) return r;\n\n for (var n = function n() {\n var t = a[i],\n n = t.layerIds.map(function (t) {\n return e.getLayer(t);\n }).filter(Boolean);\n\n if (0 !== n.length) {\n t.layers = n, t.stateDependentLayerIds && (t.stateDependentLayers = t.stateDependentLayerIds.map(function (t) {\n return n.filter(function (e) {\n return e.id === t;\n })[0];\n }));\n\n for (var o = 0, s = n; o < s.length; o += 1) {\n r[s[o].id] = t;\n }\n }\n }, i = 0, a = t; i < a.length; i += 1) {\n n();\n }\n\n return r;\n }(t.buckets, e.style), this.hasSymbolBuckets = !1, this.buckets) {\n var i = this.buckets[n];\n\n if (i instanceof gl) {\n if (this.hasSymbolBuckets = !0, !r) break;\n i.justReloaded = !0;\n }\n }\n\n if (this.hasRTLText = !1, this.hasSymbolBuckets) for (var a in this.buckets) {\n var o = this.buckets[a];\n\n if (o instanceof gl && o.hasRTLText) {\n this.hasRTLText = !0, si.isLoading() || si.isLoaded() || "deferred" !== ai() || oi();\n break;\n }\n }\n\n for (var s in this.queryPadding = 0, this.buckets) {\n var u = this.buckets[s];\n this.queryPadding = Math.max(this.queryPadding, e.style.getLayer(s).queryRadius(u));\n }\n\n t.imageAtlas && (this.imageAtlas = t.imageAtlas), t.glyphAtlasImage && (this.glyphAtlasImage = t.glyphAtlasImage);\n } else this.collisionBoxArray = new Wi();\n }, op.prototype.unloadVectorData = function () {\n for (var t in this.buckets) {\n this.buckets[t].destroy();\n }\n\n this.buckets = {}, this.imageAtlasTexture && this.imageAtlasTexture.destroy(), this.imageAtlas && (this.imageAtlas = null), this.glyphAtlasTexture && this.glyphAtlasTexture.destroy(), this.latestFeatureIndex = null, this.state = "unloaded";\n }, op.prototype.getBucket = function (t) {\n return this.buckets[t.id];\n }, op.prototype.upload = function (t) {\n for (var e in this.buckets) {\n var r = this.buckets[e];\n r.uploadPending() && r.upload(t);\n }\n\n var n = t.gl;\n this.imageAtlas && !this.imageAtlas.uploaded && (this.imageAtlasTexture = new Vl(t, this.imageAtlas.image, n.RGBA), this.imageAtlas.uploaded = !0), this.glyphAtlasImage && (this.glyphAtlasTexture = new Vl(t, this.glyphAtlasImage, n.ALPHA), this.glyphAtlasImage = null);\n }, op.prototype.prepare = function (t) {\n this.imageAtlas && this.imageAtlas.patchUpdatedImages(t, this.imageAtlasTexture);\n }, op.prototype.queryRenderedFeatures = function (t, e, r, n, i, a, o, s, u, l) {\n return this.latestFeatureIndex && this.latestFeatureIndex.rawTileData ? this.latestFeatureIndex.query({\n queryGeometry: n,\n cameraQueryGeometry: i,\n scale: a,\n tileSize: this.tileSize,\n pixelPosMatrix: l,\n transform: s,\n params: o,\n queryPadding: this.queryPadding * u\n }, t, e, r) : {};\n }, op.prototype.querySourceFeatures = function (t, e) {\n var r = this.latestFeatureIndex;\n\n if (r && r.rawTileData) {\n var n = r.loadVTLayers(),\n i = e ? e.sourceLayer : "",\n a = n._geojsonTileLayer || n[i];\n if (a) for (var o = sn(e && e.filter), s = this.tileID.canonical, u = s.z, l = s.x, p = s.y, c = {\n z: u,\n x: l,\n y: p\n }, h = 0; h < a.length; h++) {\n var f = a.feature(h);\n\n if (o.needGeometry) {\n var y = ja(f, !0);\n if (!o.filter(new ui(this.tileID.overscaledZ), y, this.tileID.canonical)) continue;\n } else if (!o.filter(new ui(this.tileID.overscaledZ), f)) continue;\n\n var d = r.getId(f, i),\n m = new Ql(f, u, l, p, d);\n m.tile = c, t.push(m);\n }\n }\n }, op.prototype.hasData = function () {\n return "loaded" === this.state || "reloading" === this.state || "expired" === this.state;\n }, op.prototype.patternsLoaded = function () {\n return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;\n }, op.prototype.setExpiryData = function (t) {\n var e = this.expirationTime;\n\n if (t.cacheControl) {\n var r = z(t.cacheControl);\n r["max-age"] && (this.expirationTime = Date.now() + 1e3 * r["max-age"]);\n } else t.expires && (this.expirationTime = new Date(t.expires).getTime());\n\n if (this.expirationTime) {\n var n = Date.now(),\n i = !1;\n if (this.expirationTime > n) i = !1;else if (e) {\n if (this.expirationTime < e) i = !0;else {\n var a = this.expirationTime - e;\n a ? this.expirationTime = n + Math.max(a, 3e4) : i = !0;\n }\n } else i = !0;\n i ? (this.expiredRequestCount++, this.state = "expired") : this.expiredRequestCount = 0;\n }\n }, op.prototype.getExpiryTimeout = function () {\n if (this.expirationTime) return this.expiredRequestCount ? 1e3 * (1 << Math.min(this.expiredRequestCount - 1, 31)) : Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);\n }, op.prototype.setFeatureState = function (t, e) {\n if (this.latestFeatureIndex && this.latestFeatureIndex.rawTileData && 0 !== Object.keys(t).length) {\n var r = this.latestFeatureIndex.loadVTLayers();\n\n for (var n in this.buckets) {\n if (e.style.hasLayer(n)) {\n var i = this.buckets[n],\n a = i.layers[0].sourceLayer || "_geojsonTileLayer",\n o = r[a],\n s = t[a];\n\n if (o && s && 0 !== Object.keys(s).length) {\n i.update(s, o, this.imageAtlas && this.imageAtlas.patternPositions || {});\n var u = e && e.style && e.style.getLayer(n);\n u && (this.queryPadding = Math.max(this.queryPadding, u.queryRadius(i)));\n }\n }\n }\n }\n }, op.prototype.holdingForFade = function () {\n return void 0 !== this.symbolFadeHoldUntil;\n }, op.prototype.symbolFadeFinished = function () {\n return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < R.now();\n }, op.prototype.clearFadeHold = function () {\n this.symbolFadeHoldUntil = void 0;\n }, op.prototype.setHoldDuration = function (t) {\n this.symbolFadeHoldUntil = R.now() + t;\n }, op.prototype.setDependencies = function (t, e) {\n for (var r = {}, n = 0, i = e; n < i.length; n += 1) {\n r[i[n]] = !0;\n }\n\n this.dependencies[t] = r;\n }, op.prototype.hasDependency = function (t, e) {\n for (var r = 0, n = t; r < n.length; r += 1) {\n var i = this.dependencies[n[r]];\n if (i) for (var a = 0, o = e; a < o.length; a += 1) {\n if (i[o[a]]) return !0;\n }\n }\n\n return !1;\n };\n\n var sp = o.performance,\n up = function up(t) {\n this._marks = {\n start: [t.url, "start"].join("#"),\n end: [t.url, "end"].join("#"),\n measure: t.url.toString()\n }, sp.mark(this._marks.start);\n };\n\n up.prototype.finish = function () {\n sp.mark(this._marks.end);\n var t = sp.getEntriesByName(this._marks.measure);\n return 0 === t.length && (sp.measure(this._marks.measure, this._marks.start, this._marks.end), t = sp.getEntriesByName(this._marks.measure), sp.clearMarks(this._marks.start), sp.clearMarks(this._marks.end), sp.clearMeasures(this._marks.measure)), t;\n }, t.Actor = Dl, t.AlphaImage = xo, t.CanonicalTileID = Xl, t.CollisionBoxArray = Wi, t.Color = ee, t.DEMData = $l, t.DataConstantProperty = vi, t.DictionaryCoder = Wl, t.EXTENT = 8192, t.ErrorEvent = Ct, t.EvaluationParameters = ui, t.Event = zt, t.Evented = Et, t.FeatureIndex = rp, t.FillBucket = us, t.FillExtrusionBucket = ks, t.ImageAtlas = wu, t.ImagePosition = xu, t.LineBucket = Ds, t.LngLat = Ol, t.LngLatBounds = Rl, t.MercatorCoordinate = Zl, t.ONE_EM = 24, t.OverscaledTileID = Hl, t.Point = i, t.Point$1 = i, t.Properties = _i, t.Protobuf = $s, t.RGBAImage = bo, t.RequestManager = G, t.RequestPerformance = up, t.ResourceType = yt, t.SegmentVector = ua, t.SourceFeatureState = ep, t.StructArrayLayout1ui2 = Hi, t.StructArrayLayout2f1f2i16 = Ui, t.StructArrayLayout2i4 = Ei, t.StructArrayLayout3ui6 = qi, t.StructArrayLayout4i8 = Pi, t.SymbolBucket = gl, t.Texture = Vl, t.Tile = op, t.Transitionable = ci, t.Uniform1f = wa, t.Uniform1i = ba, t.Uniform2f = _a, t.Uniform3f = Aa, t.Uniform4f = Sa, t.UniformColor = ka, t.UniformMatrix4f = za, t.UnwrappedTileID = Jl, t.ValidationError = Mt, t.WritingMode = _u, t.ZoomHistory = Gn, t.add = function (t, e, r) {\n return t[0] = e[0] + r[0], t[1] = e[1] + r[1], t[2] = e[2] + r[2], t;\n }, t.addDynamicAttributes = yl, t.asyncAll = function (t, e, r) {\n if (!t.length) return r(null, []);\n var n = t.length,\n i = new Array(t.length),\n a = null;\n t.forEach(function (t, o) {\n e(t, function (t, e) {\n t && (a = t), i[o] = e, 0 == --n && r(a, i);\n });\n });\n }, t.bezier = u, t.bindAll = v, t.browser = R, t.cacheEntryPossiblyAdded = function (t) {\n ++ht > ut && (t.getActor().send("enforceCacheSizeLimit", st), ht = 0);\n }, t.clamp = p, t.clearTileCache = function (t) {\n var e = o.caches.delete("mapbox-tiles");\n t && e.catch(t).then(function () {\n return t();\n });\n }, t.clipLine = Xu, t.clone = function (t) {\n var e = new oo(16);\n return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e;\n }, t.clone$1 = w, t.clone$2 = function (t) {\n var e = new oo(3);\n return e[0] = t[0], e[1] = t[1], e[2] = t[2], e;\n }, t.collisionCircleLayout = Zs, t.config = O, t.create = function () {\n var t = new oo(16);\n return oo != Float32Array && (t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0), t[0] = 1, t[5] = 1, t[10] = 1, t[15] = 1, t;\n }, t.create$1 = function () {\n var t = new oo(9);\n return oo != Float32Array && (t[1] = 0, t[2] = 0, t[3] = 0, t[5] = 0, t[6] = 0, t[7] = 0), t[0] = 1, t[4] = 1, t[8] = 1, t;\n }, t.create$2 = function () {\n var t = new oo(4);\n return oo != Float32Array && (t[1] = 0, t[2] = 0), t[0] = 1, t[3] = 1, t;\n }, t.createCommonjsModule = e, t.createExpression = Xr, t.createLayout = zi, t.createStyleLayer = function (t) {\n return "custom" === t.type ? new zl(t) : new Cl[t.type](t);\n }, t.cross = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = r[0],\n s = r[1],\n u = r[2];\n return t[0] = i * u - a * s, t[1] = a * o - n * u, t[2] = n * s - i * o, t;\n }, t.deepEqual = function t(e, r) {\n if (Array.isArray(e)) {\n if (!Array.isArray(r) || e.length !== r.length) return !1;\n\n for (var n = 0; n < e.length; n++) {\n if (!t(e[n], r[n])) return !1;\n }\n\n return !0;\n }\n\n if ("object" == typeof e && null !== e && null !== r) {\n if ("object" != typeof r) return !1;\n if (Object.keys(e).length !== Object.keys(r).length) return !1;\n\n for (var i in e) {\n if (!t(e[i], r[i])) return !1;\n }\n\n return !0;\n }\n\n return e === r;\n }, t.dot = function (t, e) {\n return t[0] * e[0] + t[1] * e[1] + t[2] * e[2];\n }, t.dot$1 = function (t, e) {\n return t[0] * e[0] + t[1] * e[1] + t[2] * e[2] + t[3] * e[3];\n }, t.ease = l, t.emitValidationErrors = Tn, t.endsWith = g, t.enforceCacheSizeLimit = function (t) {\n lt(), tt && tt.then(function (e) {\n e.keys().then(function (r) {\n for (var n = 0; n < r.length - t; n++) {\n e.delete(r[n]);\n }\n });\n });\n }, t.evaluateSizeForFeature = Ru, t.evaluateSizeForZoom = Ou, t.evaluateVariableOffset = ol, t.evented = ii, t.extend = h, t.featureFilter = sn, t.filterObject = b, t.fromRotation = function (t, e) {\n var r = Math.sin(e),\n n = Math.cos(e);\n return t[0] = n, t[1] = r, t[2] = 0, t[3] = -r, t[4] = n, t[5] = 0, t[6] = 0, t[7] = 0, t[8] = 1, t;\n }, t.getAnchorAlignment = Tu, t.getAnchorJustification = sl, t.getArrayBuffer = wt, t.getImage = St, t.getJSON = function (t, e) {\n return bt(h(t, {\n type: "json"\n }), e);\n }, t.getRTLTextPluginStatus = ai, t.getReferrer = mt, t.getVideo = function (t, e) {\n var r,\n n,\n i = o.document.createElement("video");\n i.muted = !0, i.onloadstart = function () {\n e(null, i);\n };\n\n for (var a = 0; a < t.length; a++) {\n var s = o.document.createElement("source");\n r = t[a], n = void 0, (n = o.document.createElement("a")).href = r, (n.protocol !== o.document.location.protocol || n.host !== o.document.location.host) && (i.crossOrigin = "Anonymous"), s.src = t[a], i.appendChild(s);\n }\n\n return {\n cancel: function cancel() {}\n };\n }, t.identity = so, t.invert = function (t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = e[3],\n o = e[4],\n s = e[5],\n u = e[6],\n l = e[7],\n p = e[8],\n c = e[9],\n h = e[10],\n f = e[11],\n y = e[12],\n d = e[13],\n m = e[14],\n v = e[15],\n g = r * s - n * o,\n x = r * u - i * o,\n b = r * l - a * o,\n w = n * u - i * s,\n _ = n * l - a * s,\n A = i * l - a * u,\n S = p * d - c * y,\n k = p * m - h * y,\n I = p * v - f * y,\n z = c * m - h * d,\n C = c * v - f * d,\n E = h * v - f * m,\n P = g * E - x * C + b * z + w * I - _ * k + A * S;\n\n return P ? (t[0] = (s * E - u * C + l * z) * (P = 1 / P), t[1] = (i * C - n * E - a * z) * P, t[2] = (d * A - m * _ + v * w) * P, t[3] = (h * _ - c * A - f * w) * P, t[4] = (u * I - o * E - l * k) * P, t[5] = (r * E - i * I + a * k) * P, t[6] = (m * b - y * A - v * x) * P, t[7] = (p * A - h * b + f * x) * P, t[8] = (o * C - s * I + l * S) * P, t[9] = (n * I - r * C - a * S) * P, t[10] = (y * _ - d * b + v * g) * P, t[11] = (c * b - p * _ - f * g) * P, t[12] = (s * k - o * z - u * S) * P, t[13] = (r * z - n * k + i * S) * P, t[14] = (d * x - y * w - m * g) * P, t[15] = (p * w - c * x + h * g) * P, t) : null;\n }, t.isChar = Zn, t.isMapboxURL = Z, t.keysDifference = function (t, e) {\n var r = [];\n\n for (var n in t) {\n n in e || r.push(n);\n }\n\n return r;\n }, t.makeRequest = bt, t.mapObject = x, t.mercatorXfromLng = ql, t.mercatorYfromLat = Nl, t.mercatorZfromAltitude = Kl, t.mul = po, t.multiply = uo, t.mvt = ws, t.nextPowerOfTwo = function (t) {\n return t <= 1 ? 1 : Math.pow(2, Math.ceil(Math.log(t) / Math.LN2));\n }, t.normalize = function (t, e) {\n var r = e[0],\n n = e[1],\n i = e[2],\n a = r * r + n * n + i * i;\n return a > 0 && (a = 1 / Math.sqrt(a)), t[0] = e[0] * a, t[1] = e[1] * a, t[2] = e[2] * a, t;\n }, t.number = Ge, t.offscreenCanvasSupported = ft, t.ortho = function (t, e, r, n, i, a, o) {\n var s = 1 / (e - r),\n u = 1 / (n - i),\n l = 1 / (a - o);\n return t[0] = -2 * s, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = -2 * u, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 2 * l, t[11] = 0, t[12] = (e + r) * s, t[13] = (i + n) * u, t[14] = (o + a) * l, t[15] = 1, t;\n }, t.parseGlyphPBF = function (t) {\n return new $s(t).readFields(du, []);\n }, t.pbf = $s, t.performSymbolLayout = function (t, e, r, n, i, a, o) {\n t.createArrays(), t.tilePixelRatio = 8192 / (512 * t.overscaling), t.compareText = {}, t.iconsNeedLinear = !1;\n var s = t.layers[0].layout,\n u = t.layers[0]._unevaluatedLayout._values,\n l = {};\n\n if ("composite" === t.textSizeData.kind) {\n var p = t.textSizeData,\n c = p.maxZoom;\n l.compositeTextSizes = [u["text-size"].possiblyEvaluate(new ui(p.minZoom), o), u["text-size"].possiblyEvaluate(new ui(c), o)];\n }\n\n if ("composite" === t.iconSizeData.kind) {\n var h = t.iconSizeData,\n f = h.maxZoom;\n l.compositeIconSizes = [u["icon-size"].possiblyEvaluate(new ui(h.minZoom), o), u["icon-size"].possiblyEvaluate(new ui(f), o)];\n }\n\n l.layoutTextSize = u["text-size"].possiblyEvaluate(new ui(t.zoom + 1), o), l.layoutIconSize = u["icon-size"].possiblyEvaluate(new ui(t.zoom + 1), o), l.textMaxSize = u["text-size"].possiblyEvaluate(new ui(18));\n\n for (var y = 24 * s.get("text-line-height"), d = "map" === s.get("text-rotation-alignment") && "point" !== s.get("symbol-placement"), m = s.get("text-keep-upright"), v = s.get("text-size"), g = function g() {\n var a = b[x],\n u = s.get("text-font").evaluate(a, {}, o).join(","),\n p = v.evaluate(a, {}, o),\n c = l.layoutTextSize.evaluate(a, {}, o),\n h = l.layoutIconSize.evaluate(a, {}, o),\n f = {\n horizontal: {},\n vertical: void 0\n },\n g = a.text,\n w = [0, 0];\n\n if (g) {\n var _ = g.toString(),\n S = 24 * s.get("text-letter-spacing").evaluate(a, {}, o),\n k = function (t) {\n for (var e = 0, r = t; e < r.length; e += 1) {\n if (n = r[e].charCodeAt(0), Zn.Arabic(n) || Zn["Arabic Supplement"](n) || Zn["Arabic Extended-A"](n) || Zn["Arabic Presentation Forms-A"](n) || Zn["Arabic Presentation Forms-B"](n)) return !1;\n }\n\n var n;\n return !0;\n }(_) ? S : 0,\n I = s.get("text-anchor").evaluate(a, {}, o),\n z = s.get("text-variable-anchor");\n\n if (!z) {\n var C = s.get("text-radial-offset").evaluate(a, {}, o);\n w = C ? ol(I, [24 * C, al]) : s.get("text-offset").evaluate(a, {}, o).map(function (t) {\n return 24 * t;\n });\n }\n\n var E = d ? "center" : s.get("text-justify").evaluate(a, {}, o),\n P = s.get("symbol-placement"),\n M = "point" === P ? 24 * s.get("text-max-width").evaluate(a, {}, o) : 0,\n B = function B() {\n t.allowVerticalPlacement && Xn(_) && (f.vertical = ku(g, e, r, i, u, M, y, I, "left", k, w, _u.vertical, !0, P, c, p));\n };\n\n if (!d && z) {\n for (var T = "auto" === E ? z.map(function (t) {\n return sl(t);\n }) : [E], V = !1, F = 0; F < T.length; F++) {\n var D = T[F];\n if (!f.horizontal[D]) if (V) f.horizontal[D] = f.horizontal[0];else {\n var L = ku(g, e, r, i, u, M, y, "center", D, k, w, _u.horizontal, !1, P, c, p);\n L && (f.horizontal[D] = L, V = 1 === L.positionedLines.length);\n }\n }\n\n B();\n } else {\n "auto" === E && (E = sl(I));\n var R = ku(g, e, r, i, u, M, y, I, E, k, w, _u.horizontal, !1, P, c, p);\n R && (f.horizontal[E] = R), B(), Xn(_) && d && m && (f.vertical = ku(g, e, r, i, u, M, y, I, E, k, w, _u.vertical, !1, P, c, p));\n }\n }\n\n var O = void 0,\n U = !1;\n\n if (a.icon && a.icon.name) {\n var j = n[a.icon.name];\n j && (O = function (t, e, r) {\n var n = Tu(r),\n i = e[0] - t.displaySize[0] * n.horizontalAlign,\n a = e[1] - t.displaySize[1] * n.verticalAlign;\n return {\n image: t,\n top: a,\n bottom: a + t.displaySize[1],\n left: i,\n right: i + t.displaySize[0]\n };\n }(i[a.icon.name], s.get("icon-offset").evaluate(a, {}, o), s.get("icon-anchor").evaluate(a, {}, o)), U = j.sdf, void 0 === t.sdfIcons ? t.sdfIcons = j.sdf : t.sdfIcons !== j.sdf && A("Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer"), (j.pixelRatio !== t.pixelRatio || 0 !== s.get("icon-rotate").constantOr(1)) && (t.iconsNeedLinear = !0));\n }\n\n var q = ll(f.horizontal) || f.vertical;\n t.iconsInText = !!q && q.iconsInText, (q || O) && function (t, e, r, n, i, a, o, s, u, l, p) {\n var c = a.textMaxSize.evaluate(e, {});\n void 0 === c && (c = o);\n\n var h,\n f = t.layers[0].layout,\n y = f.get("icon-offset").evaluate(e, {}, p),\n d = ll(r.horizontal),\n m = o / 24,\n v = t.tilePixelRatio * m,\n g = t.tilePixelRatio * c / 24,\n x = t.tilePixelRatio * s,\n b = t.tilePixelRatio * f.get("symbol-spacing"),\n w = f.get("text-padding") * t.tilePixelRatio,\n _ = f.get("icon-padding") * t.tilePixelRatio,\n S = f.get("text-max-angle") / 180 * Math.PI,\n k = "map" === f.get("text-rotation-alignment") && "point" !== f.get("symbol-placement"),\n I = "map" === f.get("icon-rotation-alignment") && "point" !== f.get("symbol-placement"),\n z = f.get("symbol-placement"),\n C = b / 2,\n E = f.get("icon-text-fit");\n\n n && "none" !== E && (t.allowVerticalPlacement && r.vertical && (h = Fu(n, r.vertical, E, f.get("icon-text-fit-padding"), y, m)), d && (n = Fu(n, d, E, f.get("icon-text-fit-padding"), y, m)));\n\n var P = function P(s, c) {\n c.x < 0 || c.x >= 8192 || c.y < 0 || c.y >= 8192 || function (t, e, r, n, i, a, o, s, u, l, p, c, h, f, y, d, m, v, g, x, b, w, _, S, k) {\n var I,\n z,\n C,\n E,\n P,\n M = t.addToLineVertexArray(e, r),\n B = 0,\n T = 0,\n V = 0,\n F = 0,\n D = -1,\n L = -1,\n R = {},\n O = fa(""),\n U = 0,\n j = 0;\n\n if (void 0 === s._unevaluatedLayout.getValue("text-radial-offset") ? (U = (I = s.layout.get("text-offset").evaluate(b, {}, S).map(function (t) {\n return 24 * t;\n }))[0], j = I[1]) : (U = 24 * s.layout.get("text-radial-offset").evaluate(b, {}, S), j = al), t.allowVerticalPlacement && n.vertical) {\n var q = s.layout.get("text-rotate").evaluate(b, {}, S) + 90;\n E = new Qu(u, e, l, p, c, n.vertical, h, f, y, q), o && (P = new Qu(u, e, l, p, c, o, m, v, y, q));\n }\n\n if (i) {\n var N = s.layout.get("icon-rotate").evaluate(b, {}),\n K = "none" !== s.layout.get("icon-text-fit"),\n G = Ju(i, N, _, K),\n Z = o ? Ju(o, N, _, K) : void 0;\n C = new Qu(u, e, l, p, c, i, m, v, !1, N), B = 4 * G.length;\n var X = t.iconSizeData,\n J = null;\n "source" === X.kind ? (J = [128 * s.layout.get("icon-size").evaluate(b, {})])[0] > 32640 && A(t.layerIds[0] + \': Value for "icon-size" is >= 255. Reduce your "icon-size".\') : "composite" === X.kind && ((J = [128 * w.compositeIconSizes[0].evaluate(b, {}, S), 128 * w.compositeIconSizes[1].evaluate(b, {}, S)])[0] > 32640 || J[1] > 32640) && A(t.layerIds[0] + \': Value for "icon-size" is >= 255. Reduce your "icon-size".\'), t.addSymbols(t.icon, G, J, x, g, b, !1, e, M.lineStartIndex, M.lineLength, -1, S), D = t.icon.placedSymbolArray.length - 1, Z && (T = 4 * Z.length, t.addSymbols(t.icon, Z, J, x, g, b, _u.vertical, e, M.lineStartIndex, M.lineLength, -1, S), L = t.icon.placedSymbolArray.length - 1);\n }\n\n for (var H in n.horizontal) {\n var Y = n.horizontal[H];\n\n if (!z) {\n O = fa(Y.text);\n var $ = s.layout.get("text-rotate").evaluate(b, {}, S);\n z = new Qu(u, e, l, p, c, Y, h, f, y, $);\n }\n\n var W = 1 === Y.positionedLines.length;\n if (V += ul(t, e, Y, a, s, y, b, d, M, n.vertical ? _u.horizontal : _u.horizontalOnly, W ? Object.keys(n.horizontal) : [H], R, D, w, S), W) break;\n }\n\n n.vertical && (F += ul(t, e, n.vertical, a, s, y, b, d, M, _u.vertical, ["vertical"], R, L, w, S));\n\n var Q = z ? z.boxStartIndex : t.collisionBoxArray.length,\n tt = z ? z.boxEndIndex : t.collisionBoxArray.length,\n et = E ? E.boxStartIndex : t.collisionBoxArray.length,\n rt = E ? E.boxEndIndex : t.collisionBoxArray.length,\n nt = C ? C.boxStartIndex : t.collisionBoxArray.length,\n it = C ? C.boxEndIndex : t.collisionBoxArray.length,\n at = P ? P.boxStartIndex : t.collisionBoxArray.length,\n ot = P ? P.boxEndIndex : t.collisionBoxArray.length,\n st = -1,\n ut = function ut(t, e) {\n return t && t.circleDiameter ? Math.max(t.circleDiameter, e) : e;\n };\n\n st = ut(z, st), st = ut(E, st), st = ut(C, st);\n var lt = (st = ut(P, st)) > -1 ? 1 : 0;\n lt && (st *= k / 24), t.glyphOffsetArray.length >= gl.MAX_GLYPHS && A("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"), void 0 !== b.sortKey && t.addToSortKeyRanges(t.symbolInstances.length, b.sortKey), t.symbolInstances.emplaceBack(e.x, e.y, R.right >= 0 ? R.right : -1, R.center >= 0 ? R.center : -1, R.left >= 0 ? R.left : -1, R.vertical || -1, D, L, O, Q, tt, et, rt, nt, it, at, ot, l, V, F, B, T, lt, 0, h, U, j, st);\n }(t, c, s, r, n, i, h, t.layers[0], t.collisionBoxArray, e.index, e.sourceLayerIndex, t.index, v, w, k, u, x, _, I, y, e, a, l, p, o);\n };\n\n if ("line" === z) for (var M = 0, B = Xu(e.geometry, 0, 0, 8192, 8192); M < B.length; M += 1) {\n for (var T = B[M], V = 0, F = Zu(T, b, S, r.vertical || d, n, 24, g, t.overscaling, 8192); V < F.length; V += 1) {\n var D = F[V];\n d && pl(t, d.text, C, D) || P(T, D);\n }\n } else if ("line-center" === z) for (var L = 0, R = e.geometry; L < R.length; L += 1) {\n var O = R[L];\n\n if (O.length > 1) {\n var U = Gu(O, S, r.vertical || d, n, 24, g);\n U && P(O, U);\n }\n } else if ("Polygon" === e.type) for (var j = 0, q = is(e.geometry, 0); j < q.length; j += 1) {\n var N = q[j],\n K = rl(N, 16);\n P(N[0], new Du(K.x, K.y, 0));\n } else if ("LineString" === e.type) for (var G = 0, Z = e.geometry; G < Z.length; G += 1) {\n var X = Z[G];\n P(X, new Du(X[0].x, X[0].y, 0));\n } else if ("Point" === e.type) for (var J = 0, H = e.geometry; J < H.length; J += 1) {\n for (var Y = 0, $ = H[J]; Y < $.length; Y += 1) {\n var W = $[Y];\n P([W], new Du(W.x, W.y, 0));\n }\n }\n }(t, a, f, O, n, l, c, h, w, U, o);\n }, x = 0, b = t.features; x < b.length; x += 1) {\n g();\n }\n\n a && t.generateCollisionDebugBuffers();\n }, t.perspective = function (t, e, r, n, i) {\n var a,\n o = 1 / Math.tan(e / 2);\n return t[0] = o / r, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = o, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[11] = -1, t[12] = 0, t[13] = 0, t[15] = 0, null != i && i !== 1 / 0 ? (t[10] = (i + n) * (a = 1 / (n - i)), t[14] = 2 * i * n * a) : (t[10] = -1, t[14] = -2 * n), t;\n }, t.pick = function (t, e) {\n for (var r = {}, n = 0; n < e.length; n++) {\n var i = e[n];\n i in t && (r[i] = t[i]);\n }\n\n return r;\n }, t.plugin = si, t.polygonIntersectsPolygon = Ka, t.postMapLoadEvent = ot, t.postTurnstileEvent = it, t.potpack = gu, t.refProperties = ["type", "source", "source-layer", "minzoom", "maxzoom", "filter", "layout"], t.register = On, t.registerForPluginStateChange = function (t) {\n return t({\n pluginStatus: ti,\n pluginURL: ei\n }), ii.on("pluginStateChange", t), t;\n }, t.renderColorRamp = _o, t.rotate = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2],\n o = e[3],\n s = Math.sin(r),\n u = Math.cos(r);\n return t[0] = n * u + a * s, t[1] = i * u + o * s, t[2] = n * -s + a * u, t[3] = i * -s + o * u, t;\n }, t.rotateX = function (t, e, r) {\n var n = Math.sin(r),\n i = Math.cos(r),\n a = e[4],\n o = e[5],\n s = e[6],\n u = e[7],\n l = e[8],\n p = e[9],\n c = e[10],\n h = e[11];\n return e !== t && (t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15]), t[4] = a * i + l * n, t[5] = o * i + p * n, t[6] = s * i + c * n, t[7] = u * i + h * n, t[8] = l * i - a * n, t[9] = p * i - o * n, t[10] = c * i - s * n, t[11] = h * i - u * n, t;\n }, t.rotateZ = function (t, e, r) {\n var n = Math.sin(r),\n i = Math.cos(r),\n a = e[0],\n o = e[1],\n s = e[2],\n u = e[3],\n l = e[4],\n p = e[5],\n c = e[6],\n h = e[7];\n return e !== t && (t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15]), t[0] = a * i + l * n, t[1] = o * i + p * n, t[2] = s * i + c * n, t[3] = u * i + h * n, t[4] = l * i - a * n, t[5] = p * i - o * n, t[6] = c * i - s * n, t[7] = h * i - u * n, t;\n }, t.scale = function (t, e, r) {\n var n = r[0],\n i = r[1],\n a = r[2];\n return t[0] = e[0] * n, t[1] = e[1] * n, t[2] = e[2] * n, t[3] = e[3] * n, t[4] = e[4] * i, t[5] = e[5] * i, t[6] = e[6] * i, t[7] = e[7] * i, t[8] = e[8] * a, t[9] = e[9] * a, t[10] = e[10] * a, t[11] = e[11] * a, t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t;\n }, t.scale$1 = function (t, e, r) {\n return t[0] = e[0] * r, t[1] = e[1] * r, t[2] = e[2] * r, t[3] = e[3] * r, t;\n }, t.scale$2 = function (t, e, r) {\n return t[0] = e[0] * r, t[1] = e[1] * r, t[2] = e[2] * r, t;\n }, t.setCacheLimits = function (t, e) {\n st = t, ut = e;\n }, t.setRTLTextPlugin = function (t, e, r) {\n if (void 0 === r && (r = !1), "deferred" === ti || "loading" === ti || "loaded" === ti) throw new Error("setRTLTextPlugin cannot be called multiple times.");\n ei = R.resolveURL(t), ti = "deferred", Qn = e, ni(), r || oi();\n }, t.sphericalToCartesian = function (t) {\n var e = t[0],\n r = t[1],\n n = t[2];\n return r += 90, r *= Math.PI / 180, n *= Math.PI / 180, {\n x: e * Math.cos(r) * Math.sin(n),\n y: e * Math.sin(r) * Math.sin(n),\n z: e * Math.cos(n)\n };\n }, t.sqrLen = function (t) {\n var e = t[0],\n r = t[1];\n return e * e + r * r;\n }, t.styleSpec = Pt, t.sub = function (t, e, r) {\n return t[0] = e[0] - r[0], t[1] = e[1] - r[1], t[2] = e[2] - r[2], t;\n }, t.symbolSize = Uu, t.transformMat3 = function (t, e, r) {\n var n = e[0],\n i = e[1],\n a = e[2];\n return t[0] = n * r[0] + i * r[3] + a * r[6], t[1] = n * r[1] + i * r[4] + a * r[7], t[2] = n * r[2] + i * r[5] + a * r[8], t;\n }, t.transformMat4 = co, t.translate = function (t, e, r) {\n var n,\n i,\n a,\n o,\n s,\n u,\n l,\n p,\n c,\n h,\n f,\n y,\n d = r[0],\n m = r[1],\n v = r[2];\n return e === t ? (t[12] = e[0] * d + e[4] * m + e[8] * v + e[12], t[13] = e[1] * d + e[5] * m + e[9] * v + e[13], t[14] = e[2] * d + e[6] * m + e[10] * v + e[14], t[15] = e[3] * d + e[7] * m + e[11] * v + e[15]) : (i = e[1], a = e[2], o = e[3], s = e[4], u = e[5], l = e[6], p = e[7], c = e[8], h = e[9], f = e[10], y = e[11], t[0] = n = e[0], t[1] = i, t[2] = a, t[3] = o, t[4] = s, t[5] = u, t[6] = l, t[7] = p, t[8] = c, t[9] = h, t[10] = f, t[11] = y, t[12] = n * d + s * m + c * v + e[12], t[13] = i * d + u * m + h * v + e[13], t[14] = a * d + l * m + f * v + e[14], t[15] = o * d + p * m + y * v + e[15]), t;\n }, t.triggerPluginCompletionEvent = ri, t.uniqueId = y, t.validateCustomStyleLayer = function (t) {\n var e = [],\n r = t.id;\n return void 0 === r && e.push({\n message: "layers." + r + \': missing required property "id"\'\n }), void 0 === t.render && e.push({\n message: "layers." + r + \': missing required method "render"\'\n }), t.renderingMode && "2d" !== t.renderingMode && "3d" !== t.renderingMode && e.push({\n message: "layers." + r + \': property "renderingMode" must be either "2d" or "3d"\'\n }), e;\n }, t.validateLight = Pn, t.validateStyle = En, t.values = function (t) {\n var e = [];\n\n for (var r in t) {\n e.push(t[r]);\n }\n\n return e;\n }, t.vectorTile = ws, t.version = "1.15.0", t.warnOnce = A, t.webpSupported = U, t.window = o, t.wrap = c;\n });\n define(["./shared"], function (e) {\n "use strict";\n\n function t(e) {\n var r = typeof e;\n if ("number" === r || "boolean" === r || "string" === r || null == e) return JSON.stringify(e);\n\n if (Array.isArray(e)) {\n for (var i = "[", o = 0, n = e; o < n.length; o += 1) {\n i += t(n[o]) + ",";\n }\n\n return i + "]";\n }\n\n for (var s = Object.keys(e).sort(), a = "{", l = 0; l < s.length; l++) {\n a += JSON.stringify(s[l]) + ":" + t(e[s[l]]) + ",";\n }\n\n return a + "}";\n }\n\n function r(r) {\n for (var i = "", o = 0, n = e.refProperties; o < n.length; o += 1) {\n i += "/" + t(r[n[o]]);\n }\n\n return i;\n }\n\n var i = function i(e) {\n this.keyCache = {}, e && this.replace(e);\n };\n\n i.prototype.replace = function (e) {\n this._layerConfigs = {}, this._layers = {}, this.update(e, []);\n }, i.prototype.update = function (t, i) {\n for (var o = this, n = 0, s = t; n < s.length; n += 1) {\n var a = s[n];\n this._layerConfigs[a.id] = a;\n var l = this._layers[a.id] = e.createStyleLayer(a);\n l._featureFilter = e.featureFilter(l.filter), this.keyCache[a.id] && delete this.keyCache[a.id];\n }\n\n for (var u = 0, h = i; u < h.length; u += 1) {\n var c = h[u];\n delete this.keyCache[c], delete this._layerConfigs[c], delete this._layers[c];\n }\n\n this.familiesBySource = {};\n\n for (var p = 0, f = function (e, t) {\n for (var i = {}, o = 0; o < e.length; o++) {\n var n = t && t[e[o].id] || r(e[o]);\n t && (t[e[o].id] = n);\n var s = i[n];\n s || (s = i[n] = []), s.push(e[o]);\n }\n\n var a = [];\n\n for (var l in i) {\n a.push(i[l]);\n }\n\n return a;\n }(e.values(this._layerConfigs), this.keyCache); p < f.length; p += 1) {\n var d = f[p].map(function (e) {\n return o._layers[e.id];\n }),\n g = d[0];\n\n if ("none" !== g.visibility) {\n var v = g.source || "",\n m = this.familiesBySource[v];\n m || (m = this.familiesBySource[v] = {});\n var y = g.sourceLayer || "_geojsonTileLayer",\n x = m[y];\n x || (x = m[y] = []), x.push(d);\n }\n }\n };\n\n var o = function o(t) {\n var r = {},\n i = [];\n\n for (var o in t) {\n var n = t[o],\n s = r[o] = {};\n\n for (var a in n) {\n var l = n[+a];\n\n if (l && 0 !== l.bitmap.width && 0 !== l.bitmap.height) {\n var u = {\n x: 0,\n y: 0,\n w: l.bitmap.width + 2,\n h: l.bitmap.height + 2\n };\n i.push(u), s[a] = {\n rect: u,\n metrics: l.metrics\n };\n }\n }\n }\n\n var h = e.potpack(i),\n c = new e.AlphaImage({\n width: h.w || 1,\n height: h.h || 1\n });\n\n for (var p in t) {\n var f = t[p];\n\n for (var d in f) {\n var g = f[+d];\n\n if (g && 0 !== g.bitmap.width && 0 !== g.bitmap.height) {\n var v = r[p][d].rect;\n e.AlphaImage.copy(g.bitmap, c, {\n x: 0,\n y: 0\n }, {\n x: v.x + 1,\n y: v.y + 1\n }, g.bitmap);\n }\n }\n }\n\n this.image = c, this.positions = r;\n };\n\n e.register("GlyphAtlas", o);\n\n var n = function n(t) {\n this.tileID = new e.OverscaledTileID(t.tileID.overscaledZ, t.tileID.wrap, t.tileID.canonical.z, t.tileID.canonical.x, t.tileID.canonical.y), this.uid = t.uid, this.zoom = t.zoom, this.pixelRatio = t.pixelRatio, this.tileSize = t.tileSize, this.source = t.source, this.overscaling = this.tileID.overscaleFactor(), this.showCollisionBoxes = t.showCollisionBoxes, this.collectResourceTiming = !!t.collectResourceTiming, this.returnDependencies = !!t.returnDependencies, this.promoteId = t.promoteId;\n };\n\n function s(t, r, i) {\n for (var o = new e.EvaluationParameters(r), n = 0, s = t; n < s.length; n += 1) {\n s[n].recalculate(o, i);\n }\n }\n\n function a(t, r) {\n var i = e.getArrayBuffer(t.request, function (t, i, o, n) {\n t ? r(t) : i && r(null, {\n vectorTile: new e.vectorTile.VectorTile(new e.pbf(i)),\n rawData: i,\n cacheControl: o,\n expires: n\n });\n });\n return function () {\n i.cancel(), r();\n };\n }\n\n n.prototype.parse = function (t, r, i, n, a) {\n var l = this;\n this.status = "parsing", this.data = t, this.collisionBoxArray = new e.CollisionBoxArray();\n var u = new e.DictionaryCoder(Object.keys(t.layers).sort()),\n h = new e.FeatureIndex(this.tileID, this.promoteId);\n h.bucketLayerIDs = [];\n var c,\n p,\n f,\n d,\n g = {},\n v = {\n featureIndex: h,\n iconDependencies: {},\n patternDependencies: {},\n glyphDependencies: {},\n availableImages: i\n },\n m = r.familiesBySource[this.source];\n\n for (var y in m) {\n var x = t.layers[y];\n\n if (x) {\n 1 === x.version && e.warnOnce(\'Vector tile source "\' + this.source + \'" layer "\' + y + \'" does not use vector tile spec v2 and therefore may have some rendering errors.\');\n\n for (var w = u.encode(y), S = [], I = 0; I < x.length; I++) {\n var M = x.feature(I),\n b = h.getId(M, y);\n S.push({\n feature: M,\n id: b,\n index: I,\n sourceLayerIndex: w\n });\n }\n\n for (var _ = 0, k = m[y]; _ < k.length; _ += 1) {\n var P = k[_],\n T = P[0];\n T.minzoom && this.zoom < Math.floor(T.minzoom) || T.maxzoom && this.zoom >= T.maxzoom || "none" !== T.visibility && (s(P, this.zoom, i), (g[T.id] = T.createBucket({\n index: h.bucketLayerIDs.length,\n layers: P,\n zoom: this.zoom,\n pixelRatio: this.pixelRatio,\n overscaling: this.overscaling,\n collisionBoxArray: this.collisionBoxArray,\n sourceLayerIndex: w,\n sourceID: this.source\n })).populate(S, v, this.tileID.canonical), h.bucketLayerIDs.push(P.map(function (e) {\n return e.id;\n })));\n }\n }\n }\n\n var C = e.mapObject(v.glyphDependencies, function (e) {\n return Object.keys(e).map(Number);\n });\n Object.keys(C).length ? n.send("getGlyphs", {\n uid: this.uid,\n stacks: C\n }, function (e, t) {\n c || (c = e, p = t, z.call(l));\n }) : p = {};\n var D = Object.keys(v.iconDependencies);\n D.length ? n.send("getImages", {\n icons: D,\n source: this.source,\n tileID: this.tileID,\n type: "icons"\n }, function (e, t) {\n c || (c = e, f = t, z.call(l));\n }) : f = {};\n var L = Object.keys(v.patternDependencies);\n\n function z() {\n if (c) return a(c);\n\n if (p && f && d) {\n var t = new o(p),\n r = new e.ImageAtlas(f, d);\n\n for (var n in g) {\n var l = g[n];\n l instanceof e.SymbolBucket ? (s(l.layers, this.zoom, i), e.performSymbolLayout(l, p, t.positions, f, r.iconPositions, this.showCollisionBoxes, this.tileID.canonical)) : l.hasPattern && (l instanceof e.LineBucket || l instanceof e.FillBucket || l instanceof e.FillExtrusionBucket) && (s(l.layers, this.zoom, i), l.addFeatures(v, this.tileID.canonical, r.patternPositions));\n }\n\n this.status = "done", a(null, {\n buckets: e.values(g).filter(function (e) {\n return !e.isEmpty();\n }),\n featureIndex: h,\n collisionBoxArray: this.collisionBoxArray,\n glyphAtlasImage: t.image,\n imageAtlas: r,\n glyphMap: this.returnDependencies ? p : null,\n iconMap: this.returnDependencies ? f : null,\n glyphPositions: this.returnDependencies ? t.positions : null\n });\n }\n }\n\n L.length ? n.send("getImages", {\n icons: L,\n source: this.source,\n tileID: this.tileID,\n type: "patterns"\n }, function (e, t) {\n c || (c = e, d = t, z.call(l));\n }) : d = {}, z.call(this);\n };\n\n var l = function l(e, t, r, i) {\n this.actor = e, this.layerIndex = t, this.availableImages = r, this.loadVectorData = i || a, this.loading = {}, this.loaded = {};\n };\n\n l.prototype.loadTile = function (t, r) {\n var i = this,\n o = t.uid;\n this.loading || (this.loading = {});\n var s = !!(t && t.request && t.request.collectResourceTiming) && new e.RequestPerformance(t.request),\n a = this.loading[o] = new n(t);\n a.abort = this.loadVectorData(t, function (t, n) {\n if (delete i.loading[o], t || !n) return a.status = "done", i.loaded[o] = a, r(t);\n var l = n.rawData,\n u = {};\n n.expires && (u.expires = n.expires), n.cacheControl && (u.cacheControl = n.cacheControl);\n var h = {};\n\n if (s) {\n var c = s.finish();\n c && (h.resourceTiming = JSON.parse(JSON.stringify(c)));\n }\n\n a.vectorTile = n.vectorTile, a.parse(n.vectorTile, i.layerIndex, i.availableImages, i.actor, function (t, i) {\n if (t || !i) return r(t);\n r(null, e.extend({\n rawTileData: l.slice(0)\n }, i, u, h));\n }), i.loaded = i.loaded || {}, i.loaded[o] = a;\n });\n }, l.prototype.reloadTile = function (e, t) {\n var r = this,\n i = this.loaded,\n o = e.uid,\n n = this;\n\n if (i && i[o]) {\n var s = i[o];\n s.showCollisionBoxes = e.showCollisionBoxes;\n\n var a = function a(e, i) {\n var o = s.reloadCallback;\n o && (delete s.reloadCallback, s.parse(s.vectorTile, n.layerIndex, r.availableImages, n.actor, o)), t(e, i);\n };\n\n "parsing" === s.status ? s.reloadCallback = a : "done" === s.status && (s.vectorTile ? s.parse(s.vectorTile, this.layerIndex, this.availableImages, this.actor, a) : a());\n }\n }, l.prototype.abortTile = function (e, t) {\n var r = this.loading,\n i = e.uid;\n r && r[i] && r[i].abort && (r[i].abort(), delete r[i]), t();\n }, l.prototype.removeTile = function (e, t) {\n var r = this.loaded,\n i = e.uid;\n r && r[i] && delete r[i], t();\n };\n\n var u = e.window.ImageBitmap,\n h = function h() {\n this.loaded = {};\n };\n\n function c(e, t) {\n if (0 !== e.length) {\n p(e[0], t);\n\n for (var r = 1; r < e.length; r++) {\n p(e[r], !t);\n }\n }\n }\n\n function p(e, t) {\n for (var r = 0, i = 0, o = e.length, n = o - 1; i < o; n = i++) {\n r += (e[i][0] - e[n][0]) * (e[n][1] + e[i][1]);\n }\n\n r >= 0 != !!t && e.reverse();\n }\n\n h.prototype.loadTile = function (t, r) {\n var i = t.uid,\n o = t.encoding,\n n = t.rawImageData,\n s = u && n instanceof u ? this.getImageData(n) : n,\n a = new e.DEMData(i, s, o);\n this.loaded = this.loaded || {}, this.loaded[i] = a, r(null, a);\n }, h.prototype.getImageData = function (t) {\n this.offscreenCanvas && this.offscreenCanvasContext || (this.offscreenCanvas = new OffscreenCanvas(t.width, t.height), this.offscreenCanvasContext = this.offscreenCanvas.getContext("2d")), this.offscreenCanvas.width = t.width, this.offscreenCanvas.height = t.height, this.offscreenCanvasContext.drawImage(t, 0, 0, t.width, t.height);\n var r = this.offscreenCanvasContext.getImageData(-1, -1, t.width + 2, t.height + 2);\n return this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height), new e.RGBAImage({\n width: r.width,\n height: r.height\n }, r.data);\n }, h.prototype.removeTile = function (e) {\n var t = this.loaded,\n r = e.uid;\n t && t[r] && delete t[r];\n };\n\n var f = e.vectorTile.VectorTileFeature.prototype.toGeoJSON,\n d = function d(t) {\n this._feature = t, this.extent = e.EXTENT, this.type = t.type, this.properties = t.tags, "id" in t && !isNaN(t.id) && (this.id = parseInt(t.id, 10));\n };\n\n d.prototype.loadGeometry = function () {\n if (1 === this._feature.type) {\n for (var t = [], r = 0, i = this._feature.geometry; r < i.length; r += 1) {\n var o = i[r];\n t.push([new e.Point$1(o[0], o[1])]);\n }\n\n return t;\n }\n\n for (var n = [], s = 0, a = this._feature.geometry; s < a.length; s += 1) {\n for (var l = [], u = 0, h = a[s]; u < h.length; u += 1) {\n var c = h[u];\n l.push(new e.Point$1(c[0], c[1]));\n }\n\n n.push(l);\n }\n\n return n;\n }, d.prototype.toGeoJSON = function (e, t, r) {\n return f.call(this, e, t, r);\n };\n\n var g = function g(t) {\n this.layers = {\n _geojsonTileLayer: this\n }, this.name = "_geojsonTileLayer", this.extent = e.EXTENT, this.length = t.length, this._features = t;\n };\n\n g.prototype.feature = function (e) {\n return new d(this._features[e]);\n };\n\n var v = e.vectorTile.VectorTileFeature,\n m = y;\n\n function y(e, t) {\n this.options = t || {}, this.features = e, this.length = e.length;\n }\n\n function x(e, t) {\n this.id = "number" == typeof e.id ? e.id : void 0, this.type = e.type, this.rawGeometry = 1 === e.type ? [e.geometry] : e.geometry, this.properties = e.tags, this.extent = t || 4096;\n }\n\n y.prototype.feature = function (e) {\n return new x(this.features[e], this.options.extent);\n }, x.prototype.loadGeometry = function () {\n var t = this.rawGeometry;\n this.geometry = [];\n\n for (var r = 0; r < t.length; r++) {\n for (var i = t[r], o = [], n = 0; n < i.length; n++) {\n o.push(new e.Point$1(i[n][0], i[n][1]));\n }\n\n this.geometry.push(o);\n }\n\n return this.geometry;\n }, x.prototype.bbox = function () {\n this.geometry || this.loadGeometry();\n\n for (var e = this.geometry, t = 1 / 0, r = -1 / 0, i = 1 / 0, o = -1 / 0, n = 0; n < e.length; n++) {\n for (var s = e[n], a = 0; a < s.length; a++) {\n var l = s[a];\n t = Math.min(t, l.x), r = Math.max(r, l.x), i = Math.min(i, l.y), o = Math.max(o, l.y);\n }\n }\n\n return [t, i, r, o];\n }, x.prototype.toGeoJSON = v.prototype.toGeoJSON;\n var w = I,\n S = m;\n\n function I(t) {\n var r = new e.pbf();\n return function (e, t) {\n for (var r in e.layers) {\n t.writeMessage(3, M, e.layers[r]);\n }\n }(t, r), r.finish();\n }\n\n function M(e, t) {\n var r;\n t.writeVarintField(15, e.version || 1), t.writeStringField(1, e.name || ""), t.writeVarintField(5, e.extent || 4096);\n var i = {\n keys: [],\n values: [],\n keycache: {},\n valuecache: {}\n };\n\n for (r = 0; r < e.length; r++) {\n i.feature = e.feature(r), t.writeMessage(2, b, i);\n }\n\n var o = i.keys;\n\n for (r = 0; r < o.length; r++) {\n t.writeStringField(3, o[r]);\n }\n\n var n = i.values;\n\n for (r = 0; r < n.length; r++) {\n t.writeMessage(4, C, n[r]);\n }\n }\n\n function b(e, t) {\n var r = e.feature;\n void 0 !== r.id && t.writeVarintField(1, r.id), t.writeMessage(2, _, e), t.writeVarintField(3, r.type), t.writeMessage(4, T, r);\n }\n\n function _(e, t) {\n var r = e.feature,\n i = e.keys,\n o = e.values,\n n = e.keycache,\n s = e.valuecache;\n\n for (var a in r.properties) {\n var l = n[a];\n void 0 === l && (i.push(a), n[a] = l = i.length - 1), t.writeVarint(l);\n var u = r.properties[a],\n h = typeof u;\n "string" !== h && "boolean" !== h && "number" !== h && (u = JSON.stringify(u));\n var c = h + ":" + u,\n p = s[c];\n void 0 === p && (o.push(u), s[c] = p = o.length - 1), t.writeVarint(p);\n }\n }\n\n function k(e, t) {\n return (t << 3) + (7 & e);\n }\n\n function P(e) {\n return e << 1 ^ e >> 31;\n }\n\n function T(e, t) {\n for (var r = e.loadGeometry(), i = e.type, o = 0, n = 0, s = r.length, a = 0; a < s; a++) {\n var l = r[a],\n u = 1;\n 1 === i && (u = l.length), t.writeVarint(k(1, u));\n\n for (var h = 3 === i ? l.length - 1 : l.length, c = 0; c < h; c++) {\n 1 === c && 1 !== i && t.writeVarint(k(2, h - 1));\n var p = l[c].x - o,\n f = l[c].y - n;\n t.writeVarint(P(p)), t.writeVarint(P(f)), o += p, n += f;\n }\n\n 3 === i && t.writeVarint(k(7, 1));\n }\n }\n\n function C(e, t) {\n var r = typeof e;\n "string" === r ? t.writeStringField(1, e) : "boolean" === r ? t.writeBooleanField(7, e) : "number" === r && (e % 1 != 0 ? t.writeDoubleField(3, e) : e < 0 ? t.writeSVarintField(6, e) : t.writeVarintField(5, e));\n }\n\n function D(e, t, r, i) {\n L(e, r, i), L(t, 2 * r, 2 * i), L(t, 2 * r + 1, 2 * i + 1);\n }\n\n function L(e, t, r) {\n var i = e[t];\n e[t] = e[r], e[r] = i;\n }\n\n function z(e, t, r, i) {\n var o = e - r,\n n = t - i;\n return o * o + n * n;\n }\n\n w.fromVectorTileJs = I, w.fromGeojsonVt = function (e, t) {\n t = t || {};\n var r = {};\n\n for (var i in e) {\n r[i] = new m(e[i].features, t), r[i].name = i, r[i].version = t.version, r[i].extent = t.extent;\n }\n\n return I({\n layers: r\n });\n }, w.GeoJSONWrapper = S;\n\n var O = function O(e) {\n return e[0];\n },\n E = function E(e) {\n return e[1];\n },\n F = function F(e, t, r, i, o) {\n void 0 === t && (t = O), void 0 === r && (r = E), void 0 === i && (i = 64), void 0 === o && (o = Float64Array), this.nodeSize = i, this.points = e;\n\n for (var n = e.length < 65536 ? Uint16Array : Uint32Array, s = this.ids = new n(e.length), a = this.coords = new o(2 * e.length), l = 0; l < e.length; l++) {\n s[l] = l, a[2 * l] = t(e[l]), a[2 * l + 1] = r(e[l]);\n }\n\n !function e(t, r, i, o, n, s) {\n if (!(n - o <= i)) {\n var a = o + n >> 1;\n !function e(t, r, i, o, n, s) {\n for (; n > o;) {\n if (n - o > 600) {\n var a = n - o + 1,\n l = i - o + 1,\n u = Math.log(a),\n h = .5 * Math.exp(2 * u / 3),\n c = .5 * Math.sqrt(u * h * (a - h) / a) * (l - a / 2 < 0 ? -1 : 1);\n e(t, r, i, Math.max(o, Math.floor(i - l * h / a + c)), Math.min(n, Math.floor(i + (a - l) * h / a + c)), s);\n }\n\n var p = r[2 * i + s],\n f = o,\n d = n;\n\n for (D(t, r, o, i), r[2 * n + s] > p && D(t, r, o, n); f < d;) {\n for (D(t, r, f, d), f++, d--; r[2 * f + s] < p;) {\n f++;\n }\n\n for (; r[2 * d + s] > p;) {\n d--;\n }\n }\n\n r[2 * o + s] === p ? D(t, r, o, d) : D(t, r, ++d, n), d <= i && (o = d + 1), i <= d && (n = d - 1);\n }\n }(t, r, a, o, n, s % 2), e(t, r, i, o, a - 1, s + 1), e(t, r, i, a + 1, n, s + 1);\n }\n }(s, a, i, 0, s.length - 1, 0);\n };\n\n F.prototype.range = function (e, t, r, i) {\n return function (e, t, r, i, o, n, s) {\n for (var a, l, u = [0, e.length - 1, 0], h = []; u.length;) {\n var c = u.pop(),\n p = u.pop(),\n f = u.pop();\n if (p - f <= s) for (var d = f; d <= p; d++) {\n l = t[2 * d + 1], (a = t[2 * d]) >= r && a <= o && l >= i && l <= n && h.push(e[d]);\n } else {\n var g = Math.floor((f + p) / 2);\n l = t[2 * g + 1], (a = t[2 * g]) >= r && a <= o && l >= i && l <= n && h.push(e[g]);\n var v = (c + 1) % 2;\n (0 === c ? r <= a : i <= l) && (u.push(f), u.push(g - 1), u.push(v)), (0 === c ? o >= a : n >= l) && (u.push(g + 1), u.push(p), u.push(v));\n }\n }\n\n return h;\n }(this.ids, this.coords, e, t, r, i, this.nodeSize);\n }, F.prototype.within = function (e, t, r) {\n return function (e, t, r, i, o, n) {\n for (var s = [0, e.length - 1, 0], a = [], l = o * o; s.length;) {\n var u = s.pop(),\n h = s.pop(),\n c = s.pop();\n if (h - c <= n) for (var p = c; p <= h; p++) {\n z(t[2 * p], t[2 * p + 1], r, i) <= l && a.push(e[p]);\n } else {\n var f = Math.floor((c + h) / 2),\n d = t[2 * f],\n g = t[2 * f + 1];\n z(d, g, r, i) <= l && a.push(e[f]);\n var v = (u + 1) % 2;\n (0 === u ? r - o <= d : i - o <= g) && (s.push(c), s.push(f - 1), s.push(v)), (0 === u ? r + o >= d : i + o >= g) && (s.push(f + 1), s.push(h), s.push(v));\n }\n }\n\n return a;\n }(this.ids, this.coords, e, t, r, this.nodeSize);\n };\n\n var N = {\n minZoom: 0,\n maxZoom: 16,\n minPoints: 2,\n radius: 40,\n extent: 512,\n nodeSize: 64,\n log: !1,\n generateId: !1,\n reduce: null,\n map: function map(e) {\n return e;\n }\n },\n J = function J(e) {\n this.options = V(Object.create(N), e), this.trees = new Array(this.options.maxZoom + 1);\n };\n\n function Z(e, t, r, i, o) {\n return {\n x: e,\n y: t,\n zoom: 1 / 0,\n id: r,\n parentId: -1,\n numPoints: i,\n properties: o\n };\n }\n\n function A(e, t) {\n var r = e.geometry.coordinates,\n i = r[1];\n return {\n x: Y(r[0]),\n y: j(i),\n zoom: 1 / 0,\n index: t,\n parentId: -1\n };\n }\n\n function B(e) {\n return {\n type: "Feature",\n id: e.id,\n properties: G(e),\n geometry: {\n type: "Point",\n coordinates: [(i = e.x, 360 * (i - .5)), (t = e.y, r = (180 - 360 * t) * Math.PI / 180, 360 * Math.atan(Math.exp(r)) / Math.PI - 90)]\n }\n };\n var t, r, i;\n }\n\n function G(e) {\n var t = e.numPoints,\n r = t >= 1e4 ? Math.round(t / 1e3) + "k" : t >= 1e3 ? Math.round(t / 100) / 10 + "k" : t;\n return V(V({}, e.properties), {\n cluster: !0,\n cluster_id: e.id,\n point_count: t,\n point_count_abbreviated: r\n });\n }\n\n function Y(e) {\n return e / 360 + .5;\n }\n\n function j(e) {\n var t = Math.sin(e * Math.PI / 180),\n r = .5 - .25 * Math.log((1 + t) / (1 - t)) / Math.PI;\n return r < 0 ? 0 : r > 1 ? 1 : r;\n }\n\n function V(e, t) {\n for (var r in t) {\n e[r] = t[r];\n }\n\n return e;\n }\n\n function X(e) {\n return e.x;\n }\n\n function W(e) {\n return e.y;\n }\n\n function R(e, t, r, i, o, n) {\n var s = o - r,\n a = n - i;\n\n if (0 !== s || 0 !== a) {\n var l = ((e - r) * s + (t - i) * a) / (s * s + a * a);\n l > 1 ? (r = o, i = n) : l > 0 && (r += s * l, i += a * l);\n }\n\n return (s = e - r) * s + (a = t - i) * a;\n }\n\n function q(e, t, r, i) {\n var o = {\n id: void 0 === e ? null : e,\n type: t,\n geometry: r,\n tags: i,\n minX: 1 / 0,\n minY: 1 / 0,\n maxX: -1 / 0,\n maxY: -1 / 0\n };\n return function (e) {\n var t = e.geometry,\n r = e.type;\n if ("Point" === r || "MultiPoint" === r || "LineString" === r) U(e, t);else if ("Polygon" === r || "MultiLineString" === r) for (var i = 0; i < t.length; i++) {\n U(e, t[i]);\n } else if ("MultiPolygon" === r) for (i = 0; i < t.length; i++) {\n for (var o = 0; o < t[i].length; o++) {\n U(e, t[i][o]);\n }\n }\n }(o), o;\n }\n\n function U(e, t) {\n for (var r = 0; r < t.length; r += 3) {\n e.minX = Math.min(e.minX, t[r]), e.minY = Math.min(e.minY, t[r + 1]), e.maxX = Math.max(e.maxX, t[r]), e.maxY = Math.max(e.maxY, t[r + 1]);\n }\n }\n\n function $(e, t, r, i) {\n if (t.geometry) {\n var o = t.geometry.coordinates,\n n = t.geometry.type,\n s = Math.pow(r.tolerance / ((1 << r.maxZoom) * r.extent), 2),\n a = [],\n l = t.id;\n if (r.promoteId ? l = t.properties[r.promoteId] : r.generateId && (l = i || 0), "Point" === n) H(o, a);else if ("MultiPoint" === n) for (var u = 0; u < o.length; u++) {\n H(o[u], a);\n } else if ("LineString" === n) K(o, a, s, !1);else if ("MultiLineString" === n) {\n if (r.lineMetrics) {\n for (u = 0; u < o.length; u++) {\n K(o[u], a = [], s, !1), e.push(q(l, "LineString", a, t.properties));\n }\n\n return;\n }\n\n Q(o, a, s, !1);\n } else if ("Polygon" === n) Q(o, a, s, !0);else {\n if ("MultiPolygon" !== n) {\n if ("GeometryCollection" === n) {\n for (u = 0; u < t.geometry.geometries.length; u++) {\n $(e, {\n id: l,\n geometry: t.geometry.geometries[u],\n properties: t.properties\n }, r, i);\n }\n\n return;\n }\n\n throw new Error("Input data is not a valid GeoJSON object.");\n }\n\n for (u = 0; u < o.length; u++) {\n var h = [];\n Q(o[u], h, s, !0), a.push(h);\n }\n }\n e.push(q(l, n, a, t.properties));\n }\n }\n\n function H(e, t) {\n t.push(ee(e[0])), t.push(te(e[1])), t.push(0);\n }\n\n function K(e, t, r, i) {\n for (var o, n, s = 0, a = 0; a < e.length; a++) {\n var l = ee(e[a][0]),\n u = te(e[a][1]);\n t.push(l), t.push(u), t.push(0), a > 0 && (s += i ? (o * u - l * n) / 2 : Math.sqrt(Math.pow(l - o, 2) + Math.pow(u - n, 2))), o = l, n = u;\n }\n\n var h = t.length - 3;\n t[2] = 1, function e(t, r, i, o) {\n for (var n, s = o, a = i - r >> 1, l = i - r, u = t[r], h = t[r + 1], c = t[i], p = t[i + 1], f = r + 3; f < i; f += 3) {\n var d = R(t[f], t[f + 1], u, h, c, p);\n if (d > s) n = f, s = d;else if (d === s) {\n var g = Math.abs(f - a);\n g < l && (n = f, l = g);\n }\n }\n\n s > o && (n - r > 3 && e(t, r, n, o), t[n + 2] = s, i - n > 3 && e(t, n, i, o));\n }(t, 0, h, r), t[h + 2] = 1, t.size = Math.abs(s), t.start = 0, t.end = t.size;\n }\n\n function Q(e, t, r, i) {\n for (var o = 0; o < e.length; o++) {\n var n = [];\n K(e[o], n, r, i), t.push(n);\n }\n }\n\n function ee(e) {\n return e / 360 + .5;\n }\n\n function te(e) {\n var t = Math.sin(e * Math.PI / 180),\n r = .5 - .25 * Math.log((1 + t) / (1 - t)) / Math.PI;\n return r < 0 ? 0 : r > 1 ? 1 : r;\n }\n\n function re(e, t, r, i, o, n, s, a) {\n if (i /= t, n >= (r /= t) && s < i) return e;\n if (s < r || n >= i) return null;\n\n for (var l = [], u = 0; u < e.length; u++) {\n var h = e[u],\n c = h.geometry,\n p = h.type,\n f = 0 === o ? h.minX : h.minY,\n d = 0 === o ? h.maxX : h.maxY;\n if (f >= r && d < i) l.push(h);else if (!(d < r || f >= i)) {\n var g = [];\n if ("Point" === p || "MultiPoint" === p) ie(c, g, r, i, o);else if ("LineString" === p) oe(c, g, r, i, o, !1, a.lineMetrics);else if ("MultiLineString" === p) se(c, g, r, i, o, !1);else if ("Polygon" === p) se(c, g, r, i, o, !0);else if ("MultiPolygon" === p) for (var v = 0; v < c.length; v++) {\n var m = [];\n se(c[v], m, r, i, o, !0), m.length && g.push(m);\n }\n\n if (g.length) {\n if (a.lineMetrics && "LineString" === p) {\n for (v = 0; v < g.length; v++) {\n l.push(q(h.id, p, g[v], h.tags));\n }\n\n continue;\n }\n\n "LineString" !== p && "MultiLineString" !== p || (1 === g.length ? (p = "LineString", g = g[0]) : p = "MultiLineString"), "Point" !== p && "MultiPoint" !== p || (p = 3 === g.length ? "Point" : "MultiPoint"), l.push(q(h.id, p, g, h.tags));\n }\n }\n }\n\n return l.length ? l : null;\n }\n\n function ie(e, t, r, i, o) {\n for (var n = 0; n < e.length; n += 3) {\n var s = e[n + o];\n s >= r && s <= i && (t.push(e[n]), t.push(e[n + 1]), t.push(e[n + 2]));\n }\n }\n\n function oe(e, t, r, i, o, n, s) {\n for (var a, l, u = ne(e), h = 0 === o ? le : ue, c = e.start, p = 0; p < e.length - 3; p += 3) {\n var f = e[p],\n d = e[p + 1],\n g = e[p + 2],\n v = e[p + 3],\n m = e[p + 4],\n y = 0 === o ? f : d,\n x = 0 === o ? v : m,\n w = !1;\n s && (a = Math.sqrt(Math.pow(f - v, 2) + Math.pow(d - m, 2))), y < r ? x > r && (l = h(u, f, d, v, m, r), s && (u.start = c + a * l)) : y > i ? x < i && (l = h(u, f, d, v, m, i), s && (u.start = c + a * l)) : ae(u, f, d, g), x < r && y >= r && (l = h(u, f, d, v, m, r), w = !0), x > i && y <= i && (l = h(u, f, d, v, m, i), w = !0), !n && w && (s && (u.end = c + a * l), t.push(u), u = ne(e)), s && (c += a);\n }\n\n var S = e.length - 3;\n f = e[S], d = e[S + 1], g = e[S + 2], (y = 0 === o ? f : d) >= r && y <= i && ae(u, f, d, g), S = u.length - 3, n && S >= 3 && (u[S] !== u[0] || u[S + 1] !== u[1]) && ae(u, u[0], u[1], u[2]), u.length && t.push(u);\n }\n\n function ne(e) {\n var t = [];\n return t.size = e.size, t.start = e.start, t.end = e.end, t;\n }\n\n function se(e, t, r, i, o, n) {\n for (var s = 0; s < e.length; s++) {\n oe(e[s], t, r, i, o, n, !1);\n }\n }\n\n function ae(e, t, r, i) {\n e.push(t), e.push(r), e.push(i);\n }\n\n function le(e, t, r, i, o, n) {\n var s = (n - t) / (i - t);\n return e.push(n), e.push(r + (o - r) * s), e.push(1), s;\n }\n\n function ue(e, t, r, i, o, n) {\n var s = (n - r) / (o - r);\n return e.push(t + (i - t) * s), e.push(n), e.push(1), s;\n }\n\n function he(e, t) {\n for (var r = [], i = 0; i < e.length; i++) {\n var o,\n n = e[i],\n s = n.type;\n if ("Point" === s || "MultiPoint" === s || "LineString" === s) o = ce(n.geometry, t);else if ("MultiLineString" === s || "Polygon" === s) {\n o = [];\n\n for (var a = 0; a < n.geometry.length; a++) {\n o.push(ce(n.geometry[a], t));\n }\n } else if ("MultiPolygon" === s) for (o = [], a = 0; a < n.geometry.length; a++) {\n for (var l = [], u = 0; u < n.geometry[a].length; u++) {\n l.push(ce(n.geometry[a][u], t));\n }\n\n o.push(l);\n }\n r.push(q(n.id, s, o, n.tags));\n }\n\n return r;\n }\n\n function ce(e, t) {\n var r = [];\n r.size = e.size, void 0 !== e.start && (r.start = e.start, r.end = e.end);\n\n for (var i = 0; i < e.length; i += 3) {\n r.push(e[i] + t, e[i + 1], e[i + 2]);\n }\n\n return r;\n }\n\n function pe(e, t) {\n if (e.transformed) return e;\n var r,\n i,\n o,\n n = 1 << e.z,\n s = e.x,\n a = e.y;\n\n for (r = 0; r < e.features.length; r++) {\n var l = e.features[r],\n u = l.geometry,\n h = l.type;\n if (l.geometry = [], 1 === h) for (i = 0; i < u.length; i += 2) {\n l.geometry.push(fe(u[i], u[i + 1], t, n, s, a));\n } else for (i = 0; i < u.length; i++) {\n var c = [];\n\n for (o = 0; o < u[i].length; o += 2) {\n c.push(fe(u[i][o], u[i][o + 1], t, n, s, a));\n }\n\n l.geometry.push(c);\n }\n }\n\n return e.transformed = !0, e;\n }\n\n function fe(e, t, r, i, o, n) {\n return [Math.round(r * (e * i - o)), Math.round(r * (t * i - n))];\n }\n\n function de(e, t, r, i, o) {\n for (var n = t === o.maxZoom ? 0 : o.tolerance / ((1 << t) * o.extent), s = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: r,\n y: i,\n z: t,\n transformed: !1,\n minX: 2,\n minY: 1,\n maxX: -1,\n maxY: 0\n }, a = 0; a < e.length; a++) {\n s.numFeatures++, ge(s, e[a], n, o);\n var l = e[a].minX,\n u = e[a].minY,\n h = e[a].maxX,\n c = e[a].maxY;\n l < s.minX && (s.minX = l), u < s.minY && (s.minY = u), h > s.maxX && (s.maxX = h), c > s.maxY && (s.maxY = c);\n }\n\n return s;\n }\n\n function ge(e, t, r, i) {\n var o = t.geometry,\n n = t.type,\n s = [];\n if ("Point" === n || "MultiPoint" === n) for (var a = 0; a < o.length; a += 3) {\n s.push(o[a]), s.push(o[a + 1]), e.numPoints++, e.numSimplified++;\n } else if ("LineString" === n) ve(s, o, e, r, !1, !1);else if ("MultiLineString" === n || "Polygon" === n) for (a = 0; a < o.length; a++) {\n ve(s, o[a], e, r, "Polygon" === n, 0 === a);\n } else if ("MultiPolygon" === n) for (var l = 0; l < o.length; l++) {\n var u = o[l];\n\n for (a = 0; a < u.length; a++) {\n ve(s, u[a], e, r, !0, 0 === a);\n }\n }\n\n if (s.length) {\n var h = t.tags || null;\n\n if ("LineString" === n && i.lineMetrics) {\n for (var c in h = {}, t.tags) {\n h[c] = t.tags[c];\n }\n\n h.mapbox_clip_start = o.start / o.size, h.mapbox_clip_end = o.end / o.size;\n }\n\n var p = {\n geometry: s,\n type: "Polygon" === n || "MultiPolygon" === n ? 3 : "LineString" === n || "MultiLineString" === n ? 2 : 1,\n tags: h\n };\n null !== t.id && (p.id = t.id), e.features.push(p);\n }\n }\n\n function ve(e, t, r, i, o, n) {\n var s = i * i;\n if (i > 0 && t.size < (o ? s : i)) r.numPoints += t.length / 3;else {\n for (var a = [], l = 0; l < t.length; l += 3) {\n (0 === i || t[l + 2] > s) && (r.numSimplified++, a.push(t[l]), a.push(t[l + 1])), r.numPoints++;\n }\n\n o && function (e, t) {\n for (var r = 0, i = 0, o = e.length, n = o - 2; i < o; n = i, i += 2) {\n r += (e[i] - e[n]) * (e[i + 1] + e[n + 1]);\n }\n\n if (r > 0 === t) for (i = 0, o = e.length; i < o / 2; i += 2) {\n var s = e[i],\n a = e[i + 1];\n e[i] = e[o - 2 - i], e[i + 1] = e[o - 1 - i], e[o - 2 - i] = s, e[o - 1 - i] = a;\n }\n }(a, n), e.push(a);\n }\n }\n\n function me(e, t) {\n var r = (t = this.options = function (e, t) {\n for (var r in t) {\n e[r] = t[r];\n }\n\n return e;\n }(Object.create(this.options), t)).debug;\n\n if (r && console.time("preprocess data"), t.maxZoom < 0 || t.maxZoom > 24) throw new Error("maxZoom should be in the 0-24 range");\n if (t.promoteId && t.generateId) throw new Error("promoteId and generateId cannot be used together.");\n\n var i = function (e, t) {\n var r = [];\n if ("FeatureCollection" === e.type) for (var i = 0; i < e.features.length; i++) {\n $(r, e.features[i], t, i);\n } else $(r, "Feature" === e.type ? e : {\n geometry: e\n }, t);\n return r;\n }(e, t);\n\n this.tiles = {}, this.tileCoords = [], r && (console.timeEnd("preprocess data"), console.log("index: maxZoom: %d, maxPoints: %d", t.indexMaxZoom, t.indexMaxPoints), console.time("generate tiles"), this.stats = {}, this.total = 0), (i = function (e, t) {\n var r = t.buffer / t.extent,\n i = e,\n o = re(e, 1, -1 - r, r, 0, -1, 2, t),\n n = re(e, 1, 1 - r, 2 + r, 0, -1, 2, t);\n return (o || n) && (i = re(e, 1, -r, 1 + r, 0, -1, 2, t) || [], o && (i = he(o, 1).concat(i)), n && (i = i.concat(he(n, -1)))), i;\n }(i, t)).length && this.splitTile(i, 0, 0, 0), r && (i.length && console.log("features: %d, points: %d", this.tiles[0].numFeatures, this.tiles[0].numPoints), console.timeEnd("generate tiles"), console.log("tiles generated:", this.total, JSON.stringify(this.stats)));\n }\n\n function ye(e, t, r) {\n return 32 * ((1 << e) * r + t) + e;\n }\n\n function xe(e, t) {\n var r = e.tileID.canonical;\n if (!this._geoJSONIndex) return t(null, null);\n\n var i = this._geoJSONIndex.getTile(r.z, r.x, r.y);\n\n if (!i) return t(null, null);\n var o = new g(i.features),\n n = w(o);\n 0 === n.byteOffset && n.byteLength === n.buffer.byteLength || (n = new Uint8Array(n)), t(null, {\n vectorTile: o,\n rawData: n.buffer\n });\n }\n\n J.prototype.load = function (e) {\n var t = this.options,\n r = t.log,\n i = t.minZoom,\n o = t.maxZoom,\n n = t.nodeSize;\n r && console.time("total time");\n var s = "prepare " + e.length + " points";\n r && console.time(s), this.points = e;\n\n for (var a = [], l = 0; l < e.length; l++) {\n e[l].geometry && a.push(A(e[l], l));\n }\n\n this.trees[o + 1] = new F(a, X, W, n, Float32Array), r && console.timeEnd(s);\n\n for (var u = o; u >= i; u--) {\n var h = +Date.now();\n a = this._cluster(a, u), this.trees[u] = new F(a, X, W, n, Float32Array), r && console.log("z%d: %d clusters in %dms", u, a.length, +Date.now() - h);\n }\n\n return r && console.timeEnd("total time"), this;\n }, J.prototype.getClusters = function (e, t) {\n var r = ((e[0] + 180) % 360 + 360) % 360 - 180,\n i = Math.max(-90, Math.min(90, e[1])),\n o = 180 === e[2] ? 180 : ((e[2] + 180) % 360 + 360) % 360 - 180,\n n = Math.max(-90, Math.min(90, e[3]));\n if (e[2] - e[0] >= 360) r = -180, o = 180;else if (r > o) {\n var s = this.getClusters([r, i, 180, n], t),\n a = this.getClusters([-180, i, o, n], t);\n return s.concat(a);\n }\n\n for (var l = this.trees[this._limitZoom(t)], u = [], h = 0, c = l.range(Y(r), j(n), Y(o), j(i)); h < c.length; h += 1) {\n var p = l.points[c[h]];\n u.push(p.numPoints ? B(p) : this.points[p.index]);\n }\n\n return u;\n }, J.prototype.getChildren = function (e) {\n var t = this._getOriginId(e),\n r = this._getOriginZoom(e),\n i = "No cluster with the specified id.",\n o = this.trees[r];\n\n if (!o) throw new Error(i);\n var n = o.points[t];\n if (!n) throw new Error(i);\n\n for (var s = this.options.radius / (this.options.extent * Math.pow(2, r - 1)), a = [], l = 0, u = o.within(n.x, n.y, s); l < u.length; l += 1) {\n var h = o.points[u[l]];\n h.parentId === e && a.push(h.numPoints ? B(h) : this.points[h.index]);\n }\n\n if (0 === a.length) throw new Error(i);\n return a;\n }, J.prototype.getLeaves = function (e, t, r) {\n var i = [];\n return this._appendLeaves(i, e, t = t || 10, r = r || 0, 0), i;\n }, J.prototype.getTile = function (e, t, r) {\n var i = this.trees[this._limitZoom(e)],\n o = Math.pow(2, e),\n n = this.options,\n s = n.radius / n.extent,\n a = (r - s) / o,\n l = (r + 1 + s) / o,\n u = {\n features: []\n };\n\n return this._addTileFeatures(i.range((t - s) / o, a, (t + 1 + s) / o, l), i.points, t, r, o, u), 0 === t && this._addTileFeatures(i.range(1 - s / o, a, 1, l), i.points, o, r, o, u), t === o - 1 && this._addTileFeatures(i.range(0, a, s / o, l), i.points, -1, r, o, u), u.features.length ? u : null;\n }, J.prototype.getClusterExpansionZoom = function (e) {\n for (var t = this._getOriginZoom(e) - 1; t <= this.options.maxZoom;) {\n var r = this.getChildren(e);\n if (t++, 1 !== r.length) break;\n e = r[0].properties.cluster_id;\n }\n\n return t;\n }, J.prototype._appendLeaves = function (e, t, r, i, o) {\n for (var n = 0, s = this.getChildren(t); n < s.length; n += 1) {\n var a = s[n],\n l = a.properties;\n if (l && l.cluster ? o + l.point_count <= i ? o += l.point_count : o = this._appendLeaves(e, l.cluster_id, r, i, o) : o < i ? o++ : e.push(a), e.length === r) break;\n }\n\n return o;\n }, J.prototype._addTileFeatures = function (e, t, r, i, o, n) {\n for (var s = 0, a = e; s < a.length; s += 1) {\n var l = t[a[s]],\n u = l.numPoints,\n h = {\n type: 1,\n geometry: [[Math.round(this.options.extent * (l.x * o - r)), Math.round(this.options.extent * (l.y * o - i))]],\n tags: u ? G(l) : this.points[l.index].properties\n },\n c = void 0;\n u ? c = l.id : this.options.generateId ? c = l.index : this.points[l.index].id && (c = this.points[l.index].id), void 0 !== c && (h.id = c), n.features.push(h);\n }\n }, J.prototype._limitZoom = function (e) {\n return Math.max(this.options.minZoom, Math.min(+e, this.options.maxZoom + 1));\n }, J.prototype._cluster = function (e, t) {\n for (var r = [], i = this.options, o = i.reduce, n = i.minPoints, s = i.radius / (i.extent * Math.pow(2, t)), a = 0; a < e.length; a++) {\n var l = e[a];\n\n if (!(l.zoom <= t)) {\n l.zoom = t;\n\n for (var u = this.trees[t + 1], h = u.within(l.x, l.y, s), c = l.numPoints || 1, p = c, f = 0, d = h; f < d.length; f += 1) {\n var g = u.points[d[f]];\n g.zoom > t && (p += g.numPoints || 1);\n }\n\n if (p >= n) {\n for (var v = l.x * c, m = l.y * c, y = o && c > 1 ? this._map(l, !0) : null, x = (a << 5) + (t + 1) + this.points.length, w = 0, S = h; w < S.length; w += 1) {\n var I = u.points[S[w]];\n\n if (!(I.zoom <= t)) {\n I.zoom = t;\n var M = I.numPoints || 1;\n v += I.x * M, m += I.y * M, I.parentId = x, o && (y || (y = this._map(l, !0)), o(y, this._map(I)));\n }\n }\n\n l.parentId = x, r.push(Z(v / p, m / p, x, p, y));\n } else if (r.push(l), p > 1) for (var b = 0, _ = h; b < _.length; b += 1) {\n var k = u.points[_[b]];\n k.zoom <= t || (k.zoom = t, r.push(k));\n }\n }\n }\n\n return r;\n }, J.prototype._getOriginId = function (e) {\n return e - this.points.length >> 5;\n }, J.prototype._getOriginZoom = function (e) {\n return (e - this.points.length) % 32;\n }, J.prototype._map = function (e, t) {\n if (e.numPoints) return t ? V({}, e.properties) : e.properties;\n var r = this.points[e.index].properties,\n i = this.options.map(r);\n return t && i === r ? V({}, i) : i;\n }, me.prototype.options = {\n maxZoom: 14,\n indexMaxZoom: 5,\n indexMaxPoints: 1e5,\n tolerance: 3,\n extent: 4096,\n buffer: 64,\n lineMetrics: !1,\n promoteId: null,\n generateId: !1,\n debug: 0\n }, me.prototype.splitTile = function (e, t, r, i, o, n, s) {\n for (var a = [e, t, r, i], l = this.options, u = l.debug; a.length;) {\n i = a.pop(), r = a.pop(), t = a.pop(), e = a.pop();\n var h = 1 << t,\n c = ye(t, r, i),\n p = this.tiles[c];\n\n if (!p && (u > 1 && console.time("creation"), p = this.tiles[c] = de(e, t, r, i, l), this.tileCoords.push({\n z: t,\n x: r,\n y: i\n }), u)) {\n u > 1 && (console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)", t, r, i, p.numFeatures, p.numPoints, p.numSimplified), console.timeEnd("creation"));\n var f = "z" + t;\n this.stats[f] = (this.stats[f] || 0) + 1, this.total++;\n }\n\n if (p.source = e, o) {\n if (t === l.maxZoom || t === o) continue;\n var d = 1 << o - t;\n if (r !== Math.floor(n / d) || i !== Math.floor(s / d)) continue;\n } else if (t === l.indexMaxZoom || p.numPoints <= l.indexMaxPoints) continue;\n\n if (p.source = null, 0 !== e.length) {\n u > 1 && console.time("clipping");\n var g,\n v,\n m,\n y,\n x,\n w,\n S = .5 * l.buffer / l.extent,\n I = .5 - S,\n M = .5 + S,\n b = 1 + S;\n g = v = m = y = null, x = re(e, h, r - S, r + M, 0, p.minX, p.maxX, l), w = re(e, h, r + I, r + b, 0, p.minX, p.maxX, l), e = null, x && (g = re(x, h, i - S, i + M, 1, p.minY, p.maxY, l), v = re(x, h, i + I, i + b, 1, p.minY, p.maxY, l), x = null), w && (m = re(w, h, i - S, i + M, 1, p.minY, p.maxY, l), y = re(w, h, i + I, i + b, 1, p.minY, p.maxY, l), w = null), u > 1 && console.timeEnd("clipping"), a.push(g || [], t + 1, 2 * r, 2 * i), a.push(v || [], t + 1, 2 * r, 2 * i + 1), a.push(m || [], t + 1, 2 * r + 1, 2 * i), a.push(y || [], t + 1, 2 * r + 1, 2 * i + 1);\n }\n }\n }, me.prototype.getTile = function (e, t, r) {\n var i = this.options,\n o = i.extent,\n n = i.debug;\n if (e < 0 || e > 24) return null;\n var s = 1 << e,\n a = ye(e, t = (t % s + s) % s, r);\n if (this.tiles[a]) return pe(this.tiles[a], o);\n n > 1 && console.log("drilling down to z%d-%d-%d", e, t, r);\n\n for (var l, u = e, h = t, c = r; !l && u > 0;) {\n u--, h = Math.floor(h / 2), c = Math.floor(c / 2), l = this.tiles[ye(u, h, c)];\n }\n\n return l && l.source ? (n > 1 && console.log("found parent tile z%d-%d-%d", u, h, c), n > 1 && console.time("drilling down"), this.splitTile(l.source, u, h, c, e, t, r), n > 1 && console.timeEnd("drilling down"), this.tiles[a] ? pe(this.tiles[a], o) : null) : null;\n };\n\n var we = function (t) {\n function r(e, r, i, o) {\n t.call(this, e, r, i, xe), o && (this.loadGeoJSON = o);\n }\n\n return t && (r.__proto__ = t), (r.prototype = Object.create(t && t.prototype)).constructor = r, r.prototype.loadData = function (e, t) {\n this._pendingCallback && this._pendingCallback(null, {\n abandoned: !0\n }), this._pendingCallback = t, this._pendingLoadDataParams = e, this._state && "Idle" !== this._state ? this._state = "NeedsLoadData" : (this._state = "Coalescing", this._loadData());\n }, r.prototype._loadData = function () {\n var t = this;\n\n if (this._pendingCallback && this._pendingLoadDataParams) {\n var r = this._pendingCallback,\n i = this._pendingLoadDataParams;\n delete this._pendingCallback, delete this._pendingLoadDataParams;\n var o = !!(i && i.request && i.request.collectResourceTiming) && new e.RequestPerformance(i.request);\n this.loadGeoJSON(i, function (n, s) {\n if (n || !s) return r(n);\n if ("object" != typeof s) return r(new Error("Input data given to \'" + i.source + "\' is not a valid GeoJSON object."));\n !function e(t, r) {\n var i,\n o = t && t.type;\n if ("FeatureCollection" === o) for (i = 0; i < t.features.length; i++) {\n e(t.features[i], r);\n } else if ("GeometryCollection" === o) for (i = 0; i < t.geometries.length; i++) {\n e(t.geometries[i], r);\n } else if ("Feature" === o) e(t.geometry, r);else if ("Polygon" === o) c(t.coordinates, r);else if ("MultiPolygon" === o) for (i = 0; i < t.coordinates.length; i++) {\n c(t.coordinates[i], r);\n }\n return t;\n }(s, !0);\n\n try {\n if (i.filter) {\n var a = e.createExpression(i.filter, {\n type: "boolean",\n "property-type": "data-driven",\n overridable: !1,\n transition: !1\n });\n if ("error" === a.result) throw new Error(a.value.map(function (e) {\n return e.key + ": " + e.message;\n }).join(", "));\n var l = s.features.filter(function (e) {\n return a.value.evaluate({\n zoom: 0\n }, e);\n });\n s = {\n type: "FeatureCollection",\n features: l\n };\n }\n\n t._geoJSONIndex = i.cluster ? new J(function (t) {\n var r = t.superclusterOptions,\n i = t.clusterProperties;\n if (!i || !r) return r;\n\n for (var o = {}, n = {}, s = {\n accumulated: null,\n zoom: 0\n }, a = {\n properties: null\n }, l = Object.keys(i), u = 0, h = l; u < h.length; u += 1) {\n var c = h[u],\n p = i[c],\n f = p[0],\n d = e.createExpression(p[1]),\n g = e.createExpression("string" == typeof f ? [f, ["accumulated"], ["get", c]] : f);\n o[c] = d.value, n[c] = g.value;\n }\n\n return r.map = function (e) {\n a.properties = e;\n\n for (var t = {}, r = 0, i = l; r < i.length; r += 1) {\n var n = i[r];\n t[n] = o[n].evaluate(s, a);\n }\n\n return t;\n }, r.reduce = function (e, t) {\n a.properties = t;\n\n for (var r = 0, i = l; r < i.length; r += 1) {\n var o = i[r];\n s.accumulated = e[o], e[o] = n[o].evaluate(s, a);\n }\n }, r;\n }(i)).load(s.features) : function (e, t) {\n return new me(e, t);\n }(s, i.geojsonVtOptions);\n } catch (n) {\n return r(n);\n }\n\n t.loaded = {};\n var u = {};\n\n if (o) {\n var h = o.finish();\n h && (u.resourceTiming = {}, u.resourceTiming[i.source] = JSON.parse(JSON.stringify(h)));\n }\n\n r(null, u);\n });\n }\n }, r.prototype.coalesce = function () {\n "Coalescing" === this._state ? this._state = "Idle" : "NeedsLoadData" === this._state && (this._state = "Coalescing", this._loadData());\n }, r.prototype.reloadTile = function (e, r) {\n var i = this.loaded;\n return i && i[e.uid] ? t.prototype.reloadTile.call(this, e, r) : this.loadTile(e, r);\n }, r.prototype.loadGeoJSON = function (t, r) {\n if (t.request) e.getJSON(t.request, r);else {\n if ("string" != typeof t.data) return r(new Error("Input data given to \'" + t.source + "\' is not a valid GeoJSON object."));\n\n try {\n return r(null, JSON.parse(t.data));\n } catch (e) {\n return r(new Error("Input data given to \'" + t.source + "\' is not a valid GeoJSON object."));\n }\n }\n }, r.prototype.removeSource = function (e, t) {\n this._pendingCallback && this._pendingCallback(null, {\n abandoned: !0\n }), t();\n }, r.prototype.getClusterExpansionZoom = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getClusterExpansionZoom(e.clusterId));\n } catch (e) {\n t(e);\n }\n }, r.prototype.getClusterChildren = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getChildren(e.clusterId));\n } catch (e) {\n t(e);\n }\n }, r.prototype.getClusterLeaves = function (e, t) {\n try {\n t(null, this._geoJSONIndex.getLeaves(e.clusterId, e.limit, e.offset));\n } catch (e) {\n t(e);\n }\n }, r;\n }(l),\n Se = function Se(t) {\n var r = this;\n this.self = t, this.actor = new e.Actor(t, this), this.layerIndexes = {}, this.availableImages = {}, this.workerSourceTypes = {\n vector: l,\n geojson: we\n }, this.workerSources = {}, this.demWorkerSources = {}, this.self.registerWorkerSource = function (e, t) {\n if (r.workerSourceTypes[e]) throw new Error(\'Worker source with name "\' + e + \'" already registered.\');\n r.workerSourceTypes[e] = t;\n }, this.self.registerRTLTextPlugin = function (t) {\n if (e.plugin.isParsed()) throw new Error("RTL text plugin already registered.");\n e.plugin.applyArabicShaping = t.applyArabicShaping, e.plugin.processBidirectionalText = t.processBidirectionalText, e.plugin.processStyledBidirectionalText = t.processStyledBidirectionalText;\n };\n };\n\n return Se.prototype.setReferrer = function (e, t) {\n this.referrer = t;\n }, Se.prototype.setImages = function (e, t, r) {\n for (var i in this.availableImages[e] = t, this.workerSources[e]) {\n var o = this.workerSources[e][i];\n\n for (var n in o) {\n o[n].availableImages = t;\n }\n }\n\n r();\n }, Se.prototype.setLayers = function (e, t, r) {\n this.getLayerIndex(e).replace(t), r();\n }, Se.prototype.updateLayers = function (e, t, r) {\n this.getLayerIndex(e).update(t.layers, t.removedIds), r();\n }, Se.prototype.loadTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).loadTile(t, r);\n }, Se.prototype.loadDEMTile = function (e, t, r) {\n this.getDEMWorkerSource(e, t.source).loadTile(t, r);\n }, Se.prototype.reloadTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).reloadTile(t, r);\n }, Se.prototype.abortTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).abortTile(t, r);\n }, Se.prototype.removeTile = function (e, t, r) {\n this.getWorkerSource(e, t.type, t.source).removeTile(t, r);\n }, Se.prototype.removeDEMTile = function (e, t) {\n this.getDEMWorkerSource(e, t.source).removeTile(t);\n }, Se.prototype.removeSource = function (e, t, r) {\n if (this.workerSources[e] && this.workerSources[e][t.type] && this.workerSources[e][t.type][t.source]) {\n var i = this.workerSources[e][t.type][t.source];\n delete this.workerSources[e][t.type][t.source], void 0 !== i.removeSource ? i.removeSource(t, r) : r();\n }\n }, Se.prototype.loadWorkerSource = function (e, t, r) {\n try {\n this.self.importScripts(t.url), r();\n } catch (e) {\n r(e.toString());\n }\n }, Se.prototype.syncRTLPluginState = function (t, r, i) {\n try {\n e.plugin.setState(r);\n var o = e.plugin.getPluginURL();\n\n if (e.plugin.isLoaded() && !e.plugin.isParsed() && null != o) {\n this.self.importScripts(o);\n var n = e.plugin.isParsed();\n i(n ? void 0 : new Error("RTL Text Plugin failed to import scripts from " + o), n);\n }\n } catch (e) {\n i(e.toString());\n }\n }, Se.prototype.getAvailableImages = function (e) {\n var t = this.availableImages[e];\n return t || (t = []), t;\n }, Se.prototype.getLayerIndex = function (e) {\n var t = this.layerIndexes[e];\n return t || (t = this.layerIndexes[e] = new i()), t;\n }, Se.prototype.getWorkerSource = function (e, t, r) {\n var i = this;\n return this.workerSources[e] || (this.workerSources[e] = {}), this.workerSources[e][t] || (this.workerSources[e][t] = {}), this.workerSources[e][t][r] || (this.workerSources[e][t][r] = new this.workerSourceTypes[t]({\n send: function send(t, r, o) {\n i.actor.send(t, r, o, e);\n }\n }, this.getLayerIndex(e), this.getAvailableImages(e))), this.workerSources[e][t][r];\n }, Se.prototype.getDEMWorkerSource = function (e, t) {\n return this.demWorkerSources[e] || (this.demWorkerSources[e] = {}), this.demWorkerSources[e][t] || (this.demWorkerSources[e][t] = new h()), this.demWorkerSources[e][t];\n }, Se.prototype.enforceCacheSizeLimit = function (t, r) {\n e.enforceCacheSizeLimit(r);\n }, "undefined" != typeof WorkerGlobalScope && "undefined" != typeof self && self instanceof WorkerGlobalScope && (self.worker = new Se(self)), Se;\n });\n define(["./shared"], function (t) {\n "use strict";\n\n var e = t.createCommonjsModule(function (t) {\n function e(t) {\n return !i(t);\n }\n\n function i(t) {\n return "undefined" == typeof window || "undefined" == typeof document ? "not a browser" : Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ? Function.prototype && Function.prototype.bind ? Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ? "JSON" in window && "parse" in JSON && "stringify" in JSON ? function () {\n if (!("Worker" in window && "Blob" in window && "URL" in window)) return !1;\n var t,\n e,\n i = new Blob([""], {\n type: "text/javascript"\n }),\n o = URL.createObjectURL(i);\n\n try {\n e = new Worker(o), t = !0;\n } catch (e) {\n t = !1;\n }\n\n return e && e.terminate(), URL.revokeObjectURL(o), t;\n }() ? "Uint8ClampedArray" in window ? ArrayBuffer.isView ? function () {\n var t = document.createElement("canvas");\n t.width = t.height = 1;\n var e = t.getContext("2d");\n if (!e) return !1;\n var i = e.getImageData(0, 0, 1, 1);\n return i && i.width === t.width;\n }() ? (void 0 === o[i = t && t.failIfMajorPerformanceCaveat] && (o[i] = function (t) {\n var i = function (t) {\n var i = document.createElement("canvas"),\n o = Object.create(e.webGLContextAttributes);\n return o.failIfMajorPerformanceCaveat = t, i.probablySupportsContext ? i.probablySupportsContext("webgl", o) || i.probablySupportsContext("experimental-webgl", o) : i.supportsContext ? i.supportsContext("webgl", o) || i.supportsContext("experimental-webgl", o) : i.getContext("webgl", o) || i.getContext("experimental-webgl", o);\n }(t);\n\n if (!i) return !1;\n var o = i.createShader(i.VERTEX_SHADER);\n return !(!o || i.isContextLost()) && (i.shaderSource(o, "void main() {}"), i.compileShader(o), !0 === i.getShaderParameter(o, i.COMPILE_STATUS));\n }(i)), o[i] ? void 0 : "insufficient WebGL support") : "insufficient Canvas/getImageData support" : "insufficient ArrayBuffer support" : "insufficient Uint8ClampedArray support" : "insufficient worker support" : "insufficient JSON support" : "insufficient Object support" : "insufficient Function support" : "insufficent Array support";\n var i;\n }\n\n t.exports ? t.exports = e : window && (window.mapboxgl = window.mapboxgl || {}, window.mapboxgl.supported = e, window.mapboxgl.notSupportedReason = i);\n var o = {};\n e.webGLContextAttributes = {\n antialias: !1,\n alpha: !0,\n stencil: !0,\n depth: !0\n };\n }),\n i = {\n create: function create(e, i, o) {\n var r = t.window.document.createElement(e);\n return void 0 !== i && (r.className = i), o && o.appendChild(r), r;\n },\n createNS: function createNS(e, i) {\n return t.window.document.createElementNS(e, i);\n }\n },\n o = t.window.document && t.window.document.documentElement.style;\n\n function r(t) {\n if (!o) return t[0];\n\n for (var e = 0; e < t.length; e++) {\n if (t[e] in o) return t[e];\n }\n\n return t[0];\n }\n\n var a,\n n = r(["userSelect", "MozUserSelect", "WebkitUserSelect", "msUserSelect"]);\n i.disableDrag = function () {\n o && n && (a = o[n], o[n] = "none");\n }, i.enableDrag = function () {\n o && n && (o[n] = a);\n };\n var s = r(["transform", "WebkitTransform"]);\n\n i.setTransform = function (t, e) {\n t.style[s] = e;\n };\n\n var l = !1;\n\n try {\n var c = Object.defineProperty({}, "passive", {\n get: function get() {\n l = !0;\n }\n });\n t.window.addEventListener("test", c, c), t.window.removeEventListener("test", c, c);\n } catch (t) {\n l = !1;\n }\n\n i.addEventListener = function (t, e, i, o) {\n void 0 === o && (o = {}), t.addEventListener(e, i, "passive" in o && l ? o : o.capture);\n }, i.removeEventListener = function (t, e, i, o) {\n void 0 === o && (o = {}), t.removeEventListener(e, i, "passive" in o && l ? o : o.capture);\n };\n\n var u = function u(e) {\n e.preventDefault(), e.stopPropagation(), t.window.removeEventListener("click", u, !0);\n };\n\n function h(t) {\n var e = t.userImage;\n return !!(e && e.render && e.render()) && (t.data.replace(new Uint8Array(e.data.buffer)), !0);\n }\n\n i.suppressClick = function () {\n t.window.addEventListener("click", u, !0), t.window.setTimeout(function () {\n t.window.removeEventListener("click", u, !0);\n }, 0);\n }, i.mousePos = function (e, i) {\n var o = e.getBoundingClientRect();\n return new t.Point(i.clientX - o.left - e.clientLeft, i.clientY - o.top - e.clientTop);\n }, i.touchPos = function (e, i) {\n for (var o = e.getBoundingClientRect(), r = [], a = 0; a < i.length; a++) {\n r.push(new t.Point(i[a].clientX - o.left - e.clientLeft, i[a].clientY - o.top - e.clientTop));\n }\n\n return r;\n }, i.mouseButton = function (e) {\n return void 0 !== t.window.InstallTrigger && 2 === e.button && e.ctrlKey && t.window.navigator.platform.toUpperCase().indexOf("MAC") >= 0 ? 0 : e.button;\n }, i.remove = function (t) {\n t.parentNode && t.parentNode.removeChild(t);\n };\n\n var p = function (e) {\n function i() {\n e.call(this), this.images = {}, this.updatedImages = {}, this.callbackDispatchedThisFrame = {}, this.loaded = !1, this.requestors = [], this.patterns = {}, this.atlasImage = new t.RGBAImage({\n width: 1,\n height: 1\n }), this.dirty = !0;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.isLoaded = function () {\n return this.loaded;\n }, i.prototype.setLoaded = function (t) {\n if (this.loaded !== t && (this.loaded = t, t)) {\n for (var e = 0, i = this.requestors; e < i.length; e += 1) {\n var o = i[e];\n\n this._notify(o.ids, o.callback);\n }\n\n this.requestors = [];\n }\n }, i.prototype.getImage = function (t) {\n return this.images[t];\n }, i.prototype.addImage = function (t, e) {\n this._validate(t, e) && (this.images[t] = e);\n }, i.prototype._validate = function (e, i) {\n var o = !0;\n return this._validateStretch(i.stretchX, i.data && i.data.width) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "stretchX" value\'))), o = !1), this._validateStretch(i.stretchY, i.data && i.data.height) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "stretchY" value\'))), o = !1), this._validateContent(i.content, i) || (this.fire(new t.ErrorEvent(new Error(\'Image "\' + e + \'" has invalid "content" value\'))), o = !1), o;\n }, i.prototype._validateStretch = function (t, e) {\n if (!t) return !0;\n\n for (var i = 0, o = 0, r = t; o < r.length; o += 1) {\n var a = r[o];\n if (a[0] < i || a[1] < a[0] || e < a[1]) return !1;\n i = a[1];\n }\n\n return !0;\n }, i.prototype._validateContent = function (t, e) {\n return !(t && (4 !== t.length || t[0] < 0 || e.data.width < t[0] || t[1] < 0 || e.data.height < t[1] || t[2] < 0 || e.data.width < t[2] || t[3] < 0 || e.data.height < t[3] || t[2] < t[0] || t[3] < t[1]));\n }, i.prototype.updateImage = function (t, e) {\n e.version = this.images[t].version + 1, this.images[t] = e, this.updatedImages[t] = !0;\n }, i.prototype.removeImage = function (t) {\n var e = this.images[t];\n delete this.images[t], delete this.patterns[t], e.userImage && e.userImage.onRemove && e.userImage.onRemove();\n }, i.prototype.listImages = function () {\n return Object.keys(this.images);\n }, i.prototype.getImages = function (t, e) {\n var i = !0;\n if (!this.isLoaded()) for (var o = 0, r = t; o < r.length; o += 1) {\n this.images[r[o]] || (i = !1);\n }\n this.isLoaded() || i ? this._notify(t, e) : this.requestors.push({\n ids: t,\n callback: e\n });\n }, i.prototype._notify = function (e, i) {\n for (var o = {}, r = 0, a = e; r < a.length; r += 1) {\n var n = a[r];\n this.images[n] || this.fire(new t.Event("styleimagemissing", {\n id: n\n }));\n var s = this.images[n];\n s ? o[n] = {\n data: s.data.clone(),\n pixelRatio: s.pixelRatio,\n sdf: s.sdf,\n version: s.version,\n stretchX: s.stretchX,\n stretchY: s.stretchY,\n content: s.content,\n hasRenderCallback: Boolean(s.userImage && s.userImage.render)\n } : t.warnOnce(\'Image "\' + n + \'" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.\');\n }\n\n i(null, o);\n }, i.prototype.getPixelSize = function () {\n var t = this.atlasImage;\n return {\n width: t.width,\n height: t.height\n };\n }, i.prototype.getPattern = function (e) {\n var i = this.patterns[e],\n o = this.getImage(e);\n if (!o) return null;\n if (i && i.position.version === o.version) return i.position;\n if (i) i.position.version = o.version;else {\n var r = {\n w: o.data.width + 2,\n h: o.data.height + 2,\n x: 0,\n y: 0\n },\n a = new t.ImagePosition(r, o);\n this.patterns[e] = {\n bin: r,\n position: a\n };\n }\n return this._updatePatternAtlas(), this.patterns[e].position;\n }, i.prototype.bind = function (e) {\n var i = e.gl;\n this.atlasTexture ? this.dirty && (this.atlasTexture.update(this.atlasImage), this.dirty = !1) : this.atlasTexture = new t.Texture(e, this.atlasImage, i.RGBA), this.atlasTexture.bind(i.LINEAR, i.CLAMP_TO_EDGE);\n }, i.prototype._updatePatternAtlas = function () {\n var e = [];\n\n for (var i in this.patterns) {\n e.push(this.patterns[i].bin);\n }\n\n var o = t.potpack(e),\n r = o.w,\n a = o.h,\n n = this.atlasImage;\n\n for (var s in n.resize({\n width: r || 1,\n height: a || 1\n }), this.patterns) {\n var l = this.patterns[s].bin,\n c = l.x + 1,\n u = l.y + 1,\n h = this.images[s].data,\n p = h.width,\n d = h.height;\n t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c,\n y: u\n }, {\n width: p,\n height: d\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: d - 1\n }, {\n x: c,\n y: u - 1\n }, {\n width: p,\n height: 1\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c,\n y: u + d\n }, {\n width: p,\n height: 1\n }), t.RGBAImage.copy(h, n, {\n x: p - 1,\n y: 0\n }, {\n x: c - 1,\n y: u\n }, {\n width: 1,\n height: d\n }), t.RGBAImage.copy(h, n, {\n x: 0,\n y: 0\n }, {\n x: c + p,\n y: u\n }, {\n width: 1,\n height: d\n });\n }\n\n this.dirty = !0;\n }, i.prototype.beginFrame = function () {\n this.callbackDispatchedThisFrame = {};\n }, i.prototype.dispatchRenderCallbacks = function (t) {\n for (var e = 0, i = t; e < i.length; e += 1) {\n var o = i[e];\n\n if (!this.callbackDispatchedThisFrame[o]) {\n this.callbackDispatchedThisFrame[o] = !0;\n var r = this.images[o];\n h(r) && this.updateImage(o, r);\n }\n }\n }, i;\n }(t.Evented),\n d = m,\n _ = m,\n f = 1e20;\n\n function m(t, e, i, o, r, a) {\n this.fontSize = t || 24, this.buffer = void 0 === e ? 3 : e, this.cutoff = o || .25, this.fontFamily = r || "sans-serif", this.fontWeight = a || "normal", this.radius = i || 8;\n var n = this.size = this.fontSize + 2 * this.buffer;\n this.canvas = document.createElement("canvas"), this.canvas.width = this.canvas.height = n, this.ctx = this.canvas.getContext("2d"), this.ctx.font = this.fontWeight + " " + this.fontSize + "px " + this.fontFamily, this.ctx.textBaseline = "middle", this.ctx.fillStyle = "black", this.gridOuter = new Float64Array(n * n), this.gridInner = new Float64Array(n * n), this.f = new Float64Array(n), this.d = new Float64Array(n), this.z = new Float64Array(n + 1), this.v = new Int16Array(n), this.middle = Math.round(n / 2 * (navigator.userAgent.indexOf("Gecko/") >= 0 ? 1.2 : 1));\n }\n\n function g(t, e, i, o, r, a, n) {\n for (var s = 0; s < e; s++) {\n for (var l = 0; l < i; l++) {\n o[l] = t[l * e + s];\n }\n\n for (v(o, r, a, n, i), l = 0; l < i; l++) {\n t[l * e + s] = r[l];\n }\n }\n\n for (l = 0; l < i; l++) {\n for (s = 0; s < e; s++) {\n o[s] = t[l * e + s];\n }\n\n for (v(o, r, a, n, e), s = 0; s < e; s++) {\n t[l * e + s] = Math.sqrt(r[s]);\n }\n }\n }\n\n function v(t, e, i, o, r) {\n i[0] = 0, o[0] = -f, o[1] = +f;\n\n for (var a = 1, n = 0; a < r; a++) {\n for (var s = (t[a] + a * a - (t[i[n]] + i[n] * i[n])) / (2 * a - 2 * i[n]); s <= o[n];) {\n n--, s = (t[a] + a * a - (t[i[n]] + i[n] * i[n])) / (2 * a - 2 * i[n]);\n }\n\n i[++n] = a, o[n] = s, o[n + 1] = +f;\n }\n\n for (a = 0, n = 0; a < r; a++) {\n for (; o[n + 1] < a;) {\n n++;\n }\n\n e[a] = (a - i[n]) * (a - i[n]) + t[i[n]];\n }\n }\n\n m.prototype.draw = function (t) {\n this.ctx.clearRect(0, 0, this.size, this.size), this.ctx.fillText(t, this.buffer, this.middle);\n\n for (var e = this.ctx.getImageData(0, 0, this.size, this.size), i = new Uint8ClampedArray(this.size * this.size), o = 0; o < this.size * this.size; o++) {\n var r = e.data[4 * o + 3] / 255;\n this.gridOuter[o] = 1 === r ? 0 : 0 === r ? f : Math.pow(Math.max(0, .5 - r), 2), this.gridInner[o] = 1 === r ? f : 0 === r ? 0 : Math.pow(Math.max(0, r - .5), 2);\n }\n\n for (g(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z), g(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z), o = 0; o < this.size * this.size; o++) {\n i[o] = Math.max(0, Math.min(255, Math.round(255 - 255 * ((this.gridOuter[o] - this.gridInner[o]) / this.radius + this.cutoff))));\n }\n\n return i;\n }, d.default = _;\n\n var y = function y(t, e) {\n this.requestManager = t, this.localIdeographFontFamily = e, this.entries = {};\n };\n\n y.prototype.setURL = function (t) {\n this.url = t;\n }, y.prototype.getGlyphs = function (e, i) {\n var o = this,\n r = [];\n\n for (var a in e) {\n for (var n = 0, s = e[a]; n < s.length; n += 1) {\n r.push({\n stack: a,\n id: s[n]\n });\n }\n }\n\n t.asyncAll(r, function (t, e) {\n var i = t.stack,\n r = t.id,\n a = o.entries[i];\n a || (a = o.entries[i] = {\n glyphs: {},\n requests: {},\n ranges: {}\n });\n var n = a.glyphs[r];\n\n if (void 0 === n) {\n if (n = o._tinySDF(a, i, r)) return a.glyphs[r] = n, void e(null, {\n stack: i,\n id: r,\n glyph: n\n });\n var s = Math.floor(r / 256);\n if (256 * s > 65535) e(new Error("glyphs > 65535 not supported"));else if (a.ranges[s]) e(null, {\n stack: i,\n id: r,\n glyph: n\n });else {\n var l = a.requests[s];\n l || (l = a.requests[s] = [], y.loadGlyphRange(i, s, o.url, o.requestManager, function (t, e) {\n if (e) {\n for (var i in e) {\n o._doesCharSupportLocalGlyph(+i) || (a.glyphs[+i] = e[+i]);\n }\n\n a.ranges[s] = !0;\n }\n\n for (var r = 0, n = l; r < n.length; r += 1) {\n (0, n[r])(t, e);\n }\n\n delete a.requests[s];\n })), l.push(function (t, o) {\n t ? e(t) : o && e(null, {\n stack: i,\n id: r,\n glyph: o[r] || null\n });\n });\n }\n } else e(null, {\n stack: i,\n id: r,\n glyph: n\n });\n }, function (t, e) {\n if (t) i(t);else if (e) {\n for (var o = {}, r = 0, a = e; r < a.length; r += 1) {\n var n = a[r],\n s = n.stack,\n l = n.id,\n c = n.glyph;\n (o[s] || (o[s] = {}))[l] = c && {\n id: c.id,\n bitmap: c.bitmap.clone(),\n metrics: c.metrics\n };\n }\n\n i(null, o);\n }\n });\n }, y.prototype._doesCharSupportLocalGlyph = function (e) {\n return !!this.localIdeographFontFamily && (t.isChar["CJK Unified Ideographs"](e) || t.isChar["Hangul Syllables"](e) || t.isChar.Hiragana(e) || t.isChar.Katakana(e));\n }, y.prototype._tinySDF = function (e, i, o) {\n var r = this.localIdeographFontFamily;\n\n if (r && this._doesCharSupportLocalGlyph(o)) {\n var a = e.tinySDF;\n\n if (!a) {\n var n = "400";\n /bold/i.test(i) ? n = "900" : /medium/i.test(i) ? n = "500" : /light/i.test(i) && (n = "200"), a = e.tinySDF = new y.TinySDF(24, 3, 8, .25, r, n);\n }\n\n return {\n id: o,\n bitmap: new t.AlphaImage({\n width: 30,\n height: 30\n }, a.draw(String.fromCharCode(o))),\n metrics: {\n width: 24,\n height: 24,\n left: 0,\n top: -8,\n advance: 24\n }\n };\n }\n }, y.loadGlyphRange = function (e, i, o, r, a) {\n var n = 256 * i,\n s = n + 255,\n l = r.transformRequest(r.normalizeGlyphsURL(o).replace("{fontstack}", e).replace("{range}", n + "-" + s), t.ResourceType.Glyphs);\n t.getArrayBuffer(l, function (e, i) {\n if (e) a(e);else if (i) {\n for (var o = {}, r = 0, n = t.parseGlyphPBF(i); r < n.length; r += 1) {\n var s = n[r];\n o[s.id] = s;\n }\n\n a(null, o);\n }\n });\n }, y.TinySDF = d;\n\n var x = function x() {\n this.specification = t.styleSpec.light.position;\n };\n\n x.prototype.possiblyEvaluate = function (e, i) {\n return t.sphericalToCartesian(e.expression.evaluate(i));\n }, x.prototype.interpolate = function (e, i, o) {\n return {\n x: t.number(e.x, i.x, o),\n y: t.number(e.y, i.y, o),\n z: t.number(e.z, i.z, o)\n };\n };\n\n var b = new t.Properties({\n anchor: new t.DataConstantProperty(t.styleSpec.light.anchor),\n position: new x(),\n color: new t.DataConstantProperty(t.styleSpec.light.color),\n intensity: new t.DataConstantProperty(t.styleSpec.light.intensity)\n }),\n w = function (e) {\n function i(i) {\n e.call(this), this._transitionable = new t.Transitionable(b), this.setLight(i), this._transitioning = this._transitionable.untransitioned();\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getLight = function () {\n return this._transitionable.serialize();\n }, i.prototype.setLight = function (e, i) {\n if (void 0 === i && (i = {}), !this._validate(t.validateLight, e, i)) for (var o in e) {\n var r = e[o];\n t.endsWith(o, "-transition") ? this._transitionable.setTransition(o.slice(0, -"-transition".length), r) : this._transitionable.setValue(o, r);\n }\n }, i.prototype.updateTransitions = function (t) {\n this._transitioning = this._transitionable.transitioned(t, this._transitioning);\n }, i.prototype.hasTransition = function () {\n return this._transitioning.hasTransition();\n }, i.prototype.recalculate = function (t) {\n this.properties = this._transitioning.possiblyEvaluate(t);\n }, i.prototype._validate = function (e, i, o) {\n return (!o || !1 !== o.validate) && t.emitValidationErrors(this, e.call(t.validateStyle, t.extend({\n value: i,\n style: {\n glyphs: !0,\n sprite: !0\n },\n styleSpec: t.styleSpec\n })));\n }, i;\n }(t.Evented),\n T = function T(t, e) {\n this.width = t, this.height = e, this.nextRow = 0, this.data = new Uint8Array(this.width * this.height), this.dashEntry = {};\n };\n\n T.prototype.getDash = function (t, e) {\n var i = t.join(",") + String(e);\n return this.dashEntry[i] || (this.dashEntry[i] = this.addDash(t, e)), this.dashEntry[i];\n }, T.prototype.getDashRanges = function (t, e, i) {\n var o = [],\n r = t.length % 2 == 1 ? -t[t.length - 1] * i : 0,\n a = t[0] * i,\n n = !0;\n o.push({\n left: r,\n right: a,\n isDash: n,\n zeroLength: 0 === t[0]\n });\n\n for (var s = t[0], l = 1; l < t.length; l++) {\n var c = t[l];\n o.push({\n left: r = s * i,\n right: a = (s += c) * i,\n isDash: n = !n,\n zeroLength: 0 === c\n });\n }\n\n return o;\n }, T.prototype.addRoundDash = function (t, e, i) {\n for (var o = e / 2, r = -i; r <= i; r++) {\n for (var a = this.width * (this.nextRow + i + r), n = 0, s = t[n], l = 0; l < this.width; l++) {\n l / s.right > 1 && (s = t[++n]);\n var c = Math.abs(l - s.left),\n u = Math.abs(l - s.right),\n h = Math.min(c, u),\n p = void 0,\n d = r / i * (o + 1);\n\n if (s.isDash) {\n var _ = o - Math.abs(d);\n\n p = Math.sqrt(h * h + _ * _);\n } else p = o - Math.sqrt(h * h + d * d);\n\n this.data[a + l] = Math.max(0, Math.min(255, p + 128));\n }\n }\n }, T.prototype.addRegularDash = function (t) {\n for (var e = t.length - 1; e >= 0; --e) {\n var i = t[e],\n o = t[e + 1];\n i.zeroLength ? t.splice(e, 1) : o && o.isDash === i.isDash && (o.left = i.left, t.splice(e, 1));\n }\n\n var r = t[0],\n a = t[t.length - 1];\n r.isDash === a.isDash && (r.left = a.left - this.width, a.right = r.right + this.width);\n\n for (var n = this.width * this.nextRow, s = 0, l = t[s], c = 0; c < this.width; c++) {\n c / l.right > 1 && (l = t[++s]);\n var u = Math.abs(c - l.left),\n h = Math.abs(c - l.right),\n p = Math.min(u, h);\n this.data[n + c] = Math.max(0, Math.min(255, (l.isDash ? p : -p) + 128));\n }\n }, T.prototype.addDash = function (e, i) {\n var o = i ? 7 : 0,\n r = 2 * o + 1;\n if (this.nextRow + r > this.height) return t.warnOnce("LineAtlas out of space"), null;\n\n for (var a = 0, n = 0; n < e.length; n++) {\n a += e[n];\n }\n\n if (0 !== a) {\n var s = this.width / a,\n l = this.getDashRanges(e, this.width, s);\n i ? this.addRoundDash(l, s, o) : this.addRegularDash(l);\n }\n\n var c = {\n y: (this.nextRow + o + .5) / this.height,\n height: 2 * o / this.height,\n width: a\n };\n return this.nextRow += r, this.dirty = !0, c;\n }, T.prototype.bind = function (t) {\n var e = t.gl;\n this.texture ? (e.bindTexture(e.TEXTURE_2D, this.texture), this.dirty && (this.dirty = !1, e.texSubImage2D(e.TEXTURE_2D, 0, 0, 0, this.width, this.height, e.ALPHA, e.UNSIGNED_BYTE, this.data))) : (this.texture = e.createTexture(), e.bindTexture(e.TEXTURE_2D, this.texture), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.REPEAT), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.REPEAT), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR), e.texImage2D(e.TEXTURE_2D, 0, e.ALPHA, this.width, this.height, 0, e.ALPHA, e.UNSIGNED_BYTE, this.data));\n };\n\n var E = function e(i, o) {\n this.workerPool = i, this.actors = [], this.currentActor = 0, this.id = t.uniqueId();\n\n for (var r = this.workerPool.acquire(this.id), a = 0; a < r.length; a++) {\n var n = new e.Actor(r[a], o, this.id);\n n.name = "Worker " + a, this.actors.push(n);\n }\n };\n\n function I(e, i, o) {\n var r = function r(_r2, a) {\n if (_r2) return o(_r2);\n\n if (a) {\n var n = t.pick(t.extend(a, e), ["tiles", "minzoom", "maxzoom", "attribution", "mapbox_logo", "bounds", "scheme", "tileSize", "encoding"]);\n a.vector_layers && (n.vectorLayers = a.vector_layers, n.vectorLayerIds = n.vectorLayers.map(function (t) {\n return t.id;\n })), n.tiles = i.canonicalizeTileset(n, e.url), o(null, n);\n }\n };\n\n return e.url ? t.getJSON(i.transformRequest(i.normalizeSourceURL(e.url), t.ResourceType.Source), r) : t.browser.frame(function () {\n return r(null, e);\n });\n }\n\n E.prototype.broadcast = function (e, i, o) {\n t.asyncAll(this.actors, function (t, o) {\n t.send(e, i, o);\n }, o = o || function () {});\n }, E.prototype.getActor = function () {\n return this.currentActor = (this.currentActor + 1) % this.actors.length, this.actors[this.currentActor];\n }, E.prototype.remove = function () {\n this.actors.forEach(function (t) {\n t.remove();\n }), this.actors = [], this.workerPool.release(this.id);\n }, E.Actor = t.Actor;\n\n var P = function P(e, i, o) {\n this.bounds = t.LngLatBounds.convert(this.validateBounds(e)), this.minzoom = i || 0, this.maxzoom = o || 24;\n };\n\n P.prototype.validateBounds = function (t) {\n return Array.isArray(t) && 4 === t.length ? [Math.max(-180, t[0]), Math.max(-90, t[1]), Math.min(180, t[2]), Math.min(90, t[3])] : [-180, -90, 180, 90];\n }, P.prototype.contains = function (e) {\n var i = Math.pow(2, e.z),\n o = Math.floor(t.mercatorXfromLng(this.bounds.getWest()) * i),\n r = Math.floor(t.mercatorYfromLat(this.bounds.getNorth()) * i),\n a = Math.ceil(t.mercatorXfromLng(this.bounds.getEast()) * i),\n n = Math.ceil(t.mercatorYfromLat(this.bounds.getSouth()) * i);\n return e.x >= o && e.x < a && e.y >= r && e.y < n;\n };\n\n var S = function (e) {\n function i(i, o, r, a) {\n if (e.call(this), this.id = i, this.dispatcher = r, this.type = "vector", this.minzoom = 0, this.maxzoom = 22, this.scheme = "xyz", this.tileSize = 512, this.reparseOverscaled = !0, this.isTileClipped = !0, this._loaded = !1, t.extend(this, t.pick(o, ["url", "scheme", "tileSize", "promoteId"])), this._options = t.extend({\n type: "vector"\n }, o), this._collectResourceTiming = o.collectResourceTiming, 512 !== this.tileSize) throw new Error("vector tile sources must have a tileSize of 512");\n this.setEventedParent(a);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._tileJSONRequest = I(this._options, this.map._requestManager, function (i, o) {\n e._tileJSONRequest = null, e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (t.extend(e, o), o.bounds && (e.tileBounds = new P(o.bounds, e.minzoom, e.maxzoom)), t.postTurnstileEvent(o.tiles, e.map._requestManager._customAccessToken), t.postMapLoadEvent(o.tiles, e.map._getMapId(), e.map._requestManager._skuToken, e.map._requestManager._customAccessToken), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.hasTile = function (t) {\n return !this.tileBounds || this.tileBounds.contains(t.canonical);\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setSourceProperty = function (t) {\n this._tileJSONRequest && this._tileJSONRequest.cancel(), t(), this.map.style.sourceCaches[this.id].clearTiles(), this.load();\n }, i.prototype.setTiles = function (t) {\n var e = this;\n return this.setSourceProperty(function () {\n e._options.tiles = t;\n }), this;\n }, i.prototype.setUrl = function (t) {\n var e = this;\n return this.setSourceProperty(function () {\n e.url = t, e._options.url = t;\n }), this;\n }, i.prototype.onRemove = function () {\n this._tileJSONRequest && (this._tileJSONRequest.cancel(), this._tileJSONRequest = null);\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options);\n }, i.prototype.loadTile = function (e, i) {\n var o = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme)),\n r = {\n request: this.map._requestManager.transformRequest(o, t.ResourceType.Tile),\n uid: e.uid,\n tileID: e.tileID,\n zoom: e.tileID.overscaledZ,\n tileSize: this.tileSize * e.tileID.overscaleFactor(),\n type: this.type,\n source: this.id,\n pixelRatio: t.browser.devicePixelRatio,\n showCollisionBoxes: this.map.showCollisionBoxes,\n promoteId: this.promoteId\n };\n\n function a(o, r) {\n return delete e.request, e.aborted ? i(null) : o && 404 !== o.status ? i(o) : (r && r.resourceTiming && (e.resourceTiming = r.resourceTiming), this.map._refreshExpiredTiles && r && e.setExpiryData(r), e.loadVectorData(r, this.map.painter), t.cacheEntryPossiblyAdded(this.dispatcher), i(null), void (e.reloadCallback && (this.loadTile(e, e.reloadCallback), e.reloadCallback = null)));\n }\n\n r.request.collectResourceTiming = this._collectResourceTiming, e.actor && "expired" !== e.state ? "loading" === e.state ? e.reloadCallback = i : e.request = e.actor.send("reloadTile", r, a.bind(this)) : (e.actor = this.dispatcher.getActor(), e.request = e.actor.send("loadTile", r, a.bind(this)));\n }, i.prototype.abortTile = function (t) {\n t.request && (t.request.cancel(), delete t.request), t.actor && t.actor.send("abortTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n }, void 0);\n }, i.prototype.unloadTile = function (t) {\n t.unloadVectorData(), t.actor && t.actor.send("removeTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n }, void 0);\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n C = function (e) {\n function i(i, o, r, a) {\n e.call(this), this.id = i, this.dispatcher = r, this.setEventedParent(a), this.type = "raster", this.minzoom = 0, this.maxzoom = 22, this.roundZoom = !0, this.scheme = "xyz", this.tileSize = 512, this._loaded = !1, this._options = t.extend({\n type: "raster"\n }, o), t.extend(this, t.pick(o, ["url", "scheme", "tileSize"]));\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._tileJSONRequest = I(this._options, this.map._requestManager, function (i, o) {\n e._tileJSONRequest = null, e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (t.extend(e, o), o.bounds && (e.tileBounds = new P(o.bounds, e.minzoom, e.maxzoom)), t.postTurnstileEvent(o.tiles), t.postMapLoadEvent(o.tiles, e.map._getMapId(), e.map._requestManager._skuToken), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })), e.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.onRemove = function () {\n this._tileJSONRequest && (this._tileJSONRequest.cancel(), this._tileJSONRequest = null);\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options);\n }, i.prototype.hasTile = function (t) {\n return !this.tileBounds || this.tileBounds.contains(t.canonical);\n }, i.prototype.loadTile = function (e, i) {\n var o = this,\n r = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme), this.tileSize);\n\n e.request = t.getImage(this.map._requestManager.transformRequest(r, t.ResourceType.Tile), function (r, a) {\n if (delete e.request, e.aborted) e.state = "unloaded", i(null);else if (r) e.state = "errored", i(r);else if (a) {\n o.map._refreshExpiredTiles && e.setExpiryData(a), delete a.cacheControl, delete a.expires;\n var n = o.map.painter.context,\n s = n.gl;\n e.texture = o.map.painter.getTileTexture(a.width), e.texture ? e.texture.update(a, {\n useMipmap: !0\n }) : (e.texture = new t.Texture(n, a, s.RGBA, {\n useMipmap: !0\n }), e.texture.bind(s.LINEAR, s.CLAMP_TO_EDGE, s.LINEAR_MIPMAP_NEAREST), n.extTextureFilterAnisotropic && s.texParameterf(s.TEXTURE_2D, n.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, n.extTextureFilterAnisotropicMax)), e.state = "loaded", t.cacheEntryPossiblyAdded(o.dispatcher), i(null);\n }\n });\n }, i.prototype.abortTile = function (t, e) {\n t.request && (t.request.cancel(), delete t.request), e();\n }, i.prototype.unloadTile = function (t, e) {\n t.texture && this.map.painter.saveTileTexture(t.texture), e();\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n z = function (e) {\n function i(i, o, r, a) {\n e.call(this, i, o, r, a), this.type = "raster-dem", this.maxzoom = 22, this._options = t.extend({\n type: "raster-dem"\n }, o), this.encoding = o.encoding || "mapbox";\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.serialize = function () {\n return {\n type: "raster-dem",\n url: this.url,\n tileSize: this.tileSize,\n tiles: this.tiles,\n bounds: this.bounds,\n encoding: this.encoding\n };\n }, i.prototype.loadTile = function (e, i) {\n var o = this.map._requestManager.normalizeTileURL(e.tileID.canonical.url(this.tiles, this.scheme), this.tileSize);\n\n function r(t, o) {\n t && (e.state = "errored", i(t)), o && (e.dem = o, e.needsHillshadePrepare = !0, e.state = "loaded", i(null));\n }\n\n e.request = t.getImage(this.map._requestManager.transformRequest(o, t.ResourceType.Tile), function (o, a) {\n if (delete e.request, e.aborted) e.state = "unloaded", i(null);else if (o) e.state = "errored", i(o);else if (a) {\n this.map._refreshExpiredTiles && e.setExpiryData(a), delete a.cacheControl, delete a.expires;\n var n = t.window.ImageBitmap && a instanceof t.window.ImageBitmap && t.offscreenCanvasSupported() ? a : t.browser.getImageData(a, 1),\n s = {\n uid: e.uid,\n coord: e.tileID,\n source: this.id,\n rawImageData: n,\n encoding: this.encoding\n };\n e.actor && "expired" !== e.state || (e.actor = this.dispatcher.getActor(), e.actor.send("loadDEMTile", s, r.bind(this)));\n }\n }.bind(this)), e.neighboringTiles = this._getNeighboringTiles(e.tileID);\n }, i.prototype._getNeighboringTiles = function (e) {\n var i = e.canonical,\n o = Math.pow(2, i.z),\n r = (i.x - 1 + o) % o,\n a = 0 === i.x ? e.wrap - 1 : e.wrap,\n n = (i.x + 1 + o) % o,\n s = i.x + 1 === o ? e.wrap + 1 : e.wrap,\n l = {};\n return l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y).key] = {\n backfilled: !1\n }, i.y > 0 && (l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y - 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, e.wrap, i.z, i.x, i.y - 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y - 1).key] = {\n backfilled: !1\n }), i.y + 1 < o && (l[new t.OverscaledTileID(e.overscaledZ, a, i.z, r, i.y + 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, e.wrap, i.z, i.x, i.y + 1).key] = {\n backfilled: !1\n }, l[new t.OverscaledTileID(e.overscaledZ, s, i.z, n, i.y + 1).key] = {\n backfilled: !1\n }), l;\n }, i.prototype.unloadTile = function (t) {\n t.demTexture && this.map.painter.saveTileTexture(t.demTexture), t.fbo && (t.fbo.destroy(), delete t.fbo), t.dem && delete t.dem, delete t.neighboringTiles, t.state = "unloaded", t.actor && t.actor.send("removeDEMTile", {\n uid: t.uid,\n source: this.id\n });\n }, i;\n }(C),\n D = function (e) {\n function i(i, o, r, a) {\n e.call(this), this.id = i, this.type = "geojson", this.minzoom = 0, this.maxzoom = 18, this.tileSize = 512, this.isTileClipped = !0, this.reparseOverscaled = !0, this._removed = !1, this._loaded = !1, this.actor = r.getActor(), this.setEventedParent(a), this._data = o.data, this._options = t.extend({}, o), this._collectResourceTiming = o.collectResourceTiming, this._resourceTiming = [], void 0 !== o.maxzoom && (this.maxzoom = o.maxzoom), o.type && (this.type = o.type), o.attribution && (this.attribution = o.attribution), this.promoteId = o.promoteId;\n var n = t.EXTENT / this.tileSize;\n this.workerOptions = t.extend({\n source: this.id,\n cluster: o.cluster || !1,\n geojsonVtOptions: {\n buffer: (void 0 !== o.buffer ? o.buffer : 128) * n,\n tolerance: (void 0 !== o.tolerance ? o.tolerance : .375) * n,\n extent: t.EXTENT,\n maxZoom: this.maxzoom,\n lineMetrics: o.lineMetrics || !1,\n generateId: o.generateId || !1\n },\n superclusterOptions: {\n maxZoom: void 0 !== o.clusterMaxZoom ? Math.min(o.clusterMaxZoom, this.maxzoom - 1) : this.maxzoom - 1,\n minPoints: Math.max(2, o.clusterMinPoints || 2),\n extent: t.EXTENT,\n radius: (o.clusterRadius || 50) * n,\n log: !1,\n generateId: o.generateId || !1\n },\n clusterProperties: o.clusterProperties,\n filter: o.filter\n }, o.workerOptions);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._updateWorkerData(function (i) {\n if (i) e.fire(new t.ErrorEvent(i));else {\n var o = {\n dataType: "source",\n sourceDataType: "metadata"\n };\n e._collectResourceTiming && e._resourceTiming && e._resourceTiming.length > 0 && (o.resourceTiming = e._resourceTiming, e._resourceTiming = []), e.fire(new t.Event("data", o));\n }\n });\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setData = function (e) {\n var i = this;\n return this._data = e, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this._updateWorkerData(function (e) {\n if (e) i.fire(new t.ErrorEvent(e));else {\n var o = {\n dataType: "source",\n sourceDataType: "content"\n };\n i._collectResourceTiming && i._resourceTiming && i._resourceTiming.length > 0 && (o.resourceTiming = i._resourceTiming, i._resourceTiming = []), i.fire(new t.Event("data", o));\n }\n }), this;\n }, i.prototype.getClusterExpansionZoom = function (t, e) {\n return this.actor.send("geojson.getClusterExpansionZoom", {\n clusterId: t,\n source: this.id\n }, e), this;\n }, i.prototype.getClusterChildren = function (t, e) {\n return this.actor.send("geojson.getClusterChildren", {\n clusterId: t,\n source: this.id\n }, e), this;\n }, i.prototype.getClusterLeaves = function (t, e, i, o) {\n return this.actor.send("geojson.getClusterLeaves", {\n source: this.id,\n clusterId: t,\n limit: e,\n offset: i\n }, o), this;\n }, i.prototype._updateWorkerData = function (e) {\n var i = this;\n this._loaded = !1;\n var o = t.extend({}, this.workerOptions),\n r = this._data;\n "string" == typeof r ? (o.request = this.map._requestManager.transformRequest(t.browser.resolveURL(r), t.ResourceType.Source), o.request.collectResourceTiming = this._collectResourceTiming) : o.data = JSON.stringify(r), this.actor.send(this.type + ".loadData", o, function (t, r) {\n i._removed || r && r.abandoned || (i._loaded = !0, r && r.resourceTiming && r.resourceTiming[i.id] && (i._resourceTiming = r.resourceTiming[i.id].slice(0)), i.actor.send(i.type + ".coalesce", {\n source: o.source\n }, null), e(t));\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.loadTile = function (e, i) {\n var o = this,\n r = e.actor ? "reloadTile" : "loadTile";\n e.actor = this.actor, e.request = this.actor.send(r, {\n type: this.type,\n uid: e.uid,\n tileID: e.tileID,\n zoom: e.tileID.overscaledZ,\n maxZoom: this.maxzoom,\n tileSize: this.tileSize,\n source: this.id,\n pixelRatio: t.browser.devicePixelRatio,\n showCollisionBoxes: this.map.showCollisionBoxes,\n promoteId: this.promoteId\n }, function (t, a) {\n return delete e.request, e.unloadVectorData(), e.aborted ? i(null) : t ? i(t) : (e.loadVectorData(a, o.map.painter, "reloadTile" === r), i(null));\n });\n }, i.prototype.abortTile = function (t) {\n t.request && (t.request.cancel(), delete t.request), t.aborted = !0;\n }, i.prototype.unloadTile = function (t) {\n t.unloadVectorData(), this.actor.send("removeTile", {\n uid: t.uid,\n type: this.type,\n source: this.id\n });\n }, i.prototype.onRemove = function () {\n this._removed = !0, this.actor.send("removeSource", {\n type: this.type,\n source: this.id\n });\n }, i.prototype.serialize = function () {\n return t.extend({}, this._options, {\n type: this.type,\n data: this._data\n });\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n A = t.createLayout([{\n name: "a_pos",\n type: "Int16",\n components: 2\n }, {\n name: "a_texture_pos",\n type: "Int16",\n components: 2\n }]),\n M = function (e) {\n function i(t, i, o, r) {\n e.call(this), this.id = t, this.dispatcher = o, this.coordinates = i.coordinates, this.type = "image", this.minzoom = 0, this.maxzoom = 22, this.tileSize = 512, this.tiles = {}, this._loaded = !1, this.setEventedParent(r), this.options = i;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function (e, i) {\n var o = this;\n this._loaded = !1, this.fire(new t.Event("dataloading", {\n dataType: "source"\n })), this.url = this.options.url, t.getImage(this.map._requestManager.transformRequest(this.url, t.ResourceType.Image), function (r, a) {\n o._loaded = !0, r ? o.fire(new t.ErrorEvent(r)) : a && (o.image = a, e && (o.coordinates = e), i && i(), o._finishLoading());\n });\n }, i.prototype.loaded = function () {\n return this._loaded;\n }, i.prototype.updateImage = function (t) {\n var e = this;\n return this.image && t.url ? (this.options.url = t.url, this.load(t.coordinates, function () {\n e.texture = null;\n }), this) : this;\n }, i.prototype._finishLoading = function () {\n this.map && (this.setCoordinates(this.coordinates), this.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "metadata"\n })));\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load();\n }, i.prototype.setCoordinates = function (e) {\n var i = this;\n this.coordinates = e;\n var o = e.map(t.MercatorCoordinate.fromLngLat);\n this.tileID = function (e) {\n for (var i = 1 / 0, o = 1 / 0, r = -1 / 0, a = -1 / 0, n = 0, s = e; n < s.length; n += 1) {\n var l = s[n];\n i = Math.min(i, l.x), o = Math.min(o, l.y), r = Math.max(r, l.x), a = Math.max(a, l.y);\n }\n\n var c = Math.max(r - i, a - o),\n u = Math.max(0, Math.floor(-Math.log(c) / Math.LN2)),\n h = Math.pow(2, u);\n return new t.CanonicalTileID(u, Math.floor((i + r) / 2 * h), Math.floor((o + a) / 2 * h));\n }(o), this.minzoom = this.maxzoom = this.tileID.z;\n var r = o.map(function (t) {\n return i.tileID.getTilePoint(t)._round();\n });\n return this._boundsArray = new t.StructArrayLayout4i8(), this._boundsArray.emplaceBack(r[0].x, r[0].y, 0, 0), this._boundsArray.emplaceBack(r[1].x, r[1].y, t.EXTENT, 0), this._boundsArray.emplaceBack(r[3].x, r[3].y, 0, t.EXTENT), this._boundsArray.emplaceBack(r[2].x, r[2].y, t.EXTENT, t.EXTENT), this.boundsBuffer && (this.boundsBuffer.destroy(), delete this.boundsBuffer), this.fire(new t.Event("data", {\n dataType: "source",\n sourceDataType: "content"\n })), this;\n }, i.prototype.prepare = function () {\n if (0 !== Object.keys(this.tiles).length && this.image) {\n var e = this.map.painter.context,\n i = e.gl;\n\n for (var o in this.boundsBuffer || (this.boundsBuffer = e.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture || (this.texture = new t.Texture(e, this.image, i.RGBA), this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE)), this.tiles) {\n var r = this.tiles[o];\n "loaded" !== r.state && (r.state = "loaded", r.texture = this.texture);\n }\n }\n }, i.prototype.loadTile = function (t, e) {\n this.tileID && this.tileID.equals(t.tileID.canonical) ? (this.tiles[String(t.tileID.wrap)] = t, t.buckets = {}, e(null)) : (t.state = "errored", e(null));\n }, i.prototype.serialize = function () {\n return {\n type: "image",\n url: this.options.url,\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return !1;\n }, i;\n }(t.Evented),\n L = function (e) {\n function i(t, i, o, r) {\n e.call(this, t, i, o, r), this.roundZoom = !0, this.type = "video", this.options = i;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n var e = this;\n this._loaded = !1;\n var i = this.options;\n this.urls = [];\n\n for (var o = 0, r = i.urls; o < r.length; o += 1) {\n this.urls.push(this.map._requestManager.transformRequest(r[o], t.ResourceType.Source).url);\n }\n\n t.getVideo(this.urls, function (i, o) {\n e._loaded = !0, i ? e.fire(new t.ErrorEvent(i)) : o && (e.video = o, e.video.loop = !0, e.video.addEventListener("playing", function () {\n e.map.triggerRepaint();\n }), e.map && e.video.play(), e._finishLoading());\n });\n }, i.prototype.pause = function () {\n this.video && this.video.pause();\n }, i.prototype.play = function () {\n this.video && this.video.play();\n }, i.prototype.seek = function (e) {\n if (this.video) {\n var i = this.video.seekable;\n e < i.start(0) || e > i.end(0) ? this.fire(new t.ErrorEvent(new t.ValidationError("sources." + this.id, null, "Playback for this video can be set only between the " + i.start(0) + " and " + i.end(0) + "-second mark."))) : this.video.currentTime = e;\n }\n }, i.prototype.getVideo = function () {\n return this.video;\n }, i.prototype.onAdd = function (t) {\n this.map || (this.map = t, this.load(), this.video && (this.video.play(), this.setCoordinates(this.coordinates)));\n }, i.prototype.prepare = function () {\n if (!(0 === Object.keys(this.tiles).length || this.video.readyState < 2)) {\n var e = this.map.painter.context,\n i = e.gl;\n\n for (var o in this.boundsBuffer || (this.boundsBuffer = e.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture ? this.video.paused || (this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE), i.texSubImage2D(i.TEXTURE_2D, 0, 0, 0, i.RGBA, i.UNSIGNED_BYTE, this.video)) : (this.texture = new t.Texture(e, this.video, i.RGBA), this.texture.bind(i.LINEAR, i.CLAMP_TO_EDGE)), this.tiles) {\n var r = this.tiles[o];\n "loaded" !== r.state && (r.state = "loaded", r.texture = this.texture);\n }\n }\n }, i.prototype.serialize = function () {\n return {\n type: "video",\n urls: this.urls,\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return this.video && !this.video.paused;\n }, i;\n }(M),\n R = function (e) {\n function i(i, o, r, a) {\n e.call(this, i, o, r, a), o.coordinates ? Array.isArray(o.coordinates) && 4 === o.coordinates.length && !o.coordinates.some(function (t) {\n return !Array.isArray(t) || 2 !== t.length || t.some(function (t) {\n return "number" != typeof t;\n });\n }) || this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'"coordinates" property must be an array of 4 longitude/latitude array pairs\'))) : this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'missing required property "coordinates"\'))), o.animate && "boolean" != typeof o.animate && this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'optional "animate" property must be a boolean value\'))), o.canvas ? "string" == typeof o.canvas || o.canvas instanceof t.window.HTMLCanvasElement || this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance\'))) : this.fire(new t.ErrorEvent(new t.ValidationError("sources." + i, null, \'missing required property "canvas"\'))), this.options = o, this.animate = void 0 === o.animate || o.animate;\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.load = function () {\n this._loaded = !0, this.canvas || (this.canvas = this.options.canvas instanceof t.window.HTMLCanvasElement ? this.options.canvas : t.window.document.getElementById(this.options.canvas)), this.width = this.canvas.width, this.height = this.canvas.height, this._hasInvalidDimensions() ? this.fire(new t.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))) : (this.play = function () {\n this._playing = !0, this.map.triggerRepaint();\n }, this.pause = function () {\n this._playing && (this.prepare(), this._playing = !1);\n }, this._finishLoading());\n }, i.prototype.getCanvas = function () {\n return this.canvas;\n }, i.prototype.onAdd = function (t) {\n this.map = t, this.load(), this.canvas && this.animate && this.play();\n }, i.prototype.onRemove = function () {\n this.pause();\n }, i.prototype.prepare = function () {\n var e = !1;\n\n if (this.canvas.width !== this.width && (this.width = this.canvas.width, e = !0), this.canvas.height !== this.height && (this.height = this.canvas.height, e = !0), !this._hasInvalidDimensions() && 0 !== Object.keys(this.tiles).length) {\n var i = this.map.painter.context,\n o = i.gl;\n\n for (var r in this.boundsBuffer || (this.boundsBuffer = i.createVertexBuffer(this._boundsArray, A.members)), this.boundsSegments || (this.boundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2)), this.texture ? (e || this._playing) && this.texture.update(this.canvas, {\n premultiply: !0\n }) : this.texture = new t.Texture(i, this.canvas, o.RGBA, {\n premultiply: !0\n }), this.tiles) {\n var a = this.tiles[r];\n "loaded" !== a.state && (a.state = "loaded", a.texture = this.texture);\n }\n }\n }, i.prototype.serialize = function () {\n return {\n type: "canvas",\n coordinates: this.coordinates\n };\n }, i.prototype.hasTransition = function () {\n return this._playing;\n }, i.prototype._hasInvalidDimensions = function () {\n for (var t = 0, e = [this.canvas.width, this.canvas.height]; t < e.length; t += 1) {\n var i = e[t];\n if (isNaN(i) || i <= 0) return !0;\n }\n\n return !1;\n }, i;\n }(M),\n k = {\n vector: S,\n raster: C,\n "raster-dem": z,\n geojson: D,\n video: L,\n image: M,\n canvas: R\n };\n\n function B(e, i) {\n var o = t.identity([]);\n return t.translate(o, o, [1, 1, 0]), t.scale(o, o, [.5 * e.width, .5 * e.height, 1]), t.multiply(o, o, e.calculatePosMatrix(i.toUnwrapped()));\n }\n\n function O(t, e, i, o, r, a) {\n var n = function (t, e, i) {\n if (t) for (var o = 0, r = t; o < r.length; o += 1) {\n var a = e[r[o]];\n if (a && a.source === i && "fill-extrusion" === a.type) return !0;\n } else for (var n in e) {\n var s = e[n];\n if (s.source === i && "fill-extrusion" === s.type) return !0;\n }\n return !1;\n }(r && r.layers, e, t.id),\n s = a.maxPitchScaleFactor(),\n l = t.tilesIn(o, s, n);\n\n l.sort(F);\n\n for (var c = [], u = 0, h = l; u < h.length; u += 1) {\n var p = h[u];\n c.push({\n wrappedTileID: p.tileID.wrapped().key,\n queryResults: p.tile.queryRenderedFeatures(e, i, t._state, p.queryGeometry, p.cameraQueryGeometry, p.scale, r, a, s, B(t.transform, p.tileID))\n });\n }\n\n var d = function (t) {\n for (var e = {}, i = {}, o = 0, r = t; o < r.length; o += 1) {\n var a = r[o],\n n = a.queryResults,\n s = a.wrappedTileID,\n l = i[s] = i[s] || {};\n\n for (var c in n) {\n for (var u = n[c], h = l[c] = l[c] || {}, p = e[c] = e[c] || [], d = 0, _ = u; d < _.length; d += 1) {\n var f = _[d];\n h[f.featureIndex] || (h[f.featureIndex] = !0, p.push(f));\n }\n }\n }\n\n return e;\n }(c);\n\n for (var _ in d) {\n d[_].forEach(function (e) {\n var i = e.feature,\n o = t.getFeatureState(i.layer["source-layer"], i.id);\n i.source = i.layer.source, i.layer["source-layer"] && (i.sourceLayer = i.layer["source-layer"]), i.state = o;\n });\n }\n\n return d;\n }\n\n function F(t, e) {\n var i = t.tileID,\n o = e.tileID;\n return i.overscaledZ - o.overscaledZ || i.canonical.y - o.canonical.y || i.wrap - o.wrap || i.canonical.x - o.canonical.x;\n }\n\n var U = function U(t, e) {\n this.max = t, this.onRemove = e, this.reset();\n };\n\n U.prototype.reset = function () {\n for (var t in this.data) {\n for (var e = 0, i = this.data[t]; e < i.length; e += 1) {\n var o = i[e];\n o.timeout && clearTimeout(o.timeout), this.onRemove(o.value);\n }\n }\n\n return this.data = {}, this.order = [], this;\n }, U.prototype.add = function (t, e, i) {\n var o = this,\n r = t.wrapped().key;\n void 0 === this.data[r] && (this.data[r] = []);\n var a = {\n value: e,\n timeout: void 0\n };\n\n if (void 0 !== i && (a.timeout = setTimeout(function () {\n o.remove(t, a);\n }, i)), this.data[r].push(a), this.order.push(r), this.order.length > this.max) {\n var n = this._getAndRemoveByKey(this.order[0]);\n\n n && this.onRemove(n);\n }\n\n return this;\n }, U.prototype.has = function (t) {\n return t.wrapped().key in this.data;\n }, U.prototype.getAndRemove = function (t) {\n return this.has(t) ? this._getAndRemoveByKey(t.wrapped().key) : null;\n }, U.prototype._getAndRemoveByKey = function (t) {\n var e = this.data[t].shift();\n return e.timeout && clearTimeout(e.timeout), 0 === this.data[t].length && delete this.data[t], this.order.splice(this.order.indexOf(t), 1), e.value;\n }, U.prototype.getByKey = function (t) {\n var e = this.data[t];\n return e ? e[0].value : null;\n }, U.prototype.get = function (t) {\n return this.has(t) ? this.data[t.wrapped().key][0].value : null;\n }, U.prototype.remove = function (t, e) {\n if (!this.has(t)) return this;\n var i = t.wrapped().key,\n o = void 0 === e ? 0 : this.data[i].indexOf(e),\n r = this.data[i][o];\n return this.data[i].splice(o, 1), r.timeout && clearTimeout(r.timeout), 0 === this.data[i].length && delete this.data[i], this.onRemove(r.value), this.order.splice(this.order.indexOf(i), 1), this;\n }, U.prototype.setMaxSize = function (t) {\n for (this.max = t; this.order.length > this.max;) {\n var e = this._getAndRemoveByKey(this.order[0]);\n\n e && this.onRemove(e);\n }\n\n return this;\n }, U.prototype.filter = function (t) {\n var e = [];\n\n for (var i in this.data) {\n for (var o = 0, r = this.data[i]; o < r.length; o += 1) {\n var a = r[o];\n t(a.value) || e.push(a);\n }\n }\n\n for (var n = 0, s = e; n < s.length; n += 1) {\n var l = s[n];\n this.remove(l.value.tileID, l);\n }\n };\n\n var N = function N(t, e, i) {\n this.context = t;\n var o = t.gl;\n this.buffer = o.createBuffer(), this.dynamicDraw = Boolean(i), this.context.unbindVAO(), t.bindElementBuffer.set(this.buffer), o.bufferData(o.ELEMENT_ARRAY_BUFFER, e.arrayBuffer, this.dynamicDraw ? o.DYNAMIC_DRAW : o.STATIC_DRAW), this.dynamicDraw || delete e.arrayBuffer;\n };\n\n N.prototype.bind = function () {\n this.context.bindElementBuffer.set(this.buffer);\n }, N.prototype.updateData = function (t) {\n var e = this.context.gl;\n this.context.unbindVAO(), this.bind(), e.bufferSubData(e.ELEMENT_ARRAY_BUFFER, 0, t.arrayBuffer);\n }, N.prototype.destroy = function () {\n this.buffer && (this.context.gl.deleteBuffer(this.buffer), delete this.buffer);\n };\n\n var Z = {\n Int8: "BYTE",\n Uint8: "UNSIGNED_BYTE",\n Int16: "SHORT",\n Uint16: "UNSIGNED_SHORT",\n Int32: "INT",\n Uint32: "UNSIGNED_INT",\n Float32: "FLOAT"\n },\n q = function q(t, e, i, o) {\n this.length = e.length, this.attributes = i, this.itemSize = e.bytesPerElement, this.dynamicDraw = o, this.context = t;\n var r = t.gl;\n this.buffer = r.createBuffer(), t.bindVertexBuffer.set(this.buffer), r.bufferData(r.ARRAY_BUFFER, e.arrayBuffer, this.dynamicDraw ? r.DYNAMIC_DRAW : r.STATIC_DRAW), this.dynamicDraw || delete e.arrayBuffer;\n };\n\n q.prototype.bind = function () {\n this.context.bindVertexBuffer.set(this.buffer);\n }, q.prototype.updateData = function (t) {\n var e = this.context.gl;\n this.bind(), e.bufferSubData(e.ARRAY_BUFFER, 0, t.arrayBuffer);\n }, q.prototype.enableAttributes = function (t, e) {\n for (var i = 0; i < this.attributes.length; i++) {\n var o = e.attributes[this.attributes[i].name];\n void 0 !== o && t.enableVertexAttribArray(o);\n }\n }, q.prototype.setVertexAttribPointers = function (t, e, i) {\n for (var o = 0; o < this.attributes.length; o++) {\n var r = this.attributes[o],\n a = e.attributes[r.name];\n void 0 !== a && t.vertexAttribPointer(a, r.components, t[Z[r.type]], !1, this.itemSize, r.offset + this.itemSize * (i || 0));\n }\n }, q.prototype.destroy = function () {\n this.buffer && (this.context.gl.deleteBuffer(this.buffer), delete this.buffer);\n };\n\n var j = function j(t) {\n this.gl = t.gl, this.default = this.getDefault(), this.current = this.default, this.dirty = !1;\n };\n\n j.prototype.get = function () {\n return this.current;\n }, j.prototype.set = function (t) {}, j.prototype.getDefault = function () {\n return this.default;\n }, j.prototype.setDefault = function () {\n this.set(this.default);\n };\n\n var V = function (e) {\n function i() {\n e.apply(this, arguments);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getDefault = function () {\n return t.Color.transparent;\n }, i.prototype.set = function (t) {\n var e = this.current;\n (t.r !== e.r || t.g !== e.g || t.b !== e.b || t.a !== e.a || this.dirty) && (this.gl.clearColor(t.r, t.g, t.b, t.a), this.current = t, this.dirty = !1);\n }, i;\n }(j),\n G = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 1;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.clearDepth(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n W = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.clearStencil(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n X = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return [!0, !0, !0, !0];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || t[3] !== e[3] || this.dirty) && (this.gl.colorMask(t[0], t[1], t[2], t[3]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n H = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.depthMask(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n K = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 255;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.stencilMask(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n Y = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return {\n func: this.gl.ALWAYS,\n ref: 0,\n mask: 255\n };\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t.func !== e.func || t.ref !== e.ref || t.mask !== e.mask || this.dirty) && (this.gl.stencilFunc(t.func, t.ref, t.mask), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n J = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [t.KEEP, t.KEEP, t.KEEP];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || this.dirty) && (this.gl.stencilOp(t[0], t[1], t[2]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n Q = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.STENCIL_TEST) : e.disable(e.STENCIL_TEST), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n $ = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return [0, 1];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || this.dirty) && (this.gl.depthRange(t[0], t[1]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n tt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.DEPTH_TEST) : e.disable(e.DEPTH_TEST), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n et = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.LESS;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.depthFunc(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n it = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.BLEND) : e.disable(e.BLEND), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n ot = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [t.ONE, t.ZERO];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || this.dirty) && (this.gl.blendFunc(t[0], t[1]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n rt = function (e) {\n function i() {\n e.apply(this, arguments);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getDefault = function () {\n return t.Color.transparent;\n }, i.prototype.set = function (t) {\n var e = this.current;\n (t.r !== e.r || t.g !== e.g || t.b !== e.b || t.a !== e.a || this.dirty) && (this.gl.blendColor(t.r, t.g, t.b, t.a), this.current = t, this.dirty = !1);\n }, i;\n }(j),\n at = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.FUNC_ADD;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.blendEquation(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n nt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n t ? e.enable(e.CULL_FACE) : e.disable(e.CULL_FACE), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n st = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.BACK;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.cullFace(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n lt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.CCW;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.frontFace(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ct = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.useProgram(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ut = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return this.gl.TEXTURE0;\n }, e.prototype.set = function (t) {\n (t !== this.current || this.dirty) && (this.gl.activeTexture(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n ht = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n var t = this.gl;\n return [0, 0, t.drawingBufferWidth, t.drawingBufferHeight];\n }, e.prototype.set = function (t) {\n var e = this.current;\n (t[0] !== e[0] || t[1] !== e[1] || t[2] !== e[2] || t[3] !== e[3] || this.dirty) && (this.gl.viewport(t[0], t[1], t[2], t[3]), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n pt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindFramebuffer(e.FRAMEBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n dt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindRenderbuffer(e.RENDERBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n _t = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindTexture(e.TEXTURE_2D, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n ft = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.bindBuffer(e.ARRAY_BUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n mt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n var e = this.gl;\n e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, t), this.current = t, this.dirty = !1;\n }, e;\n }(j),\n gt = function (t) {\n function e(e) {\n t.call(this, e), this.vao = e.extVertexArrayObject;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e.prototype.set = function (t) {\n this.vao && (t !== this.current || this.dirty) && (this.vao.bindVertexArrayOES(t), this.current = t, this.dirty = !1);\n }, e;\n }(j),\n vt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return 4;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_ALIGNMENT, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n yt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n xt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return !1;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n var e = this.gl;\n e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(j),\n bt = function (t) {\n function e(e, i) {\n t.call(this, e), this.context = e, this.parent = i;\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.getDefault = function () {\n return null;\n }, e;\n }(j),\n wt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.setDirty = function () {\n this.dirty = !0;\n }, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n this.context.bindFramebuffer.set(this.parent);\n var e = this.gl;\n e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, t, 0), this.current = t, this.dirty = !1;\n }\n }, e;\n }(bt),\n Tt = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.set = function (t) {\n if (t !== this.current || this.dirty) {\n this.context.bindFramebuffer.set(this.parent);\n var e = this.gl;\n e.framebufferRenderbuffer(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.RENDERBUFFER, t), this.current = t, this.dirty = !1;\n }\n }, e;\n }(bt),\n Et = function Et(t, e, i, o) {\n this.context = t, this.width = e, this.height = i;\n var r = this.framebuffer = t.gl.createFramebuffer();\n this.colorAttachment = new wt(t, r), o && (this.depthAttachment = new Tt(t, r));\n };\n\n Et.prototype.destroy = function () {\n var t = this.context.gl,\n e = this.colorAttachment.get();\n\n if (e && t.deleteTexture(e), this.depthAttachment) {\n var i = this.depthAttachment.get();\n i && t.deleteRenderbuffer(i);\n }\n\n t.deleteFramebuffer(this.framebuffer);\n };\n\n var It = function It(t, e, i) {\n this.func = t, this.mask = e, this.range = i;\n };\n\n It.ReadOnly = !1, It.ReadWrite = !0, It.disabled = new It(519, It.ReadOnly, [0, 1]);\n\n var Pt = function Pt(t, e, i, o, r, a) {\n this.test = t, this.ref = e, this.mask = i, this.fail = o, this.depthFail = r, this.pass = a;\n };\n\n Pt.disabled = new Pt({\n func: 519,\n mask: 0\n }, 0, 0, 7680, 7680, 7680);\n\n var St = function St(t, e, i) {\n this.blendFunction = t, this.blendColor = e, this.mask = i;\n };\n\n St.disabled = new St(St.Replace = [1, 0], t.Color.transparent, [!1, !1, !1, !1]), St.unblended = new St(St.Replace, t.Color.transparent, [!0, !0, !0, !0]), St.alphaBlended = new St([1, 771], t.Color.transparent, [!0, !0, !0, !0]);\n\n var Ct = function Ct(t, e, i) {\n this.enable = t, this.mode = e, this.frontFace = i;\n };\n\n Ct.disabled = new Ct(!1, 1029, 2305), Ct.backCCW = new Ct(!0, 1029, 2305);\n\n var zt = function zt(t) {\n this.gl = t, this.extVertexArrayObject = this.gl.getExtension("OES_vertex_array_object"), this.clearColor = new V(this), this.clearDepth = new G(this), this.clearStencil = new W(this), this.colorMask = new X(this), this.depthMask = new H(this), this.stencilMask = new K(this), this.stencilFunc = new Y(this), this.stencilOp = new J(this), this.stencilTest = new Q(this), this.depthRange = new $(this), this.depthTest = new tt(this), this.depthFunc = new et(this), this.blend = new it(this), this.blendFunc = new ot(this), this.blendColor = new rt(this), this.blendEquation = new at(this), this.cullFace = new nt(this), this.cullFaceSide = new st(this), this.frontFace = new lt(this), this.program = new ct(this), this.activeTexture = new ut(this), this.viewport = new ht(this), this.bindFramebuffer = new pt(this), this.bindRenderbuffer = new dt(this), this.bindTexture = new _t(this), this.bindVertexBuffer = new ft(this), this.bindElementBuffer = new mt(this), this.bindVertexArrayOES = this.extVertexArrayObject && new gt(this), this.pixelStoreUnpack = new vt(this), this.pixelStoreUnpackPremultiplyAlpha = new yt(this), this.pixelStoreUnpackFlipY = new xt(this), this.extTextureFilterAnisotropic = t.getExtension("EXT_texture_filter_anisotropic") || t.getExtension("MOZ_EXT_texture_filter_anisotropic") || t.getExtension("WEBKIT_EXT_texture_filter_anisotropic"), this.extTextureFilterAnisotropic && (this.extTextureFilterAnisotropicMax = t.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)), this.extTextureHalfFloat = t.getExtension("OES_texture_half_float"), this.extTextureHalfFloat && (t.getExtension("OES_texture_half_float_linear"), this.extRenderToTextureHalfFloat = t.getExtension("EXT_color_buffer_half_float")), this.extTimerQuery = t.getExtension("EXT_disjoint_timer_query"), this.maxTextureSize = t.getParameter(t.MAX_TEXTURE_SIZE);\n };\n\n zt.prototype.setDefault = function () {\n this.unbindVAO(), this.clearColor.setDefault(), this.clearDepth.setDefault(), this.clearStencil.setDefault(), this.colorMask.setDefault(), this.depthMask.setDefault(), this.stencilMask.setDefault(), this.stencilFunc.setDefault(), this.stencilOp.setDefault(), this.stencilTest.setDefault(), this.depthRange.setDefault(), this.depthTest.setDefault(), this.depthFunc.setDefault(), this.blend.setDefault(), this.blendFunc.setDefault(), this.blendColor.setDefault(), this.blendEquation.setDefault(), this.cullFace.setDefault(), this.cullFaceSide.setDefault(), this.frontFace.setDefault(), this.program.setDefault(), this.activeTexture.setDefault(), this.bindFramebuffer.setDefault(), this.pixelStoreUnpack.setDefault(), this.pixelStoreUnpackPremultiplyAlpha.setDefault(), this.pixelStoreUnpackFlipY.setDefault();\n }, zt.prototype.setDirty = function () {\n this.clearColor.dirty = !0, this.clearDepth.dirty = !0, this.clearStencil.dirty = !0, this.colorMask.dirty = !0, this.depthMask.dirty = !0, this.stencilMask.dirty = !0, this.stencilFunc.dirty = !0, this.stencilOp.dirty = !0, this.stencilTest.dirty = !0, this.depthRange.dirty = !0, this.depthTest.dirty = !0, this.depthFunc.dirty = !0, this.blend.dirty = !0, this.blendFunc.dirty = !0, this.blendColor.dirty = !0, this.blendEquation.dirty = !0, this.cullFace.dirty = !0, this.cullFaceSide.dirty = !0, this.frontFace.dirty = !0, this.program.dirty = !0, this.activeTexture.dirty = !0, this.viewport.dirty = !0, this.bindFramebuffer.dirty = !0, this.bindRenderbuffer.dirty = !0, this.bindTexture.dirty = !0, this.bindVertexBuffer.dirty = !0, this.bindElementBuffer.dirty = !0, this.extVertexArrayObject && (this.bindVertexArrayOES.dirty = !0), this.pixelStoreUnpack.dirty = !0, this.pixelStoreUnpackPremultiplyAlpha.dirty = !0, this.pixelStoreUnpackFlipY.dirty = !0;\n }, zt.prototype.createIndexBuffer = function (t, e) {\n return new N(this, t, e);\n }, zt.prototype.createVertexBuffer = function (t, e, i) {\n return new q(this, t, e, i);\n }, zt.prototype.createRenderbuffer = function (t, e, i) {\n var o = this.gl,\n r = o.createRenderbuffer();\n return this.bindRenderbuffer.set(r), o.renderbufferStorage(o.RENDERBUFFER, t, e, i), this.bindRenderbuffer.set(null), r;\n }, zt.prototype.createFramebuffer = function (t, e, i) {\n return new Et(this, t, e, i);\n }, zt.prototype.clear = function (t) {\n var e = t.color,\n i = t.depth,\n o = this.gl,\n r = 0;\n e && (r |= o.COLOR_BUFFER_BIT, this.clearColor.set(e), this.colorMask.set([!0, !0, !0, !0])), void 0 !== i && (r |= o.DEPTH_BUFFER_BIT, this.depthRange.set([0, 1]), this.clearDepth.set(i), this.depthMask.set(!0)), o.clear(r);\n }, zt.prototype.setCullFace = function (t) {\n !1 === t.enable ? this.cullFace.set(!1) : (this.cullFace.set(!0), this.cullFaceSide.set(t.mode), this.frontFace.set(t.frontFace));\n }, zt.prototype.setDepthMode = function (t) {\n t.func !== this.gl.ALWAYS || t.mask ? (this.depthTest.set(!0), this.depthFunc.set(t.func), this.depthMask.set(t.mask), this.depthRange.set(t.range)) : this.depthTest.set(!1);\n }, zt.prototype.setStencilMode = function (t) {\n t.test.func !== this.gl.ALWAYS || t.mask ? (this.stencilTest.set(!0), this.stencilMask.set(t.mask), this.stencilOp.set([t.fail, t.depthFail, t.pass]), this.stencilFunc.set({\n func: t.test.func,\n ref: t.ref,\n mask: t.test.mask\n })) : this.stencilTest.set(!1);\n }, zt.prototype.setColorMode = function (e) {\n t.deepEqual(e.blendFunction, St.Replace) ? this.blend.set(!1) : (this.blend.set(!0), this.blendFunc.set(e.blendFunction), this.blendColor.set(e.blendColor)), this.colorMask.set(e.mask);\n }, zt.prototype.unbindVAO = function () {\n this.extVertexArrayObject && this.bindVertexArrayOES.set(null);\n };\n\n var Dt = function (e) {\n function i(i, o, r) {\n var a = this;\n e.call(this), this.id = i, this.dispatcher = r, this.on("data", function (t) {\n "source" === t.dataType && "metadata" === t.sourceDataType && (a._sourceLoaded = !0), a._sourceLoaded && !a._paused && "source" === t.dataType && "content" === t.sourceDataType && (a.reload(), a.transform && a.update(a.transform));\n }), this.on("error", function () {\n a._sourceErrored = !0;\n }), this._source = function (e, i, o, r) {\n var a = new k[i.type](e, i, o, r);\n if (a.id !== e) throw new Error("Expected Source id to be " + e + " instead of " + a.id);\n return t.bindAll(["load", "abort", "unload", "serialize", "prepare"], a), a;\n }(i, o, r, this), this._tiles = {}, this._cache = new U(0, this._unloadTile.bind(this)), this._timers = {}, this._cacheTimers = {}, this._maxTileCacheSize = null, this._loadedParentTiles = {}, this._coveredTiles = {}, this._state = new t.SourceFeatureState();\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.onAdd = function (t) {\n this.map = t, this._maxTileCacheSize = t ? t._maxTileCacheSize : null, this._source && this._source.onAdd && this._source.onAdd(t);\n }, i.prototype.onRemove = function (t) {\n this._source && this._source.onRemove && this._source.onRemove(t);\n }, i.prototype.loaded = function () {\n if (this._sourceErrored) return !0;\n if (!this._sourceLoaded) return !1;\n if (!this._source.loaded()) return !1;\n\n for (var t in this._tiles) {\n var e = this._tiles[t];\n if ("loaded" !== e.state && "errored" !== e.state) return !1;\n }\n\n return !0;\n }, i.prototype.getSource = function () {\n return this._source;\n }, i.prototype.pause = function () {\n this._paused = !0;\n }, i.prototype.resume = function () {\n if (this._paused) {\n var t = this._shouldReloadOnResume;\n this._paused = !1, this._shouldReloadOnResume = !1, t && this.reload(), this.transform && this.update(this.transform);\n }\n }, i.prototype._loadTile = function (t, e) {\n return this._source.loadTile(t, e);\n }, i.prototype._unloadTile = function (t) {\n if (this._source.unloadTile) return this._source.unloadTile(t, function () {});\n }, i.prototype._abortTile = function (t) {\n if (this._source.abortTile) return this._source.abortTile(t, function () {});\n }, i.prototype.serialize = function () {\n return this._source.serialize();\n }, i.prototype.prepare = function (t) {\n for (var e in this._source.prepare && this._source.prepare(), this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null), this._tiles) {\n var i = this._tiles[e];\n i.upload(t), i.prepare(this.map.style.imageManager);\n }\n }, i.prototype.getIds = function () {\n return t.values(this._tiles).map(function (t) {\n return t.tileID;\n }).sort(At).map(function (t) {\n return t.key;\n });\n }, i.prototype.getRenderableIds = function (e) {\n var i = this,\n o = [];\n\n for (var r in this._tiles) {\n this._isIdRenderable(r, e) && o.push(this._tiles[r]);\n }\n\n return e ? o.sort(function (e, o) {\n var r = e.tileID,\n a = o.tileID,\n n = new t.Point(r.canonical.x, r.canonical.y)._rotate(i.transform.angle),\n s = new t.Point(a.canonical.x, a.canonical.y)._rotate(i.transform.angle);\n\n return r.overscaledZ - a.overscaledZ || s.y - n.y || s.x - n.x;\n }).map(function (t) {\n return t.tileID.key;\n }) : o.map(function (t) {\n return t.tileID;\n }).sort(At).map(function (t) {\n return t.key;\n });\n }, i.prototype.hasRenderableParent = function (t) {\n var e = this.findLoadedParent(t, 0);\n return !!e && this._isIdRenderable(e.tileID.key);\n }, i.prototype._isIdRenderable = function (t, e) {\n return this._tiles[t] && this._tiles[t].hasData() && !this._coveredTiles[t] && (e || !this._tiles[t].holdingForFade());\n }, i.prototype.reload = function () {\n if (this._paused) this._shouldReloadOnResume = !0;else for (var t in this._cache.reset(), this._tiles) {\n "errored" !== this._tiles[t].state && this._reloadTile(t, "reloading");\n }\n }, i.prototype._reloadTile = function (t, e) {\n var i = this._tiles[t];\n i && ("loading" !== i.state && (i.state = e), this._loadTile(i, this._tileLoaded.bind(this, i, t, e)));\n }, i.prototype._tileLoaded = function (e, i, o, r) {\n if (r) return e.state = "errored", void (404 !== r.status ? this._source.fire(new t.ErrorEvent(r, {\n tile: e\n })) : this.update(this.transform));\n e.timeAdded = t.browser.now(), "expired" === o && (e.refreshedUponExpiration = !0), this._setTileReloadTimer(i, e), "raster-dem" === this.getSource().type && e.dem && this._backfillDEM(e), this._state.initializeTileState(e, this.map ? this.map.painter : null), this._source.fire(new t.Event("data", {\n dataType: "source",\n tile: e,\n coord: e.tileID\n }));\n }, i.prototype._backfillDEM = function (t) {\n for (var e = this.getRenderableIds(), i = 0; i < e.length; i++) {\n var o = e[i];\n\n if (t.neighboringTiles && t.neighboringTiles[o]) {\n var r = this.getTileByID(o);\n a(t, r), a(r, t);\n }\n }\n\n function a(t, e) {\n t.needsHillshadePrepare = !0;\n var i = e.tileID.canonical.x - t.tileID.canonical.x,\n o = e.tileID.canonical.y - t.tileID.canonical.y,\n r = Math.pow(2, t.tileID.canonical.z),\n a = e.tileID.key;\n 0 === i && 0 === o || Math.abs(o) > 1 || (Math.abs(i) > 1 && (1 === Math.abs(i + r) ? i += r : 1 === Math.abs(i - r) && (i -= r)), e.dem && t.dem && (t.dem.backfillBorder(e.dem, i, o), t.neighboringTiles && t.neighboringTiles[a] && (t.neighboringTiles[a].backfilled = !0)));\n }\n }, i.prototype.getTile = function (t) {\n return this.getTileByID(t.key);\n }, i.prototype.getTileByID = function (t) {\n return this._tiles[t];\n }, i.prototype._retainLoadedChildren = function (t, e, i, o) {\n for (var r in this._tiles) {\n var a = this._tiles[r];\n\n if (!(o[r] || !a.hasData() || a.tileID.overscaledZ <= e || a.tileID.overscaledZ > i)) {\n for (var n = a.tileID; a && a.tileID.overscaledZ > e + 1;) {\n var s = a.tileID.scaledTo(a.tileID.overscaledZ - 1);\n (a = this._tiles[s.key]) && a.hasData() && (n = s);\n }\n\n for (var l = n; l.overscaledZ > e;) {\n if (t[(l = l.scaledTo(l.overscaledZ - 1)).key]) {\n o[n.key] = n;\n break;\n }\n }\n }\n }\n }, i.prototype.findLoadedParent = function (t, e) {\n if (t.key in this._loadedParentTiles) {\n var i = this._loadedParentTiles[t.key];\n return i && i.tileID.overscaledZ >= e ? i : null;\n }\n\n for (var o = t.overscaledZ - 1; o >= e; o--) {\n var r = t.scaledTo(o),\n a = this._getLoadedTile(r);\n\n if (a) return a;\n }\n }, i.prototype._getLoadedTile = function (t) {\n var e = this._tiles[t.key];\n return e && e.hasData() ? e : this._cache.getByKey(t.wrapped().key);\n }, i.prototype.updateCacheSize = function (t) {\n var e = Math.ceil(t.width / this._source.tileSize) + 1,\n i = Math.ceil(t.height / this._source.tileSize) + 1,\n o = Math.floor(e * i * 5),\n r = "number" == typeof this._maxTileCacheSize ? Math.min(this._maxTileCacheSize, o) : o;\n\n this._cache.setMaxSize(r);\n }, i.prototype.handleWrapJump = function (t) {\n var e = Math.round((t - (void 0 === this._prevLng ? t : this._prevLng)) / 360);\n\n if (this._prevLng = t, e) {\n var i = {};\n\n for (var o in this._tiles) {\n var r = this._tiles[o];\n r.tileID = r.tileID.unwrapTo(r.tileID.wrap + e), i[r.tileID.key] = r;\n }\n\n for (var a in this._tiles = i, this._timers) {\n clearTimeout(this._timers[a]), delete this._timers[a];\n }\n\n for (var n in this._tiles) {\n this._setTileReloadTimer(n, this._tiles[n]);\n }\n }\n }, i.prototype.update = function (e) {\n var o = this;\n\n if (this.transform = e, this._sourceLoaded && !this._paused) {\n var r;\n this.updateCacheSize(e), this.handleWrapJump(this.transform.center.lng), this._coveredTiles = {}, this.used ? this._source.tileID ? r = e.getVisibleUnwrappedCoordinates(this._source.tileID).map(function (e) {\n return new t.OverscaledTileID(e.canonical.z, e.wrap, e.canonical.z, e.canonical.x, e.canonical.y);\n }) : (r = e.coveringTiles({\n tileSize: this._source.tileSize,\n minzoom: this._source.minzoom,\n maxzoom: this._source.maxzoom,\n roundZoom: this._source.roundZoom,\n reparseOverscaled: this._source.reparseOverscaled\n }), this._source.hasTile && (r = r.filter(function (t) {\n return o._source.hasTile(t);\n }))) : r = [];\n\n var a = e.coveringZoomLevel(this._source),\n n = Math.max(a - i.maxOverzooming, this._source.minzoom),\n s = Math.max(a + i.maxUnderzooming, this._source.minzoom),\n l = this._updateRetainedTiles(r, a);\n\n if (Mt(this._source.type)) {\n for (var c = {}, u = {}, h = 0, p = Object.keys(l); h < p.length; h += 1) {\n var d = p[h],\n _ = l[d],\n f = this._tiles[d];\n\n if (f && !(f.fadeEndTime && f.fadeEndTime <= t.browser.now())) {\n var m = this.findLoadedParent(_, n);\n m && (this._addTile(m.tileID), c[m.tileID.key] = m.tileID), u[d] = _;\n }\n }\n\n for (var g in this._retainLoadedChildren(u, a, s, l), c) {\n l[g] || (this._coveredTiles[g] = !0, l[g] = c[g]);\n }\n }\n\n for (var v in l) {\n this._tiles[v].clearFadeHold();\n }\n\n for (var y = 0, x = t.keysDifference(this._tiles, l); y < x.length; y += 1) {\n var b = x[y],\n w = this._tiles[b];\n w.hasSymbolBuckets && !w.holdingForFade() ? w.setHoldDuration(this.map._fadeDuration) : w.hasSymbolBuckets && !w.symbolFadeFinished() || this._removeTile(b);\n }\n\n this._updateLoadedParentTileCache();\n }\n }, i.prototype.releaseSymbolFadeTiles = function () {\n for (var t in this._tiles) {\n this._tiles[t].holdingForFade() && this._removeTile(t);\n }\n }, i.prototype._updateRetainedTiles = function (t, e) {\n for (var o = {}, r = {}, a = Math.max(e - i.maxOverzooming, this._source.minzoom), n = Math.max(e + i.maxUnderzooming, this._source.minzoom), s = {}, l = 0, c = t; l < c.length; l += 1) {\n var u = c[l],\n h = this._addTile(u);\n\n o[u.key] = u, h.hasData() || e < this._source.maxzoom && (s[u.key] = u);\n }\n\n this._retainLoadedChildren(s, e, n, o);\n\n for (var p = 0, d = t; p < d.length; p += 1) {\n var _ = d[p],\n f = this._tiles[_.key];\n\n if (!f.hasData()) {\n if (e + 1 > this._source.maxzoom) {\n var m = _.children(this._source.maxzoom)[0],\n g = this.getTile(m);\n\n if (g && g.hasData()) {\n o[m.key] = m;\n continue;\n }\n } else {\n var v = _.children(this._source.maxzoom);\n\n if (o[v[0].key] && o[v[1].key] && o[v[2].key] && o[v[3].key]) continue;\n }\n\n for (var y = f.wasRequested(), x = _.overscaledZ - 1; x >= a; --x) {\n var b = _.scaledTo(x);\n\n if (r[b.key]) break;\n if (r[b.key] = !0, !(f = this.getTile(b)) && y && (f = this._addTile(b)), f && (o[b.key] = b, y = f.wasRequested(), f.hasData())) break;\n }\n }\n }\n\n return o;\n }, i.prototype._updateLoadedParentTileCache = function () {\n for (var t in this._loadedParentTiles = {}, this._tiles) {\n for (var e = [], i = void 0, o = this._tiles[t].tileID; o.overscaledZ > 0;) {\n if (o.key in this._loadedParentTiles) {\n i = this._loadedParentTiles[o.key];\n break;\n }\n\n e.push(o.key);\n var r = o.scaledTo(o.overscaledZ - 1);\n if (i = this._getLoadedTile(r)) break;\n o = r;\n }\n\n for (var a = 0, n = e; a < n.length; a += 1) {\n this._loadedParentTiles[n[a]] = i;\n }\n }\n }, i.prototype._addTile = function (e) {\n var i = this._tiles[e.key];\n if (i) return i;\n (i = this._cache.getAndRemove(e)) && (this._setTileReloadTimer(e.key, i), i.tileID = e, this._state.initializeTileState(i, this.map ? this.map.painter : null), this._cacheTimers[e.key] && (clearTimeout(this._cacheTimers[e.key]), delete this._cacheTimers[e.key], this._setTileReloadTimer(e.key, i)));\n var o = Boolean(i);\n return o || (i = new t.Tile(e, this._source.tileSize * e.overscaleFactor()), this._loadTile(i, this._tileLoaded.bind(this, i, e.key, i.state))), i ? (i.uses++, this._tiles[e.key] = i, o || this._source.fire(new t.Event("dataloading", {\n tile: i,\n coord: i.tileID,\n dataType: "source"\n })), i) : null;\n }, i.prototype._setTileReloadTimer = function (t, e) {\n var i = this;\n t in this._timers && (clearTimeout(this._timers[t]), delete this._timers[t]);\n var o = e.getExpiryTimeout();\n o && (this._timers[t] = setTimeout(function () {\n i._reloadTile(t, "expired"), delete i._timers[t];\n }, o));\n }, i.prototype._removeTile = function (t) {\n var e = this._tiles[t];\n e && (e.uses--, delete this._tiles[t], this._timers[t] && (clearTimeout(this._timers[t]), delete this._timers[t]), e.uses > 0 || (e.hasData() && "reloading" !== e.state ? this._cache.add(e.tileID, e, e.getExpiryTimeout()) : (e.aborted = !0, this._abortTile(e), this._unloadTile(e))));\n }, i.prototype.clearTiles = function () {\n for (var t in this._shouldReloadOnResume = !1, this._paused = !1, this._tiles) {\n this._removeTile(t);\n }\n\n this._cache.reset();\n }, i.prototype.tilesIn = function (e, i, o) {\n var r = this,\n a = [],\n n = this.transform;\n if (!n) return a;\n\n for (var s = o ? n.getCameraQueryGeometry(e) : e, l = e.map(function (t) {\n return n.pointCoordinate(t);\n }), c = s.map(function (t) {\n return n.pointCoordinate(t);\n }), u = this.getIds(), h = 1 / 0, p = 1 / 0, d = -1 / 0, _ = -1 / 0, f = 0, m = c; f < m.length; f += 1) {\n var g = m[f];\n h = Math.min(h, g.x), p = Math.min(p, g.y), d = Math.max(d, g.x), _ = Math.max(_, g.y);\n }\n\n for (var v = function v(e) {\n var o = r._tiles[u[e]];\n\n if (!o.holdingForFade()) {\n var s = o.tileID,\n f = Math.pow(2, n.zoom - o.tileID.overscaledZ),\n m = i * o.queryPadding * t.EXTENT / o.tileSize / f,\n g = [s.getTilePoint(new t.MercatorCoordinate(h, p)), s.getTilePoint(new t.MercatorCoordinate(d, _))];\n\n if (g[0].x - m < t.EXTENT && g[0].y - m < t.EXTENT && g[1].x + m >= 0 && g[1].y + m >= 0) {\n var v = l.map(function (t) {\n return s.getTilePoint(t);\n }),\n y = c.map(function (t) {\n return s.getTilePoint(t);\n });\n a.push({\n tile: o,\n tileID: s,\n queryGeometry: v,\n cameraQueryGeometry: y,\n scale: f\n });\n }\n }\n }, y = 0; y < u.length; y++) {\n v(y);\n }\n\n return a;\n }, i.prototype.getVisibleCoordinates = function (t) {\n for (var e = this, i = this.getRenderableIds(t).map(function (t) {\n return e._tiles[t].tileID;\n }), o = 0, r = i; o < r.length; o += 1) {\n var a = r[o];\n a.posMatrix = this.transform.calculatePosMatrix(a.toUnwrapped());\n }\n\n return i;\n }, i.prototype.hasTransition = function () {\n if (this._source.hasTransition()) return !0;\n if (Mt(this._source.type)) for (var e in this._tiles) {\n var i = this._tiles[e];\n if (void 0 !== i.fadeEndTime && i.fadeEndTime >= t.browser.now()) return !0;\n }\n return !1;\n }, i.prototype.setFeatureState = function (t, e, i) {\n this._state.updateState(t = t || "_geojsonTileLayer", e, i);\n }, i.prototype.removeFeatureState = function (t, e, i) {\n this._state.removeFeatureState(t = t || "_geojsonTileLayer", e, i);\n }, i.prototype.getFeatureState = function (t, e) {\n return this._state.getState(t = t || "_geojsonTileLayer", e);\n }, i.prototype.setDependencies = function (t, e, i) {\n var o = this._tiles[t];\n o && o.setDependencies(e, i);\n }, i.prototype.reloadTilesForDependencies = function (t, e) {\n for (var i in this._tiles) {\n this._tiles[i].hasDependency(t, e) && this._reloadTile(i, "reloading");\n }\n\n this._cache.filter(function (i) {\n return !i.hasDependency(t, e);\n });\n }, i;\n }(t.Evented);\n\n function At(t, e) {\n var i = Math.abs(2 * t.wrap) - +(t.wrap < 0),\n o = Math.abs(2 * e.wrap) - +(e.wrap < 0);\n return t.overscaledZ - e.overscaledZ || o - i || e.canonical.y - t.canonical.y || e.canonical.x - t.canonical.x;\n }\n\n function Mt(t) {\n return "raster" === t || "image" === t || "video" === t;\n }\n\n function Lt() {\n return new t.window.Worker(Kr.workerUrl);\n }\n\n Dt.maxOverzooming = 10, Dt.maxUnderzooming = 3;\n\n var Rt = "mapboxgl_preloaded_worker_pool",\n kt = function kt() {\n this.active = {};\n };\n\n kt.prototype.acquire = function (t) {\n if (!this.workers) for (this.workers = []; this.workers.length < kt.workerCount;) {\n this.workers.push(new Lt());\n }\n return this.active[t] = !0, this.workers.slice();\n }, kt.prototype.release = function (t) {\n delete this.active[t], 0 === this.numActive() && (this.workers.forEach(function (t) {\n t.terminate();\n }), this.workers = null);\n }, kt.prototype.isPreloaded = function () {\n return !!this.active[Rt];\n }, kt.prototype.numActive = function () {\n return Object.keys(this.active).length;\n };\n var Bt,\n Ot = Math.floor(t.browser.hardwareConcurrency / 2);\n\n function Ft() {\n return Bt || (Bt = new kt()), Bt;\n }\n\n function Ut(e, i) {\n var o = {};\n\n for (var r in e) {\n "ref" !== r && (o[r] = e[r]);\n }\n\n return t.refProperties.forEach(function (t) {\n t in i && (o[t] = i[t]);\n }), o;\n }\n\n function Nt(t) {\n t = t.slice();\n\n for (var e = Object.create(null), i = 0; i < t.length; i++) {\n e[t[i].id] = t[i];\n }\n\n for (var o = 0; o < t.length; o++) {\n "ref" in t[o] && (t[o] = Ut(t[o], e[t[o].ref]));\n }\n\n return t;\n }\n\n kt.workerCount = Math.max(Math.min(Ot, 6), 1);\n var Zt = {\n setStyle: "setStyle",\n addLayer: "addLayer",\n removeLayer: "removeLayer",\n setPaintProperty: "setPaintProperty",\n setLayoutProperty: "setLayoutProperty",\n setFilter: "setFilter",\n addSource: "addSource",\n removeSource: "removeSource",\n setGeoJSONSourceData: "setGeoJSONSourceData",\n setLayerZoomRange: "setLayerZoomRange",\n setLayerProperty: "setLayerProperty",\n setCenter: "setCenter",\n setZoom: "setZoom",\n setBearing: "setBearing",\n setPitch: "setPitch",\n setSprite: "setSprite",\n setGlyphs: "setGlyphs",\n setTransition: "setTransition",\n setLight: "setLight"\n };\n\n function qt(t, e, i) {\n i.push({\n command: Zt.addSource,\n args: [t, e[t]]\n });\n }\n\n function jt(t, e, i) {\n e.push({\n command: Zt.removeSource,\n args: [t]\n }), i[t] = !0;\n }\n\n function Vt(t, e, i, o) {\n jt(t, i, o), qt(t, e, i);\n }\n\n function Gt(e, i, o) {\n var r;\n\n for (r in e[o]) {\n if (e[o].hasOwnProperty(r) && "data" !== r && !t.deepEqual(e[o][r], i[o][r])) return !1;\n }\n\n for (r in i[o]) {\n if (i[o].hasOwnProperty(r) && "data" !== r && !t.deepEqual(e[o][r], i[o][r])) return !1;\n }\n\n return !0;\n }\n\n function Wt(e, i, o, r, a, n) {\n var s;\n\n for (s in i = i || {}, e = e || {}) {\n e.hasOwnProperty(s) && (t.deepEqual(e[s], i[s]) || o.push({\n command: n,\n args: [r, s, i[s], a]\n }));\n }\n\n for (s in i) {\n i.hasOwnProperty(s) && !e.hasOwnProperty(s) && (t.deepEqual(e[s], i[s]) || o.push({\n command: n,\n args: [r, s, i[s], a]\n }));\n }\n }\n\n function Xt(t) {\n return t.id;\n }\n\n function Ht(t, e) {\n return t[e.id] = e, t;\n }\n\n var Kt = function Kt(t, e) {\n this.reset(t, e);\n };\n\n Kt.prototype.reset = function (t, e) {\n this.points = t || [], this._distances = [0];\n\n for (var i = 1; i < this.points.length; i++) {\n this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]);\n }\n\n this.length = this._distances[this._distances.length - 1], this.padding = Math.min(e || 0, .5 * this.length), this.paddedLength = this.length - 2 * this.padding;\n }, Kt.prototype.lerp = function (e) {\n if (1 === this.points.length) return this.points[0];\n e = t.clamp(e, 0, 1);\n\n for (var i = 1, o = this._distances[i], r = e * this.paddedLength + this.padding; o < r && i < this._distances.length;) {\n o = this._distances[++i];\n }\n\n var a = i - 1,\n n = this._distances[a],\n s = o - n,\n l = s > 0 ? (r - n) / s : 0;\n return this.points[a].mult(1 - l).add(this.points[i].mult(l));\n };\n\n var Yt = function Yt(t, e, i) {\n var o = this.boxCells = [],\n r = this.circleCells = [];\n this.xCellCount = Math.ceil(t / i), this.yCellCount = Math.ceil(e / i);\n\n for (var a = 0; a < this.xCellCount * this.yCellCount; a++) {\n o.push([]), r.push([]);\n }\n\n this.circleKeys = [], this.boxKeys = [], this.bboxes = [], this.circles = [], this.width = t, this.height = e, this.xScale = this.xCellCount / t, this.yScale = this.yCellCount / e, this.boxUid = 0, this.circleUid = 0;\n };\n\n function Jt(e, i, o, r, a) {\n var n = t.create();\n return i ? (t.scale(n, n, [1 / a, 1 / a, 1]), o || t.rotateZ(n, n, r.angle)) : t.multiply(n, r.labelPlaneMatrix, e), n;\n }\n\n function Qt(e, i, o, r, a) {\n if (i) {\n var n = t.clone(e);\n return t.scale(n, n, [a, a, 1]), o || t.rotateZ(n, n, -r.angle), n;\n }\n\n return r.glCoordMatrix;\n }\n\n function $t(e, i) {\n var o = [e.x, e.y, 0, 1];\n ue(o, o, i);\n var r = o[3];\n return {\n point: new t.Point(o[0] / r, o[1] / r),\n signedDistanceFromCamera: r\n };\n }\n\n function te(t, e) {\n return .5 + t / e * .5;\n }\n\n function ee(t, e) {\n var i = t[0] / t[3],\n o = t[1] / t[3];\n return i >= -e[0] && i <= e[0] && o >= -e[1] && o <= e[1];\n }\n\n function ie(e, i, o, r, a, n, s, l) {\n var c = r ? e.textSizeData : e.iconSizeData,\n u = t.evaluateSizeForZoom(c, o.transform.zoom),\n h = [256 / o.width * 2 + 1, 256 / o.height * 2 + 1],\n p = r ? e.text.dynamicLayoutVertexArray : e.icon.dynamicLayoutVertexArray;\n p.clear();\n\n for (var d = e.lineVertexArray, _ = r ? e.text.placedSymbolArray : e.icon.placedSymbolArray, f = o.transform.width / o.transform.height, m = !1, g = 0; g < _.length; g++) {\n var v = _.get(g);\n\n if (v.hidden || v.writingMode === t.WritingMode.vertical && !m) ce(v.numGlyphs, p);else {\n m = !1;\n var y = [v.anchorX, v.anchorY, 0, 1];\n\n if (t.transformMat4(y, y, i), ee(y, h)) {\n var x = te(o.transform.cameraToCenterDistance, y[3]),\n b = t.evaluateSizeForFeature(c, u, v),\n w = s ? b / x : b * x,\n T = new t.Point(v.anchorX, v.anchorY),\n E = $t(T, a).point,\n I = {},\n P = ae(v, w, !1, l, i, a, n, e.glyphOffsetArray, d, p, E, T, I, f);\n m = P.useVertical, (P.notEnoughRoom || m || P.needsFlipping && ae(v, w, !0, l, i, a, n, e.glyphOffsetArray, d, p, E, T, I, f).notEnoughRoom) && ce(v.numGlyphs, p);\n } else ce(v.numGlyphs, p);\n }\n }\n\n r ? e.text.dynamicLayoutVertexBuffer.updateData(p) : e.icon.dynamicLayoutVertexBuffer.updateData(p);\n }\n\n function oe(t, e, i, o, r, a, n, s, l, c, u) {\n var h = s.glyphStartIndex + s.numGlyphs,\n p = s.lineStartIndex,\n d = s.lineStartIndex + s.lineLength,\n _ = e.getoffsetX(s.glyphStartIndex),\n f = e.getoffsetX(h - 1),\n m = se(t * _, i, o, r, a, n, s.segment, p, d, l, c, u);\n\n if (!m) return null;\n var g = se(t * f, i, o, r, a, n, s.segment, p, d, l, c, u);\n return g ? {\n first: m,\n last: g\n } : null;\n }\n\n function re(e, i, o, r) {\n return e === t.WritingMode.horizontal && Math.abs(o.y - i.y) > Math.abs(o.x - i.x) * r ? {\n useVertical: !0\n } : (e === t.WritingMode.vertical ? i.y < o.y : i.x > o.x) ? {\n needsFlipping: !0\n } : null;\n }\n\n function ae(e, i, o, r, a, n, s, l, c, u, h, p, d, _) {\n var f,\n m = i / 24,\n g = e.lineOffsetX * m,\n v = e.lineOffsetY * m;\n\n if (e.numGlyphs > 1) {\n var y = e.glyphStartIndex + e.numGlyphs,\n x = e.lineStartIndex,\n b = e.lineStartIndex + e.lineLength,\n w = oe(m, l, g, v, o, h, p, e, c, n, d);\n if (!w) return {\n notEnoughRoom: !0\n };\n var T = $t(w.first.point, s).point,\n E = $t(w.last.point, s).point;\n\n if (r && !o) {\n var I = re(e.writingMode, T, E, _);\n if (I) return I;\n }\n\n f = [w.first];\n\n for (var P = e.glyphStartIndex + 1; P < y - 1; P++) {\n f.push(se(m * l.getoffsetX(P), g, v, o, h, p, e.segment, x, b, c, n, d));\n }\n\n f.push(w.last);\n } else {\n if (r && !o) {\n var S = $t(p, a).point,\n C = e.lineStartIndex + e.segment + 1,\n z = new t.Point(c.getx(C), c.gety(C)),\n D = $t(z, a),\n A = D.signedDistanceFromCamera > 0 ? D.point : ne(p, z, S, 1, a),\n M = re(e.writingMode, S, A, _);\n if (M) return M;\n }\n\n var L = se(m * l.getoffsetX(e.glyphStartIndex), g, v, o, h, p, e.segment, e.lineStartIndex, e.lineStartIndex + e.lineLength, c, n, d);\n if (!L) return {\n notEnoughRoom: !0\n };\n f = [L];\n }\n\n for (var R = 0, k = f; R < k.length; R += 1) {\n var B = k[R];\n t.addDynamicAttributes(u, B.point, B.angle);\n }\n\n return {};\n }\n\n function ne(t, e, i, o, r) {\n var a = $t(t.add(t.sub(e)._unit()), r).point,\n n = i.sub(a);\n return i.add(n._mult(o / n.mag()));\n }\n\n function se(e, i, o, r, a, n, s, l, c, u, h, p) {\n var d = r ? e - i : e + i,\n _ = d > 0 ? 1 : -1,\n f = 0;\n\n r && (_ *= -1, f = Math.PI), _ < 0 && (f += Math.PI);\n\n for (var m = _ > 0 ? l + s : l + s + 1, g = a, v = a, y = 0, x = 0, b = Math.abs(d), w = []; y + x <= b;) {\n if ((m += _) < l || m >= c) return null;\n\n if (v = g, w.push(g), void 0 === (g = p[m])) {\n var T = new t.Point(u.getx(m), u.gety(m)),\n E = $t(T, h);\n if (E.signedDistanceFromCamera > 0) g = p[m] = E.point;else {\n var I = m - _;\n g = ne(0 === y ? n : new t.Point(u.getx(I), u.gety(I)), T, v, b - y + 1, h);\n }\n }\n\n y += x, x = v.dist(g);\n }\n\n var P = (b - y) / x,\n S = g.sub(v),\n C = S.mult(P)._add(v);\n\n C._add(S._unit()._perp()._mult(o * _));\n\n var z = f + Math.atan2(g.y - v.y, g.x - v.x);\n return w.push(C), {\n point: C,\n angle: z,\n path: w\n };\n }\n\n Yt.prototype.keysLength = function () {\n return this.boxKeys.length + this.circleKeys.length;\n }, Yt.prototype.insert = function (t, e, i, o, r) {\n this._forEachCell(e, i, o, r, this._insertBoxCell, this.boxUid++), this.boxKeys.push(t), this.bboxes.push(e), this.bboxes.push(i), this.bboxes.push(o), this.bboxes.push(r);\n }, Yt.prototype.insertCircle = function (t, e, i, o) {\n this._forEachCell(e - o, i - o, e + o, i + o, this._insertCircleCell, this.circleUid++), this.circleKeys.push(t), this.circles.push(e), this.circles.push(i), this.circles.push(o);\n }, Yt.prototype._insertBoxCell = function (t, e, i, o, r, a) {\n this.boxCells[r].push(a);\n }, Yt.prototype._insertCircleCell = function (t, e, i, o, r, a) {\n this.circleCells[r].push(a);\n }, Yt.prototype._query = function (t, e, i, o, r, a) {\n if (i < 0 || t > this.width || o < 0 || e > this.height) return !r && [];\n var n = [];\n\n if (t <= 0 && e <= 0 && this.width <= i && this.height <= o) {\n if (r) return !0;\n\n for (var s = 0; s < this.boxKeys.length; s++) {\n n.push({\n key: this.boxKeys[s],\n x1: this.bboxes[4 * s],\n y1: this.bboxes[4 * s + 1],\n x2: this.bboxes[4 * s + 2],\n y2: this.bboxes[4 * s + 3]\n });\n }\n\n for (var l = 0; l < this.circleKeys.length; l++) {\n var c = this.circles[3 * l],\n u = this.circles[3 * l + 1],\n h = this.circles[3 * l + 2];\n n.push({\n key: this.circleKeys[l],\n x1: c - h,\n y1: u - h,\n x2: c + h,\n y2: u + h\n });\n }\n\n return a ? n.filter(a) : n;\n }\n\n return this._forEachCell(t, e, i, o, this._queryCell, n, {\n hitTest: r,\n seenUids: {\n box: {},\n circle: {}\n }\n }, a), r ? n.length > 0 : n;\n }, Yt.prototype._queryCircle = function (t, e, i, o, r) {\n var a = t - i,\n n = t + i,\n s = e - i,\n l = e + i;\n if (n < 0 || a > this.width || l < 0 || s > this.height) return !o && [];\n var c = [];\n return this._forEachCell(a, s, n, l, this._queryCellCircle, c, {\n hitTest: o,\n circle: {\n x: t,\n y: e,\n radius: i\n },\n seenUids: {\n box: {},\n circle: {}\n }\n }, r), o ? c.length > 0 : c;\n }, Yt.prototype.query = function (t, e, i, o, r) {\n return this._query(t, e, i, o, !1, r);\n }, Yt.prototype.hitTest = function (t, e, i, o, r) {\n return this._query(t, e, i, o, !0, r);\n }, Yt.prototype.hitTestCircle = function (t, e, i, o) {\n return this._queryCircle(t, e, i, !0, o);\n }, Yt.prototype._queryCell = function (t, e, i, o, r, a, n, s) {\n var l = n.seenUids,\n c = this.boxCells[r];\n if (null !== c) for (var u = this.bboxes, h = 0, p = c; h < p.length; h += 1) {\n var d = p[h];\n\n if (!l.box[d]) {\n l.box[d] = !0;\n\n var _ = 4 * d;\n\n if (t <= u[_ + 2] && e <= u[_ + 3] && i >= u[_ + 0] && o >= u[_ + 1] && (!s || s(this.boxKeys[d]))) {\n if (n.hitTest) return a.push(!0), !0;\n a.push({\n key: this.boxKeys[d],\n x1: u[_],\n y1: u[_ + 1],\n x2: u[_ + 2],\n y2: u[_ + 3]\n });\n }\n }\n }\n var f = this.circleCells[r];\n if (null !== f) for (var m = this.circles, g = 0, v = f; g < v.length; g += 1) {\n var y = v[g];\n\n if (!l.circle[y]) {\n l.circle[y] = !0;\n var x = 3 * y;\n\n if (this._circleAndRectCollide(m[x], m[x + 1], m[x + 2], t, e, i, o) && (!s || s(this.circleKeys[y]))) {\n if (n.hitTest) return a.push(!0), !0;\n var b = m[x],\n w = m[x + 1],\n T = m[x + 2];\n a.push({\n key: this.circleKeys[y],\n x1: b - T,\n y1: w - T,\n x2: b + T,\n y2: w + T\n });\n }\n }\n }\n }, Yt.prototype._queryCellCircle = function (t, e, i, o, r, a, n, s) {\n var l = n.circle,\n c = n.seenUids,\n u = this.boxCells[r];\n if (null !== u) for (var h = this.bboxes, p = 0, d = u; p < d.length; p += 1) {\n var _ = d[p];\n\n if (!c.box[_]) {\n c.box[_] = !0;\n var f = 4 * _;\n if (this._circleAndRectCollide(l.x, l.y, l.radius, h[f + 0], h[f + 1], h[f + 2], h[f + 3]) && (!s || s(this.boxKeys[_]))) return a.push(!0), !0;\n }\n }\n var m = this.circleCells[r];\n if (null !== m) for (var g = this.circles, v = 0, y = m; v < y.length; v += 1) {\n var x = y[v];\n\n if (!c.circle[x]) {\n c.circle[x] = !0;\n var b = 3 * x;\n if (this._circlesCollide(g[b], g[b + 1], g[b + 2], l.x, l.y, l.radius) && (!s || s(this.circleKeys[x]))) return a.push(!0), !0;\n }\n }\n }, Yt.prototype._forEachCell = function (t, e, i, o, r, a, n, s) {\n for (var l = this._convertToXCellCoord(t), c = this._convertToYCellCoord(e), u = this._convertToXCellCoord(i), h = this._convertToYCellCoord(o), p = l; p <= u; p++) {\n for (var d = c; d <= h; d++) {\n if (r.call(this, t, e, i, o, this.xCellCount * d + p, a, n, s)) return;\n }\n }\n }, Yt.prototype._convertToXCellCoord = function (t) {\n return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(t * this.xScale)));\n }, Yt.prototype._convertToYCellCoord = function (t) {\n return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(t * this.yScale)));\n }, Yt.prototype._circlesCollide = function (t, e, i, o, r, a) {\n var n = o - t,\n s = r - e,\n l = i + a;\n return l * l > n * n + s * s;\n }, Yt.prototype._circleAndRectCollide = function (t, e, i, o, r, a, n) {\n var s = (a - o) / 2,\n l = Math.abs(t - (o + s));\n if (l > s + i) return !1;\n var c = (n - r) / 2,\n u = Math.abs(e - (r + c));\n if (u > c + i) return !1;\n if (l <= s || u <= c) return !0;\n var h = l - s,\n p = u - c;\n return h * h + p * p <= i * i;\n };\n var le = new Float32Array([-1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0, -1 / 0, -1 / 0, 0]);\n\n function ce(t, e) {\n for (var i = 0; i < t; i++) {\n var o = e.length;\n e.resize(o + 4), e.float32.set(le, 3 * o);\n }\n }\n\n function ue(t, e, i) {\n var o = e[0],\n r = e[1];\n return t[0] = i[0] * o + i[4] * r + i[12], t[1] = i[1] * o + i[5] * r + i[13], t[3] = i[3] * o + i[7] * r + i[15], t;\n }\n\n var he = function he(t, e, i) {\n void 0 === e && (e = new Yt(t.width + 200, t.height + 200, 25)), void 0 === i && (i = new Yt(t.width + 200, t.height + 200, 25)), this.transform = t, this.grid = e, this.ignoredGrid = i, this.pitchfactor = Math.cos(t._pitch) * t.cameraToCenterDistance, this.screenRightBoundary = t.width + 100, this.screenBottomBoundary = t.height + 100, this.gridRightBoundary = t.width + 200, this.gridBottomBoundary = t.height + 200;\n };\n\n function pe(e, i, o) {\n return i * (t.EXTENT / (e.tileSize * Math.pow(2, o - e.tileID.overscaledZ)));\n }\n\n he.prototype.placeCollisionBox = function (t, e, i, o, r) {\n var a = this.projectAndGetPerspectiveRatio(o, t.anchorPointX, t.anchorPointY),\n n = i * a.perspectiveRatio,\n s = t.x1 * n + a.point.x,\n l = t.y1 * n + a.point.y,\n c = t.x2 * n + a.point.x,\n u = t.y2 * n + a.point.y;\n return !this.isInsideGrid(s, l, c, u) || !e && this.grid.hitTest(s, l, c, u, r) ? {\n box: [],\n offscreen: !1\n } : {\n box: [s, l, c, u],\n offscreen: this.isOffscreen(s, l, c, u)\n };\n }, he.prototype.placeCollisionCircles = function (e, i, o, r, a, n, s, l, c, u, h, p, d) {\n var _ = [],\n f = new t.Point(i.anchorX, i.anchorY),\n m = $t(f, n),\n g = te(this.transform.cameraToCenterDistance, m.signedDistanceFromCamera),\n v = (u ? a / g : a * g) / t.ONE_EM,\n y = $t(f, s).point,\n x = oe(v, r, i.lineOffsetX * v, i.lineOffsetY * v, !1, y, f, i, o, s, {}),\n b = !1,\n w = !1,\n T = !0;\n\n if (x) {\n for (var E = .5 * p * g + d, I = new t.Point(-100, -100), P = new t.Point(this.screenRightBoundary, this.screenBottomBoundary), S = new Kt(), C = x.first, z = x.last, D = [], A = C.path.length - 1; A >= 1; A--) {\n D.push(C.path[A]);\n }\n\n for (var M = 1; M < z.path.length; M++) {\n D.push(z.path[M]);\n }\n\n var L = 2.5 * E;\n\n if (l) {\n var R = D.map(function (t) {\n return $t(t, l);\n });\n D = R.some(function (t) {\n return t.signedDistanceFromCamera <= 0;\n }) ? [] : R.map(function (t) {\n return t.point;\n });\n }\n\n var k = [];\n\n if (D.length > 0) {\n for (var B = D[0].clone(), O = D[0].clone(), F = 1; F < D.length; F++) {\n B.x = Math.min(B.x, D[F].x), B.y = Math.min(B.y, D[F].y), O.x = Math.max(O.x, D[F].x), O.y = Math.max(O.y, D[F].y);\n }\n\n k = B.x >= I.x && O.x <= P.x && B.y >= I.y && O.y <= P.y ? [D] : O.x < I.x || B.x > P.x || O.y < I.y || B.y > P.y ? [] : t.clipLine([D], I.x, I.y, P.x, P.y);\n }\n\n for (var U = 0, N = k; U < N.length; U += 1) {\n var Z;\n S.reset(N[U], .25 * E), Z = S.length <= .5 * E ? 1 : Math.ceil(S.paddedLength / L) + 1;\n\n for (var q = 0; q < Z; q++) {\n var j = q / Math.max(Z - 1, 1),\n V = S.lerp(j),\n G = V.x + 100,\n W = V.y + 100;\n\n _.push(G, W, E, 0);\n\n var X = G - E,\n H = W - E,\n K = G + E,\n Y = W + E;\n if (T = T && this.isOffscreen(X, H, K, Y), w = w || this.isInsideGrid(X, H, K, Y), !e && this.grid.hitTestCircle(G, W, E, h) && (b = !0, !c)) return {\n circles: [],\n offscreen: !1,\n collisionDetected: b\n };\n }\n }\n }\n\n return {\n circles: !c && b || !w ? [] : _,\n offscreen: T,\n collisionDetected: b\n };\n }, he.prototype.queryRenderedSymbols = function (e) {\n if (0 === e.length || 0 === this.grid.keysLength() && 0 === this.ignoredGrid.keysLength()) return {};\n\n for (var i = [], o = 1 / 0, r = 1 / 0, a = -1 / 0, n = -1 / 0, s = 0, l = e; s < l.length; s += 1) {\n var c = l[s],\n u = new t.Point(c.x + 100, c.y + 100);\n o = Math.min(o, u.x), r = Math.min(r, u.y), a = Math.max(a, u.x), n = Math.max(n, u.y), i.push(u);\n }\n\n for (var h = {}, p = {}, d = 0, _ = this.grid.query(o, r, a, n).concat(this.ignoredGrid.query(o, r, a, n)); d < _.length; d += 1) {\n var f = _[d],\n m = f.key;\n\n if (void 0 === h[m.bucketInstanceId] && (h[m.bucketInstanceId] = {}), !h[m.bucketInstanceId][m.featureIndex]) {\n var g = [new t.Point(f.x1, f.y1), new t.Point(f.x2, f.y1), new t.Point(f.x2, f.y2), new t.Point(f.x1, f.y2)];\n t.polygonIntersectsPolygon(i, g) && (h[m.bucketInstanceId][m.featureIndex] = !0, void 0 === p[m.bucketInstanceId] && (p[m.bucketInstanceId] = []), p[m.bucketInstanceId].push(m.featureIndex));\n }\n }\n\n return p;\n }, he.prototype.insertCollisionBox = function (t, e, i, o, r) {\n (e ? this.ignoredGrid : this.grid).insert({\n bucketInstanceId: i,\n featureIndex: o,\n collisionGroupID: r\n }, t[0], t[1], t[2], t[3]);\n }, he.prototype.insertCollisionCircles = function (t, e, i, o, r) {\n for (var a = e ? this.ignoredGrid : this.grid, n = {\n bucketInstanceId: i,\n featureIndex: o,\n collisionGroupID: r\n }, s = 0; s < t.length; s += 4) {\n a.insertCircle(n, t[s], t[s + 1], t[s + 2]);\n }\n }, he.prototype.projectAndGetPerspectiveRatio = function (e, i, o) {\n var r = [i, o, 0, 1];\n return ue(r, r, e), {\n point: new t.Point((r[0] / r[3] + 1) / 2 * this.transform.width + 100, (-r[1] / r[3] + 1) / 2 * this.transform.height + 100),\n perspectiveRatio: .5 + this.transform.cameraToCenterDistance / r[3] * .5\n };\n }, he.prototype.isOffscreen = function (t, e, i, o) {\n return i < 100 || t >= this.screenRightBoundary || o < 100 || e > this.screenBottomBoundary;\n }, he.prototype.isInsideGrid = function (t, e, i, o) {\n return i >= 0 && t < this.gridRightBoundary && o >= 0 && e < this.gridBottomBoundary;\n }, he.prototype.getViewportMatrix = function () {\n var e = t.identity([]);\n return t.translate(e, e, [-100, -100, 0]), e;\n };\n\n var de = function de(t, e, i, o) {\n this.opacity = t ? Math.max(0, Math.min(1, t.opacity + (t.placed ? e : -e))) : o && i ? 1 : 0, this.placed = i;\n };\n\n de.prototype.isHidden = function () {\n return 0 === this.opacity && !this.placed;\n };\n\n var _e = function _e(t, e, i, o, r) {\n this.text = new de(t ? t.text : null, e, i, r), this.icon = new de(t ? t.icon : null, e, o, r);\n };\n\n _e.prototype.isHidden = function () {\n return this.text.isHidden() && this.icon.isHidden();\n };\n\n var fe = function fe(t, e, i) {\n this.text = t, this.icon = e, this.skipFade = i;\n },\n me = function me() {\n this.invProjMatrix = t.create(), this.viewportMatrix = t.create(), this.circles = [];\n },\n ge = function ge(t, e, i, o, r) {\n this.bucketInstanceId = t, this.featureIndex = e, this.sourceLayerIndex = i, this.bucketIndex = o, this.tileID = r;\n },\n ve = function ve(t) {\n this.crossSourceCollisions = t, this.maxGroupID = 0, this.collisionGroups = {};\n };\n\n function ye(e, i, o, r, a) {\n var n = t.getAnchorAlignment(e),\n s = -(n.horizontalAlign - .5) * i,\n l = -(n.verticalAlign - .5) * o,\n c = t.evaluateVariableOffset(e, r);\n return new t.Point(s + c[0] * a, l + c[1] * a);\n }\n\n function xe(e, i, o, r, a, n) {\n var s = e.x1,\n l = e.x2,\n c = e.y1,\n u = e.y2,\n h = e.anchorPointX,\n p = e.anchorPointY,\n d = new t.Point(i, o);\n return r && d._rotate(a ? n : -n), {\n x1: s + d.x,\n y1: c + d.y,\n x2: l + d.x,\n y2: u + d.y,\n anchorPointX: h,\n anchorPointY: p\n };\n }\n\n ve.prototype.get = function (t) {\n if (this.crossSourceCollisions) return {\n ID: 0,\n predicate: null\n };\n\n if (!this.collisionGroups[t]) {\n var e = ++this.maxGroupID;\n this.collisionGroups[t] = {\n ID: e,\n predicate: function predicate(t) {\n return t.collisionGroupID === e;\n }\n };\n }\n\n return this.collisionGroups[t];\n };\n\n var be = function be(t, e, i, o) {\n this.transform = t.clone(), this.collisionIndex = new he(this.transform), this.placements = {}, this.opacities = {}, this.variableOffsets = {}, this.stale = !1, this.commitTime = 0, this.fadeDuration = e, this.retainedQueryData = {}, this.collisionGroups = new ve(i), this.collisionCircleArrays = {}, this.prevPlacement = o, o && (o.prevPlacement = void 0), this.placedOrientations = {};\n };\n\n function we(t, e, i, o, r) {\n t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0), t.emplaceBack(e ? 1 : 0, i ? 1 : 0, o || 0, r || 0);\n }\n\n be.prototype.getBucketParts = function (e, i, o, r) {\n var a = o.getBucket(i),\n n = o.latestFeatureIndex;\n\n if (a && n && i.id === a.layerIds[0]) {\n var s = o.collisionBoxArray,\n l = a.layers[0].layout,\n c = Math.pow(2, this.transform.zoom - o.tileID.overscaledZ),\n u = o.tileSize / t.EXTENT,\n h = this.transform.calculatePosMatrix(o.tileID.toUnwrapped()),\n p = "map" === l.get("text-pitch-alignment"),\n d = "map" === l.get("text-rotation-alignment"),\n _ = pe(o, 1, this.transform.zoom),\n f = Jt(h, p, d, this.transform, _),\n m = null;\n\n if (p) {\n var g = Qt(h, p, d, this.transform, _);\n m = t.multiply([], this.transform.labelPlaneMatrix, g);\n }\n\n this.retainedQueryData[a.bucketInstanceId] = new ge(a.bucketInstanceId, n, a.sourceLayerIndex, a.index, o.tileID);\n var v = {\n bucket: a,\n layout: l,\n posMatrix: h,\n textLabelPlaneMatrix: f,\n labelToScreenMatrix: m,\n scale: c,\n textPixelRatio: u,\n holdingForFade: o.holdingForFade(),\n collisionBoxArray: s,\n partiallyEvaluatedTextSize: t.evaluateSizeForZoom(a.textSizeData, this.transform.zoom),\n collisionGroup: this.collisionGroups.get(a.sourceID)\n };\n if (r) for (var y = 0, x = a.sortKeyRanges; y < x.length; y += 1) {\n var b = x[y];\n e.push({\n sortKey: b.sortKey,\n symbolInstanceStart: b.symbolInstanceStart,\n symbolInstanceEnd: b.symbolInstanceEnd,\n parameters: v\n });\n } else e.push({\n symbolInstanceStart: 0,\n symbolInstanceEnd: a.symbolInstances.length,\n parameters: v\n });\n }\n }, be.prototype.attemptAnchorPlacement = function (t, e, i, o, r, a, n, s, l, c, u, h, p, d, _) {\n var f,\n m = [h.textOffset0, h.textOffset1],\n g = ye(t, i, o, m, r),\n v = this.collisionIndex.placeCollisionBox(xe(e, g.x, g.y, a, n, this.transform.angle), u, s, l, c.predicate);\n if (!_ || 0 !== this.collisionIndex.placeCollisionBox(xe(_, g.x, g.y, a, n, this.transform.angle), u, s, l, c.predicate).box.length) return v.box.length > 0 ? (this.prevPlacement && this.prevPlacement.variableOffsets[h.crossTileID] && this.prevPlacement.placements[h.crossTileID] && this.prevPlacement.placements[h.crossTileID].text && (f = this.prevPlacement.variableOffsets[h.crossTileID].anchor), this.variableOffsets[h.crossTileID] = {\n textOffset: m,\n width: i,\n height: o,\n anchor: t,\n textBoxScale: r,\n prevAnchor: f\n }, this.markUsedJustification(p, t, h, d), p.allowVerticalPlacement && (this.markUsedOrientation(p, d, h), this.placedOrientations[h.crossTileID] = d), {\n shift: g,\n placedGlyphBoxes: v\n }) : void 0;\n }, be.prototype.placeLayerBucketPart = function (e, i, o) {\n var r = this,\n a = e.parameters,\n n = a.bucket,\n s = a.layout,\n l = a.posMatrix,\n c = a.textLabelPlaneMatrix,\n u = a.labelToScreenMatrix,\n h = a.textPixelRatio,\n p = a.holdingForFade,\n d = a.collisionBoxArray,\n _ = a.partiallyEvaluatedTextSize,\n f = a.collisionGroup,\n m = s.get("text-optional"),\n g = s.get("icon-optional"),\n v = s.get("text-allow-overlap"),\n y = s.get("icon-allow-overlap"),\n x = "map" === s.get("text-rotation-alignment"),\n b = "map" === s.get("text-pitch-alignment"),\n w = "none" !== s.get("icon-text-fit"),\n T = "viewport-y" === s.get("symbol-z-order"),\n E = v && (y || !n.hasIconData() || g),\n I = y && (v || !n.hasTextData() || m);\n !n.collisionArrays && d && n.deserializeCollisionBoxes(d);\n\n var P = function P(e, a) {\n if (!i[e.crossTileID]) if (p) r.placements[e.crossTileID] = new fe(!1, !1, !1);else {\n var d,\n T = !1,\n P = !1,\n S = !0,\n C = null,\n z = {\n box: null,\n offscreen: null\n },\n D = {\n box: null,\n offscreen: null\n },\n A = null,\n M = null,\n L = 0,\n R = 0,\n k = 0;\n a.textFeatureIndex ? L = a.textFeatureIndex : e.useRuntimeCollisionCircles && (L = e.featureIndex), a.verticalTextFeatureIndex && (R = a.verticalTextFeatureIndex);\n var B = a.textBox;\n\n if (B) {\n var O = function O(i) {\n var o = t.WritingMode.horizontal;\n\n if (n.allowVerticalPlacement && !i && r.prevPlacement) {\n var a = r.prevPlacement.placedOrientations[e.crossTileID];\n a && (r.placedOrientations[e.crossTileID] = a, r.markUsedOrientation(n, o = a, e));\n }\n\n return o;\n },\n F = function F(i, o) {\n if (n.allowVerticalPlacement && e.numVerticalGlyphVertices > 0 && a.verticalTextBox) for (var r = 0, s = n.writingModes; r < s.length && (s[r] === t.WritingMode.vertical ? (z = o(), D = z) : z = i(), !(z && z.box && z.box.length)); r += 1) {\n ;\n } else z = i();\n };\n\n if (s.get("text-variable-anchor")) {\n var U = s.get("text-variable-anchor");\n\n if (r.prevPlacement && r.prevPlacement.variableOffsets[e.crossTileID]) {\n var N = r.prevPlacement.variableOffsets[e.crossTileID];\n U.indexOf(N.anchor) > 0 && (U = U.filter(function (t) {\n return t !== N.anchor;\n })).unshift(N.anchor);\n }\n\n var Z = function Z(t, i, o) {\n for (var a = t.x2 - t.x1, s = t.y2 - t.y1, c = e.textBoxScale, u = w && !y ? i : null, p = {\n box: [],\n offscreen: !1\n }, d = v ? 2 * U.length : U.length, _ = 0; _ < d; ++_) {\n var m = r.attemptAnchorPlacement(U[_ % U.length], t, a, s, c, x, b, h, l, f, _ >= U.length, e, n, o, u);\n\n if (m && (p = m.placedGlyphBoxes) && p.box && p.box.length) {\n T = !0, C = m.shift;\n break;\n }\n }\n\n return p;\n };\n\n F(function () {\n return Z(B, a.iconBox, t.WritingMode.horizontal);\n }, function () {\n var i = a.verticalTextBox;\n return n.allowVerticalPlacement && !(z && z.box && z.box.length) && e.numVerticalGlyphVertices > 0 && i ? Z(i, a.verticalIconBox, t.WritingMode.vertical) : {\n box: null,\n offscreen: null\n };\n }), z && (T = z.box, S = z.offscreen);\n var q = O(z && z.box);\n\n if (!T && r.prevPlacement) {\n var j = r.prevPlacement.variableOffsets[e.crossTileID];\n j && (r.variableOffsets[e.crossTileID] = j, r.markUsedJustification(n, j.anchor, e, q));\n }\n } else {\n var V = function V(t, i) {\n var o = r.collisionIndex.placeCollisionBox(t, v, h, l, f.predicate);\n return o && o.box && o.box.length && (r.markUsedOrientation(n, i, e), r.placedOrientations[e.crossTileID] = i), o;\n };\n\n F(function () {\n return V(B, t.WritingMode.horizontal);\n }, function () {\n var i = a.verticalTextBox;\n return n.allowVerticalPlacement && e.numVerticalGlyphVertices > 0 && i ? V(i, t.WritingMode.vertical) : {\n box: null,\n offscreen: null\n };\n }), O(z && z.box && z.box.length);\n }\n }\n\n if (T = (d = z) && d.box && d.box.length > 0, S = d && d.offscreen, e.useRuntimeCollisionCircles) {\n var G = n.text.placedSymbolArray.get(e.centerJustifiedTextSymbolIndex),\n W = t.evaluateSizeForFeature(n.textSizeData, _, G),\n X = s.get("text-padding");\n A = r.collisionIndex.placeCollisionCircles(v, G, n.lineVertexArray, n.glyphOffsetArray, W, l, c, u, o, b, f.predicate, e.collisionCircleDiameter, X), T = v || A.circles.length > 0 && !A.collisionDetected, S = S && A.offscreen;\n }\n\n if (a.iconFeatureIndex && (k = a.iconFeatureIndex), a.iconBox) {\n var H = function H(t) {\n var e = w && C ? xe(t, C.x, C.y, x, b, r.transform.angle) : t;\n return r.collisionIndex.placeCollisionBox(e, y, h, l, f.predicate);\n };\n\n P = D && D.box && D.box.length && a.verticalIconBox ? (M = H(a.verticalIconBox)).box.length > 0 : (M = H(a.iconBox)).box.length > 0, S = S && M.offscreen;\n }\n\n var K = m || 0 === e.numHorizontalGlyphVertices && 0 === e.numVerticalGlyphVertices,\n Y = g || 0 === e.numIconVertices;\n\n if (K || Y ? Y ? K || (P = P && T) : T = P && T : P = T = P && T, T && d && d.box && r.collisionIndex.insertCollisionBox(d.box, s.get("text-ignore-placement"), n.bucketInstanceId, D && D.box && R ? R : L, f.ID), P && M && r.collisionIndex.insertCollisionBox(M.box, s.get("icon-ignore-placement"), n.bucketInstanceId, k, f.ID), A && (T && r.collisionIndex.insertCollisionCircles(A.circles, s.get("text-ignore-placement"), n.bucketInstanceId, L, f.ID), o)) {\n var J = n.bucketInstanceId,\n Q = r.collisionCircleArrays[J];\n void 0 === Q && (Q = r.collisionCircleArrays[J] = new me());\n\n for (var $ = 0; $ < A.circles.length; $ += 4) {\n Q.circles.push(A.circles[$ + 0]), Q.circles.push(A.circles[$ + 1]), Q.circles.push(A.circles[$ + 2]), Q.circles.push(A.collisionDetected ? 1 : 0);\n }\n }\n\n r.placements[e.crossTileID] = new fe(T || E, P || I, S || n.justReloaded), i[e.crossTileID] = !0;\n }\n };\n\n if (T) for (var S = n.getSortedSymbolIndexes(this.transform.angle), C = S.length - 1; C >= 0; --C) {\n var z = S[C];\n P(n.symbolInstances.get(z), n.collisionArrays[z]);\n } else for (var D = e.symbolInstanceStart; D < e.symbolInstanceEnd; D++) {\n P(n.symbolInstances.get(D), n.collisionArrays[D]);\n }\n\n if (o && n.bucketInstanceId in this.collisionCircleArrays) {\n var A = this.collisionCircleArrays[n.bucketInstanceId];\n t.invert(A.invProjMatrix, l), A.viewportMatrix = this.collisionIndex.getViewportMatrix();\n }\n\n n.justReloaded = !1;\n }, be.prototype.markUsedJustification = function (e, i, o, r) {\n var a;\n a = r === t.WritingMode.vertical ? o.verticalPlacedTextSymbolIndex : {\n left: o.leftJustifiedTextSymbolIndex,\n center: o.centerJustifiedTextSymbolIndex,\n right: o.rightJustifiedTextSymbolIndex\n }[t.getAnchorJustification(i)];\n\n for (var n = 0, s = [o.leftJustifiedTextSymbolIndex, o.centerJustifiedTextSymbolIndex, o.rightJustifiedTextSymbolIndex, o.verticalPlacedTextSymbolIndex]; n < s.length; n += 1) {\n var l = s[n];\n l >= 0 && (e.text.placedSymbolArray.get(l).crossTileID = a >= 0 && l !== a ? 0 : o.crossTileID);\n }\n }, be.prototype.markUsedOrientation = function (e, i, o) {\n for (var r = i === t.WritingMode.horizontal || i === t.WritingMode.horizontalOnly ? i : 0, a = i === t.WritingMode.vertical ? i : 0, n = 0, s = [o.leftJustifiedTextSymbolIndex, o.centerJustifiedTextSymbolIndex, o.rightJustifiedTextSymbolIndex]; n < s.length; n += 1) {\n e.text.placedSymbolArray.get(s[n]).placedOrientation = r;\n }\n\n o.verticalPlacedTextSymbolIndex && (e.text.placedSymbolArray.get(o.verticalPlacedTextSymbolIndex).placedOrientation = a);\n }, be.prototype.commit = function (t) {\n this.commitTime = t, this.zoomAtLastRecencyCheck = this.transform.zoom;\n var e = this.prevPlacement,\n i = !1;\n this.prevZoomAdjustment = e ? e.zoomAdjustment(this.transform.zoom) : 0;\n var o = e ? e.symbolFadeChange(t) : 1,\n r = e ? e.opacities : {},\n a = e ? e.variableOffsets : {},\n n = e ? e.placedOrientations : {};\n\n for (var s in this.placements) {\n var l = this.placements[s],\n c = r[s];\n c ? (this.opacities[s] = new _e(c, o, l.text, l.icon), i = i || l.text !== c.text.placed || l.icon !== c.icon.placed) : (this.opacities[s] = new _e(null, o, l.text, l.icon, l.skipFade), i = i || l.text || l.icon);\n }\n\n for (var u in r) {\n var h = r[u];\n\n if (!this.opacities[u]) {\n var p = new _e(h, o, !1, !1);\n p.isHidden() || (this.opacities[u] = p, i = i || h.text.placed || h.icon.placed);\n }\n }\n\n for (var d in a) {\n this.variableOffsets[d] || !this.opacities[d] || this.opacities[d].isHidden() || (this.variableOffsets[d] = a[d]);\n }\n\n for (var _ in n) {\n this.placedOrientations[_] || !this.opacities[_] || this.opacities[_].isHidden() || (this.placedOrientations[_] = n[_]);\n }\n\n i ? this.lastPlacementChangeTime = t : "number" != typeof this.lastPlacementChangeTime && (this.lastPlacementChangeTime = e ? e.lastPlacementChangeTime : t);\n }, be.prototype.updateLayerOpacities = function (t, e) {\n for (var i = {}, o = 0, r = e; o < r.length; o += 1) {\n var a = r[o],\n n = a.getBucket(t);\n n && a.latestFeatureIndex && t.id === n.layerIds[0] && this.updateBucketOpacities(n, i, a.collisionBoxArray);\n }\n }, be.prototype.updateBucketOpacities = function (e, i, o) {\n var r = this;\n e.hasTextData() && e.text.opacityVertexArray.clear(), e.hasIconData() && e.icon.opacityVertexArray.clear(), e.hasIconCollisionBoxData() && e.iconCollisionBox.collisionVertexArray.clear(), e.hasTextCollisionBoxData() && e.textCollisionBox.collisionVertexArray.clear();\n var a = e.layers[0].layout,\n n = new _e(null, 0, !1, !1, !0),\n s = a.get("text-allow-overlap"),\n l = a.get("icon-allow-overlap"),\n c = a.get("text-variable-anchor"),\n u = "map" === a.get("text-rotation-alignment"),\n h = "map" === a.get("text-pitch-alignment"),\n p = "none" !== a.get("icon-text-fit"),\n d = new _e(null, 0, s && (l || !e.hasIconData() || a.get("icon-optional")), l && (s || !e.hasTextData() || a.get("text-optional")), !0);\n !e.collisionArrays && o && (e.hasIconCollisionBoxData() || e.hasTextCollisionBoxData()) && e.deserializeCollisionBoxes(o);\n\n for (var _ = function _(t, e, i) {\n for (var o = 0; o < e / 4; o++) {\n t.opacityVertexArray.emplaceBack(i);\n }\n }, f = function f(o) {\n var a = e.symbolInstances.get(o),\n s = a.numHorizontalGlyphVertices,\n l = a.numVerticalGlyphVertices,\n f = a.crossTileID,\n m = r.opacities[f];\n i[f] ? m = n : m || (r.opacities[f] = m = d), i[f] = !0;\n var g = a.numIconVertices > 0,\n v = r.placedOrientations[a.crossTileID],\n y = v === t.WritingMode.vertical,\n x = v === t.WritingMode.horizontal || v === t.WritingMode.horizontalOnly;\n\n if (s > 0 || l > 0) {\n var b = De(m.text);\n _(e.text, s, y ? Ae : b), _(e.text, l, x ? Ae : b);\n var w = m.text.isHidden();\n [a.rightJustifiedTextSymbolIndex, a.centerJustifiedTextSymbolIndex, a.leftJustifiedTextSymbolIndex].forEach(function (t) {\n t >= 0 && (e.text.placedSymbolArray.get(t).hidden = w || y ? 1 : 0);\n }), a.verticalPlacedTextSymbolIndex >= 0 && (e.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden = w || x ? 1 : 0);\n var T = r.variableOffsets[a.crossTileID];\n T && r.markUsedJustification(e, T.anchor, a, v);\n var E = r.placedOrientations[a.crossTileID];\n E && (r.markUsedJustification(e, "left", a, E), r.markUsedOrientation(e, E, a));\n }\n\n if (g) {\n var I = De(m.icon),\n P = !(p && a.verticalPlacedIconSymbolIndex && y);\n a.placedIconSymbolIndex >= 0 && (_(e.icon, a.numIconVertices, P ? I : Ae), e.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden = m.icon.isHidden()), a.verticalPlacedIconSymbolIndex >= 0 && (_(e.icon, a.numVerticalIconVertices, P ? Ae : I), e.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden = m.icon.isHidden());\n }\n\n if (e.hasIconCollisionBoxData() || e.hasTextCollisionBoxData()) {\n var S = e.collisionArrays[o];\n\n if (S) {\n var C = new t.Point(0, 0);\n\n if (S.textBox || S.verticalTextBox) {\n var z = !0;\n\n if (c) {\n var D = r.variableOffsets[f];\n D ? (C = ye(D.anchor, D.width, D.height, D.textOffset, D.textBoxScale), u && C._rotate(h ? r.transform.angle : -r.transform.angle)) : z = !1;\n }\n\n S.textBox && we(e.textCollisionBox.collisionVertexArray, m.text.placed, !z || y, C.x, C.y), S.verticalTextBox && we(e.textCollisionBox.collisionVertexArray, m.text.placed, !z || x, C.x, C.y);\n }\n\n var A = Boolean(!x && S.verticalIconBox);\n S.iconBox && we(e.iconCollisionBox.collisionVertexArray, m.icon.placed, A, p ? C.x : 0, p ? C.y : 0), S.verticalIconBox && we(e.iconCollisionBox.collisionVertexArray, m.icon.placed, !A, p ? C.x : 0, p ? C.y : 0);\n }\n }\n }, m = 0; m < e.symbolInstances.length; m++) {\n f(m);\n }\n\n if (e.sortFeatures(this.transform.angle), this.retainedQueryData[e.bucketInstanceId] && (this.retainedQueryData[e.bucketInstanceId].featureSortOrder = e.featureSortOrder), e.hasTextData() && e.text.opacityVertexBuffer && e.text.opacityVertexBuffer.updateData(e.text.opacityVertexArray), e.hasIconData() && e.icon.opacityVertexBuffer && e.icon.opacityVertexBuffer.updateData(e.icon.opacityVertexArray), e.hasIconCollisionBoxData() && e.iconCollisionBox.collisionVertexBuffer && e.iconCollisionBox.collisionVertexBuffer.updateData(e.iconCollisionBox.collisionVertexArray), e.hasTextCollisionBoxData() && e.textCollisionBox.collisionVertexBuffer && e.textCollisionBox.collisionVertexBuffer.updateData(e.textCollisionBox.collisionVertexArray), e.bucketInstanceId in this.collisionCircleArrays) {\n var g = this.collisionCircleArrays[e.bucketInstanceId];\n e.placementInvProjMatrix = g.invProjMatrix, e.placementViewportMatrix = g.viewportMatrix, e.collisionCircleArray = g.circles, delete this.collisionCircleArrays[e.bucketInstanceId];\n }\n }, be.prototype.symbolFadeChange = function (t) {\n return 0 === this.fadeDuration ? 1 : (t - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment;\n }, be.prototype.zoomAdjustment = function (t) {\n return Math.max(0, (this.transform.zoom - t) / 1.5);\n }, be.prototype.hasTransitions = function (t) {\n return this.stale || t - this.lastPlacementChangeTime < this.fadeDuration;\n }, be.prototype.stillRecent = function (t, e) {\n var i = this.zoomAtLastRecencyCheck === e ? 1 - this.zoomAdjustment(e) : 1;\n return this.zoomAtLastRecencyCheck = e, this.commitTime + this.fadeDuration * i > t;\n }, be.prototype.setStale = function () {\n this.stale = !0;\n };\n var Te = Math.pow(2, 25),\n Ee = Math.pow(2, 24),\n Ie = Math.pow(2, 17),\n Pe = Math.pow(2, 16),\n Se = Math.pow(2, 9),\n Ce = Math.pow(2, 8),\n ze = Math.pow(2, 1);\n\n function De(t) {\n if (0 === t.opacity && !t.placed) return 0;\n if (1 === t.opacity && t.placed) return 4294967295;\n var e = t.placed ? 1 : 0,\n i = Math.floor(127 * t.opacity);\n return i * Te + e * Ee + i * Ie + e * Pe + i * Se + e * Ce + i * ze + e;\n }\n\n var Ae = 0,\n Me = function Me(t) {\n this._sortAcrossTiles = "viewport-y" !== t.layout.get("symbol-z-order") && !t.layout.get("symbol-sort-key").isConstant(), this._currentTileIndex = 0, this._currentPartIndex = 0, this._seenCrossTileIDs = {}, this._bucketParts = [];\n };\n\n Me.prototype.continuePlacement = function (t, e, i, o, r) {\n for (var a = this._bucketParts; this._currentTileIndex < t.length;) {\n if (e.getBucketParts(a, o, t[this._currentTileIndex], this._sortAcrossTiles), this._currentTileIndex++, r()) return !0;\n }\n\n for (this._sortAcrossTiles && (this._sortAcrossTiles = !1, a.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n })); this._currentPartIndex < a.length;) {\n if (e.placeLayerBucketPart(a[this._currentPartIndex], this._seenCrossTileIDs, i), this._currentPartIndex++, r()) return !0;\n }\n\n return !1;\n };\n\n var Le = function Le(t, e, i, o, r, a, n) {\n this.placement = new be(t, r, a, n), this._currentPlacementIndex = e.length - 1, this._forceFullPlacement = i, this._showCollisionBoxes = o, this._done = !1;\n };\n\n Le.prototype.isDone = function () {\n return this._done;\n }, Le.prototype.continuePlacement = function (e, i, o) {\n for (var r = this, a = t.browser.now(), n = function n() {\n var e = t.browser.now() - a;\n return !r._forceFullPlacement && e > 2;\n }; this._currentPlacementIndex >= 0;) {\n var s = i[e[this._currentPlacementIndex]],\n l = this.placement.collisionIndex.transform.zoom;\n\n if ("symbol" === s.type && (!s.minzoom || s.minzoom <= l) && (!s.maxzoom || s.maxzoom > l)) {\n if (this._inProgressLayer || (this._inProgressLayer = new Me(s)), this._inProgressLayer.continuePlacement(o[s.source], this.placement, this._showCollisionBoxes, s, n)) return;\n delete this._inProgressLayer;\n }\n\n this._currentPlacementIndex--;\n }\n\n this._done = !0;\n }, Le.prototype.commit = function (t) {\n return this.placement.commit(t), this.placement;\n };\n\n var Re = 512 / t.EXTENT / 2,\n ke = function ke(t, e, i) {\n this.tileID = t, this.indexedSymbolInstances = {}, this.bucketInstanceId = i;\n\n for (var o = 0; o < e.length; o++) {\n var r = e.get(o),\n a = r.key;\n this.indexedSymbolInstances[a] || (this.indexedSymbolInstances[a] = []), this.indexedSymbolInstances[a].push({\n crossTileID: r.crossTileID,\n coord: this.getScaledCoordinates(r, t)\n });\n }\n };\n\n ke.prototype.getScaledCoordinates = function (e, i) {\n var o = Re / Math.pow(2, i.canonical.z - this.tileID.canonical.z);\n return {\n x: Math.floor((i.canonical.x * t.EXTENT + e.anchorX) * o),\n y: Math.floor((i.canonical.y * t.EXTENT + e.anchorY) * o)\n };\n }, ke.prototype.findMatches = function (t, e, i) {\n for (var o = this.tileID.canonical.z < e.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - e.canonical.z), r = 0; r < t.length; r++) {\n var a = t.get(r);\n\n if (!a.crossTileID) {\n var n = this.indexedSymbolInstances[a.key];\n if (n) for (var s = this.getScaledCoordinates(a, e), l = 0, c = n; l < c.length; l += 1) {\n var u = c[l];\n\n if (Math.abs(u.coord.x - s.x) <= o && Math.abs(u.coord.y - s.y) <= o && !i[u.crossTileID]) {\n i[u.crossTileID] = !0, a.crossTileID = u.crossTileID;\n break;\n }\n }\n }\n }\n };\n\n var Be = function Be() {\n this.maxCrossTileID = 0;\n };\n\n Be.prototype.generate = function () {\n return ++this.maxCrossTileID;\n };\n\n var Oe = function Oe() {\n this.indexes = {}, this.usedCrossTileIDs = {}, this.lng = 0;\n };\n\n Oe.prototype.handleWrapJump = function (t) {\n var e = Math.round((t - this.lng) / 360);\n if (0 !== e) for (var i in this.indexes) {\n var o = this.indexes[i],\n r = {};\n\n for (var a in o) {\n var n = o[a];\n n.tileID = n.tileID.unwrapTo(n.tileID.wrap + e), r[n.tileID.key] = n;\n }\n\n this.indexes[i] = r;\n }\n this.lng = t;\n }, Oe.prototype.addBucket = function (t, e, i) {\n if (this.indexes[t.overscaledZ] && this.indexes[t.overscaledZ][t.key]) {\n if (this.indexes[t.overscaledZ][t.key].bucketInstanceId === e.bucketInstanceId) return !1;\n this.removeBucketCrossTileIDs(t.overscaledZ, this.indexes[t.overscaledZ][t.key]);\n }\n\n for (var o = 0; o < e.symbolInstances.length; o++) {\n e.symbolInstances.get(o).crossTileID = 0;\n }\n\n this.usedCrossTileIDs[t.overscaledZ] || (this.usedCrossTileIDs[t.overscaledZ] = {});\n var r = this.usedCrossTileIDs[t.overscaledZ];\n\n for (var a in this.indexes) {\n var n = this.indexes[a];\n if (Number(a) > t.overscaledZ) for (var s in n) {\n var l = n[s];\n l.tileID.isChildOf(t) && l.findMatches(e.symbolInstances, t, r);\n } else {\n var c = n[t.scaledTo(Number(a)).key];\n c && c.findMatches(e.symbolInstances, t, r);\n }\n }\n\n for (var u = 0; u < e.symbolInstances.length; u++) {\n var h = e.symbolInstances.get(u);\n h.crossTileID || (h.crossTileID = i.generate(), r[h.crossTileID] = !0);\n }\n\n return void 0 === this.indexes[t.overscaledZ] && (this.indexes[t.overscaledZ] = {}), this.indexes[t.overscaledZ][t.key] = new ke(t, e.symbolInstances, e.bucketInstanceId), !0;\n }, Oe.prototype.removeBucketCrossTileIDs = function (t, e) {\n for (var i in e.indexedSymbolInstances) {\n for (var o = 0, r = e.indexedSymbolInstances[i]; o < r.length; o += 1) {\n delete this.usedCrossTileIDs[t][r[o].crossTileID];\n }\n }\n }, Oe.prototype.removeStaleBuckets = function (t) {\n var e = !1;\n\n for (var i in this.indexes) {\n var o = this.indexes[i];\n\n for (var r in o) {\n t[o[r].bucketInstanceId] || (this.removeBucketCrossTileIDs(i, o[r]), delete o[r], e = !0);\n }\n }\n\n return e;\n };\n\n var Fe = function Fe() {\n this.layerIndexes = {}, this.crossTileIDs = new Be(), this.maxBucketInstanceId = 0, this.bucketsInCurrentPlacement = {};\n };\n\n Fe.prototype.addLayer = function (t, e, i) {\n var o = this.layerIndexes[t.id];\n void 0 === o && (o = this.layerIndexes[t.id] = new Oe());\n var r = !1,\n a = {};\n o.handleWrapJump(i);\n\n for (var n = 0, s = e; n < s.length; n += 1) {\n var l = s[n],\n c = l.getBucket(t);\n c && t.id === c.layerIds[0] && (c.bucketInstanceId || (c.bucketInstanceId = ++this.maxBucketInstanceId), o.addBucket(l.tileID, c, this.crossTileIDs) && (r = !0), a[c.bucketInstanceId] = !0);\n }\n\n return o.removeStaleBuckets(a) && (r = !0), r;\n }, Fe.prototype.pruneUnusedLayers = function (t) {\n var e = {};\n\n for (var i in t.forEach(function (t) {\n e[t] = !0;\n }), this.layerIndexes) {\n e[i] || delete this.layerIndexes[i];\n }\n };\n\n var Ue = function Ue(e, i) {\n return t.emitValidationErrors(e, i && i.filter(function (t) {\n return "source.canvas" !== t.identifier;\n }));\n },\n Ne = t.pick(Zt, ["addLayer", "removeLayer", "setPaintProperty", "setLayoutProperty", "setFilter", "addSource", "removeSource", "setLayerZoomRange", "setLight", "setTransition", "setGeoJSONSourceData"]),\n Ze = t.pick(Zt, ["setCenter", "setZoom", "setBearing", "setPitch"]),\n qe = function () {\n var e = {},\n i = t.styleSpec.$version;\n\n for (var o in t.styleSpec.$root) {\n var r,\n a = t.styleSpec.$root[o];\n if (a.required) null != (r = "version" === o ? i : "array" === a.type ? [] : {}) && (e[o] = r);\n }\n\n return e;\n }(),\n je = function (e) {\n function i(o, r) {\n var a = this;\n void 0 === r && (r = {}), e.call(this), this.map = o, this.dispatcher = new E(Ft(), this), this.imageManager = new p(), this.imageManager.setEventedParent(this), this.glyphManager = new y(o._requestManager, r.localIdeographFontFamily), this.lineAtlas = new T(256, 512), this.crossTileSymbolIndex = new Fe(), this._layers = {}, this._serializedLayers = {}, this._order = [], this.sourceCaches = {}, this.zoomHistory = new t.ZoomHistory(), this._loaded = !1, this._availableImages = [], this._resetUpdates(), this.dispatcher.broadcast("setReferrer", t.getReferrer());\n var n = this;\n this._rtlTextPluginCallback = i.registerForPluginStateChange(function (e) {\n n.dispatcher.broadcast("syncRTLPluginState", {\n pluginStatus: e.pluginStatus,\n pluginURL: e.pluginURL\n }, function (e, i) {\n if (t.triggerPluginCompletionEvent(e), i && i.every(function (t) {\n return t;\n })) for (var o in n.sourceCaches) {\n n.sourceCaches[o].reload();\n }\n });\n }), this.on("data", function (t) {\n if ("source" === t.dataType && "metadata" === t.sourceDataType) {\n var e = a.sourceCaches[t.sourceId];\n\n if (e) {\n var i = e.getSource();\n if (i && i.vectorLayerIds) for (var o in a._layers) {\n var r = a._layers[o];\n r.source === i.id && a._validateLayer(r);\n }\n }\n }\n });\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.loadURL = function (e, i) {\n var o = this;\n void 0 === i && (i = {}), this.fire(new t.Event("dataloading", {\n dataType: "style"\n }));\n var r = "boolean" == typeof i.validate ? i.validate : !t.isMapboxURL(e);\n e = this.map._requestManager.normalizeStyleURL(e, i.accessToken);\n\n var a = this.map._requestManager.transformRequest(e, t.ResourceType.Style);\n\n this._request = t.getJSON(a, function (e, i) {\n o._request = null, e ? o.fire(new t.ErrorEvent(e)) : i && o._load(i, r);\n });\n }, i.prototype.loadJSON = function (e, i) {\n var o = this;\n void 0 === i && (i = {}), this.fire(new t.Event("dataloading", {\n dataType: "style"\n })), this._request = t.browser.frame(function () {\n o._request = null, o._load(e, !1 !== i.validate);\n });\n }, i.prototype.loadEmpty = function () {\n this.fire(new t.Event("dataloading", {\n dataType: "style"\n })), this._load(qe, !1);\n }, i.prototype._load = function (e, i) {\n if (!i || !Ue(this, t.validateStyle(e))) {\n for (var o in this._loaded = !0, this.stylesheet = e, e.sources) {\n this.addSource(o, e.sources[o], {\n validate: !1\n });\n }\n\n e.sprite ? this._loadSprite(e.sprite) : this.imageManager.setLoaded(!0), this.glyphManager.setURL(e.glyphs);\n var r = Nt(this.stylesheet.layers);\n this._order = r.map(function (t) {\n return t.id;\n }), this._layers = {}, this._serializedLayers = {};\n\n for (var a = 0, n = r; a < n.length; a += 1) {\n var s = n[a];\n (s = t.createStyleLayer(s)).setEventedParent(this, {\n layer: {\n id: s.id\n }\n }), this._layers[s.id] = s, this._serializedLayers[s.id] = s.serialize();\n }\n\n this.dispatcher.broadcast("setLayers", this._serializeLayers(this._order)), this.light = new w(this.stylesheet.light), this.fire(new t.Event("data", {\n dataType: "style"\n })), this.fire(new t.Event("style.load"));\n }\n }, i.prototype._loadSprite = function (e) {\n var i = this;\n\n this._spriteRequest = function (e, i, o) {\n var r,\n a,\n n,\n s = t.browser.devicePixelRatio > 1 ? "@2x" : "",\n l = t.getJSON(i.transformRequest(i.normalizeSpriteURL(e, s, ".json"), t.ResourceType.SpriteJSON), function (t, e) {\n l = null, n || (n = t, r = e, u());\n }),\n c = t.getImage(i.transformRequest(i.normalizeSpriteURL(e, s, ".png"), t.ResourceType.SpriteImage), function (t, e) {\n c = null, n || (n = t, a = e, u());\n });\n\n function u() {\n if (n) o(n);else if (r && a) {\n var e = t.browser.getImageData(a),\n i = {};\n\n for (var s in r) {\n var l = r[s],\n c = l.width,\n u = l.height,\n h = l.x,\n p = l.y,\n d = l.sdf,\n _ = l.pixelRatio,\n f = l.stretchX,\n m = l.stretchY,\n g = l.content,\n v = new t.RGBAImage({\n width: c,\n height: u\n });\n t.RGBAImage.copy(e, v, {\n x: h,\n y: p\n }, {\n x: 0,\n y: 0\n }, {\n width: c,\n height: u\n }), i[s] = {\n data: v,\n pixelRatio: _,\n sdf: d,\n stretchX: f,\n stretchY: m,\n content: g\n };\n }\n\n o(null, i);\n }\n }\n\n return {\n cancel: function cancel() {\n l && (l.cancel(), l = null), c && (c.cancel(), c = null);\n }\n };\n }(e, this.map._requestManager, function (e, o) {\n if (i._spriteRequest = null, e) i.fire(new t.ErrorEvent(e));else if (o) for (var r in o) {\n i.imageManager.addImage(r, o[r]);\n }\n i.imageManager.setLoaded(!0), i._availableImages = i.imageManager.listImages(), i.dispatcher.broadcast("setImages", i._availableImages), i.fire(new t.Event("data", {\n dataType: "style"\n }));\n });\n }, i.prototype._validateLayer = function (e) {\n var i = this.sourceCaches[e.source];\n\n if (i) {\n var o = e.sourceLayer;\n\n if (o) {\n var r = i.getSource();\n ("geojson" === r.type || r.vectorLayerIds && -1 === r.vectorLayerIds.indexOf(o)) && this.fire(new t.ErrorEvent(new Error(\'Source layer "\' + o + \'" does not exist on source "\' + r.id + \'" as specified by style layer "\' + e.id + \'"\')));\n }\n }\n }, i.prototype.loaded = function () {\n if (!this._loaded) return !1;\n if (Object.keys(this._updatedSources).length) return !1;\n\n for (var t in this.sourceCaches) {\n if (!this.sourceCaches[t].loaded()) return !1;\n }\n\n return !!this.imageManager.isLoaded();\n }, i.prototype._serializeLayers = function (t) {\n for (var e = [], i = 0, o = t; i < o.length; i += 1) {\n var r = this._layers[o[i]];\n "custom" !== r.type && e.push(r.serialize());\n }\n\n return e;\n }, i.prototype.hasTransitions = function () {\n if (this.light && this.light.hasTransition()) return !0;\n\n for (var t in this.sourceCaches) {\n if (this.sourceCaches[t].hasTransition()) return !0;\n }\n\n for (var e in this._layers) {\n if (this._layers[e].hasTransition()) return !0;\n }\n\n return !1;\n }, i.prototype._checkLoaded = function () {\n if (!this._loaded) throw new Error("Style is not done loading");\n }, i.prototype.update = function (e) {\n if (this._loaded) {\n var i = this._changed;\n\n if (this._changed) {\n var o = Object.keys(this._updatedLayers),\n r = Object.keys(this._removedLayers);\n\n for (var a in (o.length || r.length) && this._updateWorkerLayers(o, r), this._updatedSources) {\n var n = this._updatedSources[a];\n "reload" === n ? this._reloadSource(a) : "clear" === n && this._clearSource(a);\n }\n\n for (var s in this._updateTilesForChangedImages(), this._updatedPaintProps) {\n this._layers[s].updateTransitions(e);\n }\n\n this.light.updateTransitions(e), this._resetUpdates();\n }\n\n var l = {};\n\n for (var c in this.sourceCaches) {\n var u = this.sourceCaches[c];\n l[c] = u.used, u.used = !1;\n }\n\n for (var h = 0, p = this._order; h < p.length; h += 1) {\n var d = this._layers[p[h]];\n d.recalculate(e, this._availableImages), !d.isHidden(e.zoom) && d.source && (this.sourceCaches[d.source].used = !0);\n }\n\n for (var _ in l) {\n var f = this.sourceCaches[_];\n l[_] !== f.used && f.fire(new t.Event("data", {\n sourceDataType: "visibility",\n dataType: "source",\n sourceId: _\n }));\n }\n\n this.light.recalculate(e), this.z = e.zoom, i && this.fire(new t.Event("data", {\n dataType: "style"\n }));\n }\n }, i.prototype._updateTilesForChangedImages = function () {\n var t = Object.keys(this._changedImages);\n\n if (t.length) {\n for (var e in this.sourceCaches) {\n this.sourceCaches[e].reloadTilesForDependencies(["icons", "patterns"], t);\n }\n\n this._changedImages = {};\n }\n }, i.prototype._updateWorkerLayers = function (t, e) {\n this.dispatcher.broadcast("updateLayers", {\n layers: this._serializeLayers(t),\n removedIds: e\n });\n }, i.prototype._resetUpdates = function () {\n this._changed = !1, this._updatedLayers = {}, this._removedLayers = {}, this._updatedSources = {}, this._updatedPaintProps = {}, this._changedImages = {};\n }, i.prototype.setState = function (e) {\n var i = this;\n if (this._checkLoaded(), Ue(this, t.validateStyle(e))) return !1;\n (e = t.clone$1(e)).layers = Nt(e.layers);\n\n var o = function (e, i) {\n if (!e) return [{\n command: Zt.setStyle,\n args: [i]\n }];\n var o = [];\n\n try {\n if (!t.deepEqual(e.version, i.version)) return [{\n command: Zt.setStyle,\n args: [i]\n }];\n t.deepEqual(e.center, i.center) || o.push({\n command: Zt.setCenter,\n args: [i.center]\n }), t.deepEqual(e.zoom, i.zoom) || o.push({\n command: Zt.setZoom,\n args: [i.zoom]\n }), t.deepEqual(e.bearing, i.bearing) || o.push({\n command: Zt.setBearing,\n args: [i.bearing]\n }), t.deepEqual(e.pitch, i.pitch) || o.push({\n command: Zt.setPitch,\n args: [i.pitch]\n }), t.deepEqual(e.sprite, i.sprite) || o.push({\n command: Zt.setSprite,\n args: [i.sprite]\n }), t.deepEqual(e.glyphs, i.glyphs) || o.push({\n command: Zt.setGlyphs,\n args: [i.glyphs]\n }), t.deepEqual(e.transition, i.transition) || o.push({\n command: Zt.setTransition,\n args: [i.transition]\n }), t.deepEqual(e.light, i.light) || o.push({\n command: Zt.setLight,\n args: [i.light]\n });\n var r = {},\n a = [];\n !function (e, i, o, r) {\n var a;\n\n for (a in i = i || {}, e = e || {}) {\n e.hasOwnProperty(a) && (i.hasOwnProperty(a) || jt(a, o, r));\n }\n\n for (a in i) {\n i.hasOwnProperty(a) && (e.hasOwnProperty(a) ? t.deepEqual(e[a], i[a]) || ("geojson" === e[a].type && "geojson" === i[a].type && Gt(e, i, a) ? o.push({\n command: Zt.setGeoJSONSourceData,\n args: [a, i[a].data]\n }) : Vt(a, i, o, r)) : qt(a, i, o));\n }\n }(e.sources, i.sources, a, r);\n var n = [];\n e.layers && e.layers.forEach(function (t) {\n r[t.source] ? o.push({\n command: Zt.removeLayer,\n args: [t.id]\n }) : n.push(t);\n }), o = o.concat(a), function (e, i, o) {\n i = i || [];\n\n var r,\n a,\n n,\n s,\n l,\n c,\n u,\n h = (e = e || []).map(Xt),\n p = i.map(Xt),\n d = e.reduce(Ht, {}),\n _ = i.reduce(Ht, {}),\n f = h.slice(),\n m = Object.create(null);\n\n for (r = 0, a = 0; r < h.length; r++) {\n _.hasOwnProperty(n = h[r]) ? a++ : (o.push({\n command: Zt.removeLayer,\n args: [n]\n }), f.splice(f.indexOf(n, a), 1));\n }\n\n for (r = 0, a = 0; r < p.length; r++) {\n f[f.length - 1 - r] !== (n = p[p.length - 1 - r]) && (d.hasOwnProperty(n) ? (o.push({\n command: Zt.removeLayer,\n args: [n]\n }), f.splice(f.lastIndexOf(n, f.length - a), 1)) : a++, o.push({\n command: Zt.addLayer,\n args: [_[n], c = f[f.length - r]]\n }), f.splice(f.length - r, 0, n), m[n] = !0);\n }\n\n for (r = 0; r < p.length; r++) {\n if (s = d[n = p[r]], l = _[n], !m[n] && !t.deepEqual(s, l)) if (t.deepEqual(s.source, l.source) && t.deepEqual(s["source-layer"], l["source-layer"]) && t.deepEqual(s.type, l.type)) {\n for (u in Wt(s.layout, l.layout, o, n, null, Zt.setLayoutProperty), Wt(s.paint, l.paint, o, n, null, Zt.setPaintProperty), t.deepEqual(s.filter, l.filter) || o.push({\n command: Zt.setFilter,\n args: [n, l.filter]\n }), t.deepEqual(s.minzoom, l.minzoom) && t.deepEqual(s.maxzoom, l.maxzoom) || o.push({\n command: Zt.setLayerZoomRange,\n args: [n, l.minzoom, l.maxzoom]\n }), s) {\n s.hasOwnProperty(u) && "layout" !== u && "paint" !== u && "filter" !== u && "metadata" !== u && "minzoom" !== u && "maxzoom" !== u && (0 === u.indexOf("paint.") ? Wt(s[u], l[u], o, n, u.slice(6), Zt.setPaintProperty) : t.deepEqual(s[u], l[u]) || o.push({\n command: Zt.setLayerProperty,\n args: [n, u, l[u]]\n }));\n }\n\n for (u in l) {\n l.hasOwnProperty(u) && !s.hasOwnProperty(u) && "layout" !== u && "paint" !== u && "filter" !== u && "metadata" !== u && "minzoom" !== u && "maxzoom" !== u && (0 === u.indexOf("paint.") ? Wt(s[u], l[u], o, n, u.slice(6), Zt.setPaintProperty) : t.deepEqual(s[u], l[u]) || o.push({\n command: Zt.setLayerProperty,\n args: [n, u, l[u]]\n }));\n }\n } else o.push({\n command: Zt.removeLayer,\n args: [n]\n }), c = f[f.lastIndexOf(n) + 1], o.push({\n command: Zt.addLayer,\n args: [l, c]\n });\n }\n }(n, i.layers, o);\n } catch (t) {\n console.warn("Unable to compute style diff:", t), o = [{\n command: Zt.setStyle,\n args: [i]\n }];\n }\n\n return o;\n }(this.serialize(), e).filter(function (t) {\n return !(t.command in Ze);\n });\n\n if (0 === o.length) return !1;\n var r = o.filter(function (t) {\n return !(t.command in Ne);\n });\n if (r.length > 0) throw new Error("Unimplemented: " + r.map(function (t) {\n return t.command;\n }).join(", ") + ".");\n return o.forEach(function (t) {\n "setTransition" !== t.command && i[t.command].apply(i, t.args);\n }), this.stylesheet = e, !0;\n }, i.prototype.addImage = function (e, i) {\n if (this.getImage(e)) return this.fire(new t.ErrorEvent(new Error("An image with this name already exists.")));\n this.imageManager.addImage(e, i), this._afterImageUpdated(e);\n }, i.prototype.updateImage = function (t, e) {\n this.imageManager.updateImage(t, e);\n }, i.prototype.getImage = function (t) {\n return this.imageManager.getImage(t);\n }, i.prototype.removeImage = function (e) {\n if (!this.getImage(e)) return this.fire(new t.ErrorEvent(new Error("No image with this name exists.")));\n this.imageManager.removeImage(e), this._afterImageUpdated(e);\n }, i.prototype._afterImageUpdated = function (e) {\n this._availableImages = this.imageManager.listImages(), this._changedImages[e] = !0, this._changed = !0, this.dispatcher.broadcast("setImages", this._availableImages), this.fire(new t.Event("data", {\n dataType: "style"\n }));\n }, i.prototype.listImages = function () {\n return this._checkLoaded(), this.imageManager.listImages();\n }, i.prototype.addSource = function (e, i, o) {\n var r = this;\n if (void 0 === o && (o = {}), this._checkLoaded(), void 0 !== this.sourceCaches[e]) throw new Error("There is already a source with this ID");\n if (!i.type) throw new Error("The type property must be defined, but only the following properties were given: " + Object.keys(i).join(", ") + ".");\n\n if (!(["vector", "raster", "geojson", "video", "image"].indexOf(i.type) >= 0 && this._validate(t.validateStyle.source, "sources." + e, i, null, o))) {\n this.map && this.map._collectResourceTiming && (i.collectResourceTiming = !0);\n var a = this.sourceCaches[e] = new Dt(e, i, this.dispatcher);\n a.style = this, a.setEventedParent(this, function () {\n return {\n isSourceLoaded: r.loaded(),\n source: a.serialize(),\n sourceId: e\n };\n }), a.onAdd(this.map), this._changed = !0;\n }\n }, i.prototype.removeSource = function (e) {\n if (this._checkLoaded(), void 0 === this.sourceCaches[e]) throw new Error("There is no source with this ID");\n\n for (var i in this._layers) {\n if (this._layers[i].source === e) return this.fire(new t.ErrorEvent(new Error(\'Source "\' + e + \'" cannot be removed while layer "\' + i + \'" is using it.\')));\n }\n\n var o = this.sourceCaches[e];\n delete this.sourceCaches[e], delete this._updatedSources[e], o.fire(new t.Event("data", {\n sourceDataType: "metadata",\n dataType: "source",\n sourceId: e\n })), o.setEventedParent(null), o.clearTiles(), o.onRemove && o.onRemove(this.map), this._changed = !0;\n }, i.prototype.setGeoJSONSourceData = function (t, e) {\n this._checkLoaded(), this.sourceCaches[t].getSource().setData(e), this._changed = !0;\n }, i.prototype.getSource = function (t) {\n return this.sourceCaches[t] && this.sourceCaches[t].getSource();\n }, i.prototype.addLayer = function (e, i, o) {\n void 0 === o && (o = {}), this._checkLoaded();\n var r = e.id;\n if (this.getLayer(r)) this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + r + \'" already exists on this map\')));else {\n var a;\n\n if ("custom" === e.type) {\n if (Ue(this, t.validateCustomStyleLayer(e))) return;\n a = t.createStyleLayer(e);\n } else {\n if ("object" == typeof e.source && (this.addSource(r, e.source), e = t.clone$1(e), e = t.extend(e, {\n source: r\n })), this._validate(t.validateStyle.layer, "layers." + r, e, {\n arrayIndex: -1\n }, o)) return;\n a = t.createStyleLayer(e), this._validateLayer(a), a.setEventedParent(this, {\n layer: {\n id: r\n }\n }), this._serializedLayers[a.id] = a.serialize();\n }\n\n var n = i ? this._order.indexOf(i) : this._order.length;\n if (i && -1 === n) this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + i + \'" does not exist on this map.\')));else {\n if (this._order.splice(n, 0, r), this._layerOrderChanged = !0, this._layers[r] = a, this._removedLayers[r] && a.source && "custom" !== a.type) {\n var s = this._removedLayers[r];\n delete this._removedLayers[r], s.type !== a.type ? this._updatedSources[a.source] = "clear" : (this._updatedSources[a.source] = "reload", this.sourceCaches[a.source].pause());\n }\n\n this._updateLayer(a), a.onAdd && a.onAdd(this.map);\n }\n }\n }, i.prototype.moveLayer = function (e, i) {\n if (this._checkLoaded(), this._changed = !0, this._layers[e]) {\n if (e !== i) {\n var o = this._order.indexOf(e);\n\n this._order.splice(o, 1);\n\n var r = i ? this._order.indexOf(i) : this._order.length;\n i && -1 === r ? this.fire(new t.ErrorEvent(new Error(\'Layer with id "\' + i + \'" does not exist on this map.\'))) : (this._order.splice(r, 0, e), this._layerOrderChanged = !0);\n }\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be moved.")));\n }, i.prototype.removeLayer = function (e) {\n this._checkLoaded();\n\n var i = this._layers[e];\n\n if (i) {\n i.setEventedParent(null);\n\n var o = this._order.indexOf(e);\n\n this._order.splice(o, 1), this._layerOrderChanged = !0, this._changed = !0, this._removedLayers[e] = i, delete this._layers[e], delete this._serializedLayers[e], delete this._updatedLayers[e], delete this._updatedPaintProps[e], i.onRemove && i.onRemove(this.map);\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be removed.")));\n }, i.prototype.getLayer = function (t) {\n return this._layers[t];\n }, i.prototype.hasLayer = function (t) {\n return t in this._layers;\n }, i.prototype.setLayerZoomRange = function (e, i, o) {\n this._checkLoaded();\n\n var r = this.getLayer(e);\n r ? r.minzoom === i && r.maxzoom === o || (null != i && (r.minzoom = i), null != o && (r.maxzoom = o), this._updateLayer(r)) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot have zoom extent.")));\n }, i.prototype.setFilter = function (e, i, o) {\n void 0 === o && (o = {}), this._checkLoaded();\n var r = this.getLayer(e);\n\n if (r) {\n if (!t.deepEqual(r.filter, i)) return null == i ? (r.filter = void 0, void this._updateLayer(r)) : void (this._validate(t.validateStyle.filter, "layers." + r.id + ".filter", i, null, o) || (r.filter = t.clone$1(i), this._updateLayer(r)));\n } else this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be filtered.")));\n }, i.prototype.getFilter = function (e) {\n return t.clone$1(this.getLayer(e).filter);\n }, i.prototype.setLayoutProperty = function (e, i, o, r) {\n void 0 === r && (r = {}), this._checkLoaded();\n var a = this.getLayer(e);\n a ? t.deepEqual(a.getLayoutProperty(i), o) || (a.setLayoutProperty(i, o, r), this._updateLayer(a)) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be styled.")));\n }, i.prototype.getLayoutProperty = function (e, i) {\n var o = this.getLayer(e);\n if (o) return o.getLayoutProperty(i);\n this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style.")));\n }, i.prototype.setPaintProperty = function (e, i, o, r) {\n void 0 === r && (r = {}), this._checkLoaded();\n var a = this.getLayer(e);\n a ? t.deepEqual(a.getPaintProperty(i), o) || (a.setPaintProperty(i, o, r) && this._updateLayer(a), this._changed = !0, this._updatedPaintProps[e] = !0) : this.fire(new t.ErrorEvent(new Error("The layer \'" + e + "\' does not exist in the map\'s style and cannot be styled.")));\n }, i.prototype.getPaintProperty = function (t, e) {\n return this.getLayer(t).getPaintProperty(e);\n }, i.prototype.setFeatureState = function (e, i) {\n this._checkLoaded();\n\n var o = e.source,\n r = e.sourceLayer,\n a = this.sourceCaches[o];\n\n if (void 0 !== a) {\n var n = a.getSource().type;\n "geojson" === n && r ? this.fire(new t.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))) : "vector" !== n || r ? (void 0 === e.id && this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))), a.setFeatureState(r, e.id, i)) : this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + o + "\' does not exist in the map\'s style.")));\n }, i.prototype.removeFeatureState = function (e, i) {\n this._checkLoaded();\n\n var o = e.source,\n r = this.sourceCaches[o];\n\n if (void 0 !== r) {\n var a = r.getSource().type,\n n = "vector" === a ? e.sourceLayer : void 0;\n "vector" !== a || n ? i && "string" != typeof e.id && "number" != typeof e.id ? this.fire(new t.ErrorEvent(new Error("A feature id is required to remove its specific state property."))) : r.removeFeatureState(n, e.id, i) : this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + o + "\' does not exist in the map\'s style.")));\n }, i.prototype.getFeatureState = function (e) {\n this._checkLoaded();\n\n var i = e.source,\n o = e.sourceLayer,\n r = this.sourceCaches[i];\n\n if (void 0 !== r) {\n if ("vector" !== r.getSource().type || o) return void 0 === e.id && this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))), r.getFeatureState(o, e.id);\n this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")));\n } else this.fire(new t.ErrorEvent(new Error("The source \'" + i + "\' does not exist in the map\'s style.")));\n }, i.prototype.getTransition = function () {\n return t.extend({\n duration: 300,\n delay: 0\n }, this.stylesheet && this.stylesheet.transition);\n }, i.prototype.serialize = function () {\n return t.filterObject({\n version: this.stylesheet.version,\n name: this.stylesheet.name,\n metadata: this.stylesheet.metadata,\n light: this.stylesheet.light,\n center: this.stylesheet.center,\n zoom: this.stylesheet.zoom,\n bearing: this.stylesheet.bearing,\n pitch: this.stylesheet.pitch,\n sprite: this.stylesheet.sprite,\n glyphs: this.stylesheet.glyphs,\n transition: this.stylesheet.transition,\n sources: t.mapObject(this.sourceCaches, function (t) {\n return t.serialize();\n }),\n layers: this._serializeLayers(this._order)\n }, function (t) {\n return void 0 !== t;\n });\n }, i.prototype._updateLayer = function (t) {\n this._updatedLayers[t.id] = !0, t.source && !this._updatedSources[t.source] && "raster" !== this.sourceCaches[t.source].getSource().type && (this._updatedSources[t.source] = "reload", this.sourceCaches[t.source].pause()), this._changed = !0;\n }, i.prototype._flattenAndSortRenderedFeatures = function (t) {\n for (var e = this, i = function i(t) {\n return "fill-extrusion" === e._layers[t].type;\n }, o = {}, r = [], a = this._order.length - 1; a >= 0; a--) {\n var n = this._order[a];\n\n if (i(n)) {\n o[n] = a;\n\n for (var s = 0, l = t; s < l.length; s += 1) {\n var c = l[s][n];\n if (c) for (var u = 0, h = c; u < h.length; u += 1) {\n r.push(h[u]);\n }\n }\n }\n }\n\n r.sort(function (t, e) {\n return e.intersectionZ - t.intersectionZ;\n });\n\n for (var p = [], d = this._order.length - 1; d >= 0; d--) {\n var _ = this._order[d];\n if (i(_)) for (var f = r.length - 1; f >= 0; f--) {\n var m = r[f].feature;\n if (o[m.layer.id] < d) break;\n p.push(m), r.pop();\n } else for (var g = 0, v = t; g < v.length; g += 1) {\n var y = v[g][_];\n if (y) for (var x = 0, b = y; x < b.length; x += 1) {\n p.push(b[x].feature);\n }\n }\n }\n\n return p;\n }, i.prototype.queryRenderedFeatures = function (e, i, o) {\n i && i.filter && this._validate(t.validateStyle.filter, "queryRenderedFeatures.filter", i.filter, null, i);\n var r = {};\n\n if (i && i.layers) {\n if (!Array.isArray(i.layers)) return this.fire(new t.ErrorEvent(new Error("parameters.layers must be an Array."))), [];\n\n for (var a = 0, n = i.layers; a < n.length; a += 1) {\n var s = n[a],\n l = this._layers[s];\n if (!l) return this.fire(new t.ErrorEvent(new Error("The layer \'" + s + "\' does not exist in the map\'s style and cannot be queried for features."))), [];\n r[l.source] = !0;\n }\n }\n\n var c = [];\n\n for (var u in i.availableImages = this._availableImages, this.sourceCaches) {\n i.layers && !r[u] || c.push(O(this.sourceCaches[u], this._layers, this._serializedLayers, e, i, o));\n }\n\n return this.placement && c.push(function (t, e, i, o, r, a, n) {\n for (var s = {}, l = a.queryRenderedSymbols(o), c = [], u = 0, h = Object.keys(l).map(Number); u < h.length; u += 1) {\n c.push(n[h[u]]);\n }\n\n c.sort(F);\n\n for (var p = function p() {\n var i = _[d],\n o = i.featureIndex.lookupSymbolFeatures(l[i.bucketInstanceId], e, i.bucketIndex, i.sourceLayerIndex, r.filter, r.layers, r.availableImages, t);\n\n for (var a in o) {\n var n = s[a] = s[a] || [],\n c = o[a];\n c.sort(function (t, e) {\n var o = i.featureSortOrder;\n\n if (o) {\n var r = o.indexOf(t.featureIndex);\n return o.indexOf(e.featureIndex) - r;\n }\n\n return e.featureIndex - t.featureIndex;\n });\n\n for (var u = 0, h = c; u < h.length; u += 1) {\n n.push(h[u]);\n }\n }\n }, d = 0, _ = c; d < _.length; d += 1) {\n p();\n }\n\n var f = function f(e) {\n s[e].forEach(function (o) {\n var r = o.feature,\n a = i[t[e].source].getFeatureState(r.layer["source-layer"], r.id);\n r.source = r.layer.source, r.layer["source-layer"] && (r.sourceLayer = r.layer["source-layer"]), r.state = a;\n });\n };\n\n for (var m in s) {\n f(m);\n }\n\n return s;\n }(this._layers, this._serializedLayers, this.sourceCaches, e, i, this.placement.collisionIndex, this.placement.retainedQueryData)), this._flattenAndSortRenderedFeatures(c);\n }, i.prototype.querySourceFeatures = function (e, i) {\n i && i.filter && this._validate(t.validateStyle.filter, "querySourceFeatures.filter", i.filter, null, i);\n var o = this.sourceCaches[e];\n return o ? function (t, e) {\n for (var i = t.getRenderableIds().map(function (e) {\n return t.getTileByID(e);\n }), o = [], r = {}, a = 0; a < i.length; a++) {\n var n = i[a],\n s = n.tileID.canonical.key;\n r[s] || (r[s] = !0, n.querySourceFeatures(o, e));\n }\n\n return o;\n }(o, i) : [];\n }, i.prototype.addSourceType = function (t, e, o) {\n return i.getSourceType(t) ? o(new Error(\'A source type called "\' + t + \'" already exists.\')) : (i.setSourceType(t, e), e.workerSourceURL ? void this.dispatcher.broadcast("loadWorkerSource", {\n name: t,\n url: e.workerSourceURL\n }, o) : o(null, null));\n }, i.prototype.getLight = function () {\n return this.light.getLight();\n }, i.prototype.setLight = function (e, i) {\n void 0 === i && (i = {}), this._checkLoaded();\n var o = this.light.getLight(),\n r = !1;\n\n for (var a in e) {\n if (!t.deepEqual(e[a], o[a])) {\n r = !0;\n break;\n }\n }\n\n if (r) {\n var n = {\n now: t.browser.now(),\n transition: t.extend({\n duration: 300,\n delay: 0\n }, this.stylesheet.transition)\n };\n this.light.setLight(e, i), this.light.updateTransitions(n);\n }\n }, i.prototype._validate = function (e, i, o, r, a) {\n return void 0 === a && (a = {}), (!a || !1 !== a.validate) && Ue(this, e.call(t.validateStyle, t.extend({\n key: i,\n style: this.serialize(),\n value: o,\n styleSpec: t.styleSpec\n }, r)));\n }, i.prototype._remove = function () {\n for (var e in this._request && (this._request.cancel(), this._request = null), this._spriteRequest && (this._spriteRequest.cancel(), this._spriteRequest = null), t.evented.off("pluginStateChange", this._rtlTextPluginCallback), this._layers) {\n this._layers[e].setEventedParent(null);\n }\n\n for (var i in this.sourceCaches) {\n this.sourceCaches[i].clearTiles(), this.sourceCaches[i].setEventedParent(null);\n }\n\n this.imageManager.setEventedParent(null), this.setEventedParent(null), this.dispatcher.remove();\n }, i.prototype._clearSource = function (t) {\n this.sourceCaches[t].clearTiles();\n }, i.prototype._reloadSource = function (t) {\n this.sourceCaches[t].resume(), this.sourceCaches[t].reload();\n }, i.prototype._updateSources = function (t) {\n for (var e in this.sourceCaches) {\n this.sourceCaches[e].update(t);\n }\n }, i.prototype._generateCollisionBoxes = function () {\n for (var t in this.sourceCaches) {\n this._reloadSource(t);\n }\n }, i.prototype._updatePlacement = function (e, i, o, r, a) {\n void 0 === a && (a = !1);\n\n for (var n = !1, s = !1, l = {}, c = 0, u = this._order; c < u.length; c += 1) {\n var h = this._layers[u[c]];\n\n if ("symbol" === h.type) {\n if (!l[h.source]) {\n var p = this.sourceCaches[h.source];\n l[h.source] = p.getRenderableIds(!0).map(function (t) {\n return p.getTileByID(t);\n }).sort(function (t, e) {\n return e.tileID.overscaledZ - t.tileID.overscaledZ || (t.tileID.isLessThan(e.tileID) ? -1 : 1);\n });\n }\n\n var d = this.crossTileSymbolIndex.addLayer(h, l[h.source], e.center.lng);\n n = n || d;\n }\n }\n\n if (this.crossTileSymbolIndex.pruneUnusedLayers(this._order), ((a = a || this._layerOrderChanged || 0 === o) || !this.pauseablePlacement || this.pauseablePlacement.isDone() && !this.placement.stillRecent(t.browser.now(), e.zoom)) && (this.pauseablePlacement = new Le(e, this._order, a, i, o, r, this.placement), this._layerOrderChanged = !1), this.pauseablePlacement.isDone() ? this.placement.setStale() : (this.pauseablePlacement.continuePlacement(this._order, this._layers, l), this.pauseablePlacement.isDone() && (this.placement = this.pauseablePlacement.commit(t.browser.now()), s = !0), n && this.pauseablePlacement.placement.setStale()), s || n) for (var _ = 0, f = this._order; _ < f.length; _ += 1) {\n var m = this._layers[f[_]];\n "symbol" === m.type && this.placement.updateLayerOpacities(m, l[m.source]);\n }\n return !this.pauseablePlacement.isDone() || this.placement.hasTransitions(t.browser.now());\n }, i.prototype._releaseSymbolFadeTiles = function () {\n for (var t in this.sourceCaches) {\n this.sourceCaches[t].releaseSymbolFadeTiles();\n }\n }, i.prototype.getImages = function (t, e, i) {\n this.imageManager.getImages(e.icons, i), this._updateTilesForChangedImages();\n var o = this.sourceCaches[e.source];\n o && o.setDependencies(e.tileID.key, e.type, e.icons);\n }, i.prototype.getGlyphs = function (t, e, i) {\n this.glyphManager.getGlyphs(e.stacks, i);\n }, i.prototype.getResource = function (e, i, o) {\n return t.makeRequest(i, o);\n }, i;\n }(t.Evented);\n\n je.getSourceType = function (t) {\n return k[t];\n }, je.setSourceType = function (t, e) {\n k[t] = e;\n }, je.registerForPluginStateChange = t.registerForPluginStateChange;\n\n var Ve = t.createLayout([{\n name: "a_pos",\n type: "Int16",\n components: 2\n }]),\n Ge = gi("#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif", "#ifdef GL_ES\\nprecision highp float;\\n#else\\n#if !defined(lowp)\\n#define lowp\\n#endif\\n#if !defined(mediump)\\n#define mediump\\n#endif\\n#if !defined(highp)\\n#define highp\\n#endif\\n#endif\\nvec2 unpack_float(const float packedValue) {int packedIntValue=int(packedValue);int v0=packedIntValue/256;return vec2(v0,packedIntValue-v0*256);}vec2 unpack_opacity(const float packedOpacity) {int intOpacity=int(packedOpacity)/2;return vec2(float(intOpacity)/127.0,mod(packedOpacity,2.0));}vec4 decode_color(const vec2 encodedColor) {return vec4(unpack_float(encodedColor[0])/255.0,unpack_float(encodedColor[1])/255.0\\n);}float unpack_mix_vec2(const vec2 packedValue,const float t) {return mix(packedValue[0],packedValue[1],t);}vec4 unpack_mix_color(const vec4 packedColors,const float t) {vec4 minColor=decode_color(vec2(packedColors[0],packedColors[1]));vec4 maxColor=decode_color(vec2(packedColors[2],packedColors[3]));return mix(minColor,maxColor,t);}vec2 get_pattern_pos(const vec2 pixel_coord_upper,const vec2 pixel_coord_lower,const vec2 pattern_size,const float tile_units_to_pixels,const vec2 pos) {vec2 offset=mod(mod(mod(pixel_coord_upper,pattern_size)*256.0,pattern_size)*256.0+pixel_coord_lower,pattern_size);return (tile_units_to_pixels*pos+offset)/pattern_size;}"),\n We = gi("uniform vec4 u_color;uniform float u_opacity;void main() {gl_FragColor=u_color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),\n Xe = gi("uniform vec2 u_pattern_tl_a;uniform vec2 u_pattern_br_a;uniform vec2 u_pattern_tl_b;uniform vec2 u_pattern_br_b;uniform vec2 u_texsize;uniform float u_mix;uniform float u_opacity;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(u_pattern_tl_a/u_texsize,u_pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(u_pattern_tl_b/u_texsize,u_pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_mix)*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pattern_size_a;uniform vec2 u_pattern_size_b;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_scale_a;uniform float u_scale_b;uniform float u_tile_units_to_pixels;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_a*u_pattern_size_a,u_tile_units_to_pixels,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,u_scale_b*u_pattern_size_b,u_tile_units_to_pixels,a_pos);}"),\n He = gi("varying vec3 v_data;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=v_data.xy;float extrude_length=length(extrude);lowp float antialiasblur=v_data.z;float antialiased_blur=-max(blur,antialiasblur);float opacity_t=smoothstep(0.0,antialiased_blur,extrude_length-1.0);float color_t=stroke_width < 0.01 ? 0.0 : smoothstep(antialiased_blur,0.0,extrude_length-radius/(radius+stroke_width));gl_FragColor=opacity_t*mix(color*opacity,stroke_color*stroke_opacity,color_t);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform bool u_scale_with_map;uniform bool u_pitch_with_map;uniform vec2 u_extrude_scale;uniform lowp float u_device_pixel_ratio;uniform highp float u_camera_to_center_distance;attribute vec2 a_pos;varying vec3 v_data;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define highp vec4 stroke_color\\n#pragma mapbox: define mediump float stroke_width\\n#pragma mapbox: define lowp float stroke_opacity\\nvoid main(void) {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize mediump float radius\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize highp vec4 stroke_color\\n#pragma mapbox: initialize mediump float stroke_width\\n#pragma mapbox: initialize lowp float stroke_opacity\\nvec2 extrude=vec2(mod(a_pos,2.0)*2.0-1.0);vec2 circle_center=floor(a_pos*0.5);if (u_pitch_with_map) {vec2 corner_position=circle_center;if (u_scale_with_map) {corner_position+=extrude*(radius+stroke_width)*u_extrude_scale;} else {vec4 projected_center=u_matrix*vec4(circle_center,0,1);corner_position+=extrude*(radius+stroke_width)*u_extrude_scale*(projected_center.w/u_camera_to_center_distance);}gl_Position=u_matrix*vec4(corner_position,0,1);} else {gl_Position=u_matrix*vec4(circle_center,0,1);if (u_scale_with_map) {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*u_camera_to_center_distance;} else {gl_Position.xy+=extrude*(radius+stroke_width)*u_extrude_scale*gl_Position.w;}}lowp float antialiasblur=1.0/u_device_pixel_ratio/(radius+stroke_width);v_data=vec3(extrude.x,extrude.y,antialiasblur);}"),\n Ke = gi("void main() {gl_FragColor=vec4(1.0);}", "attribute vec2 a_pos;uniform mat4 u_matrix;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);}"),\n Ye = gi("uniform highp float u_intensity;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main() {\\n#pragma mapbox: initialize highp float weight\\nfloat d=-0.5*3.0*3.0*dot(v_extrude,v_extrude);float val=weight*u_intensity*GAUSS_COEF*exp(d);gl_FragColor=vec4(val,1.0,1.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform float u_extrude_scale;uniform float u_opacity;uniform float u_intensity;attribute vec2 a_pos;varying vec2 v_extrude;\\n#pragma mapbox: define highp float weight\\n#pragma mapbox: define mediump float radius\\nconst highp float ZERO=1.0/255.0/16.0;\\n#define GAUSS_COEF 0.3989422804014327\\nvoid main(void) {\\n#pragma mapbox: initialize highp float weight\\n#pragma mapbox: initialize mediump float radius\\nvec2 unscaled_extrude=vec2(mod(a_pos,2.0)*2.0-1.0);float S=sqrt(-2.0*log(ZERO/weight/u_intensity/GAUSS_COEF))/3.0;v_extrude=S*unscaled_extrude;vec2 extrude=v_extrude*radius*u_extrude_scale;vec4 pos=vec4(floor(a_pos*0.5)+extrude,0,1);gl_Position=u_matrix*pos;}"),\n Je = gi("uniform sampler2D u_image;uniform sampler2D u_color_ramp;uniform float u_opacity;varying vec2 v_pos;void main() {float t=texture2D(u_image,v_pos).r;vec4 color=texture2D(u_color_ramp,vec2(t,0.5));gl_FragColor=color*u_opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(0.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_world;attribute vec2 a_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos*u_world,0,1);v_pos.x=a_pos.x;v_pos.y=1.0-a_pos.y;}"),\n Qe = gi("varying float v_placed;varying float v_notUsed;void main() {float alpha=0.5;gl_FragColor=vec4(1.0,0.0,0.0,1.0)*alpha;if (v_placed > 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}", "attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"),\n $e = gi("varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}", "attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"),\n ti = gi("uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}", "attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}"),\n ei = gi("#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_FragColor=color*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),\n ii = gi("varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\\n#pragma mapbox: define highp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 outline_color\\n#pragma mapbox: initialize lowp float opacity\\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),\n oi = gi("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),\n ri = gi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),\n ai = gi("varying vec4 v_color;void main() {gl_FragColor=v_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\\n#pragma mapbox: define highp float base\\n#pragma mapbox: define highp float height\\n#pragma mapbox: define highp vec4 color\\nvoid main() {\\n#pragma mapbox: initialize highp float base\\n#pragma mapbox: initialize highp float height\\n#pragma mapbox: initialize highp vec4 color\\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),\n ni = gi("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\\n#pragma mapbox: define lowp float base\\n#pragma mapbox: define lowp float height\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float base\\n#pragma mapbox: initialize lowp float height\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\\n? a_pos\\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),\n si = gi("#ifdef GL_ES\\nprecision highp float;\\n#endif\\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggerationFactor=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;float exaggeration=u_zoom < 15.0 ? (u_zoom-15.0)*exaggerationFactor : 0.0;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/pow(2.0,exaggeration+(19.2562-u_zoom));gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),\n li = gi("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\\n#define PI 3.141592653589793\\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),\n ci = gi("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),\n ui = gi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,v_uv);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\nattribute vec2 a_pos_normal;attribute vec4 a_data;attribute float a_uv_x;attribute float a_split_index;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;uniform float u_image_height;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp vec2 v_uv;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;highp float texel_height=1.0/u_image_height;highp float half_texel_height=0.5*texel_height;v_uv=vec2(a_uv_x,a_split_index*texel_height-half_texel_height);vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),\n hi = gi("uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\n#pragma mapbox: define lowp vec4 pattern_from\\n#pragma mapbox: define lowp vec4 pattern_to\\n#pragma mapbox: define lowp float pixel_ratio_from\\n#pragma mapbox: define lowp float pixel_ratio_to\\nvoid main() {\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\n#pragma mapbox: initialize mediump vec4 pattern_from\\n#pragma mapbox: initialize mediump vec4 pattern_to\\n#pragma mapbox: initialize lowp float pixel_ratio_from\\n#pragma mapbox: initialize lowp float pixel_ratio_to\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"),\n pi = gi("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "\\n#define scale 0.015873016\\n#define LINE_DISTANCE_SCALE 2.0\\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\\n#pragma mapbox: define highp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define mediump float gapwidth\\n#pragma mapbox: define lowp float offset\\n#pragma mapbox: define mediump float width\\n#pragma mapbox: define lowp float floorwidth\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 color\\n#pragma mapbox: initialize lowp float blur\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize mediump float gapwidth\\n#pragma mapbox: initialize lowp float offset\\n#pragma mapbox: initialize mediump float width\\n#pragma mapbox: initialize lowp float floorwidth\\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),\n di = gi("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),\n _i = gi("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\\n#pragma mapbox: define lowp float opacity\\nvoid main() {\\n#pragma mapbox: initialize lowp float opacity\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}"),\n fi = gi("#define SDF_PX 8.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"),\n mi = gi("#define SDF_PX 8.0\\n#define SDF 1.0\\n#define ICON 0.0\\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\\n#ifdef OVERDRAW_INSPECTOR\\ngl_FragColor=vec4(1.0);\\n#endif\\n}", "const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\\n#pragma mapbox: define highp vec4 fill_color\\n#pragma mapbox: define highp vec4 halo_color\\n#pragma mapbox: define lowp float opacity\\n#pragma mapbox: define lowp float halo_width\\n#pragma mapbox: define lowp float halo_blur\\nvoid main() {\\n#pragma mapbox: initialize highp vec4 fill_color\\n#pragma mapbox: initialize highp vec4 halo_color\\n#pragma mapbox: initialize lowp float opacity\\n#pragma mapbox: initialize lowp float halo_width\\n#pragma mapbox: initialize lowp float halo_blur\\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\\ncamera_to_anchor_distance/u_camera_to_center_distance :\\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}");\n\n function gi(t, e) {\n var i = /#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g,\n o = e.match(/attribute ([\\w]+) ([\\w]+)/g),\n r = t.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),\n a = e.match(/uniform ([\\w]+) ([\\w]+)([\\s]*)([\\w]*)/g),\n n = a ? a.concat(r) : r,\n s = {};\n return {\n fragmentSource: t = t.replace(i, function (t, e, i, o, r) {\n return s[r] = !0, "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nvarying " + i + " " + o + " " + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "\\n#ifdef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n";\n }),\n vertexSource: e = e.replace(i, function (t, e, i, o, r) {\n var a = "float" === o ? "vec2" : "vec4",\n n = r.match(/color/) ? "color" : a;\n return s[r] ? "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nuniform lowp float u_" + r + "_t;\\nattribute " + i + " " + a + " a_" + r + ";\\nvarying " + i + " " + o + " " + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "vec4" === n ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + r + " = a_" + r + ";\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + r + " = unpack_mix_" + n + "(a_" + r + ", u_" + r + "_t);\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "define" === e ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\nuniform lowp float u_" + r + "_t;\\nattribute " + i + " " + a + " a_" + r + ";\\n#else\\nuniform " + i + " " + o + " u_" + r + ";\\n#endif\\n" : "vec4" === n ? "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = a_" + r + ";\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n" : "\\n#ifndef HAS_UNIFORM_u_" + r + "\\n " + i + " " + o + " " + r + " = unpack_mix_" + n + "(a_" + r + ", u_" + r + "_t);\\n#else\\n " + i + " " + o + " " + r + " = u_" + r + ";\\n#endif\\n";\n }),\n staticAttributes: o,\n staticUniforms: n\n };\n }\n\n var vi = Object.freeze({\n __proto__: null,\n prelude: Ge,\n background: We,\n backgroundPattern: Xe,\n circle: He,\n clippingMask: Ke,\n heatmap: Ye,\n heatmapTexture: Je,\n collisionBox: Qe,\n collisionCircle: $e,\n debug: ti,\n fill: ei,\n fillOutline: ii,\n fillOutlinePattern: oi,\n fillPattern: ri,\n fillExtrusion: ai,\n fillExtrusionPattern: ni,\n hillshadePrepare: si,\n hillshade: li,\n line: ci,\n lineGradient: ui,\n linePattern: hi,\n lineSDF: pi,\n raster: di,\n symbolIcon: _i,\n symbolSDF: fi,\n symbolTextAndIcon: mi\n }),\n yi = function yi() {\n this.boundProgram = null, this.boundLayoutVertexBuffer = null, this.boundPaintVertexBuffers = [], this.boundIndexBuffer = null, this.boundVertexOffset = null, this.boundDynamicVertexBuffer = null, this.vao = null;\n };\n\n function xi(t) {\n for (var e = [], i = 0; i < t.length; i++) {\n if (null !== t[i]) {\n var o = t[i].split(" ");\n e.push(o.pop());\n }\n }\n\n return e;\n }\n\n yi.prototype.bind = function (t, e, i, o, r, a, n, s) {\n this.context = t;\n\n for (var l = this.boundPaintVertexBuffers.length !== o.length, c = 0; !l && c < o.length; c++) {\n this.boundPaintVertexBuffers[c] !== o[c] && (l = !0);\n }\n\n t.extVertexArrayObject && this.vao && this.boundProgram === e && this.boundLayoutVertexBuffer === i && !l && this.boundIndexBuffer === r && this.boundVertexOffset === a && this.boundDynamicVertexBuffer === n && this.boundDynamicVertexBuffer2 === s ? (t.bindVertexArrayOES.set(this.vao), n && n.bind(), r && r.dynamicDraw && r.bind(), s && s.bind()) : this.freshBind(e, i, o, r, a, n, s);\n }, yi.prototype.freshBind = function (t, e, i, o, r, a, n) {\n var s,\n l = t.numAttributes,\n c = this.context,\n u = c.gl;\n if (c.extVertexArrayObject) this.vao && this.destroy(), this.vao = c.extVertexArrayObject.createVertexArrayOES(), c.bindVertexArrayOES.set(this.vao), s = 0, this.boundProgram = t, this.boundLayoutVertexBuffer = e, this.boundPaintVertexBuffers = i, this.boundIndexBuffer = o, this.boundVertexOffset = r, this.boundDynamicVertexBuffer = a, this.boundDynamicVertexBuffer2 = n;else {\n s = c.currentNumAttributes || 0;\n\n for (var h = l; h < s; h++) {\n u.disableVertexAttribArray(h);\n }\n }\n e.enableAttributes(u, t);\n\n for (var p = 0, d = i; p < d.length; p += 1) {\n d[p].enableAttributes(u, t);\n }\n\n a && a.enableAttributes(u, t), n && n.enableAttributes(u, t), e.bind(), e.setVertexAttribPointers(u, t, r);\n\n for (var _ = 0, f = i; _ < f.length; _ += 1) {\n var m = f[_];\n m.bind(), m.setVertexAttribPointers(u, t, r);\n }\n\n a && (a.bind(), a.setVertexAttribPointers(u, t, r)), o && o.bind(), n && (n.bind(), n.setVertexAttribPointers(u, t, r)), c.currentNumAttributes = l;\n }, yi.prototype.destroy = function () {\n this.vao && (this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao), this.vao = null);\n };\n\n var bi = function bi(t, e, i, o, r, a) {\n var n = t.gl;\n this.program = n.createProgram();\n\n for (var s = xi(i.staticAttributes), l = o ? o.getBinderAttributes() : [], c = s.concat(l), u = i.staticUniforms ? xi(i.staticUniforms) : [], h = o ? o.getBinderUniforms() : [], p = [], d = 0, _ = u.concat(h); d < _.length; d += 1) {\n var f = _[d];\n p.indexOf(f) < 0 && p.push(f);\n }\n\n var m = o ? o.defines() : [];\n a && m.push("#define OVERDRAW_INSPECTOR;");\n var g = m.concat(Ge.fragmentSource, i.fragmentSource).join("\\n"),\n v = m.concat(Ge.vertexSource, i.vertexSource).join("\\n"),\n y = n.createShader(n.FRAGMENT_SHADER);\n if (n.isContextLost()) this.failedToCreate = !0;else {\n n.shaderSource(y, g), n.compileShader(y), n.attachShader(this.program, y);\n var x = n.createShader(n.VERTEX_SHADER);\n if (n.isContextLost()) this.failedToCreate = !0;else {\n n.shaderSource(x, v), n.compileShader(x), n.attachShader(this.program, x), this.attributes = {};\n var b = {};\n this.numAttributes = c.length;\n\n for (var w = 0; w < this.numAttributes; w++) {\n c[w] && (n.bindAttribLocation(this.program, w, c[w]), this.attributes[c[w]] = w);\n }\n\n n.linkProgram(this.program), n.deleteShader(x), n.deleteShader(y);\n\n for (var T = 0; T < p.length; T++) {\n var E = p[T];\n\n if (E && !b[E]) {\n var I = n.getUniformLocation(this.program, E);\n I && (b[E] = I);\n }\n }\n\n this.fixedUniforms = r(t, b), this.binderUniforms = o ? o.getUniforms(t, b) : [];\n }\n }\n };\n\n function wi(t, e, i) {\n var o = 1 / pe(i, 1, e.transform.tileZoom),\n r = Math.pow(2, i.tileID.overscaledZ),\n a = i.tileSize * Math.pow(2, e.transform.tileZoom) / r,\n n = a * (i.tileID.canonical.x + i.tileID.wrap * r),\n s = a * i.tileID.canonical.y;\n return {\n u_image: 0,\n u_texsize: i.imageAtlasTexture.size,\n u_scale: [o, t.fromScale, t.toScale],\n u_fade: t.t,\n u_pixel_coord_upper: [n >> 16, s >> 16],\n u_pixel_coord_lower: [65535 & n, 65535 & s]\n };\n }\n\n bi.prototype.draw = function (t, e, i, o, r, a, n, s, l, c, u, h, p, d, _, f) {\n var m,\n g = t.gl;\n\n if (!this.failedToCreate) {\n for (var v in t.program.set(this.program), t.setDepthMode(i), t.setStencilMode(o), t.setColorMode(r), t.setCullFace(a), this.fixedUniforms) {\n this.fixedUniforms[v].set(n[v]);\n }\n\n d && d.setUniforms(t, this.binderUniforms, h, {\n zoom: p\n });\n\n for (var y = (m = {}, m[g.LINES] = 2, m[g.TRIANGLES] = 3, m[g.LINE_STRIP] = 1, m)[e], x = 0, b = u.get(); x < b.length; x += 1) {\n var w = b[x],\n T = w.vaos || (w.vaos = {});\n (T[s] || (T[s] = new yi())).bind(t, this, l, d ? d.getPaintVertexBuffers() : [], c, w.vertexOffset, _, f), g.drawElements(e, w.primitiveLength * y, g.UNSIGNED_SHORT, w.primitiveOffset * y * 2);\n }\n }\n };\n\n var Ti = function Ti(e, i, o, r) {\n var a = i.style.light,\n n = a.properties.get("position"),\n s = [n.x, n.y, n.z],\n l = t.create$1();\n "viewport" === a.properties.get("anchor") && t.fromRotation(l, -i.transform.angle), t.transformMat3(s, s, l);\n var c = a.properties.get("color");\n return {\n u_matrix: e,\n u_lightpos: s,\n u_lightintensity: a.properties.get("intensity"),\n u_lightcolor: [c.r, c.g, c.b],\n u_vertical_gradient: +o,\n u_opacity: r\n };\n },\n Ei = function Ei(e, i, o, r, a, n, s) {\n return t.extend(Ti(e, i, o, r), wi(n, i, s), {\n u_height_factor: -Math.pow(2, a.overscaledZ) / s.tileSize / 8\n });\n },\n Ii = function Ii(t) {\n return {\n u_matrix: t\n };\n },\n Pi = function Pi(e, i, o, r) {\n return t.extend(Ii(e), wi(o, i, r));\n },\n Si = function Si(t, e) {\n return {\n u_matrix: t,\n u_world: e\n };\n },\n Ci = function Ci(e, i, o, r, a) {\n return t.extend(Pi(e, i, o, r), {\n u_world: a\n });\n },\n zi = function zi(e, i, o, r) {\n var a,\n n,\n s = e.transform;\n\n if ("map" === r.paint.get("circle-pitch-alignment")) {\n var l = pe(o, 1, s.zoom);\n a = !0, n = [l, l];\n } else a = !1, n = s.pixelsToGLUnits;\n\n return {\n u_camera_to_center_distance: s.cameraToCenterDistance,\n u_scale_with_map: +("map" === r.paint.get("circle-pitch-scale")),\n u_matrix: e.translatePosMatrix(i.posMatrix, o, r.paint.get("circle-translate"), r.paint.get("circle-translate-anchor")),\n u_pitch_with_map: +a,\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_extrude_scale: n\n };\n },\n Di = function Di(t, e, i) {\n var o = pe(i, 1, e.zoom),\n r = Math.pow(2, e.zoom - i.tileID.overscaledZ),\n a = i.tileID.overscaleFactor();\n return {\n u_matrix: t,\n u_camera_to_center_distance: e.cameraToCenterDistance,\n u_pixels_to_tile_units: o,\n u_extrude_scale: [e.pixelsToGLUnits[0] / (o * r), e.pixelsToGLUnits[1] / (o * r)],\n u_overscale_factor: a\n };\n },\n Ai = function Ai(t, e, i) {\n return {\n u_matrix: t,\n u_inv_matrix: e,\n u_camera_to_center_distance: i.cameraToCenterDistance,\n u_viewport_size: [i.width, i.height]\n };\n },\n Mi = function Mi(t, e, i) {\n return void 0 === i && (i = 1), {\n u_matrix: t,\n u_color: e,\n u_overlay: 0,\n u_overlay_scale: i\n };\n },\n Li = function Li(t) {\n return {\n u_matrix: t\n };\n },\n Ri = function Ri(t, e, i, o) {\n return {\n u_matrix: t,\n u_extrude_scale: pe(e, 1, i),\n u_intensity: o\n };\n },\n ki = function ki(e, i, o) {\n var r = e.transform;\n return {\n u_matrix: Ni(e, i, o),\n u_ratio: 1 / pe(i, 1, r.zoom),\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_units_to_pixels: [1 / r.pixelsToGLUnits[0], 1 / r.pixelsToGLUnits[1]]\n };\n },\n Bi = function Bi(e, i, o, r) {\n return t.extend(ki(e, i, o), {\n u_image: 0,\n u_image_height: r\n });\n },\n Oi = function Oi(e, i, o, r) {\n var a = e.transform,\n n = Ui(i, a);\n return {\n u_matrix: Ni(e, i, o),\n u_texsize: i.imageAtlasTexture.size,\n u_ratio: 1 / pe(i, 1, a.zoom),\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_image: 0,\n u_scale: [n, r.fromScale, r.toScale],\n u_fade: r.t,\n u_units_to_pixels: [1 / a.pixelsToGLUnits[0], 1 / a.pixelsToGLUnits[1]]\n };\n },\n Fi = function Fi(e, i, o, r, a) {\n var n = e.lineAtlas,\n s = Ui(i, e.transform),\n l = "round" === o.layout.get("line-cap"),\n c = n.getDash(r.from, l),\n u = n.getDash(r.to, l),\n h = c.width * a.fromScale,\n p = u.width * a.toScale;\n return t.extend(ki(e, i, o), {\n u_patternscale_a: [s / h, -c.height / 2],\n u_patternscale_b: [s / p, -u.height / 2],\n u_sdfgamma: n.width / (256 * Math.min(h, p) * t.browser.devicePixelRatio) / 2,\n u_image: 0,\n u_tex_y_a: c.y,\n u_tex_y_b: u.y,\n u_mix: a.t\n });\n };\n\n function Ui(t, e) {\n return 1 / pe(t, 1, e.tileZoom);\n }\n\n function Ni(t, e, i) {\n return t.translatePosMatrix(e.tileID.posMatrix, e, i.paint.get("line-translate"), i.paint.get("line-translate-anchor"));\n }\n\n var Zi = function Zi(t, e, i, o, r) {\n return {\n u_matrix: t,\n u_tl_parent: e,\n u_scale_parent: i,\n u_buffer_scale: 1,\n u_fade_t: o.mix,\n u_opacity: o.opacity * r.paint.get("raster-opacity"),\n u_image0: 0,\n u_image1: 1,\n u_brightness_low: r.paint.get("raster-brightness-min"),\n u_brightness_high: r.paint.get("raster-brightness-max"),\n u_saturation_factor: (n = r.paint.get("raster-saturation"), n > 0 ? 1 - 1 / (1.001 - n) : -n),\n u_contrast_factor: (a = r.paint.get("raster-contrast"), a > 0 ? 1 / (1 - a) : 1 + a),\n u_spin_weights: qi(r.paint.get("raster-hue-rotate"))\n };\n var a, n;\n };\n\n function qi(t) {\n t *= Math.PI / 180;\n var e = Math.sin(t),\n i = Math.cos(t);\n return [(2 * i + 1) / 3, (-Math.sqrt(3) * e - i + 1) / 3, (Math.sqrt(3) * e - i + 1) / 3];\n }\n\n var ji,\n Vi = function Vi(t, e, i, o, r, a, n, s, l, c) {\n var u = r.transform;\n return {\n u_is_size_zoom_constant: +("constant" === t || "source" === t),\n u_is_size_feature_constant: +("constant" === t || "camera" === t),\n u_size_t: e ? e.uSizeT : 0,\n u_size: e ? e.uSize : 0,\n u_camera_to_center_distance: u.cameraToCenterDistance,\n u_pitch: u.pitch / 360 * 2 * Math.PI,\n u_rotate_symbol: +i,\n u_aspect_ratio: u.width / u.height,\n u_fade_change: r.options.fadeDuration ? r.symbolFadeChange : 1,\n u_matrix: a,\n u_label_plane_matrix: n,\n u_coord_matrix: s,\n u_is_text: +l,\n u_pitch_with_map: +o,\n u_texsize: c,\n u_texture: 0\n };\n },\n Gi = function Gi(e, i, o, r, a, n, s, l, c, u, h) {\n var p = a.transform;\n return t.extend(Vi(e, i, o, r, a, n, s, l, c, u), {\n u_gamma_scale: r ? Math.cos(p._pitch) * p.cameraToCenterDistance : 1,\n u_device_pixel_ratio: t.browser.devicePixelRatio,\n u_is_halo: +h\n });\n },\n Wi = function Wi(e, i, o, r, a, n, s, l, c, u) {\n return t.extend(Gi(e, i, o, r, a, n, s, l, !0, c, !0), {\n u_texsize_icon: u,\n u_texture_icon: 1\n });\n },\n Xi = function Xi(t, e, i) {\n return {\n u_matrix: t,\n u_opacity: e,\n u_color: i\n };\n },\n Hi = function Hi(e, i, o, r, a, n) {\n return t.extend(function (t, e, i, o) {\n var r = i.imageManager.getPattern(t.from.toString()),\n a = i.imageManager.getPattern(t.to.toString()),\n n = i.imageManager.getPixelSize(),\n s = n.width,\n l = n.height,\n c = Math.pow(2, o.tileID.overscaledZ),\n u = o.tileSize * Math.pow(2, i.transform.tileZoom) / c,\n h = u * (o.tileID.canonical.x + o.tileID.wrap * c),\n p = u * o.tileID.canonical.y;\n return {\n u_image: 0,\n u_pattern_tl_a: r.tl,\n u_pattern_br_a: r.br,\n u_pattern_tl_b: a.tl,\n u_pattern_br_b: a.br,\n u_texsize: [s, l],\n u_mix: e.t,\n u_pattern_size_a: r.displaySize,\n u_pattern_size_b: a.displaySize,\n u_scale_a: e.fromScale,\n u_scale_b: e.toScale,\n u_tile_units_to_pixels: 1 / pe(o, 1, i.transform.tileZoom),\n u_pixel_coord_upper: [h >> 16, p >> 16],\n u_pixel_coord_lower: [65535 & h, 65535 & p]\n };\n }(r, n, o, a), {\n u_matrix: e,\n u_opacity: i\n });\n },\n Ki = {\n fillExtrusion: function fillExtrusion(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_lightpos: new t.Uniform3f(e, i.u_lightpos),\n u_lightintensity: new t.Uniform1f(e, i.u_lightintensity),\n u_lightcolor: new t.Uniform3f(e, i.u_lightcolor),\n u_vertical_gradient: new t.Uniform1f(e, i.u_vertical_gradient),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n fillExtrusionPattern: function fillExtrusionPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_lightpos: new t.Uniform3f(e, i.u_lightpos),\n u_lightintensity: new t.Uniform1f(e, i.u_lightintensity),\n u_lightcolor: new t.Uniform3f(e, i.u_lightcolor),\n u_vertical_gradient: new t.Uniform1f(e, i.u_vertical_gradient),\n u_height_factor: new t.Uniform1f(e, i.u_height_factor),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n fill: function fill(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n fillPattern: function fillPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n fillOutline: function fillOutline(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world)\n };\n },\n fillOutlinePattern: function fillOutlinePattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world),\n u_image: new t.Uniform1i(e, i.u_image),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n circle: function circle(e, i) {\n return {\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_scale_with_map: new t.Uniform1i(e, i.u_scale_with_map),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_extrude_scale: new t.Uniform2f(e, i.u_extrude_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n collisionBox: function collisionBox(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pixels_to_tile_units: new t.Uniform1f(e, i.u_pixels_to_tile_units),\n u_extrude_scale: new t.Uniform2f(e, i.u_extrude_scale),\n u_overscale_factor: new t.Uniform1f(e, i.u_overscale_factor)\n };\n },\n collisionCircle: function collisionCircle(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_inv_matrix: new t.UniformMatrix4f(e, i.u_inv_matrix),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_viewport_size: new t.Uniform2f(e, i.u_viewport_size)\n };\n },\n debug: function debug(e, i) {\n return {\n u_color: new t.UniformColor(e, i.u_color),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_overlay: new t.Uniform1i(e, i.u_overlay),\n u_overlay_scale: new t.Uniform1f(e, i.u_overlay_scale)\n };\n },\n clippingMask: function clippingMask(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n heatmap: function heatmap(e, i) {\n return {\n u_extrude_scale: new t.Uniform1f(e, i.u_extrude_scale),\n u_intensity: new t.Uniform1f(e, i.u_intensity),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix)\n };\n },\n heatmapTexture: function heatmapTexture(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_world: new t.Uniform2f(e, i.u_world),\n u_image: new t.Uniform1i(e, i.u_image),\n u_color_ramp: new t.Uniform1i(e, i.u_color_ramp),\n u_opacity: new t.Uniform1f(e, i.u_opacity)\n };\n },\n hillshade: function hillshade(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_latrange: new t.Uniform2f(e, i.u_latrange),\n u_light: new t.Uniform2f(e, i.u_light),\n u_shadow: new t.UniformColor(e, i.u_shadow),\n u_highlight: new t.UniformColor(e, i.u_highlight),\n u_accent: new t.UniformColor(e, i.u_accent)\n };\n },\n hillshadePrepare: function hillshadePrepare(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_image: new t.Uniform1i(e, i.u_image),\n u_dimension: new t.Uniform2f(e, i.u_dimension),\n u_zoom: new t.Uniform1f(e, i.u_zoom),\n u_unpack: new t.Uniform4f(e, i.u_unpack)\n };\n },\n line: function line(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels)\n };\n },\n lineGradient: function lineGradient(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_image: new t.Uniform1i(e, i.u_image),\n u_image_height: new t.Uniform1f(e, i.u_image_height)\n };\n },\n linePattern: function linePattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_image: new t.Uniform1i(e, i.u_image),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_scale: new t.Uniform3f(e, i.u_scale),\n u_fade: new t.Uniform1f(e, i.u_fade)\n };\n },\n lineSDF: function lineSDF(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_ratio: new t.Uniform1f(e, i.u_ratio),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_units_to_pixels: new t.Uniform2f(e, i.u_units_to_pixels),\n u_patternscale_a: new t.Uniform2f(e, i.u_patternscale_a),\n u_patternscale_b: new t.Uniform2f(e, i.u_patternscale_b),\n u_sdfgamma: new t.Uniform1f(e, i.u_sdfgamma),\n u_image: new t.Uniform1i(e, i.u_image),\n u_tex_y_a: new t.Uniform1f(e, i.u_tex_y_a),\n u_tex_y_b: new t.Uniform1f(e, i.u_tex_y_b),\n u_mix: new t.Uniform1f(e, i.u_mix)\n };\n },\n raster: function raster(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_tl_parent: new t.Uniform2f(e, i.u_tl_parent),\n u_scale_parent: new t.Uniform1f(e, i.u_scale_parent),\n u_buffer_scale: new t.Uniform1f(e, i.u_buffer_scale),\n u_fade_t: new t.Uniform1f(e, i.u_fade_t),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_image0: new t.Uniform1i(e, i.u_image0),\n u_image1: new t.Uniform1i(e, i.u_image1),\n u_brightness_low: new t.Uniform1f(e, i.u_brightness_low),\n u_brightness_high: new t.Uniform1f(e, i.u_brightness_high),\n u_saturation_factor: new t.Uniform1f(e, i.u_saturation_factor),\n u_contrast_factor: new t.Uniform1f(e, i.u_contrast_factor),\n u_spin_weights: new t.Uniform3f(e, i.u_spin_weights)\n };\n },\n symbolIcon: function symbolIcon(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texture: new t.Uniform1i(e, i.u_texture)\n };\n },\n symbolSDF: function symbolSDF(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texture: new t.Uniform1i(e, i.u_texture),\n u_gamma_scale: new t.Uniform1f(e, i.u_gamma_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_is_halo: new t.Uniform1i(e, i.u_is_halo)\n };\n },\n symbolTextAndIcon: function symbolTextAndIcon(e, i) {\n return {\n u_is_size_zoom_constant: new t.Uniform1i(e, i.u_is_size_zoom_constant),\n u_is_size_feature_constant: new t.Uniform1i(e, i.u_is_size_feature_constant),\n u_size_t: new t.Uniform1f(e, i.u_size_t),\n u_size: new t.Uniform1f(e, i.u_size),\n u_camera_to_center_distance: new t.Uniform1f(e, i.u_camera_to_center_distance),\n u_pitch: new t.Uniform1f(e, i.u_pitch),\n u_rotate_symbol: new t.Uniform1i(e, i.u_rotate_symbol),\n u_aspect_ratio: new t.Uniform1f(e, i.u_aspect_ratio),\n u_fade_change: new t.Uniform1f(e, i.u_fade_change),\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_label_plane_matrix: new t.UniformMatrix4f(e, i.u_label_plane_matrix),\n u_coord_matrix: new t.UniformMatrix4f(e, i.u_coord_matrix),\n u_is_text: new t.Uniform1i(e, i.u_is_text),\n u_pitch_with_map: new t.Uniform1i(e, i.u_pitch_with_map),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_texsize_icon: new t.Uniform2f(e, i.u_texsize_icon),\n u_texture: new t.Uniform1i(e, i.u_texture),\n u_texture_icon: new t.Uniform1i(e, i.u_texture_icon),\n u_gamma_scale: new t.Uniform1f(e, i.u_gamma_scale),\n u_device_pixel_ratio: new t.Uniform1f(e, i.u_device_pixel_ratio),\n u_is_halo: new t.Uniform1i(e, i.u_is_halo)\n };\n },\n background: function background(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_color: new t.UniformColor(e, i.u_color)\n };\n },\n backgroundPattern: function backgroundPattern(e, i) {\n return {\n u_matrix: new t.UniformMatrix4f(e, i.u_matrix),\n u_opacity: new t.Uniform1f(e, i.u_opacity),\n u_image: new t.Uniform1i(e, i.u_image),\n u_pattern_tl_a: new t.Uniform2f(e, i.u_pattern_tl_a),\n u_pattern_br_a: new t.Uniform2f(e, i.u_pattern_br_a),\n u_pattern_tl_b: new t.Uniform2f(e, i.u_pattern_tl_b),\n u_pattern_br_b: new t.Uniform2f(e, i.u_pattern_br_b),\n u_texsize: new t.Uniform2f(e, i.u_texsize),\n u_mix: new t.Uniform1f(e, i.u_mix),\n u_pattern_size_a: new t.Uniform2f(e, i.u_pattern_size_a),\n u_pattern_size_b: new t.Uniform2f(e, i.u_pattern_size_b),\n u_scale_a: new t.Uniform1f(e, i.u_scale_a),\n u_scale_b: new t.Uniform1f(e, i.u_scale_b),\n u_pixel_coord_upper: new t.Uniform2f(e, i.u_pixel_coord_upper),\n u_pixel_coord_lower: new t.Uniform2f(e, i.u_pixel_coord_lower),\n u_tile_units_to_pixels: new t.Uniform1f(e, i.u_tile_units_to_pixels)\n };\n }\n };\n\n function Yi(e, i, o, r, a, n, s) {\n for (var l = e.context, c = l.gl, u = e.useProgram("collisionBox"), h = [], p = 0, d = 0, _ = 0; _ < r.length; _++) {\n var f = r[_],\n m = i.getTile(f),\n g = m.getBucket(o);\n\n if (g) {\n var v = f.posMatrix;\n 0 === a[0] && 0 === a[1] || (v = e.translatePosMatrix(f.posMatrix, m, a, n));\n var y = s ? g.textCollisionBox : g.iconCollisionBox,\n x = g.collisionCircleArray;\n\n if (x.length > 0) {\n var b = t.create(),\n w = v;\n t.mul(b, g.placementInvProjMatrix, e.transform.glCoordMatrix), t.mul(b, b, g.placementViewportMatrix), h.push({\n circleArray: x,\n circleOffset: d,\n transform: w,\n invTransform: b\n }), d = p += x.length / 4;\n }\n\n y && u.draw(l, c.LINES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, Di(v, e.transform, m), o.id, y.layoutVertexBuffer, y.indexBuffer, y.segments, null, e.transform.zoom, null, null, y.collisionVertexBuffer);\n }\n }\n\n if (s && h.length) {\n var T = e.useProgram("collisionCircle"),\n E = new t.StructArrayLayout2f1f2i16();\n E.resize(4 * p), E._trim();\n\n for (var I = 0, P = 0, S = h; P < S.length; P += 1) {\n for (var C = S[P], z = 0; z < C.circleArray.length / 4; z++) {\n var D = 4 * z,\n A = C.circleArray[D + 0],\n M = C.circleArray[D + 1],\n L = C.circleArray[D + 2],\n R = C.circleArray[D + 3];\n E.emplace(I++, A, M, L, R, 0), E.emplace(I++, A, M, L, R, 1), E.emplace(I++, A, M, L, R, 2), E.emplace(I++, A, M, L, R, 3);\n }\n }\n\n (!ji || ji.length < 2 * p) && (ji = function (e) {\n var i = 2 * e,\n o = new t.StructArrayLayout3ui6();\n o.resize(i), o._trim();\n\n for (var r = 0; r < i; r++) {\n var a = 6 * r;\n o.uint16[a + 0] = 4 * r + 0, o.uint16[a + 1] = 4 * r + 1, o.uint16[a + 2] = 4 * r + 2, o.uint16[a + 3] = 4 * r + 2, o.uint16[a + 4] = 4 * r + 3, o.uint16[a + 5] = 4 * r + 0;\n }\n\n return o;\n }(p));\n\n for (var k = l.createIndexBuffer(ji, !0), B = l.createVertexBuffer(E, t.collisionCircleLayout.members, !0), O = 0, F = h; O < F.length; O += 1) {\n var U = F[O],\n N = Ai(U.transform, U.invTransform, e.transform);\n T.draw(l, c.TRIANGLES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, N, o.id, B, k, t.SegmentVector.simpleSegment(0, 2 * U.circleOffset, U.circleArray.length, U.circleArray.length / 2), null, e.transform.zoom, null, null, null);\n }\n\n B.destroy(), k.destroy();\n }\n }\n\n var Ji = t.identity(new Float32Array(16));\n\n function Qi(e, i, o, r, a, n) {\n var s = t.getAnchorAlignment(e),\n l = -(s.horizontalAlign - .5) * i,\n c = -(s.verticalAlign - .5) * o,\n u = t.evaluateVariableOffset(e, r);\n return new t.Point((l / a + u[0]) * n, (c / a + u[1]) * n);\n }\n\n function $i(e, i, o, r, a, n, s, l, c, u, h) {\n var p = e.text.placedSymbolArray,\n d = e.text.dynamicLayoutVertexArray,\n _ = e.icon.dynamicLayoutVertexArray,\n f = {};\n d.clear();\n\n for (var m = 0; m < p.length; m++) {\n var g = p.get(m),\n v = g.hidden || !g.crossTileID || e.allowVerticalPlacement && !g.placedOrientation ? null : r[g.crossTileID];\n\n if (v) {\n var y = new t.Point(g.anchorX, g.anchorY),\n x = $t(y, o ? l : s),\n b = te(n.cameraToCenterDistance, x.signedDistanceFromCamera),\n w = a.evaluateSizeForFeature(e.textSizeData, u, g) * b / t.ONE_EM;\n o && (w *= e.tilePixelRatio / c);\n\n for (var T = Qi(v.anchor, v.width, v.height, v.textOffset, v.textBoxScale, w), E = o ? $t(y.add(T), s).point : x.point.add(i ? T.rotate(-n.angle) : T), I = e.allowVerticalPlacement && g.placedOrientation === t.WritingMode.vertical ? Math.PI / 2 : 0, P = 0; P < g.numGlyphs; P++) {\n t.addDynamicAttributes(d, E, I);\n }\n\n h && g.associatedIconIndex >= 0 && (f[g.associatedIconIndex] = {\n shiftedAnchor: E,\n angle: I\n });\n } else ce(g.numGlyphs, d);\n }\n\n if (h) {\n _.clear();\n\n for (var S = e.icon.placedSymbolArray, C = 0; C < S.length; C++) {\n var z = S.get(C);\n if (z.hidden) ce(z.numGlyphs, _);else {\n var D = f[C];\n if (D) for (var A = 0; A < z.numGlyphs; A++) {\n t.addDynamicAttributes(_, D.shiftedAnchor, D.angle);\n } else ce(z.numGlyphs, _);\n }\n }\n\n e.icon.dynamicLayoutVertexBuffer.updateData(_);\n }\n\n e.text.dynamicLayoutVertexBuffer.updateData(d);\n }\n\n function to(t, e, i) {\n return i.iconsInText && e ? "symbolTextAndIcon" : t ? "symbolSDF" : "symbolIcon";\n }\n\n function eo(e, i, o, r, a, n, s, l, c, u, h, p) {\n for (var d = e.context, _ = d.gl, f = e.transform, m = "map" === l, g = "map" === c, v = m && "point" !== o.layout.get("symbol-placement"), y = m && !g && !v, x = !o.layout.get("symbol-sort-key").isConstant(), b = !1, w = e.depthModeForSublayer(0, It.ReadOnly), T = o.layout.get("text-variable-anchor"), E = [], I = 0, P = r; I < P.length; I += 1) {\n var S = P[I],\n C = i.getTile(S),\n z = C.getBucket(o);\n\n if (z) {\n var D = a ? z.text : z.icon;\n\n if (D && D.segments.get().length) {\n var A = D.programConfigurations.get(o.id),\n M = a || z.sdfIcons,\n L = a ? z.textSizeData : z.iconSizeData,\n R = g || 0 !== f.pitch,\n k = e.useProgram(to(M, a, z), A),\n B = t.evaluateSizeForZoom(L, f.zoom),\n O = void 0,\n F = [0, 0],\n U = void 0,\n N = void 0,\n Z = null,\n q = void 0;\n if (a) U = C.glyphAtlasTexture, N = _.LINEAR, O = C.glyphAtlasTexture.size, z.iconsInText && (F = C.imageAtlasTexture.size, Z = C.imageAtlasTexture, q = R || e.options.rotating || e.options.zooming || "composite" === L.kind || "camera" === L.kind ? _.LINEAR : _.NEAREST);else {\n var j = 1 !== o.layout.get("icon-size").constantOr(0) || z.iconsNeedLinear;\n U = C.imageAtlasTexture, N = M || e.options.rotating || e.options.zooming || j || R ? _.LINEAR : _.NEAREST, O = C.imageAtlasTexture.size;\n }\n var V = pe(C, 1, e.transform.zoom),\n G = Jt(S.posMatrix, g, m, e.transform, V),\n W = Qt(S.posMatrix, g, m, e.transform, V),\n X = T && z.hasTextData(),\n H = "none" !== o.layout.get("icon-text-fit") && X && z.hasIconData();\n v && ie(z, S.posMatrix, e, a, G, W, g, u);\n var K = e.translatePosMatrix(S.posMatrix, C, n, s),\n Y = v || a && T || H ? Ji : G,\n J = e.translatePosMatrix(W, C, n, s, !0),\n Q = M && 0 !== o.paint.get(a ? "text-halo-width" : "icon-halo-width").constantOr(1),\n $ = {\n program: k,\n buffers: D,\n uniformValues: M ? z.iconsInText ? Wi(L.kind, B, y, g, e, K, Y, J, O, F) : Gi(L.kind, B, y, g, e, K, Y, J, a, O, !0) : Vi(L.kind, B, y, g, e, K, Y, J, a, O),\n atlasTexture: U,\n atlasTextureIcon: Z,\n atlasInterpolation: N,\n atlasInterpolationIcon: q,\n isSDF: M,\n hasHalo: Q\n };\n\n if (x && z.canOverlap) {\n b = !0;\n\n for (var tt = 0, et = D.segments.get(); tt < et.length; tt += 1) {\n var it = et[tt];\n E.push({\n segments: new t.SegmentVector([it]),\n sortKey: it.sortKey,\n state: $\n });\n }\n } else E.push({\n segments: D.segments,\n sortKey: 0,\n state: $\n });\n }\n }\n }\n\n b && E.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var ot = 0, rt = E; ot < rt.length; ot += 1) {\n var at = rt[ot],\n nt = at.state;\n\n if (d.activeTexture.set(_.TEXTURE0), nt.atlasTexture.bind(nt.atlasInterpolation, _.CLAMP_TO_EDGE), nt.atlasTextureIcon && (d.activeTexture.set(_.TEXTURE1), nt.atlasTextureIcon && nt.atlasTextureIcon.bind(nt.atlasInterpolationIcon, _.CLAMP_TO_EDGE)), nt.isSDF) {\n var st = nt.uniformValues;\n nt.hasHalo && (st.u_is_halo = 1, io(nt.buffers, at.segments, o, e, nt.program, w, h, p, st)), st.u_is_halo = 0;\n }\n\n io(nt.buffers, at.segments, o, e, nt.program, w, h, p, nt.uniformValues);\n }\n }\n\n function io(t, e, i, o, r, a, n, s, l) {\n var c = o.context;\n r.draw(c, c.gl.TRIANGLES, a, n, s, Ct.disabled, l, i.id, t.layoutVertexBuffer, t.indexBuffer, e, i.paint, o.transform.zoom, t.programConfigurations.get(i.id), t.dynamicLayoutVertexBuffer, t.opacityVertexBuffer);\n }\n\n function oo(t, e, i, o, r, a, n) {\n var s,\n l,\n c,\n u,\n h,\n p = t.context.gl,\n d = i.paint.get("fill-pattern"),\n _ = d && d.constantOr(1),\n f = i.getCrossfadeParameters();\n\n n ? (l = _ && !i.getPaintProperty("fill-outline-color") ? "fillOutlinePattern" : "fillOutline", s = p.LINES) : (l = _ ? "fillPattern" : "fill", s = p.TRIANGLES);\n\n for (var m = 0, g = o; m < g.length; m += 1) {\n var v = g[m],\n y = e.getTile(v);\n\n if (!_ || y.patternsLoaded()) {\n var x = y.getBucket(i);\n\n if (x) {\n var b = x.programConfigurations.get(i.id),\n w = t.useProgram(l, b);\n _ && (t.context.activeTexture.set(p.TEXTURE0), y.imageAtlasTexture.bind(p.LINEAR, p.CLAMP_TO_EDGE), b.updatePaintBuffers(f));\n var T = d.constantOr(null);\n\n if (T && y.imageAtlas) {\n var E = y.imageAtlas,\n I = E.patternPositions[T.to.toString()],\n P = E.patternPositions[T.from.toString()];\n I && P && b.setConstantPatternPositions(I, P);\n }\n\n var S = t.translatePosMatrix(v.posMatrix, y, i.paint.get("fill-translate"), i.paint.get("fill-translate-anchor"));\n\n if (n) {\n u = x.indexBuffer2, h = x.segments2;\n var C = [p.drawingBufferWidth, p.drawingBufferHeight];\n c = "fillOutlinePattern" === l && _ ? Ci(S, t, f, y, C) : Si(S, C);\n } else u = x.indexBuffer, h = x.segments, c = _ ? Pi(S, t, f, y) : Ii(S);\n\n w.draw(t.context, s, r, t.stencilModeForClipping(v), a, Ct.disabled, c, i.id, x.layoutVertexBuffer, u, h, i.paint, t.transform.zoom, b);\n }\n }\n }\n }\n\n function ro(t, e, i, o, r, a, n) {\n for (var s = t.context, l = s.gl, c = i.paint.get("fill-extrusion-pattern"), u = c.constantOr(1), h = i.getCrossfadeParameters(), p = i.paint.get("fill-extrusion-opacity"), d = 0, _ = o; d < _.length; d += 1) {\n var f = _[d],\n m = e.getTile(f),\n g = m.getBucket(i);\n\n if (g) {\n var v = g.programConfigurations.get(i.id),\n y = t.useProgram(u ? "fillExtrusionPattern" : "fillExtrusion", v);\n u && (t.context.activeTexture.set(l.TEXTURE0), m.imageAtlasTexture.bind(l.LINEAR, l.CLAMP_TO_EDGE), v.updatePaintBuffers(h));\n var x = c.constantOr(null);\n\n if (x && m.imageAtlas) {\n var b = m.imageAtlas,\n w = b.patternPositions[x.to.toString()],\n T = b.patternPositions[x.from.toString()];\n w && T && v.setConstantPatternPositions(w, T);\n }\n\n var E = t.translatePosMatrix(f.posMatrix, m, i.paint.get("fill-extrusion-translate"), i.paint.get("fill-extrusion-translate-anchor")),\n I = i.paint.get("fill-extrusion-vertical-gradient"),\n P = u ? Ei(E, t, I, p, f, h, m) : Ti(E, t, I, p);\n y.draw(s, s.gl.TRIANGLES, r, a, n, Ct.backCCW, P, i.id, g.layoutVertexBuffer, g.indexBuffer, g.segments, i.paint, t.transform.zoom, v);\n }\n }\n }\n\n function ao(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl,\n c = i.fbo;\n\n if (c) {\n var u = e.useProgram("hillshade");\n s.activeTexture.set(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, c.colorAttachment.get());\n\n var h = function (e, i, o) {\n var r = o.paint.get("hillshade-shadow-color"),\n a = o.paint.get("hillshade-highlight-color"),\n n = o.paint.get("hillshade-accent-color"),\n s = o.paint.get("hillshade-illumination-direction") * (Math.PI / 180);\n "viewport" === o.paint.get("hillshade-illumination-anchor") && (s -= e.transform.angle);\n var l,\n c,\n u,\n h = !e.options.moving;\n return {\n u_matrix: e.transform.calculatePosMatrix(i.tileID.toUnwrapped(), h),\n u_image: 0,\n u_latrange: (l = i.tileID, c = Math.pow(2, l.canonical.z), u = l.canonical.y, [new t.MercatorCoordinate(0, u / c).toLngLat().lat, new t.MercatorCoordinate(0, (u + 1) / c).toLngLat().lat]),\n u_light: [o.paint.get("hillshade-exaggeration"), s],\n u_shadow: r,\n u_highlight: a,\n u_accent: n\n };\n }(e, i, o);\n\n u.draw(s, l.TRIANGLES, r, a, n, Ct.disabled, h, o.id, e.rasterBoundsBuffer, e.quadTriangleIndexBuffer, e.rasterBoundsSegments);\n }\n }\n\n function no(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl,\n c = i.dem;\n\n if (c && c.data) {\n var u = c.dim,\n h = c.stride,\n p = c.getPixels();\n\n if (s.activeTexture.set(l.TEXTURE1), s.pixelStoreUnpackPremultiplyAlpha.set(!1), i.demTexture = i.demTexture || e.getTileTexture(h), i.demTexture) {\n var d = i.demTexture;\n d.update(p, {\n premultiply: !1\n }), d.bind(l.NEAREST, l.CLAMP_TO_EDGE);\n } else i.demTexture = new t.Texture(s, p, l.RGBA, {\n premultiply: !1\n }), i.demTexture.bind(l.NEAREST, l.CLAMP_TO_EDGE);\n\n s.activeTexture.set(l.TEXTURE0);\n var _ = i.fbo;\n\n if (!_) {\n var f = new t.Texture(s, {\n width: u,\n height: u,\n data: null\n }, l.RGBA);\n f.bind(l.LINEAR, l.CLAMP_TO_EDGE), (_ = i.fbo = s.createFramebuffer(u, u, !0)).colorAttachment.set(f.texture);\n }\n\n s.bindFramebuffer.set(_.framebuffer), s.viewport.set([0, 0, u, u]), e.useProgram("hillshadePrepare").draw(s, l.TRIANGLES, r, a, n, Ct.disabled, function (e, i) {\n var o = i.stride,\n r = t.create();\n return t.ortho(r, 0, t.EXTENT, -t.EXTENT, 0, 0, 1), t.translate(r, r, [0, -t.EXTENT, 0]), {\n u_matrix: r,\n u_image: 1,\n u_dimension: [o, o],\n u_zoom: e.overscaledZ,\n u_unpack: i.getUnpackVector()\n };\n }(i.tileID, c), o.id, e.rasterBoundsBuffer, e.quadTriangleIndexBuffer, e.rasterBoundsSegments), i.needsHillshadePrepare = !1;\n }\n }\n\n function so(e, i, o, r, a) {\n var n = r.paint.get("raster-fade-duration");\n\n if (n > 0) {\n var s = t.browser.now(),\n l = (s - e.timeAdded) / n,\n c = i ? (s - i.timeAdded) / n : -1,\n u = o.getSource(),\n h = a.coveringZoomLevel({\n tileSize: u.tileSize,\n roundZoom: u.roundZoom\n }),\n p = !i || Math.abs(i.tileID.overscaledZ - h) > Math.abs(e.tileID.overscaledZ - h),\n d = p && e.refreshedUponExpiration ? 1 : t.clamp(p ? l : 1 - c, 0, 1);\n return e.refreshedUponExpiration && l >= 1 && (e.refreshedUponExpiration = !1), i ? {\n opacity: 1,\n mix: 1 - d\n } : {\n opacity: d,\n mix: 0\n };\n }\n\n return {\n opacity: 1,\n mix: 0\n };\n }\n\n var lo = new t.Color(1, 0, 0, 1),\n co = new t.Color(0, 1, 0, 1),\n uo = new t.Color(0, 0, 1, 1),\n ho = new t.Color(1, 0, 1, 1),\n po = new t.Color(0, 1, 1, 1);\n\n function _o(t, e, i, o) {\n mo(t, 0, e + i / 2, t.transform.width, i, o);\n }\n\n function fo(t, e, i, o) {\n mo(t, e - i / 2, 0, i, t.transform.height, o);\n }\n\n function mo(e, i, o, r, a, n) {\n var s = e.context,\n l = s.gl;\n l.enable(l.SCISSOR_TEST), l.scissor(i * t.browser.devicePixelRatio, o * t.browser.devicePixelRatio, r * t.browser.devicePixelRatio, a * t.browser.devicePixelRatio), s.clear({\n color: n\n }), l.disable(l.SCISSOR_TEST);\n }\n\n function go(e, i, o) {\n var r = e.context,\n a = r.gl,\n n = o.posMatrix,\n s = e.useProgram("debug"),\n l = It.disabled,\n c = Pt.disabled,\n u = e.colorModeForRenderPass();\n r.activeTexture.set(a.TEXTURE0), e.emptyTexture.bind(a.LINEAR, a.CLAMP_TO_EDGE), s.draw(r, a.LINE_STRIP, l, c, u, Ct.disabled, Mi(n, t.Color.red), "$debug", e.debugBuffer, e.tileBorderIndexBuffer, e.debugSegments);\n\n var h = i.getTileByID(o.key).latestRawTileData,\n p = Math.floor((h && h.byteLength || 0) / 1024),\n d = i.getTile(o).tileSize,\n _ = 512 / Math.min(d, 512) * (o.overscaledZ / e.transform.zoom) * .5,\n f = o.canonical.toString();\n\n o.overscaledZ !== o.canonical.z && (f += " => " + o.overscaledZ), function (t, e) {\n t.initDebugOverlayCanvas();\n var i = t.debugOverlayCanvas,\n o = t.context.gl,\n r = t.debugOverlayCanvas.getContext("2d");\n r.clearRect(0, 0, i.width, i.height), r.shadowColor = "white", r.shadowBlur = 2, r.lineWidth = 1.5, r.strokeStyle = "white", r.textBaseline = "top", r.font = "bold 36px Open Sans, sans-serif", r.fillText(e, 5, 5), r.strokeText(e, 5, 5), t.debugOverlayTexture.update(i), t.debugOverlayTexture.bind(o.LINEAR, o.CLAMP_TO_EDGE);\n }(e, f + " " + p + "kb"), s.draw(r, a.TRIANGLES, l, c, St.alphaBlended, Ct.disabled, Mi(n, t.Color.transparent, _), "$debug", e.debugBuffer, e.quadTriangleIndexBuffer, e.debugSegments);\n }\n\n var vo = {\n symbol: function symbol(e, i, o, r, a) {\n if ("translucent" === e.renderPass) {\n var n = Pt.disabled,\n s = e.colorModeForRenderPass();\n o.layout.get("text-variable-anchor") && function (e, i, o, r, a, n, s) {\n for (var l = i.transform, c = "map" === a, u = "map" === n, h = 0, p = e; h < p.length; h += 1) {\n var d = p[h],\n _ = r.getTile(d),\n f = _.getBucket(o);\n\n if (f && f.text && f.text.segments.get().length) {\n var m = t.evaluateSizeForZoom(f.textSizeData, l.zoom),\n g = pe(_, 1, i.transform.zoom),\n v = Jt(d.posMatrix, u, c, i.transform, g),\n y = "none" !== o.layout.get("icon-text-fit") && f.hasIconData();\n\n if (m) {\n var x = Math.pow(2, l.zoom - _.tileID.overscaledZ);\n $i(f, c, u, s, t.symbolSize, l, v, d.posMatrix, x, m, y);\n }\n }\n }\n }(r, e, o, i, o.layout.get("text-rotation-alignment"), o.layout.get("text-pitch-alignment"), a), 0 !== o.paint.get("icon-opacity").constantOr(1) && eo(e, i, o, r, !1, o.paint.get("icon-translate"), o.paint.get("icon-translate-anchor"), o.layout.get("icon-rotation-alignment"), o.layout.get("icon-pitch-alignment"), o.layout.get("icon-keep-upright"), n, s), 0 !== o.paint.get("text-opacity").constantOr(1) && eo(e, i, o, r, !0, o.paint.get("text-translate"), o.paint.get("text-translate-anchor"), o.layout.get("text-rotation-alignment"), o.layout.get("text-pitch-alignment"), o.layout.get("text-keep-upright"), n, s), i.map.showCollisionBoxes && (Yi(e, i, o, r, o.paint.get("text-translate"), o.paint.get("text-translate-anchor"), !0), Yi(e, i, o, r, o.paint.get("icon-translate"), o.paint.get("icon-translate-anchor"), !1));\n }\n },\n circle: function circle(e, i, o, r) {\n if ("translucent" === e.renderPass) {\n var a = o.paint.get("circle-opacity"),\n n = o.paint.get("circle-stroke-width"),\n s = o.paint.get("circle-stroke-opacity"),\n l = !o.layout.get("circle-sort-key").isConstant();\n\n if (0 !== a.constantOr(1) || 0 !== n.constantOr(1) && 0 !== s.constantOr(1)) {\n for (var c = e.context, u = c.gl, h = e.depthModeForSublayer(0, It.ReadOnly), p = Pt.disabled, d = e.colorModeForRenderPass(), _ = [], f = 0; f < r.length; f++) {\n var m = r[f],\n g = i.getTile(m),\n v = g.getBucket(o);\n\n if (v) {\n var y = v.programConfigurations.get(o.id),\n x = {\n programConfiguration: y,\n program: e.useProgram("circle", y),\n layoutVertexBuffer: v.layoutVertexBuffer,\n indexBuffer: v.indexBuffer,\n uniformValues: zi(e, m, g, o)\n };\n if (l) for (var b = 0, w = v.segments.get(); b < w.length; b += 1) {\n var T = w[b];\n\n _.push({\n segments: new t.SegmentVector([T]),\n sortKey: T.sortKey,\n state: x\n });\n } else _.push({\n segments: v.segments,\n sortKey: 0,\n state: x\n });\n }\n }\n\n l && _.sort(function (t, e) {\n return t.sortKey - e.sortKey;\n });\n\n for (var E = 0, I = _; E < I.length; E += 1) {\n var P = I[E],\n S = P.state;\n S.program.draw(c, u.TRIANGLES, h, p, d, Ct.disabled, S.uniformValues, o.id, S.layoutVertexBuffer, S.indexBuffer, P.segments, o.paint, e.transform.zoom, S.programConfiguration);\n }\n }\n }\n },\n heatmap: function heatmap(e, i, o, r) {\n if (0 !== o.paint.get("heatmap-opacity")) if ("offscreen" === e.renderPass) {\n var a = e.context,\n n = a.gl,\n s = Pt.disabled,\n l = new St([n.ONE, n.ONE], t.Color.transparent, [!0, !0, !0, !0]);\n !function (t, e, i) {\n var o = t.gl;\n t.activeTexture.set(o.TEXTURE1), t.viewport.set([0, 0, e.width / 4, e.height / 4]);\n var r = i.heatmapFbo;\n if (r) o.bindTexture(o.TEXTURE_2D, r.colorAttachment.get()), t.bindFramebuffer.set(r.framebuffer);else {\n var a = o.createTexture();\n o.bindTexture(o.TEXTURE_2D, a), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), r = i.heatmapFbo = t.createFramebuffer(e.width / 4, e.height / 4, !1), function (t, e, i, o) {\n var r = t.gl;\n r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e.width / 4, e.height / 4, 0, r.RGBA, t.extRenderToTextureHalfFloat ? t.extTextureHalfFloat.HALF_FLOAT_OES : r.UNSIGNED_BYTE, null), o.colorAttachment.set(i);\n }(t, e, a, r);\n }\n }(a, e, o), a.clear({\n color: t.Color.transparent\n });\n\n for (var c = 0; c < r.length; c++) {\n var u = r[c];\n\n if (!i.hasRenderableParent(u)) {\n var h = i.getTile(u),\n p = h.getBucket(o);\n\n if (p) {\n var d = p.programConfigurations.get(o.id);\n e.useProgram("heatmap", d).draw(a, n.TRIANGLES, It.disabled, s, l, Ct.disabled, Ri(u.posMatrix, h, e.transform.zoom, o.paint.get("heatmap-intensity")), o.id, p.layoutVertexBuffer, p.indexBuffer, p.segments, o.paint, e.transform.zoom, d);\n }\n }\n }\n\n a.viewport.set([0, 0, e.width, e.height]);\n } else "translucent" === e.renderPass && (e.context.setColorMode(e.colorModeForRenderPass()), function (e, i) {\n var o = e.context,\n r = o.gl,\n a = i.heatmapFbo;\n\n if (a) {\n o.activeTexture.set(r.TEXTURE0), r.bindTexture(r.TEXTURE_2D, a.colorAttachment.get()), o.activeTexture.set(r.TEXTURE1);\n var n = i.colorRampTexture;\n n || (n = i.colorRampTexture = new t.Texture(o, i.colorRamp, r.RGBA)), n.bind(r.LINEAR, r.CLAMP_TO_EDGE), e.useProgram("heatmapTexture").draw(o, r.TRIANGLES, It.disabled, Pt.disabled, e.colorModeForRenderPass(), Ct.disabled, function (e, i, o, r) {\n var a = t.create();\n t.ortho(a, 0, e.width, e.height, 0, 0, 1);\n var n = e.context.gl;\n return {\n u_matrix: a,\n u_world: [n.drawingBufferWidth, n.drawingBufferHeight],\n u_image: 0,\n u_color_ramp: 1,\n u_opacity: i.paint.get("heatmap-opacity")\n };\n }(e, i), i.id, e.viewportBuffer, e.quadTriangleIndexBuffer, e.viewportSegments, i.paint, e.transform.zoom);\n }\n }(e, o));\n },\n line: function line(e, i, o, r) {\n if ("translucent" === e.renderPass) {\n var a = o.paint.get("line-opacity"),\n n = o.paint.get("line-width");\n if (0 !== a.constantOr(1) && 0 !== n.constantOr(1)) for (var s = e.depthModeForSublayer(0, It.ReadOnly), l = e.colorModeForRenderPass(), c = o.paint.get("line-dasharray"), u = o.paint.get("line-pattern"), h = u.constantOr(1), p = o.paint.get("line-gradient"), d = o.getCrossfadeParameters(), _ = h ? "linePattern" : c ? "lineSDF" : p ? "lineGradient" : "line", f = e.context, m = f.gl, g = !0, v = 0, y = r; v < y.length; v += 1) {\n var x = y[v],\n b = i.getTile(x);\n\n if (!h || b.patternsLoaded()) {\n var w = b.getBucket(o);\n\n if (w) {\n var T = w.programConfigurations.get(o.id),\n E = e.context.program.get(),\n I = e.useProgram(_, T),\n P = g || I.program !== E,\n S = u.constantOr(null);\n\n if (S && b.imageAtlas) {\n var C = b.imageAtlas,\n z = C.patternPositions[S.to.toString()],\n D = C.patternPositions[S.from.toString()];\n z && D && T.setConstantPatternPositions(z, D);\n }\n\n var A = h ? Oi(e, b, o, d) : c ? Fi(e, b, o, c, d) : p ? Bi(e, b, o, w.lineClipsArray.length) : ki(e, b, o);\n if (h) f.activeTexture.set(m.TEXTURE0), b.imageAtlasTexture.bind(m.LINEAR, m.CLAMP_TO_EDGE), T.updatePaintBuffers(d);else if (c && (P || e.lineAtlas.dirty)) f.activeTexture.set(m.TEXTURE0), e.lineAtlas.bind(f);else if (p) {\n var M = w.gradients[o.id],\n L = M.texture;\n\n if (o.gradientVersion !== M.version) {\n var R = 256;\n\n if (o.stepInterpolant) {\n var k = i.getSource().maxzoom,\n B = x.canonical.z === k ? Math.ceil(1 << e.transform.maxZoom - x.canonical.z) : 1;\n R = t.clamp(t.nextPowerOfTwo(w.maxLineLength / t.EXTENT * 1024 * B), 256, f.maxTextureSize);\n }\n\n M.gradient = t.renderColorRamp({\n expression: o.gradientExpression(),\n evaluationKey: "lineProgress",\n resolution: R,\n image: M.gradient || void 0,\n clips: w.lineClipsArray\n }), M.texture ? M.texture.update(M.gradient) : M.texture = new t.Texture(f, M.gradient, m.RGBA), M.version = o.gradientVersion, L = M.texture;\n }\n\n f.activeTexture.set(m.TEXTURE0), L.bind(o.stepInterpolant ? m.NEAREST : m.LINEAR, m.CLAMP_TO_EDGE);\n }\n I.draw(f, m.TRIANGLES, s, e.stencilModeForClipping(x), l, Ct.disabled, A, o.id, w.layoutVertexBuffer, w.indexBuffer, w.segments, o.paint, e.transform.zoom, T, w.layoutVertexBuffer2), g = !1;\n }\n }\n }\n }\n },\n fill: function fill(e, i, o, r) {\n var a = o.paint.get("fill-color"),\n n = o.paint.get("fill-opacity");\n\n if (0 !== n.constantOr(1)) {\n var s = e.colorModeForRenderPass(),\n l = o.paint.get("fill-pattern"),\n c = e.opaquePassEnabledForLayer() && !l.constantOr(1) && 1 === a.constantOr(t.Color.transparent).a && 1 === n.constantOr(0) ? "opaque" : "translucent";\n\n if (e.renderPass === c) {\n var u = e.depthModeForSublayer(1, "opaque" === e.renderPass ? It.ReadWrite : It.ReadOnly);\n oo(e, i, o, r, u, s, !1);\n }\n\n if ("translucent" === e.renderPass && o.paint.get("fill-antialias")) {\n var h = e.depthModeForSublayer(o.getPaintProperty("fill-outline-color") ? 2 : 0, It.ReadOnly);\n oo(e, i, o, r, h, s, !0);\n }\n }\n },\n "fill-extrusion": function fillExtrusion(t, e, i, o) {\n var r = i.paint.get("fill-extrusion-opacity");\n\n if (0 !== r && "translucent" === t.renderPass) {\n var a = new It(t.context.gl.LEQUAL, It.ReadWrite, t.depthRangeFor3D);\n if (1 !== r || i.paint.get("fill-extrusion-pattern").constantOr(1)) ro(t, e, i, o, a, Pt.disabled, St.disabled), ro(t, e, i, o, a, t.stencilModeFor3D(), t.colorModeForRenderPass());else {\n var n = t.colorModeForRenderPass();\n ro(t, e, i, o, a, Pt.disabled, n);\n }\n }\n },\n hillshade: function hillshade(t, e, i, o) {\n if ("offscreen" === t.renderPass || "translucent" === t.renderPass) {\n for (var r = t.context, a = t.depthModeForSublayer(0, It.ReadOnly), n = t.colorModeForRenderPass(), s = "translucent" === t.renderPass ? t.stencilConfigForOverlap(o) : [{}, o], l = s[0], c = 0, u = s[1]; c < u.length; c += 1) {\n var h = u[c],\n p = e.getTile(h);\n p.needsHillshadePrepare && "offscreen" === t.renderPass ? no(t, p, i, a, Pt.disabled, n) : "translucent" === t.renderPass && ao(t, p, i, a, l[h.overscaledZ], n);\n }\n\n r.viewport.set([0, 0, t.width, t.height]);\n }\n },\n raster: function raster(t, e, i, o) {\n if ("translucent" === t.renderPass && 0 !== i.paint.get("raster-opacity") && o.length) for (var r = t.context, a = r.gl, n = e.getSource(), s = t.useProgram("raster"), l = t.colorModeForRenderPass(), c = n instanceof M ? [{}, o] : t.stencilConfigForOverlap(o), u = c[0], h = c[1], p = h[h.length - 1].overscaledZ, d = !t.options.moving, _ = 0, f = h; _ < f.length; _ += 1) {\n var m = f[_],\n g = t.depthModeForSublayer(m.overscaledZ - p, 1 === i.paint.get("raster-opacity") ? It.ReadWrite : It.ReadOnly, a.LESS),\n v = e.getTile(m),\n y = t.transform.calculatePosMatrix(m.toUnwrapped(), d);\n v.registerFadeDuration(i.paint.get("raster-fade-duration"));\n var x = e.findLoadedParent(m, 0),\n b = so(v, x, e, i, t.transform),\n w = void 0,\n T = void 0,\n E = "nearest" === i.paint.get("raster-resampling") ? a.NEAREST : a.LINEAR;\n r.activeTexture.set(a.TEXTURE0), v.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST), r.activeTexture.set(a.TEXTURE1), x ? (x.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST), w = Math.pow(2, x.tileID.overscaledZ - v.tileID.overscaledZ), T = [v.tileID.canonical.x * w % 1, v.tileID.canonical.y * w % 1]) : v.texture.bind(E, a.CLAMP_TO_EDGE, a.LINEAR_MIPMAP_NEAREST);\n var I = Zi(y, T || [0, 0], w || 1, b, i);\n n instanceof M ? s.draw(r, a.TRIANGLES, g, Pt.disabled, l, Ct.disabled, I, i.id, n.boundsBuffer, t.quadTriangleIndexBuffer, n.boundsSegments) : s.draw(r, a.TRIANGLES, g, u[m.overscaledZ], l, Ct.disabled, I, i.id, t.rasterBoundsBuffer, t.quadTriangleIndexBuffer, t.rasterBoundsSegments);\n }\n },\n background: function background(t, e, i) {\n var o = i.paint.get("background-color"),\n r = i.paint.get("background-opacity");\n\n if (0 !== r) {\n var a = t.context,\n n = a.gl,\n s = t.transform,\n l = s.tileSize,\n c = i.paint.get("background-pattern");\n\n if (!t.isPatternMissing(c)) {\n var u = !c && 1 === o.a && 1 === r && t.opaquePassEnabledForLayer() ? "opaque" : "translucent";\n\n if (t.renderPass === u) {\n var h = Pt.disabled,\n p = t.depthModeForSublayer(0, "opaque" === u ? It.ReadWrite : It.ReadOnly),\n d = t.colorModeForRenderPass(),\n _ = t.useProgram(c ? "backgroundPattern" : "background"),\n f = s.coveringTiles({\n tileSize: l\n });\n\n c && (a.activeTexture.set(n.TEXTURE0), t.imageManager.bind(t.context));\n\n for (var m = i.getCrossfadeParameters(), g = 0, v = f; g < v.length; g += 1) {\n var y = v[g],\n x = t.transform.calculatePosMatrix(y.toUnwrapped()),\n b = c ? Hi(x, r, t, c, {\n tileID: y,\n tileSize: l\n }, m) : Xi(x, r, o);\n\n _.draw(a, n.TRIANGLES, p, h, d, Ct.disabled, b, i.id, t.tileExtentBuffer, t.quadTriangleIndexBuffer, t.tileExtentSegments);\n }\n }\n }\n }\n },\n debug: function debug(t, e, i) {\n for (var o = 0; o < i.length; o++) {\n go(t, e, i[o]);\n }\n },\n custom: function custom(t, e, i) {\n var o = t.context,\n r = i.implementation;\n\n if ("offscreen" === t.renderPass) {\n var a = r.prerender;\n a && (t.setCustomLayerDefaults(), o.setColorMode(t.colorModeForRenderPass()), a.call(r, o.gl, t.transform.customLayerMatrix()), o.setDirty(), t.setBaseState());\n } else if ("translucent" === t.renderPass) {\n t.setCustomLayerDefaults(), o.setColorMode(t.colorModeForRenderPass()), o.setStencilMode(Pt.disabled);\n var n = "3d" === r.renderingMode ? new It(t.context.gl.LEQUAL, It.ReadWrite, t.depthRangeFor3D) : t.depthModeForSublayer(0, It.ReadOnly);\n o.setDepthMode(n), r.render(o.gl, t.transform.customLayerMatrix()), o.setDirty(), t.setBaseState(), o.bindFramebuffer.set(null);\n }\n }\n },\n yo = function yo(t, e) {\n this.context = new zt(t), this.transform = e, this._tileTextures = {}, this.setup(), this.numSublayers = Dt.maxUnderzooming + Dt.maxOverzooming + 1, this.depthEpsilon = 1 / Math.pow(2, 16), this.crossTileSymbolIndex = new Fe(), this.gpuTimers = {};\n };\n\n yo.prototype.resize = function (e, i) {\n if (this.width = e * t.browser.devicePixelRatio, this.height = i * t.browser.devicePixelRatio, this.context.viewport.set([0, 0, this.width, this.height]), this.style) for (var o = 0, r = this.style._order; o < r.length; o += 1) {\n this.style._layers[r[o]].resize();\n }\n }, yo.prototype.setup = function () {\n var e = this.context,\n i = new t.StructArrayLayout2i4();\n i.emplaceBack(0, 0), i.emplaceBack(t.EXTENT, 0), i.emplaceBack(0, t.EXTENT), i.emplaceBack(t.EXTENT, t.EXTENT), this.tileExtentBuffer = e.createVertexBuffer(i, Ve.members), this.tileExtentSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var o = new t.StructArrayLayout2i4();\n o.emplaceBack(0, 0), o.emplaceBack(t.EXTENT, 0), o.emplaceBack(0, t.EXTENT), o.emplaceBack(t.EXTENT, t.EXTENT), this.debugBuffer = e.createVertexBuffer(o, Ve.members), this.debugSegments = t.SegmentVector.simpleSegment(0, 0, 4, 5);\n var r = new t.StructArrayLayout4i8();\n r.emplaceBack(0, 0, 0, 0), r.emplaceBack(t.EXTENT, 0, t.EXTENT, 0), r.emplaceBack(0, t.EXTENT, 0, t.EXTENT), r.emplaceBack(t.EXTENT, t.EXTENT, t.EXTENT, t.EXTENT), this.rasterBoundsBuffer = e.createVertexBuffer(r, A.members), this.rasterBoundsSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var a = new t.StructArrayLayout2i4();\n a.emplaceBack(0, 0), a.emplaceBack(1, 0), a.emplaceBack(0, 1), a.emplaceBack(1, 1), this.viewportBuffer = e.createVertexBuffer(a, Ve.members), this.viewportSegments = t.SegmentVector.simpleSegment(0, 0, 4, 2);\n var n = new t.StructArrayLayout1ui2();\n n.emplaceBack(0), n.emplaceBack(1), n.emplaceBack(3), n.emplaceBack(2), n.emplaceBack(0), this.tileBorderIndexBuffer = e.createIndexBuffer(n);\n var s = new t.StructArrayLayout3ui6();\n s.emplaceBack(0, 1, 2), s.emplaceBack(2, 1, 3), this.quadTriangleIndexBuffer = e.createIndexBuffer(s), this.emptyTexture = new t.Texture(e, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n }, e.gl.RGBA);\n var l = this.context.gl;\n this.stencilClearMode = new Pt({\n func: l.ALWAYS,\n mask: 0\n }, 0, 255, l.ZERO, l.ZERO, l.ZERO);\n }, yo.prototype.clearStencil = function () {\n var e = this.context,\n i = e.gl;\n this.nextStencilID = 1, this.currentStencilSource = void 0;\n var o = t.create();\n t.ortho(o, 0, this.width, this.height, 0, 0, 1), t.scale(o, o, [i.drawingBufferWidth, i.drawingBufferHeight, 0]), this.useProgram("clippingMask").draw(e, i.TRIANGLES, It.disabled, this.stencilClearMode, St.disabled, Ct.disabled, Li(o), "$clipping", this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments);\n }, yo.prototype._renderTileClippingMasks = function (t, e) {\n if (this.currentStencilSource !== t.source && t.isTileClipped() && e && e.length) {\n this.currentStencilSource = t.source;\n var i = this.context,\n o = i.gl;\n this.nextStencilID + e.length > 256 && this.clearStencil(), i.setColorMode(St.disabled), i.setDepthMode(It.disabled);\n var r = this.useProgram("clippingMask");\n this._tileClippingMaskIDs = {};\n\n for (var a = 0, n = e; a < n.length; a += 1) {\n var s = n[a],\n l = this._tileClippingMaskIDs[s.key] = this.nextStencilID++;\n r.draw(i, o.TRIANGLES, It.disabled, new Pt({\n func: o.ALWAYS,\n mask: 0\n }, l, 255, o.KEEP, o.KEEP, o.REPLACE), St.disabled, Ct.disabled, Li(s.posMatrix), "$clipping", this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments);\n }\n }\n }, yo.prototype.stencilModeFor3D = function () {\n this.currentStencilSource = void 0, this.nextStencilID + 1 > 256 && this.clearStencil();\n var t = this.nextStencilID++,\n e = this.context.gl;\n return new Pt({\n func: e.NOTEQUAL,\n mask: 255\n }, t, 255, e.KEEP, e.KEEP, e.REPLACE);\n }, yo.prototype.stencilModeForClipping = function (t) {\n var e = this.context.gl;\n return new Pt({\n func: e.EQUAL,\n mask: 255\n }, this._tileClippingMaskIDs[t.key], 0, e.KEEP, e.KEEP, e.REPLACE);\n }, yo.prototype.stencilConfigForOverlap = function (t) {\n var e,\n i = this.context.gl,\n o = t.sort(function (t, e) {\n return e.overscaledZ - t.overscaledZ;\n }),\n r = o[o.length - 1].overscaledZ,\n a = o[0].overscaledZ - r + 1;\n\n if (a > 1) {\n this.currentStencilSource = void 0, this.nextStencilID + a > 256 && this.clearStencil();\n\n for (var n = {}, s = 0; s < a; s++) {\n n[s + r] = new Pt({\n func: i.GEQUAL,\n mask: 255\n }, s + this.nextStencilID, 255, i.KEEP, i.KEEP, i.REPLACE);\n }\n\n return this.nextStencilID += a, [n, o];\n }\n\n return [(e = {}, e[r] = Pt.disabled, e), o];\n }, yo.prototype.colorModeForRenderPass = function () {\n var e = this.context.gl;\n return this._showOverdrawInspector ? new St([e.CONSTANT_COLOR, e.ONE], new t.Color(1 / 8, 1 / 8, 1 / 8, 0), [!0, !0, !0, !0]) : "opaque" === this.renderPass ? St.unblended : St.alphaBlended;\n }, yo.prototype.depthModeForSublayer = function (t, e, i) {\n if (!this.opaquePassEnabledForLayer()) return It.disabled;\n var o = 1 - ((1 + this.currentLayer) * this.numSublayers + t) * this.depthEpsilon;\n return new It(i || this.context.gl.LEQUAL, e, [o, o]);\n }, yo.prototype.opaquePassEnabledForLayer = function () {\n return this.currentLayer < this.opaquePassCutoff;\n }, yo.prototype.render = function (e, i) {\n var o = this;\n this.style = e, this.options = i, this.lineAtlas = e.lineAtlas, this.imageManager = e.imageManager, this.glyphManager = e.glyphManager, this.symbolFadeChange = e.placement.symbolFadeChange(t.browser.now()), this.imageManager.beginFrame();\n var r = this.style._order,\n a = this.style.sourceCaches;\n\n for (var n in a) {\n var s = a[n];\n s.used && s.prepare(this.context);\n }\n\n var l,\n c,\n u = {},\n h = {},\n p = {};\n\n for (var d in a) {\n var _ = a[d];\n u[d] = _.getVisibleCoordinates(), h[d] = u[d].slice().reverse(), p[d] = _.getVisibleCoordinates(!0).reverse();\n }\n\n this.opaquePassCutoff = 1 / 0;\n\n for (var f = 0; f < r.length; f++) {\n if (this.style._layers[r[f]].is3D()) {\n this.opaquePassCutoff = f;\n break;\n }\n }\n\n this.renderPass = "offscreen";\n\n for (var m = 0, g = r; m < g.length; m += 1) {\n var v = this.style._layers[g[m]];\n\n if (v.hasOffscreenPass() && !v.isHidden(this.transform.zoom)) {\n var y = h[v.source];\n ("custom" === v.type || y.length) && this.renderLayer(this, a[v.source], v, y);\n }\n }\n\n for (this.context.bindFramebuffer.set(null), this.context.clear({\n color: i.showOverdrawInspector ? t.Color.black : t.Color.transparent,\n depth: 1\n }), this.clearStencil(), this._showOverdrawInspector = i.showOverdrawInspector, this.depthRangeFor3D = [0, 1 - (e._order.length + 2) * this.numSublayers * this.depthEpsilon], this.renderPass = "opaque", this.currentLayer = r.length - 1; this.currentLayer >= 0; this.currentLayer--) {\n var x = this.style._layers[r[this.currentLayer]],\n b = a[x.source],\n w = u[x.source];\n this._renderTileClippingMasks(x, w), this.renderLayer(this, b, x, w);\n }\n\n for (this.renderPass = "translucent", this.currentLayer = 0; this.currentLayer < r.length; this.currentLayer++) {\n var T = this.style._layers[r[this.currentLayer]],\n E = a[T.source],\n I = ("symbol" === T.type ? p : h)[T.source];\n this._renderTileClippingMasks(T, u[T.source]), this.renderLayer(this, E, T, I);\n }\n\n this.options.showTileBoundaries && (t.values(this.style._layers).forEach(function (t) {\n t.source && !t.isHidden(o.transform.zoom) && (t.source !== (c && c.id) && (c = o.style.sourceCaches[t.source]), (!l || l.getSource().maxzoom < c.getSource().maxzoom) && (l = c));\n }), l && vo.debug(this, l, l.getVisibleCoordinates())), this.options.showPadding && function (t) {\n var e = t.transform.padding;\n _o(t, t.transform.height - (e.top || 0), 3, lo), _o(t, e.bottom || 0, 3, co), fo(t, e.left || 0, 3, uo), fo(t, t.transform.width - (e.right || 0), 3, ho);\n var i = t.transform.centerPoint;\n !function (t, e, i, o) {\n mo(t, e - 1, i - 10, 2, 20, o), mo(t, e - 10, i - 1, 20, 2, o);\n }(t, i.x, t.transform.height - i.y, po);\n }(this), this.context.setDefault();\n }, yo.prototype.renderLayer = function (t, e, i, o) {\n i.isHidden(this.transform.zoom) || ("background" === i.type || "custom" === i.type || o.length) && (this.id = i.id, this.gpuTimingStart(i), vo[i.type](t, e, i, o, this.style.placement.variableOffsets), this.gpuTimingEnd());\n }, yo.prototype.gpuTimingStart = function (t) {\n if (this.options.gpuTiming) {\n var e = this.context.extTimerQuery,\n i = this.gpuTimers[t.id];\n i || (i = this.gpuTimers[t.id] = {\n calls: 0,\n cpuTime: 0,\n query: e.createQueryEXT()\n }), i.calls++, e.beginQueryEXT(e.TIME_ELAPSED_EXT, i.query);\n }\n }, yo.prototype.gpuTimingEnd = function () {\n if (this.options.gpuTiming) {\n var t = this.context.extTimerQuery;\n t.endQueryEXT(t.TIME_ELAPSED_EXT);\n }\n }, yo.prototype.collectGpuTimers = function () {\n var t = this.gpuTimers;\n return this.gpuTimers = {}, t;\n }, yo.prototype.queryGpuTimers = function (t) {\n var e = {};\n\n for (var i in t) {\n var o = t[i],\n r = this.context.extTimerQuery,\n a = r.getQueryObjectEXT(o.query, r.QUERY_RESULT_EXT) / 1e6;\n r.deleteQueryEXT(o.query), e[i] = a;\n }\n\n return e;\n }, yo.prototype.translatePosMatrix = function (e, i, o, r, a) {\n if (!o[0] && !o[1]) return e;\n var n = a ? "map" === r ? this.transform.angle : 0 : "viewport" === r ? -this.transform.angle : 0;\n\n if (n) {\n var s = Math.sin(n),\n l = Math.cos(n);\n o = [o[0] * l - o[1] * s, o[0] * s + o[1] * l];\n }\n\n var c = [a ? o[0] : pe(i, o[0], this.transform.zoom), a ? o[1] : pe(i, o[1], this.transform.zoom), 0],\n u = new Float32Array(16);\n return t.translate(u, e, c), u;\n }, yo.prototype.saveTileTexture = function (t) {\n var e = this._tileTextures[t.size[0]];\n e ? e.push(t) : this._tileTextures[t.size[0]] = [t];\n }, yo.prototype.getTileTexture = function (t) {\n var e = this._tileTextures[t];\n return e && e.length > 0 ? e.pop() : null;\n }, yo.prototype.isPatternMissing = function (t) {\n if (!t) return !1;\n if (!t.from || !t.to) return !0;\n var e = this.imageManager.getPattern(t.from.toString()),\n i = this.imageManager.getPattern(t.to.toString());\n return !e || !i;\n }, yo.prototype.useProgram = function (t, e) {\n this.cache = this.cache || {};\n var i = "" + t + (e ? e.cacheKey : "") + (this._showOverdrawInspector ? "/overdraw" : "");\n return this.cache[i] || (this.cache[i] = new bi(this.context, t, vi[t], e, Ki[t], this._showOverdrawInspector)), this.cache[i];\n }, yo.prototype.setCustomLayerDefaults = function () {\n this.context.unbindVAO(), this.context.cullFace.setDefault(), this.context.activeTexture.setDefault(), this.context.pixelStoreUnpack.setDefault(), this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(), this.context.pixelStoreUnpackFlipY.setDefault();\n }, yo.prototype.setBaseState = function () {\n var t = this.context.gl;\n this.context.cullFace.set(!1), this.context.viewport.set([0, 0, this.width, this.height]), this.context.blendEquation.set(t.FUNC_ADD);\n }, yo.prototype.initDebugOverlayCanvas = function () {\n null == this.debugOverlayCanvas && (this.debugOverlayCanvas = t.window.document.createElement("canvas"), this.debugOverlayCanvas.width = 512, this.debugOverlayCanvas.height = 512, this.debugOverlayTexture = new t.Texture(this.context, this.debugOverlayCanvas, this.context.gl.RGBA));\n }, yo.prototype.destroy = function () {\n this.emptyTexture.destroy(), this.debugOverlayTexture && this.debugOverlayTexture.destroy();\n };\n\n var xo = function xo(t, e) {\n this.points = t, this.planes = e;\n };\n\n xo.fromInvProjectionMatrix = function (e, i, o) {\n var r = Math.pow(2, o),\n a = [[-1, 1, -1, 1], [1, 1, -1, 1], [1, -1, -1, 1], [-1, -1, -1, 1], [-1, 1, 1, 1], [1, 1, 1, 1], [1, -1, 1, 1], [-1, -1, 1, 1]].map(function (i) {\n return t.transformMat4([], i, e);\n }).map(function (e) {\n return t.scale$1([], e, 1 / e[3] / i * r);\n }),\n n = [[0, 1, 2], [6, 5, 4], [0, 3, 7], [2, 1, 5], [3, 2, 6], [0, 4, 5]].map(function (e) {\n var i = t.sub([], a[e[0]], a[e[1]]),\n o = t.sub([], a[e[2]], a[e[1]]),\n r = t.normalize([], t.cross([], i, o)),\n n = -t.dot(r, a[e[1]]);\n return r.concat(n);\n });\n return new xo(a, n);\n };\n\n var bo = function bo(e, i) {\n this.min = e, this.max = i, this.center = t.scale$2([], t.add([], this.min, this.max), .5);\n };\n\n bo.prototype.quadrant = function (e) {\n for (var i = [e % 2 == 0, e < 2], o = t.clone$2(this.min), r = t.clone$2(this.max), a = 0; a < i.length; a++) {\n o[a] = i[a] ? this.min[a] : this.center[a], r[a] = i[a] ? this.center[a] : this.max[a];\n }\n\n return r[2] = this.max[2], new bo(o, r);\n }, bo.prototype.distanceX = function (t) {\n return Math.max(Math.min(this.max[0], t[0]), this.min[0]) - t[0];\n }, bo.prototype.distanceY = function (t) {\n return Math.max(Math.min(this.max[1], t[1]), this.min[1]) - t[1];\n }, bo.prototype.intersects = function (e) {\n for (var i = [[this.min[0], this.min[1], 0, 1], [this.max[0], this.min[1], 0, 1], [this.max[0], this.max[1], 0, 1], [this.min[0], this.max[1], 0, 1]], o = !0, r = 0; r < e.planes.length; r++) {\n for (var a = e.planes[r], n = 0, s = 0; s < i.length; s++) {\n n += t.dot$1(a, i[s]) >= 0;\n }\n\n if (0 === n) return 0;\n n !== i.length && (o = !1);\n }\n\n if (o) return 2;\n\n for (var l = 0; l < 3; l++) {\n for (var c = Number.MAX_VALUE, u = -Number.MAX_VALUE, h = 0; h < e.points.length; h++) {\n var p = e.points[h][l] - this.min[l];\n c = Math.min(c, p), u = Math.max(u, p);\n }\n\n if (u < 0 || c > this.max[l] - this.min[l]) return 0;\n }\n\n return 1;\n };\n\n var wo = function wo(t, e, i, o) {\n if (void 0 === t && (t = 0), void 0 === e && (e = 0), void 0 === i && (i = 0), void 0 === o && (o = 0), isNaN(t) || t < 0 || isNaN(e) || e < 0 || isNaN(i) || i < 0 || isNaN(o) || o < 0) throw new Error("Invalid value for edge-insets, top, bottom, left and right must all be numbers");\n this.top = t, this.bottom = e, this.left = i, this.right = o;\n };\n\n wo.prototype.interpolate = function (e, i, o) {\n return null != i.top && null != e.top && (this.top = t.number(e.top, i.top, o)), null != i.bottom && null != e.bottom && (this.bottom = t.number(e.bottom, i.bottom, o)), null != i.left && null != e.left && (this.left = t.number(e.left, i.left, o)), null != i.right && null != e.right && (this.right = t.number(e.right, i.right, o)), this;\n }, wo.prototype.getCenter = function (e, i) {\n var o = t.clamp((this.left + e - this.right) / 2, 0, e),\n r = t.clamp((this.top + i - this.bottom) / 2, 0, i);\n return new t.Point(o, r);\n }, wo.prototype.equals = function (t) {\n return this.top === t.top && this.bottom === t.bottom && this.left === t.left && this.right === t.right;\n }, wo.prototype.clone = function () {\n return new wo(this.top, this.bottom, this.left, this.right);\n }, wo.prototype.toJSON = function () {\n return {\n top: this.top,\n bottom: this.bottom,\n left: this.left,\n right: this.right\n };\n };\n\n var To = function To(e, i, o, r, a) {\n this.tileSize = 512, this.maxValidLatitude = 85.051129, this._renderWorldCopies = void 0 === a || a, this._minZoom = e || 0, this._maxZoom = i || 22, this._minPitch = null == o ? 0 : o, this._maxPitch = null == r ? 60 : r, this.setMaxBounds(), this.width = 0, this.height = 0, this._center = new t.LngLat(0, 0), this.zoom = 0, this.angle = 0, this._fov = .6435011087932844, this._pitch = 0, this._unmodified = !0, this._edgeInsets = new wo(), this._posMatrixCache = {}, this._alignedPosMatrixCache = {};\n },\n Eo = {\n minZoom: {\n configurable: !0\n },\n maxZoom: {\n configurable: !0\n },\n minPitch: {\n configurable: !0\n },\n maxPitch: {\n configurable: !0\n },\n renderWorldCopies: {\n configurable: !0\n },\n worldSize: {\n configurable: !0\n },\n centerOffset: {\n configurable: !0\n },\n size: {\n configurable: !0\n },\n bearing: {\n configurable: !0\n },\n pitch: {\n configurable: !0\n },\n fov: {\n configurable: !0\n },\n zoom: {\n configurable: !0\n },\n center: {\n configurable: !0\n },\n padding: {\n configurable: !0\n },\n centerPoint: {\n configurable: !0\n },\n unmodified: {\n configurable: !0\n },\n point: {\n configurable: !0\n }\n };\n\n To.prototype.clone = function () {\n var t = new To(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies);\n return t.tileSize = this.tileSize, t.latRange = this.latRange, t.width = this.width, t.height = this.height, t._center = this._center, t.zoom = this.zoom, t.angle = this.angle, t._fov = this._fov, t._pitch = this._pitch, t._unmodified = this._unmodified, t._edgeInsets = this._edgeInsets.clone(), t._calcMatrices(), t;\n }, Eo.minZoom.get = function () {\n return this._minZoom;\n }, Eo.minZoom.set = function (t) {\n this._minZoom !== t && (this._minZoom = t, this.zoom = Math.max(this.zoom, t));\n }, Eo.maxZoom.get = function () {\n return this._maxZoom;\n }, Eo.maxZoom.set = function (t) {\n this._maxZoom !== t && (this._maxZoom = t, this.zoom = Math.min(this.zoom, t));\n }, Eo.minPitch.get = function () {\n return this._minPitch;\n }, Eo.minPitch.set = function (t) {\n this._minPitch !== t && (this._minPitch = t, this.pitch = Math.max(this.pitch, t));\n }, Eo.maxPitch.get = function () {\n return this._maxPitch;\n }, Eo.maxPitch.set = function (t) {\n this._maxPitch !== t && (this._maxPitch = t, this.pitch = Math.min(this.pitch, t));\n }, Eo.renderWorldCopies.get = function () {\n return this._renderWorldCopies;\n }, Eo.renderWorldCopies.set = function (t) {\n void 0 === t ? t = !0 : null === t && (t = !1), this._renderWorldCopies = t;\n }, Eo.worldSize.get = function () {\n return this.tileSize * this.scale;\n }, Eo.centerOffset.get = function () {\n return this.centerPoint._sub(this.size._div(2));\n }, Eo.size.get = function () {\n return new t.Point(this.width, this.height);\n }, Eo.bearing.get = function () {\n return -this.angle / Math.PI * 180;\n }, Eo.bearing.set = function (e) {\n var i = -t.wrap(e, -180, 180) * Math.PI / 180;\n this.angle !== i && (this._unmodified = !1, this.angle = i, this._calcMatrices(), this.rotationMatrix = t.create$2(), t.rotate(this.rotationMatrix, this.rotationMatrix, this.angle));\n }, Eo.pitch.get = function () {\n return this._pitch / Math.PI * 180;\n }, Eo.pitch.set = function (e) {\n var i = t.clamp(e, this.minPitch, this.maxPitch) / 180 * Math.PI;\n this._pitch !== i && (this._unmodified = !1, this._pitch = i, this._calcMatrices());\n }, Eo.fov.get = function () {\n return this._fov / Math.PI * 180;\n }, Eo.fov.set = function (t) {\n t = Math.max(.01, Math.min(60, t)), this._fov !== t && (this._unmodified = !1, this._fov = t / 180 * Math.PI, this._calcMatrices());\n }, Eo.zoom.get = function () {\n return this._zoom;\n }, Eo.zoom.set = function (t) {\n var e = Math.min(Math.max(t, this.minZoom), this.maxZoom);\n this._zoom !== e && (this._unmodified = !1, this._zoom = e, this.scale = this.zoomScale(e), this.tileZoom = Math.floor(e), this.zoomFraction = e - this.tileZoom, this._constrain(), this._calcMatrices());\n }, Eo.center.get = function () {\n return this._center;\n }, Eo.center.set = function (t) {\n t.lat === this._center.lat && t.lng === this._center.lng || (this._unmodified = !1, this._center = t, this._constrain(), this._calcMatrices());\n }, Eo.padding.get = function () {\n return this._edgeInsets.toJSON();\n }, Eo.padding.set = function (t) {\n this._edgeInsets.equals(t) || (this._unmodified = !1, this._edgeInsets.interpolate(this._edgeInsets, t, 1), this._calcMatrices());\n }, Eo.centerPoint.get = function () {\n return this._edgeInsets.getCenter(this.width, this.height);\n }, To.prototype.isPaddingEqual = function (t) {\n return this._edgeInsets.equals(t);\n }, To.prototype.interpolatePadding = function (t, e, i) {\n this._unmodified = !1, this._edgeInsets.interpolate(t, e, i), this._constrain(), this._calcMatrices();\n }, To.prototype.coveringZoomLevel = function (t) {\n var e = (t.roundZoom ? Math.round : Math.floor)(this.zoom + this.scaleZoom(this.tileSize / t.tileSize));\n return Math.max(0, e);\n }, To.prototype.getVisibleUnwrappedCoordinates = function (e) {\n var i = [new t.UnwrappedTileID(0, e)];\n if (this._renderWorldCopies) for (var o = this.pointCoordinate(new t.Point(0, 0)), r = this.pointCoordinate(new t.Point(this.width, 0)), a = this.pointCoordinate(new t.Point(this.width, this.height)), n = this.pointCoordinate(new t.Point(0, this.height)), s = Math.floor(Math.min(o.x, r.x, a.x, n.x)), l = Math.floor(Math.max(o.x, r.x, a.x, n.x)), c = s - 1; c <= l + 1; c++) {\n 0 !== c && i.push(new t.UnwrappedTileID(c, e));\n }\n return i;\n }, To.prototype.coveringTiles = function (e) {\n var i = this.coveringZoomLevel(e),\n o = i;\n if (void 0 !== e.minzoom && i < e.minzoom) return [];\n void 0 !== e.maxzoom && i > e.maxzoom && (i = e.maxzoom);\n var r = t.MercatorCoordinate.fromLngLat(this.center),\n a = Math.pow(2, i),\n n = [a * r.x, a * r.y, 0],\n s = xo.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, i),\n l = e.minzoom || 0;\n this.pitch <= 60 && this._edgeInsets.top < .1 && (l = i);\n\n var c = function c(t) {\n return {\n aabb: new bo([t * a, 0, 0], [(t + 1) * a, a, 0]),\n zoom: 0,\n x: 0,\n y: 0,\n wrap: t,\n fullyVisible: !1\n };\n },\n u = [],\n h = [],\n p = i,\n d = e.reparseOverscaled ? o : i;\n\n if (this._renderWorldCopies) for (var _ = 1; _ <= 3; _++) {\n u.push(c(-_)), u.push(c(_));\n }\n\n for (u.push(c(0)); u.length > 0;) {\n var f = u.pop(),\n m = f.x,\n g = f.y,\n v = f.fullyVisible;\n\n if (!v) {\n var y = f.aabb.intersects(s);\n if (0 === y) continue;\n v = 2 === y;\n }\n\n var x = f.aabb.distanceX(n),\n b = f.aabb.distanceY(n),\n w = Math.max(Math.abs(x), Math.abs(b));\n if (f.zoom === p || w > 3 + (1 << p - f.zoom) - 2 && f.zoom >= l) h.push({\n tileID: new t.OverscaledTileID(f.zoom === p ? d : f.zoom, f.wrap, f.zoom, m, g),\n distanceSq: t.sqrLen([n[0] - .5 - m, n[1] - .5 - g])\n });else for (var T = 0; T < 4; T++) {\n var E = (m << 1) + T % 2,\n I = (g << 1) + (T >> 1);\n u.push({\n aabb: f.aabb.quadrant(T),\n zoom: f.zoom + 1,\n x: E,\n y: I,\n wrap: f.wrap,\n fullyVisible: v\n });\n }\n }\n\n return h.sort(function (t, e) {\n return t.distanceSq - e.distanceSq;\n }).map(function (t) {\n return t.tileID;\n });\n }, To.prototype.resize = function (t, e) {\n this.width = t, this.height = e, this.pixelsToGLUnits = [2 / t, -2 / e], this._constrain(), this._calcMatrices();\n }, Eo.unmodified.get = function () {\n return this._unmodified;\n }, To.prototype.zoomScale = function (t) {\n return Math.pow(2, t);\n }, To.prototype.scaleZoom = function (t) {\n return Math.log(t) / Math.LN2;\n }, To.prototype.project = function (e) {\n var i = t.clamp(e.lat, -this.maxValidLatitude, this.maxValidLatitude);\n return new t.Point(t.mercatorXfromLng(e.lng) * this.worldSize, t.mercatorYfromLat(i) * this.worldSize);\n }, To.prototype.unproject = function (e) {\n return new t.MercatorCoordinate(e.x / this.worldSize, e.y / this.worldSize).toLngLat();\n }, Eo.point.get = function () {\n return this.project(this.center);\n }, To.prototype.setLocationAtPoint = function (e, i) {\n var o = this.pointCoordinate(i),\n r = this.pointCoordinate(this.centerPoint),\n a = this.locationCoordinate(e),\n n = new t.MercatorCoordinate(a.x - (o.x - r.x), a.y - (o.y - r.y));\n this.center = this.coordinateLocation(n), this._renderWorldCopies && (this.center = this.center.wrap());\n }, To.prototype.locationPoint = function (t) {\n return this.coordinatePoint(this.locationCoordinate(t));\n }, To.prototype.pointLocation = function (t) {\n return this.coordinateLocation(this.pointCoordinate(t));\n }, To.prototype.locationCoordinate = function (e) {\n return t.MercatorCoordinate.fromLngLat(e);\n }, To.prototype.coordinateLocation = function (t) {\n return t.toLngLat();\n }, To.prototype.pointCoordinate = function (e) {\n var i = [e.x, e.y, 0, 1],\n o = [e.x, e.y, 1, 1];\n t.transformMat4(i, i, this.pixelMatrixInverse), t.transformMat4(o, o, this.pixelMatrixInverse);\n var r = i[3],\n a = o[3],\n n = i[1] / r,\n s = o[1] / a,\n l = i[2] / r,\n c = o[2] / a,\n u = l === c ? 0 : (0 - l) / (c - l);\n return new t.MercatorCoordinate(t.number(i[0] / r, o[0] / a, u) / this.worldSize, t.number(n, s, u) / this.worldSize);\n }, To.prototype.coordinatePoint = function (e) {\n var i = [e.x * this.worldSize, e.y * this.worldSize, 0, 1];\n return t.transformMat4(i, i, this.pixelMatrix), new t.Point(i[0] / i[3], i[1] / i[3]);\n }, To.prototype.getBounds = function () {\n return new t.LngLatBounds().extend(this.pointLocation(new t.Point(0, 0))).extend(this.pointLocation(new t.Point(this.width, 0))).extend(this.pointLocation(new t.Point(this.width, this.height))).extend(this.pointLocation(new t.Point(0, this.height)));\n }, To.prototype.getMaxBounds = function () {\n return this.latRange && 2 === this.latRange.length && this.lngRange && 2 === this.lngRange.length ? new t.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]) : null;\n }, To.prototype.setMaxBounds = function (t) {\n t ? (this.lngRange = [t.getWest(), t.getEast()], this.latRange = [t.getSouth(), t.getNorth()], this._constrain()) : (this.lngRange = null, this.latRange = [-this.maxValidLatitude, this.maxValidLatitude]);\n }, To.prototype.calculatePosMatrix = function (e, i) {\n void 0 === i && (i = !1);\n var o = e.key,\n r = i ? this._alignedPosMatrixCache : this._posMatrixCache;\n if (r[o]) return r[o];\n var a = e.canonical,\n n = this.worldSize / this.zoomScale(a.z),\n s = a.x + Math.pow(2, a.z) * e.wrap,\n l = t.identity(new Float64Array(16));\n return t.translate(l, l, [s * n, a.y * n, 0]), t.scale(l, l, [n / t.EXTENT, n / t.EXTENT, 1]), t.multiply(l, i ? this.alignedProjMatrix : this.projMatrix, l), r[o] = new Float32Array(l), r[o];\n }, To.prototype.customLayerMatrix = function () {\n return this.mercatorMatrix.slice();\n }, To.prototype._constrain = function () {\n if (this.center && this.width && this.height && !this._constraining) {\n this._constraining = !0;\n var e,\n i,\n o,\n r,\n a = -90,\n n = 90,\n s = -180,\n l = 180,\n c = this.size,\n u = this._unmodified;\n\n if (this.latRange) {\n var h = this.latRange;\n a = t.mercatorYfromLat(h[1]) * this.worldSize, e = (n = t.mercatorYfromLat(h[0]) * this.worldSize) - a < c.y ? c.y / (n - a) : 0;\n }\n\n if (this.lngRange) {\n var p = this.lngRange;\n s = t.mercatorXfromLng(p[0]) * this.worldSize, i = (l = t.mercatorXfromLng(p[1]) * this.worldSize) - s < c.x ? c.x / (l - s) : 0;\n }\n\n var d = this.point,\n _ = Math.max(i || 0, e || 0);\n\n if (_) return this.center = this.unproject(new t.Point(i ? (l + s) / 2 : d.x, e ? (n + a) / 2 : d.y)), this.zoom += this.scaleZoom(_), this._unmodified = u, void (this._constraining = !1);\n\n if (this.latRange) {\n var f = d.y,\n m = c.y / 2;\n f - m < a && (r = a + m), f + m > n && (r = n - m);\n }\n\n if (this.lngRange) {\n var g = d.x,\n v = c.x / 2;\n g - v < s && (o = s + v), g + v > l && (o = l - v);\n }\n\n void 0 === o && void 0 === r || (this.center = this.unproject(new t.Point(void 0 !== o ? o : d.x, void 0 !== r ? r : d.y))), this._unmodified = u, this._constraining = !1;\n }\n }, To.prototype._calcMatrices = function () {\n if (this.height) {\n var e = this.centerOffset;\n this.cameraToCenterDistance = .5 / Math.tan(this._fov / 2) * this.height;\n var i = Math.PI / 2 + this._pitch,\n o = this._fov * (.5 + e.y / this.height),\n r = Math.sin(o) * this.cameraToCenterDistance / Math.sin(t.clamp(Math.PI - i - o, .01, Math.PI - .01)),\n a = this.point,\n n = a.x,\n s = a.y,\n l = 1.01 * (Math.cos(Math.PI / 2 - this._pitch) * r + this.cameraToCenterDistance),\n c = this.height / 50,\n u = new Float64Array(16);\n t.perspective(u, this._fov, this.width / this.height, c, l), u[8] = 2 * -e.x / this.width, u[9] = 2 * e.y / this.height, t.scale(u, u, [1, -1, 1]), t.translate(u, u, [0, 0, -this.cameraToCenterDistance]), t.rotateX(u, u, this._pitch), t.rotateZ(u, u, this.angle), t.translate(u, u, [-n, -s, 0]), this.mercatorMatrix = t.scale([], u, [this.worldSize, this.worldSize, this.worldSize]), t.scale(u, u, [1, 1, t.mercatorZfromAltitude(1, this.center.lat) * this.worldSize, 1]), this.projMatrix = u, this.invProjMatrix = t.invert([], this.projMatrix);\n\n var h = this.width % 2 / 2,\n p = this.height % 2 / 2,\n d = Math.cos(this.angle),\n _ = Math.sin(this.angle),\n f = n - Math.round(n) + d * h + _ * p,\n m = s - Math.round(s) + d * p + _ * h,\n g = new Float64Array(u);\n\n if (t.translate(g, g, [f > .5 ? f - 1 : f, m > .5 ? m - 1 : m, 0]), this.alignedProjMatrix = g, u = t.create(), t.scale(u, u, [this.width / 2, -this.height / 2, 1]), t.translate(u, u, [1, -1, 0]), this.labelPlaneMatrix = u, u = t.create(), t.scale(u, u, [1, -1, 1]), t.translate(u, u, [-1, -1, 0]), t.scale(u, u, [2 / this.width, 2 / this.height, 1]), this.glCoordMatrix = u, this.pixelMatrix = t.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix), !(u = t.invert(new Float64Array(16), this.pixelMatrix))) throw new Error("failed to invert matrix");\n this.pixelMatrixInverse = u, this._posMatrixCache = {}, this._alignedPosMatrixCache = {};\n }\n }, To.prototype.maxPitchScaleFactor = function () {\n if (!this.pixelMatrixInverse) return 1;\n var e = this.pointCoordinate(new t.Point(0, 0)),\n i = [e.x * this.worldSize, e.y * this.worldSize, 0, 1];\n return t.transformMat4(i, i, this.pixelMatrix)[3] / this.cameraToCenterDistance;\n }, To.prototype.getCameraPoint = function () {\n var e = Math.tan(this._pitch) * (this.cameraToCenterDistance || 1);\n return this.centerPoint.add(new t.Point(0, e));\n }, To.prototype.getCameraQueryGeometry = function (e) {\n var i = this.getCameraPoint();\n if (1 === e.length) return [e[0], i];\n\n for (var o = i.x, r = i.y, a = i.x, n = i.y, s = 0, l = e; s < l.length; s += 1) {\n var c = l[s];\n o = Math.min(o, c.x), r = Math.min(r, c.y), a = Math.max(a, c.x), n = Math.max(n, c.y);\n }\n\n return [new t.Point(o, r), new t.Point(a, r), new t.Point(a, n), new t.Point(o, n), new t.Point(o, r)];\n }, Object.defineProperties(To.prototype, Eo);\n\n var Io = function Io(e) {\n var i, o, r, _a3;\n\n this._hashName = e && encodeURIComponent(e), t.bindAll(["_getCurrentHash", "_onHashChange", "_updateHash"], this), this._updateHash = (i = this._updateHashUnthrottled.bind(this), o = !1, r = null, _a3 = function a() {\n r = null, o && (i(), r = setTimeout(_a3, 300), o = !1);\n }, function () {\n return o = !0, r || _a3(), r;\n });\n };\n\n Io.prototype.addTo = function (e) {\n return this._map = e, t.window.addEventListener("hashchange", this._onHashChange, !1), this._map.on("moveend", this._updateHash), this;\n }, Io.prototype.remove = function () {\n return t.window.removeEventListener("hashchange", this._onHashChange, !1), this._map.off("moveend", this._updateHash), clearTimeout(this._updateHash()), delete this._map, this;\n }, Io.prototype.getHashString = function (e) {\n var i = this._map.getCenter(),\n o = Math.round(100 * this._map.getZoom()) / 100,\n r = Math.ceil((o * Math.LN2 + Math.log(512 / 360 / .5)) / Math.LN10),\n a = Math.pow(10, r),\n n = Math.round(i.lng * a) / a,\n s = Math.round(i.lat * a) / a,\n l = this._map.getBearing(),\n c = this._map.getPitch(),\n u = "";\n\n if (u += e ? "/" + n + "/" + s + "/" + o : o + "/" + s + "/" + n, (l || c) && (u += "/" + Math.round(10 * l) / 10), c && (u += "/" + Math.round(c)), this._hashName) {\n var h = this._hashName,\n p = !1,\n d = t.window.location.hash.slice(1).split("&").map(function (t) {\n var e = t.split("=")[0];\n return e === h ? (p = !0, e + "=" + u) : t;\n }).filter(function (t) {\n return t;\n });\n return p || d.push(h + "=" + u), "#" + d.join("&");\n }\n\n return "#" + u;\n }, Io.prototype._getCurrentHash = function () {\n var e,\n i = this,\n o = t.window.location.hash.replace("#", "");\n return this._hashName ? (o.split("&").map(function (t) {\n return t.split("=");\n }).forEach(function (t) {\n t[0] === i._hashName && (e = t);\n }), (e && e[1] || "").split("/")) : o.split("/");\n }, Io.prototype._onHashChange = function () {\n var t = this._getCurrentHash();\n\n if (t.length >= 3 && !t.some(function (t) {\n return isNaN(t);\n })) {\n var e = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(t[3] || 0) : this._map.getBearing();\n return this._map.jumpTo({\n center: [+t[2], +t[1]],\n zoom: +t[0],\n bearing: e,\n pitch: +(t[4] || 0)\n }), !0;\n }\n\n return !1;\n }, Io.prototype._updateHashUnthrottled = function () {\n var e = t.window.location.href.replace(/(#.+)?$/, this.getHashString());\n\n try {\n t.window.history.replaceState(t.window.history.state, null, e);\n } catch (t) {}\n };\n\n var Po = {\n linearity: .3,\n easing: t.bezier(0, 0, .3, 1)\n },\n So = t.extend({\n deceleration: 2500,\n maxSpeed: 1400\n }, Po),\n Co = t.extend({\n deceleration: 20,\n maxSpeed: 1400\n }, Po),\n zo = t.extend({\n deceleration: 1e3,\n maxSpeed: 360\n }, Po),\n Do = t.extend({\n deceleration: 1e3,\n maxSpeed: 90\n }, Po),\n Ao = function Ao(t) {\n this._map = t, this.clear();\n };\n\n function Mo(t, e) {\n (!t.duration || t.duration < e.duration) && (t.duration = e.duration, t.easing = e.easing);\n }\n\n function Lo(e, i, o) {\n var r = o.maxSpeed,\n a = o.linearity,\n n = o.deceleration,\n s = t.clamp(e * a / (i / 1e3), -r, r),\n l = Math.abs(s) / (n * a);\n return {\n easing: o.easing,\n duration: 1e3 * l,\n amount: s * (l / 2)\n };\n }\n\n Ao.prototype.clear = function () {\n this._inertiaBuffer = [];\n }, Ao.prototype.record = function (e) {\n this._drainInertiaBuffer(), this._inertiaBuffer.push({\n time: t.browser.now(),\n settings: e\n });\n }, Ao.prototype._drainInertiaBuffer = function () {\n for (var e = this._inertiaBuffer, i = t.browser.now(); e.length > 0 && i - e[0].time > 160;) {\n e.shift();\n }\n }, Ao.prototype._onMoveEnd = function (e) {\n if (this._drainInertiaBuffer(), !(this._inertiaBuffer.length < 2)) {\n for (var i = {\n zoom: 0,\n bearing: 0,\n pitch: 0,\n pan: new t.Point(0, 0),\n pinchAround: void 0,\n around: void 0\n }, o = 0, r = this._inertiaBuffer; o < r.length; o += 1) {\n var a = r[o].settings;\n i.zoom += a.zoomDelta || 0, i.bearing += a.bearingDelta || 0, i.pitch += a.pitchDelta || 0, a.panDelta && i.pan._add(a.panDelta), a.around && (i.around = a.around), a.pinchAround && (i.pinchAround = a.pinchAround);\n }\n\n var n = this._inertiaBuffer[this._inertiaBuffer.length - 1].time - this._inertiaBuffer[0].time,\n s = {};\n\n if (i.pan.mag()) {\n var l = Lo(i.pan.mag(), n, t.extend({}, So, e || {}));\n s.offset = i.pan.mult(l.amount / i.pan.mag()), s.center = this._map.transform.center, Mo(s, l);\n }\n\n if (i.zoom) {\n var c = Lo(i.zoom, n, Co);\n s.zoom = this._map.transform.zoom + c.amount, Mo(s, c);\n }\n\n if (i.bearing) {\n var u = Lo(i.bearing, n, zo);\n s.bearing = this._map.transform.bearing + t.clamp(u.amount, -179, 179), Mo(s, u);\n }\n\n if (i.pitch) {\n var h = Lo(i.pitch, n, Do);\n s.pitch = this._map.transform.pitch + h.amount, Mo(s, h);\n }\n\n if (s.zoom || s.bearing) {\n var p = void 0 === i.pinchAround ? i.around : i.pinchAround;\n s.around = p ? this._map.unproject(p) : this._map.getCenter();\n }\n\n return this.clear(), t.extend(s, {\n noMoveStart: !0\n });\n }\n };\n\n var Ro = function (e) {\n function o(o, r, a, n) {\n void 0 === n && (n = {});\n var s = i.mousePos(r.getCanvasContainer(), a),\n l = r.unproject(s);\n e.call(this, o, t.extend({\n point: s,\n lngLat: l,\n originalEvent: a\n }, n)), this._defaultPrevented = !1, this.target = r;\n }\n\n e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o;\n var r = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return o.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, r.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(o.prototype, r), o;\n }(t.Event),\n ko = function (e) {\n function o(o, r, a) {\n var n = "touchend" === o ? a.changedTouches : a.touches,\n s = i.touchPos(r.getCanvasContainer(), n),\n l = s.map(function (t) {\n return r.unproject(t);\n }),\n c = s.reduce(function (t, e, i, o) {\n return t.add(e.div(o.length));\n }, new t.Point(0, 0)),\n u = r.unproject(c);\n e.call(this, o, {\n points: s,\n point: c,\n lngLats: l,\n lngLat: u,\n originalEvent: a\n }), this._defaultPrevented = !1;\n }\n\n e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o;\n var r = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return o.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, r.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(o.prototype, r), o;\n }(t.Event),\n Bo = function (t) {\n function e(e, i, o) {\n t.call(this, e, {\n originalEvent: o\n }), this._defaultPrevented = !1;\n }\n\n t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e;\n var i = {\n defaultPrevented: {\n configurable: !0\n }\n };\n return e.prototype.preventDefault = function () {\n this._defaultPrevented = !0;\n }, i.defaultPrevented.get = function () {\n return this._defaultPrevented;\n }, Object.defineProperties(e.prototype, i), e;\n }(t.Event),\n Oo = function Oo(t, e) {\n this._map = t, this._clickTolerance = e.clickTolerance;\n };\n\n Oo.prototype.reset = function () {\n delete this._mousedownPos;\n }, Oo.prototype.wheel = function (t) {\n return this._firePreventable(new Bo(t.type, this._map, t));\n }, Oo.prototype.mousedown = function (t, e) {\n return this._mousedownPos = e, this._firePreventable(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseup = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.click = function (t, e) {\n this._mousedownPos && this._mousedownPos.dist(e) >= this._clickTolerance || this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.dblclick = function (t) {\n return this._firePreventable(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseover = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.mouseout = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Oo.prototype.touchstart = function (t) {\n return this._firePreventable(new ko(t.type, this._map, t));\n }, Oo.prototype.touchmove = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype.touchend = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype.touchcancel = function (t) {\n this._map.fire(new ko(t.type, this._map, t));\n }, Oo.prototype._firePreventable = function (t) {\n if (this._map.fire(t), t.defaultPrevented) return {};\n }, Oo.prototype.isEnabled = function () {\n return !0;\n }, Oo.prototype.isActive = function () {\n return !1;\n }, Oo.prototype.enable = function () {}, Oo.prototype.disable = function () {};\n\n var Fo = function Fo(t) {\n this._map = t;\n };\n\n Fo.prototype.reset = function () {\n this._delayContextMenu = !1, delete this._contextMenuEvent;\n }, Fo.prototype.mousemove = function (t) {\n this._map.fire(new Ro(t.type, this._map, t));\n }, Fo.prototype.mousedown = function () {\n this._delayContextMenu = !0;\n }, Fo.prototype.mouseup = function () {\n this._delayContextMenu = !1, this._contextMenuEvent && (this._map.fire(new Ro("contextmenu", this._map, this._contextMenuEvent)), delete this._contextMenuEvent);\n }, Fo.prototype.contextmenu = function (t) {\n this._delayContextMenu ? this._contextMenuEvent = t : this._map.fire(new Ro(t.type, this._map, t)), this._map.listens("contextmenu") && t.preventDefault();\n }, Fo.prototype.isEnabled = function () {\n return !0;\n }, Fo.prototype.isActive = function () {\n return !1;\n }, Fo.prototype.enable = function () {}, Fo.prototype.disable = function () {};\n\n var Uo = function Uo(t, e) {\n this._map = t, this._el = t.getCanvasContainer(), this._container = t.getContainer(), this._clickTolerance = e.clickTolerance || 1;\n };\n\n function No(t, e) {\n for (var i = {}, o = 0; o < t.length; o++) {\n i[t[o].identifier] = e[o];\n }\n\n return i;\n }\n\n Uo.prototype.isEnabled = function () {\n return !!this._enabled;\n }, Uo.prototype.isActive = function () {\n return !!this._active;\n }, Uo.prototype.enable = function () {\n this.isEnabled() || (this._enabled = !0);\n }, Uo.prototype.disable = function () {\n this.isEnabled() && (this._enabled = !1);\n }, Uo.prototype.mousedown = function (t, e) {\n this.isEnabled() && t.shiftKey && 0 === t.button && (i.disableDrag(), this._startPos = this._lastPos = e, this._active = !0);\n }, Uo.prototype.mousemoveWindow = function (t, e) {\n if (this._active) {\n var o = e;\n\n if (!(this._lastPos.equals(o) || !this._box && o.dist(this._startPos) < this._clickTolerance)) {\n var r = this._startPos;\n this._lastPos = o, this._box || (this._box = i.create("div", "maplibregl-boxzoom", this._container), this._container.classList.add("maplibregl-crosshair"), this._fireEvent("boxzoomstart", t));\n var a = Math.min(r.x, o.x),\n n = Math.max(r.x, o.x),\n s = Math.min(r.y, o.y),\n l = Math.max(r.y, o.y);\n i.setTransform(this._box, "translate(" + a + "px," + s + "px)"), this._box.style.width = n - a + "px", this._box.style.height = l - s + "px";\n }\n }\n }, Uo.prototype.mouseupWindow = function (e, o) {\n var r = this;\n\n if (this._active && 0 === e.button) {\n var a = this._startPos,\n n = o;\n if (this.reset(), i.suppressClick(), a.x !== n.x || a.y !== n.y) return this._map.fire(new t.Event("boxzoomend", {\n originalEvent: e\n })), {\n cameraAnimation: function cameraAnimation(t) {\n return t.fitScreenCoordinates(a, n, r._map.getBearing(), {\n linear: !0\n });\n }\n };\n\n this._fireEvent("boxzoomcancel", e);\n }\n }, Uo.prototype.keydown = function (t) {\n this._active && 27 === t.keyCode && (this.reset(), this._fireEvent("boxzoomcancel", t));\n }, Uo.prototype.reset = function () {\n this._active = !1, this._container.classList.remove("maplibregl-crosshair"), this._box && (i.remove(this._box), this._box = null), i.enableDrag(), delete this._startPos, delete this._lastPos;\n }, Uo.prototype._fireEvent = function (e, i) {\n return this._map.fire(new t.Event(e, {\n originalEvent: i\n }));\n };\n\n var Zo = function Zo(t) {\n this.reset(), this.numTouches = t.numTouches;\n };\n\n Zo.prototype.reset = function () {\n delete this.centroid, delete this.startTime, delete this.touches, this.aborted = !1;\n }, Zo.prototype.touchstart = function (e, i, o) {\n (this.centroid || o.length > this.numTouches) && (this.aborted = !0), this.aborted || (void 0 === this.startTime && (this.startTime = e.timeStamp), o.length === this.numTouches && (this.centroid = function (e) {\n for (var i = new t.Point(0, 0), o = 0, r = e; o < r.length; o += 1) {\n i._add(r[o]);\n }\n\n return i.div(e.length);\n }(i), this.touches = No(o, i)));\n }, Zo.prototype.touchmove = function (t, e, i) {\n if (!this.aborted && this.centroid) {\n var o = No(i, e);\n\n for (var r in this.touches) {\n var a = o[r];\n (!a || a.dist(this.touches[r]) > 30) && (this.aborted = !0);\n }\n }\n }, Zo.prototype.touchend = function (t, e, i) {\n if ((!this.centroid || t.timeStamp - this.startTime > 500) && (this.aborted = !0), 0 === i.length) {\n var o = !this.aborted && this.centroid;\n if (this.reset(), o) return o;\n }\n };\n\n var qo = function qo(t) {\n this.singleTap = new Zo(t), this.numTaps = t.numTaps, this.reset();\n };\n\n qo.prototype.reset = function () {\n this.lastTime = 1 / 0, delete this.lastTap, this.count = 0, this.singleTap.reset();\n }, qo.prototype.touchstart = function (t, e, i) {\n this.singleTap.touchstart(t, e, i);\n }, qo.prototype.touchmove = function (t, e, i) {\n this.singleTap.touchmove(t, e, i);\n }, qo.prototype.touchend = function (t, e, i) {\n var o = this.singleTap.touchend(t, e, i);\n\n if (o) {\n var r = t.timeStamp - this.lastTime < 500,\n a = !this.lastTap || this.lastTap.dist(o) < 30;\n if (r && a || this.reset(), this.count++, this.lastTime = t.timeStamp, this.lastTap = o, this.count === this.numTaps) return this.reset(), o;\n }\n };\n\n var jo = function jo() {\n this._zoomIn = new qo({\n numTouches: 1,\n numTaps: 2\n }), this._zoomOut = new qo({\n numTouches: 2,\n numTaps: 1\n }), this.reset();\n };\n\n jo.prototype.reset = function () {\n this._active = !1, this._zoomIn.reset(), this._zoomOut.reset();\n }, jo.prototype.touchstart = function (t, e, i) {\n this._zoomIn.touchstart(t, e, i), this._zoomOut.touchstart(t, e, i);\n }, jo.prototype.touchmove = function (t, e, i) {\n this._zoomIn.touchmove(t, e, i), this._zoomOut.touchmove(t, e, i);\n }, jo.prototype.touchend = function (t, e, i) {\n var o = this,\n r = this._zoomIn.touchend(t, e, i),\n a = this._zoomOut.touchend(t, e, i);\n\n return r ? (this._active = !0, t.preventDefault(), setTimeout(function () {\n return o.reset();\n }, 0), {\n cameraAnimation: function cameraAnimation(e) {\n return e.easeTo({\n duration: 300,\n zoom: e.getZoom() + 1,\n around: e.unproject(r)\n }, {\n originalEvent: t\n });\n }\n }) : a ? (this._active = !0, t.preventDefault(), setTimeout(function () {\n return o.reset();\n }, 0), {\n cameraAnimation: function cameraAnimation(e) {\n return e.easeTo({\n duration: 300,\n zoom: e.getZoom() - 1,\n around: e.unproject(a)\n }, {\n originalEvent: t\n });\n }\n }) : void 0;\n }, jo.prototype.touchcancel = function () {\n this.reset();\n }, jo.prototype.enable = function () {\n this._enabled = !0;\n }, jo.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, jo.prototype.isEnabled = function () {\n return this._enabled;\n }, jo.prototype.isActive = function () {\n return this._active;\n };\n\n var Vo = {\n 0: 1,\n 2: 2\n },\n Go = function Go(t) {\n this.reset(), this._clickTolerance = t.clickTolerance || 1;\n };\n\n Go.prototype.reset = function () {\n this._active = !1, this._moved = !1, delete this._lastPoint, delete this._eventButton;\n }, Go.prototype._correctButton = function (t, e) {\n return !1;\n }, Go.prototype._move = function (t, e) {\n return {};\n }, Go.prototype.mousedown = function (t, e) {\n if (!this._lastPoint) {\n var o = i.mouseButton(t);\n this._correctButton(t, o) && (this._lastPoint = e, this._eventButton = o);\n }\n }, Go.prototype.mousemoveWindow = function (t, e) {\n var i = this._lastPoint;\n if (i) if (t.preventDefault(), function (t, e) {\n var i = Vo[e];\n return void 0 === t.buttons || (t.buttons & i) !== i;\n }(t, this._eventButton)) this.reset();else if (this._moved || !(e.dist(i) < this._clickTolerance)) return this._moved = !0, this._lastPoint = e, this._move(i, e);\n }, Go.prototype.mouseupWindow = function (t) {\n this._lastPoint && i.mouseButton(t) === this._eventButton && (this._moved && i.suppressClick(), this.reset());\n }, Go.prototype.enable = function () {\n this._enabled = !0;\n }, Go.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Go.prototype.isEnabled = function () {\n return this._enabled;\n }, Go.prototype.isActive = function () {\n return this._active;\n };\n\n var Wo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.mousedown = function (e, i) {\n t.prototype.mousedown.call(this, e, i), this._lastPoint && (this._active = !0);\n }, e.prototype._correctButton = function (t, e) {\n return 0 === e && !t.ctrlKey;\n }, e.prototype._move = function (t, e) {\n return {\n around: e,\n panDelta: e.sub(t)\n };\n }, e;\n }(Go),\n Xo = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._correctButton = function (t, e) {\n return 0 === e && t.ctrlKey || 2 === e;\n }, e.prototype._move = function (t, e) {\n var i = .8 * (e.x - t.x);\n if (i) return this._active = !0, {\n bearingDelta: i\n };\n }, e.prototype.contextmenu = function (t) {\n t.preventDefault();\n }, e;\n }(Go),\n Ho = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype._correctButton = function (t, e) {\n return 0 === e && t.ctrlKey || 2 === e;\n }, e.prototype._move = function (t, e) {\n var i = -.5 * (e.y - t.y);\n if (i) return this._active = !0, {\n pitchDelta: i\n };\n }, e.prototype.contextmenu = function (t) {\n t.preventDefault();\n }, e;\n }(Go),\n Ko = function Ko(t) {\n this._minTouches = 1, this._clickTolerance = t.clickTolerance || 1, this.reset();\n };\n\n Ko.prototype.reset = function () {\n this._active = !1, this._touches = {}, this._sum = new t.Point(0, 0);\n }, Ko.prototype.touchstart = function (t, e, i) {\n return this._calculateTransform(t, e, i);\n }, Ko.prototype.touchmove = function (t, e, i) {\n if (this._active && !(i.length < this._minTouches)) return t.preventDefault(), this._calculateTransform(t, e, i);\n }, Ko.prototype.touchend = function (t, e, i) {\n this._calculateTransform(t, e, i), this._active && i.length < this._minTouches && this.reset();\n }, Ko.prototype.touchcancel = function () {\n this.reset();\n }, Ko.prototype._calculateTransform = function (e, i, o) {\n o.length > 0 && (this._active = !0);\n var r = No(o, i),\n a = new t.Point(0, 0),\n n = new t.Point(0, 0),\n s = 0;\n\n for (var l in r) {\n var c = r[l],\n u = this._touches[l];\n u && (a._add(c), n._add(c.sub(u)), s++, r[l] = c);\n }\n\n if (this._touches = r, !(s < this._minTouches) && n.mag()) {\n var h = n.div(s);\n if (this._sum._add(h), !(this._sum.mag() < this._clickTolerance)) return {\n around: a.div(s),\n panDelta: h\n };\n }\n }, Ko.prototype.enable = function () {\n this._enabled = !0;\n }, Ko.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Ko.prototype.isEnabled = function () {\n return this._enabled;\n }, Ko.prototype.isActive = function () {\n return this._active;\n };\n\n var Yo = function Yo() {\n this.reset();\n };\n\n function Jo(t, e, i) {\n for (var o = 0; o < t.length; o++) {\n if (t[o].identifier === i) return e[o];\n }\n }\n\n function Qo(t, e) {\n return Math.log(t / e) / Math.LN2;\n }\n\n Yo.prototype.reset = function () {\n this._active = !1, delete this._firstTwoTouches;\n }, Yo.prototype._start = function (t) {}, Yo.prototype._move = function (t, e, i) {\n return {};\n }, Yo.prototype.touchstart = function (t, e, i) {\n this._firstTwoTouches || i.length < 2 || (this._firstTwoTouches = [i[0].identifier, i[1].identifier], this._start([e[0], e[1]]));\n }, Yo.prototype.touchmove = function (t, e, i) {\n if (this._firstTwoTouches) {\n t.preventDefault();\n var o = this._firstTwoTouches,\n r = o[1],\n a = Jo(i, e, o[0]),\n n = Jo(i, e, r);\n\n if (a && n) {\n var s = this._aroundCenter ? null : a.add(n).div(2);\n return this._move([a, n], s, t);\n }\n }\n }, Yo.prototype.touchend = function (t, e, o) {\n if (this._firstTwoTouches) {\n var r = this._firstTwoTouches,\n a = r[1],\n n = Jo(o, e, r[0]),\n s = Jo(o, e, a);\n n && s || (this._active && i.suppressClick(), this.reset());\n }\n }, Yo.prototype.touchcancel = function () {\n this.reset();\n }, Yo.prototype.enable = function (t) {\n this._enabled = !0, this._aroundCenter = !!t && "center" === t.around;\n }, Yo.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, Yo.prototype.isEnabled = function () {\n return this._enabled;\n }, Yo.prototype.isActive = function () {\n return this._active;\n };\n\n var $o = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), delete this._distance, delete this._startDistance;\n }, e.prototype._start = function (t) {\n this._startDistance = this._distance = t[0].dist(t[1]);\n }, e.prototype._move = function (t, e) {\n var i = this._distance;\n if (this._distance = t[0].dist(t[1]), this._active || !(Math.abs(Qo(this._distance, this._startDistance)) < .1)) return this._active = !0, {\n zoomDelta: Qo(this._distance, i),\n pinchAround: e\n };\n }, e;\n }(Yo);\n\n function tr(t, e) {\n return 180 * t.angleWith(e) / Math.PI;\n }\n\n var er = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), delete this._minDiameter, delete this._startVector, delete this._vector;\n }, e.prototype._start = function (t) {\n this._startVector = this._vector = t[0].sub(t[1]), this._minDiameter = t[0].dist(t[1]);\n }, e.prototype._move = function (t, e) {\n var i = this._vector;\n if (this._vector = t[0].sub(t[1]), this._active || !this._isBelowThreshold(this._vector)) return this._active = !0, {\n bearingDelta: tr(this._vector, i),\n pinchAround: e\n };\n }, e.prototype._isBelowThreshold = function (t) {\n this._minDiameter = Math.min(this._minDiameter, t.mag());\n var e = 25 / (Math.PI * this._minDiameter) * 360,\n i = tr(t, this._startVector);\n return Math.abs(i) < e;\n }, e;\n }(Yo);\n\n function ir(t) {\n return Math.abs(t.y) > Math.abs(t.x);\n }\n\n var or = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e.prototype.reset = function () {\n t.prototype.reset.call(this), this._valid = void 0, delete this._firstMove, delete this._lastPoints;\n }, e.prototype._start = function (t) {\n this._lastPoints = t, ir(t[0].sub(t[1])) && (this._valid = !1);\n }, e.prototype._move = function (t, e, i) {\n var o = t[0].sub(this._lastPoints[0]),\n r = t[1].sub(this._lastPoints[1]);\n if (this._valid = this.gestureBeginsVertically(o, r, i.timeStamp), this._valid) return this._lastPoints = t, this._active = !0, {\n pitchDelta: (o.y + r.y) / 2 * -.5\n };\n }, e.prototype.gestureBeginsVertically = function (t, e, i) {\n if (void 0 !== this._valid) return this._valid;\n var o = t.mag() >= 2,\n r = e.mag() >= 2;\n\n if (o || r) {\n if (!o || !r) return void 0 === this._firstMove && (this._firstMove = i), i - this._firstMove < 100 && void 0;\n var a = t.y > 0 == e.y > 0;\n return ir(t) && ir(e) && a;\n }\n }, e;\n }(Yo),\n rr = {\n panStep: 100,\n bearingStep: 15,\n pitchStep: 10\n },\n ar = function ar() {\n var t = rr;\n this._panStep = t.panStep, this._bearingStep = t.bearingStep, this._pitchStep = t.pitchStep, this._rotationDisabled = !1;\n };\n\n function nr(t) {\n return t * (2 - t);\n }\n\n ar.prototype.reset = function () {\n this._active = !1;\n }, ar.prototype.keydown = function (t) {\n var e = this;\n\n if (!(t.altKey || t.ctrlKey || t.metaKey)) {\n var i = 0,\n o = 0,\n r = 0,\n a = 0,\n n = 0;\n\n switch (t.keyCode) {\n case 61:\n case 107:\n case 171:\n case 187:\n i = 1;\n break;\n\n case 189:\n case 109:\n case 173:\n i = -1;\n break;\n\n case 37:\n t.shiftKey ? o = -1 : (t.preventDefault(), a = -1);\n break;\n\n case 39:\n t.shiftKey ? o = 1 : (t.preventDefault(), a = 1);\n break;\n\n case 38:\n t.shiftKey ? r = 1 : (t.preventDefault(), n = -1);\n break;\n\n case 40:\n t.shiftKey ? r = -1 : (t.preventDefault(), n = 1);\n break;\n\n default:\n return;\n }\n\n return this._rotationDisabled && (o = 0, r = 0), {\n cameraAnimation: function cameraAnimation(s) {\n var l = s.getZoom();\n s.easeTo({\n duration: 300,\n easeId: "keyboardHandler",\n easing: nr,\n zoom: i ? Math.round(l) + i * (t.shiftKey ? 2 : 1) : l,\n bearing: s.getBearing() + o * e._bearingStep,\n pitch: s.getPitch() + r * e._pitchStep,\n offset: [-a * e._panStep, -n * e._panStep],\n center: s.getCenter()\n }, {\n originalEvent: t\n });\n }\n };\n }\n }, ar.prototype.enable = function () {\n this._enabled = !0;\n }, ar.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, ar.prototype.isEnabled = function () {\n return this._enabled;\n }, ar.prototype.isActive = function () {\n return this._active;\n }, ar.prototype.disableRotation = function () {\n this._rotationDisabled = !0;\n }, ar.prototype.enableRotation = function () {\n this._rotationDisabled = !1;\n };\n\n var sr = function sr(e, i) {\n this._map = e, this._el = e.getCanvasContainer(), this._handler = i, this._delta = 0, this._defaultZoomRate = .01, this._wheelZoomRate = 1 / 450, t.bindAll(["_onTimeout"], this);\n };\n\n sr.prototype.setZoomRate = function (t) {\n this._defaultZoomRate = t;\n }, sr.prototype.setWheelZoomRate = function (t) {\n this._wheelZoomRate = t;\n }, sr.prototype.isEnabled = function () {\n return !!this._enabled;\n }, sr.prototype.isActive = function () {\n return !!this._active || void 0 !== this._finishTimeout;\n }, sr.prototype.isZooming = function () {\n return !!this._zooming;\n }, sr.prototype.enable = function (t) {\n this.isEnabled() || (this._enabled = !0, this._aroundCenter = t && "center" === t.around);\n }, sr.prototype.disable = function () {\n this.isEnabled() && (this._enabled = !1);\n }, sr.prototype.wheel = function (e) {\n if (this.isEnabled()) {\n var i = e.deltaMode === t.window.WheelEvent.DOM_DELTA_LINE ? 40 * e.deltaY : e.deltaY,\n o = t.browser.now(),\n r = o - (this._lastWheelEventTime || 0);\n this._lastWheelEventTime = o, 0 !== i && i % 4.000244140625 == 0 ? this._type = "wheel" : 0 !== i && Math.abs(i) < 4 ? this._type = "trackpad" : r > 400 ? (this._type = null, this._lastValue = i, this._timeout = setTimeout(this._onTimeout, 40, e)) : this._type || (this._type = Math.abs(r * i) < 200 ? "trackpad" : "wheel", this._timeout && (clearTimeout(this._timeout), this._timeout = null, i += this._lastValue)), e.shiftKey && i && (i /= 4), this._type && (this._lastWheelEvent = e, this._delta -= i, this._active || this._start(e)), e.preventDefault();\n }\n }, sr.prototype._onTimeout = function (t) {\n this._type = "wheel", this._delta -= this._lastValue, this._active || this._start(t);\n }, sr.prototype._start = function (e) {\n if (this._delta) {\n this._frameId && (this._frameId = null), this._active = !0, this.isZooming() || (this._zooming = !0), this._finishTimeout && (clearTimeout(this._finishTimeout), delete this._finishTimeout);\n var o = i.mousePos(this._el, e);\n this._around = t.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(o)), this._aroundPoint = this._map.transform.locationPoint(this._around), this._frameId || (this._frameId = !0, this._handler._triggerRenderFrame());\n }\n }, sr.prototype.renderFrame = function () {\n var e = this;\n\n if (this._frameId && (this._frameId = null, this.isActive())) {\n var i = this._map.transform;\n\n if (0 !== this._delta) {\n var o = "wheel" === this._type && Math.abs(this._delta) > 4.000244140625 ? this._wheelZoomRate : this._defaultZoomRate,\n r = 2 / (1 + Math.exp(-Math.abs(this._delta * o)));\n this._delta < 0 && 0 !== r && (r = 1 / r);\n var a = "number" == typeof this._targetZoom ? i.zoomScale(this._targetZoom) : i.scale;\n this._targetZoom = Math.min(i.maxZoom, Math.max(i.minZoom, i.scaleZoom(a * r))), "wheel" === this._type && (this._startZoom = i.zoom, this._easing = this._smoothOutEasing(200)), this._delta = 0;\n }\n\n var n,\n s = "number" == typeof this._targetZoom ? this._targetZoom : i.zoom,\n l = this._startZoom,\n c = this._easing,\n u = !1;\n\n if ("wheel" === this._type && l && c) {\n var h = Math.min((t.browser.now() - this._lastWheelEventTime) / 200, 1),\n p = c(h);\n n = t.number(l, s, p), h < 1 ? this._frameId || (this._frameId = !0) : u = !0;\n } else n = s, u = !0;\n\n return this._active = !0, u && (this._active = !1, this._finishTimeout = setTimeout(function () {\n e._zooming = !1, e._handler._triggerRenderFrame(), delete e._targetZoom, delete e._finishTimeout;\n }, 200)), {\n noInertia: !0,\n needsRenderFrame: !u,\n zoomDelta: n - i.zoom,\n around: this._aroundPoint,\n originalEvent: this._lastWheelEvent\n };\n }\n }, sr.prototype._smoothOutEasing = function (e) {\n var i = t.ease;\n\n if (this._prevEase) {\n var o = this._prevEase,\n r = (t.browser.now() - o.start) / o.duration,\n a = o.easing(r + .01) - o.easing(r),\n n = .27 / Math.sqrt(a * a + 1e-4) * .01,\n s = Math.sqrt(.0729 - n * n);\n i = t.bezier(n, s, .25, 1);\n }\n\n return this._prevEase = {\n start: t.browser.now(),\n duration: e,\n easing: i\n }, i;\n }, sr.prototype.reset = function () {\n this._active = !1;\n };\n\n var lr = function lr(t, e) {\n this._clickZoom = t, this._tapZoom = e;\n };\n\n lr.prototype.enable = function () {\n this._clickZoom.enable(), this._tapZoom.enable();\n }, lr.prototype.disable = function () {\n this._clickZoom.disable(), this._tapZoom.disable();\n }, lr.prototype.isEnabled = function () {\n return this._clickZoom.isEnabled() && this._tapZoom.isEnabled();\n }, lr.prototype.isActive = function () {\n return this._clickZoom.isActive() || this._tapZoom.isActive();\n };\n\n var cr = function cr() {\n this.reset();\n };\n\n cr.prototype.reset = function () {\n this._active = !1;\n }, cr.prototype.dblclick = function (t, e) {\n return t.preventDefault(), {\n cameraAnimation: function cameraAnimation(i) {\n i.easeTo({\n duration: 300,\n zoom: i.getZoom() + (t.shiftKey ? -1 : 1),\n around: i.unproject(e)\n }, {\n originalEvent: t\n });\n }\n };\n }, cr.prototype.enable = function () {\n this._enabled = !0;\n }, cr.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, cr.prototype.isEnabled = function () {\n return this._enabled;\n }, cr.prototype.isActive = function () {\n return this._active;\n };\n\n var ur = function ur() {\n this._tap = new qo({\n numTouches: 1,\n numTaps: 1\n }), this.reset();\n };\n\n ur.prototype.reset = function () {\n this._active = !1, delete this._swipePoint, delete this._swipeTouch, delete this._tapTime, this._tap.reset();\n }, ur.prototype.touchstart = function (t, e, i) {\n this._swipePoint || (this._tapTime && t.timeStamp - this._tapTime > 500 && this.reset(), this._tapTime ? i.length > 0 && (this._swipePoint = e[0], this._swipeTouch = i[0].identifier) : this._tap.touchstart(t, e, i));\n }, ur.prototype.touchmove = function (t, e, i) {\n if (this._tapTime) {\n if (this._swipePoint) {\n if (i[0].identifier !== this._swipeTouch) return;\n var o = e[0],\n r = o.y - this._swipePoint.y;\n return this._swipePoint = o, t.preventDefault(), this._active = !0, {\n zoomDelta: r / 128\n };\n }\n } else this._tap.touchmove(t, e, i);\n }, ur.prototype.touchend = function (t, e, i) {\n this._tapTime ? this._swipePoint && 0 === i.length && this.reset() : this._tap.touchend(t, e, i) && (this._tapTime = t.timeStamp);\n }, ur.prototype.touchcancel = function () {\n this.reset();\n }, ur.prototype.enable = function () {\n this._enabled = !0;\n }, ur.prototype.disable = function () {\n this._enabled = !1, this.reset();\n }, ur.prototype.isEnabled = function () {\n return this._enabled;\n }, ur.prototype.isActive = function () {\n return this._active;\n };\n\n var hr = function hr(t, e, i) {\n this._el = t, this._mousePan = e, this._touchPan = i;\n };\n\n hr.prototype.enable = function (t) {\n this._inertiaOptions = t || {}, this._mousePan.enable(), this._touchPan.enable(), this._el.classList.add("maplibregl-touch-drag-pan");\n }, hr.prototype.disable = function () {\n this._mousePan.disable(), this._touchPan.disable(), this._el.classList.remove("maplibregl-touch-drag-pan");\n }, hr.prototype.isEnabled = function () {\n return this._mousePan.isEnabled() && this._touchPan.isEnabled();\n }, hr.prototype.isActive = function () {\n return this._mousePan.isActive() || this._touchPan.isActive();\n };\n\n var pr = function pr(t, e, i) {\n this._pitchWithRotate = t.pitchWithRotate, this._mouseRotate = e, this._mousePitch = i;\n };\n\n pr.prototype.enable = function () {\n this._mouseRotate.enable(), this._pitchWithRotate && this._mousePitch.enable();\n }, pr.prototype.disable = function () {\n this._mouseRotate.disable(), this._mousePitch.disable();\n }, pr.prototype.isEnabled = function () {\n return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled());\n }, pr.prototype.isActive = function () {\n return this._mouseRotate.isActive() || this._mousePitch.isActive();\n };\n\n var dr = function dr(t, e, i, o) {\n this._el = t, this._touchZoom = e, this._touchRotate = i, this._tapDragZoom = o, this._rotationDisabled = !1, this._enabled = !0;\n };\n\n dr.prototype.enable = function (t) {\n this._touchZoom.enable(t), this._rotationDisabled || this._touchRotate.enable(t), this._tapDragZoom.enable(), this._el.classList.add("maplibregl-touch-zoom-rotate");\n }, dr.prototype.disable = function () {\n this._touchZoom.disable(), this._touchRotate.disable(), this._tapDragZoom.disable(), this._el.classList.remove("maplibregl-touch-zoom-rotate");\n }, dr.prototype.isEnabled = function () {\n return this._touchZoom.isEnabled() && (this._rotationDisabled || this._touchRotate.isEnabled()) && this._tapDragZoom.isEnabled();\n }, dr.prototype.isActive = function () {\n return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive();\n }, dr.prototype.disableRotation = function () {\n this._rotationDisabled = !0, this._touchRotate.disable();\n }, dr.prototype.enableRotation = function () {\n this._rotationDisabled = !1, this._touchZoom.isEnabled() && this._touchRotate.enable();\n };\n\n var _r = function _r(t) {\n return t.zoom || t.drag || t.pitch || t.rotate;\n },\n fr = function (t) {\n function e() {\n t.apply(this, arguments);\n }\n\n return t && (e.__proto__ = t), (e.prototype = Object.create(t && t.prototype)).constructor = e, e;\n }(t.Event);\n\n function mr(t) {\n return t.panDelta && t.panDelta.mag() || t.zoomDelta || t.bearingDelta || t.pitchDelta;\n }\n\n var gr = function gr(e, o) {\n this._map = e, this._el = this._map.getCanvasContainer(), this._handlers = [], this._handlersById = {}, this._changes = [], this._inertia = new Ao(e), this._bearingSnap = o.bearingSnap, this._previousActiveHandlers = {}, this._eventsInProgress = {}, this._addDefaultHandlers(o), t.bindAll(["handleEvent", "handleWindowEvent"], this);\n var r = this._el;\n this._listeners = [[r, "touchstart", {\n passive: !0\n }], [r, "touchmove", {\n passive: !1\n }], [r, "touchend", void 0], [r, "touchcancel", void 0], [r, "mousedown", void 0], [r, "mousemove", void 0], [r, "mouseup", void 0], [t.window.document, "mousemove", {\n capture: !0\n }], [t.window.document, "mouseup", void 0], [r, "mouseover", void 0], [r, "mouseout", void 0], [r, "dblclick", void 0], [r, "click", void 0], [r, "keydown", {\n capture: !1\n }], [r, "keyup", void 0], [r, "wheel", {\n passive: !1\n }], [r, "contextmenu", void 0], [t.window, "blur", void 0]];\n\n for (var a = 0, n = this._listeners; a < n.length; a += 1) {\n var s = n[a],\n l = s[0];\n i.addEventListener(l, s[1], l === t.window.document ? this.handleWindowEvent : this.handleEvent, s[2]);\n }\n };\n\n gr.prototype.destroy = function () {\n for (var e = 0, o = this._listeners; e < o.length; e += 1) {\n var r = o[e],\n a = r[0];\n i.removeEventListener(a, r[1], a === t.window.document ? this.handleWindowEvent : this.handleEvent, r[2]);\n }\n }, gr.prototype._addDefaultHandlers = function (t) {\n var e = this._map,\n i = e.getCanvasContainer();\n\n this._add("mapEvent", new Oo(e, t));\n\n var o = e.boxZoom = new Uo(e, t);\n\n this._add("boxZoom", o);\n\n var r = new jo(),\n a = new cr();\n e.doubleClickZoom = new lr(a, r), this._add("tapZoom", r), this._add("clickZoom", a);\n var n = new ur();\n\n this._add("tapDragZoom", n);\n\n var s = e.touchPitch = new or();\n\n this._add("touchPitch", s);\n\n var l = new Xo(t),\n c = new Ho(t);\n e.dragRotate = new pr(t, l, c), this._add("mouseRotate", l, ["mousePitch"]), this._add("mousePitch", c, ["mouseRotate"]);\n var u = new Wo(t),\n h = new Ko(t);\n e.dragPan = new hr(i, u, h), this._add("mousePan", u), this._add("touchPan", h, ["touchZoom", "touchRotate"]);\n var p = new er(),\n d = new $o();\n e.touchZoomRotate = new dr(i, d, p, n), this._add("touchRotate", p, ["touchPan", "touchZoom"]), this._add("touchZoom", d, ["touchPan", "touchRotate"]);\n\n var _ = e.scrollZoom = new sr(e, this);\n\n this._add("scrollZoom", _, ["mousePan"]);\n\n var f = e.keyboard = new ar();\n this._add("keyboard", f), this._add("blockableMapEvent", new Fo(e));\n\n for (var m = 0, g = ["boxZoom", "doubleClickZoom", "tapDragZoom", "touchPitch", "dragRotate", "dragPan", "touchZoomRotate", "scrollZoom", "keyboard"]; m < g.length; m += 1) {\n var v = g[m];\n t.interactive && t[v] && e[v].enable(t[v]);\n }\n }, gr.prototype._add = function (t, e, i) {\n this._handlers.push({\n handlerName: t,\n handler: e,\n allowed: i\n }), this._handlersById[t] = e;\n }, gr.prototype.stop = function (t) {\n if (!this._updatingCamera) {\n for (var e = 0, i = this._handlers; e < i.length; e += 1) {\n i[e].handler.reset();\n }\n\n this._inertia.clear(), this._fireEvents({}, {}, t), this._changes = [];\n }\n }, gr.prototype.isActive = function () {\n for (var t = 0, e = this._handlers; t < e.length; t += 1) {\n if (e[t].handler.isActive()) return !0;\n }\n\n return !1;\n }, gr.prototype.isZooming = function () {\n return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming();\n }, gr.prototype.isRotating = function () {\n return !!this._eventsInProgress.rotate;\n }, gr.prototype.isMoving = function () {\n return Boolean(_r(this._eventsInProgress)) || this.isZooming();\n }, gr.prototype._blockedByActive = function (t, e, i) {\n for (var o in t) {\n if (o !== i && (!e || e.indexOf(o) < 0)) return !0;\n }\n\n return !1;\n }, gr.prototype.handleWindowEvent = function (t) {\n this.handleEvent(t, t.type + "Window");\n }, gr.prototype._getMapTouches = function (t) {\n for (var e = [], i = 0, o = t; i < o.length; i += 1) {\n var r = o[i];\n this._el.contains(r.target) && e.push(r);\n }\n\n return e;\n }, gr.prototype.handleEvent = function (t, e) {\n if ("blur" !== t.type) {\n this._updatingCamera = !0;\n\n for (var o = "renderFrame" === t.type ? void 0 : t, r = {\n needsRenderFrame: !1\n }, a = {}, n = {}, s = t.touches ? this._getMapTouches(t.touches) : void 0, l = s ? i.touchPos(this._el, s) : i.mousePos(this._el, t), c = 0, u = this._handlers; c < u.length; c += 1) {\n var h = u[c],\n p = h.handlerName,\n d = h.handler,\n _ = h.allowed;\n\n if (d.isEnabled()) {\n var f = void 0;\n this._blockedByActive(n, _, p) ? d.reset() : d[e || t.type] && (f = d[e || t.type](t, l, s), this.mergeHandlerResult(r, a, f, p, o), f && f.needsRenderFrame && this._triggerRenderFrame()), (f || d.isActive()) && (n[p] = d);\n }\n }\n\n var m = {};\n\n for (var g in this._previousActiveHandlers) {\n n[g] || (m[g] = o);\n }\n\n this._previousActiveHandlers = n, (Object.keys(m).length || mr(r)) && (this._changes.push([r, a, m]), this._triggerRenderFrame()), (Object.keys(n).length || mr(r)) && this._map._stop(!0), this._updatingCamera = !1;\n var v = r.cameraAnimation;\n v && (this._inertia.clear(), this._fireEvents({}, {}, !0), this._changes = [], v(this._map));\n } else this.stop(!0);\n }, gr.prototype.mergeHandlerResult = function (e, i, o, r, a) {\n if (o) {\n t.extend(e, o);\n var n = {\n handlerName: r,\n originalEvent: o.originalEvent || a\n };\n void 0 !== o.zoomDelta && (i.zoom = n), void 0 !== o.panDelta && (i.drag = n), void 0 !== o.pitchDelta && (i.pitch = n), void 0 !== o.bearingDelta && (i.rotate = n);\n }\n }, gr.prototype._applyChanges = function () {\n for (var e = {}, i = {}, o = {}, r = 0, a = this._changes; r < a.length; r += 1) {\n var n = a[r],\n s = n[0],\n l = n[1],\n c = n[2];\n s.panDelta && (e.panDelta = (e.panDelta || new t.Point(0, 0))._add(s.panDelta)), s.zoomDelta && (e.zoomDelta = (e.zoomDelta || 0) + s.zoomDelta), s.bearingDelta && (e.bearingDelta = (e.bearingDelta || 0) + s.bearingDelta), s.pitchDelta && (e.pitchDelta = (e.pitchDelta || 0) + s.pitchDelta), void 0 !== s.around && (e.around = s.around), void 0 !== s.pinchAround && (e.pinchAround = s.pinchAround), s.noInertia && (e.noInertia = s.noInertia), t.extend(i, l), t.extend(o, c);\n }\n\n this._updateMapTransform(e, i, o), this._changes = [];\n }, gr.prototype._updateMapTransform = function (t, e, i) {\n var o = this._map,\n r = o.transform;\n if (!mr(t)) return this._fireEvents(e, i, !0);\n var a = t.panDelta,\n n = t.zoomDelta,\n s = t.bearingDelta,\n l = t.pitchDelta,\n c = t.around,\n u = t.pinchAround;\n void 0 !== u && (c = u), o._stop(!0), c = c || o.transform.centerPoint;\n var h = r.pointLocation(a ? c.sub(a) : c);\n s && (r.bearing += s), l && (r.pitch += l), n && (r.zoom += n), r.setLocationAtPoint(h, c), this._map._update(), t.noInertia || this._inertia.record(t), this._fireEvents(e, i, !0);\n }, gr.prototype._fireEvents = function (e, i, o) {\n var r = this,\n a = _r(this._eventsInProgress),\n n = _r(e),\n s = {};\n\n for (var l in e) {\n this._eventsInProgress[l] || (s[l + "start"] = e[l].originalEvent), this._eventsInProgress[l] = e[l];\n }\n\n for (var c in !a && n && this._fireEvent("movestart", n.originalEvent), s) {\n this._fireEvent(c, s[c]);\n }\n\n for (var u in n && this._fireEvent("move", n.originalEvent), e) {\n this._fireEvent(u, e[u].originalEvent);\n }\n\n var h,\n p = {};\n\n for (var d in this._eventsInProgress) {\n var _ = this._eventsInProgress[d],\n f = _.handlerName,\n m = _.originalEvent;\n this._handlersById[f].isActive() || (delete this._eventsInProgress[d], p[d + "end"] = h = i[f] || m);\n }\n\n for (var g in p) {\n this._fireEvent(g, p[g]);\n }\n\n var v = _r(this._eventsInProgress);\n\n if (o && (a || n) && !v) {\n this._updatingCamera = !0;\n\n var y = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions),\n x = function x(t) {\n return 0 !== t && -r._bearingSnap < t && t < r._bearingSnap;\n };\n\n y ? (x(y.bearing || this._map.getBearing()) && (y.bearing = 0), this._map.easeTo(y, {\n originalEvent: h\n })) : (this._map.fire(new t.Event("moveend", {\n originalEvent: h\n })), x(this._map.getBearing()) && this._map.resetNorth()), this._updatingCamera = !1;\n }\n }, gr.prototype._fireEvent = function (e, i) {\n this._map.fire(new t.Event(e, i ? {\n originalEvent: i\n } : {}));\n }, gr.prototype._requestFrame = function () {\n var t = this;\n return this._map.triggerRepaint(), this._map._renderTaskQueue.add(function (e) {\n delete t._frameId, t.handleEvent(new fr("renderFrame", {\n timeStamp: e\n })), t._applyChanges();\n });\n }, gr.prototype._triggerRenderFrame = function () {\n void 0 === this._frameId && (this._frameId = this._requestFrame());\n };\n\n var vr = function (e) {\n function i(i, o) {\n e.call(this), this._moving = !1, this._zooming = !1, this.transform = i, this._bearingSnap = o.bearingSnap, t.bindAll(["_renderFrameCallback"], this);\n }\n\n return e && (i.__proto__ = e), (i.prototype = Object.create(e && e.prototype)).constructor = i, i.prototype.getCenter = function () {\n return new t.LngLat(this.transform.center.lng, this.transform.center.lat);\n }, i.prototype.setCenter = function (t, e) {\n return this.jumpTo({\n center: t\n }, e);\n }, i.prototype.panBy = function (e, i, o) {\n return e = t.Point.convert(e).mult(-1), this.panTo(this.transform.center, t.extend({\n offset: e\n }, i), o);\n }, i.prototype.panTo = function (e, i, o) {\n return this.easeTo(t.extend({\n center: e\n }, i), o);\n }, i.prototype.getZoom = function () {\n return this.transform.zoom;\n }, i.prototype.setZoom = function (t, e) {\n return this.jumpTo({\n zoom: t\n }, e), this;\n }, i.prototype.zoomTo = function (e, i, o) {\n return this.easeTo(t.extend({\n zoom: e\n }, i), o);\n }, i.prototype.zoomIn = function (t, e) {\n return this.zoomTo(this.getZoom() + 1, t, e), this;\n }, i.prototype.zoomOut = function (t, e) {\n return this.zoomTo(this.getZoom() - 1, t, e), this;\n }, i.prototype.getBearing = function () {\n return this.transform.bearing;\n }, i.prototype.setBearing = function (t, e) {\n return this.jumpTo({\n bearing: t\n }, e), this;\n }, i.prototype.getPadding = function () {\n return this.transform.padding;\n }, i.prototype.setPadding = function (t, e) {\n return this.jumpTo({\n padding: t\n }, e), this;\n }, i.prototype.rotateTo = function (e, i, o) {\n return this.easeTo(t.extend({\n bearing: e\n }, i), o);\n }, i.prototype.resetNorth = function (e, i) {\n return this.rotateTo(0, t.extend({\n duration: 1e3\n }, e), i), this;\n }, i.prototype.resetNorthPitch = function (e, i) {\n return this.easeTo(t.extend({\n bearing: 0,\n pitch: 0,\n duration: 1e3\n }, e), i), this;\n }, i.prototype.snapToNorth = function (t, e) {\n return Math.abs(this.getBearing()) < this._bearingSnap ? this.resetNorth(t, e) : this;\n }, i.prototype.getPitch = function () {\n return this.transform.pitch;\n }, i.prototype.setPitch = function (t, e) {\n return this.jumpTo({\n pitch: t\n }, e), this;\n }, i.prototype.cameraForBounds = function (e, i) {\n e = t.LngLatBounds.convert(e);\n var o = i && i.bearing || 0;\n return this._cameraForBoxAndBearing(e.getNorthWest(), e.getSouthEast(), o, i);\n }, i.prototype._cameraForBoxAndBearing = function (e, i, o, r) {\n var a = {\n top: 0,\n bottom: 0,\n right: 0,\n left: 0\n };\n\n if ("number" == typeof (r = t.extend({\n padding: a,\n offset: [0, 0],\n maxZoom: this.transform.maxZoom\n }, r)).padding) {\n var n = r.padding;\n r.padding = {\n top: n,\n bottom: n,\n right: n,\n left: n\n };\n }\n\n r.padding = t.extend(a, r.padding);\n\n var s = this.transform,\n l = s.padding,\n c = s.project(t.LngLat.convert(e)),\n u = s.project(t.LngLat.convert(i)),\n h = c.rotate(-o * Math.PI / 180),\n p = u.rotate(-o * Math.PI / 180),\n d = new t.Point(Math.max(h.x, p.x), Math.max(h.y, p.y)),\n _ = new t.Point(Math.min(h.x, p.x), Math.min(h.y, p.y)),\n f = d.sub(_),\n m = (s.width - (l.left + l.right + r.padding.left + r.padding.right)) / f.x,\n g = (s.height - (l.top + l.bottom + r.padding.top + r.padding.bottom)) / f.y;\n\n if (!(g < 0 || m < 0)) {\n var v = Math.min(s.scaleZoom(s.scale * Math.min(m, g)), r.maxZoom),\n y = "number" == typeof r.offset.x ? new t.Point(r.offset.x, r.offset.y) : t.Point.convert(r.offset),\n x = new t.Point((r.padding.left - r.padding.right) / 2, (r.padding.top - r.padding.bottom) / 2).rotate(o * Math.PI / 180),\n b = y.add(x).mult(s.scale / s.zoomScale(v));\n return {\n center: s.unproject(c.add(u).div(2).sub(b)),\n zoom: v,\n bearing: o\n };\n }\n\n t.warnOnce("Map cannot fit within canvas with the given bounds, padding, and/or offset.");\n }, i.prototype.fitBounds = function (t, e, i) {\n return this._fitInternal(this.cameraForBounds(t, e), e, i);\n }, i.prototype.fitScreenCoordinates = function (e, i, o, r, a) {\n return this._fitInternal(this._cameraForBoxAndBearing(this.transform.pointLocation(t.Point.convert(e)), this.transform.pointLocation(t.Point.convert(i)), o, r), r, a);\n }, i.prototype._fitInternal = function (e, i, o) {\n return e ? (delete (i = t.extend(e, i)).padding, i.linear ? this.easeTo(i, o) : this.flyTo(i, o)) : this;\n }, i.prototype.jumpTo = function (e, i) {\n this.stop();\n var o = this.transform,\n r = !1,\n a = !1,\n n = !1;\n return "zoom" in e && o.zoom !== +e.zoom && (r = !0, o.zoom = +e.zoom), void 0 !== e.center && (o.center = t.LngLat.convert(e.center)), "bearing" in e && o.bearing !== +e.bearing && (a = !0, o.bearing = +e.bearing), "pitch" in e && o.pitch !== +e.pitch && (n = !0, o.pitch = +e.pitch), null == e.padding || o.isPaddingEqual(e.padding) || (o.padding = e.padding), this.fire(new t.Event("movestart", i)).fire(new t.Event("move", i)), r && this.fire(new t.Event("zoomstart", i)).fire(new t.Event("zoom", i)).fire(new t.Event("zoomend", i)), a && this.fire(new t.Event("rotatestart", i)).fire(new t.Event("rotate", i)).fire(new t.Event("rotateend", i)), n && this.fire(new t.Event("pitchstart", i)).fire(new t.Event("pitch", i)).fire(new t.Event("pitchend", i)), this.fire(new t.Event("moveend", i));\n }, i.prototype.easeTo = function (e, i) {\n var o = this;\n this._stop(!1, e.easeId), (!1 === (e = t.extend({\n offset: [0, 0],\n duration: 500,\n easing: t.ease\n }, e)).animate || !e.essential && t.browser.prefersReducedMotion) && (e.duration = 0);\n\n var r = this.transform,\n a = this.getZoom(),\n n = this.getBearing(),\n s = this.getPitch(),\n l = this.getPadding(),\n c = "zoom" in e ? +e.zoom : a,\n u = "bearing" in e ? this._normalizeBearing(e.bearing, n) : n,\n h = "pitch" in e ? +e.pitch : s,\n p = "padding" in e ? e.padding : r.padding,\n d = t.Point.convert(e.offset),\n _ = r.centerPoint.add(d),\n f = r.pointLocation(_),\n m = t.LngLat.convert(e.center || f);\n\n this._normalizeCenter(m);\n\n var g,\n v,\n y = r.project(f),\n x = r.project(m).sub(y),\n b = r.zoomScale(c - a);\n e.around && (g = t.LngLat.convert(e.around), v = r.locationPoint(g));\n var w = {\n moving: this._moving,\n zooming: this._zooming,\n rotating: this._rotating,\n pitching: this._pitching\n };\n return this._zooming = this._zooming || c !== a, this._rotating = this._rotating || n !== u, this._pitching = this._pitching || h !== s, this._padding = !r.isPaddingEqual(p), this._easeId = e.easeId, this._prepareEase(i, e.noMoveStart, w), this._ease(function (e) {\n if (o._zooming && (r.zoom = t.number(a, c, e)), o._rotating && (r.bearing = t.number(n, u, e)), o._pitching && (r.pitch = t.number(s, h, e)), o._padding && (r.interpolatePadding(l, p, e), _ = r.centerPoint.add(d)), g) r.setLocationAtPoint(g, v);else {\n var f = r.zoomScale(r.zoom - a),\n m = c > a ? Math.min(2, b) : Math.max(.5, b),\n w = Math.pow(m, 1 - e),\n T = r.unproject(y.add(x.mult(e * w)).mult(f));\n r.setLocationAtPoint(r.renderWorldCopies ? T.wrap() : T, _);\n }\n\n o._fireMoveEvents(i);\n }, function (t) {\n o._afterEase(i, t);\n }, e), this;\n }, i.prototype._prepareEase = function (e, i, o) {\n void 0 === o && (o = {}), this._moving = !0, i || o.moving || this.fire(new t.Event("movestart", e)), this._zooming && !o.zooming && this.fire(new t.Event("zoomstart", e)), this._rotating && !o.rotating && this.fire(new t.Event("rotatestart", e)), this._pitching && !o.pitching && this.fire(new t.Event("pitchstart", e));\n }, i.prototype._fireMoveEvents = function (e) {\n this.fire(new t.Event("move", e)), this._zooming && this.fire(new t.Event("zoom", e)), this._rotating && this.fire(new t.Event("rotate", e)), this._pitching && this.fire(new t.Event("pitch", e));\n }, i.prototype._afterEase = function (e, i) {\n if (!this._easeId || !i || this._easeId !== i) {\n delete this._easeId;\n var o = this._zooming,\n r = this._rotating,\n a = this._pitching;\n this._moving = !1, this._zooming = !1, this._rotating = !1, this._pitching = !1, this._padding = !1, o && this.fire(new t.Event("zoomend", e)), r && this.fire(new t.Event("rotateend", e)), a && this.fire(new t.Event("pitchend", e)), this.fire(new t.Event("moveend", e));\n }\n }, i.prototype.flyTo = function (e, i) {\n var o = this;\n\n if (!e.essential && t.browser.prefersReducedMotion) {\n var r = t.pick(e, ["center", "zoom", "bearing", "pitch", "around"]);\n return this.jumpTo(r, i);\n }\n\n this.stop(), e = t.extend({\n offset: [0, 0],\n speed: 1.2,\n curve: 1.42,\n easing: t.ease\n }, e);\n\n var a = this.transform,\n n = this.getZoom(),\n s = this.getBearing(),\n l = this.getPitch(),\n c = this.getPadding(),\n u = "zoom" in e ? t.clamp(+e.zoom, a.minZoom, a.maxZoom) : n,\n h = "bearing" in e ? this._normalizeBearing(e.bearing, s) : s,\n p = "pitch" in e ? +e.pitch : l,\n d = "padding" in e ? e.padding : a.padding,\n _ = a.zoomScale(u - n),\n f = t.Point.convert(e.offset),\n m = a.centerPoint.add(f),\n g = a.pointLocation(m),\n v = t.LngLat.convert(e.center || g);\n\n this._normalizeCenter(v);\n\n var y = a.project(g),\n x = a.project(v).sub(y),\n b = e.curve,\n w = Math.max(a.width, a.height),\n T = w / _,\n E = x.mag();\n\n if ("minZoom" in e) {\n var I = t.clamp(Math.min(e.minZoom, n, u), a.minZoom, a.maxZoom),\n P = w / a.zoomScale(I - n);\n b = Math.sqrt(P / E * 2);\n }\n\n var S = b * b;\n\n function C(t) {\n var e = (T * T - w * w + (t ? -1 : 1) * S * S * E * E) / (2 * (t ? T : w) * S * E);\n return Math.log(Math.sqrt(e * e + 1) - e);\n }\n\n function z(t) {\n return (Math.exp(t) - Math.exp(-t)) / 2;\n }\n\n function D(t) {\n return (Math.exp(t) + Math.exp(-t)) / 2;\n }\n\n var A = C(0),\n M = function M(t) {\n return D(A) / D(A + b * t);\n },\n L = function L(t) {\n return w * ((D(A) * (z(e = A + b * t) / D(e)) - z(A)) / S) / E;\n var e;\n },\n R = (C(1) - A) / b;\n\n if (Math.abs(E) < 1e-6 || !isFinite(R)) {\n if (Math.abs(w - T) < 1e-6) return this.easeTo(e, i);\n var k = T < w ? -1 : 1;\n R = Math.abs(Math.log(T / w)) / b, L = function L() {\n return 0;\n }, M = function M(t) {\n return Math.exp(k * b * t);\n };\n }\n\n return e.duration = "duration" in e ? +e.duration : 1e3 * R / ("screenSpeed" in e ? +e.screenSpeed / b : +e.speed), e.maxDuration && e.duration > e.maxDuration && (e.duration = 0), this._zooming = !0, this._rotating = s !== h, this._pitching = p !== l, this._padding = !a.isPaddingEqual(d), this._prepareEase(i, !1), this._ease(function (e) {\n var r = e * R,\n _ = 1 / M(r);\n\n a.zoom = 1 === e ? u : n + a.scaleZoom(_), o._rotating && (a.bearing = t.number(s, h, e)), o._pitching && (a.pitch = t.number(l, p, e)), o._padding && (a.interpolatePadding(c, d, e), m = a.centerPoint.add(f));\n var g = 1 === e ? v : a.unproject(y.add(x.mult(L(r))).mult(_));\n a.setLocationAtPoint(a.renderWorldCopies ? g.wrap() : g, m), o._fireMoveEvents(i);\n }, function () {\n return o._afterEase(i);\n }, e), this;\n }, i.prototype.isEasing = function () {\n return !!this._easeFrameId;\n }, i.prototype.stop = function () {\n return this._stop();\n }, i.prototype._stop = function (t, e) {\n if (this._easeFrameId && (this._cancelRenderFrame(this._easeFrameId), delete this._easeFrameId, delete this._onEaseFrame), this._onEaseEnd) {\n var i = this._onEaseEnd;\n delete this._onEaseEnd, i.call(this, e);\n }\n\n if (!t) {\n var o = this.handlers;\n o && o.stop(!1);\n }\n\n return this;\n }, i.prototype._ease = function (e, i, o) {\n !1 === o.animate || 0 === o.duration ? (e(1), i()) : (this._easeStart = t.browser.now(), this._easeOptions = o, this._onEaseFrame = e, this._onEaseEnd = i, this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback));\n }, i.prototype._renderFrameCallback = function () {\n var e = Math.min((t.browser.now() - this._easeStart) / this._easeOptions.duration, 1);\n this._onEaseFrame(this._easeOptions.easing(e)), e < 1 ? this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback) : this.stop();\n }, i.prototype._normalizeBearing = function (e, i) {\n e = t.wrap(e, -180, 180);\n var o = Math.abs(e - i);\n return Math.abs(e - 360 - i) < o && (e -= 360), Math.abs(e + 360 - i) < o && (e += 360), e;\n }, i.prototype._normalizeCenter = function (t) {\n var e = this.transform;\n\n if (e.renderWorldCopies && !e.lngRange) {\n var i = t.lng - e.center.lng;\n t.lng += i > 180 ? -360 : i < -180 ? 360 : 0;\n }\n }, i;\n }(t.Evented),\n yr = function yr(e) {\n void 0 === e && (e = {}), this.options = e, t.bindAll(["_toggleAttribution", "_updateEditLink", "_updateData", "_updateCompact"], this);\n };\n\n yr.prototype.getDefaultPosition = function () {\n return "bottom-right";\n }, yr.prototype.onAdd = function (t) {\n var e = this.options && this.options.compact;\n return this._map = t, this._container = i.create("div", "maplibregl-ctrl maplibregl-ctrl-attrib"), this._compactButton = i.create("button", "maplibregl-ctrl-attrib-button", this._container), this._compactButton.addEventListener("click", this._toggleAttribution), this._compactButton.type = "button", this._setElementTitle(this._compactButton, "ToggleAttribution"), this._innerContainer = i.create("div", "maplibregl-ctrl-attrib-inner", this._container), this._innerContainer.setAttribute("role", "list"), e && this._container.classList.add("maplibregl-compact"), this._updateAttributions(), this._updateEditLink(), this._map.on("styledata", this._updateData), this._map.on("sourcedata", this._updateData), this._map.on("moveend", this._updateEditLink), void 0 === e && (this._map.on("resize", this._updateCompact), this._updateCompact()), this._container;\n }, yr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("styledata", this._updateData), this._map.off("sourcedata", this._updateData), this._map.off("moveend", this._updateEditLink), this._map.off("resize", this._updateCompact), this._map = void 0, this._attribHTML = void 0;\n }, yr.prototype._setElementTitle = function (t, e) {\n var i = this._map._getUIString("AttributionControl." + e);\n\n t.title = i, t.setAttribute("aria-label", i);\n }, yr.prototype._toggleAttribution = function () {\n this._container.classList.contains("maplibregl-compact-show") ? (this._container.classList.remove("maplibregl-compact-show"), this._compactButton.setAttribute("aria-pressed", "false")) : (this._container.classList.add("maplibregl-compact-show"), this._compactButton.setAttribute("aria-pressed", "true"));\n }, yr.prototype._updateEditLink = function () {\n var e = this._editLink;\n e || (e = this._editLink = this._container.querySelector(".mapbox-improve-map"));\n var i = [{\n key: "owner",\n value: this.styleOwner\n }, {\n key: "id",\n value: this.styleId\n }, {\n key: "access_token",\n value: this._map._requestManager._customAccessToken || t.config.ACCESS_TOKEN\n }];\n\n if (e) {\n var o = i.reduce(function (t, e, o) {\n return e.value && (t += e.key + "=" + e.value + (o < i.length - 1 ? "&" : "")), t;\n }, "?");\n e.href = t.config.FEEDBACK_URL + "/" + o + (this._map._hash ? this._map._hash.getHashString(!0) : ""), e.rel = "noopener nofollow", this._setElementTitle(e, "MapFeedback");\n }\n }, yr.prototype._updateData = function (t) {\n !t || "metadata" !== t.sourceDataType && "visibility" !== t.sourceDataType && "style" !== t.dataType || (this._updateAttributions(), this._updateEditLink());\n }, yr.prototype._updateAttributions = function () {\n if (this._map.style) {\n var t = [];\n\n if (this.options.customAttribution && (Array.isArray(this.options.customAttribution) ? t = t.concat(this.options.customAttribution.map(function (t) {\n return "string" != typeof t ? "" : t;\n })) : "string" == typeof this.options.customAttribution && t.push(this.options.customAttribution)), this._map.style.stylesheet) {\n var e = this._map.style.stylesheet;\n this.styleOwner = e.owner, this.styleId = e.id;\n }\n\n var i = this._map.style.sourceCaches;\n\n for (var o in i) {\n var r = i[o];\n\n if (r.used) {\n var a = r.getSource();\n a.attribution && t.indexOf(a.attribution) < 0 && t.push(a.attribution);\n }\n }\n\n t.sort(function (t, e) {\n return t.length - e.length;\n });\n var n = (t = t.filter(function (e, i) {\n for (var o = i + 1; o < t.length; o++) {\n if (t[o].indexOf(e) >= 0) return !1;\n }\n\n return !0;\n })).join(" | ");\n n !== this._attribHTML && (this._attribHTML = n, t.length ? (this._innerContainer.innerHTML = n, this._container.classList.remove("maplibregl-attrib-empty")) : this._container.classList.add("maplibregl-attrib-empty"), this._editLink = null);\n }\n }, yr.prototype._updateCompact = function () {\n this._map.getCanvasContainer().offsetWidth <= 640 ? this._container.classList.add("maplibregl-compact") : this._container.classList.remove("maplibregl-compact", "maplibregl-compact-show");\n };\n\n var xr = function xr() {\n t.bindAll(["_updateLogo"], this), t.bindAll(["_updateCompact"], this);\n };\n\n xr.prototype.onAdd = function (t) {\n this._map = t, this._container = i.create("div", "maplibregl-ctrl");\n var e = i.create("a", "maplibregl-ctrl-logo");\n return e.target = "_blank", e.rel = "noopener nofollow", e.href = "https://maplibre.org/", e.setAttribute("aria-label", this._map._getUIString("LogoControl.Title")), e.setAttribute("rel", "noopener nofollow"), this._container.appendChild(e), this._container.style.display = "none", this._map.on("sourcedata", this._updateLogo), this._updateLogo(), this._map.on("resize", this._updateCompact), this._updateCompact(), this._container;\n }, xr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("sourcedata", this._updateLogo), this._map.off("resize", this._updateCompact);\n }, xr.prototype.getDefaultPosition = function () {\n return "bottom-left";\n }, xr.prototype._updateLogo = function (t) {\n t && "metadata" !== t.sourceDataType || (this._container.style.display = this._logoRequired() ? "block" : "none");\n }, xr.prototype._logoRequired = function () {\n if (this._map.style) {\n var t = this._map.style.sourceCaches;\n\n for (var e in t) {\n if (t[e].getSource().mapbox_logo) return !0;\n }\n\n return !1;\n }\n }, xr.prototype._updateCompact = function () {\n var t = this._container.children;\n\n if (t.length) {\n var e = t[0];\n this._map.getCanvasContainer().offsetWidth < 250 ? e.classList.add("maplibregl-compact") : e.classList.remove("maplibregl-compact");\n }\n };\n\n var br = function br() {\n this._queue = [], this._id = 0, this._cleared = !1, this._currentlyRunning = !1;\n };\n\n br.prototype.add = function (t) {\n var e = ++this._id;\n return this._queue.push({\n callback: t,\n id: e,\n cancelled: !1\n }), e;\n }, br.prototype.remove = function (t) {\n for (var e = this._currentlyRunning, i = 0, o = e ? this._queue.concat(e) : this._queue; i < o.length; i += 1) {\n var r = o[i];\n if (r.id === t) return void (r.cancelled = !0);\n }\n }, br.prototype.run = function (t) {\n void 0 === t && (t = 0);\n var e = this._currentlyRunning = this._queue;\n this._queue = [];\n\n for (var i = 0, o = e; i < o.length; i += 1) {\n var r = o[i];\n if (!r.cancelled && (r.callback(t), this._cleared)) break;\n }\n\n this._cleared = !1, this._currentlyRunning = !1;\n }, br.prototype.clear = function () {\n this._currentlyRunning && (this._cleared = !0), this._queue = [];\n };\n\n var wr = {\n "AttributionControl.ToggleAttribution": "Toggle attribution",\n "AttributionControl.MapFeedback": "Map feedback",\n "FullscreenControl.Enter": "Enter fullscreen",\n "FullscreenControl.Exit": "Exit fullscreen",\n "GeolocateControl.FindMyLocation": "Find my location",\n "GeolocateControl.LocationNotAvailable": "Location not available",\n "LogoControl.Title": "Mapbox logo",\n "NavigationControl.ResetBearing": "Reset bearing to north",\n "NavigationControl.ZoomIn": "Zoom in",\n "NavigationControl.ZoomOut": "Zoom out",\n "ScaleControl.Feet": "ft",\n "ScaleControl.Meters": "m",\n "ScaleControl.Kilometers": "km",\n "ScaleControl.Miles": "mi",\n "ScaleControl.NauticalMiles": "nm"\n },\n Tr = t.window.HTMLImageElement,\n Er = t.window.HTMLElement,\n Ir = t.window.ImageBitmap,\n Pr = {\n center: [0, 0],\n zoom: 0,\n bearing: 0,\n pitch: 0,\n minZoom: -2,\n maxZoom: 22,\n minPitch: 0,\n maxPitch: 60,\n interactive: !0,\n scrollZoom: !0,\n boxZoom: !0,\n dragRotate: !0,\n dragPan: !0,\n keyboard: !0,\n doubleClickZoom: !0,\n touchZoomRotate: !0,\n touchPitch: !0,\n bearingSnap: 7,\n clickTolerance: 3,\n pitchWithRotate: !0,\n hash: !1,\n attributionControl: !0,\n failIfMajorPerformanceCaveat: !1,\n preserveDrawingBuffer: !1,\n trackResize: !0,\n renderWorldCopies: !0,\n refreshExpiredTiles: !0,\n maxTileCacheSize: null,\n localIdeographFontFamily: "sans-serif",\n transformRequest: null,\n accessToken: null,\n fadeDuration: 300,\n crossSourceCollisions: !0\n },\n Sr = function (o) {\n function r(e) {\n var i = this;\n if (null != (e = t.extend({}, Pr, e)).minZoom && null != e.maxZoom && e.minZoom > e.maxZoom) throw new Error("maxZoom must be greater than or equal to minZoom");\n if (null != e.minPitch && null != e.maxPitch && e.minPitch > e.maxPitch) throw new Error("maxPitch must be greater than or equal to minPitch");\n if (null != e.minPitch && e.minPitch < 0) throw new Error("minPitch must be greater than or equal to 0");\n if (null != e.maxPitch && e.maxPitch > 60) throw new Error("maxPitch must be less than or equal to 60");\n var r = new To(e.minZoom, e.maxZoom, e.minPitch, e.maxPitch, e.renderWorldCopies);\n\n if (o.call(this, r, e), this._interactive = e.interactive, this._maxTileCacheSize = e.maxTileCacheSize, this._failIfMajorPerformanceCaveat = e.failIfMajorPerformanceCaveat, this._preserveDrawingBuffer = e.preserveDrawingBuffer, this._antialias = e.antialias, this._trackResize = e.trackResize, this._bearingSnap = e.bearingSnap, this._refreshExpiredTiles = e.refreshExpiredTiles, this._fadeDuration = e.fadeDuration, this._crossSourceCollisions = e.crossSourceCollisions, this._crossFadingFactor = 1, this._collectResourceTiming = e.collectResourceTiming, this._renderTaskQueue = new br(), this._controls = [], this._mapId = t.uniqueId(), this._locale = t.extend({}, wr, e.locale), this._clickTolerance = e.clickTolerance, this._requestManager = new t.RequestManager(e.transformRequest, e.accessToken), "string" == typeof e.container) {\n if (this._container = t.window.document.getElementById(e.container), !this._container) throw new Error("Container \'" + e.container + "\' not found.");\n } else {\n if (!(e.container instanceof Er)) throw new Error("Invalid type: \'container\' must be a String or HTMLElement.");\n this._container = e.container;\n }\n\n if (e.maxBounds && this.setMaxBounds(e.maxBounds), t.bindAll(["_onWindowOnline", "_onWindowResize", "_onMapScroll", "_contextLost", "_contextRestored"], this), this._setupContainer(), this._setupPainter(), void 0 === this.painter) throw new Error("Failed to initialize WebGL.");\n this.on("move", function () {\n return i._update(!1);\n }), this.on("moveend", function () {\n return i._update(!1);\n }), this.on("zoom", function () {\n return i._update(!0);\n }), void 0 !== t.window && (t.window.addEventListener("online", this._onWindowOnline, !1), t.window.addEventListener("resize", this._onWindowResize, !1), t.window.addEventListener("orientationchange", this._onWindowResize, !1)), this.handlers = new gr(this, e), this._hash = e.hash && new Io("string" == typeof e.hash && e.hash || void 0).addTo(this), this._hash && this._hash._onHashChange() || (this.jumpTo({\n center: e.center,\n zoom: e.zoom,\n bearing: e.bearing,\n pitch: e.pitch\n }), e.bounds && (this.resize(), this.fitBounds(e.bounds, t.extend({}, e.fitBoundsOptions, {\n duration: 0\n })))), this.resize(), this._localIdeographFontFamily = e.localIdeographFontFamily, e.style && this.setStyle(e.style, {\n localIdeographFontFamily: e.localIdeographFontFamily\n }), e.attributionControl && this.addControl(new yr({\n customAttribution: e.customAttribution\n })), this.addControl(new xr(), e.logoPosition), this.on("style.load", function () {\n i.transform.unmodified && i.jumpTo(i.style.stylesheet);\n }), this.on("data", function (e) {\n i._update("style" === e.dataType), i.fire(new t.Event(e.dataType + "data", e));\n }), this.on("dataloading", function (e) {\n i.fire(new t.Event(e.dataType + "dataloading", e));\n });\n }\n\n o && (r.__proto__ = o), (r.prototype = Object.create(o && o.prototype)).constructor = r;\n var a = {\n showTileBoundaries: {\n configurable: !0\n },\n showPadding: {\n configurable: !0\n },\n showCollisionBoxes: {\n configurable: !0\n },\n showOverdrawInspector: {\n configurable: !0\n },\n repaint: {\n configurable: !0\n },\n vertices: {\n configurable: !0\n },\n version: {\n configurable: !0\n }\n };\n return r.prototype._getMapId = function () {\n return this._mapId;\n }, r.prototype.addControl = function (e, i) {\n if (void 0 === i && (i = e.getDefaultPosition ? e.getDefaultPosition() : "top-right"), !e || !e.onAdd) return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.")));\n var o = e.onAdd(this);\n\n this._controls.push(e);\n\n var r = this._controlPositions[i];\n return -1 !== i.indexOf("bottom") ? r.insertBefore(o, r.firstChild) : r.appendChild(o), this;\n }, r.prototype.removeControl = function (e) {\n if (!e || !e.onRemove) return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.")));\n\n var i = this._controls.indexOf(e);\n\n return i > -1 && this._controls.splice(i, 1), e.onRemove(this), this;\n }, r.prototype.hasControl = function (t) {\n return this._controls.indexOf(t) > -1;\n }, r.prototype.resize = function (e) {\n var i = this._containerDimensions(),\n o = i[0],\n r = i[1];\n\n this._resizeCanvas(o, r), this.transform.resize(o, r), this.painter.resize(o, r);\n var a = !this._moving;\n return a && (this.stop(), this.fire(new t.Event("movestart", e)).fire(new t.Event("move", e))), this.fire(new t.Event("resize", e)), a && this.fire(new t.Event("moveend", e)), this;\n }, r.prototype.getBounds = function () {\n return this.transform.getBounds();\n }, r.prototype.getMaxBounds = function () {\n return this.transform.getMaxBounds();\n }, r.prototype.setMaxBounds = function (e) {\n return this.transform.setMaxBounds(t.LngLatBounds.convert(e)), this._update();\n }, r.prototype.setMinZoom = function (t) {\n if ((t = null == t ? -2 : t) >= -2 && t <= this.transform.maxZoom) return this.transform.minZoom = t, this._update(), this.getZoom() < t && this.setZoom(t), this;\n throw new Error("minZoom must be between -2 and the current maxZoom, inclusive");\n }, r.prototype.getMinZoom = function () {\n return this.transform.minZoom;\n }, r.prototype.setMaxZoom = function (t) {\n if ((t = null == t ? 22 : t) >= this.transform.minZoom) return this.transform.maxZoom = t, this._update(), this.getZoom() > t && this.setZoom(t), this;\n throw new Error("maxZoom must be greater than the current minZoom");\n }, r.prototype.getMaxZoom = function () {\n return this.transform.maxZoom;\n }, r.prototype.setMinPitch = function (t) {\n if ((t = null == t ? 0 : t) < 0) throw new Error("minPitch must be greater than or equal to 0");\n if (t >= 0 && t <= this.transform.maxPitch) return this.transform.minPitch = t, this._update(), this.getPitch() < t && this.setPitch(t), this;\n throw new Error("minPitch must be between 0 and the current maxPitch, inclusive");\n }, r.prototype.getMinPitch = function () {\n return this.transform.minPitch;\n }, r.prototype.setMaxPitch = function (t) {\n if ((t = null == t ? 60 : t) > 60) throw new Error("maxPitch must be less than or equal to 60");\n if (t >= this.transform.minPitch) return this.transform.maxPitch = t, this._update(), this.getPitch() > t && this.setPitch(t), this;\n throw new Error("maxPitch must be greater than the current minPitch");\n }, r.prototype.getMaxPitch = function () {\n return this.transform.maxPitch;\n }, r.prototype.getRenderWorldCopies = function () {\n return this.transform.renderWorldCopies;\n }, r.prototype.setRenderWorldCopies = function (t) {\n return this.transform.renderWorldCopies = t, this._update();\n }, r.prototype.project = function (e) {\n return this.transform.locationPoint(t.LngLat.convert(e));\n }, r.prototype.unproject = function (e) {\n return this.transform.pointLocation(t.Point.convert(e));\n }, r.prototype.isMoving = function () {\n return this._moving || this.handlers.isMoving();\n }, r.prototype.isZooming = function () {\n return this._zooming || this.handlers.isZooming();\n }, r.prototype.isRotating = function () {\n return this._rotating || this.handlers.isRotating();\n }, r.prototype._createDelegatedListener = function (t, e, i) {\n var o,\n r = this;\n\n if ("mouseenter" === t || "mouseover" === t) {\n var a = !1;\n return {\n layer: e,\n listener: i,\n delegates: {\n mousemove: function mousemove(o) {\n var n = r.getLayer(e) ? r.queryRenderedFeatures(o.point, {\n layers: [e]\n }) : [];\n n.length ? a || (a = !0, i.call(r, new Ro(t, r, o.originalEvent, {\n features: n\n }))) : a = !1;\n },\n mouseout: function mouseout() {\n a = !1;\n }\n }\n };\n }\n\n if ("mouseleave" === t || "mouseout" === t) {\n var n = !1;\n return {\n layer: e,\n listener: i,\n delegates: {\n mousemove: function mousemove(o) {\n (r.getLayer(e) ? r.queryRenderedFeatures(o.point, {\n layers: [e]\n }) : []).length ? n = !0 : n && (n = !1, i.call(r, new Ro(t, r, o.originalEvent)));\n },\n mouseout: function mouseout(e) {\n n && (n = !1, i.call(r, new Ro(t, r, e.originalEvent)));\n }\n }\n };\n }\n\n return {\n layer: e,\n listener: i,\n delegates: (o = {}, o[t] = function (t) {\n var o = r.getLayer(e) ? r.queryRenderedFeatures(t.point, {\n layers: [e]\n }) : [];\n o.length && (t.features = o, i.call(r, t), delete t.features);\n }, o)\n };\n }, r.prototype.on = function (t, e, i) {\n if (void 0 === i) return o.prototype.on.call(this, t, e);\n\n var r = this._createDelegatedListener(t, e, i);\n\n for (var a in this._delegatedListeners = this._delegatedListeners || {}, this._delegatedListeners[t] = this._delegatedListeners[t] || [], this._delegatedListeners[t].push(r), r.delegates) {\n this.on(a, r.delegates[a]);\n }\n\n return this;\n }, r.prototype.once = function (t, e, i) {\n if (void 0 === i) return o.prototype.once.call(this, t, e);\n\n var r = this._createDelegatedListener(t, e, i);\n\n for (var a in r.delegates) {\n this.once(a, r.delegates[a]);\n }\n\n return this;\n }, r.prototype.off = function (t, e, i) {\n var r = this;\n return void 0 === i ? o.prototype.off.call(this, t, e) : (this._delegatedListeners && this._delegatedListeners[t] && function (o) {\n for (var a = o[t], n = 0; n < a.length; n++) {\n var s = a[n];\n\n if (s.layer === e && s.listener === i) {\n for (var l in s.delegates) {\n r.off(l, s.delegates[l]);\n }\n\n return a.splice(n, 1), r;\n }\n }\n }(this._delegatedListeners), this);\n }, r.prototype.queryRenderedFeatures = function (e, i) {\n if (!this.style) return [];\n var o;\n if (void 0 !== i || void 0 === e || e instanceof t.Point || Array.isArray(e) || (i = e, e = void 0), i = i || {}, (e = e || [[0, 0], [this.transform.width, this.transform.height]]) instanceof t.Point || "number" == typeof e[0]) o = [t.Point.convert(e)];else {\n var r = t.Point.convert(e[0]),\n a = t.Point.convert(e[1]);\n o = [r, new t.Point(a.x, r.y), a, new t.Point(r.x, a.y), r];\n }\n return this.style.queryRenderedFeatures(o, i, this.transform);\n }, r.prototype.querySourceFeatures = function (t, e) {\n return this.style.querySourceFeatures(t, e);\n }, r.prototype.setStyle = function (e, i) {\n return !1 !== (i = t.extend({}, {\n localIdeographFontFamily: this._localIdeographFontFamily\n }, i)).diff && i.localIdeographFontFamily === this._localIdeographFontFamily && this.style && e ? (this._diffStyle(e, i), this) : (this._localIdeographFontFamily = i.localIdeographFontFamily, this._updateStyle(e, i));\n }, r.prototype.setTransformRequest = function (t) {\n return this._requestManager.setTransformRequest(t), this;\n }, r.prototype._getUIString = function (t) {\n var e = this._locale[t];\n if (null == e) throw new Error("Missing UI string \'" + t + "\'");\n return e;\n }, r.prototype._updateStyle = function (t, e) {\n return this.style && (this.style.setEventedParent(null), this.style._remove()), t ? (this.style = new je(this, e || {}), this.style.setEventedParent(this, {\n style: this.style\n }), "string" == typeof t ? this.style.loadURL(t) : this.style.loadJSON(t), this) : (delete this.style, this);\n }, r.prototype._lazyInitEmptyStyle = function () {\n this.style || (this.style = new je(this, {}), this.style.setEventedParent(this, {\n style: this.style\n }), this.style.loadEmpty());\n }, r.prototype._diffStyle = function (e, i) {\n var o = this;\n\n if ("string" == typeof e) {\n var r = this._requestManager.normalizeStyleURL(e),\n a = this._requestManager.transformRequest(r, t.ResourceType.Style);\n\n t.getJSON(a, function (e, r) {\n e ? o.fire(new t.ErrorEvent(e)) : r && o._updateDiff(r, i);\n });\n } else "object" == typeof e && this._updateDiff(e, i);\n }, r.prototype._updateDiff = function (e, i) {\n try {\n this.style.setState(e) && this._update(!0);\n } catch (o) {\n t.warnOnce("Unable to perform style diff: " + (o.message || o.error || o) + ". Rebuilding the style from scratch."), this._updateStyle(e, i);\n }\n }, r.prototype.getStyle = function () {\n if (this.style) return this.style.serialize();\n }, r.prototype.isStyleLoaded = function () {\n return this.style ? this.style.loaded() : t.warnOnce("There is no style added to the map.");\n }, r.prototype.addSource = function (t, e) {\n return this._lazyInitEmptyStyle(), this.style.addSource(t, e), this._update(!0);\n }, r.prototype.isSourceLoaded = function (e) {\n var i = this.style && this.style.sourceCaches[e];\n if (void 0 !== i) return i.loaded();\n this.fire(new t.ErrorEvent(new Error("There is no source with ID \'" + e + "\'")));\n }, r.prototype.areTilesLoaded = function () {\n var t = this.style && this.style.sourceCaches;\n\n for (var e in t) {\n var i = t[e]._tiles;\n\n for (var o in i) {\n var r = i[o];\n if ("loaded" !== r.state && "errored" !== r.state) return !1;\n }\n }\n\n return !0;\n }, r.prototype.addSourceType = function (t, e, i) {\n return this._lazyInitEmptyStyle(), this.style.addSourceType(t, e, i);\n }, r.prototype.removeSource = function (t) {\n return this.style.removeSource(t), this._update(!0);\n }, r.prototype.getSource = function (t) {\n return this.style.getSource(t);\n }, r.prototype.addImage = function (e, i, o) {\n void 0 === o && (o = {});\n var r = o.pixelRatio;\n void 0 === r && (r = 1);\n var a = o.sdf;\n void 0 === a && (a = !1);\n var n = o.stretchX,\n s = o.stretchY,\n l = o.content;\n\n if (this._lazyInitEmptyStyle(), i instanceof Tr || Ir && i instanceof Ir) {\n var c = t.browser.getImageData(i);\n this.style.addImage(e, {\n data: new t.RGBAImage({\n width: c.width,\n height: c.height\n }, c.data),\n pixelRatio: r,\n stretchX: n,\n stretchY: s,\n content: l,\n sdf: a,\n version: 0\n });\n } else {\n if (void 0 === i.width || void 0 === i.height) return this.fire(new t.ErrorEvent(new Error("Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));\n var u = i;\n this.style.addImage(e, {\n data: new t.RGBAImage({\n width: i.width,\n height: i.height\n }, new Uint8Array(i.data)),\n pixelRatio: r,\n stretchX: n,\n stretchY: s,\n content: l,\n sdf: a,\n version: 0,\n userImage: u\n }), u.onAdd && u.onAdd(this, e);\n }\n }, r.prototype.updateImage = function (e, i) {\n var o = this.style.getImage(e);\n if (!o) return this.fire(new t.ErrorEvent(new Error("The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.")));\n var r = i instanceof Tr || Ir && i instanceof Ir ? t.browser.getImageData(i) : i,\n a = r.width,\n n = r.height,\n s = r.data;\n return void 0 === a || void 0 === n ? this.fire(new t.ErrorEvent(new Error("Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`"))) : a !== o.data.width || n !== o.data.height ? this.fire(new t.ErrorEvent(new Error("The width and height of the updated image must be that same as the previous version of the image"))) : (o.data.replace(s, !(i instanceof Tr || Ir && i instanceof Ir)), void this.style.updateImage(e, o));\n }, r.prototype.hasImage = function (e) {\n return e ? !!this.style.getImage(e) : (this.fire(new t.ErrorEvent(new Error("Missing required image id"))), !1);\n }, r.prototype.removeImage = function (t) {\n this.style.removeImage(t);\n }, r.prototype.loadImage = function (e, i) {\n t.getImage(this._requestManager.transformRequest(e, t.ResourceType.Image), i);\n }, r.prototype.listImages = function () {\n return this.style.listImages();\n }, r.prototype.addLayer = function (t, e) {\n return this._lazyInitEmptyStyle(), this.style.addLayer(t, e), this._update(!0);\n }, r.prototype.moveLayer = function (t, e) {\n return this.style.moveLayer(t, e), this._update(!0);\n }, r.prototype.removeLayer = function (t) {\n return this.style.removeLayer(t), this._update(!0);\n }, r.prototype.getLayer = function (t) {\n return this.style.getLayer(t);\n }, r.prototype.setLayerZoomRange = function (t, e, i) {\n return this.style.setLayerZoomRange(t, e, i), this._update(!0);\n }, r.prototype.setFilter = function (t, e, i) {\n return void 0 === i && (i = {}), this.style.setFilter(t, e, i), this._update(!0);\n }, r.prototype.getFilter = function (t) {\n return this.style.getFilter(t);\n }, r.prototype.setPaintProperty = function (t, e, i, o) {\n return void 0 === o && (o = {}), this.style.setPaintProperty(t, e, i, o), this._update(!0);\n }, r.prototype.getPaintProperty = function (t, e) {\n return this.style.getPaintProperty(t, e);\n }, r.prototype.setLayoutProperty = function (t, e, i, o) {\n return void 0 === o && (o = {}), this.style.setLayoutProperty(t, e, i, o), this._update(!0);\n }, r.prototype.getLayoutProperty = function (t, e) {\n return this.style.getLayoutProperty(t, e);\n }, r.prototype.setLight = function (t, e) {\n return void 0 === e && (e = {}), this._lazyInitEmptyStyle(), this.style.setLight(t, e), this._update(!0);\n }, r.prototype.getLight = function () {\n return this.style.getLight();\n }, r.prototype.setFeatureState = function (t, e) {\n return this.style.setFeatureState(t, e), this._update();\n }, r.prototype.removeFeatureState = function (t, e) {\n return this.style.removeFeatureState(t, e), this._update();\n }, r.prototype.getFeatureState = function (t) {\n return this.style.getFeatureState(t);\n }, r.prototype.getContainer = function () {\n return this._container;\n }, r.prototype.getCanvasContainer = function () {\n return this._canvasContainer;\n }, r.prototype.getCanvas = function () {\n return this._canvas;\n }, r.prototype._containerDimensions = function () {\n var t = 0,\n e = 0;\n return this._container && (t = this._container.clientWidth || 400, e = this._container.clientHeight || 300), [t, e];\n }, r.prototype._setupContainer = function () {\n var t = this._container;\n t.classList.add("maplibregl-map");\n var e = this._canvasContainer = i.create("div", "mapboxgl-canvas-container", t);\n this._interactive && e.classList.add("maplibregl-interactive"), this._canvas = i.create("canvas", "maplibregl-canvas", e), this._canvas.addEventListener("webglcontextlost", this._contextLost, !1), this._canvas.addEventListener("webglcontextrestored", this._contextRestored, !1), this._canvas.setAttribute("tabindex", "0"), this._canvas.setAttribute("aria-label", "Map"), this._canvas.setAttribute("role", "region");\n\n var o = this._containerDimensions();\n\n this._resizeCanvas(o[0], o[1]);\n\n var r = this._controlContainer = i.create("div", "maplibregl-control-container", t),\n a = this._controlPositions = {};\n ["top-left", "top-right", "bottom-left", "bottom-right"].forEach(function (t) {\n a[t] = i.create("div", "maplibregl-ctrl-" + t, r);\n }), this._container.addEventListener("scroll", this._onMapScroll, !1);\n }, r.prototype._resizeCanvas = function (e, i) {\n var o = t.browser.devicePixelRatio || 1;\n this._canvas.width = o * e, this._canvas.height = o * i, this._canvas.style.width = e + "px", this._canvas.style.height = i + "px";\n }, r.prototype._setupPainter = function () {\n var i = t.extend({}, e.webGLContextAttributes, {\n failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n preserveDrawingBuffer: this._preserveDrawingBuffer,\n antialias: this._antialias || !1\n }),\n o = this._canvas.getContext("webgl", i) || this._canvas.getContext("experimental-webgl", i);\n\n o ? (this.painter = new yo(o, this.transform), t.webpSupported.testSupport(o)) : this.fire(new t.ErrorEvent(new Error("Failed to initialize WebGL")));\n }, r.prototype._contextLost = function (e) {\n e.preventDefault(), this._frame && (this._frame.cancel(), this._frame = null), this.fire(new t.Event("webglcontextlost", {\n originalEvent: e\n }));\n }, r.prototype._contextRestored = function (e) {\n this._setupPainter(), this.resize(), this._update(), this.fire(new t.Event("webglcontextrestored", {\n originalEvent: e\n }));\n }, r.prototype._onMapScroll = function (t) {\n if (t.target === this._container) return this._container.scrollTop = 0, this._container.scrollLeft = 0, !1;\n }, r.prototype.loaded = function () {\n return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded();\n }, r.prototype._update = function (t) {\n return this.style ? (this._styleDirty = this._styleDirty || t, this._sourcesDirty = !0, this.triggerRepaint(), this) : this;\n }, r.prototype._requestRenderFrame = function (t) {\n return this._update(), this._renderTaskQueue.add(t);\n }, r.prototype._cancelRenderFrame = function (t) {\n this._renderTaskQueue.remove(t);\n }, r.prototype._render = function (e) {\n var i,\n o = this,\n r = 0,\n a = this.painter.context.extTimerQuery;\n\n if (this.listens("gpu-timing-frame") && (i = a.createQueryEXT(), a.beginQueryEXT(a.TIME_ELAPSED_EXT, i), r = t.browser.now()), this.painter.context.setDirty(), this.painter.setBaseState(), this._renderTaskQueue.run(e), !this._removed) {\n var n = !1;\n\n if (this.style && this._styleDirty) {\n this._styleDirty = !1;\n var s = this.transform.zoom,\n l = t.browser.now();\n this.style.zoomHistory.update(s, l);\n var c = new t.EvaluationParameters(s, {\n now: l,\n fadeDuration: this._fadeDuration,\n zoomHistory: this.style.zoomHistory,\n transition: this.style.getTransition()\n }),\n u = c.crossFadingFactor();\n 1 === u && u === this._crossFadingFactor || (n = !0, this._crossFadingFactor = u), this.style.update(c);\n }\n\n if (this.style && this._sourcesDirty && (this._sourcesDirty = !1, this.style._updateSources(this.transform)), this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions), this.painter.render(this.style, {\n showTileBoundaries: this.showTileBoundaries,\n showOverdrawInspector: this._showOverdrawInspector,\n rotating: this.isRotating(),\n zooming: this.isZooming(),\n moving: this.isMoving(),\n fadeDuration: this._fadeDuration,\n showPadding: this.showPadding,\n gpuTiming: !!this.listens("gpu-timing-layer")\n }), this.fire(new t.Event("render")), this.loaded() && !this._loaded && (this._loaded = !0, this.fire(new t.Event("load"))), this.style && (this.style.hasTransitions() || n) && (this._styleDirty = !0), this.style && !this._placementDirty && this.style._releaseSymbolFadeTiles(), this.listens("gpu-timing-frame")) {\n var h = t.browser.now() - r;\n a.endQueryEXT(a.TIME_ELAPSED_EXT, i), setTimeout(function () {\n var e = a.getQueryObjectEXT(i, a.QUERY_RESULT_EXT) / 1e6;\n a.deleteQueryEXT(i), o.fire(new t.Event("gpu-timing-frame", {\n cpuTime: h,\n gpuTime: e\n }));\n }, 50);\n }\n\n if (this.listens("gpu-timing-layer")) {\n var p = this.painter.collectGpuTimers();\n setTimeout(function () {\n var e = o.painter.queryGpuTimers(p);\n o.fire(new t.Event("gpu-timing-layer", {\n layerTimes: e\n }));\n }, 50);\n }\n\n var d = this._sourcesDirty || this._styleDirty || this._placementDirty;\n return d || this._repaint ? this.triggerRepaint() : !this.isMoving() && this.loaded() && this.fire(new t.Event("idle")), !this._loaded || this._fullyLoaded || d || (this._fullyLoaded = !0), this;\n }\n }, r.prototype.remove = function () {\n this._hash && this._hash.remove();\n\n for (var e = 0, i = this._controls; e < i.length; e += 1) {\n i[e].onRemove(this);\n }\n\n this._controls = [], this._frame && (this._frame.cancel(), this._frame = null), this._renderTaskQueue.clear(), this.painter.destroy(), this.handlers.destroy(), delete this.handlers, this.setStyle(null), void 0 !== t.window && (t.window.removeEventListener("resize", this._onWindowResize, !1), t.window.removeEventListener("orientationchange", this._onWindowResize, !1), t.window.removeEventListener("online", this._onWindowOnline, !1));\n var o = this.painter.context.gl.getExtension("WEBGL_lose_context");\n o && o.loseContext(), Cr(this._canvasContainer), Cr(this._controlContainer), this._container.classList.remove("maplibregl-map"), this._removed = !0, this.fire(new t.Event("remove"));\n }, r.prototype.triggerRepaint = function () {\n var e = this;\n this.style && !this._frame && (this._frame = t.browser.frame(function (t) {\n e._frame = null, e._render(t);\n }));\n }, r.prototype._onWindowOnline = function () {\n this._update();\n }, r.prototype._onWindowResize = function (t) {\n this._trackResize && this.resize({\n originalEvent: t\n })._update();\n }, a.showTileBoundaries.get = function () {\n return !!this._showTileBoundaries;\n }, a.showTileBoundaries.set = function (t) {\n this._showTileBoundaries !== t && (this._showTileBoundaries = t, this._update());\n }, a.showPadding.get = function () {\n return !!this._showPadding;\n }, a.showPadding.set = function (t) {\n this._showPadding !== t && (this._showPadding = t, this._update());\n }, a.showCollisionBoxes.get = function () {\n return !!this._showCollisionBoxes;\n }, a.showCollisionBoxes.set = function (t) {\n this._showCollisionBoxes !== t && (this._showCollisionBoxes = t, t ? this.style._generateCollisionBoxes() : this._update());\n }, a.showOverdrawInspector.get = function () {\n return !!this._showOverdrawInspector;\n }, a.showOverdrawInspector.set = function (t) {\n this._showOverdrawInspector !== t && (this._showOverdrawInspector = t, this._update());\n }, a.repaint.get = function () {\n return !!this._repaint;\n }, a.repaint.set = function (t) {\n this._repaint !== t && (this._repaint = t, this.triggerRepaint());\n }, a.vertices.get = function () {\n return !!this._vertices;\n }, a.vertices.set = function (t) {\n this._vertices = t, this._update();\n }, r.prototype._setCacheLimits = function (e, i) {\n t.setCacheLimits(e, i);\n }, a.version.get = function () {\n return t.version;\n }, Object.defineProperties(r.prototype, a), r;\n }(vr);\n\n function Cr(t) {\n t.parentNode && t.parentNode.removeChild(t);\n }\n\n var zr = {\n showCompass: !0,\n showZoom: !0,\n visualizePitch: !1\n },\n Dr = function Dr(e) {\n var o = this;\n this.options = t.extend({}, zr, e), this._container = i.create("div", "maplibregl-ctrl maplibregl-ctrl-group"), this._container.addEventListener("contextmenu", function (t) {\n return t.preventDefault();\n }), this.options.showZoom && (t.bindAll(["_setButtonTitle", "_updateZoomButtons"], this), this._zoomInButton = this._createButton("maplibregl-ctrl-zoom-in", function (t) {\n return o._map.zoomIn({}, {\n originalEvent: t\n });\n }), i.create("span", "maplibregl-ctrl-icon", this._zoomInButton).setAttribute("aria-hidden", !0), this._zoomOutButton = this._createButton("maplibregl-ctrl-zoom-out", function (t) {\n return o._map.zoomOut({}, {\n originalEvent: t\n });\n }), i.create("span", "maplibregl-ctrl-icon", this._zoomOutButton).setAttribute("aria-hidden", !0)), this.options.showCompass && (t.bindAll(["_rotateCompassArrow"], this), this._compass = this._createButton("maplibregl-ctrl-compass", function (t) {\n o.options.visualizePitch ? o._map.resetNorthPitch({}, {\n originalEvent: t\n }) : o._map.resetNorth({}, {\n originalEvent: t\n });\n }), this._compassIcon = i.create("span", "maplibregl-ctrl-icon", this._compass), this._compassIcon.setAttribute("aria-hidden", !0));\n };\n\n Dr.prototype._updateZoomButtons = function () {\n var t = this._map.getZoom(),\n e = t === this._map.getMaxZoom(),\n i = t === this._map.getMinZoom();\n\n this._zoomInButton.disabled = e, this._zoomOutButton.disabled = i, this._zoomInButton.setAttribute("aria-disabled", e.toString()), this._zoomOutButton.setAttribute("aria-disabled", i.toString());\n }, Dr.prototype._rotateCompassArrow = function () {\n var t = this.options.visualizePitch ? "scale(" + 1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), .5) + ") rotateX(" + this._map.transform.pitch + "deg) rotateZ(" + this._map.transform.angle * (180 / Math.PI) + "deg)" : "rotate(" + this._map.transform.angle * (180 / Math.PI) + "deg)";\n this._compassIcon.style.transform = t;\n }, Dr.prototype.onAdd = function (t) {\n return this._map = t, this.options.showZoom && (this._setButtonTitle(this._zoomInButton, "ZoomIn"), this._setButtonTitle(this._zoomOutButton, "ZoomOut"), this._map.on("zoom", this._updateZoomButtons), this._updateZoomButtons()), this.options.showCompass && (this._setButtonTitle(this._compass, "ResetBearing"), this.options.visualizePitch && this._map.on("pitch", this._rotateCompassArrow), this._map.on("rotate", this._rotateCompassArrow), this._rotateCompassArrow(), this._handler = new Ar(this._map, this._compass, this.options.visualizePitch)), this._container;\n }, Dr.prototype.onRemove = function () {\n i.remove(this._container), this.options.showZoom && this._map.off("zoom", this._updateZoomButtons), this.options.showCompass && (this.options.visualizePitch && this._map.off("pitch", this._rotateCompassArrow), this._map.off("rotate", this._rotateCompassArrow), this._handler.off(), delete this._handler), delete this._map;\n }, Dr.prototype._createButton = function (t, e) {\n var o = i.create("button", t, this._container);\n return o.type = "button", o.addEventListener("click", e), o;\n }, Dr.prototype._setButtonTitle = function (t, e) {\n var i = this._map._getUIString("NavigationControl." + e);\n\n t.title = i, t.setAttribute("aria-label", i);\n };\n\n var Ar = function Ar(e, o, r) {\n void 0 === r && (r = !1), this._clickTolerance = 10, this.element = o, this.mouseRotate = new Xo({\n clickTolerance: e.dragRotate._mouseRotate._clickTolerance\n }), this.map = e, r && (this.mousePitch = new Ho({\n clickTolerance: e.dragRotate._mousePitch._clickTolerance\n })), t.bindAll(["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchend", "reset"], this), i.addEventListener(o, "mousedown", this.mousedown), i.addEventListener(o, "touchstart", this.touchstart, {\n passive: !1\n }), i.addEventListener(o, "touchmove", this.touchmove), i.addEventListener(o, "touchend", this.touchend), i.addEventListener(o, "touchcancel", this.reset);\n };\n\n function Mr(e, i, o) {\n if (e = new t.LngLat(e.lng, e.lat), i) {\n var r = new t.LngLat(e.lng - 360, e.lat),\n a = new t.LngLat(e.lng + 360, e.lat),\n n = o.locationPoint(e).distSqr(i);\n o.locationPoint(r).distSqr(i) < n ? e = r : o.locationPoint(a).distSqr(i) < n && (e = a);\n }\n\n for (; Math.abs(e.lng - o.center.lng) > 180;) {\n var s = o.locationPoint(e);\n if (s.x >= 0 && s.y >= 0 && s.x <= o.width && s.y <= o.height) break;\n e.lng > o.center.lng ? e.lng -= 360 : e.lng += 360;\n }\n\n return e;\n }\n\n Ar.prototype.down = function (t, e) {\n this.mouseRotate.mousedown(t, e), this.mousePitch && this.mousePitch.mousedown(t, e), i.disableDrag();\n }, Ar.prototype.move = function (t, e) {\n var i = this.map,\n o = this.mouseRotate.mousemoveWindow(t, e);\n\n if (o && o.bearingDelta && i.setBearing(i.getBearing() + o.bearingDelta), this.mousePitch) {\n var r = this.mousePitch.mousemoveWindow(t, e);\n r && r.pitchDelta && i.setPitch(i.getPitch() + r.pitchDelta);\n }\n }, Ar.prototype.off = function () {\n var t = this.element;\n i.removeEventListener(t, "mousedown", this.mousedown), i.removeEventListener(t, "touchstart", this.touchstart, {\n passive: !1\n }), i.removeEventListener(t, "touchmove", this.touchmove), i.removeEventListener(t, "touchend", this.touchend), i.removeEventListener(t, "touchcancel", this.reset), this.offTemp();\n }, Ar.prototype.offTemp = function () {\n i.enableDrag(), i.removeEventListener(t.window, "mousemove", this.mousemove), i.removeEventListener(t.window, "mouseup", this.mouseup);\n }, Ar.prototype.mousedown = function (e) {\n this.down(t.extend({}, e, {\n ctrlKey: !0,\n preventDefault: function preventDefault() {\n return e.preventDefault();\n }\n }), i.mousePos(this.element, e)), i.addEventListener(t.window, "mousemove", this.mousemove), i.addEventListener(t.window, "mouseup", this.mouseup);\n }, Ar.prototype.mousemove = function (t) {\n this.move(t, i.mousePos(this.element, t));\n }, Ar.prototype.mouseup = function (t) {\n this.mouseRotate.mouseupWindow(t), this.mousePitch && this.mousePitch.mouseupWindow(t), this.offTemp();\n }, Ar.prototype.touchstart = function (t) {\n 1 !== t.targetTouches.length ? this.reset() : (this._startPos = this._lastPos = i.touchPos(this.element, t.targetTouches)[0], this.down({\n type: "mousedown",\n button: 0,\n ctrlKey: !0,\n preventDefault: function preventDefault() {\n return t.preventDefault();\n }\n }, this._startPos));\n }, Ar.prototype.touchmove = function (t) {\n 1 !== t.targetTouches.length ? this.reset() : (this._lastPos = i.touchPos(this.element, t.targetTouches)[0], this.move({\n preventDefault: function preventDefault() {\n return t.preventDefault();\n }\n }, this._lastPos));\n }, Ar.prototype.touchend = function (t) {\n 0 === t.targetTouches.length && this._startPos && this._lastPos && this._startPos.dist(this._lastPos) < this._clickTolerance && this.element.click(), this.reset();\n }, Ar.prototype.reset = function () {\n this.mouseRotate.reset(), this.mousePitch && this.mousePitch.reset(), delete this._startPos, delete this._lastPos, this.offTemp();\n };\n var Lr = {\n center: "translate(-50%,-50%)",\n top: "translate(-50%,0)",\n "top-left": "translate(0,0)",\n "top-right": "translate(-100%,0)",\n bottom: "translate(-50%,-100%)",\n "bottom-left": "translate(0,-100%)",\n "bottom-right": "translate(-100%,-100%)",\n left: "translate(0,-50%)",\n right: "translate(-100%,-50%)"\n };\n\n function Rr(t, e, i) {\n var o = t.classList;\n\n for (var r in Lr) {\n o.remove("maplibregl-" + i + "-anchor-" + r);\n }\n\n o.add("maplibregl-" + i + "-anchor-" + e);\n }\n\n var kr,\n Br = function (e) {\n function o(o, r) {\n if (e.call(this), (o instanceof t.window.HTMLElement || r) && (o = t.extend({\n element: o\n }, r)), t.bindAll(["_update", "_onMove", "_onUp", "_addDragHandler", "_onMapClick", "_onKeyPress"], this), this._anchor = o && o.anchor || "center", this._color = o && o.color || "#3FB1CE", this._scale = o && o.scale || 1, this._draggable = o && o.draggable || !1, this._clickTolerance = o && o.clickTolerance || 0, this._isDragging = !1, this._state = "inactive", this._rotation = o && o.rotation || 0, this._rotationAlignment = o && o.rotationAlignment || "auto", this._pitchAlignment = o && o.pitchAlignment && "auto" !== o.pitchAlignment ? o.pitchAlignment : this._rotationAlignment, o && o.element) this._element = o.element, this._offset = t.Point.convert(o && o.offset || [0, 0]);else {\n this._defaultMarker = !0, this._element = i.create("div"), this._element.setAttribute("aria-label", "Map marker");\n var a = i.createNS("http://www.w3.org/2000/svg", "svg");\n a.setAttributeNS(null, "display", "block"), a.setAttributeNS(null, "height", "41px"), a.setAttributeNS(null, "width", "27px"), a.setAttributeNS(null, "viewBox", "0 0 27 41");\n var n = i.createNS("http://www.w3.org/2000/svg", "g");\n n.setAttributeNS(null, "stroke", "none"), n.setAttributeNS(null, "stroke-width", "1"), n.setAttributeNS(null, "fill", "none"), n.setAttributeNS(null, "fill-rule", "evenodd");\n var s = i.createNS("http://www.w3.org/2000/svg", "g");\n s.setAttributeNS(null, "fill-rule", "nonzero");\n var l = i.createNS("http://www.w3.org/2000/svg", "g");\n l.setAttributeNS(null, "transform", "translate(3.0, 29.0)"), l.setAttributeNS(null, "fill", "#000000");\n\n for (var c = 0, u = [{\n rx: "10.5",\n ry: "5.25002273"\n }, {\n rx: "10.5",\n ry: "5.25002273"\n }, {\n rx: "9.5",\n ry: "4.77275007"\n }, {\n rx: "8.5",\n ry: "4.29549936"\n }, {\n rx: "7.5",\n ry: "3.81822308"\n }, {\n rx: "6.5",\n ry: "3.34094679"\n }, {\n rx: "5.5",\n ry: "2.86367051"\n }, {\n rx: "4.5",\n ry: "2.38636864"\n }]; c < u.length; c += 1) {\n var h = u[c],\n p = i.createNS("http://www.w3.org/2000/svg", "ellipse");\n p.setAttributeNS(null, "opacity", "0.04"), p.setAttributeNS(null, "cx", "10.5"), p.setAttributeNS(null, "cy", "5.80029008"), p.setAttributeNS(null, "rx", h.rx), p.setAttributeNS(null, "ry", h.ry), l.appendChild(p);\n }\n\n var d = i.createNS("http://www.w3.org/2000/svg", "g");\n d.setAttributeNS(null, "fill", this._color);\n\n var _ = i.createNS("http://www.w3.org/2000/svg", "path");\n\n _.setAttributeNS(null, "d", "M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z"), d.appendChild(_);\n var f = i.createNS("http://www.w3.org/2000/svg", "g");\n f.setAttributeNS(null, "opacity", "0.25"), f.setAttributeNS(null, "fill", "#000000");\n var m = i.createNS("http://www.w3.org/2000/svg", "path");\n m.setAttributeNS(null, "d", "M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z"), f.appendChild(m);\n var g = i.createNS("http://www.w3.org/2000/svg", "g");\n g.setAttributeNS(null, "transform", "translate(6.0, 7.0)"), g.setAttributeNS(null, "fill", "#FFFFFF");\n var v = i.createNS("http://www.w3.org/2000/svg", "g");\n v.setAttributeNS(null, "transform", "translate(8.0, 8.0)");\n var y = i.createNS("http://www.w3.org/2000/svg", "circle");\n y.setAttributeNS(null, "fill", "#000000"), y.setAttributeNS(null, "opacity", "0.25"), y.setAttributeNS(null, "cx", "5.5"), y.setAttributeNS(null, "cy", "5.5"), y.setAttributeNS(null, "r", "5.4999962");\n var x = i.createNS("http://www.w3.org/2000/svg", "circle");\n x.setAttributeNS(null, "fill", "#FFFFFF"), x.setAttributeNS(null, "cx", "5.5"), x.setAttributeNS(null, "cy", "5.5"), x.setAttributeNS(null, "r", "5.4999962"), v.appendChild(y), v.appendChild(x), s.appendChild(l), s.appendChild(d), s.appendChild(f), s.appendChild(g), s.appendChild(v), a.appendChild(s), a.setAttributeNS(null, "height", 41 * this._scale + "px"), a.setAttributeNS(null, "width", 27 * this._scale + "px"), this._element.appendChild(a), this._offset = t.Point.convert(o && o.offset || [0, -14]);\n }\n this._element.classList.add("maplibregl-marker"), this._element.addEventListener("dragstart", function (t) {\n t.preventDefault();\n }), this._element.addEventListener("mousedown", function (t) {\n t.preventDefault();\n }), Rr(this._element, this._anchor, "marker"), this._popup = null;\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.addTo = function (t) {\n return this.remove(), this._map = t, t.getCanvasContainer().appendChild(this._element), t.on("move", this._update), t.on("moveend", this._update), this.setDraggable(this._draggable), this._update(), this._map.on("click", this._onMapClick), this;\n }, o.prototype.remove = function () {\n return this._map && (this._map.off("click", this._onMapClick), this._map.off("move", this._update), this._map.off("moveend", this._update), this._map.off("mousedown", this._addDragHandler), this._map.off("touchstart", this._addDragHandler), this._map.off("mouseup", this._onUp), this._map.off("touchend", this._onUp), this._map.off("mousemove", this._onMove), this._map.off("touchmove", this._onMove), delete this._map), i.remove(this._element), this._popup && this._popup.remove(), this;\n }, o.prototype.getLngLat = function () {\n return this._lngLat;\n }, o.prototype.setLngLat = function (e) {\n return this._lngLat = t.LngLat.convert(e), this._pos = null, this._popup && this._popup.setLngLat(this._lngLat), this._update(), this;\n }, o.prototype.getElement = function () {\n return this._element;\n }, o.prototype.setPopup = function (t) {\n if (this._popup && (this._popup.remove(), this._popup = null, this._element.removeEventListener("keypress", this._onKeyPress), this._originalTabIndex || this._element.removeAttribute("tabindex")), t) {\n if (!("offset" in t.options)) {\n var e = Math.sqrt(Math.pow(13.5, 2) / 2);\n t.options.offset = this._defaultMarker ? {\n top: [0, 0],\n "top-left": [0, 0],\n "top-right": [0, 0],\n bottom: [0, -38.1],\n "bottom-left": [e, -1 * (24.6 + e)],\n "bottom-right": [-e, -1 * (24.6 + e)],\n left: [13.5, -24.6],\n right: [-13.5, -24.6]\n } : this._offset;\n }\n\n this._popup = t, this._lngLat && this._popup.setLngLat(this._lngLat), this._originalTabIndex = this._element.getAttribute("tabindex"), this._originalTabIndex || this._element.setAttribute("tabindex", "0"), this._element.addEventListener("keypress", this._onKeyPress);\n }\n\n return this;\n }, o.prototype._onKeyPress = function (t) {\n var e = t.code,\n i = t.charCode || t.keyCode;\n "Space" !== e && "Enter" !== e && 32 !== i && 13 !== i || this.togglePopup();\n }, o.prototype._onMapClick = function (t) {\n var e = t.originalEvent.target,\n i = this._element;\n this._popup && (e === i || i.contains(e)) && this.togglePopup();\n }, o.prototype.getPopup = function () {\n return this._popup;\n }, o.prototype.togglePopup = function () {\n var t = this._popup;\n return t ? (t.isOpen() ? t.remove() : t.addTo(this._map), this) : this;\n }, o.prototype._update = function (t) {\n if (this._map) {\n this._map.transform.renderWorldCopies && (this._lngLat = Mr(this._lngLat, this._pos, this._map.transform)), this._pos = this._map.project(this._lngLat)._add(this._offset);\n var e = "";\n "viewport" === this._rotationAlignment || "auto" === this._rotationAlignment ? e = "rotateZ(" + this._rotation + "deg)" : "map" === this._rotationAlignment && (e = "rotateZ(" + (this._rotation - this._map.getBearing()) + "deg)");\n var o = "";\n "viewport" === this._pitchAlignment || "auto" === this._pitchAlignment ? o = "rotateX(0deg)" : "map" === this._pitchAlignment && (o = "rotateX(" + this._map.getPitch() + "deg)"), t && "moveend" !== t.type || (this._pos = this._pos.round()), i.setTransform(this._element, Lr[this._anchor] + " translate(" + this._pos.x + "px, " + this._pos.y + "px) " + o + " " + e);\n }\n }, o.prototype.getOffset = function () {\n return this._offset;\n }, o.prototype.setOffset = function (e) {\n return this._offset = t.Point.convert(e), this._update(), this;\n }, o.prototype._onMove = function (e) {\n if (!this._isDragging) {\n var i = this._clickTolerance || this._map._clickTolerance;\n this._isDragging = e.point.dist(this._pointerdownPos) >= i;\n }\n\n this._isDragging && (this._pos = e.point.sub(this._positionDelta), this._lngLat = this._map.unproject(this._pos), this.setLngLat(this._lngLat), this._element.style.pointerEvents = "none", "pending" === this._state && (this._state = "active", this.fire(new t.Event("dragstart"))), this.fire(new t.Event("drag")));\n }, o.prototype._onUp = function () {\n this._element.style.pointerEvents = "auto", this._positionDelta = null, this._pointerdownPos = null, this._isDragging = !1, this._map.off("mousemove", this._onMove), this._map.off("touchmove", this._onMove), "active" === this._state && this.fire(new t.Event("dragend")), this._state = "inactive";\n }, o.prototype._addDragHandler = function (t) {\n this._element.contains(t.originalEvent.target) && (t.preventDefault(), this._positionDelta = t.point.sub(this._pos).add(this._offset), this._pointerdownPos = t.point, this._state = "pending", this._map.on("mousemove", this._onMove), this._map.on("touchmove", this._onMove), this._map.once("mouseup", this._onUp), this._map.once("touchend", this._onUp));\n }, o.prototype.setDraggable = function (t) {\n return this._draggable = !!t, this._map && (t ? (this._map.on("mousedown", this._addDragHandler), this._map.on("touchstart", this._addDragHandler)) : (this._map.off("mousedown", this._addDragHandler), this._map.off("touchstart", this._addDragHandler))), this;\n }, o.prototype.isDraggable = function () {\n return this._draggable;\n }, o.prototype.setRotation = function (t) {\n return this._rotation = t || 0, this._update(), this;\n }, o.prototype.getRotation = function () {\n return this._rotation;\n }, o.prototype.setRotationAlignment = function (t) {\n return this._rotationAlignment = t || "auto", this._update(), this;\n }, o.prototype.getRotationAlignment = function () {\n return this._rotationAlignment;\n }, o.prototype.setPitchAlignment = function (t) {\n return this._pitchAlignment = t && "auto" !== t ? t : this._rotationAlignment, this._update(), this;\n }, o.prototype.getPitchAlignment = function () {\n return this._pitchAlignment;\n }, o;\n }(t.Evented),\n Or = {\n positionOptions: {\n enableHighAccuracy: !1,\n maximumAge: 0,\n timeout: 6e3\n },\n fitBoundsOptions: {\n maxZoom: 15\n },\n trackUserLocation: !1,\n showAccuracyCircle: !0,\n showUserLocation: !0\n },\n Fr = 0,\n Ur = !1,\n Nr = function (e) {\n function o(i) {\n e.call(this), this.options = t.extend({}, Or, i), t.bindAll(["_onSuccess", "_onError", "_onZoom", "_finish", "_setupUI", "_updateCamera", "_updateMarker"], this);\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.onAdd = function (e) {\n var o;\n return this._map = e, this._container = i.create("div", "maplibregl-ctrl maplibregl-ctrl-group"), o = this._setupUI, void 0 !== kr ? o(kr) : void 0 !== t.window.navigator.permissions ? t.window.navigator.permissions.query({\n name: "geolocation"\n }).then(function (t) {\n o(kr = "denied" !== t.state);\n }) : o(kr = !!t.window.navigator.geolocation), this._container;\n }, o.prototype.onRemove = function () {\n void 0 !== this._geolocationWatchID && (t.window.navigator.geolocation.clearWatch(this._geolocationWatchID), this._geolocationWatchID = void 0), this.options.showUserLocation && this._userLocationDotMarker && this._userLocationDotMarker.remove(), this.options.showAccuracyCircle && this._accuracyCircleMarker && this._accuracyCircleMarker.remove(), i.remove(this._container), this._map.off("zoom", this._onZoom), this._map = void 0, Fr = 0, Ur = !1;\n }, o.prototype._isOutOfMapMaxBounds = function (t) {\n var e = this._map.getMaxBounds(),\n i = t.coords;\n\n return e && (i.longitude < e.getWest() || i.longitude > e.getEast() || i.latitude < e.getSouth() || i.latitude > e.getNorth());\n }, o.prototype._setErrorState = function () {\n switch (this._watchState) {\n case "WAITING_ACTIVE":\n this._watchState = "ACTIVE_ERROR", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active-error");\n break;\n\n case "ACTIVE_LOCK":\n this._watchState = "ACTIVE_ERROR", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active-error"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting");\n break;\n\n case "BACKGROUND":\n this._watchState = "BACKGROUND_ERROR", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background-error"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting");\n }\n }, o.prototype._onSuccess = function (e) {\n if (this._map) {\n if (this._isOutOfMapMaxBounds(e)) return this._setErrorState(), this.fire(new t.Event("outofmaxbounds", e)), this._updateMarker(), void this._finish();\n if (this.options.trackUserLocation) switch (this._lastKnownPosition = e, this._watchState) {\n case "WAITING_ACTIVE":\n case "ACTIVE_LOCK":\n case "ACTIVE_ERROR":\n this._watchState = "ACTIVE_LOCK", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");\n break;\n\n case "BACKGROUND":\n case "BACKGROUND_ERROR":\n this._watchState = "BACKGROUND", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background");\n }\n this.options.showUserLocation && "OFF" !== this._watchState && this._updateMarker(e), this.options.trackUserLocation && "ACTIVE_LOCK" !== this._watchState || this._updateCamera(e), this.options.showUserLocation && this._dotElement.classList.remove("maplibregl-user-location-dot-stale"), this.fire(new t.Event("geolocate", e)), this._finish();\n }\n }, o.prototype._updateCamera = function (e) {\n var i = new t.LngLat(e.coords.longitude, e.coords.latitude),\n o = e.coords.accuracy,\n r = this._map.getBearing(),\n a = t.extend({\n bearing: r\n }, this.options.fitBoundsOptions);\n\n this._map.fitBounds(i.toBounds(o), a, {\n geolocateSource: !0\n });\n }, o.prototype._updateMarker = function (e) {\n if (e) {\n var i = new t.LngLat(e.coords.longitude, e.coords.latitude);\n this._accuracyCircleMarker.setLngLat(i).addTo(this._map), this._userLocationDotMarker.setLngLat(i).addTo(this._map), this._accuracy = e.coords.accuracy, this.options.showUserLocation && this.options.showAccuracyCircle && this._updateCircleRadius();\n } else this._userLocationDotMarker.remove(), this._accuracyCircleMarker.remove();\n }, o.prototype._updateCircleRadius = function () {\n var t = this._map._container.clientHeight / 2,\n e = this._map.unproject([0, t]),\n i = this._map.unproject([1, t]),\n o = e.distanceTo(i),\n r = Math.ceil(2 * this._accuracy / o);\n\n this._circleElement.style.width = r + "px", this._circleElement.style.height = r + "px";\n }, o.prototype._onZoom = function () {\n this.options.showUserLocation && this.options.showAccuracyCircle && this._updateCircleRadius();\n }, o.prototype._onError = function (e) {\n if (this._map) {\n if (this.options.trackUserLocation) if (1 === e.code) {\n this._watchState = "OFF", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"), this._geolocateButton.disabled = !0;\n\n var i = this._map._getUIString("GeolocateControl.LocationNotAvailable");\n\n this._geolocateButton.title = i, this._geolocateButton.setAttribute("aria-label", i), void 0 !== this._geolocationWatchID && this._clearWatch();\n } else {\n if (3 === e.code && Ur) return;\n\n this._setErrorState();\n }\n "OFF" !== this._watchState && this.options.showUserLocation && this._dotElement.classList.add("maplibregl-user-location-dot-stale"), this.fire(new t.Event("error", e)), this._finish();\n }\n }, o.prototype._finish = function () {\n this._timeoutId && clearTimeout(this._timeoutId), this._timeoutId = void 0;\n }, o.prototype._setupUI = function (e) {\n var o = this;\n\n if (this._container.addEventListener("contextmenu", function (t) {\n return t.preventDefault();\n }), this._geolocateButton = i.create("button", "maplibregl-ctrl-geolocate", this._container), i.create("span", "maplibregl-ctrl-icon", this._geolocateButton).setAttribute("aria-hidden", !0), this._geolocateButton.type = "button", !1 === e) {\n t.warnOnce("Geolocation support is not available so the GeolocateControl will be disabled.");\n\n var r = this._map._getUIString("GeolocateControl.LocationNotAvailable");\n\n this._geolocateButton.disabled = !0, this._geolocateButton.title = r, this._geolocateButton.setAttribute("aria-label", r);\n } else {\n var a = this._map._getUIString("GeolocateControl.FindMyLocation");\n\n this._geolocateButton.title = a, this._geolocateButton.setAttribute("aria-label", a);\n }\n\n this.options.trackUserLocation && (this._geolocateButton.setAttribute("aria-pressed", "false"), this._watchState = "OFF"), this.options.showUserLocation && (this._dotElement = i.create("div", "maplibregl-user-location-dot"), this._userLocationDotMarker = new Br(this._dotElement), this._circleElement = i.create("div", "maplibregl-user-location-accuracy-circle"), this._accuracyCircleMarker = new Br({\n element: this._circleElement,\n pitchAlignment: "map"\n }), this.options.trackUserLocation && (this._watchState = "OFF"), this._map.on("zoom", this._onZoom)), this._geolocateButton.addEventListener("click", this.trigger.bind(this)), this._setup = !0, this.options.trackUserLocation && this._map.on("movestart", function (e) {\n e.geolocateSource || "ACTIVE_LOCK" !== o._watchState || e.originalEvent && "resize" === e.originalEvent.type || (o._watchState = "BACKGROUND", o._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background"), o._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"), o.fire(new t.Event("trackuserlocationend")));\n });\n }, o.prototype.trigger = function () {\n if (!this._setup) return t.warnOnce("Geolocate control triggered before added to a map"), !1;\n\n if (this.options.trackUserLocation) {\n switch (this._watchState) {\n case "OFF":\n this._watchState = "WAITING_ACTIVE", this.fire(new t.Event("trackuserlocationstart"));\n break;\n\n case "WAITING_ACTIVE":\n case "ACTIVE_LOCK":\n case "ACTIVE_ERROR":\n case "BACKGROUND_ERROR":\n Fr--, Ur = !1, this._watchState = "OFF", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-active-error"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"), this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background-error"), this.fire(new t.Event("trackuserlocationend"));\n break;\n\n case "BACKGROUND":\n this._watchState = "ACTIVE_LOCK", this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-background"), this._lastKnownPosition && this._updateCamera(this._lastKnownPosition), this.fire(new t.Event("trackuserlocationstart"));\n }\n\n switch (this._watchState) {\n case "WAITING_ACTIVE":\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");\n break;\n\n case "ACTIVE_LOCK":\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active");\n\n break;\n\n case "ACTIVE_ERROR":\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-active-error");\n break;\n\n case "BACKGROUND":\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background");\n\n break;\n\n case "BACKGROUND_ERROR":\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-background-error");\n }\n\n if ("OFF" === this._watchState && void 0 !== this._geolocationWatchID) this._clearWatch();else if (void 0 === this._geolocationWatchID) {\n var e;\n this._geolocateButton.classList.add("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.setAttribute("aria-pressed", "true"), ++Fr > 1 ? (e = {\n maximumAge: 6e5,\n timeout: 0\n }, Ur = !0) : (e = this.options.positionOptions, Ur = !1), this._geolocationWatchID = t.window.navigator.geolocation.watchPosition(this._onSuccess, this._onError, e);\n }\n } else t.window.navigator.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions), this._timeoutId = setTimeout(this._finish, 1e4);\n\n return !0;\n }, o.prototype._clearWatch = function () {\n t.window.navigator.geolocation.clearWatch(this._geolocationWatchID), this._geolocationWatchID = void 0, this._geolocateButton.classList.remove("maplibregl-ctrl-geolocate-waiting"), this._geolocateButton.setAttribute("aria-pressed", "false"), this.options.showUserLocation && this._updateMarker(null);\n }, o;\n }(t.Evented),\n Zr = {\n maxWidth: 100,\n unit: "metric"\n },\n qr = function qr(e) {\n this.options = t.extend({}, Zr, e), t.bindAll(["_onMove", "setUnit"], this);\n };\n\n function jr(t, e, i) {\n var o = i && i.maxWidth || 100,\n r = t._container.clientHeight / 2,\n a = t.unproject([0, r]),\n n = t.unproject([o, r]),\n s = a.distanceTo(n);\n\n if (i && "imperial" === i.unit) {\n var l = 3.2808 * s;\n l > 5280 ? Vr(e, o, l / 5280, t._getUIString("ScaleControl.Miles")) : Vr(e, o, l, t._getUIString("ScaleControl.Feet"));\n } else i && "nautical" === i.unit ? Vr(e, o, s / 1852, t._getUIString("ScaleControl.NauticalMiles")) : s >= 1e3 ? Vr(e, o, s / 1e3, t._getUIString("ScaleControl.Kilometers")) : Vr(e, o, s, t._getUIString("ScaleControl.Meters"));\n }\n\n function Vr(t, e, i, o) {\n var r,\n a,\n n,\n s = (r = i, (a = Math.pow(10, ("" + Math.floor(r)).length - 1)) * (n = (n = r / a) >= 10 ? 10 : n >= 5 ? 5 : n >= 3 ? 3 : n >= 2 ? 2 : n >= 1 ? 1 : function (t) {\n var e = Math.pow(10, Math.ceil(-Math.log(t) / Math.LN10));\n return Math.round(t * e) / e;\n }(n)));\n t.style.width = e * (s / i) + "px", t.innerHTML = s + " " + o;\n }\n\n qr.prototype.getDefaultPosition = function () {\n return "bottom-left";\n }, qr.prototype._onMove = function () {\n jr(this._map, this._container, this.options);\n }, qr.prototype.onAdd = function (t) {\n return this._map = t, this._container = i.create("div", "maplibregl-ctrl maplibregl-ctrl-scale", t.getContainer()), this._map.on("move", this._onMove), this._onMove(), this._container;\n }, qr.prototype.onRemove = function () {\n i.remove(this._container), this._map.off("move", this._onMove), this._map = void 0;\n }, qr.prototype.setUnit = function (t) {\n this.options.unit = t, jr(this._map, this._container, this.options);\n };\n\n var Gr = function Gr(e) {\n this._fullscreen = !1, e && e.container && (e.container instanceof t.window.HTMLElement ? this._container = e.container : t.warnOnce("Full screen control \'container\' must be a DOM element.")), t.bindAll(["_onClickFullscreen", "_changeIcon"], this), "onfullscreenchange" in t.window.document ? this._fullscreenchange = "fullscreenchange" : "onmozfullscreenchange" in t.window.document ? this._fullscreenchange = "mozfullscreenchange" : "onwebkitfullscreenchange" in t.window.document ? this._fullscreenchange = "webkitfullscreenchange" : "onmsfullscreenchange" in t.window.document && (this._fullscreenchange = "MSFullscreenChange");\n };\n\n Gr.prototype.onAdd = function (e) {\n return this._map = e, this._container || (this._container = this._map.getContainer()), this._controlContainer = i.create("div", "maplibregl-ctrl maplibregl-ctrl-group"), this._checkFullscreenSupport() ? this._setupUI() : (this._controlContainer.style.display = "none", t.warnOnce("This device does not support fullscreen mode.")), this._controlContainer;\n }, Gr.prototype.onRemove = function () {\n i.remove(this._controlContainer), this._map = null, t.window.document.removeEventListener(this._fullscreenchange, this._changeIcon);\n }, Gr.prototype._checkFullscreenSupport = function () {\n return !!(t.window.document.fullscreenEnabled || t.window.document.mozFullScreenEnabled || t.window.document.msFullscreenEnabled || t.window.document.webkitFullscreenEnabled);\n }, Gr.prototype._setupUI = function () {\n var e = this._fullscreenButton = i.create("button", "maplibregl-ctrl-fullscreen", this._controlContainer);\n i.create("span", "maplibregl-ctrl-icon", e).setAttribute("aria-hidden", !0), e.type = "button", this._updateTitle(), this._fullscreenButton.addEventListener("click", this._onClickFullscreen), t.window.document.addEventListener(this._fullscreenchange, this._changeIcon);\n }, Gr.prototype._updateTitle = function () {\n var t = this._getTitle();\n\n this._fullscreenButton.setAttribute("aria-label", t), this._fullscreenButton.title = t;\n }, Gr.prototype._getTitle = function () {\n return this._map._getUIString(this._isFullscreen() ? "FullscreenControl.Exit" : "FullscreenControl.Enter");\n }, Gr.prototype._isFullscreen = function () {\n return this._fullscreen;\n }, Gr.prototype._changeIcon = function () {\n (t.window.document.fullscreenElement || t.window.document.mozFullScreenElement || t.window.document.webkitFullscreenElement || t.window.document.msFullscreenElement) === this._container !== this._fullscreen && (this._fullscreen = !this._fullscreen, this._fullscreenButton.classList.toggle("maplibregl-ctrl-shrink"), this._fullscreenButton.classList.toggle("maplibregl-ctrl-fullscreen"), this._updateTitle());\n }, Gr.prototype._onClickFullscreen = function () {\n this._isFullscreen() ? t.window.document.exitFullscreen ? t.window.document.exitFullscreen() : t.window.document.mozCancelFullScreen ? t.window.document.mozCancelFullScreen() : t.window.document.msExitFullscreen ? t.window.document.msExitFullscreen() : t.window.document.webkitCancelFullScreen && t.window.document.webkitCancelFullScreen() : this._container.requestFullscreen ? this._container.requestFullscreen() : this._container.mozRequestFullScreen ? this._container.mozRequestFullScreen() : this._container.msRequestFullscreen ? this._container.msRequestFullscreen() : this._container.webkitRequestFullscreen && this._container.webkitRequestFullscreen();\n };\n\n var Wr = {\n closeButton: !0,\n closeOnClick: !0,\n focusAfterOpen: !0,\n className: "",\n maxWidth: "240px"\n },\n Xr = ["a[href]", "[tabindex]:not([tabindex=\'-1\'])", "[contenteditable]:not([contenteditable=\'false\'])", "button:not([disabled])", "input:not([disabled])", "select:not([disabled])", "textarea:not([disabled])"].join(", "),\n Hr = function (e) {\n function o(i) {\n e.call(this), this.options = t.extend(Object.create(Wr), i), t.bindAll(["_update", "_onClose", "remove", "_onMouseMove", "_onMouseUp", "_onDrag"], this);\n }\n\n return e && (o.__proto__ = e), (o.prototype = Object.create(e && e.prototype)).constructor = o, o.prototype.addTo = function (e) {\n return this._map && this.remove(), this._map = e, this.options.closeOnClick && this._map.on("click", this._onClose), this.options.closeOnMove && this._map.on("move", this._onClose), this._map.on("remove", this.remove), this._update(), this._focusFirstElement(), this._trackPointer ? (this._map.on("mousemove", this._onMouseMove), this._map.on("mouseup", this._onMouseUp), this._container && this._container.classList.add("maplibregl-popup-track-pointer"), this._map._canvasContainer.classList.add("maplibregl-track-pointer")) : this._map.on("move", this._update), this.fire(new t.Event("open")), this;\n }, o.prototype.isOpen = function () {\n return !!this._map;\n }, o.prototype.remove = function () {\n return this._content && i.remove(this._content), this._container && (i.remove(this._container), delete this._container), this._map && (this._map.off("move", this._update), this._map.off("move", this._onClose), this._map.off("click", this._onClose), this._map.off("remove", this.remove), this._map.off("mousemove", this._onMouseMove), this._map.off("mouseup", this._onMouseUp), this._map.off("drag", this._onDrag), delete this._map), this.fire(new t.Event("close")), this;\n }, o.prototype.getLngLat = function () {\n return this._lngLat;\n }, o.prototype.setLngLat = function (e) {\n return this._lngLat = t.LngLat.convert(e), this._pos = null, this._trackPointer = !1, this._update(), this._map && (this._map.on("move", this._update), this._map.off("mousemove", this._onMouseMove), this._container && this._container.classList.remove("maplibregl-popup-track-pointer"), this._map._canvasContainer.classList.remove("maplibregl-track-pointer")), this;\n }, o.prototype.trackPointer = function () {\n return this._trackPointer = !0, this._pos = null, this._update(), this._map && (this._map.off("move", this._update), this._map.on("mousemove", this._onMouseMove), this._map.on("drag", this._onDrag), this._container && this._container.classList.add("maplibregl-popup-track-pointer"), this._map._canvasContainer.classList.add("maplibregl-track-pointer")), this;\n }, o.prototype.getElement = function () {\n return this._container;\n }, o.prototype.setText = function (e) {\n return this.setDOMContent(t.window.document.createTextNode(e));\n }, o.prototype.setHTML = function (e) {\n var i,\n o = t.window.document.createDocumentFragment(),\n r = t.window.document.createElement("body");\n\n for (r.innerHTML = e; i = r.firstChild;) {\n o.appendChild(i);\n }\n\n return this.setDOMContent(o);\n }, o.prototype.getMaxWidth = function () {\n return this._container && this._container.style.maxWidth;\n }, o.prototype.setMaxWidth = function (t) {\n return this.options.maxWidth = t, this._update(), this;\n }, o.prototype.setDOMContent = function (t) {\n if (this._content) for (; this._content.hasChildNodes();) {\n this._content.firstChild && this._content.removeChild(this._content.firstChild);\n } else this._content = i.create("div", "maplibregl-popup-content", this._container);\n return this._content.appendChild(t), this._createCloseButton(), this._update(), this._focusFirstElement(), this;\n }, o.prototype.addClassName = function (t) {\n this._container && this._container.classList.add(t);\n }, o.prototype.removeClassName = function (t) {\n this._container && this._container.classList.remove(t);\n }, o.prototype.setOffset = function (t) {\n return this.options.offset = t, this._update(), this;\n }, o.prototype.toggleClassName = function (t) {\n if (this._container) return this._container.classList.toggle(t);\n }, o.prototype._createCloseButton = function () {\n this.options.closeButton && (this._closeButton = i.create("button", "maplibregl-popup-close-button", this._content), this._closeButton.type = "button", this._closeButton.setAttribute("aria-label", "Close popup"), this._closeButton.innerHTML = "×", this._closeButton.addEventListener("click", this._onClose));\n }, o.prototype._onMouseUp = function (t) {\n this._update(t.point);\n }, o.prototype._onMouseMove = function (t) {\n this._update(t.point);\n }, o.prototype._onDrag = function (t) {\n this._update(t.point);\n }, o.prototype._update = function (e) {\n var o = this;\n\n if (this._map && (this._lngLat || this._trackPointer) && this._content && (this._container || (this._container = i.create("div", "maplibregl-popup", this._map.getContainer()), this._tip = i.create("div", "maplibregl-popup-tip", this._container), this._container.appendChild(this._content), this.options.className && this.options.className.split(" ").forEach(function (t) {\n return o._container.classList.add(t);\n }), this._trackPointer && this._container.classList.add("maplibregl-popup-track-pointer")), this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth && (this._container.style.maxWidth = this.options.maxWidth), this._map.transform.renderWorldCopies && !this._trackPointer && (this._lngLat = Mr(this._lngLat, this._pos, this._map.transform)), !this._trackPointer || e)) {\n var r = this._pos = this._trackPointer && e ? e : this._map.project(this._lngLat),\n a = this.options.anchor,\n n = function e(i) {\n if (i) {\n if ("number" == typeof i) {\n var o = Math.round(Math.sqrt(.5 * Math.pow(i, 2)));\n return {\n center: new t.Point(0, 0),\n top: new t.Point(0, i),\n "top-left": new t.Point(o, o),\n "top-right": new t.Point(-o, o),\n bottom: new t.Point(0, -i),\n "bottom-left": new t.Point(o, -o),\n "bottom-right": new t.Point(-o, -o),\n left: new t.Point(i, 0),\n right: new t.Point(-i, 0)\n };\n }\n\n if (i instanceof t.Point || Array.isArray(i)) {\n var r = t.Point.convert(i);\n return {\n center: r,\n top: r,\n "top-left": r,\n "top-right": r,\n bottom: r,\n "bottom-left": r,\n "bottom-right": r,\n left: r,\n right: r\n };\n }\n\n return {\n center: t.Point.convert(i.center || [0, 0]),\n top: t.Point.convert(i.top || [0, 0]),\n "top-left": t.Point.convert(i["top-left"] || [0, 0]),\n "top-right": t.Point.convert(i["top-right"] || [0, 0]),\n bottom: t.Point.convert(i.bottom || [0, 0]),\n "bottom-left": t.Point.convert(i["bottom-left"] || [0, 0]),\n "bottom-right": t.Point.convert(i["bottom-right"] || [0, 0]),\n left: t.Point.convert(i.left || [0, 0]),\n right: t.Point.convert(i.right || [0, 0])\n };\n }\n\n return e(new t.Point(0, 0));\n }(this.options.offset);\n\n if (!a) {\n var s,\n l = this._container.offsetWidth,\n c = this._container.offsetHeight;\n s = r.y + n.bottom.y < c ? ["top"] : r.y > this._map.transform.height - c ? ["bottom"] : [], r.x < l / 2 ? s.push("left") : r.x > this._map.transform.width - l / 2 && s.push("right"), a = 0 === s.length ? "bottom" : s.join("-");\n }\n\n var u = r.add(n[a]).round();\n i.setTransform(this._container, Lr[a] + " translate(" + u.x + "px," + u.y + "px)"), Rr(this._container, a, "popup");\n }\n }, o.prototype._focusFirstElement = function () {\n if (this.options.focusAfterOpen && this._container) {\n var t = this._container.querySelector(Xr);\n\n t && t.focus();\n }\n }, o.prototype._onClose = function () {\n this.remove();\n }, o;\n }(t.Evented),\n Kr = {\n version: t.version,\n supported: e,\n setRTLTextPlugin: t.setRTLTextPlugin,\n getRTLTextPluginStatus: t.getRTLTextPluginStatus,\n Map: Sr,\n NavigationControl: Dr,\n GeolocateControl: Nr,\n AttributionControl: yr,\n ScaleControl: qr,\n FullscreenControl: Gr,\n Popup: Hr,\n Marker: Br,\n Style: je,\n LngLat: t.LngLat,\n LngLatBounds: t.LngLatBounds,\n Point: t.Point,\n MercatorCoordinate: t.MercatorCoordinate,\n Evented: t.Evented,\n config: t.config,\n prewarm: function prewarm() {\n Ft().acquire(Rt);\n },\n clearPrewarmedResources: function clearPrewarmedResources() {\n var t = Bt;\n t && (t.isPreloaded() && 1 === t.numActive() ? (t.release(Rt), Bt = null) : console.warn("Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()"));\n },\n\n get accessToken() {\n return t.config.ACCESS_TOKEN;\n },\n\n set accessToken(e) {\n t.config.ACCESS_TOKEN = e;\n },\n\n get baseApiUrl() {\n return t.config.API_URL;\n },\n\n set baseApiUrl(e) {\n t.config.API_URL = e;\n },\n\n get workerCount() {\n return kt.workerCount;\n },\n\n set workerCount(t) {\n kt.workerCount = t;\n },\n\n get maxParallelImageRequests() {\n return t.config.MAX_PARALLEL_IMAGE_REQUESTS;\n },\n\n set maxParallelImageRequests(e) {\n t.config.MAX_PARALLEL_IMAGE_REQUESTS = e;\n },\n\n clearStorage: function clearStorage(e) {\n t.clearTileCache(e);\n },\n workerUrl: "",\n addProtocol: function addProtocol(e, i) {\n t.config.REGISTERED_PROTOCOLS[e] = i;\n },\n removeProtocol: function removeProtocol(e) {\n delete t.config.REGISTERED_PROTOCOLS[e];\n }\n };\n\n return Kr;\n }); //\n\n return maplibregl;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9tYXBsaWJyZS1nbC9kaXN0L21hcGxpYnJlLWdsLmpzPzJjYjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQU8sQ0FBQyxJQUFrQzs7QUFFMUM7QUFDQTtBQUNBLEVBQUUsS0FBNEQsZ0NBQWdDLENBQXVIO0FBQ3JOLENBQUM7QUFDRDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wscURBQXFELCtCQUErQiwrQkFBK0I7QUFDbkg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsb0RBQW9ELE9BQU87QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtB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Q0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtB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QTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELFNBQVM7QUFDekQ7QUFDQTs7QUFFQSw0QkFBNEIsY0FBYztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHVEQUF1RCxjQUFjO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsd0RBQXdELGNBQWM7QUFDdEU7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLGNBQWM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsY0FBYztBQUM3RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUsseUNBQXlDO0FBQzlDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7QUFFUCxzQkFBc0IsY0FBYztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0QsS0FBSztBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLHdEQUF3RDtBQUN4RCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9B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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixjQUFjO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixjQUFjO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsOERBQThELElBQUksSUFBSSxtSUFBbUksK0RBQStEO0FBQ3hRO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsa0JBQWtCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPLGlLQUFpSztBQUN4SztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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QU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU8scUNBQXFDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLHdDQUF3QyxjQUFjO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSw0RkFBNEYsT0FBTztBQUNuRztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCx5REFBeUQsT0FBTztBQUNoRTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsNERBQTREO0FBQzVEO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBLEtBQUs7QUFDTCwyREFBMkQsT0FBTztBQUNsRTtBQUNBLE9BQU87QUFDUCx1QkFBdUIsT0FBTztBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsK0RBQStEO0FBQy9ELG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0EsS0FBSztBQUNM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QUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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T0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRCx3REFBd0QsY0FBYztBQUNySSwyREFBMkQsY0FBYztBQUN6RTs7QUFFQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBLGdGQUFnRixrTEFBa0wsa0RBQWtEOztBQUVwVCw0QkFBNEIsY0FBYztBQUMxQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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QThFO0FBQzlFO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHLHVCQUF1QixhQUFhLHVCQUF1QjtBQUMzSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOztBQUVQLHVEQUF1RCxPQUFPLHNFQUFzRSxFQUFFLDZCQUE2QixFQUFFLDZCQUE2QixFQUFFLDhFQUE4RSxRQUFRLGdCQUFnQixlQUFlO0FBQ3pULEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixPQUFPO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQsT0FBTztBQUNsRSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsK0JBQStCOztBQUUvQixxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxxQkFBcUIsd0JBQXdCO0FBQzdDOztBQUVBO0FBQ0E7QUFDQSwyREFBMkQseURBQXlELHlHQUF5RztBQUM3TjtBQUNBLE9BQU8saUhBQWlIO0FBQ3hIO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLCtEQUErRCxvSEFBb0gsc0NBQXNDO0FBQ3pOLHNHQUFzRztBQUN0RztBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrQkFBa0Isc0JBQXNCLGlDQUFpQztBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsU0FBUztBQUNULHVFQUF1RSwrREFBK0QsY0FBYztBQUNwSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQSxnQ0FBZ0MseUJBQXlCO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSwwRUFBMEUsY0FBYztBQUN4RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzREFBc0QsY0FBYztBQUNwRSxxRUFBcUUsY0FBYztBQUNuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBLGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtEQUFrRCxjQUFjO0FBQ2hFO0FBQ0E7O0FBRUEseUJBQXlCLGtCQUFrQjtBQUMzQztBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU8sZ0JBQWdCLGNBQWM7QUFDckM7QUFDQTs7QUFFQTs7QUFFQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTyxRQUFRLGNBQWM7QUFDN0I7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDZDQUE2QyxjQUFjO0FBQzNEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHVDQUF1QyxjQUFjO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsOENBQThDLGNBQWM7QUFDNUQsaUNBQWlDLGNBQWM7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLOztBQUVMO0FBQ0EsMEZBQTBGLDZIQUE2SDtBQUN2Tjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGVBQWU7O0FBRWYsb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlLGNBQWM7QUFDeEM7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2QixLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsY0FBYztBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0ZBQXNGO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsZUFBZSxjQUFjO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHVCQUF1QixjQUFjO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlCQUF5QixrQkFBa0I7QUFDM0M7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsZ0NBQWdDO0FBQ2hDLCtDQUErQztBQUMvQywrQ0FBK0M7QUFDL0M7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0Esa0NBQWtDLGNBQWM7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBLDhEQUE4RDtBQUM5RCw2RUFBNkU7QUFDN0U7QUFDQSxhQUFhO0FBQ2I7O0FBRUEscUVBQXFFO0FBQ3JFO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHVCQUF1QixjQUFjO0FBQ2xEO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsb0RBQW9ELHlDQUF5QztBQUN4Rzs7QUFFQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQSx1SUFBdUk7QUFDdkk7QUFDQSxlQUFlLDhFQUE4RTtBQUM3RixrRUFBa0U7QUFDbEU7QUFDQTs7QUFFQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRkFBMEYsa0xBQWtMLGtEQUFrRDtBQUM5VDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQSxpRkFBaUYsY0FBYztBQUMvRixzR0FBc0csY0FBYztBQUNwSDtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhEQUE4RCxjQUFjO0FBQ3ZGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxzRUFBc0UsY0FBYztBQUMvRjtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtFQUFrRSxjQUFjO0FBQzNGO0FBQ0E7QUFDQSxXQUFXLDZEQUE2RCxjQUFjO0FBQ3RGLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU8sd0JBQXdCLGNBQWM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLFFBQVEsY0FBYztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QyxjQUFjO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnREFBZ0QsU0FBUyxjQUFjO0FBQ3ZFO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0Esa0RBQWtELGNBQWM7QUFDaEU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0EsNkJBQTZCLG1CQUFtQjtBQUNoRCxLQUFLO0FBQ0wsc0NBQXNDLGNBQWM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx1QkFBdUIsUUFBUSxjQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTyw4Q0FBOEMsY0FBYztBQUNuRTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0QsY0FBYztBQUM3RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0RBQWtELGNBQWM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsbUNBQW1DLGNBQWM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPLFVBQVU7QUFDakI7O0FBRUE7QUFDQSxvSEFBb0g7QUFDcEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUyw0QkFBNEI7QUFDckMsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixjQUFjO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFELE9BQU87QUFDNUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRCxjQUFjO0FBQ3pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlEQUF5RCxjQUFjO0FBQ3ZFLHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEscUJBQXFCLGNBQWM7QUFDbkMseUNBQXlDLGNBQWM7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBLHNGQUFzRixjQUFjO0FBQ3BHLGlDQUFpQyxjQUFjO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBLGlCQUFpQixjQUFjO0FBQy9CO0FBQ0E7O0FBRUE7O0FBRUEsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTs7QUFFQTs7QUFFQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1GQUFtRixPQUFPO0FBQzFGO0FBQ0E7QUFDQTs7QUFFQSw4REFBOEQsT0FBTztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSw4SUFBOEksY0FBYztBQUM1SjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0VBQW9FLE9BQU87QUFDM0UsNkNBQTZDLGtCQUFrQjtBQUMvRDtBQUNBOztBQUVBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RCxVQUFVO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSw2REFBNkQsVUFBVTtBQUN2RTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRSxvRUFBb0UsY0FBYztBQUNqSztBQUNBLFNBQVMsMkNBQTJDLGNBQWM7QUFDbEUseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrR0FBK0csNENBQTRDLGNBQWM7QUFDeks7QUFDQSxTQUFTLDZDQUE2QztBQUN0RDtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVMsMENBQTBDO0FBQ25EO0FBQ0E7QUFDQSx5QkFBeUIsa0NBQWtDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0MsY0FBYztBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0hBQWdILE9BQU87QUFDdkg7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLGNBQWM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLHFFQUFxRSxrRUFBa0Usd0RBQXdELGdEQUFnRCw4Q0FBOEMsY0FBYztBQUMzUztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixjQUFjO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwRUFBMEUsa0JBQWtCO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQSw2RkFBNkY7QUFDN0Y7O0FBRUEseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0EsU0FBUyxtREFBbUQsdUJBQXVCO0FBQ25GLGlDQUFpQywwQkFBMEI7QUFDM0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsY0FBYztBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0EsU0FBUyxpQkFBaUIsY0FBYztBQUN4Qzs7QUFFQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sUUFBUSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsY0FBYztBQUM1RTtBQUNBLE9BQU8scURBQXFELGdFQUFnRSxjQUFjO0FBQzFJO0FBQ0EsT0FBTywrQ0FBK0MsY0FBYztBQUNwRTs7QUFFQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFLCtCQUErQixjQUFjO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQsT0FBTztBQUNoRTtBQUNBOztBQUVBLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJELHVCQUF1QjtBQUNsRjtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87O0FBRVAscUJBQXFCLHFNQUFxTTtBQUMxTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBOztBQUVBOztBQUVBLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzR0FBc0csY0FBYztBQUNwSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhIQUE4SCxjQUFjO0FBQzVJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLDhDQUE4QywyQkFBMkI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCwwSEFBMEgsY0FBYztBQUN4STs7QUFFQTtBQUNBOztBQUVBLCtHQUErRyxjQUFjO0FBQzdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1KQUFtSixjQUFjO0FBQ2pLOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsa0RBQWtELGNBQWM7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsK0RBQStELFVBQVU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQyxhQUFhO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsdUJBQXVCO0FBQy9FO0FBQ0EsZUFBZSxpREFBaUQseUJBQXlCO0FBQ3pGO0FBQ0EsZUFBZSw0Q0FBNEMsOENBQThDLDBDQUEwQywwQkFBMEI7QUFDN0s7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0IsUUFBUTtBQUN2QztBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCLG1DQUFtQyxjQUFjO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUNBQWlDLGVBQWUsY0FBYztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUEsd0NBQXdDLGNBQWM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGVBQWU7QUFDZjtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSw4RUFBOEUsMkJBQTJCO0FBQ3pHO0FBQ0E7QUFDQSxPQUFPLHlCQUF5Qiw0QkFBNEI7QUFDNUQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsaUVBQWlFLDZEQUE2RDtBQUM5SDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLHVFQUF1RTtBQUN2RSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRixTQUFTO0FBQ1Q7QUFDQTs7QUFFQSxvRkFBb0Y7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0IsS0FBSztBQUNMLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLDREQUE0RCxjQUFjO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5Qix1Q0FBdUMsNERBQTREO0FBQ2xLO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHFDQUFxQyxjQUFjO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxvREFBb0QsY0FBYztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCx1QkFBdUIsZUFBZSxjQUFjO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsOEJBQThCLGNBQWM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixPQUFPO0FBQzVCLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixPQUFPO0FBQ3hCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw0QkFBNEIsT0FBTztBQUNuQyxtRkFBbUYsV0FBVztBQUM5RjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0JBQXdCLE9BQU87QUFDL0IsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOEhBQThILDJCQUEyQjtBQUN6SjtBQUNBO0FBQ0E7O0FBRUEsbUtBQW1LLDJCQUEyQjtBQUM5TDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLGNBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixzQkFBc0I7QUFDdEI7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLG9CQUFvQjtBQUNwQix5QkFBeUIsZUFBZSxjQUFjO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUVBQW1FLFVBQVUsZ0JBQWdCLE1BQU07QUFDbkc7QUFDQSxvQkFBb0I7QUFDcEIseUJBQXlCLGdDQUFnQyxjQUFjO0FBQ3ZFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVAsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMLGlDQUFpQyxRQUFRO0FBQ3pDLGlGQUFpRixnQkFBZ0I7QUFDakc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnQ0FBZ0MsUUFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFLGdCQUFnQjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkRBQTJELGNBQWM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLHlCQUF5QjtBQUNoQyxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsMEJBQTBCO0FBQzFCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCwwQkFBMEI7QUFDMUIsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSx5RUFBeUUsc0NBQXNDO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUVBQXlFLHNDQUFzQztBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxzVEFBc1Q7QUFDdFQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNU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Q0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FB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QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvR0FBb0cscUJBQXFCLDJCQUEyQiwwRkFBMEYsbUVBQW1FO0FBQ2pUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGNBQWM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDRCQUE0QixxRkFBcUYsY0FBYztBQUMvSDtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ01BQWdNLGNBQWM7QUFDOU07QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVB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Q3pGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwZEFBMGQ7QUFDMWQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDRXQUE0VyxZQUFZO0FBQ3hYO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtELFFBQVE7QUFDMUQ7QUFDQTs7QUFFQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRSxvQkFBb0IsT0FBTztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsZ0VBQWdFLGNBQWM7QUFDOUU7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCw0REFBNEQscUNBQXFDO0FBQ2pHO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaUNBQWlDLGNBQWM7QUFDeEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0QsYUFBYTtBQUM3RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUssc0NBQXNDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUssc0NBQXNDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsUUFBUSxjQUFjO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxxREFBcUQsY0FBYztBQUNuRTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLHFDQUFxQztBQUM1QyxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0MsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUssdUNBQXVDO0FBQzVDO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0M7QUFDcEMsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FB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LE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrUEFBK1A7QUFDL1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCwrQkFBK0I7QUFDL0IsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLDhGQUE4RixjQUFjO0FBQzVHO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlxQkFBaXFCO0FBQ2pxQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtRUFBbUU7QUFDNUU7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXLEVBQUUsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0dBQW9HO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsbUVBQW1FO0FBQ25FOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLGtCQUFrQjtBQUMvQztBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLGlDQUFpQywrQkFBK0I7QUFDaEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1Asa1FBQWtRO0FBQ2xRLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQSxDQUFDIiwiZmlsZSI6Ijk5MTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIik7XG5cbi8qIE1hcExpYnJlIEdMIEpTIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSAzLUNsYXVzZSBCU0QgTGljZW5zZS4gRnVsbCB0ZXh0IG9mIGxpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBsaWJyZS9tYXBsaWJyZS1nbC1qcy9ibG9iL3YxLjE1LjAvTElDRU5TRS50eHQgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDogdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDogKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwubWFwbGlicmVnbCA9IGZhY3RvcnkoKSk7XG59KSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICB2YXIgc2hhcmVkLCB3b3JrZXIsIG1hcGxpYnJlZ2w7IC8vIGRlZmluZSBnZXRzIGNhbGxlZCB0aHJlZSB0aW1lczogb25lIGZvciBlYWNoIGNodW5rLiB3ZSByZWx5IG9uIHRoZSBvcmRlclxuICAvLyB0aGV5J3JlIGltcG9ydGVkIHRvIGtub3cgd2hpY2ggaXMgd2hpY2hcblxuICBmdW5jdGlvbiBkZWZpbmUoXywgY2h1bmspIHtcbiAgICBpZiAoIXNoYXJlZCkge1xuICAgICAgc2hhcmVkID0gY2h1bms7XG4gICAgfSBlbHNlIGlmICghd29ya2VyKSB7XG4gICAgICB3b3JrZXIgPSBjaHVuaztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHdvcmtlckJ1bmRsZVN0cmluZyA9ICd2YXIgc2hhcmVkQ2h1bmsgPSB7fTsgKCcgKyBzaGFyZWQgKyAnKShzaGFyZWRDaHVuayk7ICgnICsgd29ya2VyICsgJykoc2hhcmVkQ2h1bmspOyc7XG4gICAgICB2YXIgc2hhcmVkQ2h1bmsgPSB7fTtcbiAgICAgIHNoYXJlZChzaGFyZWRDaHVuayk7XG4gICAgICBtYXBsaWJyZWdsID0gY2h1bmsoc2hhcmVkQ2h1bmspO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbWFwbGlicmVnbC53b3JrZXJVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd29ya2VyQnVuZGxlU3RyaW5nXSwge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWZpbmUoW1wiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIGUodCwgZSkge1xuICAgICAgcmV0dXJuIHQoZSA9IHtcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH0sIGUuZXhwb3J0cyksIGUuZXhwb3J0cztcbiAgICB9XG5cbiAgICB2YXIgciA9IG47XG5cbiAgICBmdW5jdGlvbiBuKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuY3ggPSAzICogdCwgdGhpcy5ieCA9IDMgKiAociAtIHQpIC0gdGhpcy5jeCwgdGhpcy5heCA9IDEgLSB0aGlzLmN4IC0gdGhpcy5ieCwgdGhpcy5jeSA9IDMgKiBlLCB0aGlzLmJ5ID0gMyAqIChuIC0gZSkgLSB0aGlzLmN5LCB0aGlzLmF5ID0gMSAtIHRoaXMuY3kgLSB0aGlzLmJ5LCB0aGlzLnAxeCA9IHQsIHRoaXMucDF5ID0gbiwgdGhpcy5wMnggPSByLCB0aGlzLnAyeSA9IG47XG4gICAgfVxuXG4gICAgbi5wcm90b3R5cGUuc2FtcGxlQ3VydmVYID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xuICAgIH0sIG4ucHJvdG90eXBlLnNhbXBsZUN1cnZlWSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gKCh0aGlzLmF5ICogdCArIHRoaXMuYnkpICogdCArIHRoaXMuY3kpICogdDtcbiAgICB9LCBuLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAoMyAqIHRoaXMuYXggKiB0ICsgMiAqIHRoaXMuYngpICogdCArIHRoaXMuY3g7XG4gICAgfSwgbi5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIsIG4sIGksIGEsIG87XG5cbiAgICAgIGZvciAodm9pZCAwID09PSBlICYmIChlID0gMWUtNiksIGkgPSB0LCBvID0gMDsgbyA8IDg7IG8rKykge1xuICAgICAgICBpZiAoYSA9IHRoaXMuc2FtcGxlQ3VydmVYKGkpIC0gdCwgTWF0aC5hYnMoYSkgPCBlKSByZXR1cm4gaTtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgoaSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhzKSA8IDFlLTYpIGJyZWFrO1xuICAgICAgICBpIC09IGEgLyBzO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGkgPSB0KSA8IChyID0gMCkpIHJldHVybiByO1xuICAgICAgaWYgKGkgPiAobiA9IDEpKSByZXR1cm4gbjtcblxuICAgICAgZm9yICg7IHIgPCBuOykge1xuICAgICAgICBpZiAoYSA9IHRoaXMuc2FtcGxlQ3VydmVYKGkpLCBNYXRoLmFicyhhIC0gdCkgPCBlKSByZXR1cm4gaTtcbiAgICAgICAgdCA+IGEgPyByID0gaSA6IG4gPSBpLCBpID0gLjUgKiAobiAtIHIpICsgcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfSwgbi5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCwgZSkpO1xuICAgIH07XG4gICAgdmFyIGkgPSBhO1xuXG4gICAgZnVuY3Rpb24gYSh0LCBlKSB7XG4gICAgICB0aGlzLnggPSB0LCB0aGlzLnkgPSBlO1xuICAgIH1cblxuICAgIGEucHJvdG90eXBlID0ge1xuICAgICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IGEodGhpcy54LCB0aGlzLnkpO1xuICAgICAgfSxcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpO1xuICAgICAgfSxcbiAgICAgIHN1YjogZnVuY3Rpb24gc3ViKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpO1xuICAgICAgfSxcbiAgICAgIG11bHRCeVBvaW50OiBmdW5jdGlvbiBtdWx0QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHQpO1xuICAgICAgfSxcbiAgICAgIGRpdkJ5UG9pbnQ6IGZ1bmN0aW9uIGRpdkJ5UG9pbnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpO1xuICAgICAgfSxcbiAgICAgIG11bHQ6IGZ1bmN0aW9uIG11bHQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KHQpO1xuICAgICAgfSxcbiAgICAgIGRpdjogZnVuY3Rpb24gZGl2KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KHQpO1xuICAgICAgfSxcbiAgICAgIHJvdGF0ZTogZnVuY3Rpb24gcm90YXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKHQpO1xuICAgICAgfSxcbiAgICAgIHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gcm90YXRlQXJvdW5kKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlQXJvdW5kKHQsIGUpO1xuICAgICAgfSxcbiAgICAgIG1hdE11bHQ6IGZ1bmN0aW9uIG1hdE11bHQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpO1xuICAgICAgfSxcbiAgICAgIHVuaXQ6IGZ1bmN0aW9uIHVuaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTtcbiAgICAgIH0sXG4gICAgICBwZXJwOiBmdW5jdGlvbiBwZXJwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7XG4gICAgICB9LFxuICAgICAgcm91bmQ6IGZ1bmN0aW9uIHJvdW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpO1xuICAgICAgfSxcbiAgICAgIG1hZzogZnVuY3Rpb24gbWFnKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgICB9LFxuICAgICAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHModCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSB0LnggJiYgdGhpcy55ID09PSB0Lnk7XG4gICAgICB9LFxuICAgICAgZGlzdDogZnVuY3Rpb24gZGlzdCh0KSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKTtcbiAgICAgIH0sXG4gICAgICBkaXN0U3FyOiBmdW5jdGlvbiBkaXN0U3FyKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LnggLSB0aGlzLngsXG4gICAgICAgICAgICByID0gdC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZSAqIGUgKyByICogcjtcbiAgICAgIH0sXG4gICAgICBhbmdsZTogZnVuY3Rpb24gYW5nbGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICAgIH0sXG4gICAgICBhbmdsZVRvOiBmdW5jdGlvbiBhbmdsZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gdC55LCB0aGlzLnggLSB0LngpO1xuICAgICAgfSxcbiAgICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24gYW5nbGVXaXRoKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCwgdC55KTtcbiAgICAgIH0sXG4gICAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uIGFuZ2xlV2l0aFNlcCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueCAqIGUgLSB0aGlzLnkgKiB0LCB0aGlzLnggKiB0ICsgdGhpcy55ICogZSk7XG4gICAgICB9LFxuICAgICAgX21hdE11bHQ6IGZ1bmN0aW9uIF9tYXRNdWx0KHQpIHtcbiAgICAgICAgdmFyIGUgPSB0WzJdICogdGhpcy54ICsgdFszXSAqIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHRbMF0gKiB0aGlzLnggKyB0WzFdICogdGhpcy55LCB0aGlzLnkgPSBlLCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9hZGQ6IGZ1bmN0aW9uIF9hZGQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ICs9IHQueCwgdGhpcy55ICs9IHQueSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfc3ViOiBmdW5jdGlvbiBfc3ViKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAtPSB0LngsIHRoaXMueSAtPSB0LnksIHRoaXM7XG4gICAgICB9LFxuICAgICAgX211bHQ6IGZ1bmN0aW9uIF9tdWx0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAqPSB0LCB0aGlzLnkgKj0gdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfZGl2OiBmdW5jdGlvbiBfZGl2KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCAvPSB0LCB0aGlzLnkgLz0gdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfbXVsdEJ5UG9pbnQ6IGZ1bmN0aW9uIF9tdWx0QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggKj0gdC54LCB0aGlzLnkgKj0gdC55LCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9kaXZCeVBvaW50OiBmdW5jdGlvbiBfZGl2QnlQb2ludCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggLz0gdC54LCB0aGlzLnkgLz0gdC55LCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF91bml0OiBmdW5jdGlvbiBfdW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcGVycDogZnVuY3Rpb24gX3BlcnAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy55O1xuICAgICAgICByZXR1cm4gdGhpcy55ID0gdGhpcy54LCB0aGlzLnggPSAtdCwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcm90YXRlOiBmdW5jdGlvbiBfcm90YXRlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBNYXRoLmNvcyh0KSxcbiAgICAgICAgICAgIHIgPSBNYXRoLnNpbih0KSxcbiAgICAgICAgICAgIG4gPSByICogdGhpcy54ICsgZSAqIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGUgKiB0aGlzLnggLSByICogdGhpcy55LCB0aGlzLnkgPSBuLCB0aGlzO1xuICAgICAgfSxcbiAgICAgIF9yb3RhdGVBcm91bmQ6IGZ1bmN0aW9uIF9yb3RhdGVBcm91bmQodCwgZSkge1xuICAgICAgICB2YXIgciA9IE1hdGguY29zKHQpLFxuICAgICAgICAgICAgbiA9IE1hdGguc2luKHQpLFxuICAgICAgICAgICAgaSA9IGUueSArIG4gKiAodGhpcy54IC0gZS54KSArIHIgKiAodGhpcy55IC0gZS55KTtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGUueCArIHIgKiAodGhpcy54IC0gZS54KSAtIG4gKiAodGhpcy55IC0gZS55KSwgdGhpcy55ID0gaSwgdGhpcztcbiAgICAgIH0sXG4gICAgICBfcm91bmQ6IGZ1bmN0aW9uIF9yb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KSwgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpLCB0aGlzO1xuICAgICAgfVxuICAgIH0sIGEuY29udmVydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgPyB0IDogQXJyYXkuaXNBcnJheSh0KSA/IG5ldyBhKHRbMF0sIHRbMV0pIDogdDtcbiAgICB9O1xuICAgIHZhciBvID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiB7fSxcbiAgICAgICAgcyA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbiAgICBmdW5jdGlvbiB1KHQsIGUsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gbmV3IHIodCwgZSwgbiwgaSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGEuc29sdmUodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsID0gdSguMjUsIC4xLCAuMjUsIDEpO1xuXG4gICAgZnVuY3Rpb24gcCh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4ociwgTWF0aC5tYXgoZSwgdCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGModCwgZSwgcikge1xuICAgICAgdmFyIG4gPSByIC0gZSxcbiAgICAgICAgICBpID0gKCh0IC0gZSkgJSBuICsgbikgJSBuICsgZTtcbiAgICAgIHJldHVybiBpID09PSBlID8gciA6IGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaCh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgci0tID4gMDspIHtcbiAgICAgICAgZVtyXSA9IGFyZ3VtZW50c1tyICsgMV07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuXG4gICAgICAgIGZvciAodmFyIG8gaW4gYSkge1xuICAgICAgICAgIHRbb10gPSBhW29dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH1cblxuICAgIHZhciBmID0gMTtcblxuICAgIGZ1bmN0aW9uIHkoKSB7XG4gICAgICByZXR1cm4gZisrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGQoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gdChlKSB7XG4gICAgICAgIHJldHVybiBlID8gKGUgXiAxNiAqIE1hdGgucmFuZG9tKCkgPj4gZSAvIDQpLnRvU3RyaW5nKDE2KSA6IChbMWU3XSArIC1bMWUzXSArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIHQpO1xuICAgICAgfSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG0odCkge1xuICAgICAgcmV0dXJuICEhdCAmJiAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVs0XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaS50ZXN0KHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHYodCwgZSkge1xuICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGVbdF0gJiYgKGVbdF0gPSBlW3RdLmJpbmQoZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZyh0LCBlKSB7XG4gICAgICByZXR1cm4gLTEgIT09IHQuaW5kZXhPZihlLCB0Lmxlbmd0aCAtIGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB4KHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0ge307XG5cbiAgICAgIGZvciAodmFyIGkgaW4gdCkge1xuICAgICAgICBuW2ldID0gZS5jYWxsKHIgfHwgdGhpcywgdFtpXSwgaSwgdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGIodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiB0KSB7XG4gICAgICAgIGUuY2FsbChyIHx8IHRoaXMsIHRbaV0sIGksIHQpICYmIChuW2ldID0gdFtpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHcodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0Lm1hcCh3KSA6IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgdCA/IHgodCwgdykgOiB0O1xuICAgIH1cblxuICAgIHZhciBfID0ge307XG5cbiAgICBmdW5jdGlvbiBBKHQpIHtcbiAgICAgIF9bdF0gfHwgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNvbnNvbGUgJiYgY29uc29sZS53YXJuKHQpLCBfW3RdID0gITApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFModCwgZSwgcikge1xuICAgICAgcmV0dXJuIChyLnkgLSB0LnkpICogKGUueCAtIHQueCkgPiAoZS55IC0gdC55KSAqIChyLnggLSB0LngpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGsodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSAwLCBuID0gdC5sZW5ndGgsIGkgPSBuIC0gMSwgYSA9IHZvaWQgMCwgbyA9IHZvaWQgMDsgciA8IG47IGkgPSByKyspIHtcbiAgICAgICAgZSArPSAoKG8gPSB0W2ldKS54IC0gKGEgPSB0W3JdKS54KSAqIChhLnkgKyBvLnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJKCkge1xuICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHNlbGYgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHoodCkge1xuICAgICAgdmFyIGUgPSB7fTtcblxuICAgICAgaWYgKHQucmVwbGFjZSgvKD86XnwoPzpcXHMqXFwsXFxzKikpKFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKykoPzpcXD0oPzooW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKXwoPzpcXFwiKCg/OlteXCJcXFxcXXxcXFxcLikqKVxcXCIpKSk/L2csIGZ1bmN0aW9uICh0LCByLCBuLCBpKSB7XG4gICAgICAgIHZhciBhID0gbiB8fCBpO1xuICAgICAgICByZXR1cm4gZVtyXSA9ICFhIHx8IGEudG9Mb3dlckNhc2UoKSwgXCJcIjtcbiAgICAgIH0pLCBlW1wibWF4LWFnZVwiXSkge1xuICAgICAgICB2YXIgciA9IHBhcnNlSW50KGVbXCJtYXgtYWdlXCJdLCAxMCk7XG4gICAgICAgIGlzTmFOKHIpID8gZGVsZXRlIGVbXCJtYXgtYWdlXCJdIDogZVtcIm1heC1hZ2VcIl0gPSByO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICB2YXIgQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBFKHQpIHtcbiAgICAgIGlmIChudWxsID09IEMpIHtcbiAgICAgICAgdmFyIGUgPSB0Lm5hdmlnYXRvciA/IHQubmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgICAgIEMgPSAhIXQuc2FmYXJpIHx8ICEoIWUgfHwgISgvXFxiKGlQYWR8aVBob25lfGlQb2QpXFxiLy50ZXN0KGUpIHx8IGUubWF0Y2goXCJTYWZhcmlcIikgJiYgIWUubWF0Y2goXCJDaHJvbWVcIikpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUCh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZSA9IG9bdF07XG4gICAgICAgIHJldHVybiBlLnNldEl0ZW0oXCJfbWFwYm94X3Rlc3RfXCIsIDEpLCBlLnJlbW92ZUl0ZW0oXCJfbWFwYm94X3Rlc3RfXCIpLCAhMDtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBNLFxuICAgICAgICBCLFxuICAgICAgICBULFxuICAgICAgICBWLFxuICAgICAgICBGID0gby5wZXJmb3JtYW5jZSAmJiBvLnBlcmZvcm1hbmNlLm5vdyA/IG8ucGVyZm9ybWFuY2Uubm93LmJpbmQoby5wZXJmb3JtYW5jZSkgOiBEYXRlLm5vdy5iaW5kKERhdGUpLFxuICAgICAgICBEID0gby5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgby5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgICAgTCA9IG8uY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgby5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBvLndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IG8ubXNDYW5jZWxBbmltYXRpb25GcmFtZSxcbiAgICAgICAgUiA9IHtcbiAgICAgIG5vdzogRixcbiAgICAgIGZyYW1lOiBmdW5jdGlvbiBmcmFtZSh0KSB7XG4gICAgICAgIHZhciBlID0gRCh0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHJldHVybiBMKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBnZXRJbWFnZURhdGE6IGZ1bmN0aW9uIGdldEltYWdlRGF0YSh0LCBlKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApO1xuICAgICAgICB2YXIgciA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxcbiAgICAgICAgICAgIG4gPSByLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyAyZCBjb250ZXh0XCIpO1xuICAgICAgICByZXR1cm4gci53aWR0aCA9IHQud2lkdGgsIHIuaGVpZ2h0ID0gdC5oZWlnaHQsIG4uZHJhd0ltYWdlKHQsIDAsIDAsIHQud2lkdGgsIHQuaGVpZ2h0KSwgbi5nZXRJbWFnZURhdGEoLWUsIC1lLCB0LndpZHRoICsgMiAqIGUsIHQuaGVpZ2h0ICsgMiAqIGUpO1xuICAgICAgfSxcbiAgICAgIHJlc29sdmVVUkw6IGZ1bmN0aW9uIHJlc29sdmVVUkwodCkge1xuICAgICAgICByZXR1cm4gTSB8fCAoTSA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIikpLCBNLmhyZWYgPSB0LCBNLmhyZWY7XG4gICAgICB9LFxuICAgICAgaGFyZHdhcmVDb25jdXJyZW5jeTogby5uYXZpZ2F0b3IgJiYgby5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA0LFxuXG4gICAgICBnZXQgZGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIG8uZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBwcmVmZXJzUmVkdWNlZE1vdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhby5tYXRjaE1lZGlhICYmIChudWxsID09IEIgJiYgKEIgPSBvLm1hdGNoTWVkaWEoXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKVwiKSksIEIubWF0Y2hlcyk7XG4gICAgICB9XG5cbiAgICB9LFxuICAgICAgICBPID0ge1xuICAgICAgQVBJX1VSTDogXCJodHRwczovL2FwaS5tYXBib3guY29tXCIsXG5cbiAgICAgIGdldCBFVkVOVFNfVVJMKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5BUElfVVJMID8gMCA9PT0gdGhpcy5BUElfVVJMLmluZGV4T2YoXCJodHRwczovL2FwaS5tYXBib3guY25cIikgPyBcImh0dHBzOi8vZXZlbnRzLm1hcGJveC5jbi9ldmVudHMvdjJcIiA6IDAgPT09IHRoaXMuQVBJX1VSTC5pbmRleE9mKFwiaHR0cHM6Ly9hcGkubWFwYm94LmNvbVwiKSA/IFwiaHR0cHM6Ly9ldmVudHMubWFwYm94LmNvbS9ldmVudHMvdjJcIiA6IG51bGwgOiBudWxsO1xuICAgICAgfSxcblxuICAgICAgRkVFREJBQ0tfVVJMOiBcImh0dHBzOi8vYXBwcy5tYXBib3guY29tL2ZlZWRiYWNrXCIsXG4gICAgICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogITAsXG4gICAgICBBQ0NFU1NfVE9LRU46IG51bGwsXG4gICAgICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IDE2LFxuICAgICAgUkVHSVNURVJFRF9QUk9UT0NPTFM6IHt9XG4gICAgfSxcbiAgICAgICAgVSA9IHtcbiAgICAgIHN1cHBvcnRlZDogITEsXG4gICAgICB0ZXN0U3VwcG9ydDogZnVuY3Rpb24gdGVzdFN1cHBvcnQodCkge1xuICAgICAgICAhaiAmJiBWICYmIChxID8gTih0KSA6IFQgPSB0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBqID0gITEsXG4gICAgICAgIHEgPSAhMTtcblxuICAgIGZ1bmN0aW9uIE4odCkge1xuICAgICAgdmFyIGUgPSB0LmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgIHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELCBlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsIDAsIHQuUkdCQSwgdC5SR0JBLCB0LlVOU0lHTkVEX0JZVEUsIFYpLCB0LmlzQ29udGV4dExvc3QoKSkgcmV0dXJuO1xuICAgICAgICBVLnN1cHBvcnRlZCA9ICEwO1xuICAgICAgfSBjYXRjaCAodCkge31cblxuICAgICAgdC5kZWxldGVUZXh0dXJlKGUpLCBqID0gITA7XG4gICAgfVxuXG4gICAgby5kb2N1bWVudCAmJiAoKFYgPSBvLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIFQgJiYgTihUKSwgVCA9IG51bGwsIHEgPSAhMDtcbiAgICB9LCBWLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBqID0gITAsIFQgPSBudWxsO1xuICAgIH0sIFYuc3JjID0gXCJkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT1cIik7XG5cbiAgICB2YXIgSyA9IFwiMDFcIixcbiAgICAgICAgRyA9IGZ1bmN0aW9uIEcodCwgZSkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuID0gdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gPSBlLCB0aGlzLl9jcmVhdGVTa3VUb2tlbigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBaKHQpIHtcbiAgICAgIHJldHVybiAwID09PSB0LmluZGV4T2YoXCJtYXBib3g6XCIpO1xuICAgIH1cblxuICAgIEcucHJvdG90eXBlLl9jcmVhdGVTa3VUb2tlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciB0ID0gXCJcIiwgZSA9IDA7IGUgPCAxMDsgZSsrKSB7XG4gICAgICAgICAgdCArPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCJbTWF0aC5mbG9vcig2MiAqIE1hdGgucmFuZG9tKCkpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IFtcIjFcIiwgSywgdF0uam9pbihcIlwiKSxcbiAgICAgICAgICB0b2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDQzMmU1XG4gICAgICAgIH07XG4gICAgICB9KCk7XG5cbiAgICAgIHRoaXMuX3NrdVRva2VuID0gdC50b2tlbiwgdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQgPSB0LnRva2VuRXhwaXJlc0F0O1xuICAgIH0sIEcucHJvdG90eXBlLl9pc1NrdVRva2VuRXhwaXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XG4gICAgfSwgRy5wcm90b3R5cGUudHJhbnNmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuICYmIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbih0LCBlKSB8fCB7XG4gICAgICAgIHVybDogdFxuICAgICAgfTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVTdHlsZVVSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgcmV0dXJuIHIucGF0aCA9IFwiL3N0eWxlcy92MVwiICsgci5wYXRoLCB0aGlzLl9tYWtlQVBJVVJMKHIsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGUpO1xuICAgIH0sIEcucHJvdG90eXBlLm5vcm1hbGl6ZUdseXBoc1VSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgcmV0dXJuIHIucGF0aCA9IFwiL2ZvbnRzL3YxXCIgKyByLnBhdGgsIHRoaXMuX21ha2VBUElVUkwociwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgZSk7XG4gICAgfSwgRy5wcm90b3R5cGUubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICghWih0KSkgcmV0dXJuIHQ7XG4gICAgICB2YXIgciA9IFkodCk7XG4gICAgICByZXR1cm4gci5wYXRoID0gXCIvdjQvXCIgKyByLmF1dGhvcml0eSArIFwiLmpzb25cIiwgci5wYXJhbXMucHVzaChcInNlY3VyZVwiKSwgdGhpcy5fbWFrZUFQSVVSTChyLCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBlKTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVTcHJpdGVVUkwgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBZKHQpO1xuICAgICAgcmV0dXJuIFoodCkgPyAoaS5wYXRoID0gXCIvc3R5bGVzL3YxXCIgKyBpLnBhdGggKyBcIi9zcHJpdGVcIiArIGUgKyByLCB0aGlzLl9tYWtlQVBJVVJMKGksIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IG4pKSA6IChpLnBhdGggKz0gXCJcIiArIGUgKyByLCAkKGkpKTtcbiAgICB9LCBHLnByb3RvdHlwZS5ub3JtYWxpemVUaWxlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0aGlzLl9pc1NrdVRva2VuRXhwaXJlZCgpICYmIHRoaXMuX2NyZWF0ZVNrdVRva2VuKCksIHQgJiYgIVoodCkpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSBZKHQpO1xuICAgICAgci5wYXRoID0gci5wYXRoLnJlcGxhY2UoLyhcXC4ocG5nfGpwZylcXGQqKSg/PSQpLywgKFIuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IDUxMiA9PT0gZSA/IFwiQDJ4XCIgOiBcIlwiKSArIChVLnN1cHBvcnRlZCA/IFwiLndlYnBcIiA6IFwiJDFcIikpLCByLnBhdGggPSByLnBhdGgucmVwbGFjZSgvXi4rXFwvdjRcXC8vLCBcIi9cIiksIHIucGF0aCA9IFwiL3Y0XCIgKyByLnBhdGg7XG5cbiAgICAgIHZhciBuID0gdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0OyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgIHZhciBuID0gcltlXS5tYXRjaCgvXmFjY2Vzc190b2tlbj0oLiopJC8pO1xuICAgICAgICAgIGlmIChuKSByZXR1cm4gblsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfShyLnBhcmFtcykgfHwgTy5BQ0NFU1NfVE9LRU47XG5cbiAgICAgIHJldHVybiBPLlJFUVVJUkVfQUNDRVNTX1RPS0VOICYmIG4gJiYgdGhpcy5fc2t1VG9rZW4gJiYgci5wYXJhbXMucHVzaChcInNrdT1cIiArIHRoaXMuX3NrdVRva2VuKSwgdGhpcy5fbWFrZUFQSVVSTChyLCBuKTtcbiAgICB9LCBHLnByb3RvdHlwZS5jYW5vbmljYWxpemVUaWxlVVJMID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gWSh0KTtcbiAgICAgIGlmICghci5wYXRoLm1hdGNoKC8oXlxcL3Y0XFwvKS8pIHx8ICFyLnBhdGgubWF0Y2goL1xcLltcXHddKyQvKSkgcmV0dXJuIHQ7XG4gICAgICB2YXIgbiA9IFwibWFwYm94Oi8vdGlsZXMvXCI7XG4gICAgICBuICs9IHIucGF0aC5yZXBsYWNlKFwiL3Y0L1wiLCBcIlwiKTtcbiAgICAgIHZhciBpID0gci5wYXJhbXM7XG4gICAgICByZXR1cm4gZSAmJiAoaSA9IGkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAhdC5tYXRjaCgvXmFjY2Vzc190b2tlbj0vKTtcbiAgICAgIH0pKSwgaS5sZW5ndGggJiYgKG4gKz0gXCI/XCIgKyBpLmpvaW4oXCImXCIpKSwgbjtcbiAgICB9LCBHLnByb3RvdHlwZS5jYW5vbmljYWxpemVUaWxlc2V0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAhIWUgJiYgWihlKSwgbiA9IFtdLCBpID0gMCwgYSA9IHQudGlsZXMgfHwgW107IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXTtcbiAgICAgICAgSihvKSA/IG4ucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZVRpbGVVUkwobywgcikpIDogbi5wdXNoKG8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9LCBHLnByb3RvdHlwZS5fbWFrZUFQSVVSTCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IFwiU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blc1wiLFxuICAgICAgICAgIG4gPSBZKE8uQVBJX1VSTCk7XG5cbiAgICAgIGlmICh0LnByb3RvY29sID0gbi5wcm90b2NvbCwgdC5hdXRob3JpdHkgPSBuLmF1dGhvcml0eSwgXCJodHRwXCIgPT09IHQucHJvdG9jb2wpIHtcbiAgICAgICAgdmFyIGkgPSB0LnBhcmFtcy5pbmRleE9mKFwic2VjdXJlXCIpO1xuICAgICAgICBpID49IDAgJiYgdC5wYXJhbXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCIvXCIgIT09IG4ucGF0aCAmJiAodC5wYXRoID0gXCJcIiArIG4ucGF0aCArIHQucGF0aCksICFPLlJFUVVJUkVfQUNDRVNTX1RPS0VOKSByZXR1cm4gJCh0KTtcbiAgICAgIGlmICghKGUgPSBlIHx8IE8uQUNDRVNTX1RPS0VOKSkgdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBcIiArIHIpO1xuICAgICAgaWYgKFwic1wiID09PSBlWzBdKSB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgYSBwdWJsaWMgYWNjZXNzIHRva2VuIChway4qKSB3aXRoIE1hcGJveCBHTCwgbm90IGEgc2VjcmV0IGFjY2VzcyB0b2tlbiAoc2suKikuIFwiICsgcik7XG4gICAgICByZXR1cm4gdC5wYXJhbXMgPSB0LnBhcmFtcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIC0xID09PSB0LmluZGV4T2YoXCJhY2Nlc3NfdG9rZW5cIik7XG4gICAgICB9KSwgdC5wYXJhbXMucHVzaChcImFjY2Vzc190b2tlbj1cIiArIGUpLCAkKHQpO1xuICAgIH0sIEcucHJvdG90eXBlLnNldFRyYW5zZm9ybVJlcXVlc3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuID0gdDtcbiAgICB9O1xuICAgIHZhciBYID0gL14oKGh0dHBzPzopP1xcL1xcLyk/KFteXFwvXStcXC4pP21hcGJveFxcLmMobnxvbSkoXFwvfFxcP3wkKS9pO1xuXG4gICAgZnVuY3Rpb24gSih0KSB7XG4gICAgICByZXR1cm4gWC50ZXN0KHQpO1xuICAgIH1cblxuICAgIHZhciBIID0gL14oXFx3Kyk6XFwvXFwvKFteLz9dKikoXFwvW14/XSspP1xcPz8oLispPy87XG5cbiAgICBmdW5jdGlvbiBZKHQpIHtcbiAgICAgIHZhciBlID0gdC5tYXRjaChIKTtcbiAgICAgIGlmICghZSkgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFVSTCBvYmplY3RcIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbDogZVsxXSxcbiAgICAgICAgYXV0aG9yaXR5OiBlWzJdLFxuICAgICAgICBwYXRoOiBlWzNdIHx8IFwiL1wiLFxuICAgICAgICBwYXJhbXM6IGVbNF0gPyBlWzRdLnNwbGl0KFwiJlwiKSA6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQodCkge1xuICAgICAgdmFyIGUgPSB0LnBhcmFtcy5sZW5ndGggPyBcIj9cIiArIHQucGFyYW1zLmpvaW4oXCImXCIpIDogXCJcIjtcbiAgICAgIHJldHVybiB0LnByb3RvY29sICsgXCI6Ly9cIiArIHQuYXV0aG9yaXR5ICsgdC5wYXRoICsgZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXKHQpIHtcbiAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZSA9IHQuc3BsaXQoXCIuXCIpO1xuICAgICAgaWYgKCFlIHx8IDMgIT09IGUubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KG8uYXRvYihlWzFdKS5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCIlXCIgKyAoXCIwMFwiICsgdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO1xuICAgICAgICB9KS5qb2luKFwiXCIpKSk7XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBRID0gZnVuY3Rpb24gUSh0KSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmFub25JZCA9IG51bGwsIHRoaXMuZXZlbnREYXRhID0ge30sIHRoaXMucXVldWUgPSBbXSwgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIFEucHJvdG90eXBlLmdldFN0b3JhZ2VLZXkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUsXG4gICAgICAgICAgciA9IFcoTy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgcmV0dXJuIGUgPSByICYmIHIudSA/IG8uYnRvYShlbmNvZGVVUklDb21wb25lbnQoci51KS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShOdW1iZXIoXCIweFwiICsgZSkpO1xuICAgICAgfSkpIDogTy5BQ0NFU1NfVE9LRU4gfHwgXCJcIiwgdCA/IFwibWFwYm94LmV2ZW50RGF0YS5cIiArIHQgKyBcIjpcIiArIGUgOiBcIm1hcGJveC5ldmVudERhdGE6XCIgKyBlO1xuICAgIH0sIFEucHJvdG90eXBlLmZldGNoRXZlbnREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBQKFwibG9jYWxTdG9yYWdlXCIpLFxuICAgICAgICAgIGUgPSB0aGlzLmdldFN0b3JhZ2VLZXkoKSxcbiAgICAgICAgICByID0gdGhpcy5nZXRTdG9yYWdlS2V5KFwidXVpZFwiKTtcbiAgICAgIGlmICh0KSB0cnkge1xuICAgICAgICB2YXIgbiA9IG8ubG9jYWxTdG9yYWdlLmdldEl0ZW0oZSk7XG4gICAgICAgIG4gJiYgKHRoaXMuZXZlbnREYXRhID0gSlNPTi5wYXJzZShuKSk7XG4gICAgICAgIHZhciBpID0gby5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShyKTtcbiAgICAgICAgaSAmJiAodGhpcy5hbm9uSWQgPSBpKTtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgQShcIlVuYWJsZSB0byByZWFkIGZyb20gTG9jYWxTdG9yYWdlXCIpO1xuICAgICAgfVxuICAgIH0sIFEucHJvdG90eXBlLnNhdmVFdmVudERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFAoXCJsb2NhbFN0b3JhZ2VcIiksXG4gICAgICAgICAgZSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpLFxuICAgICAgICAgIHIgPSB0aGlzLmdldFN0b3JhZ2VLZXkoXCJ1dWlkXCIpO1xuICAgICAgaWYgKHQpIHRyeSB7XG4gICAgICAgIG8ubG9jYWxTdG9yYWdlLnNldEl0ZW0ociwgdGhpcy5hbm9uSWQpLCBPYmplY3Qua2V5cyh0aGlzLmV2ZW50RGF0YSkubGVuZ3RoID49IDEgJiYgby5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmV2ZW50RGF0YSkpO1xuICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICBBKFwiVW5hYmxlIHRvIHdyaXRlIHRvIExvY2FsU3RvcmFnZVwiKTtcbiAgICAgIH1cbiAgICB9LCBRLnByb3RvdHlwZS5wcm9jZXNzUmVxdWVzdHMgPSBmdW5jdGlvbiAodCkge30sIFEucHJvdG90eXBlLnBvc3RFdmVudCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IHRoaXM7XG5cbiAgICAgIGlmIChPLkVWRU5UU19VUkwpIHtcbiAgICAgICAgdmFyIGEgPSBZKE8uRVZFTlRTX1VSTCk7XG4gICAgICAgIGEucGFyYW1zLnB1c2goXCJhY2Nlc3NfdG9rZW49XCIgKyAobiB8fCBPLkFDQ0VTU19UT0tFTiB8fCBcIlwiKSk7XG4gICAgICAgIHZhciBvID0ge1xuICAgICAgICAgIGV2ZW50OiB0aGlzLnR5cGUsXG4gICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUodCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBzZGtJZGVudGlmaWVyOiBcIm1hcGJveC1nbC1qc1wiLFxuICAgICAgICAgIHNka1ZlcnNpb246IFwiMS4xNS4wXCIsXG4gICAgICAgICAgc2t1SWQ6IEssXG4gICAgICAgICAgdXNlcklkOiB0aGlzLmFub25JZFxuICAgICAgICB9LFxuICAgICAgICAgICAgcyA9IGUgPyBoKG8sIGUpIDogbyxcbiAgICAgICAgICAgIHUgPSB7XG4gICAgICAgICAgdXJsOiAkKGEpLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShbc10pXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBfdCh1LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGkucGVuZGluZ1JlcXVlc3QgPSBudWxsLCByKHQpLCBpLnNhdmVFdmVudERhdGEoKSwgaS5wcm9jZXNzUmVxdWVzdHMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFEucHJvdG90eXBlLnF1ZXVlUmVxdWVzdCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2godCksIHRoaXMucHJvY2Vzc1JlcXVlc3RzKGUpO1xuICAgIH07XG5cbiAgICB2YXIgdHQsXG4gICAgICAgIGV0LFxuICAgICAgICBydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmNhbGwodGhpcywgXCJtYXAubG9hZFwiKSwgdGhpcy5zdWNjZXNzID0ge30sIHRoaXMuc2t1VG9rZW4gPSBcIlwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5wb3N0TWFwTG9hZEV2ZW50ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9IHIsIChPLkVWRU5UU19VUkwgJiYgbiB8fCBPLkFDQ0VTU19UT0tFTiAmJiBBcnJheS5pc0FycmF5KHQpICYmIHQuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBaKHQpIHx8IEoodCk7XG4gICAgICAgIH0pKSAmJiB0aGlzLnF1ZXVlUmVxdWVzdCh7XG4gICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH0sIG4pO1xuICAgICAgfSwgZS5wcm90b3R5cGUucHJvY2Vzc1JlcXVlc3RzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuXG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nUmVxdWVzdCAmJiAwICE9PSB0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHZhciByID0gdGhpcy5xdWV1ZS5zaGlmdCgpLFxuICAgICAgICAgICAgICBuID0gci5pZCxcbiAgICAgICAgICAgICAgaSA9IHIudGltZXN0YW1wO1xuICAgICAgICAgIG4gJiYgdGhpcy5zdWNjZXNzW25dIHx8ICh0aGlzLmFub25JZCB8fCB0aGlzLmZldGNoRXZlbnREYXRhKCksIG0odGhpcy5hbm9uSWQpIHx8ICh0aGlzLmFub25JZCA9IGQoKSksIHRoaXMucG9zdEV2ZW50KGksIHtcbiAgICAgICAgICAgIHNrdVRva2VuOiB0aGlzLnNrdVRva2VuXG4gICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHQgfHwgbiAmJiAoZS5zdWNjZXNzW25dID0gITApO1xuICAgICAgICAgIH0sIHQpKTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KFEpLFxuICAgICAgICBudCA9IG5ldyAoZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgXCJhcHBVc2VyVHVybnN0aWxlXCIpLCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiA9IGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnBvc3RUdXJuc3RpbGVFdmVudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIE8uRVZFTlRTX1VSTCAmJiBPLkFDQ0VTU19UT0tFTiAmJiBBcnJheS5pc0FycmF5KHQpICYmIHQuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBaKHQpIHx8IEoodCk7XG4gICAgICAgIH0pICYmIHRoaXMucXVldWVSZXF1ZXN0KERhdGUubm93KCksIGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucHJvY2Vzc1JlcXVlc3RzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuXG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nUmVxdWVzdCAmJiAwICE9PSB0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYW5vbklkICYmIHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzICYmIHRoaXMuZXZlbnREYXRhLnRva2VuVSB8fCB0aGlzLmZldGNoRXZlbnREYXRhKCk7XG4gICAgICAgICAgdmFyIHIgPSBXKE8uQUNDRVNTX1RPS0VOKSxcbiAgICAgICAgICAgICAgbiA9IHIgPyByLnUgOiBPLkFDQ0VTU19UT0tFTixcbiAgICAgICAgICAgICAgaSA9IG4gIT09IHRoaXMuZXZlbnREYXRhLnRva2VuVTtcbiAgICAgICAgICBtKHRoaXMuYW5vbklkKSB8fCAodGhpcy5hbm9uSWQgPSBkKCksIGkgPSAhMCk7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHZhciBvID0gbmV3IERhdGUodGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpLFxuICAgICAgICAgICAgICAgIHMgPSBuZXcgRGF0ZShhKSxcbiAgICAgICAgICAgICAgICB1ID0gKGEgLSB0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcykgLyA4NjRlNTtcbiAgICAgICAgICAgIGkgPSBpIHx8IHUgPj0gMSB8fCB1IDwgLTEgfHwgby5nZXREYXRlKCkgIT09IHMuZ2V0RGF0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpID0gITA7XG5cbiAgICAgICAgICBpZiAoIWkpIHJldHVybiB0aGlzLnByb2Nlc3NSZXF1ZXN0cygpO1xuICAgICAgICAgIHRoaXMucG9zdEV2ZW50KGEsIHtcbiAgICAgICAgICAgIFwiZW5hYmxlZC50ZWxlbWV0cnlcIjogITFcbiAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdCB8fCAoZS5ldmVudERhdGEubGFzdFN1Y2Nlc3MgPSBhLCBlLmV2ZW50RGF0YS50b2tlblUgPSBuKTtcbiAgICAgICAgICB9LCB0KTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KFEpKSgpLFxuICAgICAgICBpdCA9IG50LnBvc3RUdXJuc3RpbGVFdmVudC5iaW5kKG50KSxcbiAgICAgICAgYXQgPSBuZXcgcnQoKSxcbiAgICAgICAgb3QgPSBhdC5wb3N0TWFwTG9hZEV2ZW50LmJpbmQoYXQpLFxuICAgICAgICBzdCA9IDUwMCxcbiAgICAgICAgdXQgPSA1MDtcblxuICAgIGZ1bmN0aW9uIGx0KCkge1xuICAgICAgby5jYWNoZXMgJiYgIXR0ICYmICh0dCA9IG8uY2FjaGVzLm9wZW4oXCJtYXBib3gtdGlsZXNcIikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB0KHQpIHtcbiAgICAgIHZhciBlID0gdC5pbmRleE9mKFwiP1wiKTtcbiAgICAgIHJldHVybiBlIDwgMCA/IHQgOiB0LnNsaWNlKDAsIGUpO1xuICAgIH1cblxuICAgIHZhciBjdCxcbiAgICAgICAgaHQgPSAxIC8gMDtcblxuICAgIGZ1bmN0aW9uIGZ0KCkge1xuICAgICAgcmV0dXJuIG51bGwgPT0gY3QgJiYgKGN0ID0gby5PZmZzY3JlZW5DYW52YXMgJiYgbmV3IG8uT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoXCIyZFwiKSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIG8uY3JlYXRlSW1hZ2VCaXRtYXApLCBjdDtcbiAgICB9XG5cbiAgICB2YXIgeXQgPSB7XG4gICAgICBVbmtub3duOiBcIlVua25vd25cIixcbiAgICAgIFN0eWxlOiBcIlN0eWxlXCIsXG4gICAgICBTb3VyY2U6IFwiU291cmNlXCIsXG4gICAgICBUaWxlOiBcIlRpbGVcIixcbiAgICAgIEdseXBoczogXCJHbHlwaHNcIixcbiAgICAgIFNwcml0ZUltYWdlOiBcIlNwcml0ZUltYWdlXCIsXG4gICAgICBTcHJpdGVKU09OOiBcIlNwcml0ZUpTT05cIixcbiAgICAgIEltYWdlOiBcIkltYWdlXCJcbiAgICB9O1xuICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHl0KTtcblxuICAgIHZhciBkdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIsIG4pIHtcbiAgICAgICAgNDAxID09PSByICYmIEoobikgJiYgKGUgKz0gXCI6IHlvdSBtYXkgaGF2ZSBwcm92aWRlZCBhbiBpbnZhbGlkIE1hcGJveCBhY2Nlc3MgdG9rZW4uIFNlZSBodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uLyNhY2Nlc3MtdG9rZW5zLWFuZC10b2tlbi1zY29wZXNcIiksIHQuY2FsbCh0aGlzLCBlKSwgdGhpcy5zdGF0dXMgPSByLCB0aGlzLnVybCA9IG4sIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSwgdGhpcy5tZXNzYWdlID0gZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIjogXCIgKyB0aGlzLm1lc3NhZ2UgKyBcIiAoXCIgKyB0aGlzLnN0YXR1cyArIFwiKTogXCIgKyB0aGlzLnVybDtcbiAgICAgIH0sIGU7XG4gICAgfShFcnJvciksXG4gICAgICAgIG10ID0gSSgpID8gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYud29ya2VyICYmIHNlbGYud29ya2VyLnJlZmVycmVyO1xuICAgIH0gOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKFwiYmxvYjpcIiA9PT0gby5sb2NhdGlvbi5wcm90b2NvbCA/IG8ucGFyZW50IDogbykubG9jYXRpb24uaHJlZjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdnQodCwgZSkge1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgbiA9IG5ldyBvLkFib3J0Q29udHJvbGxlcigpLFxuICAgICAgICAgIGkgPSBuZXcgby5SZXF1ZXN0KHQudXJsLCB7XG4gICAgICAgIG1ldGhvZDogdC5tZXRob2QgfHwgXCJHRVRcIixcbiAgICAgICAgYm9keTogdC5ib2R5LFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyxcbiAgICAgICAgaGVhZGVyczogdC5oZWFkZXJzLFxuICAgICAgICByZWZlcnJlcjogbXQoKSxcbiAgICAgICAgc2lnbmFsOiBuLnNpZ25hbFxuICAgICAgfSksXG4gICAgICAgICAgYSA9ICExLFxuICAgICAgICAgIHMgPSAhMSxcbiAgICAgICAgICB1ID0gKHIgPSBpLnVybCkuaW5kZXhPZihcInNrdT1cIikgPiAwICYmIEoocik7XG4gICAgICBcImpzb25cIiA9PT0gdC50eXBlICYmIGkuaGVhZGVycy5zZXQoXCJBY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICB2YXIgbCA9IGZ1bmN0aW9uIGwociwgbiwgYSkge1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICBpZiAociAmJiBcIlNlY3VyaXR5RXJyb3JcIiAhPT0gci5tZXNzYWdlICYmIEEociksIG4gJiYgYSkgcmV0dXJuIHAobik7XG4gICAgICAgICAgdmFyIGwgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIG8uZmV0Y2goaSkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgaWYgKHIub2spIHtcbiAgICAgICAgICAgICAgdmFyIG4gPSB1ID8gci5jbG9uZSgpIDogbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHAociwgbiwgbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlKG5ldyBkdChyLnN0YXR1c1RleHQsIHIuc3RhdHVzLCB0LnVybCkpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAyMCAhPT0gdC5jb2RlICYmIGUobmV3IEVycm9yKHQubWVzc2FnZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgICAgIHAgPSBmdW5jdGlvbiBwKHIsIG4sIHUpIHtcbiAgICAgICAgKFwiYXJyYXlCdWZmZXJcIiA9PT0gdC50eXBlID8gci5hcnJheUJ1ZmZlcigpIDogXCJqc29uXCIgPT09IHQudHlwZSA/IHIuanNvbigpIDogci50ZXh0KCkpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBzIHx8IChuICYmIHUgJiYgZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICAgIGlmIChsdCgpLCB0dCkge1xuICAgICAgICAgICAgICB2YXIgbiA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGUuc3RhdHVzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGUuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgby5IZWFkZXJzKClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZS5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5oZWFkZXJzLnNldChlLCB0KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZhciBpID0geihlLmhlYWRlcnMuZ2V0KFwiQ2FjaGUtQ29udHJvbFwiKSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgaVtcIm5vLXN0b3JlXCJdIHx8IChpW1wibWF4LWFnZVwiXSAmJiBuLmhlYWRlcnMuc2V0KFwiRXhwaXJlc1wiLCBuZXcgRGF0ZShyICsgMWUzICogaVtcIm1heC1hZ2VcIl0pLnRvVVRDU3RyaW5nKCkpLCBuZXcgRGF0ZShuLmhlYWRlcnMuZ2V0KFwiRXhwaXJlc1wiKSkuZ2V0VGltZSgpIC0gciA8IDQyZTQgfHwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBldCkgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZShuZXcgUmVhZGFibGVTdHJlYW0oKSksIGV0ID0gITA7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgZXQgPSAhMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXQgPyBlKHQuYm9keSkgOiB0LmJsb2IoKS50aGVuKGUpO1xuICAgICAgICAgICAgICB9KGUsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgby5SZXNwb25zZShlLCBuKTtcbiAgICAgICAgICAgICAgICBsdCgpLCB0dCAmJiB0dC50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZS5wdXQocHQodC51cmwpLCByKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIEEodC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0oaSwgbiwgdSksIGEgPSAhMCwgZShudWxsLCB0LCByLmhlYWRlcnMuZ2V0KFwiQ2FjaGUtQ29udHJvbFwiKSwgci5oZWFkZXJzLmdldChcIkV4cGlyZXNcIikpKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBzIHx8IGUobmV3IEVycm9yKHQubWVzc2FnZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB1ID8gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKGx0KCksICF0dCkgcmV0dXJuIGUobnVsbCk7XG4gICAgICAgIHZhciByID0gcHQodC51cmwpO1xuICAgICAgICB0dC50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdC5tYXRjaChyKS50aGVuKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBEYXRlKHQuaGVhZGVycy5nZXQoXCJFeHBpcmVzXCIpIHx8IDApLFxuICAgICAgICAgICAgICAgICAgciA9IHoodC5oZWFkZXJzLmdldChcIkNhY2hlLUNvbnRyb2xcIikgfHwgXCJcIik7XG4gICAgICAgICAgICAgIHJldHVybiBlID4gRGF0ZS5ub3coKSAmJiAhcltcIm5vLWNhY2hlXCJdO1xuICAgICAgICAgICAgfShuKTtcblxuICAgICAgICAgICAgdC5kZWxldGUociksIGkgJiYgdC5wdXQociwgbi5jbG9uZSgpKSwgZShudWxsLCBuLCBpKTtcbiAgICAgICAgICB9KS5jYXRjaChlKTtcbiAgICAgICAgfSkuY2F0Y2goZSk7XG4gICAgICB9KGksIGwpIDogbChudWxsLCBudWxsKSwge1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICBzID0gITAsIGEgfHwgbi5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBndCxcbiAgICAgICAgeHQsXG4gICAgICAgIGJ0ID0gZnVuY3Rpb24gYnQodCwgZSkge1xuICAgICAgaWYgKC86XFwvXFwvLy50ZXN0KHQudXJsKSAmJiAhL15odHRwcz86fF5maWxlOi8udGVzdCh0LnVybCkpIHtcbiAgICAgICAgaWYgKEkoKSAmJiBzZWxmLndvcmtlciAmJiBzZWxmLndvcmtlci5hY3RvcikgcmV0dXJuIHNlbGYud29ya2VyLmFjdG9yLnNlbmQoXCJnZXRSZXNvdXJjZVwiLCB0LCBlKTtcblxuICAgICAgICBpZiAoIUkoKSkge1xuICAgICAgICAgIHZhciByID0gdC51cmwuc3Vic3RyaW5nKDAsIHQudXJsLmluZGV4T2YoXCI6Ly9cIikpO1xuICAgICAgICAgIHJldHVybiAoTy5SRUdJU1RFUkVEX1BST1RPQ09MU1tyXSB8fCB2dCkodCwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCEoL15maWxlOi8udGVzdChuID0gdC51cmwpIHx8IC9eZmlsZTovLnRlc3QobXQoKSkgJiYgIS9eXFx3KzovLnRlc3QobikpKSB7XG4gICAgICAgIGlmIChvLmZldGNoICYmIG8uUmVxdWVzdCAmJiBvLkFib3J0Q29udHJvbGxlciAmJiBvLlJlcXVlc3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwic2lnbmFsXCIpKSByZXR1cm4gdnQodCwgZSk7XG4gICAgICAgIGlmIChJKCkgJiYgc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIuYWN0b3IpIHJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kKFwiZ2V0UmVzb3VyY2VcIiwgdCwgZSwgdm9pZCAwLCAhMCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gbmV3IG8uWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICBmb3IgKHZhciBuIGluIHIub3Blbih0Lm1ldGhvZCB8fCBcIkdFVFwiLCB0LnVybCwgITApLCBcImFycmF5QnVmZmVyXCIgPT09IHQudHlwZSAmJiAoci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCIpLCB0LmhlYWRlcnMpIHtcbiAgICAgICAgICByLnNldFJlcXVlc3RIZWFkZXIobiwgdC5oZWFkZXJzW25dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcImpzb25cIiA9PT0gdC50eXBlICYmIChyLnJlc3BvbnNlVHlwZSA9IFwidGV4dFwiLCByLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpKSwgci53aXRoQ3JlZGVudGlhbHMgPSBcImluY2x1ZGVcIiA9PT0gdC5jcmVkZW50aWFscywgci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUobmV3IEVycm9yKHIuc3RhdHVzVGV4dCkpO1xuICAgICAgICB9LCByLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoKHIuc3RhdHVzID49IDIwMCAmJiByLnN0YXR1cyA8IDMwMCB8fCAwID09PSByLnN0YXR1cykgJiYgbnVsbCAhPT0gci5yZXNwb25zZSkge1xuICAgICAgICAgICAgdmFyIG4gPSByLnJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKFwianNvblwiID09PSB0LnR5cGUpIHRyeSB7XG4gICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gZSh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGUobnVsbCwgbiwgci5nZXRSZXNwb25zZUhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiksIHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJFeHBpcmVzXCIpKTtcbiAgICAgICAgICB9IGVsc2UgZShuZXcgZHQoci5zdGF0dXNUZXh0LCByLnN0YXR1cywgdC51cmwpKTtcbiAgICAgICAgfSwgci5zZW5kKHQuYm9keSksIHtcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHJldHVybiByLmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSh0LCBlKTtcbiAgICB9LFxuICAgICAgICB3dCA9IGZ1bmN0aW9uIHd0KHQsIGUpIHtcbiAgICAgIHJldHVybiBidChoKHQsIHtcbiAgICAgICAgdHlwZTogXCJhcnJheUJ1ZmZlclwiXG4gICAgICB9KSwgZSk7XG4gICAgfSxcbiAgICAgICAgX3QgPSBmdW5jdGlvbiBfdCh0LCBlKSB7XG4gICAgICByZXR1cm4gYnQoaCh0LCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICAgIH0pLCBlKTtcbiAgICB9LFxuICAgICAgICBBdCA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQUMwbEVRVlFZVjJOZ0FBSUFBQVVBQWFyVnlGRUFBQUFBU1VWT1JLNUNZSUk9XCI7XG5cbiAgICBndCA9IFtdLCB4dCA9IDA7XG5cbiAgICB2YXIgU3QgPSBmdW5jdGlvbiBTdCh0LCBlKSB7XG4gICAgICBpZiAoVS5zdXBwb3J0ZWQgJiYgKHQuaGVhZGVycyB8fCAodC5oZWFkZXJzID0ge30pLCB0LmhlYWRlcnMuYWNjZXB0ID0gXCJpbWFnZS93ZWJwLCovKlwiKSwgeHQgPj0gTy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMpIHtcbiAgICAgICAgdmFyIHIgPSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHQsXG4gICAgICAgICAgY2FsbGJhY2s6IGUsXG4gICAgICAgICAgY2FuY2VsbGVkOiAhMSxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsbGVkID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZ3QucHVzaChyKSwgcjtcbiAgICAgIH1cblxuICAgICAgeHQrKztcblxuICAgICAgdmFyIG4gPSAhMSxcbiAgICAgICAgICBpID0gZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgaWYgKCFuKSBmb3IgKG4gPSAhMCwgeHQtLTsgZ3QubGVuZ3RoICYmIHh0IDwgTy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM7KSB7XG4gICAgICAgICAgdmFyIHQgPSBndC5zaGlmdCgpO1xuICAgICAgICAgIHQuY2FuY2VsbGVkIHx8ICh0LmNhbmNlbCA9IFN0KHQucmVxdWVzdFBhcmFtZXRlcnMsIHQuY2FsbGJhY2spLmNhbmNlbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAgICAgYSA9IHd0KHQsIGZ1bmN0aW9uICh0LCByLCBuLCBhKSB7XG4gICAgICAgIGkoKSwgdCA/IGUodCkgOiByICYmIChmdCgpID8gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IG5ldyBvLkJsb2IoW25ldyBVaW50OEFycmF5KHQpXSwge1xuICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9wbmdcIlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG8uY3JlYXRlSW1hZ2VCaXRtYXAocikudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgZShudWxsLCB0KTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgZShuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBpbWFnZSBiZWNhdXNlIG9mIFwiICsgdC5tZXNzYWdlICsgXCIuIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuXCIpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfShyLCBlKSA6IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgICAgdmFyIGkgPSBuZXcgby5JbWFnZSgpLFxuICAgICAgICAgICAgICBhID0gby5VUkw7XG4gICAgICAgICAgaS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlKG51bGwsIGkpLCBhLnJldm9rZU9iamVjdFVSTChpLnNyYyksIGkub25sb2FkID0gbnVsbCwgby5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpLnNyYyA9IEF0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgaS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGUobmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgaW1hZ2UuIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuXCIpKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBzID0gbmV3IG8uQmxvYihbbmV3IFVpbnQ4QXJyYXkodCldLCB7XG4gICAgICAgICAgICB0eXBlOiBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaS5jYWNoZUNvbnRyb2wgPSByLCBpLmV4cGlyZXMgPSBuLCBpLnNyYyA9IHQuYnl0ZUxlbmd0aCA/IGEuY3JlYXRlT2JqZWN0VVJMKHMpIDogQXQ7XG4gICAgICAgIH0ociwgZSwgbiwgYSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICAgIGEuY2FuY2VsKCksIGkoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24ga3QodCwgZSwgcikge1xuICAgICAgclt0XSAmJiAtMSAhPT0gclt0XS5pbmRleE9mKGUpIHx8IChyW3RdID0gclt0XSB8fCBbXSwgclt0XS5wdXNoKGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJdCh0LCBlLCByKSB7XG4gICAgICBpZiAociAmJiByW3RdKSB7XG4gICAgICAgIHZhciBuID0gclt0XS5pbmRleE9mKGUpO1xuICAgICAgICAtMSAhPT0gbiAmJiByW3RdLnNwbGljZShuLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgenQgPSBmdW5jdGlvbiB6dCh0LCBlKSB7XG4gICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSB7fSksIGgodGhpcywgZSksIHRoaXMudHlwZSA9IHQ7XG4gICAgfSxcbiAgICAgICAgQ3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgdC5jYWxsKHRoaXMsIFwiZXJyb3JcIiwgaCh7XG4gICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgfSwgcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlO1xuICAgIH0oenQpLFxuICAgICAgICBFdCA9IGZ1bmN0aW9uIEV0KCkge307XG5cbiAgICBFdC5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fSwga3QodCwgZSwgdGhpcy5fbGlzdGVuZXJzKSwgdGhpcztcbiAgICB9LCBFdC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiBJdCh0LCBlLCB0aGlzLl9saXN0ZW5lcnMpLCBJdCh0LCBlLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKSwgdGhpcztcbiAgICB9LCBFdC5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb25lVGltZUxpc3RlbmVycyA9IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgfHwge30sIGt0KHQsIGUsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpLCB0aGlzO1xuICAgIH0sIEV0LnByb3RvdHlwZS5maXJlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgKHQgPSBuZXcgenQodCwgZSB8fCB7fSkpO1xuICAgICAgdmFyIHIgPSB0LnR5cGU7XG5cbiAgICAgIGlmICh0aGlzLmxpc3RlbnMocikpIHtcbiAgICAgICAgdC50YXJnZXQgPSB0aGlzO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gdGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1tyXSA/IHRoaXMuX2xpc3RlbmVyc1tyXS5zbGljZSgpIDogW107IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgaVtuXS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgYSA9IDAsIG8gPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbcl0gPyB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3JdLnNsaWNlKCkgOiBbXTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICB2YXIgcyA9IG9bYV07XG4gICAgICAgICAgSXQociwgcywgdGhpcy5fb25lVGltZUxpc3RlbmVycyksIHMuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1ID0gdGhpcy5fZXZlbnRlZFBhcmVudDtcbiAgICAgICAgdSAmJiAoaCh0LCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhID8gdGhpcy5fZXZlbnRlZFBhcmVudERhdGEoKSA6IHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhKSwgdS5maXJlKHQpKTtcbiAgICAgIH0gZWxzZSB0IGluc3RhbmNlb2YgQ3QgJiYgY29uc29sZS5lcnJvcih0LmVycm9yKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgRXQucHJvdG90eXBlLmxpc3RlbnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdF0gJiYgdGhpcy5fbGlzdGVuZXJzW3RdLmxlbmd0aCA+IDAgfHwgdGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3RdICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdF0ubGVuZ3RoID4gMCB8fCB0aGlzLl9ldmVudGVkUGFyZW50ICYmIHRoaXMuX2V2ZW50ZWRQYXJlbnQubGlzdGVucyh0KTtcbiAgICB9LCBFdC5wcm90b3R5cGUuc2V0RXZlbnRlZFBhcmVudCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXZlbnRlZFBhcmVudCA9IHQsIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhID0gZSwgdGhpcztcbiAgICB9O1xuXG4gICAgdmFyIFB0ID0ge1xuICAgICAgJHZlcnNpb246IDgsXG4gICAgICAkcm9vdDoge1xuICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczogWzhdXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdHlwZTogXCIqXCJcbiAgICAgICAgfSxcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiXG4gICAgICAgIH0sXG4gICAgICAgIHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXG4gICAgICAgIH0sXG4gICAgICAgIGJlYXJpbmc6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgcGVyaW9kOiAzNjAsXG4gICAgICAgICAgdW5pdHM6IFwiZGVncmVlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHBpdGNoOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIlxuICAgICAgICB9LFxuICAgICAgICBsaWdodDoge1xuICAgICAgICAgIHR5cGU6IFwibGlnaHRcIlxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwic291cmNlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHNwcml0ZToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgZ2x5cGhzOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2l0aW9uOiB7XG4gICAgICAgICAgdHlwZTogXCJ0cmFuc2l0aW9uXCJcbiAgICAgICAgfSxcbiAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJsYXllclwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VzOiB7XG4gICAgICAgIFwiKlwiOiB7XG4gICAgICAgICAgdHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlOiBbXCJzb3VyY2VfdmVjdG9yXCIsIFwic291cmNlX3Jhc3RlclwiLCBcInNvdXJjZV9yYXN0ZXJfZGVtXCIsIFwic291cmNlX2dlb2pzb25cIiwgXCJzb3VyY2VfdmlkZW9cIiwgXCJzb3VyY2VfaW1hZ2VcIl0sXG4gICAgICBzb3VyY2VfdmVjdG9yOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2ZWN0b3I6IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHRpbGVzOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgZGVmYXVsdDogWy0xODAsIC04NS4wNTExMjksIDE4MCwgODUuMDUxMTI5XVxuICAgICAgICB9LFxuICAgICAgICBzY2hlbWU6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHh5ejoge30sXG4gICAgICAgICAgICB0bXM6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInh5elwiXG4gICAgICAgIH0sXG4gICAgICAgIG1pbnpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgbWF4em9vbToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMjJcbiAgICAgICAgfSxcbiAgICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHByb21vdGVJZDoge1xuICAgICAgICAgIHR5cGU6IFwicHJvbW90ZUlkXCJcbiAgICAgICAgfSxcbiAgICAgICAgdm9sYXRpbGU6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMVxuICAgICAgICB9LFxuICAgICAgICBcIipcIjoge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VfcmFzdGVyOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICByYXN0ZXI6IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHRpbGVzOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgZGVmYXVsdDogWy0xODAsIC04NS4wNTExMjksIDE4MCwgODUuMDUxMTI5XVxuICAgICAgICB9LFxuICAgICAgICBtaW56b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwXG4gICAgICAgIH0sXG4gICAgICAgIG1heHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIyXG4gICAgICAgIH0sXG4gICAgICAgIHRpbGVTaXplOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiA1MTIsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2NoZW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB4eXo6IHt9LFxuICAgICAgICAgICAgdG1zOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ4eXpcIlxuICAgICAgICB9LFxuICAgICAgICBhdHRyaWJ1dGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgdm9sYXRpbGU6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMVxuICAgICAgICB9LFxuICAgICAgICBcIipcIjoge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VfcmFzdGVyX2RlbToge1xuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgXCJyYXN0ZXItZGVtXCI6IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHRpbGVzOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgZGVmYXVsdDogWy0xODAsIC04NS4wNTExMjksIDE4MCwgODUuMDUxMTI5XVxuICAgICAgICB9LFxuICAgICAgICBtaW56b29tOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwXG4gICAgICAgIH0sXG4gICAgICAgIG1heHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDIyXG4gICAgICAgIH0sXG4gICAgICAgIHRpbGVTaXplOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiA1MTIsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCJcbiAgICAgICAgfSxcbiAgICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB0ZXJyYXJpdW06IHt9LFxuICAgICAgICAgICAgbWFwYm94OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBib3hcIlxuICAgICAgICB9LFxuICAgICAgICB2b2xhdGlsZToge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExXG4gICAgICAgIH0sXG4gICAgICAgIFwiKlwiOiB7XG4gICAgICAgICAgdHlwZTogXCIqXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZV9nZW9qc29uOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBnZW9qc29uOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHR5cGU6IFwiKlwiXG4gICAgICAgIH0sXG4gICAgICAgIG1heHpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDE4XG4gICAgICAgIH0sXG4gICAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBidWZmZXI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEyOCxcbiAgICAgICAgICBtYXhpbXVtOiA1MTIsXG4gICAgICAgICAgbWluaW11bTogMFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIlxuICAgICAgICB9LFxuICAgICAgICB0b2xlcmFuY2U6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IC4zNzVcbiAgICAgICAgfSxcbiAgICAgICAgY2x1c3Rlcjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExXG4gICAgICAgIH0sXG4gICAgICAgIGNsdXN0ZXJSYWRpdXM6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDUwLFxuICAgICAgICAgIG1pbmltdW06IDBcbiAgICAgICAgfSxcbiAgICAgICAgY2x1c3Rlck1heFpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXG4gICAgICAgIH0sXG4gICAgICAgIGNsdXN0ZXJNaW5Qb2ludHM6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXG4gICAgICAgIH0sXG4gICAgICAgIGNsdXN0ZXJQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdHlwZTogXCIqXCJcbiAgICAgICAgfSxcbiAgICAgICAgbGluZU1ldHJpY3M6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMVxuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZUlkOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITFcbiAgICAgICAgfSxcbiAgICAgICAgcHJvbW90ZUlkOiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9tb3RlSWRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlX3ZpZGVvOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aWRlbzoge31cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVybHM6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGNvb3JkaW5hdGVzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlX2ltYWdlOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICByZXF1aXJlZDogITAsXG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBpbWFnZToge31cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVybDoge1xuICAgICAgICAgIHJlcXVpcmVkOiAhMCxcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIGNvb3JkaW5hdGVzOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6ICEwLFxuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBsZW5ndGg6IDQsXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5ZXI6IHtcbiAgICAgICAgaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIHJlcXVpcmVkOiAhMFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBmaWxsOiB7fSxcbiAgICAgICAgICAgIGxpbmU6IHt9LFxuICAgICAgICAgICAgc3ltYm9sOiB7fSxcbiAgICAgICAgICAgIGNpcmNsZToge30sXG4gICAgICAgICAgICBoZWF0bWFwOiB7fSxcbiAgICAgICAgICAgIFwiZmlsbC1leHRydXNpb25cIjoge30sXG4gICAgICAgICAgICByYXN0ZXI6IHt9LFxuICAgICAgICAgICAgaGlsbHNoYWRlOiB7fSxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogITBcbiAgICAgICAgfSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIlxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlLWxheWVyXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIG1pbnpvb206IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMjRcbiAgICAgICAgfSxcbiAgICAgICAgbWF4em9vbToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAyNFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICB0eXBlOiBcImZpbHRlclwiXG4gICAgICAgIH0sXG4gICAgICAgIGxheW91dDoge1xuICAgICAgICAgIHR5cGU6IFwibGF5b3V0XCJcbiAgICAgICAgfSxcbiAgICAgICAgcGFpbnQ6IHtcbiAgICAgICAgICB0eXBlOiBcInBhaW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheW91dDogW1wibGF5b3V0X2ZpbGxcIiwgXCJsYXlvdXRfbGluZVwiLCBcImxheW91dF9jaXJjbGVcIiwgXCJsYXlvdXRfaGVhdG1hcFwiLCBcImxheW91dF9maWxsLWV4dHJ1c2lvblwiLCBcImxheW91dF9zeW1ib2xcIiwgXCJsYXlvdXRfcmFzdGVyXCIsIFwibGF5b3V0X2hpbGxzaGFkZVwiLCBcImxheW91dF9iYWNrZ3JvdW5kXCJdLFxuICAgICAgbGF5b3V0X2JhY2tncm91bmQ6IHtcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5b3V0X2ZpbGw6IHtcbiAgICAgICAgXCJmaWxsLXNvcnQta2V5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXRfY2lyY2xlOiB7XG4gICAgICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXRfaGVhdG1hcDoge1xuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImxheW91dF9maWxsLWV4dHJ1c2lvblwiOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHt9LFxuICAgICAgICAgICAgbm9uZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlzaWJsZVwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheW91dF9saW5lOiB7XG4gICAgICAgIFwibGluZS1jYXBcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgYnV0dDoge30sXG4gICAgICAgICAgICByb3VuZDoge30sXG4gICAgICAgICAgICBzcXVhcmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImJ1dHRcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1qb2luXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGJldmVsOiB7fSxcbiAgICAgICAgICAgIHJvdW5kOiB7fSxcbiAgICAgICAgICAgIG1pdGVyOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtaXRlclwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtbWl0ZXItbGltaXRcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMixcbiAgICAgICAgICByZXF1aXJlczogW3tcbiAgICAgICAgICAgIFwibGluZS1qb2luXCI6IFwibWl0ZXJcIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEuMDUsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcImxpbmUtam9pblwiOiBcInJvdW5kXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1zb3J0LWtleVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGF5b3V0X3N5bWJvbDoge1xuICAgICAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgcG9pbnQ6IHt9LFxuICAgICAgICAgICAgbGluZToge30sXG4gICAgICAgICAgICBcImxpbmUtY2VudGVyXCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInBvaW50XCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInN5bWJvbC1zcGFjaW5nXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDI1MCxcbiAgICAgICAgICBtaW5pbXVtOiAxLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbe1xuICAgICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFwibGluZVwiXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITEsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInN5bWJvbC1zb3J0LWtleVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzeW1ib2wtei1vcmRlclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBhdXRvOiB7fSxcbiAgICAgICAgICAgIFwidmlld3BvcnQteVwiOiB7fSxcbiAgICAgICAgICAgIHNvdXJjZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwiYXV0b1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLW9wdGlvbmFsXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiLCBcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge30sXG4gICAgICAgICAgICBhdXRvOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJhdXRvXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tc2l6ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwiZmFjdG9yIG9mIHRoZSBvcmlnaW5hbCBpY29uIHNpemVcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXRleHQtZml0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG5vbmU6IHt9LFxuICAgICAgICAgICAgd2lkdGg6IHt9LFxuICAgICAgICAgICAgaGVpZ2h0OiB7fSxcbiAgICAgICAgICAgIGJvdGg6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiLCBcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogNCxcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMCwgMCwgMF0sXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIiwgXCJ0ZXh0LWZpZWxkXCIsIHtcbiAgICAgICAgICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBbXCJib3RoXCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIl1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1pbWFnZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJyZXNvbHZlZEltYWdlXCIsXG4gICAgICAgICAgdG9rZW5zOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXJvdGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHBlcmlvZDogMzYwLFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXBhZGRpbmdcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMixcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLWtlZXAtdXByaWdodFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITEsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIiwge1xuICAgICAgICAgICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBcIm1hcFwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFtcImxpbmVcIiwgXCJsaW5lLWNlbnRlclwiXVxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLW9mZnNldFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgY2VudGVyOiB7fSxcbiAgICAgICAgICAgIGxlZnQ6IHt9LFxuICAgICAgICAgICAgcmlnaHQ6IHt9LFxuICAgICAgICAgICAgdG9wOiB7fSxcbiAgICAgICAgICAgIGJvdHRvbToge30sXG4gICAgICAgICAgICBcInRvcC1sZWZ0XCI6IHt9LFxuICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjoge30sXG4gICAgICAgICAgICBcImJvdHRvbS1sZWZ0XCI6IHt9LFxuICAgICAgICAgICAgXCJib3R0b20tcmlnaHRcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fSxcbiAgICAgICAgICAgIGF1dG86IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImF1dG9cIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fSxcbiAgICAgICAgICAgIGF1dG86IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImF1dG9cIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fSxcbiAgICAgICAgICAgIGF1dG86IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImF1dG9cIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1maWVsZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJmb3JtYXR0ZWRcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIlwiLFxuICAgICAgICAgIHRva2VuczogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1mb250XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVmYXVsdDogW1wiT3BlbiBTYW5zIFJlZ3VsYXJcIiwgXCJBcmlhbCBVbmljb2RlIE1TIFJlZ3VsYXJcIl0sXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1zaXplXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDE2LFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1tYXgtd2lkdGhcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMTAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB1bml0czogXCJlbXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEuMixcbiAgICAgICAgICB1bml0czogXCJlbXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHVuaXRzOiBcImVtc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtanVzdGlmeVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBhdXRvOiB7fSxcbiAgICAgICAgICAgIGxlZnQ6IHt9LFxuICAgICAgICAgICAgY2VudGVyOiB7fSxcbiAgICAgICAgICAgIHJpZ2h0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJjZW50ZXJcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgdW5pdHM6IFwiZW1zXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIGNlbnRlcjoge30sXG4gICAgICAgICAgICBsZWZ0OiB7fSxcbiAgICAgICAgICAgIHJpZ2h0OiB7fSxcbiAgICAgICAgICAgIHRvcDoge30sXG4gICAgICAgICAgICBib3R0b206IHt9LFxuICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwidG9wLXJpZ2h0XCI6IHt9LFxuICAgICAgICAgICAgXCJib3R0b20tbGVmdFwiOiB7fSxcbiAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiLCB7XG4gICAgICAgICAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogW1wicG9pbnRcIl1cbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgY2VudGVyOiB7fSxcbiAgICAgICAgICAgIGxlZnQ6IHt9LFxuICAgICAgICAgICAgcmlnaHQ6IHt9LFxuICAgICAgICAgICAgdG9wOiB7fSxcbiAgICAgICAgICAgIGJvdHRvbToge30sXG4gICAgICAgICAgICBcInRvcC1sZWZ0XCI6IHt9LFxuICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjoge30sXG4gICAgICAgICAgICBcImJvdHRvbS1sZWZ0XCI6IHt9LFxuICAgICAgICAgICAgXCJib3R0b20tcmlnaHRcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwge1xuICAgICAgICAgICAgXCIhXCI6IFwidGV4dC12YXJpYWJsZS1hbmNob3JcIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtbWF4LWFuZ2xlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDQ1LFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiLCB7XG4gICAgICAgICAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogW1wibGluZVwiLCBcImxpbmUtY2VudGVyXCJdXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtd3JpdGluZy1tb2RlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgaG9yaXpvbnRhbDoge30sXG4gICAgICAgICAgICB2ZXJ0aWNhbDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCIsIHtcbiAgICAgICAgICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBbXCJwb2ludFwiXVxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXJvdGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHBlcmlvZDogMzYwLFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXBhZGRpbmdcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMixcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVmYXVsdDogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwge1xuICAgICAgICAgICAgXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOiBcIm1hcFwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IFtcImxpbmVcIiwgXCJsaW5lLWNlbnRlclwiXVxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXRyYW5zZm9ybVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBub25lOiB7fSxcbiAgICAgICAgICAgIHVwcGVyY2FzZToge30sXG4gICAgICAgICAgICBsb3dlcmNhc2U6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LW9mZnNldFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIHVuaXRzOiBcImVtc1wiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIiwge1xuICAgICAgICAgICAgXCIhXCI6IFwidGV4dC1yYWRpYWwtb2Zmc2V0XCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGRlZmF1bHQ6ICExLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMSxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiLCBcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB7fSxcbiAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpc2libGVcIixcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsYXlvdXRfcmFzdGVyOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHt9LFxuICAgICAgICAgICAgbm9uZToge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlzaWJsZVwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxheW91dF9oaWxsc2hhZGU6IHtcbiAgICAgICAgdmlzaWJpbGl0eToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgdmlzaWJsZToge30sXG4gICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyOiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgdmFsdWU6IFwiKlwiXG4gICAgICB9LFxuICAgICAgZmlsdGVyX29wZXJhdG9yOiB7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICBcIj09XCI6IHt9LFxuICAgICAgICAgIFwiIT1cIjoge30sXG4gICAgICAgICAgXCI+XCI6IHt9LFxuICAgICAgICAgIFwiPj1cIjoge30sXG4gICAgICAgICAgXCI8XCI6IHt9LFxuICAgICAgICAgIFwiPD1cIjoge30sXG4gICAgICAgICAgaW46IHt9LFxuICAgICAgICAgIFwiIWluXCI6IHt9LFxuICAgICAgICAgIGFsbDoge30sXG4gICAgICAgICAgYW55OiB7fSxcbiAgICAgICAgICBub25lOiB7fSxcbiAgICAgICAgICBoYXM6IHt9LFxuICAgICAgICAgIFwiIWhhc1wiOiB7fSxcbiAgICAgICAgICB3aXRoaW46IHt9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZW9tZXRyeV90eXBlOiB7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICBQb2ludDoge30sXG4gICAgICAgICAgTGluZVN0cmluZzoge30sXG4gICAgICAgICAgUG9seWdvbjoge31cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICB0eXBlOiBcImV4cHJlc3Npb25cIlxuICAgICAgICB9LFxuICAgICAgICBzdG9wczoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJmdW5jdGlvbl9zdG9wXCJcbiAgICAgICAgfSxcbiAgICAgICAgYmFzZToge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnR5OiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiR6b29tXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgaWRlbnRpdHk6IHt9LFxuICAgICAgICAgICAgZXhwb25lbnRpYWw6IHt9LFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHt9LFxuICAgICAgICAgICAgY2F0ZWdvcmljYWw6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImV4cG9uZW50aWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29sb3JTcGFjZToge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgcmdiOiB7fSxcbiAgICAgICAgICAgIGxhYjoge30sXG4gICAgICAgICAgICBoY2w6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInJnYlwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0eXBlOiBcIipcIixcbiAgICAgICAgICByZXF1aXJlZDogITFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uX3N0b3A6IHtcbiAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICBtYXhpbXVtOiAyNCxcbiAgICAgICAgdmFsdWU6IFtcIm51bWJlclwiLCBcImNvbG9yXCJdLFxuICAgICAgICBsZW5ndGg6IDJcbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgdmFsdWU6IFwiKlwiLFxuICAgICAgICBtaW5pbXVtOiAxXG4gICAgICB9LFxuICAgICAgbGlnaHQ6IHtcbiAgICAgICAgYW5jaG9yOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJ2aWV3cG9ydFwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICExLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBkZWZhdWx0OiBbMS4xNSwgMjEwLCAzMF0sXG4gICAgICAgICAgbGVuZ3RoOiAzLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiI2ZmZmZmZlwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMFxuICAgICAgICB9LFxuICAgICAgICBpbnRlbnNpdHk6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIixcbiAgICAgICAgICBkZWZhdWx0OiAuNSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludDogW1wicGFpbnRfZmlsbFwiLCBcInBhaW50X2xpbmVcIiwgXCJwYWludF9jaXJjbGVcIiwgXCJwYWludF9oZWF0bWFwXCIsIFwicGFpbnRfZmlsbC1leHRydXNpb25cIiwgXCJwYWludF9zeW1ib2xcIiwgXCJwYWludF9yYXN0ZXJcIiwgXCJwYWludF9oaWxsc2hhZGVcIiwgXCJwYWludF9iYWNrZ3JvdW5kXCJdLFxuICAgICAgcGFpbnRfZmlsbDoge1xuICAgICAgICBcImZpbGwtYW50aWFsaWFzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJmaWxsLXBhdHRlcm5cIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW3tcbiAgICAgICAgICAgIFwiIVwiOiBcImZpbGwtcGF0dGVyblwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCJmaWxsLWFudGlhbGlhc1wiOiAhMFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWxsLXRyYW5zbGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm1hcFwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJmaWxsLXRyYW5zbGF0ZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInJlc29sdmVkSW1hZ2VcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwicGFpbnRfZmlsbC1leHRydXNpb25cIjoge1xuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCJcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgdmFsdWU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgbGVuZ3RoOiAyLFxuICAgICAgICAgIGRlZmF1bHQ6IFswLCAwXSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm1hcFwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjoge1xuICAgICAgICAgIHR5cGU6IFwicmVzb2x2ZWRJbWFnZVwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwibWV0ZXJzXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLWJhc2VcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHVuaXRzOiBcIm1ldGVyc1wiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZWZhdWx0OiAhMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9saW5lOiB7XG4gICAgICAgIFwibGluZS1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJsaW5lLXBhdHRlcm5cIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm1hcFwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJsaW5lLXRyYW5zbGF0ZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS13aWR0aFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1vZmZzZXRcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1ibHVyXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1kYXNoYXJyYXlcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcImxpbmUgd2lkdGhzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJsaW5lLXBhdHRlcm5cIlxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjcm9zcy1mYWRlZFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGluZS1wYXR0ZXJuXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInJlc29sdmVkSW1hZ2VcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNyb3NzLWZhZGVkLWRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5lLWdyYWRpZW50XCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgcmVxdWlyZXM6IFt7XG4gICAgICAgICAgICBcIiFcIjogXCJsaW5lLWRhc2hhcnJheVwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCIhXCI6IFwibGluZS1wYXR0ZXJuXCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBzb3VyY2U6IFwiZ2VvanNvblwiLFxuICAgICAgICAgICAgaGFzOiB7XG4gICAgICAgICAgICAgIGxpbmVNZXRyaWNzOiAhMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJsaW5lLXByb2dyZXNzXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJjb2xvci1yYW1wXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhaW50X2NpcmNsZToge1xuICAgICAgICBcImNpcmNsZS1yYWRpdXNcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogNSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiMwMDAwMDBcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLWJsdXJcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS10cmFuc2xhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm1hcFwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJjaXJjbGUtdHJhbnNsYXRlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcInZpZXdwb3J0XCIsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS1zdHJva2Utd2lkdGhcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9oZWF0bWFwOiB7XG4gICAgICAgIFwiaGVhdG1hcC1yYWRpdXNcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMzAsXG4gICAgICAgICAgbWluaW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhdG1hcC13ZWlnaHRcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICExLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImhlYXRtYXAtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBbXCJpbnRlcnBvbGF0ZVwiLCBbXCJsaW5lYXJcIl0sIFtcImhlYXRtYXAtZGVuc2l0eVwiXSwgMCwgXCJyZ2JhKDAsIDAsIDI1NSwgMClcIiwgLjEsIFwicm95YWxibHVlXCIsIC4zLCBcImN5YW5cIiwgLjUsIFwibGltZVwiLCAuNywgXCJ5ZWxsb3dcIiwgMSwgXCJyZWRcIl0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcImhlYXRtYXAtZGVuc2l0eVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiY29sb3ItcmFtcFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhaW50X3N5bWJvbDoge1xuICAgICAgICBcImljb24tb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLWhhbG8tY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcInJnYmEoMCwgMCwgMCwgMClcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1oYWxvLXdpZHRoXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1wiaWNvbi1pbWFnZVwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWNvbi1oYWxvLWJsdXJcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCIsIFwiZmVhdHVyZVwiLCBcImZlYXR1cmUtc3RhdGVcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJpY29uLXRyYW5zbGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHZhbHVlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGxlbmd0aDogMixcbiAgICAgICAgICBkZWZhdWx0OiBbMCwgMF0sXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcImljb24taW1hZ2VcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJlbnVtXCIsXG4gICAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgICBtYXA6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcIm1hcFwiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJpY29uLWltYWdlXCIsIFwiaWNvbi10cmFuc2xhdGVcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtb3BhY2l0eVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiIzAwMDAwMFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIG92ZXJyaWRhYmxlOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJyZ2JhKDAsIDAsIDAsIDApXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtaGFsby13aWR0aFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgdW5pdHM6IFwicGl4ZWxzXCIsXG4gICAgICAgICAgcmVxdWlyZXM6IFtcInRleHQtZmllbGRcIl0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCIsIFwiZmVhdHVyZS1zdGF0ZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1kcml2ZW5cIlxuICAgICAgICB9LFxuICAgICAgICBcInRleHQtaGFsby1ibHVyXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICB1bml0czogXCJwaXhlbHNcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiXSxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiLCBcImZlYXR1cmVcIiwgXCJmZWF0dXJlLXN0YXRlXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWRyaXZlblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dC10cmFuc2xhdGVcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICB2YWx1ZTogXCJudW1iZXJcIixcbiAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDBdLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcInBpeGVsc1wiLFxuICAgICAgICAgIHJlcXVpcmVzOiBbXCJ0ZXh0LWZpZWxkXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbWFwOiB7fSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVmYXVsdDogXCJtYXBcIixcbiAgICAgICAgICByZXF1aXJlczogW1widGV4dC1maWVsZFwiLCBcInRleHQtdHJhbnNsYXRlXCJdLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhaW50X3Jhc3Rlcjoge1xuICAgICAgICBcInJhc3Rlci1vcGFjaXR5XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIHBlcmlvZDogMzYwLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIHVuaXRzOiBcImRlZ3JlZXNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcInJhc3Rlci1zYXR1cmF0aW9uXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogLTEsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogLTEsXG4gICAgICAgICAgbWF4aW11bTogMSxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjoge1xuICAgICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgbGluZWFyOiB7fSxcbiAgICAgICAgICAgIG5lYXJlc3Q6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWZhdWx0OiBcImxpbmVhclwiLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAzMDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMSxcbiAgICAgICAgICB1bml0czogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwYWludF9oaWxsc2hhZGU6IHtcbiAgICAgICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAzMzUsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAzNTksXG4gICAgICAgICAgdHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImVudW1cIixcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgIG1hcDoge30sXG4gICAgICAgICAgICB2aWV3cG9ydDoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IFwidmlld3BvcnRcIixcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICExLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAuNSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiMwMDAwMDBcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZWQ6ICEwLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW1wiem9vbVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IFwiZGF0YS1jb25zdGFudFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOiB7XG4gICAgICAgICAgdHlwZTogXCJjb2xvclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiI0ZGRkZGRlwiLFxuICAgICAgICAgIHRyYW5zaXRpb246ICEwLFxuICAgICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIGludGVycG9sYXRlZDogITAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXCJ6b29tXCJdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInByb3BlcnR5LXR5cGVcIjogXCJkYXRhLWNvbnN0YW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjMDAwMDAwXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcGFpbnRfYmFja2dyb3VuZDoge1xuICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjoge1xuICAgICAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIiMwMDAwMDBcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiAhMCxcbiAgICAgICAgICByZXF1aXJlczogW3tcbiAgICAgICAgICAgIFwiIVwiOiBcImJhY2tncm91bmQtcGF0dGVyblwiXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImJhY2tncm91bmQtcGF0dGVyblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJyZXNvbHZlZEltYWdlXCIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImNyb3NzLWZhZGVkXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgICBtaW5pbXVtOiAwLFxuICAgICAgICAgIG1heGltdW06IDEsXG4gICAgICAgICAgdHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgZXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGVkOiAhMCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtY29uc3RhbnRcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNpdGlvbjoge1xuICAgICAgICBkdXJhdGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMzAwLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgdW5pdHM6IFwibWlsbGlzZWNvbmRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGVsYXk6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICB1bml0czogXCJtaWxsaXNlY29uZHNcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJwcm9wZXJ0eS10eXBlXCI6IHtcbiAgICAgICAgXCJkYXRhLWRyaXZlblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9wZXJ0eS10eXBlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjcm9zcy1mYWRlZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9wZXJ0eS10eXBlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiOiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9wZXJ0eS10eXBlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xvci1yYW1wXCI6IHtcbiAgICAgICAgICB0eXBlOiBcInByb3BlcnR5LXR5cGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImRhdGEtY29uc3RhbnRcIjoge1xuICAgICAgICAgIHR5cGU6IFwicHJvcGVydHktdHlwZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnN0YW50OiB7XG4gICAgICAgICAgdHlwZTogXCJwcm9wZXJ0eS10eXBlXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb21vdGVJZDoge1xuICAgICAgICBcIipcIjoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgICAgIE10ID0gZnVuY3Rpb24gTXQodCwgZSwgciwgbikge1xuICAgICAgdGhpcy5tZXNzYWdlID0gKHQgPyB0ICsgXCI6IFwiIDogXCJcIikgKyByLCBuICYmICh0aGlzLmlkZW50aWZpZXIgPSBuKSwgbnVsbCAhPSBlICYmIGUuX19saW5lX18gJiYgKHRoaXMubGluZSA9IGUuX19saW5lX18pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBCdCh0KSB7XG4gICAgICB2YXIgZSA9IHQudmFsdWU7XG4gICAgICByZXR1cm4gZSA/IFtuZXcgTXQodC5rZXksIGUsIFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpXSA6IFtdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFR0KHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSBbXSwgciA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyByLS0gPiAwOykge1xuICAgICAgICBlW3JdID0gYXJndW1lbnRzW3IgKyAxXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSBlOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG5cbiAgICAgICAgZm9yICh2YXIgbyBpbiBhKSB7XG4gICAgICAgICAgdFtvXSA9IGFbb107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnQodCkge1xuICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0IGluc3RhbmNlb2YgQm9vbGVhbiA/IHQudmFsdWVPZigpIDogdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGdCh0KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkgcmV0dXJuIHQubWFwKEZ0KTtcblxuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh0IGluc3RhbmNlb2YgTnVtYmVyIHx8IHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdCBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7XG4gICAgICAgIHZhciBlID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgciBpbiB0KSB7XG4gICAgICAgICAgZVtyXSA9IEZ0KHRbcl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBWdCh0KTtcbiAgICB9XG5cbiAgICB2YXIgRHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCByKSwgdGhpcy5tZXNzYWdlID0gciwgdGhpcy5rZXkgPSBlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlO1xuICAgIH0oRXJyb3IpLFxuICAgICAgICBMdCA9IGZ1bmN0aW9uIEx0KHQsIGUpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IFtdKSwgdGhpcy5wYXJlbnQgPSB0LCB0aGlzLmJpbmRpbmdzID0ge307XG5cbiAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gZTsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgdmFyIGkgPSBuW3JdO1xuICAgICAgICB0aGlzLmJpbmRpbmdzW2lbMF1dID0gaVsxXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgTHQucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IEx0KHRoaXMsIHQpO1xuICAgIH0sIEx0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHRoaXMuYmluZGluZ3NbdF0pIHJldHVybiB0aGlzLmJpbmRpbmdzW3RdO1xuICAgICAgaWYgKHRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0KHQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHQgKyBcIiBub3QgZm91bmQgaW4gc2NvcGUuXCIpO1xuICAgIH0sIEx0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5iaW5kaW5nc1t0XSB8fCAhIXRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lmhhcyh0KTtcbiAgICB9O1xuICAgIHZhciBSdCA9IHtcbiAgICAgIGtpbmQ6IFwibnVsbFwiXG4gICAgfSxcbiAgICAgICAgT3QgPSB7XG4gICAgICBraW5kOiBcIm51bWJlclwiXG4gICAgfSxcbiAgICAgICAgVXQgPSB7XG4gICAgICBraW5kOiBcInN0cmluZ1wiXG4gICAgfSxcbiAgICAgICAganQgPSB7XG4gICAgICBraW5kOiBcImJvb2xlYW5cIlxuICAgIH0sXG4gICAgICAgIHF0ID0ge1xuICAgICAga2luZDogXCJjb2xvclwiXG4gICAgfSxcbiAgICAgICAgTnQgPSB7XG4gICAgICBraW5kOiBcIm9iamVjdFwiXG4gICAgfSxcbiAgICAgICAgS3QgPSB7XG4gICAgICBraW5kOiBcInZhbHVlXCJcbiAgICB9LFxuICAgICAgICBHdCA9IHtcbiAgICAgIGtpbmQ6IFwiY29sbGF0b3JcIlxuICAgIH0sXG4gICAgICAgIFp0ID0ge1xuICAgICAga2luZDogXCJmb3JtYXR0ZWRcIlxuICAgIH0sXG4gICAgICAgIFh0ID0ge1xuICAgICAga2luZDogXCJyZXNvbHZlZEltYWdlXCJcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSnQodCwgZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogXCJhcnJheVwiLFxuICAgICAgICBpdGVtVHlwZTogdCxcbiAgICAgICAgTjogZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBIdCh0KSB7XG4gICAgICBpZiAoXCJhcnJheVwiID09PSB0LmtpbmQpIHtcbiAgICAgICAgdmFyIGUgPSBIdCh0Lml0ZW1UeXBlKTtcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIHQuTiA/IFwiYXJyYXk8XCIgKyBlICsgXCIsIFwiICsgdC5OICsgXCI+XCIgOiBcInZhbHVlXCIgPT09IHQuaXRlbVR5cGUua2luZCA/IFwiYXJyYXlcIiA6IFwiYXJyYXk8XCIgKyBlICsgXCI+XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0LmtpbmQ7XG4gICAgfVxuXG4gICAgdmFyIFl0ID0gW1J0LCBPdCwgVXQsIGp0LCBxdCwgWnQsIE50LCBKdChLdCksIFh0XTtcblxuICAgIGZ1bmN0aW9uICR0KHQsIGUpIHtcbiAgICAgIGlmIChcImVycm9yXCIgPT09IGUua2luZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGlmIChcImFycmF5XCIgPT09IHQua2luZCkge1xuICAgICAgICBpZiAoXCJhcnJheVwiID09PSBlLmtpbmQgJiYgKDAgPT09IGUuTiAmJiBcInZhbHVlXCIgPT09IGUuaXRlbVR5cGUua2luZCB8fCAhJHQodC5pdGVtVHlwZSwgZS5pdGVtVHlwZSkpICYmIChcIm51bWJlclwiICE9IHR5cGVvZiB0Lk4gfHwgdC5OID09PSBlLk4pKSByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0LmtpbmQgPT09IGUua2luZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChcInZhbHVlXCIgPT09IHQua2luZCkgZm9yICh2YXIgciA9IDAsIG4gPSBZdDsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICBpZiAoISR0KG5bcl0sIGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIEh0KHQpICsgXCIgYnV0IGZvdW5kIFwiICsgSHQoZSkgKyBcIiBpbnN0ZWFkLlwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFd0KHQsIGUpIHtcbiAgICAgIHJldHVybiBlLnNvbWUoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUua2luZCA9PT0gdC5raW5kO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUXQodCwgZSkge1xuICAgICAgcmV0dXJuIGUuc29tZShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gXCJudWxsXCIgPT09IGUgPyBudWxsID09PSB0IDogXCJhcnJheVwiID09PSBlID8gQXJyYXkuaXNBcnJheSh0KSA6IFwib2JqZWN0XCIgPT09IGUgPyB0ICYmICFBcnJheS5pc0FycmF5KHQpICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgOiBlID09PSB0eXBlb2YgdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciB0ZSA9IGUoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0ge1xuICAgICAgICB0cmFuc3BhcmVudDogWzAsIDAsIDAsIDBdLFxuICAgICAgICBhbGljZWJsdWU6IFsyNDAsIDI0OCwgMjU1LCAxXSxcbiAgICAgICAgYW50aXF1ZXdoaXRlOiBbMjUwLCAyMzUsIDIxNSwgMV0sXG4gICAgICAgIGFxdWE6IFswLCAyNTUsIDI1NSwgMV0sXG4gICAgICAgIGFxdWFtYXJpbmU6IFsxMjcsIDI1NSwgMjEyLCAxXSxcbiAgICAgICAgYXp1cmU6IFsyNDAsIDI1NSwgMjU1LCAxXSxcbiAgICAgICAgYmVpZ2U6IFsyNDUsIDI0NSwgMjIwLCAxXSxcbiAgICAgICAgYmlzcXVlOiBbMjU1LCAyMjgsIDE5NiwgMV0sXG4gICAgICAgIGJsYWNrOiBbMCwgMCwgMCwgMV0sXG4gICAgICAgIGJsYW5jaGVkYWxtb25kOiBbMjU1LCAyMzUsIDIwNSwgMV0sXG4gICAgICAgIGJsdWU6IFswLCAwLCAyNTUsIDFdLFxuICAgICAgICBibHVldmlvbGV0OiBbMTM4LCA0MywgMjI2LCAxXSxcbiAgICAgICAgYnJvd246IFsxNjUsIDQyLCA0MiwgMV0sXG4gICAgICAgIGJ1cmx5d29vZDogWzIyMiwgMTg0LCAxMzUsIDFdLFxuICAgICAgICBjYWRldGJsdWU6IFs5NSwgMTU4LCAxNjAsIDFdLFxuICAgICAgICBjaGFydHJldXNlOiBbMTI3LCAyNTUsIDAsIDFdLFxuICAgICAgICBjaG9jb2xhdGU6IFsyMTAsIDEwNSwgMzAsIDFdLFxuICAgICAgICBjb3JhbDogWzI1NSwgMTI3LCA4MCwgMV0sXG4gICAgICAgIGNvcm5mbG93ZXJibHVlOiBbMTAwLCAxNDksIDIzNywgMV0sXG4gICAgICAgIGNvcm5zaWxrOiBbMjU1LCAyNDgsIDIyMCwgMV0sXG4gICAgICAgIGNyaW1zb246IFsyMjAsIDIwLCA2MCwgMV0sXG4gICAgICAgIGN5YW46IFswLCAyNTUsIDI1NSwgMV0sXG4gICAgICAgIGRhcmtibHVlOiBbMCwgMCwgMTM5LCAxXSxcbiAgICAgICAgZGFya2N5YW46IFswLCAxMzksIDEzOSwgMV0sXG4gICAgICAgIGRhcmtnb2xkZW5yb2Q6IFsxODQsIDEzNCwgMTEsIDFdLFxuICAgICAgICBkYXJrZ3JheTogWzE2OSwgMTY5LCAxNjksIDFdLFxuICAgICAgICBkYXJrZ3JlZW46IFswLCAxMDAsIDAsIDFdLFxuICAgICAgICBkYXJrZ3JleTogWzE2OSwgMTY5LCAxNjksIDFdLFxuICAgICAgICBkYXJra2hha2k6IFsxODksIDE4MywgMTA3LCAxXSxcbiAgICAgICAgZGFya21hZ2VudGE6IFsxMzksIDAsIDEzOSwgMV0sXG4gICAgICAgIGRhcmtvbGl2ZWdyZWVuOiBbODUsIDEwNywgNDcsIDFdLFxuICAgICAgICBkYXJrb3JhbmdlOiBbMjU1LCAxNDAsIDAsIDFdLFxuICAgICAgICBkYXJrb3JjaGlkOiBbMTUzLCA1MCwgMjA0LCAxXSxcbiAgICAgICAgZGFya3JlZDogWzEzOSwgMCwgMCwgMV0sXG4gICAgICAgIGRhcmtzYWxtb246IFsyMzMsIDE1MCwgMTIyLCAxXSxcbiAgICAgICAgZGFya3NlYWdyZWVuOiBbMTQzLCAxODgsIDE0MywgMV0sXG4gICAgICAgIGRhcmtzbGF0ZWJsdWU6IFs3MiwgNjEsIDEzOSwgMV0sXG4gICAgICAgIGRhcmtzbGF0ZWdyYXk6IFs0NywgNzksIDc5LCAxXSxcbiAgICAgICAgZGFya3NsYXRlZ3JleTogWzQ3LCA3OSwgNzksIDFdLFxuICAgICAgICBkYXJrdHVycXVvaXNlOiBbMCwgMjA2LCAyMDksIDFdLFxuICAgICAgICBkYXJrdmlvbGV0OiBbMTQ4LCAwLCAyMTEsIDFdLFxuICAgICAgICBkZWVwcGluazogWzI1NSwgMjAsIDE0NywgMV0sXG4gICAgICAgIGRlZXBza3libHVlOiBbMCwgMTkxLCAyNTUsIDFdLFxuICAgICAgICBkaW1ncmF5OiBbMTA1LCAxMDUsIDEwNSwgMV0sXG4gICAgICAgIGRpbWdyZXk6IFsxMDUsIDEwNSwgMTA1LCAxXSxcbiAgICAgICAgZG9kZ2VyYmx1ZTogWzMwLCAxNDQsIDI1NSwgMV0sXG4gICAgICAgIGZpcmVicmljazogWzE3OCwgMzQsIDM0LCAxXSxcbiAgICAgICAgZmxvcmFsd2hpdGU6IFsyNTUsIDI1MCwgMjQwLCAxXSxcbiAgICAgICAgZm9yZXN0Z3JlZW46IFszNCwgMTM5LCAzNCwgMV0sXG4gICAgICAgIGZ1Y2hzaWE6IFsyNTUsIDAsIDI1NSwgMV0sXG4gICAgICAgIGdhaW5zYm9ybzogWzIyMCwgMjIwLCAyMjAsIDFdLFxuICAgICAgICBnaG9zdHdoaXRlOiBbMjQ4LCAyNDgsIDI1NSwgMV0sXG4gICAgICAgIGdvbGQ6IFsyNTUsIDIxNSwgMCwgMV0sXG4gICAgICAgIGdvbGRlbnJvZDogWzIxOCwgMTY1LCAzMiwgMV0sXG4gICAgICAgIGdyYXk6IFsxMjgsIDEyOCwgMTI4LCAxXSxcbiAgICAgICAgZ3JlZW46IFswLCAxMjgsIDAsIDFdLFxuICAgICAgICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0NywgMV0sXG4gICAgICAgIGdyZXk6IFsxMjgsIDEyOCwgMTI4LCAxXSxcbiAgICAgICAgaG9uZXlkZXc6IFsyNDAsIDI1NSwgMjQwLCAxXSxcbiAgICAgICAgaG90cGluazogWzI1NSwgMTA1LCAxODAsIDFdLFxuICAgICAgICBpbmRpYW5yZWQ6IFsyMDUsIDkyLCA5MiwgMV0sXG4gICAgICAgIGluZGlnbzogWzc1LCAwLCAxMzAsIDFdLFxuICAgICAgICBpdm9yeTogWzI1NSwgMjU1LCAyNDAsIDFdLFxuICAgICAgICBraGFraTogWzI0MCwgMjMwLCAxNDAsIDFdLFxuICAgICAgICBsYXZlbmRlcjogWzIzMCwgMjMwLCAyNTAsIDFdLFxuICAgICAgICBsYXZlbmRlcmJsdXNoOiBbMjU1LCAyNDAsIDI0NSwgMV0sXG4gICAgICAgIGxhd25ncmVlbjogWzEyNCwgMjUyLCAwLCAxXSxcbiAgICAgICAgbGVtb25jaGlmZm9uOiBbMjU1LCAyNTAsIDIwNSwgMV0sXG4gICAgICAgIGxpZ2h0Ymx1ZTogWzE3MywgMjE2LCAyMzAsIDFdLFxuICAgICAgICBsaWdodGNvcmFsOiBbMjQwLCAxMjgsIDEyOCwgMV0sXG4gICAgICAgIGxpZ2h0Y3lhbjogWzIyNCwgMjU1LCAyNTUsIDFdLFxuICAgICAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogWzI1MCwgMjUwLCAyMTAsIDFdLFxuICAgICAgICBsaWdodGdyYXk6IFsyMTEsIDIxMSwgMjExLCAxXSxcbiAgICAgICAgbGlnaHRncmVlbjogWzE0NCwgMjM4LCAxNDQsIDFdLFxuICAgICAgICBsaWdodGdyZXk6IFsyMTEsIDIxMSwgMjExLCAxXSxcbiAgICAgICAgbGlnaHRwaW5rOiBbMjU1LCAxODIsIDE5MywgMV0sXG4gICAgICAgIGxpZ2h0c2FsbW9uOiBbMjU1LCAxNjAsIDEyMiwgMV0sXG4gICAgICAgIGxpZ2h0c2VhZ3JlZW46IFszMiwgMTc4LCAxNzAsIDFdLFxuICAgICAgICBsaWdodHNreWJsdWU6IFsxMzUsIDIwNiwgMjUwLCAxXSxcbiAgICAgICAgbGlnaHRzbGF0ZWdyYXk6IFsxMTksIDEzNiwgMTUzLCAxXSxcbiAgICAgICAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksIDEzNiwgMTUzLCAxXSxcbiAgICAgICAgbGlnaHRzdGVlbGJsdWU6IFsxNzYsIDE5NiwgMjIyLCAxXSxcbiAgICAgICAgbGlnaHR5ZWxsb3c6IFsyNTUsIDI1NSwgMjI0LCAxXSxcbiAgICAgICAgbGltZTogWzAsIDI1NSwgMCwgMV0sXG4gICAgICAgIGxpbWVncmVlbjogWzUwLCAyMDUsIDUwLCAxXSxcbiAgICAgICAgbGluZW46IFsyNTAsIDI0MCwgMjMwLCAxXSxcbiAgICAgICAgbWFnZW50YTogWzI1NSwgMCwgMjU1LCAxXSxcbiAgICAgICAgbWFyb29uOiBbMTI4LCAwLCAwLCAxXSxcbiAgICAgICAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwgMjA1LCAxNzAsIDFdLFxuICAgICAgICBtZWRpdW1ibHVlOiBbMCwgMCwgMjA1LCAxXSxcbiAgICAgICAgbWVkaXVtb3JjaGlkOiBbMTg2LCA4NSwgMjExLCAxXSxcbiAgICAgICAgbWVkaXVtcHVycGxlOiBbMTQ3LCAxMTIsIDIxOSwgMV0sXG4gICAgICAgIG1lZGl1bXNlYWdyZWVuOiBbNjAsIDE3OSwgMTEzLCAxXSxcbiAgICAgICAgbWVkaXVtc2xhdGVibHVlOiBbMTIzLCAxMDQsIDIzOCwgMV0sXG4gICAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiBbMCwgMjUwLCAxNTQsIDFdLFxuICAgICAgICBtZWRpdW10dXJxdW9pc2U6IFs3MiwgMjA5LCAyMDQsIDFdLFxuICAgICAgICBtZWRpdW12aW9sZXRyZWQ6IFsxOTksIDIxLCAxMzMsIDFdLFxuICAgICAgICBtaWRuaWdodGJsdWU6IFsyNSwgMjUsIDExMiwgMV0sXG4gICAgICAgIG1pbnRjcmVhbTogWzI0NSwgMjU1LCAyNTAsIDFdLFxuICAgICAgICBtaXN0eXJvc2U6IFsyNTUsIDIyOCwgMjI1LCAxXSxcbiAgICAgICAgbW9jY2FzaW46IFsyNTUsIDIyOCwgMTgxLCAxXSxcbiAgICAgICAgbmF2YWpvd2hpdGU6IFsyNTUsIDIyMiwgMTczLCAxXSxcbiAgICAgICAgbmF2eTogWzAsIDAsIDEyOCwgMV0sXG4gICAgICAgIG9sZGxhY2U6IFsyNTMsIDI0NSwgMjMwLCAxXSxcbiAgICAgICAgb2xpdmU6IFsxMjgsIDEyOCwgMCwgMV0sXG4gICAgICAgIG9saXZlZHJhYjogWzEwNywgMTQyLCAzNSwgMV0sXG4gICAgICAgIG9yYW5nZTogWzI1NSwgMTY1LCAwLCAxXSxcbiAgICAgICAgb3JhbmdlcmVkOiBbMjU1LCA2OSwgMCwgMV0sXG4gICAgICAgIG9yY2hpZDogWzIxOCwgMTEyLCAyMTQsIDFdLFxuICAgICAgICBwYWxlZ29sZGVucm9kOiBbMjM4LCAyMzIsIDE3MCwgMV0sXG4gICAgICAgIHBhbGVncmVlbjogWzE1MiwgMjUxLCAxNTIsIDFdLFxuICAgICAgICBwYWxldHVycXVvaXNlOiBbMTc1LCAyMzgsIDIzOCwgMV0sXG4gICAgICAgIHBhbGV2aW9sZXRyZWQ6IFsyMTksIDExMiwgMTQ3LCAxXSxcbiAgICAgICAgcGFwYXlhd2hpcDogWzI1NSwgMjM5LCAyMTMsIDFdLFxuICAgICAgICBwZWFjaHB1ZmY6IFsyNTUsIDIxOCwgMTg1LCAxXSxcbiAgICAgICAgcGVydTogWzIwNSwgMTMzLCA2MywgMV0sXG4gICAgICAgIHBpbms6IFsyNTUsIDE5MiwgMjAzLCAxXSxcbiAgICAgICAgcGx1bTogWzIyMSwgMTYwLCAyMjEsIDFdLFxuICAgICAgICBwb3dkZXJibHVlOiBbMTc2LCAyMjQsIDIzMCwgMV0sXG4gICAgICAgIHB1cnBsZTogWzEyOCwgMCwgMTI4LCAxXSxcbiAgICAgICAgcmViZWNjYXB1cnBsZTogWzEwMiwgNTEsIDE1MywgMV0sXG4gICAgICAgIHJlZDogWzI1NSwgMCwgMCwgMV0sXG4gICAgICAgIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDMsIDFdLFxuICAgICAgICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjUsIDFdLFxuICAgICAgICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5LCAxXSxcbiAgICAgICAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNCwgMV0sXG4gICAgICAgIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTYsIDFdLFxuICAgICAgICBzZWFncmVlbjogWzQ2LCAxMzksIDg3LCAxXSxcbiAgICAgICAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4LCAxXSxcbiAgICAgICAgc2llbm5hOiBbMTYwLCA4MiwgNDUsIDFdLFxuICAgICAgICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyLCAxXSxcbiAgICAgICAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzUsIDFdLFxuICAgICAgICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDUsIDFdLFxuICAgICAgICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0LCAxXSxcbiAgICAgICAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NCwgMV0sXG4gICAgICAgIHNub3c6IFsyNTUsIDI1MCwgMjUwLCAxXSxcbiAgICAgICAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyNywgMV0sXG4gICAgICAgIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MCwgMV0sXG4gICAgICAgIHRhbjogWzIxMCwgMTgwLCAxNDAsIDFdLFxuICAgICAgICB0ZWFsOiBbMCwgMTI4LCAxMjgsIDFdLFxuICAgICAgICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNiwgMV0sXG4gICAgICAgIHRvbWF0bzogWzI1NSwgOTksIDcxLCAxXSxcbiAgICAgICAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4LCAxXSxcbiAgICAgICAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOCwgMV0sXG4gICAgICAgIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OSwgMV0sXG4gICAgICAgIHdoaXRlOiBbMjU1LCAyNTUsIDI1NSwgMV0sXG4gICAgICAgIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1LCAxXSxcbiAgICAgICAgeWVsbG93OiBbMjU1LCAyNTUsIDAsIDFdLFxuICAgICAgICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MCwgMV1cbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIG4odCkge1xuICAgICAgICByZXR1cm4gKHQgPSBNYXRoLnJvdW5kKHQpKSA8IDAgPyAwIDogdCA+IDI1NSA/IDI1NSA6IHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGkodCkge1xuICAgICAgICByZXR1cm4gbihcIiVcIiA9PT0gdFt0Lmxlbmd0aCAtIDFdID8gcGFyc2VGbG9hdCh0KSAvIDEwMCAqIDI1NSA6IHBhcnNlSW50KHQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYSh0KSB7XG4gICAgICAgIHJldHVybiAoZSA9IFwiJVwiID09PSB0W3QubGVuZ3RoIC0gMV0gPyBwYXJzZUZsb2F0KHQpIC8gMTAwIDogcGFyc2VGbG9hdCh0KSkgPCAwID8gMCA6IGUgPiAxID8gMSA6IGU7XG4gICAgICAgIHZhciBlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIHIgPCAwID8gciArPSAxIDogciA+IDEgJiYgKHIgLT0gMSksIDYgKiByIDwgMSA/IHQgKyAoZSAtIHQpICogciAqIDYgOiAyICogciA8IDEgPyBlIDogMyAqIHIgPCAyID8gdCArIChlIC0gdCkgKiAoMiAvIDMgLSByKSAqIDYgOiB0O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBlLnBhcnNlQ1NTQ29sb3IgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgICBzID0gdC5yZXBsYWNlKC8gL2csIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKHMgaW4gcikgcmV0dXJuIHJbc10uc2xpY2UoKTtcbiAgICAgICAgICBpZiAoXCIjXCIgPT09IHNbMF0pIHJldHVybiA0ID09PSBzLmxlbmd0aCA/IChlID0gcGFyc2VJbnQocy5zdWJzdHIoMSksIDE2KSkgPj0gMCAmJiBlIDw9IDQwOTUgPyBbKDM4NDAgJiBlKSA+PiA0IHwgKDM4NDAgJiBlKSA+PiA4LCAyNDAgJiBlIHwgKDI0MCAmIGUpID4+IDQsIDE1ICYgZSB8ICgxNSAmIGUpIDw8IDQsIDFdIDogbnVsbCA6IDcgPT09IHMubGVuZ3RoICYmIChlID0gcGFyc2VJbnQocy5zdWJzdHIoMSksIDE2KSkgPj0gMCAmJiBlIDw9IDE2Nzc3MjE1ID8gWygxNjcxMTY4MCAmIGUpID4+IDE2LCAoNjUyODAgJiBlKSA+PiA4LCAyNTUgJiBlLCAxXSA6IG51bGw7XG4gICAgICAgICAgdmFyIHUgPSBzLmluZGV4T2YoXCIoXCIpLFxuICAgICAgICAgICAgICBsID0gcy5pbmRleE9mKFwiKVwiKTtcblxuICAgICAgICAgIGlmICgtMSAhPT0gdSAmJiBsICsgMSA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBwID0gcy5zdWJzdHIoMCwgdSksXG4gICAgICAgICAgICAgICAgYyA9IHMuc3Vic3RyKHUgKyAxLCBsIC0gKHUgKyAxKSkuc3BsaXQoXCIsXCIpLFxuICAgICAgICAgICAgICAgIGggPSAxO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgICAgICAgY2FzZSBcInJnYmFcIjpcbiAgICAgICAgICAgICAgICBpZiAoNCAhPT0gYy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGggPSBhKGMucG9wKCkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJyZ2JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gMyAhPT0gYy5sZW5ndGggPyBudWxsIDogW2koY1swXSksIGkoY1sxXSksIGkoY1syXSksIGhdO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJoc2xhXCI6XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IGMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBoID0gYShjLnBvcCgpKTtcblxuICAgICAgICAgICAgICBjYXNlIFwiaHNsXCI6XG4gICAgICAgICAgICAgICAgaWYgKDMgIT09IGMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IChwYXJzZUZsb2F0KGNbMF0pICUgMzYwICsgMzYwKSAlIDM2MCAvIDM2MCxcbiAgICAgICAgICAgICAgICAgICAgeSA9IGEoY1sxXSksXG4gICAgICAgICAgICAgICAgICAgIGQgPSBhKGNbMl0pLFxuICAgICAgICAgICAgICAgICAgICBtID0gZCA8PSAuNSA/IGQgKiAoeSArIDEpIDogZCArIHkgLSBkICogeSxcbiAgICAgICAgICAgICAgICAgICAgdiA9IDIgKiBkIC0gbTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW24oMjU1ICogbyh2LCBtLCBmICsgMSAvIDMpKSwgbigyNTUgKiBvKHYsIG0sIGYpKSwgbigyNTUgKiBvKHYsIG0sIGYgLSAxIC8gMykpLCBoXTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAodCkge31cbiAgICB9KS5wYXJzZUNTU0NvbG9yLFxuICAgICAgICBlZSA9IGZ1bmN0aW9uIGVlKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZvaWQgMCA9PT0gbiAmJiAobiA9IDEpLCB0aGlzLnIgPSB0LCB0aGlzLmcgPSBlLCB0aGlzLmIgPSByLCB0aGlzLmEgPSBuO1xuICAgIH07XG5cbiAgICBlZS5wYXJzZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodCkge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGVlKSByZXR1cm4gdDtcblxuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICAgIHZhciBlID0gdGUodCk7XG4gICAgICAgICAgaWYgKGUpIHJldHVybiBuZXcgZWUoZVswXSAvIDI1NSAqIGVbM10sIGVbMV0gLyAyNTUgKiBlWzNdLCBlWzJdIC8gMjU1ICogZVszXSwgZVszXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBlZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMudG9BcnJheSgpLFxuICAgICAgICAgIGUgPSB0WzFdLFxuICAgICAgICAgIHIgPSB0WzJdLFxuICAgICAgICAgIG4gPSB0WzNdO1xuICAgICAgcmV0dXJuIFwicmdiYShcIiArIE1hdGgucm91bmQodFswXSkgKyBcIixcIiArIE1hdGgucm91bmQoZSkgKyBcIixcIiArIE1hdGgucm91bmQocikgKyBcIixcIiArIG4gKyBcIilcIjtcbiAgICB9LCBlZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5hO1xuICAgICAgcmV0dXJuIDAgPT09IHQgPyBbMCwgMCwgMCwgMF0gOiBbMjU1ICogdGhpcy5yIC8gdCwgMjU1ICogdGhpcy5nIC8gdCwgMjU1ICogdGhpcy5iIC8gdCwgdF07XG4gICAgfSwgZWUuYmxhY2sgPSBuZXcgZWUoMCwgMCwgMCwgMSksIGVlLndoaXRlID0gbmV3IGVlKDEsIDEsIDEsIDEpLCBlZS50cmFuc3BhcmVudCA9IG5ldyBlZSgwLCAwLCAwLCAwKSwgZWUucmVkID0gbmV3IGVlKDEsIDAsIDAsIDEpO1xuXG4gICAgdmFyIHJlID0gZnVuY3Rpb24gcmUodCwgZSwgcikge1xuICAgICAgdGhpcy5zZW5zaXRpdml0eSA9IHQgPyBlID8gXCJ2YXJpYW50XCIgOiBcImNhc2VcIiA6IGUgPyBcImFjY2VudFwiIDogXCJiYXNlXCIsIHRoaXMubG9jYWxlID0gciwgdGhpcy5jb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSwge1xuICAgICAgICBzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSxcbiAgICAgICAgdXNhZ2U6IFwic2VhcmNoXCJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZS5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXRvci5jb21wYXJlKHQsIGUpO1xuICAgIH0sIHJlLnByb3RvdHlwZS5yZXNvbHZlZExvY2FsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10pLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTtcbiAgICB9O1xuXG4gICAgdmFyIG5lID0gZnVuY3Rpb24gbmUodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy50ZXh0ID0gdCwgdGhpcy5pbWFnZSA9IGUsIHRoaXMuc2NhbGUgPSByLCB0aGlzLmZvbnRTdGFjayA9IG4sIHRoaXMudGV4dENvbG9yID0gaTtcbiAgICB9LFxuICAgICAgICBpZSA9IGZ1bmN0aW9uIGllKHQpIHtcbiAgICAgIHRoaXMuc2VjdGlvbnMgPSB0O1xuICAgIH07XG5cbiAgICBpZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgaWUoW25ldyBuZSh0LCBudWxsLCBudWxsLCBudWxsLCBudWxsKV0pO1xuICAgIH0sIGllLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMuc2VjdGlvbnMubGVuZ3RoIHx8ICF0aGlzLnNlY3Rpb25zLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIDAgIT09IHQudGV4dC5sZW5ndGggfHwgdC5pbWFnZSAmJiAwICE9PSB0LmltYWdlLm5hbWUubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSwgaWUuZmFjdG9yeSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGllID8gdCA6IGllLmZyb21TdHJpbmcodCk7XG4gICAgfSwgaWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMuc2VjdGlvbnMubGVuZ3RoID8gXCJcIiA6IHRoaXMuc2VjdGlvbnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LnRleHQ7XG4gICAgICB9KS5qb2luKFwiXCIpO1xuICAgIH0sIGllLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gW1wiZm9ybWF0XCJdLCBlID0gMCwgciA9IHRoaXMuc2VjdGlvbnM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHZhciBuID0gcltlXTtcbiAgICAgICAgaWYgKG4uaW1hZ2UpIHQucHVzaChbXCJpbWFnZVwiLCBuLmltYWdlLm5hbWVdKTtlbHNlIHtcbiAgICAgICAgICB0LnB1c2gobi50ZXh0KTtcbiAgICAgICAgICB2YXIgaSA9IHt9O1xuICAgICAgICAgIG4uZm9udFN0YWNrICYmIChpW1widGV4dC1mb250XCJdID0gW1wibGl0ZXJhbFwiLCBuLmZvbnRTdGFjay5zcGxpdChcIixcIildKSwgbi5zY2FsZSAmJiAoaVtcImZvbnQtc2NhbGVcIl0gPSBuLnNjYWxlKSwgbi50ZXh0Q29sb3IgJiYgKGlbXCJ0ZXh0LWNvbG9yXCJdID0gW1wicmdiYVwiXS5jb25jYXQobi50ZXh0Q29sb3IudG9BcnJheSgpKSksIHQucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9O1xuXG4gICAgdmFyIGFlID0gZnVuY3Rpb24gYWUodCkge1xuICAgICAgdGhpcy5uYW1lID0gdC5uYW1lLCB0aGlzLmF2YWlsYWJsZSA9IHQuYXZhaWxhYmxlO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvZSh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIiA9PSB0eXBlb2YgdCAmJiB0ID49IDAgJiYgdCA8PSAyNTUgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2YgZSAmJiBlID49IDAgJiYgZSA8PSAyNTUgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2YgciAmJiByID49IDAgJiYgciA8PSAyNTUgPyB2b2lkIDAgPT09IG4gfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgbiAmJiBuID49IDAgJiYgbiA8PSAxID8gbnVsbCA6IFwiSW52YWxpZCByZ2JhIHZhbHVlIFtcIiArIFt0LCBlLCByLCBuXS5qb2luKFwiLCBcIikgKyBcIl06ICdhJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS5cIiA6IFwiSW52YWxpZCByZ2JhIHZhbHVlIFtcIiArIChcIm51bWJlclwiID09IHR5cGVvZiBuID8gW3QsIGUsIHIsIG5dIDogW3QsIGUsIHJdKS5qb2luKFwiLCBcIikgKyBcIl06ICdyJywgJ2cnLCBhbmQgJ2InIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuXCI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2UodCkge1xuICAgICAgaWYgKG51bGwgPT09IHQpIHJldHVybiAhMDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gITA7XG4gICAgICBpZiAoXCJib29sZWFuXCIgPT0gdHlwZW9mIHQpIHJldHVybiAhMDtcbiAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiB0KSByZXR1cm4gITA7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIGVlKSByZXR1cm4gITA7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIHJlKSByZXR1cm4gITA7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIGllKSByZXR1cm4gITA7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIGFlKSByZXR1cm4gITA7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdDsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICBpZiAoIXNlKHJbZV0pKSByZXR1cm4gITE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIGZvciAodmFyIG4gaW4gdCkge1xuICAgICAgICAgIGlmICghc2UodFtuXSkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVlKHQpIHtcbiAgICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gUnQ7XG4gICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFV0O1xuICAgICAgaWYgKFwiYm9vbGVhblwiID09IHR5cGVvZiB0KSByZXR1cm4ganQ7XG4gICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIE90O1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBlZSkgcmV0dXJuIHF0O1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiByZSkgcmV0dXJuIEd0O1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBpZSkgcmV0dXJuIFp0O1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBhZSkgcmV0dXJuIFh0O1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBmb3IgKHZhciBlLCByID0gdC5sZW5ndGgsIG4gPSAwLCBpID0gdDsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IHVlKGlbbl0pO1xuXG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGlmIChlID09PSBhKSBjb250aW51ZTtcbiAgICAgICAgICAgIGUgPSBLdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGUgPSBhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEp0KGUgfHwgS3QsIHIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGUodCkge1xuICAgICAgdmFyIGUgPSB0eXBlb2YgdDtcbiAgICAgIHJldHVybiBudWxsID09PSB0ID8gXCJcIiA6IFwic3RyaW5nXCIgPT09IGUgfHwgXCJudW1iZXJcIiA9PT0gZSB8fCBcImJvb2xlYW5cIiA9PT0gZSA/IFN0cmluZyh0KSA6IHQgaW5zdGFuY2VvZiBlZSB8fCB0IGluc3RhbmNlb2YgaWUgfHwgdCBpbnN0YW5jZW9mIGFlID8gdC50b1N0cmluZygpIDogSlNPTi5zdHJpbmdpZnkodCk7XG4gICAgfVxuXG4gICAgYWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9LCBhZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0ID8gbmV3IGFlKHtcbiAgICAgICAgbmFtZTogdCxcbiAgICAgICAgYXZhaWxhYmxlOiAhMVxuICAgICAgfSkgOiBudWxsO1xuICAgIH0sIGFlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5uYW1lXTtcbiAgICB9O1xuXG4gICAgdmFyIHBlID0gZnVuY3Rpb24gcGUodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gdCwgdGhpcy52YWx1ZSA9IGU7XG4gICAgfTtcblxuICAgIHBlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgyICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCInbGl0ZXJhbCcgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIGlmICghc2UodFsxXSkpIHJldHVybiBlLmVycm9yKFwiaW52YWxpZCB2YWx1ZVwiKTtcbiAgICAgIHZhciByID0gdFsxXSxcbiAgICAgICAgICBuID0gdWUociksXG4gICAgICAgICAgaSA9IGUuZXhwZWN0ZWRUeXBlO1xuICAgICAgcmV0dXJuIFwiYXJyYXlcIiAhPT0gbi5raW5kIHx8IDAgIT09IG4uTiB8fCAhaSB8fCBcImFycmF5XCIgIT09IGkua2luZCB8fCBcIm51bWJlclwiID09IHR5cGVvZiBpLk4gJiYgMCAhPT0gaS5OIHx8IChuID0gaSksIG5ldyBwZShuLCByKTtcbiAgICB9LCBwZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9LCBwZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKCkge30sIHBlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEwO1xuICAgIH0sIHBlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJhcnJheVwiID09PSB0aGlzLnR5cGUua2luZCB8fCBcIm9iamVjdFwiID09PSB0aGlzLnR5cGUua2luZCA/IFtcImxpdGVyYWxcIiwgdGhpcy52YWx1ZV0gOiB0aGlzLnZhbHVlIGluc3RhbmNlb2YgZWUgPyBbXCJyZ2JhXCJdLmNvbmNhdCh0aGlzLnZhbHVlLnRvQXJyYXkoKSkgOiB0aGlzLnZhbHVlIGluc3RhbmNlb2YgaWUgPyB0aGlzLnZhbHVlLnNlcmlhbGl6ZSgpIDogdGhpcy52YWx1ZTtcbiAgICB9O1xuXG4gICAgdmFyIGNlID0gZnVuY3Rpb24gY2UodCkge1xuICAgICAgdGhpcy5uYW1lID0gXCJFeHByZXNzaW9uRXZhbHVhdGlvbkVycm9yXCIsIHRoaXMubWVzc2FnZSA9IHQ7XG4gICAgfTtcblxuICAgIGNlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH07XG5cbiAgICB2YXIgaGUgPSB7XG4gICAgICBzdHJpbmc6IFV0LFxuICAgICAgbnVtYmVyOiBPdCxcbiAgICAgIGJvb2xlYW46IGp0LFxuICAgICAgb2JqZWN0OiBOdFxuICAgIH0sXG4gICAgICAgIGZlID0gZnVuY3Rpb24gZmUodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gdCwgdGhpcy5hcmdzID0gZTtcbiAgICB9O1xuXG4gICAgZmUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgMikgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgbiA9IDEsXG4gICAgICAgICAgaSA9IHRbMF07XG5cbiAgICAgIGlmIChcImFycmF5XCIgPT09IGkpIHtcbiAgICAgICAgdmFyIGEsIG87XG5cbiAgICAgICAgaWYgKHQubGVuZ3RoID4gMikge1xuICAgICAgICAgIHZhciBzID0gdFsxXTtcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgcyB8fCAhKHMgaW4gaGUpIHx8IFwib2JqZWN0XCIgPT09IHMpIHJldHVybiBlLmVycm9yKCdUaGUgaXRlbSB0eXBlIGFyZ3VtZW50IG9mIFwiYXJyYXlcIiBtdXN0IGJlIG9uZSBvZiBzdHJpbmcsIG51bWJlciwgYm9vbGVhbicsIDEpO1xuICAgICAgICAgIGEgPSBoZVtzXSwgbisrO1xuICAgICAgICB9IGVsc2UgYSA9IEt0O1xuXG4gICAgICAgIGlmICh0Lmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdFsyXSAmJiAoXCJudW1iZXJcIiAhPSB0eXBlb2YgdFsyXSB8fCB0WzJdIDwgMCB8fCB0WzJdICE9PSBNYXRoLmZsb29yKHRbMl0pKSkgcmV0dXJuIGUuZXJyb3IoJ1RoZSBsZW5ndGggYXJndW1lbnQgdG8gXCJhcnJheVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwnLCAyKTtcbiAgICAgICAgICBvID0gdFsyXSwgbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgciA9IEp0KGEsIG8pO1xuICAgICAgfSBlbHNlIHIgPSBoZVtpXTtcblxuICAgICAgZm9yICh2YXIgdSA9IFtdOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgICAgICB2YXIgbCA9IGUucGFyc2UodFtuXSwgbiwgS3QpO1xuICAgICAgICBpZiAoIWwpIHJldHVybiBudWxsO1xuICAgICAgICB1LnB1c2gobCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgZmUociwgdSk7XG4gICAgfSwgZmUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdGhpcy5hcmdzLmxlbmd0aDsgZSsrKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5hcmdzW2VdLmV2YWx1YXRlKHQpO1xuICAgICAgICBpZiAoISR0KHRoaXMudHlwZSwgdWUocikpKSByZXR1cm4gcjtcbiAgICAgICAgaWYgKGUgPT09IHRoaXMuYXJncy5sZW5ndGggLSAxKSB0aHJvdyBuZXcgY2UoXCJFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlIFwiICsgSHQodGhpcy50eXBlKSArIFwiLCBidXQgZm91bmQgXCIgKyBIdCh1ZShyKSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgZmUucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmFyZ3MuZm9yRWFjaCh0KTtcbiAgICB9LCBmZS5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQub3V0cHV0RGVmaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSwgZmUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy50eXBlLFxuICAgICAgICAgIGUgPSBbdC5raW5kXTtcblxuICAgICAgaWYgKFwiYXJyYXlcIiA9PT0gdC5raW5kKSB7XG4gICAgICAgIHZhciByID0gdC5pdGVtVHlwZTtcblxuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gci5raW5kIHx8IFwibnVtYmVyXCIgPT09IHIua2luZCB8fCBcImJvb2xlYW5cIiA9PT0gci5raW5kKSB7XG4gICAgICAgICAgZS5wdXNoKHIua2luZCk7XG4gICAgICAgICAgdmFyIG4gPSB0Lk47XG4gICAgICAgICAgKFwibnVtYmVyXCIgPT0gdHlwZW9mIG4gfHwgdGhpcy5hcmdzLmxlbmd0aCA+IDEpICYmIGUucHVzaChuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZS5jb25jYXQodGhpcy5hcmdzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zZXJpYWxpemUoKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgdmFyIHllID0gZnVuY3Rpb24geWUodCkge1xuICAgICAgdGhpcy50eXBlID0gWnQsIHRoaXMuc2VjdGlvbnMgPSB0O1xuICAgIH07XG5cbiAgICB5ZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPCAyKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5cIik7XG4gICAgICB2YXIgciA9IHRbMV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocikgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgcikgcmV0dXJuIGUuZXJyb3IoXCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGltYWdlIG9yIHRleHQgc2VjdGlvbi5cIik7XG5cbiAgICAgIGZvciAodmFyIG4gPSBbXSwgaSA9ICExLCBhID0gMTsgYSA8PSB0Lmxlbmd0aCAtIDE7ICsrYSkge1xuICAgICAgICB2YXIgbyA9IHRbYV07XG5cbiAgICAgICAgaWYgKGkgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgbyAmJiAhQXJyYXkuaXNBcnJheShvKSkge1xuICAgICAgICAgIGkgPSAhMTtcbiAgICAgICAgICB2YXIgcyA9IG51bGw7XG4gICAgICAgICAgaWYgKG9bXCJmb250LXNjYWxlXCJdICYmICEocyA9IGUucGFyc2Uob1tcImZvbnQtc2NhbGVcIl0sIDEsIE90KSkpIHJldHVybiBudWxsO1xuICAgICAgICAgIHZhciB1ID0gbnVsbDtcbiAgICAgICAgICBpZiAob1tcInRleHQtZm9udFwiXSAmJiAhKHUgPSBlLnBhcnNlKG9bXCJ0ZXh0LWZvbnRcIl0sIDEsIEp0KFV0KSkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgbCA9IG51bGw7XG4gICAgICAgICAgaWYgKG9bXCJ0ZXh0LWNvbG9yXCJdICYmICEobCA9IGUucGFyc2Uob1tcInRleHQtY29sb3JcIl0sIDEsIHF0KSkpIHJldHVybiBudWxsO1xuICAgICAgICAgIHZhciBwID0gbltuLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIHAuc2NhbGUgPSBzLCBwLmZvbnQgPSB1LCBwLnRleHRDb2xvciA9IGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGMgPSBlLnBhcnNlKHRbYV0sIDEsIEt0KTtcbiAgICAgICAgICBpZiAoIWMpIHJldHVybiBudWxsO1xuICAgICAgICAgIHZhciBoID0gYy50eXBlLmtpbmQ7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT09IGggJiYgXCJ2YWx1ZVwiICE9PSBoICYmIFwibnVsbFwiICE9PSBoICYmIFwicmVzb2x2ZWRJbWFnZVwiICE9PSBoKSByZXR1cm4gZS5lcnJvcihcIkZvcm1hdHRlZCB0ZXh0IHR5cGUgbXVzdCBiZSAnc3RyaW5nJywgJ3ZhbHVlJywgJ2ltYWdlJyBvciAnbnVsbCcuXCIpO1xuICAgICAgICAgIGkgPSAhMCwgbi5wdXNoKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGMsXG4gICAgICAgICAgICBzY2FsZTogbnVsbCxcbiAgICAgICAgICAgIGZvbnQ6IG51bGwsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IHllKG4pO1xuICAgIH0sIHllLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gbmV3IGllKHRoaXMuc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciByID0gZS5jb250ZW50LmV2YWx1YXRlKHQpO1xuICAgICAgICByZXR1cm4gdWUocikgPT09IFh0ID8gbmV3IG5lKFwiXCIsIHIsIG51bGwsIG51bGwsIG51bGwpIDogbmV3IG5lKGxlKHIpLCBudWxsLCBlLnNjYWxlID8gZS5zY2FsZS5ldmFsdWF0ZSh0KSA6IG51bGwsIGUuZm9udCA/IGUuZm9udC5ldmFsdWF0ZSh0KS5qb2luKFwiLFwiKSA6IG51bGwsIGUudGV4dENvbG9yID8gZS50ZXh0Q29sb3IuZXZhbHVhdGUodCkgOiBudWxsKTtcbiAgICAgIH0pKTtcbiAgICB9LCB5ZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5zZWN0aW9uczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICB0KG4uY29udGVudCksIG4uc2NhbGUgJiYgdChuLnNjYWxlKSwgbi5mb250ICYmIHQobi5mb250KSwgbi50ZXh0Q29sb3IgJiYgdChuLnRleHRDb2xvcik7XG4gICAgICB9XG4gICAgfSwgeWUucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgeWUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSBbXCJmb3JtYXRcIl0sIGUgPSAwLCByID0gdGhpcy5zZWN0aW9uczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICB0LnB1c2gobi5jb250ZW50LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgdmFyIGkgPSB7fTtcbiAgICAgICAgbi5zY2FsZSAmJiAoaVtcImZvbnQtc2NhbGVcIl0gPSBuLnNjYWxlLnNlcmlhbGl6ZSgpKSwgbi5mb250ICYmIChpW1widGV4dC1mb250XCJdID0gbi5mb250LnNlcmlhbGl6ZSgpKSwgbi50ZXh0Q29sb3IgJiYgKGlbXCJ0ZXh0LWNvbG9yXCJdID0gbi50ZXh0Q29sb3Iuc2VyaWFsaXplKCkpLCB0LnB1c2goaSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG5cbiAgICB2YXIgZGUgPSBmdW5jdGlvbiBkZSh0KSB7XG4gICAgICB0aGlzLnR5cGUgPSBYdCwgdGhpcy5pbnB1dCA9IHQ7XG4gICAgfTtcblxuICAgIGRlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgyICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCB0d28gYXJndW1lbnRzLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBVdCk7XG4gICAgICByZXR1cm4gciA/IG5ldyBkZShyKSA6IGUuZXJyb3IoXCJObyBpbWFnZSBuYW1lIHByb3ZpZGVkLlwiKTtcbiAgICB9LCBkZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpLFxuICAgICAgICAgIHIgPSBhZS5mcm9tU3RyaW5nKGUpO1xuICAgICAgcmV0dXJuIHIgJiYgdC5hdmFpbGFibGVJbWFnZXMgJiYgKHIuYXZhaWxhYmxlID0gdC5hdmFpbGFibGVJbWFnZXMuaW5kZXhPZihlKSA+IC0xKSwgcjtcbiAgICB9LCBkZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5pbnB1dCk7XG4gICAgfSwgZGUucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgZGUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbXCJpbWFnZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICB9O1xuXG4gICAgdmFyIG1lID0ge1xuICAgICAgXCJ0by1ib29sZWFuXCI6IGp0LFxuICAgICAgXCJ0by1jb2xvclwiOiBxdCxcbiAgICAgIFwidG8tbnVtYmVyXCI6IE90LFxuICAgICAgXCJ0by1zdHJpbmdcIjogVXRcbiAgICB9LFxuICAgICAgICB2ZSA9IGZ1bmN0aW9uIHZlKHQsIGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuYXJncyA9IGU7XG4gICAgfTtcblxuICAgIHZlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA8IDIpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlwiKTtcbiAgICAgIHZhciByID0gdFswXTtcbiAgICAgIGlmICgoXCJ0by1ib29sZWFuXCIgPT09IHIgfHwgXCJ0by1zdHJpbmdcIiA9PT0gcikgJiYgMiAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgb25lIGFyZ3VtZW50LlwiKTtcblxuICAgICAgZm9yICh2YXIgbiA9IG1lW3JdLCBpID0gW10sIGEgPSAxOyBhIDwgdC5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgbyA9IGUucGFyc2UodFthXSwgYSwgS3QpO1xuICAgICAgICBpZiAoIW8pIHJldHVybiBudWxsO1xuICAgICAgICBpLnB1c2gobyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgdmUobiwgaSk7XG4gICAgfSwgdmUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmIChcImJvb2xlYW5cIiA9PT0gdGhpcy50eXBlLmtpbmQpIHJldHVybiBCb29sZWFuKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSk7XG5cbiAgICAgIGlmIChcImNvbG9yXCIgPT09IHRoaXMudHlwZS5raW5kKSB7XG4gICAgICAgIGZvciAodmFyIGUsIHIsIG4gPSAwLCBpID0gdGhpcy5hcmdzOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICAgIGlmIChyID0gbnVsbCwgKGUgPSBpW25dLmV2YWx1YXRlKHQpKSBpbnN0YW5jZW9mIGVlKSByZXR1cm4gZTtcblxuICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgICB2YXIgYSA9IHQucGFyc2VDb2xvcihlKTtcbiAgICAgICAgICAgIGlmIChhKSByZXR1cm4gYTtcbiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZSkgJiYgIShyID0gZS5sZW5ndGggPCAzIHx8IGUubGVuZ3RoID4gNCA/IFwiSW52YWxpZCByYmdhIHZhbHVlIFwiICsgSlNPTi5zdHJpbmdpZnkoZSkgKyBcIjogZXhwZWN0ZWQgYW4gYXJyYXkgY29udGFpbmluZyBlaXRoZXIgdGhyZWUgb3IgZm91ciBudW1lcmljIHZhbHVlcy5cIiA6IG9lKGVbMF0sIGVbMV0sIGVbMl0sIGVbM10pKSkgcmV0dXJuIG5ldyBlZShlWzBdIC8gMjU1LCBlWzFdIC8gMjU1LCBlWzJdIC8gMjU1LCBlWzNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBjZShyIHx8IFwiQ291bGQgbm90IHBhcnNlIGNvbG9yIGZyb20gdmFsdWUgJ1wiICsgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgPyBlIDogU3RyaW5nKEpTT04uc3RyaW5naWZ5KGUpKSkgKyBcIidcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIm51bWJlclwiID09PSB0aGlzLnR5cGUua2luZCkge1xuICAgICAgICBmb3IgKHZhciBvID0gbnVsbCwgcyA9IDAsIHUgPSB0aGlzLmFyZ3M7IHMgPCB1Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IChvID0gdVtzXS5ldmFsdWF0ZSh0KSkpIHJldHVybiAwO1xuICAgICAgICAgIHZhciBsID0gTnVtYmVyKG8pO1xuICAgICAgICAgIGlmICghaXNOYU4obCkpIHJldHVybiBsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IGNlKFwiQ291bGQgbm90IGNvbnZlcnQgXCIgKyBKU09OLnN0cmluZ2lmeShvKSArIFwiIHRvIG51bWJlci5cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcImZvcm1hdHRlZFwiID09PSB0aGlzLnR5cGUua2luZCA/IGllLmZyb21TdHJpbmcobGUodGhpcy5hcmdzWzBdLmV2YWx1YXRlKHQpKSkgOiBcInJlc29sdmVkSW1hZ2VcIiA9PT0gdGhpcy50eXBlLmtpbmQgPyBhZS5mcm9tU3RyaW5nKGxlKHRoaXMuYXJnc1swXS5ldmFsdWF0ZSh0KSkpIDogbGUodGhpcy5hcmdzWzBdLmV2YWx1YXRlKHQpKTtcbiAgICB9LCB2ZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuYXJncy5mb3JFYWNoKHQpO1xuICAgIH0sIHZlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgICB9LCB2ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKFwiZm9ybWF0dGVkXCIgPT09IHRoaXMudHlwZS5raW5kKSByZXR1cm4gbmV3IHllKFt7XG4gICAgICAgIGNvbnRlbnQ6IHRoaXMuYXJnc1swXSxcbiAgICAgICAgc2NhbGU6IG51bGwsXG4gICAgICAgIGZvbnQ6IG51bGwsXG4gICAgICAgIHRleHRDb2xvcjogbnVsbFxuICAgICAgfV0pLnNlcmlhbGl6ZSgpO1xuICAgICAgaWYgKFwicmVzb2x2ZWRJbWFnZVwiID09PSB0aGlzLnR5cGUua2luZCkgcmV0dXJuIG5ldyBkZSh0aGlzLmFyZ3NbMF0pLnNlcmlhbGl6ZSgpO1xuICAgICAgdmFyIHQgPSBbXCJ0by1cIiArIHRoaXMudHlwZS5raW5kXTtcbiAgICAgIHJldHVybiB0aGlzLmVhY2hDaGlsZChmdW5jdGlvbiAoZSkge1xuICAgICAgICB0LnB1c2goZS5zZXJpYWxpemUoKSk7XG4gICAgICB9KSwgdDtcbiAgICB9O1xuXG4gICAgdmFyIGdlID0gW1wiVW5rbm93blwiLCBcIlBvaW50XCIsIFwiTGluZVN0cmluZ1wiLCBcIlBvbHlnb25cIl0sXG4gICAgICAgIHhlID0gZnVuY3Rpb24geGUoKSB7XG4gICAgICB0aGlzLmdsb2JhbHMgPSBudWxsLCB0aGlzLmZlYXR1cmUgPSBudWxsLCB0aGlzLmZlYXR1cmVTdGF0ZSA9IG51bGwsIHRoaXMuZm9ybWF0dGVkU2VjdGlvbiA9IG51bGwsIHRoaXMuX3BhcnNlQ29sb3JDYWNoZSA9IHt9LCB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IG51bGwsIHRoaXMuY2Fub25pY2FsID0gbnVsbDtcbiAgICB9O1xuXG4gICAgeGUucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiBcImlkXCIgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9LCB4ZS5wcm90b3R5cGUuZ2VvbWV0cnlUeXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSA/IFwibnVtYmVyXCIgPT0gdHlwZW9mIHRoaXMuZmVhdHVyZS50eXBlID8gZ2VbdGhpcy5mZWF0dXJlLnR5cGVdIDogdGhpcy5mZWF0dXJlLnR5cGUgOiBudWxsO1xuICAgIH0sIHhlLnByb3RvdHlwZS5nZW9tZXRyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgXCJnZW9tZXRyeVwiIGluIHRoaXMuZmVhdHVyZSA/IHRoaXMuZmVhdHVyZS5nZW9tZXRyeSA6IG51bGw7XG4gICAgfSwgeGUucHJvdG90eXBlLmNhbm9uaWNhbElEID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsO1xuICAgIH0sIHhlLnByb3RvdHlwZS5wcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9LCB4ZS5wcm90b3R5cGUucGFyc2VDb2xvciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVt0XTtcbiAgICAgIHJldHVybiBlIHx8IChlID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW3RdID0gZWUucGFyc2UodCkpLCBlO1xuICAgIH07XG5cbiAgICB2YXIgYmUgPSBmdW5jdGlvbiBiZSh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLm5hbWUgPSB0LCB0aGlzLnR5cGUgPSBlLCB0aGlzLl9ldmFsdWF0ZSA9IHIsIHRoaXMuYXJncyA9IG47XG4gICAgfTtcblxuICAgIGJlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUodCwgdGhpcy5hcmdzKTtcbiAgICB9LCBiZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuYXJncy5mb3JFYWNoKHQpO1xuICAgIH0sIGJlLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGJlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW3RoaXMubmFtZV0uY29uY2F0KHRoaXMuYXJncy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuc2VyaWFsaXplKCk7XG4gICAgICB9KSk7XG4gICAgfSwgYmUucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgbiA9IHRbMF0sXG4gICAgICAgICAgaSA9IGJlLmRlZmluaXRpb25zW25dO1xuICAgICAgaWYgKCFpKSByZXR1cm4gZS5lcnJvcignVW5rbm93biBleHByZXNzaW9uIFwiJyArIG4gKyAnXCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uJywgMCk7XG5cbiAgICAgIGZvciAodmFyIGEgPSBBcnJheS5pc0FycmF5KGkpID8gaVswXSA6IGkudHlwZSwgbyA9IEFycmF5LmlzQXJyYXkoaSkgPyBbW2lbMV0sIGlbMl1dXSA6IGkub3ZlcmxvYWRzLCBzID0gby5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdO1xuICAgICAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkocikgfHwgci5sZW5ndGggPT09IHQubGVuZ3RoIC0gMTtcbiAgICAgIH0pLCB1ID0gbnVsbCwgbCA9IDAsIHAgPSBzOyBsIDwgcC5sZW5ndGg7IGwgKz0gMSkge1xuICAgICAgICB2YXIgYyA9IHBbbF0sXG4gICAgICAgICAgICBoID0gY1swXSxcbiAgICAgICAgICAgIGYgPSBjWzFdO1xuICAgICAgICB1ID0gbmV3IHFlKGUucmVnaXN0cnksIGUucGF0aCwgbnVsbCwgZS5zY29wZSk7XG5cbiAgICAgICAgZm9yICh2YXIgeSA9IFtdLCBkID0gITEsIG0gPSAxOyBtIDwgdC5sZW5ndGg7IG0rKykge1xuICAgICAgICAgIHZhciB2ID0gdFttXSxcbiAgICAgICAgICAgICAgZyA9IEFycmF5LmlzQXJyYXkoaCkgPyBoW20gLSAxXSA6IGgudHlwZSxcbiAgICAgICAgICAgICAgeCA9IHUucGFyc2UodiwgMSArIHkubGVuZ3RoLCBnKTtcblxuICAgICAgICAgIGlmICgheCkge1xuICAgICAgICAgICAgZCA9ICEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeS5wdXNoKHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkKSBpZiAoQXJyYXkuaXNBcnJheShoKSAmJiBoLmxlbmd0aCAhPT0geS5sZW5ndGgpIHUuZXJyb3IoXCJFeHBlY3RlZCBcIiArIGgubGVuZ3RoICsgXCIgYXJndW1lbnRzLCBidXQgZm91bmQgXCIgKyB5Lmxlbmd0aCArIFwiIGluc3RlYWQuXCIpO2Vsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgeS5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgdmFyIHcgPSBBcnJheS5pc0FycmF5KGgpID8gaFtiXSA6IGgudHlwZSxcbiAgICAgICAgICAgICAgICBfID0geVtiXTtcbiAgICAgICAgICAgIHUuY29uY2F0KGIgKyAxKS5jaGVja1N1YnR5cGUodywgXy50eXBlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoMCA9PT0gdS5lcnJvcnMubGVuZ3RoKSByZXR1cm4gbmV3IGJlKG4sIGEsIGYsIHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgxID09PSBzLmxlbmd0aCkgKHIgPSBlLmVycm9ycykucHVzaC5hcHBseShyLCB1LmVycm9ycyk7ZWxzZSB7XG4gICAgICAgIGZvciAodmFyIEEgPSAocy5sZW5ndGggPyBzIDogbykubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgcmV0dXJuIGUgPSB0WzBdLCBBcnJheS5pc0FycmF5KGUpID8gXCIoXCIgKyBlLm1hcChIdCkuam9pbihcIiwgXCIpICsgXCIpXCIgOiBcIihcIiArIEh0KGUudHlwZSkgKyBcIi4uLilcIjtcbiAgICAgICAgfSkuam9pbihcIiB8IFwiKSwgUyA9IFtdLCBrID0gMTsgayA8IHQubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgSSA9IGUucGFyc2UodFtrXSwgMSArIFMubGVuZ3RoKTtcbiAgICAgICAgICBpZiAoIUkpIHJldHVybiBudWxsO1xuICAgICAgICAgIFMucHVzaChIdChJLnR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUuZXJyb3IoXCJFeHBlY3RlZCBhcmd1bWVudHMgb2YgdHlwZSBcIiArIEEgKyBcIiwgYnV0IGZvdW5kIChcIiArIFMuam9pbihcIiwgXCIpICsgXCIpIGluc3RlYWQuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgYmUucmVnaXN0ZXIgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciBpbiBiZS5kZWZpbml0aW9ucyA9IGUsIGUpIHtcbiAgICAgICAgdFtyXSA9IGJlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgd2UgPSBmdW5jdGlvbiB3ZSh0LCBlLCByKSB7XG4gICAgICB0aGlzLnR5cGUgPSBHdCwgdGhpcy5sb2NhbGUgPSByLCB0aGlzLmNhc2VTZW5zaXRpdmUgPSB0LCB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZSA9IGU7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIF9lKHQsIGUpIHtcbiAgICAgIHRbMF0gPSBNYXRoLm1pbih0WzBdLCBlWzBdKSwgdFsxXSA9IE1hdGgubWluKHRbMV0sIGVbMV0pLCB0WzJdID0gTWF0aC5tYXgodFsyXSwgZVswXSksIHRbM10gPSBNYXRoLm1heCh0WzNdLCBlWzFdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBZSh0LCBlKSB7XG4gICAgICByZXR1cm4gISh0WzBdIDw9IGVbMF0gfHwgdFsyXSA+PSBlWzJdIHx8IHRbMV0gPD0gZVsxXSB8fCB0WzNdID49IGVbM10pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNlKHQsIGUpIHtcbiAgICAgIHZhciByID0gKDE4MCArIHRbMF0pIC8gMzYwLFxuICAgICAgICAgIG4gPSAoMTgwIC0gMTgwIC8gTWF0aC5QSSAqIE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgdFsxXSAqIE1hdGguUEkgLyAzNjApKSkgLyAzNjAsXG4gICAgICAgICAgaSA9IE1hdGgucG93KDIsIGUueik7XG4gICAgICByZXR1cm4gW01hdGgucm91bmQociAqIGkgKiA4MTkyKSwgTWF0aC5yb3VuZChuICogaSAqIDgxOTIpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrZSh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gZVsxXSA+IHRbMV0gIT0gclsxXSA+IHRbMV0gJiYgdFswXSA8IChyWzBdIC0gZVswXSkgKiAodFsxXSAtIGVbMV0pIC8gKHJbMV0gLSBlWzFdKSArIGVbMF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSWUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciwgbiwgaSwgYSwgbywgcywgdSwgbCA9ICExLCBwID0gMCwgYyA9IGUubGVuZ3RoOyBwIDwgYzsgcCsrKSB7XG4gICAgICAgIGZvciAodmFyIGggPSBlW3BdLCBmID0gMCwgeSA9IGgubGVuZ3RoOyBmIDwgeSAtIDE7IGYrKykge1xuICAgICAgICAgIGlmICgoYSA9IChyID0gdClbMF0gLSAobiA9IGhbZl0pWzBdKSAqICh1ID0gclsxXSAtIChpID0gaFtmICsgMV0pWzFdKSAtIChzID0gclswXSAtIGlbMF0pICogKG8gPSByWzFdIC0gblsxXSkgPT0gMCAmJiBhICogcyA8PSAwICYmIG8gKiB1IDw9IDApIHJldHVybiAhMTtcbiAgICAgICAgICBrZSh0LCBoW2ZdLCBoW2YgKyAxXSkgJiYgKGwgPSAhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGlmIChJZSh0LCBlW3JdKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ2UodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBuWzBdIC0gclswXSxcbiAgICAgICAgICBhID0gblsxXSAtIHJbMV0sXG4gICAgICAgICAgbyA9ICh0WzBdIC0gclswXSkgKiBhIC0gaSAqICh0WzFdIC0gclsxXSksXG4gICAgICAgICAgcyA9IChlWzBdIC0gclswXSkgKiBhIC0gaSAqIChlWzFdIC0gclsxXSk7XG4gICAgICByZXR1cm4gbyA+IDAgJiYgcyA8IDAgfHwgbyA8IDAgJiYgcyA+IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRWUodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSByOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBhID0gaVtuXSwgbyA9IDA7IG8gPCBhLmxlbmd0aCAtIDE7ICsrbykge1xuICAgICAgICAgIGlmICgwICE9IChjID0gWyhwID0gYVtvICsgMV0pWzBdIC0gKGwgPSBhW29dKVswXSwgcFsxXSAtIGxbMV1dKVswXSAqIChoID0gWyh1ID0gZSlbMF0gLSAocyA9IHQpWzBdLCB1WzFdIC0gc1sxXV0pWzFdIC0gY1sxXSAqIGhbMF0gJiYgQ2UocywgdSwgbCwgcCkgJiYgQ2UobCwgcCwgcywgdSkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcywgdSwgbCwgcCwgYywgaDtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQZSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgaWYgKCFJZSh0W3JdLCBlKSkgcmV0dXJuICExO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQubGVuZ3RoIC0gMTsgKytuKSB7XG4gICAgICAgIGlmIChFZSh0W25dLCB0W24gKyAxXSwgZSkpIHJldHVybiAhMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE1lKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICBpZiAoUGUodCwgZVtyXSkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEJlKHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGEgPSBbXSwgbyA9IDA7IG8gPCB0W2ldLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgdmFyIHMgPSBTZSh0W2ldW29dLCByKTtcbiAgICAgICAgICBfZShlLCBzKSwgYS5wdXNoKHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbi5wdXNoKGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBUZSh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYSA9IEJlKHRbaV0sIGUsIHIpO1xuICAgICAgICBuLnB1c2goYSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFZlKHQsIGUsIHIsIG4pIHtcbiAgICAgIGlmICh0WzBdIDwgclswXSB8fCB0WzBdID4gclsyXSkge1xuICAgICAgICB2YXIgaSA9IC41ICogbixcbiAgICAgICAgICAgIGEgPSB0WzBdIC0gclswXSA+IGkgPyAtbiA6IHJbMF0gLSB0WzBdID4gaSA/IG4gOiAwO1xuICAgICAgICAwID09PSBhICYmIChhID0gdFswXSAtIHJbMl0gPiBpID8gLW4gOiByWzJdIC0gdFswXSA+IGkgPyBuIDogMCksIHRbMF0gKz0gYTtcbiAgICAgIH1cblxuICAgICAgX2UoZSwgdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRmUodCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IDgxOTIgKiBNYXRoLnBvdygyLCBuLnopLCBhID0gWzgxOTIgKiBuLngsIDgxOTIgKiBuLnldLCBvID0gW10sIHMgPSAwLCB1ID0gdDsgcyA8IHUubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IDAsIHAgPSB1W3NdOyBsIDwgcC5sZW5ndGg7IGwgKz0gMSkge1xuICAgICAgICAgIHZhciBjID0gcFtsXSxcbiAgICAgICAgICAgICAgaCA9IFtjLnggKyBhWzBdLCBjLnkgKyBhWzFdXTtcbiAgICAgICAgICBWZShoLCBlLCByLCBpKSwgby5wdXNoKGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIERlKHQsIGUsIHIsIG4pIHtcbiAgICAgIGZvciAodmFyIGksIGEgPSA4MTkyICogTWF0aC5wb3coMiwgbi56KSwgbyA9IFs4MTkyICogbi54LCA4MTkyICogbi55XSwgcyA9IFtdLCB1ID0gMCwgbCA9IHQ7IHUgPCBsLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIHAgPSBbXSwgYyA9IDAsIGggPSBsW3VdOyBjIDwgaC5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgIHZhciBmID0gaFtjXSxcbiAgICAgICAgICAgICAgeSA9IFtmLnggKyBvWzBdLCBmLnkgKyBvWzFdXTtcbiAgICAgICAgICBfZShlLCB5KSwgcC5wdXNoKHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcy5wdXNoKHApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZVsyXSAtIGVbMF0gPD0gYSAvIDIpIHtcbiAgICAgICAgKGkgPSBlKVswXSA9IGlbMV0gPSAxIC8gMCwgaVsyXSA9IGlbM10gPSAtMSAvIDA7XG5cbiAgICAgICAgZm9yICh2YXIgZCA9IDAsIG0gPSBzOyBkIDwgbS5sZW5ndGg7IGQgKz0gMSkge1xuICAgICAgICAgIGZvciAodmFyIHYgPSAwLCBnID0gbVtkXTsgdiA8IGcubGVuZ3RoOyB2ICs9IDEpIHtcbiAgICAgICAgICAgIFZlKGdbdl0sIGUsIHIsIGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICB3ZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoMiAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgb25lIGFyZ3VtZW50LlwiKTtcbiAgICAgIHZhciByID0gdFsxXTtcbiAgICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiByIHx8IEFycmF5LmlzQXJyYXkocikpIHJldHVybiBlLmVycm9yKFwiQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5cIik7XG4gICAgICB2YXIgbiA9IGUucGFyc2Uodm9pZCAwICE9PSByW1wiY2FzZS1zZW5zaXRpdmVcIl0gJiYgcltcImNhc2Utc2Vuc2l0aXZlXCJdLCAxLCBqdCk7XG4gICAgICBpZiAoIW4pIHJldHVybiBudWxsO1xuICAgICAgdmFyIGkgPSBlLnBhcnNlKHZvaWQgMCAhPT0gcltcImRpYWNyaXRpYy1zZW5zaXRpdmVcIl0gJiYgcltcImRpYWNyaXRpYy1zZW5zaXRpdmVcIl0sIDEsIGp0KTtcbiAgICAgIGlmICghaSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgYSA9IG51bGw7XG4gICAgICByZXR1cm4gci5sb2NhbGUgJiYgIShhID0gZS5wYXJzZShyLmxvY2FsZSwgMSwgVXQpKSA/IG51bGwgOiBuZXcgd2UobiwgaSwgYSk7XG4gICAgfSwgd2UucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgcmUodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKHQpLCB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5ldmFsdWF0ZSh0KSwgdGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5ldmFsdWF0ZSh0KSA6IG51bGwpO1xuICAgIH0sIHdlLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmNhc2VTZW5zaXRpdmUpLCB0KHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlKSwgdGhpcy5sb2NhbGUgJiYgdCh0aGlzLmxvY2FsZSk7XG4gICAgfSwgd2UucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgd2UucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0ge307XG4gICAgICByZXR1cm4gdFtcImNhc2Utc2Vuc2l0aXZlXCJdID0gdGhpcy5jYXNlU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpLCB0W1wiZGlhY3JpdGljLXNlbnNpdGl2ZVwiXSA9IHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpLCB0aGlzLmxvY2FsZSAmJiAodC5sb2NhbGUgPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKSksIFtcImNvbGxhdG9yXCIsIHRdO1xuICAgIH07XG5cbiAgICB2YXIgTGUgPSBmdW5jdGlvbiBMZSh0LCBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSBqdCwgdGhpcy5nZW9qc29uID0gdCwgdGhpcy5nZW9tZXRyaWVzID0gZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUmUodCkge1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBiZSkge1xuICAgICAgICBpZiAoXCJnZXRcIiA9PT0gdC5uYW1lICYmIDEgPT09IHQuYXJncy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKFwiZmVhdHVyZS1zdGF0ZVwiID09PSB0Lm5hbWUpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKFwiaGFzXCIgPT09IHQubmFtZSAmJiAxID09PSB0LmFyZ3MubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChcInByb3BlcnRpZXNcIiA9PT0gdC5uYW1lIHx8IFwiZ2VvbWV0cnktdHlwZVwiID09PSB0Lm5hbWUgfHwgXCJpZFwiID09PSB0Lm5hbWUpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKC9eZmlsdGVyLS8udGVzdCh0Lm5hbWUpKSByZXR1cm4gITE7XG4gICAgICB9XG5cbiAgICAgIGlmICh0IGluc3RhbmNlb2YgTGUpIHJldHVybiAhMTtcbiAgICAgIHZhciBlID0gITA7XG4gICAgICByZXR1cm4gdC5lYWNoQ2hpbGQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZSAmJiAhUmUodCkgJiYgKGUgPSAhMSk7XG4gICAgICB9KSwgZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPZSh0KSB7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIGJlICYmIFwiZmVhdHVyZS1zdGF0ZVwiID09PSB0Lm5hbWUpIHJldHVybiAhMTtcbiAgICAgIHZhciBlID0gITA7XG4gICAgICByZXR1cm4gdC5lYWNoQ2hpbGQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZSAmJiAhT2UodCkgJiYgKGUgPSAhMSk7XG4gICAgICB9KSwgZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVZSh0LCBlKSB7XG4gICAgICBpZiAodCBpbnN0YW5jZW9mIGJlICYmIGUuaW5kZXhPZih0Lm5hbWUpID49IDApIHJldHVybiAhMTtcbiAgICAgIHZhciByID0gITA7XG4gICAgICByZXR1cm4gdC5lYWNoQ2hpbGQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgciAmJiAhVWUodCwgZSkgJiYgKHIgPSAhMSk7XG4gICAgICB9KSwgcjtcbiAgICB9XG5cbiAgICBMZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAoMiAhPT0gdC5sZW5ndGgpIHJldHVybiBlLmVycm9yKFwiJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcblxuICAgICAgaWYgKHNlKHRbMV0pKSB7XG4gICAgICAgIHZhciByID0gdFsxXTtcbiAgICAgICAgaWYgKFwiRmVhdHVyZUNvbGxlY3Rpb25cIiA9PT0gci50eXBlKSBmb3IgKHZhciBuID0gMDsgbiA8IHIuZmVhdHVyZXMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICB2YXIgaSA9IHIuZmVhdHVyZXNbbl0uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICBpZiAoXCJQb2x5Z29uXCIgPT09IGkgfHwgXCJNdWx0aVBvbHlnb25cIiA9PT0gaSkgcmV0dXJuIG5ldyBMZShyLCByLmZlYXR1cmVzW25dLmdlb21ldHJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChcIkZlYXR1cmVcIiA9PT0gci50eXBlKSB7XG4gICAgICAgICAgdmFyIGEgPSByLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgICAgaWYgKFwiUG9seWdvblwiID09PSBhIHx8IFwiTXVsdGlQb2x5Z29uXCIgPT09IGEpIHJldHVybiBuZXcgTGUociwgci5nZW9tZXRyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJQb2x5Z29uXCIgPT09IHIudHlwZSB8fCBcIk11bHRpUG9seWdvblwiID09PSByLnR5cGUpIHJldHVybiBuZXcgTGUociwgcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlLmVycm9yKFwiJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyB2YWxpZCBnZW9qc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIHBvbHlnb24gZ2VvbWV0cnkgdHlwZS5cIik7XG4gICAgfSwgTGUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmIChudWxsICE9IHQuZ2VvbWV0cnkoKSAmJiBudWxsICE9IHQuY2Fub25pY2FsSUQoKSkge1xuICAgICAgICBpZiAoXCJQb2ludFwiID09PSB0Lmdlb21ldHJ5VHlwZSgpKSByZXR1cm4gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IFsxIC8gMCwgMSAvIDAsIC0xIC8gMCwgLTEgLyAwXSxcbiAgICAgICAgICAgICAgbiA9IFsxIC8gMCwgMSAvIDAsIC0xIC8gMCwgLTEgLyAwXSxcbiAgICAgICAgICAgICAgaSA9IHQuY2Fub25pY2FsSUQoKTtcblxuICAgICAgICAgIGlmIChcIlBvbHlnb25cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgICAgICB2YXIgYSA9IEJlKGUuY29vcmRpbmF0ZXMsIG4sIGkpLFxuICAgICAgICAgICAgICAgIG8gPSBGZSh0Lmdlb21ldHJ5KCksIHIsIG4sIGkpO1xuICAgICAgICAgICAgaWYgKCFBZShyLCBuKSkgcmV0dXJuICExO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IG87IHMgPCB1Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgICAgIGlmICghSWUodVtzXSwgYSkpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgICAgICB2YXIgbCA9IFRlKGUuY29vcmRpbmF0ZXMsIG4sIGkpLFxuICAgICAgICAgICAgICAgIHAgPSBGZSh0Lmdlb21ldHJ5KCksIHIsIG4sIGkpO1xuICAgICAgICAgICAgaWYgKCFBZShyLCBuKSkgcmV0dXJuICExO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBjID0gMCwgaCA9IHA7IGMgPCBoLmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgICAgIGlmICghemUoaFtjXSwgbCkpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH0odCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgICAgaWYgKFwiTGluZVN0cmluZ1wiID09PSB0Lmdlb21ldHJ5VHlwZSgpKSByZXR1cm4gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IFsxIC8gMCwgMSAvIDAsIC0xIC8gMCwgLTEgLyAwXSxcbiAgICAgICAgICAgICAgbiA9IFsxIC8gMCwgMSAvIDAsIC0xIC8gMCwgLTEgLyAwXSxcbiAgICAgICAgICAgICAgaSA9IHQuY2Fub25pY2FsSUQoKTtcblxuICAgICAgICAgIGlmIChcIlBvbHlnb25cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgICAgICB2YXIgYSA9IEJlKGUuY29vcmRpbmF0ZXMsIG4sIGkpLFxuICAgICAgICAgICAgICAgIG8gPSBEZSh0Lmdlb21ldHJ5KCksIHIsIG4sIGkpO1xuICAgICAgICAgICAgaWYgKCFBZShyLCBuKSkgcmV0dXJuICExO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IG87IHMgPCB1Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgICAgIGlmICghUGUodVtzXSwgYSkpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgICAgICB2YXIgbCA9IFRlKGUuY29vcmRpbmF0ZXMsIG4sIGkpLFxuICAgICAgICAgICAgICAgIHAgPSBEZSh0Lmdlb21ldHJ5KCksIHIsIG4sIGkpO1xuICAgICAgICAgICAgaWYgKCFBZShyLCBuKSkgcmV0dXJuICExO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBjID0gMCwgaCA9IHA7IGMgPCBoLmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgICAgIGlmICghTWUoaFtjXSwgbCkpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH0odCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH0sIExlLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAoKSB7fSwgTGUucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgTGUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbXCJ3aXRoaW5cIiwgdGhpcy5nZW9qc29uXTtcbiAgICB9O1xuXG4gICAgdmFyIGplID0gZnVuY3Rpb24gamUodCwgZSkge1xuICAgICAgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLm5hbWUgPSB0LCB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGU7XG4gICAgfTtcblxuICAgIGplLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICgyICE9PSB0Lmxlbmd0aCB8fCBcInN0cmluZ1wiICE9IHR5cGVvZiB0WzFdKSByZXR1cm4gZS5lcnJvcihcIid2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuXCIpO1xuICAgICAgdmFyIHIgPSB0WzFdO1xuICAgICAgcmV0dXJuIGUuc2NvcGUuaGFzKHIpID8gbmV3IGplKHIsIGUuc2NvcGUuZ2V0KHIpKSA6IGUuZXJyb3IoJ1Vua25vd24gdmFyaWFibGUgXCInICsgciArICdcIi4gTWFrZSBzdXJlIFwiJyArIHIgKyAnXCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuJywgMSk7XG4gICAgfSwgamUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvdW5kRXhwcmVzc2lvbi5ldmFsdWF0ZSh0KTtcbiAgICB9LCBqZS5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKCkge30sIGplLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGplLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gW1widmFyXCIsIHRoaXMubmFtZV07XG4gICAgfTtcblxuICAgIHZhciBxZSA9IGZ1bmN0aW9uIHFlKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IFtdKSwgdm9pZCAwID09PSBuICYmIChuID0gbmV3IEx0KCkpLCB2b2lkIDAgPT09IGkgJiYgKGkgPSBbXSksIHRoaXMucmVnaXN0cnkgPSB0LCB0aGlzLnBhdGggPSBlLCB0aGlzLmtleSA9IGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIltcIiArIHQgKyBcIl1cIjtcbiAgICAgIH0pLmpvaW4oXCJcIiksIHRoaXMuc2NvcGUgPSBuLCB0aGlzLmVycm9ycyA9IGksIHRoaXMuZXhwZWN0ZWRUeXBlID0gcjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTmUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciwgbiA9IHQubGVuZ3RoIC0gMSwgaSA9IDAsIGEgPSBuLCBvID0gMDsgaSA8PSBhOykge1xuICAgICAgICBpZiAoKHIgPSB0W28gPSBNYXRoLmZsb29yKChpICsgYSkgLyAyKV0pIDw9IGUpIHtcbiAgICAgICAgICBpZiAobyA9PT0gbiB8fCBlIDwgdFtvICsgMV0pIHJldHVybiBvO1xuICAgICAgICAgIGkgPSBvICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShyID4gZSkpIHRocm93IG5ldyBjZShcIklucHV0IGlzIG5vdCBhIG51bWJlci5cIik7XG4gICAgICAgICAgYSA9IG8gLSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHFlLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSBpICYmIChpID0ge30pLCBlID8gdGhpcy5jb25jYXQoZSwgciwgbikuX3BhcnNlKHQsIGkpIDogdGhpcy5fcGFyc2UodCwgaSk7XG4gICAgfSwgcWUucHJvdG90eXBlLl9wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmdW5jdGlvbiByKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXNzZXJ0XCIgPT09IHIgPyBuZXcgZmUoZSwgW3RdKSA6IFwiY29lcmNlXCIgPT09IHIgPyBuZXcgdmUoZSwgW3RdKSA6IHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsICE9PSB0ICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIHQgJiYgXCJib29sZWFuXCIgIT0gdHlwZW9mIHQgJiYgXCJudW1iZXJcIiAhPSB0eXBlb2YgdCB8fCAodCA9IFtcImxpdGVyYWxcIiwgdF0pLCBBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgcmV0dXJuIHRoaXMuZXJyb3IoJ0V4cGVjdGVkIGFuIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbXV0uJyk7XG4gICAgICAgIHZhciBuID0gdFswXTtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIG4pIHJldHVybiB0aGlzLmVycm9yKFwiRXhwcmVzc2lvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCBmb3VuZCBcIiArIHR5cGVvZiBuICsgJyBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLicsIDApLCBudWxsO1xuICAgICAgICB2YXIgaSA9IHRoaXMucmVnaXN0cnlbbl07XG5cbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICB2YXIgYSA9IGkucGFyc2UodCwgdGhpcyk7XG4gICAgICAgICAgaWYgKCFhKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgIGlmICh0aGlzLmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgdmFyIG8gPSB0aGlzLmV4cGVjdGVkVHlwZSxcbiAgICAgICAgICAgICAgICBzID0gYS50eXBlO1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT09IG8ua2luZCAmJiBcIm51bWJlclwiICE9PSBvLmtpbmQgJiYgXCJib29sZWFuXCIgIT09IG8ua2luZCAmJiBcIm9iamVjdFwiICE9PSBvLmtpbmQgJiYgXCJhcnJheVwiICE9PSBvLmtpbmQgfHwgXCJ2YWx1ZVwiICE9PSBzLmtpbmQpIHtcbiAgICAgICAgICAgICAgaWYgKFwiY29sb3JcIiAhPT0gby5raW5kICYmIFwiZm9ybWF0dGVkXCIgIT09IG8ua2luZCAmJiBcInJlc29sdmVkSW1hZ2VcIiAhPT0gby5raW5kIHx8IFwidmFsdWVcIiAhPT0gcy5raW5kICYmIFwic3RyaW5nXCIgIT09IHMua2luZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrU3VidHlwZShvLCBzKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSBhID0gcihhLCBvLCBlLnR5cGVBbm5vdGF0aW9uIHx8IFwiY29lcmNlXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGEgPSByKGEsIG8sIGUudHlwZUFubm90YXRpb24gfHwgXCJhc3NlcnRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEoYSBpbnN0YW5jZW9mIHBlKSAmJiBcInJlc29sdmVkSW1hZ2VcIiAhPT0gYS50eXBlLmtpbmQgJiYgZnVuY3Rpb24gdChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGplKSByZXR1cm4gdChlLmJvdW5kRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGJlICYmIFwiZXJyb3JcIiA9PT0gZS5uYW1lKSByZXR1cm4gITE7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHdlKSByZXR1cm4gITE7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIExlKSByZXR1cm4gITE7XG4gICAgICAgICAgICB2YXIgciA9IGUgaW5zdGFuY2VvZiB2ZSB8fCBlIGluc3RhbmNlb2YgZmUsXG4gICAgICAgICAgICAgICAgbiA9ICEwO1xuICAgICAgICAgICAgcmV0dXJuIGUuZWFjaENoaWxkKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIG4gPSByID8gbiAmJiB0KGUpIDogbiAmJiBlIGluc3RhbmNlb2YgcGU7XG4gICAgICAgICAgICB9KSwgISFuICYmIFJlKGUpICYmIFVlKGUsIFtcInpvb21cIiwgXCJoZWF0bWFwLWRlbnNpdHlcIiwgXCJsaW5lLXByb2dyZXNzXCIsIFwiYWNjdW11bGF0ZWRcIiwgXCJpcy1zdXBwb3J0ZWQtc2NyaXB0XCJdKTtcbiAgICAgICAgICB9KGEpKSB7XG4gICAgICAgICAgICB2YXIgdSA9IG5ldyB4ZSgpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhID0gbmV3IHBlKGEudHlwZSwgYS5ldmFsdWF0ZSh1KSk7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKHQubWVzc2FnZSksIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcignVW5rbm93biBleHByZXNzaW9uIFwiJyArIG4gKyAnXCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uJywgMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmVycm9yKHZvaWQgMCA9PT0gdCA/IFwiJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5cIiA6IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgPyAnQmFyZSBvYmplY3RzIGludmFsaWQuIFVzZSBbXCJsaXRlcmFsXCIsIHsuLi59XSBpbnN0ZWFkLicgOiBcIkV4cGVjdGVkIGFuIGFycmF5LCBidXQgZm91bmQgXCIgKyB0eXBlb2YgdCArIFwiIGluc3RlYWQuXCIpO1xuICAgIH0sIHFlLnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBcIm51bWJlclwiID09IHR5cGVvZiB0ID8gdGhpcy5wYXRoLmNvbmNhdCh0KSA6IHRoaXMucGF0aCxcbiAgICAgICAgICBpID0gciA/IHRoaXMuc2NvcGUuY29uY2F0KHIpIDogdGhpcy5zY29wZTtcbiAgICAgIHJldHVybiBuZXcgcWUodGhpcy5yZWdpc3RyeSwgbiwgZSB8fCBudWxsLCBpLCB0aGlzLmVycm9ycyk7XG4gICAgfSwgcWUucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSBbXSwgciA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyByLS0gPiAwOykge1xuICAgICAgICBlW3JdID0gYXJndW1lbnRzW3IgKyAxXTtcbiAgICAgIH1cblxuICAgICAgdmFyIG4gPSBcIlwiICsgdGhpcy5rZXkgKyBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB0ICsgXCJdXCI7XG4gICAgICB9KS5qb2luKFwiXCIpO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgRHQobiwgdCkpO1xuICAgIH0sIHFlLnByb3RvdHlwZS5jaGVja1N1YnR5cGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSAkdCh0LCBlKTtcbiAgICAgIHJldHVybiByICYmIHRoaXMuZXJyb3IociksIHI7XG4gICAgfTtcblxuICAgIHZhciBLZSA9IGZ1bmN0aW9uIEtlKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuaW5wdXQgPSBlLCB0aGlzLmxhYmVscyA9IFtdLCB0aGlzLm91dHB1dHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSByOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl0sXG4gICAgICAgICAgICBvID0gYVsxXTtcbiAgICAgICAgdGhpcy5sYWJlbHMucHVzaChhWzBdKSwgdGhpcy5vdXRwdXRzLnB1c2gobyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEdlKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0ICogKDEgLSByKSArIGUgKiByO1xuICAgIH1cblxuICAgIEtlLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCAtIDEgPCA0KSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIuXCIpO1xuICAgICAgaWYgKCh0Lmxlbmd0aCAtIDEpICUgMiAhPSAwKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5cIik7XG4gICAgICB2YXIgciA9IGUucGFyc2UodFsxXSwgMSwgT3QpO1xuICAgICAgaWYgKCFyKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBuID0gW10sXG4gICAgICAgICAgaSA9IG51bGw7XG4gICAgICBlLmV4cGVjdGVkVHlwZSAmJiBcInZhbHVlXCIgIT09IGUuZXhwZWN0ZWRUeXBlLmtpbmQgJiYgKGkgPSBlLmV4cGVjdGVkVHlwZSk7XG5cbiAgICAgIGZvciAodmFyIGEgPSAxOyBhIDwgdC5sZW5ndGg7IGEgKz0gMikge1xuICAgICAgICB2YXIgbyA9IDEgPT09IGEgPyAtMSAvIDAgOiB0W2FdLFxuICAgICAgICAgICAgcyA9IHRbYSArIDFdLFxuICAgICAgICAgICAgdSA9IGEsXG4gICAgICAgICAgICBsID0gYSArIDE7XG4gICAgICAgIGlmIChcIm51bWJlclwiICE9IHR5cGVvZiBvKSByZXR1cm4gZS5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCB1KTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoICYmIG5bbi5sZW5ndGggLSAxXVswXSA+PSBvKSByZXR1cm4gZS5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCB1KTtcbiAgICAgICAgdmFyIHAgPSBlLnBhcnNlKHMsIGwsIGkpO1xuICAgICAgICBpZiAoIXApIHJldHVybiBudWxsO1xuICAgICAgICBpID0gaSB8fCBwLnR5cGUsIG4ucHVzaChbbywgcF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEtlKGksIHIsIG4pO1xuICAgIH0sIEtlLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMubGFiZWxzLFxuICAgICAgICAgIHIgPSB0aGlzLm91dHB1dHM7XG4gICAgICBpZiAoMSA9PT0gZS5sZW5ndGgpIHJldHVybiByWzBdLmV2YWx1YXRlKHQpO1xuICAgICAgdmFyIG4gPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKG4gPD0gZVswXSkgcmV0dXJuIHJbMF0uZXZhbHVhdGUodCk7XG4gICAgICB2YXIgaSA9IGUubGVuZ3RoO1xuICAgICAgcmV0dXJuIG4gPj0gZVtpIC0gMV0gPyByW2kgLSAxXS5ldmFsdWF0ZSh0KSA6IHJbTmUoZSwgbildLmV2YWx1YXRlKHQpO1xuICAgIH0sIEtlLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmlucHV0KTtcblxuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0aGlzLm91dHB1dHM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIHQocltlXSk7XG4gICAgICB9XG4gICAgfSwgS2UucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm91dHB1dERlZmluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0sIEtlLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gW1wic3RlcFwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXSwgZSA9IDA7IGUgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGUrKykge1xuICAgICAgICBlID4gMCAmJiB0LnB1c2godGhpcy5sYWJlbHNbZV0pLCB0LnB1c2godGhpcy5vdXRwdXRzW2VdLnNlcmlhbGl6ZSgpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICB2YXIgWmUgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgIG51bWJlcjogR2UsXG4gICAgICBjb2xvcjogZnVuY3Rpb24gY29sb3IodCwgZSwgcikge1xuICAgICAgICByZXR1cm4gbmV3IGVlKEdlKHQuciwgZS5yLCByKSwgR2UodC5nLCBlLmcsIHIpLCBHZSh0LmIsIGUuYiwgciksIEdlKHQuYSwgZS5hLCByKSk7XG4gICAgICB9LFxuICAgICAgYXJyYXk6IGZ1bmN0aW9uIGFycmF5KHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIHQubWFwKGZ1bmN0aW9uICh0LCBuKSB7XG4gICAgICAgICAgcmV0dXJuIEdlKHQsIGVbbl0sIHIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAgICAgWGUgPSA2IC8gMjkgKiAzICogKDYgLyAyOSksXG4gICAgICAgIEplID0gTWF0aC5QSSAvIDE4MCxcbiAgICAgICAgSGUgPSAxODAgLyBNYXRoLlBJO1xuXG4gICAgZnVuY3Rpb24gWWUodCkge1xuICAgICAgcmV0dXJuIHQgPiAuMDA4ODU2NDUxNjc5MDM1NjMxID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIFhlICsgNCAvIDI5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICRlKHQpIHtcbiAgICAgIHJldHVybiB0ID4gNiAvIDI5ID8gdCAqIHQgKiB0IDogWGUgKiAodCAtIDQgLyAyOSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV2UodCkge1xuICAgICAgcmV0dXJuIDI1NSAqICh0IDw9IC4wMDMxMzA4ID8gMTIuOTIgKiB0IDogMS4wNTUgKiBNYXRoLnBvdyh0LCAxIC8gMi40KSAtIC4wNTUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFFlKHQpIHtcbiAgICAgIHJldHVybiAodCAvPSAyNTUpIDw9IC4wNDA0NSA/IHQgLyAxMi45MiA6IE1hdGgucG93KCh0ICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cih0KSB7XG4gICAgICB2YXIgZSA9IFFlKHQuciksXG4gICAgICAgICAgciA9IFFlKHQuZyksXG4gICAgICAgICAgbiA9IFFlKHQuYiksXG4gICAgICAgICAgaSA9IFllKCguNDEyNDU2NCAqIGUgKyAuMzU3NTc2MSAqIHIgKyAuMTgwNDM3NSAqIG4pIC8gLjk1MDQ3KSxcbiAgICAgICAgICBhID0gWWUoKC4yMTI2NzI5ICogZSArIC43MTUxNTIyICogciArIC4wNzIxNzUgKiBuKSAvIDEpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbDogMTE2ICogYSAtIDE2LFxuICAgICAgICBhOiA1MDAgKiAoaSAtIGEpLFxuICAgICAgICBiOiAyMDAgKiAoYSAtIFllKCguMDE5MzMzOSAqIGUgKyAuMTE5MTkyICogciArIC45NTAzMDQxICogbikgLyAxLjA4ODgzKSksXG4gICAgICAgIGFscGhhOiB0LmFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXIodCkge1xuICAgICAgdmFyIGUgPSAodC5sICsgMTYpIC8gMTE2LFxuICAgICAgICAgIHIgPSBpc05hTih0LmEpID8gZSA6IGUgKyB0LmEgLyA1MDAsXG4gICAgICAgICAgbiA9IGlzTmFOKHQuYikgPyBlIDogZSAtIHQuYiAvIDIwMDtcbiAgICAgIHJldHVybiBlID0gMSAqICRlKGUpLCByID0gLjk1MDQ3ICogJGUociksIG4gPSAxLjA4ODgzICogJGUobiksIG5ldyBlZShXZSgzLjI0MDQ1NDIgKiByIC0gMS41MzcxMzg1ICogZSAtIC40OTg1MzE0ICogbiksIFdlKC0uOTY5MjY2ICogciArIDEuODc2MDEwOCAqIGUgKyAuMDQxNTU2ICogbiksIFdlKC4wNTU2NDM0ICogciAtIC4yMDQwMjU5ICogZSArIDEuMDU3MjI1MiAqIG4pLCB0LmFscGhhKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBycih0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGUgLSB0O1xuICAgICAgcmV0dXJuIHQgKyByICogKG4gPiAxODAgfHwgbiA8IC0xODAgPyBuIC0gMzYwICogTWF0aC5yb3VuZChuIC8gMzYwKSA6IG4pO1xuICAgIH1cblxuICAgIHZhciBuciA9IHtcbiAgICAgIGZvcndhcmQ6IHRyLFxuICAgICAgcmV2ZXJzZTogZXIsXG4gICAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGUodCwgZSwgcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGw6IEdlKHQubCwgZS5sLCByKSxcbiAgICAgICAgICBhOiBHZSh0LmEsIGUuYSwgciksXG4gICAgICAgICAgYjogR2UodC5iLCBlLmIsIHIpLFxuICAgICAgICAgIGFscGhhOiBHZSh0LmFscGhhLCBlLmFscGhhLCByKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIGlyID0ge1xuICAgICAgZm9yd2FyZDogZnVuY3Rpb24gZm9yd2FyZCh0KSB7XG4gICAgICAgIHZhciBlID0gdHIodCksXG4gICAgICAgICAgICByID0gZS5sLFxuICAgICAgICAgICAgbiA9IGUuYSxcbiAgICAgICAgICAgIGkgPSBlLmIsXG4gICAgICAgICAgICBhID0gTWF0aC5hdGFuMihpLCBuKSAqIEhlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGg6IGEgPCAwID8gYSArIDM2MCA6IGEsXG4gICAgICAgICAgYzogTWF0aC5zcXJ0KG4gKiBuICsgaSAqIGkpLFxuICAgICAgICAgIGw6IHIsXG4gICAgICAgICAgYWxwaGE6IHQuYVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UodCkge1xuICAgICAgICB2YXIgZSA9IHQuaCAqIEplLFxuICAgICAgICAgICAgciA9IHQuYztcbiAgICAgICAgcmV0dXJuIGVyKHtcbiAgICAgICAgICBsOiB0LmwsXG4gICAgICAgICAgYTogTWF0aC5jb3MoZSkgKiByLFxuICAgICAgICAgIGI6IE1hdGguc2luKGUpICogcixcbiAgICAgICAgICBhbHBoYTogdC5hbHBoYVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24gaW50ZXJwb2xhdGUodCwgZSwgcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGg6IHJyKHQuaCwgZS5oLCByKSxcbiAgICAgICAgICBjOiBHZSh0LmMsIGUuYywgciksXG4gICAgICAgICAgbDogR2UodC5sLCBlLmwsIHIpLFxuICAgICAgICAgIGFscGhhOiBHZSh0LmFscGhhLCBlLmFscGhhLCByKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIGFyID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICBsYWI6IG5yLFxuICAgICAgaGNsOiBpclxuICAgIH0pLFxuICAgICAgICBvciA9IGZ1bmN0aW9uIG9yKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMub3BlcmF0b3IgPSBlLCB0aGlzLmludGVycG9sYXRpb24gPSByLCB0aGlzLmlucHV0ID0gbiwgdGhpcy5sYWJlbHMgPSBbXSwgdGhpcy5vdXRwdXRzID0gW107XG5cbiAgICAgIGZvciAodmFyIGEgPSAwLCBvID0gaTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgdmFyIHMgPSBvW2FdLFxuICAgICAgICAgICAgdSA9IHNbMV07XG4gICAgICAgIHRoaXMubGFiZWxzLnB1c2goc1swXSksIHRoaXMub3V0cHV0cy5wdXNoKHUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzcih0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IG4gLSByLFxuICAgICAgICAgIGEgPSB0IC0gcjtcbiAgICAgIHJldHVybiAwID09PSBpID8gMCA6IDEgPT09IGUgPyBhIC8gaSA6IChNYXRoLnBvdyhlLCBhKSAtIDEpIC8gKE1hdGgucG93KGUsIGkpIC0gMSk7XG4gICAgfVxuXG4gICAgb3IuaW50ZXJwb2xhdGlvbkZhY3RvciA9IGZ1bmN0aW9uICh0LCBlLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9IDA7XG4gICAgICBpZiAoXCJleHBvbmVudGlhbFwiID09PSB0Lm5hbWUpIGEgPSBzcihlLCB0LmJhc2UsIG4sIGkpO2Vsc2UgaWYgKFwibGluZWFyXCIgPT09IHQubmFtZSkgYSA9IHNyKGUsIDEsIG4sIGkpO2Vsc2UgaWYgKFwiY3ViaWMtYmV6aWVyXCIgPT09IHQubmFtZSkge1xuICAgICAgICB2YXIgbyA9IHQuY29udHJvbFBvaW50cztcbiAgICAgICAgYSA9IG5ldyByKG9bMF0sIG9bMV0sIG9bMl0sIG9bM10pLnNvbHZlKHNyKGUsIDEsIG4sIGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhO1xuICAgIH0sIG9yLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdFswXSxcbiAgICAgICAgICBuID0gdFsxXSxcbiAgICAgICAgICBpID0gdFsyXSxcbiAgICAgICAgICBhID0gdC5zbGljZSgzKTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShuKSB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5cIiwgMSk7XG4gICAgICBpZiAoXCJsaW5lYXJcIiA9PT0gblswXSkgbiA9IHtcbiAgICAgICAgbmFtZTogXCJsaW5lYXJcIlxuICAgICAgfTtlbHNlIGlmIChcImV4cG9uZW50aWFsXCIgPT09IG5bMF0pIHtcbiAgICAgICAgdmFyIG8gPSBuWzFdO1xuICAgICAgICBpZiAoXCJudW1iZXJcIiAhPSB0eXBlb2YgbykgcmV0dXJuIGUuZXJyb3IoXCJFeHBvbmVudGlhbCBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGEgbnVtZXJpYyBiYXNlLlwiLCAxLCAxKTtcbiAgICAgICAgbiA9IHtcbiAgICAgICAgICBuYW1lOiBcImV4cG9uZW50aWFsXCIsXG4gICAgICAgICAgYmFzZTogb1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFwiY3ViaWMtYmV6aWVyXCIgIT09IG5bMF0pIHJldHVybiBlLmVycm9yKFwiVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgXCIgKyBTdHJpbmcoblswXSksIDEsIDApO1xuICAgICAgICB2YXIgcyA9IG4uc2xpY2UoMSk7XG4gICAgICAgIGlmICg0ICE9PSBzLmxlbmd0aCB8fCBzLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudW1iZXJcIiAhPSB0eXBlb2YgdCB8fCB0IDwgMCB8fCB0ID4gMTtcbiAgICAgICAgfSkpIHJldHVybiBlLmVycm9yKFwiQ3ViaWMgYmV6aWVyIGludGVycG9sYXRpb24gcmVxdWlyZXMgZm91ciBudW1lcmljIGFyZ3VtZW50cyB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuXCIsIDEpO1xuICAgICAgICBuID0ge1xuICAgICAgICAgIG5hbWU6IFwiY3ViaWMtYmV6aWVyXCIsXG4gICAgICAgICAgY29udHJvbFBvaW50czogc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHQubGVuZ3RoIC0gMSA8IDQpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5IFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIi5cIik7XG4gICAgICBpZiAoKHQubGVuZ3RoIC0gMSkgJSAyICE9IDApIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLlwiKTtcbiAgICAgIGlmICghKGkgPSBlLnBhcnNlKGksIDIsIE90KSkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHUgPSBbXSxcbiAgICAgICAgICBsID0gbnVsbDtcbiAgICAgIFwiaW50ZXJwb2xhdGUtaGNsXCIgPT09IHIgfHwgXCJpbnRlcnBvbGF0ZS1sYWJcIiA9PT0gciA/IGwgPSBxdCA6IGUuZXhwZWN0ZWRUeXBlICYmIFwidmFsdWVcIiAhPT0gZS5leHBlY3RlZFR5cGUua2luZCAmJiAobCA9IGUuZXhwZWN0ZWRUeXBlKTtcblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBhLmxlbmd0aDsgcCArPSAyKSB7XG4gICAgICAgIHZhciBjID0gYVtwXSxcbiAgICAgICAgICAgIGggPSBhW3AgKyAxXSxcbiAgICAgICAgICAgIGYgPSBwICsgMyxcbiAgICAgICAgICAgIHkgPSBwICsgNDtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgIT0gdHlwZW9mIGMpIHJldHVybiBlLmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBmKTtcbiAgICAgICAgaWYgKHUubGVuZ3RoICYmIHVbdS5sZW5ndGggLSAxXVswXSA+PSBjKSByZXR1cm4gZS5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgZik7XG4gICAgICAgIHZhciBkID0gZS5wYXJzZShoLCB5LCBsKTtcbiAgICAgICAgaWYgKCFkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbCA9IGwgfHwgZC50eXBlLCB1LnB1c2goW2MsIGRdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IGwua2luZCB8fCBcImNvbG9yXCIgPT09IGwua2luZCB8fCBcImFycmF5XCIgPT09IGwua2luZCAmJiBcIm51bWJlclwiID09PSBsLml0ZW1UeXBlLmtpbmQgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2YgbC5OID8gbmV3IG9yKGwsIHIsIG4sIGksIHUpIDogZS5lcnJvcihcIlR5cGUgXCIgKyBIdChsKSArIFwiIGlzIG5vdCBpbnRlcnBvbGF0YWJsZS5cIik7XG4gICAgfSwgb3IucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5sYWJlbHMsXG4gICAgICAgICAgciA9IHRoaXMub3V0cHV0cztcbiAgICAgIGlmICgxID09PSBlLmxlbmd0aCkgcmV0dXJuIHJbMF0uZXZhbHVhdGUodCk7XG4gICAgICB2YXIgbiA9IHRoaXMuaW5wdXQuZXZhbHVhdGUodCk7XG4gICAgICBpZiAobiA8PSBlWzBdKSByZXR1cm4gclswXS5ldmFsdWF0ZSh0KTtcbiAgICAgIHZhciBpID0gZS5sZW5ndGg7XG4gICAgICBpZiAobiA+PSBlW2kgLSAxXSkgcmV0dXJuIHJbaSAtIDFdLmV2YWx1YXRlKHQpO1xuICAgICAgdmFyIGEgPSBOZShlLCBuKSxcbiAgICAgICAgICBvID0gb3IuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIG4sIGVbYV0sIGVbYSArIDFdKSxcbiAgICAgICAgICBzID0gclthXS5ldmFsdWF0ZSh0KSxcbiAgICAgICAgICB1ID0gclthICsgMV0uZXZhbHVhdGUodCk7XG4gICAgICByZXR1cm4gXCJpbnRlcnBvbGF0ZVwiID09PSB0aGlzLm9wZXJhdG9yID8gWmVbdGhpcy50eXBlLmtpbmQudG9Mb3dlckNhc2UoKV0ocywgdSwgbykgOiBcImludGVycG9sYXRlLWhjbFwiID09PSB0aGlzLm9wZXJhdG9yID8gaXIucmV2ZXJzZShpci5pbnRlcnBvbGF0ZShpci5mb3J3YXJkKHMpLCBpci5mb3J3YXJkKHUpLCBvKSkgOiBuci5yZXZlcnNlKG5yLmludGVycG9sYXRlKG5yLmZvcndhcmQocyksIG5yLmZvcndhcmQodSksIG8pKTtcbiAgICB9LCBvci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5pbnB1dCk7XG5cbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5vdXRwdXRzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB0KHJbZV0pO1xuICAgICAgfVxuICAgIH0sIG9yLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0cy5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5vdXRwdXREZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgICB9LCBvci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQ7XG4gICAgICB0ID0gXCJsaW5lYXJcIiA9PT0gdGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPyBbXCJsaW5lYXJcIl0gOiBcImV4cG9uZW50aWFsXCIgPT09IHRoaXMuaW50ZXJwb2xhdGlvbi5uYW1lID8gMSA9PT0gdGhpcy5pbnRlcnBvbGF0aW9uLmJhc2UgPyBbXCJsaW5lYXJcIl0gOiBbXCJleHBvbmVudGlhbFwiLCB0aGlzLmludGVycG9sYXRpb24uYmFzZV0gOiBbXCJjdWJpYy1iZXppZXJcIl0uY29uY2F0KHRoaXMuaW50ZXJwb2xhdGlvbi5jb250cm9sUG9pbnRzKTtcblxuICAgICAgZm9yICh2YXIgZSA9IFt0aGlzLm9wZXJhdG9yLCB0LCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXSwgciA9IDA7IHIgPCB0aGlzLmxhYmVscy5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLnB1c2godGhpcy5sYWJlbHNbcl0sIHRoaXMub3V0cHV0c1tyXS5zZXJpYWxpemUoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH07XG5cbiAgICB2YXIgdXIgPSBmdW5jdGlvbiB1cih0LCBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmFyZ3MgPSBlO1xuICAgIH07XG5cbiAgICB1ci5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPCAyKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5cIik7XG4gICAgICB2YXIgciA9IG51bGwsXG4gICAgICAgICAgbiA9IGUuZXhwZWN0ZWRUeXBlO1xuICAgICAgbiAmJiBcInZhbHVlXCIgIT09IG4ua2luZCAmJiAociA9IG4pO1xuXG4gICAgICBmb3IgKHZhciBpID0gW10sIGEgPSAwLCBvID0gdC5zbGljZSgxKTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgdmFyIHMgPSBlLnBhcnNlKG9bYV0sIDEgKyBpLmxlbmd0aCwgciwgdm9pZCAwLCB7XG4gICAgICAgICAgdHlwZUFubm90YXRpb246IFwib21pdFwiXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXMpIHJldHVybiBudWxsO1xuICAgICAgICByID0gciB8fCBzLnR5cGUsIGkucHVzaChzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHUgPSBuICYmIGkuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gJHQobiwgdC50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyB1cih1ID8gS3QgOiByLCBpKTtcbiAgICB9LCB1ci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSwgciA9IG51bGwsIG4gPSAwLCBpID0gMCwgYSA9IHRoaXMuYXJnczsgaSA8IGEubGVuZ3RoICYmIChuKyssIChyID0gYVtpXS5ldmFsdWF0ZSh0KSkgJiYgciBpbnN0YW5jZW9mIGFlICYmICFyLmF2YWlsYWJsZSAmJiAoZSB8fCAoZSA9IHIubmFtZSksIHIgPSBudWxsLCBuID09PSB0aGlzLmFyZ3MubGVuZ3RoICYmIChyID0gZSkpLCBudWxsID09PSByKTsgaSArPSAxKSB7XG4gICAgICAgIDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgdXIucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmFyZ3MuZm9yRWFjaCh0KTtcbiAgICB9LCB1ci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQub3V0cHV0RGVmaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSwgdXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gW1wiY29hbGVzY2VcIl07XG4gICAgICByZXR1cm4gdGhpcy5lYWNoQ2hpbGQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdC5wdXNoKGUuc2VyaWFsaXplKCkpO1xuICAgICAgfSksIHQ7XG4gICAgfTtcblxuICAgIHZhciBsciA9IGZ1bmN0aW9uIGxyKHQsIGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IGUudHlwZSwgdGhpcy5iaW5kaW5ncyA9IFtdLmNvbmNhdCh0KSwgdGhpcy5yZXN1bHQgPSBlO1xuICAgIH07XG5cbiAgICBsci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzdWx0LmV2YWx1YXRlKHQpO1xuICAgIH0sIGxyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0aGlzLmJpbmRpbmdzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB0KHJbZV1bMV0pO1xuICAgICAgfVxuXG4gICAgICB0KHRoaXMucmVzdWx0KTtcbiAgICB9LCBsci5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPCA0KSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiIGluc3RlYWQuXCIpO1xuXG4gICAgICBmb3IgKHZhciByID0gW10sIG4gPSAxOyBuIDwgdC5sZW5ndGggLSAxOyBuICs9IDIpIHtcbiAgICAgICAgdmFyIGkgPSB0W25dO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBzdHJpbmcsIGJ1dCBmb3VuZCBcIiArIHR5cGVvZiBpICsgXCIgaW5zdGVhZC5cIiwgbik7XG4gICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChpKSkgcmV0dXJuIGUuZXJyb3IoXCJWYXJpYWJsZSBuYW1lcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciAnXycuXCIsIG4pO1xuICAgICAgICB2YXIgYSA9IGUucGFyc2UodFtuICsgMV0sIG4gKyAxKTtcbiAgICAgICAgaWYgKCFhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgci5wdXNoKFtpLCBhXSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvID0gZS5wYXJzZSh0W3QubGVuZ3RoIC0gMV0sIHQubGVuZ3RoIC0gMSwgZS5leHBlY3RlZFR5cGUsIHIpO1xuICAgICAgcmV0dXJuIG8gPyBuZXcgbHIociwgbykgOiBudWxsO1xuICAgIH0sIGxyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzdWx0Lm91dHB1dERlZmluZWQoKTtcbiAgICB9LCBsci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IFtcImxldFwiXSwgZSA9IDAsIHIgPSB0aGlzLmJpbmRpbmdzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IHJbZV07XG4gICAgICAgIHQucHVzaChuWzBdLCBuWzFdLnNlcmlhbGl6ZSgpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQucHVzaCh0aGlzLnJlc3VsdC5zZXJpYWxpemUoKSksIHQ7XG4gICAgfTtcblxuICAgIHZhciBwciA9IGZ1bmN0aW9uIHByKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuaW5kZXggPSBlLCB0aGlzLmlucHV0ID0gcjtcbiAgICB9O1xuXG4gICAgcHIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDMgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEsIE90KSxcbiAgICAgICAgICBuID0gZS5wYXJzZSh0WzJdLCAyLCBKdChlLmV4cGVjdGVkVHlwZSB8fCBLdCkpO1xuICAgICAgcmV0dXJuIHIgJiYgbiA/IG5ldyBwcihuLnR5cGUuaXRlbVR5cGUsIHIsIG4pIDogbnVsbDtcbiAgICB9LCBwci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmluZGV4LmV2YWx1YXRlKHQpLFxuICAgICAgICAgIHIgPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKGUgPCAwKSB0aHJvdyBuZXcgY2UoXCJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzOiBcIiArIGUgKyBcIiA8IDAuXCIpO1xuICAgICAgaWYgKGUgPj0gci5sZW5ndGgpIHRocm93IG5ldyBjZShcIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6IFwiICsgZSArIFwiID4gXCIgKyAoci5sZW5ndGggLSAxKSArIFwiLlwiKTtcbiAgICAgIGlmIChlICE9PSBNYXRoLmZsb29yKGUpKSB0aHJvdyBuZXcgY2UoXCJBcnJheSBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBmb3VuZCBcIiArIGUgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIHJldHVybiByW2VdO1xuICAgIH0sIHByLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmluZGV4KSwgdCh0aGlzLmlucHV0KTtcbiAgICB9LCBwci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBwci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtcImF0XCIsIHRoaXMuaW5kZXguc2VyaWFsaXplKCksIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH07XG5cbiAgICB2YXIgY3IgPSBmdW5jdGlvbiBjcih0LCBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSBqdCwgdGhpcy5uZWVkbGUgPSB0LCB0aGlzLmhheXN0YWNrID0gZTtcbiAgICB9O1xuXG4gICAgY3IucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDMgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEsIEt0KSxcbiAgICAgICAgICBuID0gZS5wYXJzZSh0WzJdLCAyLCBLdCk7XG4gICAgICByZXR1cm4gciAmJiBuID8gV3Qoci50eXBlLCBbanQsIFV0LCBPdCwgUnQsIEt0XSkgPyBuZXcgY3IociwgbikgOiBlLmVycm9yKFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgXCIgKyBIdChyLnR5cGUpICsgXCIgaW5zdGVhZFwiKSA6IG51bGw7XG4gICAgfSwgY3IucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5uZWVkbGUuZXZhbHVhdGUodCksXG4gICAgICAgICAgciA9IHRoaXMuaGF5c3RhY2suZXZhbHVhdGUodCk7XG4gICAgICBpZiAoIXIpIHJldHVybiAhMTtcbiAgICAgIGlmICghUXQoZSwgW1wiYm9vbGVhblwiLCBcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm51bGxcIl0pKSB0aHJvdyBuZXcgY2UoXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCBcIiArIEh0KHVlKGUpKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgaWYgKCFRdChyLCBbXCJzdHJpbmdcIiwgXCJhcnJheVwiXSkpIHRocm93IG5ldyBjZShcIkV4cGVjdGVkIHNlY29uZCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kIFwiICsgSHQodWUocikpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICByZXR1cm4gci5pbmRleE9mKGUpID49IDA7XG4gICAgfSwgY3IucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMubmVlZGxlKSwgdCh0aGlzLmhheXN0YWNrKTtcbiAgICB9LCBjci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9LCBjci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtcImluXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpXTtcbiAgICB9O1xuXG4gICAgdmFyIGhyID0gZnVuY3Rpb24gaHIodCwgZSwgcikge1xuICAgICAgdGhpcy50eXBlID0gT3QsIHRoaXMubmVlZGxlID0gdCwgdGhpcy5oYXlzdGFjayA9IGUsIHRoaXMuZnJvbUluZGV4ID0gcjtcbiAgICB9O1xuXG4gICAgaHIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDw9IDIgfHwgdC5sZW5ndGggPj0gNSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCAzIG9yIDQgYXJndW1lbnRzLCBidXQgZm91bmQgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiIGluc3RlYWQuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEsIEt0KSxcbiAgICAgICAgICBuID0gZS5wYXJzZSh0WzJdLCAyLCBLdCk7XG4gICAgICBpZiAoIXIgfHwgIW4pIHJldHVybiBudWxsO1xuICAgICAgaWYgKCFXdChyLnR5cGUsIFtqdCwgVXQsIE90LCBSdCwgS3RdKSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCBcIiArIEh0KHIudHlwZSkgKyBcIiBpbnN0ZWFkXCIpO1xuXG4gICAgICBpZiAoNCA9PT0gdC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGkgPSBlLnBhcnNlKHRbM10sIDMsIE90KTtcbiAgICAgICAgcmV0dXJuIGkgPyBuZXcgaHIociwgbiwgaSkgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IGhyKHIsIG4pO1xuICAgIH0sIGhyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMubmVlZGxlLmV2YWx1YXRlKHQpLFxuICAgICAgICAgIHIgPSB0aGlzLmhheXN0YWNrLmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKCFRdChlLCBbXCJib29sZWFuXCIsIFwic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwibnVsbFwiXSkpIHRocm93IG5ldyBjZShcIkV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kIFwiICsgSHQodWUoZSkpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICBpZiAoIVF0KHIsIFtcInN0cmluZ1wiLCBcImFycmF5XCJdKSkgdGhyb3cgbmV3IGNlKFwiRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgXCIgKyBIdCh1ZShyKSkgKyBcIiBpbnN0ZWFkLlwiKTtcblxuICAgICAgaWYgKHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5mcm9tSW5kZXguZXZhbHVhdGUodCk7XG4gICAgICAgIHJldHVybiByLmluZGV4T2YoZSwgbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByLmluZGV4T2YoZSk7XG4gICAgfSwgaHIucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMubmVlZGxlKSwgdCh0aGlzLmhheXN0YWNrKSwgdGhpcy5mcm9tSW5kZXggJiYgdCh0aGlzLmZyb21JbmRleCk7XG4gICAgfSwgaHIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgaHIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChudWxsICE9IHRoaXMuZnJvbUluZGV4ICYmIHZvaWQgMCAhPT0gdGhpcy5mcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmZyb21JbmRleC5zZXJpYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpLCB0XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpXTtcbiAgICB9O1xuXG4gICAgdmFyIGZyID0gZnVuY3Rpb24gZnIodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdGhpcy5pbnB1dFR5cGUgPSB0LCB0aGlzLnR5cGUgPSBlLCB0aGlzLmlucHV0ID0gciwgdGhpcy5jYXNlcyA9IG4sIHRoaXMub3V0cHV0cyA9IGksIHRoaXMub3RoZXJ3aXNlID0gYTtcbiAgICB9O1xuXG4gICAgZnIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHQubGVuZ3RoIDwgNSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgXCIgKyAodC5sZW5ndGggLSAxKSArIFwiLlwiKTtcbiAgICAgIGlmICh0Lmxlbmd0aCAlIDIgIT0gMSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuXCIpO1xuICAgICAgdmFyIHIsIG47XG4gICAgICBlLmV4cGVjdGVkVHlwZSAmJiBcInZhbHVlXCIgIT09IGUuZXhwZWN0ZWRUeXBlLmtpbmQgJiYgKG4gPSBlLmV4cGVjdGVkVHlwZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSB7fSwgYSA9IFtdLCBvID0gMjsgbyA8IHQubGVuZ3RoIC0gMTsgbyArPSAyKSB7XG4gICAgICAgIHZhciBzID0gdFtvXSxcbiAgICAgICAgICAgIHUgPSB0W28gKyAxXTtcbiAgICAgICAgQXJyYXkuaXNBcnJheShzKSB8fCAocyA9IFtzXSk7XG4gICAgICAgIHZhciBsID0gZS5jb25jYXQobyk7XG4gICAgICAgIGlmICgwID09PSBzLmxlbmd0aCkgcmV0dXJuIGwuZXJyb3IoXCJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYnJhbmNoIGxhYmVsLlwiKTtcblxuICAgICAgICBmb3IgKHZhciBwID0gMCwgYyA9IHM7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgICAgdmFyIGggPSBjW3BdO1xuICAgICAgICAgIGlmIChcIm51bWJlclwiICE9IHR5cGVvZiBoICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIGgpIHJldHVybiBsLmVycm9yKFwiQnJhbmNoIGxhYmVscyBtdXN0IGJlIG51bWJlcnMgb3Igc3RyaW5ncy5cIik7XG4gICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGggJiYgTWF0aC5hYnMoaCkgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgcmV0dXJuIGwuZXJyb3IoXCJCcmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlcnMgbm8gbGFyZ2VyIHRoYW4gXCIgKyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiArIFwiLlwiKTtcbiAgICAgICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgaCAmJiBNYXRoLmZsb29yKGgpICE9PSBoKSByZXR1cm4gbC5lcnJvcihcIk51bWVyaWMgYnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXIgdmFsdWVzLlwiKTtcblxuICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICBpZiAobC5jaGVja1N1YnR5cGUociwgdWUoaCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgciA9IHVlKGgpO1xuXG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaVtTdHJpbmcoaCldKSByZXR1cm4gbC5lcnJvcihcIkJyYW5jaCBsYWJlbHMgbXVzdCBiZSB1bmlxdWUuXCIpO1xuICAgICAgICAgIGlbU3RyaW5nKGgpXSA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGYgPSBlLnBhcnNlKHUsIG8sIG4pO1xuICAgICAgICBpZiAoIWYpIHJldHVybiBudWxsO1xuICAgICAgICBuID0gbiB8fCBmLnR5cGUsIGEucHVzaChmKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHkgPSBlLnBhcnNlKHRbMV0sIDEsIEt0KTtcbiAgICAgIGlmICgheSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZCA9IGUucGFyc2UodFt0Lmxlbmd0aCAtIDFdLCB0Lmxlbmd0aCAtIDEsIG4pO1xuICAgICAgcmV0dXJuIGQgPyBcInZhbHVlXCIgIT09IHkudHlwZS5raW5kICYmIGUuY29uY2F0KDEpLmNoZWNrU3VidHlwZShyLCB5LnR5cGUpID8gbnVsbCA6IG5ldyBmcihyLCBuLCB5LCBpLCBhLCBkKSA6IG51bGw7XG4gICAgfSwgZnIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5pbnB1dC5ldmFsdWF0ZSh0KTtcbiAgICAgIHJldHVybiAodWUoZSkgPT09IHRoaXMuaW5wdXRUeXBlICYmIHRoaXMub3V0cHV0c1t0aGlzLmNhc2VzW2VdXSB8fCB0aGlzLm90aGVyd2lzZSkuZXZhbHVhdGUodCk7XG4gICAgfSwgZnIucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMuaW5wdXQpLCB0aGlzLm91dHB1dHMuZm9yRWFjaCh0KSwgdCh0aGlzLm90aGVyd2lzZSk7XG4gICAgfSwgZnIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm91dHB1dERlZmluZWQoKTtcbiAgICAgIH0pICYmIHRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKTtcbiAgICB9LCBmci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IHRoaXMsIGUgPSBbXCJtYXRjaFwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXSwgciA9IFtdLCBuID0ge30sIGkgPSAwLCBhID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgbyA9IGFbaV07XG4gICAgICAgIHZvaWQgMCA9PT0gKGMgPSBuW3RoaXMuY2FzZXNbb11dKSA/IChuW3RoaXMuY2FzZXNbb11dID0gci5sZW5ndGgsIHIucHVzaChbdGhpcy5jYXNlc1tvXSwgW29dXSkpIDogcltjXVsxXS5wdXNoKG8pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBzID0gZnVuY3Rpb24gcyhlKSB7XG4gICAgICAgIHJldHVybiBcIm51bWJlclwiID09PSB0LmlucHV0VHlwZS5raW5kID8gTnVtYmVyKGUpIDogZTtcbiAgICAgIH0sIHUgPSAwLCBsID0gcjsgdSA8IGwubGVuZ3RoOyB1ICs9IDEpIHtcbiAgICAgICAgdmFyIHAgPSBsW3VdLFxuICAgICAgICAgICAgYyA9IHBbMF0sXG4gICAgICAgICAgICBoID0gcFsxXTtcbiAgICAgICAgZS5wdXNoKDEgPT09IGgubGVuZ3RoID8gcyhoWzBdKSA6IGgubWFwKHMpKSwgZS5wdXNoKHRoaXMub3V0cHV0c1tvdXRwdXRJbmRleCQxXS5zZXJpYWxpemUoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlLnB1c2godGhpcy5vdGhlcndpc2Uuc2VyaWFsaXplKCkpLCBlO1xuICAgIH07XG5cbiAgICB2YXIgeXIgPSBmdW5jdGlvbiB5cih0LCBlLCByKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLmJyYW5jaGVzID0gZSwgdGhpcy5vdGhlcndpc2UgPSByO1xuICAgIH07XG5cbiAgICB5ci5wYXJzZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodC5sZW5ndGggPCA0KSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIuXCIpO1xuICAgICAgaWYgKHQubGVuZ3RoICUgMiAhPSAwKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLlwiKTtcbiAgICAgIHZhciByO1xuICAgICAgZS5leHBlY3RlZFR5cGUgJiYgXCJ2YWx1ZVwiICE9PSBlLmV4cGVjdGVkVHlwZS5raW5kICYmIChyID0gZS5leHBlY3RlZFR5cGUpO1xuXG4gICAgICBmb3IgKHZhciBuID0gW10sIGkgPSAxOyBpIDwgdC5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIGEgPSBlLnBhcnNlKHRbaV0sIGksIGp0KTtcbiAgICAgICAgaWYgKCFhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIG8gPSBlLnBhcnNlKHRbaSArIDFdLCBpICsgMSwgcik7XG4gICAgICAgIGlmICghbykgcmV0dXJuIG51bGw7XG4gICAgICAgIG4ucHVzaChbYSwgb10pLCByID0gciB8fCBvLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzID0gZS5wYXJzZSh0W3QubGVuZ3RoIC0gMV0sIHQubGVuZ3RoIC0gMSwgcik7XG4gICAgICByZXR1cm4gcyA/IG5ldyB5cihyLCBuLCBzKSA6IG51bGw7XG4gICAgfSwgeXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdGhpcy5icmFuY2hlczsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdLFxuICAgICAgICAgICAgaSA9IG5bMV07XG4gICAgICAgIGlmIChuWzBdLmV2YWx1YXRlKHQpKSByZXR1cm4gaS5ldmFsdWF0ZSh0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMub3RoZXJ3aXNlLmV2YWx1YXRlKHQpO1xuICAgIH0sIHlyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0aGlzLmJyYW5jaGVzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IHJbZV0sXG4gICAgICAgICAgICBpID0gblsxXTtcbiAgICAgICAgdChuWzBdKSwgdChpKTtcbiAgICAgIH1cblxuICAgICAgdCh0aGlzLm90aGVyd2lzZSk7XG4gICAgfSwgeXIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hlcy5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdFsxXS5vdXRwdXREZWZpbmVkKCk7XG4gICAgICB9KSAmJiB0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCk7XG4gICAgfSwgeXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gW1wiY2FzZVwiXTtcbiAgICAgIHJldHVybiB0aGlzLmVhY2hDaGlsZChmdW5jdGlvbiAoZSkge1xuICAgICAgICB0LnB1c2goZS5zZXJpYWxpemUoKSk7XG4gICAgICB9KSwgdDtcbiAgICB9O1xuXG4gICAgdmFyIGRyID0gZnVuY3Rpb24gZHIodCwgZSwgciwgbikge1xuICAgICAgdGhpcy50eXBlID0gdCwgdGhpcy5pbnB1dCA9IGUsIHRoaXMuYmVnaW5JbmRleCA9IHIsIHRoaXMuZW5kSW5kZXggPSBuO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBtcih0LCBlKSB7XG4gICAgICByZXR1cm4gXCI9PVwiID09PSB0IHx8IFwiIT1cIiA9PT0gdCA/IFwiYm9vbGVhblwiID09PSBlLmtpbmQgfHwgXCJzdHJpbmdcIiA9PT0gZS5raW5kIHx8IFwibnVtYmVyXCIgPT09IGUua2luZCB8fCBcIm51bGxcIiA9PT0gZS5raW5kIHx8IFwidmFsdWVcIiA9PT0gZS5raW5kIDogXCJzdHJpbmdcIiA9PT0gZS5raW5kIHx8IFwibnVtYmVyXCIgPT09IGUua2luZCB8fCBcInZhbHVlXCIgPT09IGUua2luZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2cih0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gMCA9PT0gbi5jb21wYXJlKGUsIHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdyKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gXCI9PVwiICE9PSB0ICYmIFwiIT1cIiAhPT0gdDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGkodCwgZSwgcikge1xuICAgICAgICAgIHRoaXMudHlwZSA9IGp0LCB0aGlzLmxocyA9IHQsIHRoaXMucmhzID0gZSwgdGhpcy5jb2xsYXRvciA9IHIsIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50ID0gXCJ2YWx1ZVwiID09PSB0LnR5cGUua2luZCB8fCBcInZhbHVlXCIgPT09IGUudHlwZS5raW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIGlmICgzICE9PSB0Lmxlbmd0aCAmJiA0ICE9PSB0Lmxlbmd0aCkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlwiKTtcbiAgICAgICAgICB2YXIgciA9IHRbMF0sXG4gICAgICAgICAgICAgIGEgPSBlLnBhcnNlKHRbMV0sIDEsIEt0KTtcbiAgICAgICAgICBpZiAoIWEpIHJldHVybiBudWxsO1xuICAgICAgICAgIGlmICghbXIociwgYS50eXBlKSkgcmV0dXJuIGUuY29uY2F0KDEpLmVycm9yKCdcIicgKyByICsgXCJcXFwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICdcIiArIEh0KGEudHlwZSkgKyBcIicuXCIpO1xuICAgICAgICAgIHZhciBvID0gZS5wYXJzZSh0WzJdLCAyLCBLdCk7XG4gICAgICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBpZiAoIW1yKHIsIG8udHlwZSkpIHJldHVybiBlLmNvbmNhdCgyKS5lcnJvcignXCInICsgciArIFwiXFxcIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnXCIgKyBIdChvLnR5cGUpICsgXCInLlwiKTtcbiAgICAgICAgICBpZiAoYS50eXBlLmtpbmQgIT09IG8udHlwZS5raW5kICYmIFwidmFsdWVcIiAhPT0gYS50eXBlLmtpbmQgJiYgXCJ2YWx1ZVwiICE9PSBvLnR5cGUua2luZCkgcmV0dXJuIGUuZXJyb3IoXCJDYW5ub3QgY29tcGFyZSB0eXBlcyAnXCIgKyBIdChhLnR5cGUpICsgXCInIGFuZCAnXCIgKyBIdChvLnR5cGUpICsgXCInLlwiKTtcbiAgICAgICAgICBuICYmIChcInZhbHVlXCIgPT09IGEudHlwZS5raW5kICYmIFwidmFsdWVcIiAhPT0gby50eXBlLmtpbmQgPyBhID0gbmV3IGZlKG8udHlwZSwgW2FdKSA6IFwidmFsdWVcIiAhPT0gYS50eXBlLmtpbmQgJiYgXCJ2YWx1ZVwiID09PSBvLnR5cGUua2luZCAmJiAobyA9IG5ldyBmZShhLnR5cGUsIFtvXSkpKTtcbiAgICAgICAgICB2YXIgcyA9IG51bGw7XG5cbiAgICAgICAgICBpZiAoNCA9PT0gdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBhLnR5cGUua2luZCAmJiBcInN0cmluZ1wiICE9PSBvLnR5cGUua2luZCAmJiBcInZhbHVlXCIgIT09IGEudHlwZS5raW5kICYmIFwidmFsdWVcIiAhPT0gby50eXBlLmtpbmQpIHJldHVybiBlLmVycm9yKFwiQ2Fubm90IHVzZSBjb2xsYXRvciB0byBjb21wYXJlIG5vbi1zdHJpbmcgdHlwZXMuXCIpO1xuICAgICAgICAgICAgaWYgKCEocyA9IGUucGFyc2UodFszXSwgMywgR3QpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5ldyBpKGEsIG8sIHMpO1xuICAgICAgICB9LCBpLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzLmxocy5ldmFsdWF0ZShpKSxcbiAgICAgICAgICAgICAgbyA9IHRoaXMucmhzLmV2YWx1YXRlKGkpO1xuXG4gICAgICAgICAgaWYgKG4gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBzID0gdWUoYSksXG4gICAgICAgICAgICAgICAgdSA9IHVlKG8pO1xuICAgICAgICAgICAgaWYgKHMua2luZCAhPT0gdS5raW5kIHx8IFwic3RyaW5nXCIgIT09IHMua2luZCAmJiBcIm51bWJlclwiICE9PSBzLmtpbmQpIHRocm93IG5ldyBjZSgnRXhwZWN0ZWQgYXJndW1lbnRzIGZvciBcIicgKyB0ICsgJ1wiIHRvIGJlIChzdHJpbmcsIHN0cmluZykgb3IgKG51bWJlciwgbnVtYmVyKSwgYnV0IGZvdW5kICgnICsgcy5raW5kICsgXCIsIFwiICsgdS5raW5kICsgXCIpIGluc3RlYWQuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmNvbGxhdG9yICYmICFuICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIgbCA9IHVlKGEpLFxuICAgICAgICAgICAgICAgIHAgPSB1ZShvKTtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBsLmtpbmQgfHwgXCJzdHJpbmdcIiAhPT0gcC5raW5kKSByZXR1cm4gZShpLCBhLCBvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvciA/IHIoaSwgYSwgbywgdGhpcy5jb2xsYXRvci5ldmFsdWF0ZShpKSkgOiBlKGksIGEsIG8pO1xuICAgICAgICB9LCBpLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHQodGhpcy5saHMpLCB0KHRoaXMucmhzKSwgdGhpcy5jb2xsYXRvciAmJiB0KHRoaXMuY29sbGF0b3IpO1xuICAgICAgICB9LCBpLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSwgaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlID0gW3RdO1xuICAgICAgICAgIHJldHVybiB0aGlzLmVhY2hDaGlsZChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgZS5wdXNoKHQuc2VyaWFsaXplKCkpO1xuICAgICAgICAgIH0pLCBlO1xuICAgICAgICB9LCBpO1xuICAgICAgfSgpO1xuICAgIH1cblxuICAgIGRyLnBhcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA8PSAyIHx8IHQubGVuZ3RoID49IDUpIHJldHVybiBlLmVycm9yKFwiRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIFwiICsgKHQubGVuZ3RoIC0gMSkgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgIHZhciByID0gZS5wYXJzZSh0WzFdLCAxLCBLdCksXG4gICAgICAgICAgbiA9IGUucGFyc2UodFsyXSwgMiwgT3QpO1xuICAgICAgaWYgKCFyIHx8ICFuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghV3Qoci50eXBlLCBbSnQoS3QpLCBVdCwgS3RdKSkgcmV0dXJuIGUuZXJyb3IoXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kIFwiICsgSHQoci50eXBlKSArIFwiIGluc3RlYWRcIik7XG5cbiAgICAgIGlmICg0ID09PSB0Lmxlbmd0aCkge1xuICAgICAgICB2YXIgaSA9IGUucGFyc2UodFszXSwgMywgT3QpO1xuICAgICAgICByZXR1cm4gaSA/IG5ldyBkcihyLnR5cGUsIHIsIG4sIGkpIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBkcihyLnR5cGUsIHIsIG4pO1xuICAgIH0sIGRyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuaW5wdXQuZXZhbHVhdGUodCksXG4gICAgICAgICAgciA9IHRoaXMuYmVnaW5JbmRleC5ldmFsdWF0ZSh0KTtcbiAgICAgIGlmICghUXQoZSwgW1wic3RyaW5nXCIsIFwiYXJyYXlcIl0pKSB0aHJvdyBuZXcgY2UoXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kIFwiICsgSHQodWUoZSkpICsgXCIgaW5zdGVhZC5cIik7XG5cbiAgICAgIGlmICh0aGlzLmVuZEluZGV4KSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5lbmRJbmRleC5ldmFsdWF0ZSh0KTtcbiAgICAgICAgcmV0dXJuIGUuc2xpY2Uociwgbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlLnNsaWNlKHIpO1xuICAgIH0sIGRyLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCh0aGlzLmlucHV0KSwgdCh0aGlzLmJlZ2luSW5kZXgpLCB0aGlzLmVuZEluZGV4ICYmIHQodGhpcy5lbmRJbmRleCk7XG4gICAgfSwgZHIucHJvdG90eXBlLm91dHB1dERlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgZHIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChudWxsICE9IHRoaXMuZW5kSW5kZXggJiYgdm9pZCAwICE9PSB0aGlzLmVuZEluZGV4KSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5lbmRJbmRleC5zZXJpYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIFtcInNsaWNlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCksIHRoaXMuYmVnaW5JbmRleC5zZXJpYWxpemUoKSwgdF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXCJzbGljZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpLCB0aGlzLmJlZ2luSW5kZXguc2VyaWFsaXplKCldO1xuICAgIH07XG5cbiAgICB2YXIgeHIgPSBncihcIj09XCIsIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gZSA9PT0gcjtcbiAgICB9LCB2ciksXG4gICAgICAgIGJyID0gZ3IoXCIhPVwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgIT09IHI7XG4gICAgfSwgZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiAhdnIoMCwgZSwgciwgbik7XG4gICAgfSksXG4gICAgICAgIHdyID0gZ3IoXCI8XCIsIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gZSA8IHI7XG4gICAgfSwgZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiBuLmNvbXBhcmUoZSwgcikgPCAwO1xuICAgIH0pLFxuICAgICAgICBfciA9IGdyKFwiPlwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgPiByO1xuICAgIH0sIGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gbi5jb21wYXJlKGUsIHIpID4gMDtcbiAgICB9KSxcbiAgICAgICAgQXIgPSBncihcIjw9XCIsIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gZSA8PSByO1xuICAgIH0sIGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gbi5jb21wYXJlKGUsIHIpIDw9IDA7XG4gICAgfSksXG4gICAgICAgIFNyID0gZ3IoXCI+PVwiLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIGUgPj0gcjtcbiAgICB9LCBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG4uY29tcGFyZShlLCByKSA+PSAwO1xuICAgIH0pLFxuICAgICAgICBrciA9IGZ1bmN0aW9uIGtyKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHRoaXMudHlwZSA9IFV0LCB0aGlzLm51bWJlciA9IHQsIHRoaXMubG9jYWxlID0gZSwgdGhpcy5jdXJyZW5jeSA9IHIsIHRoaXMubWluRnJhY3Rpb25EaWdpdHMgPSBuLCB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID0gaTtcbiAgICB9O1xuXG4gICAga3IucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDMgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIHR3byBhcmd1bWVudHMuXCIpO1xuICAgICAgdmFyIHIgPSBlLnBhcnNlKHRbMV0sIDEsIE90KTtcbiAgICAgIGlmICghcikgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgbiA9IHRbMl07XG4gICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgbiB8fCBBcnJheS5pc0FycmF5KG4pKSByZXR1cm4gZS5lcnJvcihcIk51bWJlckZvcm1hdCBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LlwiKTtcbiAgICAgIHZhciBpID0gbnVsbDtcbiAgICAgIGlmIChuLmxvY2FsZSAmJiAhKGkgPSBlLnBhcnNlKG4ubG9jYWxlLCAxLCBVdCkpKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBhID0gbnVsbDtcbiAgICAgIGlmIChuLmN1cnJlbmN5ICYmICEoYSA9IGUucGFyc2Uobi5jdXJyZW5jeSwgMSwgVXQpKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgbyA9IG51bGw7XG4gICAgICBpZiAobltcIm1pbi1mcmFjdGlvbi1kaWdpdHNcIl0gJiYgIShvID0gZS5wYXJzZShuW1wibWluLWZyYWN0aW9uLWRpZ2l0c1wiXSwgMSwgT3QpKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgcyA9IG51bGw7XG4gICAgICByZXR1cm4gbltcIm1heC1mcmFjdGlvbi1kaWdpdHNcIl0gJiYgIShzID0gZS5wYXJzZShuW1wibWF4LWZyYWN0aW9uLWRpZ2l0c1wiXSwgMSwgT3QpKSA/IG51bGwgOiBuZXcga3IociwgaSwgYSwgbywgcyk7XG4gICAgfSwga3IucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5ldmFsdWF0ZSh0KSA6IFtdLCB7XG4gICAgICAgIHN0eWxlOiB0aGlzLmN1cnJlbmN5ID8gXCJjdXJyZW5jeVwiIDogXCJkZWNpbWFsXCIsXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5ID8gdGhpcy5jdXJyZW5jeS5ldmFsdWF0ZSh0KSA6IHZvaWQgMCxcbiAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID8gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZSh0KSA6IHZvaWQgMCxcbiAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID8gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZSh0KSA6IHZvaWQgMFxuICAgICAgfSkuZm9ybWF0KHRoaXMubnVtYmVyLmV2YWx1YXRlKHQpKTtcbiAgICB9LCBrci5wcm90b3R5cGUuZWFjaENoaWxkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQodGhpcy5udW1iZXIpLCB0aGlzLmxvY2FsZSAmJiB0KHRoaXMubG9jYWxlKSwgdGhpcy5jdXJyZW5jeSAmJiB0KHRoaXMuY3VycmVuY3kpLCB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzICYmIHQodGhpcy5taW5GcmFjdGlvbkRpZ2l0cyksIHRoaXMubWF4RnJhY3Rpb25EaWdpdHMgJiYgdCh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICB9LCBrci5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBrci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB7fTtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsZSAmJiAodC5sb2NhbGUgPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKSksIHRoaXMuY3VycmVuY3kgJiYgKHQuY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5LnNlcmlhbGl6ZSgpKSwgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyAmJiAodFtcIm1pbi1mcmFjdGlvbi1kaWdpdHNcIl0gPSB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpKSwgdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyAmJiAodFtcIm1heC1mcmFjdGlvbi1kaWdpdHNcIl0gPSB0aGlzLm1heEZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpKSwgW1wibnVtYmVyLWZvcm1hdFwiLCB0aGlzLm51bWJlci5zZXJpYWxpemUoKSwgdF07XG4gICAgfTtcblxuICAgIHZhciBJciA9IGZ1bmN0aW9uIElyKHQpIHtcbiAgICAgIHRoaXMudHlwZSA9IE90LCB0aGlzLmlucHV0ID0gdDtcbiAgICB9O1xuXG4gICAgSXIucGFyc2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKDIgIT09IHQubGVuZ3RoKSByZXR1cm4gZS5lcnJvcihcIkV4cGVjdGVkIDEgYXJndW1lbnQsIGJ1dCBmb3VuZCBcIiArICh0Lmxlbmd0aCAtIDEpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgICB2YXIgciA9IGUucGFyc2UodFsxXSwgMSk7XG4gICAgICByZXR1cm4gciA/IFwiYXJyYXlcIiAhPT0gci50eXBlLmtpbmQgJiYgXCJzdHJpbmdcIiAhPT0gci50eXBlLmtpbmQgJiYgXCJ2YWx1ZVwiICE9PSByLnR5cGUua2luZCA/IGUuZXJyb3IoXCJFeHBlY3RlZCBhcmd1bWVudCBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kIFwiICsgSHQoci50eXBlKSArIFwiIGluc3RlYWQuXCIpIDogbmV3IElyKHIpIDogbnVsbDtcbiAgICB9LCBJci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKHQpO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHJldHVybiBlLmxlbmd0aDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSByZXR1cm4gZS5sZW5ndGg7XG4gICAgICB0aHJvdyBuZXcgY2UoXCJFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kIFwiICsgSHQodWUoZSkpICsgXCIgaW5zdGVhZC5cIik7XG4gICAgfSwgSXIucHJvdG90eXBlLmVhY2hDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0KHRoaXMuaW5wdXQpO1xuICAgIH0sIElyLnByb3RvdHlwZS5vdXRwdXREZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH0sIElyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtcImxlbmd0aFwiXTtcbiAgICAgIHJldHVybiB0aGlzLmVhY2hDaGlsZChmdW5jdGlvbiAoZSkge1xuICAgICAgICB0LnB1c2goZS5zZXJpYWxpemUoKSk7XG4gICAgICB9KSwgdDtcbiAgICB9O1xuICAgIHZhciB6ciA9IHtcbiAgICAgIFwiPT1cIjogeHIsXG4gICAgICBcIiE9XCI6IGJyLFxuICAgICAgXCI+XCI6IF9yLFxuICAgICAgXCI8XCI6IHdyLFxuICAgICAgXCI+PVwiOiBTcixcbiAgICAgIFwiPD1cIjogQXIsXG4gICAgICBhcnJheTogZmUsXG4gICAgICBhdDogcHIsXG4gICAgICBib29sZWFuOiBmZSxcbiAgICAgIGNhc2U6IHlyLFxuICAgICAgY29hbGVzY2U6IHVyLFxuICAgICAgY29sbGF0b3I6IHdlLFxuICAgICAgZm9ybWF0OiB5ZSxcbiAgICAgIGltYWdlOiBkZSxcbiAgICAgIGluOiBjcixcbiAgICAgIFwiaW5kZXgtb2ZcIjogaHIsXG4gICAgICBpbnRlcnBvbGF0ZTogb3IsXG4gICAgICBcImludGVycG9sYXRlLWhjbFwiOiBvcixcbiAgICAgIFwiaW50ZXJwb2xhdGUtbGFiXCI6IG9yLFxuICAgICAgbGVuZ3RoOiBJcixcbiAgICAgIGxldDogbHIsXG4gICAgICBsaXRlcmFsOiBwZSxcbiAgICAgIG1hdGNoOiBmcixcbiAgICAgIG51bWJlcjogZmUsXG4gICAgICBcIm51bWJlci1mb3JtYXRcIjoga3IsXG4gICAgICBvYmplY3Q6IGZlLFxuICAgICAgc2xpY2U6IGRyLFxuICAgICAgc3RlcDogS2UsXG4gICAgICBzdHJpbmc6IGZlLFxuICAgICAgXCJ0by1ib29sZWFuXCI6IHZlLFxuICAgICAgXCJ0by1jb2xvclwiOiB2ZSxcbiAgICAgIFwidG8tbnVtYmVyXCI6IHZlLFxuICAgICAgXCJ0by1zdHJpbmdcIjogdmUsXG4gICAgICB2YXI6IGplLFxuICAgICAgd2l0aGluOiBMZVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDcih0LCBlKSB7XG4gICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgbiA9IGVbMV0sXG4gICAgICAgICAgaSA9IGVbMl0sXG4gICAgICAgICAgYSA9IGVbM107XG4gICAgICByID0gci5ldmFsdWF0ZSh0KSwgbiA9IG4uZXZhbHVhdGUodCksIGkgPSBpLmV2YWx1YXRlKHQpO1xuICAgICAgdmFyIG8gPSBhID8gYS5ldmFsdWF0ZSh0KSA6IDEsXG4gICAgICAgICAgcyA9IG9lKHIsIG4sIGksIG8pO1xuICAgICAgaWYgKHMpIHRocm93IG5ldyBjZShzKTtcbiAgICAgIHJldHVybiBuZXcgZWUociAvIDI1NSAqIG8sIG4gLyAyNTUgKiBvLCBpIC8gMjU1ICogbywgbyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRXIodCwgZSkge1xuICAgICAgcmV0dXJuIHQgaW4gZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQcih0LCBlKSB7XG4gICAgICB2YXIgciA9IGVbdF07XG4gICAgICByZXR1cm4gdm9pZCAwID09PSByID8gbnVsbCA6IHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTXIodCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCcih0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IFwic3VjY2Vzc1wiLFxuICAgICAgICB2YWx1ZTogdFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBUcih0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IFwiZXJyb3JcIixcbiAgICAgICAgdmFsdWU6IHRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVnIodCkge1xuICAgICAgcmV0dXJuIFwiZGF0YS1kcml2ZW5cIiA9PT0gdFtcInByb3BlcnR5LXR5cGVcIl0gfHwgXCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiID09PSB0W1wicHJvcGVydHktdHlwZVwiXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGcih0KSB7XG4gICAgICByZXR1cm4gISF0LmV4cHJlc3Npb24gJiYgdC5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZihcInpvb21cIikgPiAtMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEcih0KSB7XG4gICAgICByZXR1cm4gISF0LmV4cHJlc3Npb24gJiYgdC5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMcih0KSB7XG4gICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIE51bWJlciA/IFwibnVtYmVyXCIgOiB0IGluc3RhbmNlb2YgU3RyaW5nID8gXCJzdHJpbmdcIiA6IHQgaW5zdGFuY2VvZiBCb29sZWFuID8gXCJib29sZWFuXCIgOiBBcnJheS5pc0FycmF5KHQpID8gXCJhcnJheVwiIDogbnVsbCA9PT0gdCA/IFwibnVsbFwiIDogdHlwZW9mIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUnIodCkge1xuICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCAmJiAhQXJyYXkuaXNBcnJheSh0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPcih0KSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVcih0LCBlLCByKSB7XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSB0ID8gdCA6IHZvaWQgMCAhPT0gZSA/IGUgOiB2b2lkIDAgIT09IHIgPyByIDogdm9pZCAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpyKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHJldHVybiBVcih0eXBlb2YgciA9PT0gaSA/IG5bcl0gOiB2b2lkIDAsIHQuZGVmYXVsdCwgZS5kZWZhdWx0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxcih0LCBlLCByKSB7XG4gICAgICBpZiAoXCJudW1iZXJcIiAhPT0gTHIocikpIHJldHVybiBVcih0LmRlZmF1bHQsIGUuZGVmYXVsdCk7XG4gICAgICB2YXIgbiA9IHQuc3RvcHMubGVuZ3RoO1xuICAgICAgaWYgKDEgPT09IG4pIHJldHVybiB0LnN0b3BzWzBdWzFdO1xuICAgICAgaWYgKHIgPD0gdC5zdG9wc1swXVswXSkgcmV0dXJuIHQuc3RvcHNbMF1bMV07XG4gICAgICBpZiAociA+PSB0LnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHQuc3RvcHNbbiAtIDFdWzFdO1xuICAgICAgdmFyIGkgPSBOZSh0LnN0b3BzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdFswXTtcbiAgICAgIH0pLCByKTtcbiAgICAgIHJldHVybiB0LnN0b3BzW2ldWzFdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE5yKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdm9pZCAwICE9PSB0LmJhc2UgPyB0LmJhc2UgOiAxO1xuICAgICAgaWYgKFwibnVtYmVyXCIgIT09IExyKHIpKSByZXR1cm4gVXIodC5kZWZhdWx0LCBlLmRlZmF1bHQpO1xuICAgICAgdmFyIGkgPSB0LnN0b3BzLmxlbmd0aDtcbiAgICAgIGlmICgxID09PSBpKSByZXR1cm4gdC5zdG9wc1swXVsxXTtcbiAgICAgIGlmIChyIDw9IHQuc3RvcHNbMF1bMF0pIHJldHVybiB0LnN0b3BzWzBdWzFdO1xuICAgICAgaWYgKHIgPj0gdC5zdG9wc1tpIC0gMV1bMF0pIHJldHVybiB0LnN0b3BzW2kgLSAxXVsxXTtcblxuICAgICAgdmFyIGEgPSBOZSh0LnN0b3BzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdFswXTtcbiAgICAgIH0pLCByKSxcbiAgICAgICAgICBvID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSBuIC0gcixcbiAgICAgICAgICAgIGEgPSB0IC0gcjtcbiAgICAgICAgcmV0dXJuIDAgPT09IGkgPyAwIDogMSA9PT0gZSA/IGEgLyBpIDogKE1hdGgucG93KGUsIGEpIC0gMSkgLyAoTWF0aC5wb3coZSwgaSkgLSAxKTtcbiAgICAgIH0ociwgbiwgdC5zdG9wc1thXVswXSwgdC5zdG9wc1thICsgMV1bMF0pLFxuICAgICAgICAgIHMgPSB0LnN0b3BzW2FdWzFdLFxuICAgICAgICAgIHUgPSB0LnN0b3BzW2EgKyAxXVsxXSxcbiAgICAgICAgICBsID0gWmVbZS50eXBlXSB8fCBPcjtcblxuICAgICAgaWYgKHQuY29sb3JTcGFjZSAmJiBcInJnYlwiICE9PSB0LmNvbG9yU3BhY2UpIHtcbiAgICAgICAgdmFyIHAgPSBhclt0LmNvbG9yU3BhY2VdO1xuXG4gICAgICAgIGwgPSBmdW5jdGlvbiBsKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gcC5yZXZlcnNlKHAuaW50ZXJwb2xhdGUocC5mb3J3YXJkKHQpLCBwLmZvcndhcmQoZSksIG8pKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygcy5ldmFsdWF0ZSA/IHtcbiAgICAgICAgZXZhbHVhdGU6IGZ1bmN0aW9uIGV2YWx1YXRlKCkge1xuICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgZSA9IGFyZ3VtZW50cy5sZW5ndGg7IGUtLTspIHtcbiAgICAgICAgICAgIHRbZV0gPSBhcmd1bWVudHNbZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHIgPSBzLmV2YWx1YXRlLmFwcGx5KHZvaWQgMCwgdCksXG4gICAgICAgICAgICAgIG4gPSB1LmV2YWx1YXRlLmFwcGx5KHZvaWQgMCwgdCk7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gciAmJiB2b2lkIDAgIT09IG4pIHJldHVybiBsKHIsIG4sIG8pO1xuICAgICAgICB9XG4gICAgICB9IDogbChzLCB1LCBvKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBLcih0LCBlLCByKSB7XG4gICAgICByZXR1cm4gXCJjb2xvclwiID09PSBlLnR5cGUgPyByID0gZWUucGFyc2UocikgOiBcImZvcm1hdHRlZFwiID09PSBlLnR5cGUgPyByID0gaWUuZnJvbVN0cmluZyhyLnRvU3RyaW5nKCkpIDogXCJyZXNvbHZlZEltYWdlXCIgPT09IGUudHlwZSA/IHIgPSBhZS5mcm9tU3RyaW5nKHIudG9TdHJpbmcoKSkgOiBMcihyKSA9PT0gZS50eXBlIHx8IFwiZW51bVwiID09PSBlLnR5cGUgJiYgZS52YWx1ZXNbcl0gfHwgKHIgPSB2b2lkIDApLCBVcihyLCB0LmRlZmF1bHQsIGUuZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgYmUucmVnaXN0ZXIoenIsIHtcbiAgICAgIGVycm9yOiBbe1xuICAgICAgICBraW5kOiBcImVycm9yXCJcbiAgICAgIH0sIFtVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHRocm93IG5ldyBjZShlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgdHlwZW9mOiBbVXQsIFtLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBIdCh1ZShlWzBdLmV2YWx1YXRlKHQpKSk7XG4gICAgICB9XSxcbiAgICAgIFwidG8tcmdiYVwiOiBbSnQoT3QsIDQpLCBbcXRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KS50b0FycmF5KCk7XG4gICAgICB9XSxcbiAgICAgIHJnYjogW3F0LCBbT3QsIE90LCBPdF0sIENyXSxcbiAgICAgIHJnYmE6IFtxdCwgW090LCBPdCwgT3QsIE90XSwgQ3JdLFxuICAgICAgaGFzOiB7XG4gICAgICAgIHR5cGU6IGp0LFxuICAgICAgICBvdmVybG9hZHM6IFtbW1V0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gRXIoZVswXS5ldmFsdWF0ZSh0KSwgdC5wcm9wZXJ0aWVzKCkpO1xuICAgICAgICB9XSwgW1tVdCwgTnRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHZhciByID0gZVsxXTtcbiAgICAgICAgICByZXR1cm4gRXIoZVswXS5ldmFsdWF0ZSh0KSwgci5ldmFsdWF0ZSh0KSk7XG4gICAgICAgIH1dXVxuICAgICAgfSxcbiAgICAgIGdldDoge1xuICAgICAgICB0eXBlOiBLdCxcbiAgICAgICAgb3ZlcmxvYWRzOiBbW1tVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIFByKGVbMF0uZXZhbHVhdGUodCksIHQucHJvcGVydGllcygpKTtcbiAgICAgICAgfV0sIFtbVXQsIE50XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgICAgcmV0dXJuIFByKGVbMF0uZXZhbHVhdGUodCksIHIuZXZhbHVhdGUodCkpO1xuICAgICAgICB9XV1cbiAgICAgIH0sXG4gICAgICBcImZlYXR1cmUtc3RhdGVcIjogW0t0LCBbVXRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gUHIoZVswXS5ldmFsdWF0ZSh0KSwgdC5mZWF0dXJlU3RhdGUgfHwge30pO1xuICAgICAgfV0sXG4gICAgICBwcm9wZXJ0aWVzOiBbTnQsIFtdLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5wcm9wZXJ0aWVzKCk7XG4gICAgICB9XSxcbiAgICAgIFwiZ2VvbWV0cnktdHlwZVwiOiBbVXQsIFtdLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5nZW9tZXRyeVR5cGUoKTtcbiAgICAgIH1dLFxuICAgICAgaWQ6IFtLdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkKCk7XG4gICAgICB9XSxcbiAgICAgIHpvb206IFtPdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lmdsb2JhbHMuem9vbTtcbiAgICAgIH1dLFxuICAgICAgXCJoZWF0bWFwLWRlbnNpdHlcIjogW090LCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuZ2xvYmFscy5oZWF0bWFwRGVuc2l0eSB8fCAwO1xuICAgICAgfV0sXG4gICAgICBcImxpbmUtcHJvZ3Jlc3NcIjogW090LCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuZ2xvYmFscy5saW5lUHJvZ3Jlc3MgfHwgMDtcbiAgICAgIH1dLFxuICAgICAgYWNjdW11bGF0ZWQ6IFtLdCwgW10sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQuZ2xvYmFscy5hY2N1bXVsYXRlZCA/IG51bGwgOiB0Lmdsb2JhbHMuYWNjdW11bGF0ZWQ7XG4gICAgICB9XSxcbiAgICAgIFwiK1wiOiBbT3QsIE1yKE90KSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICByICs9IGlbbl0uZXZhbHVhdGUodCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1dLFxuICAgICAgXCIqXCI6IFtPdCwgTXIoT3QpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByID0gMSwgbiA9IDAsIGkgPSBlOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICAgIHIgKj0gaVtuXS5ldmFsdWF0ZSh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfV0sXG4gICAgICBcIi1cIjoge1xuICAgICAgICB0eXBlOiBPdCxcbiAgICAgICAgb3ZlcmxvYWRzOiBbW1tPdCwgT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHZhciByID0gZVsxXTtcbiAgICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KSAtIHIuZXZhbHVhdGUodCk7XG4gICAgICAgIH1dLCBbW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gLWVbMF0uZXZhbHVhdGUodCk7XG4gICAgICAgIH1dXVxuICAgICAgfSxcbiAgICAgIFwiL1wiOiBbT3QsIFtPdCwgT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpIC8gci5ldmFsdWF0ZSh0KTtcbiAgICAgIH1dLFxuICAgICAgXCIlXCI6IFtPdCwgW090LCBPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVsxXTtcbiAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkgJSByLmV2YWx1YXRlKHQpO1xuICAgICAgfV0sXG4gICAgICBsbjI6IFtPdCwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguTE4yO1xuICAgICAgfV0sXG4gICAgICBwaTogW090LCBbXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5QSTtcbiAgICAgIH1dLFxuICAgICAgZTogW090LCBbXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5FO1xuICAgICAgfV0sXG4gICAgICBcIl5cIjogW090LCBbT3QsIE90XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzFdO1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coZVswXS5ldmFsdWF0ZSh0KSwgci5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIHNxcnQ6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgbG9nMTA6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubG9nKGVbMF0uZXZhbHVhdGUodCkpIC8gTWF0aC5MTjEwO1xuICAgICAgfV0sXG4gICAgICBsbjogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5sb2coZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGxvZzI6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubG9nKGVbMF0uZXZhbHVhdGUodCkpIC8gTWF0aC5MTjI7XG4gICAgICB9XSxcbiAgICAgIHNpbjogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5zaW4oZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGNvczogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5jb3MoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIHRhbjogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC50YW4oZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGFzaW46IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXNpbihlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgYWNvczogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hY29zKGVbMF0uZXZhbHVhdGUodCkpO1xuICAgICAgfV0sXG4gICAgICBhdGFuOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4oZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIG1pbjogW090LCBNcihPdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLCBlLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlLmV2YWx1YXRlKHQpO1xuICAgICAgICB9KSk7XG4gICAgICB9XSxcbiAgICAgIG1heDogW090LCBNcihPdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBlLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlLmV2YWx1YXRlKHQpO1xuICAgICAgICB9KSk7XG4gICAgICB9XSxcbiAgICAgIGFiczogW090LCBbT3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIHJvdW5kOiBbT3QsIFtPdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXS5ldmFsdWF0ZSh0KTtcbiAgICAgICAgcmV0dXJuIHIgPCAwID8gLU1hdGgucm91bmQoLXIpIDogTWF0aC5yb3VuZChyKTtcbiAgICAgIH1dLFxuICAgICAgZmxvb3I6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZVswXS5ldmFsdWF0ZSh0KSk7XG4gICAgICB9XSxcbiAgICAgIGNlaWw6IFtPdCwgW090XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItPT1cIjogW2p0LCBbVXQsIEt0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgICAgbiA9IGVbMV07XG4gICAgICAgIHJldHVybiB0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSA9PT0gbi52YWx1ZTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaWQtPT1cIjogW2p0LCBbS3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF07XG4gICAgICAgIHJldHVybiB0LmlkKCkgPT09IHIudmFsdWU7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLXR5cGUtPT1cIjogW2p0LCBbVXRdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF07XG4gICAgICAgIHJldHVybiB0Lmdlb21ldHJ5VHlwZSgpID09PSByLnZhbHVlO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci08XCI6IFtqdCwgW1V0LCBLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSBlWzFdLFxuICAgICAgICAgICAgaSA9IHQucHJvcGVydGllcygpW3IudmFsdWVdLFxuICAgICAgICAgICAgYSA9IG4udmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaSA9PSB0eXBlb2YgYSAmJiBpIDwgYTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaWQtPFwiOiBbanQsIFtLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSB0LmlkKCksXG4gICAgICAgICAgICBpID0gci52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09IHR5cGVvZiBpICYmIG4gPCBpO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci0+XCI6IFtqdCwgW1V0LCBLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSBlWzFdLFxuICAgICAgICAgICAgaSA9IHQucHJvcGVydGllcygpW3IudmFsdWVdLFxuICAgICAgICAgICAgYSA9IG4udmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaSA9PSB0eXBlb2YgYSAmJiBpID4gYTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaWQtPlwiOiBbanQsIFtLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSB0LmlkKCksXG4gICAgICAgICAgICBpID0gci52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09IHR5cGVvZiBpICYmIG4gPiBpO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci08PVwiOiBbanQsIFtVdCwgS3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICAgIGkgPSB0LnByb3BlcnRpZXMoKVtyLnZhbHVlXSxcbiAgICAgICAgICAgIGEgPSBuLnZhbHVlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGkgPT0gdHlwZW9mIGEgJiYgaSA8PSBhO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1pZC08PVwiOiBbanQsIFtLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICAgIG4gPSB0LmlkKCksXG4gICAgICAgICAgICBpID0gci52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09IHR5cGVvZiBpICYmIG4gPD0gaTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItPj1cIjogW2p0LCBbVXQsIEt0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgICAgbiA9IGVbMV0sXG4gICAgICAgICAgICBpID0gdC5wcm9wZXJ0aWVzKClbci52YWx1ZV0sXG4gICAgICAgICAgICBhID0gbi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpID09IHR5cGVvZiBhICYmIGkgPj0gYTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItaWQtPj1cIjogW2p0LCBbS3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IGVbMF0sXG4gICAgICAgICAgICBuID0gdC5pZCgpLFxuICAgICAgICAgICAgaSA9IHIudmFsdWU7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbiA9PSB0eXBlb2YgaSAmJiBuID49IGk7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWhhc1wiOiBbanQsIFtLdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBlWzBdLnZhbHVlIGluIHQucHJvcGVydGllcygpO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1oYXMtaWRcIjogW2p0LCBbXSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHQuaWQoKSAmJiB2b2lkIDAgIT09IHQuaWQoKTtcbiAgICAgIH1dLFxuICAgICAgXCJmaWx0ZXItdHlwZS1pblwiOiBbanQsIFtKdChVdCldLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS52YWx1ZS5pbmRleE9mKHQuZ2VvbWV0cnlUeXBlKCkpID49IDA7XG4gICAgICB9XSxcbiAgICAgIFwiZmlsdGVyLWlkLWluXCI6IFtqdCwgW0p0KEt0KV0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBlWzBdLnZhbHVlLmluZGV4T2YodC5pZCgpKSA+PSAwO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1pbi1zbWFsbFwiOiBbanQsIFtVdCwgSnQoS3QpXSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdO1xuICAgICAgICByZXR1cm4gZVsxXS52YWx1ZS5pbmRleE9mKHQucHJvcGVydGllcygpW3IudmFsdWVdKSA+PSAwO1xuICAgICAgfV0sXG4gICAgICBcImZpbHRlci1pbi1sYXJnZVwiOiBbanQsIFtVdCwgSnQoS3QpXSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSBlWzBdLFxuICAgICAgICAgICAgbiA9IGVbMV07XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIGZvciAoOyByIDw9IG47KSB7XG4gICAgICAgICAgICB2YXIgaSA9IHIgKyBuID4+IDE7XG4gICAgICAgICAgICBpZiAoZVtpXSA9PT0gdCkgcmV0dXJuICEwO1xuICAgICAgICAgICAgZVtpXSA+IHQgPyBuID0gaSAtIDEgOiByID0gaSArIDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9KHQucHJvcGVydGllcygpW3IudmFsdWVdLCBuLnZhbHVlLCAwLCBuLnZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgfV0sXG4gICAgICBhbGw6IHtcbiAgICAgICAgdHlwZToganQsXG4gICAgICAgIG92ZXJsb2FkczogW1tbanQsIGp0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkgJiYgci5ldmFsdWF0ZSh0KTtcbiAgICAgICAgfV0sIFtNcihqdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBlOyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCFuW3JdLmV2YWx1YXRlKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XV1cbiAgICAgIH0sXG4gICAgICBhbnk6IHtcbiAgICAgICAgdHlwZToganQsXG4gICAgICAgIG92ZXJsb2FkczogW1tbanQsIGp0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICB2YXIgciA9IGVbMV07XG4gICAgICAgICAgcmV0dXJuIGVbMF0uZXZhbHVhdGUodCkgfHwgci5ldmFsdWF0ZSh0KTtcbiAgICAgICAgfV0sIFtNcihqdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBlOyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgICAgaWYgKG5bcl0uZXZhbHVhdGUodCkpIHJldHVybiAhMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1dXVxuICAgICAgfSxcbiAgICAgIFwiIVwiOiBbanQsIFtqdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiAhZVswXS5ldmFsdWF0ZSh0KTtcbiAgICAgIH1dLFxuICAgICAgXCJpcy1zdXBwb3J0ZWQtc2NyaXB0XCI6IFtqdCwgW1V0XSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0Lmdsb2JhbHMgJiYgdC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICByZXR1cm4gIXIgfHwgcihlWzBdLmV2YWx1YXRlKHQpKTtcbiAgICAgIH1dLFxuICAgICAgdXBjYXNlOiBbVXQsIFtVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XSxcbiAgICAgIGRvd25jYXNlOiBbVXQsIFtVdF0sIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBlWzBdLmV2YWx1YXRlKHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XSxcbiAgICAgIGNvbmNhdDogW1V0LCBNcihLdCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBlLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBsZShlLmV2YWx1YXRlKHQpKTtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICAgIH1dLFxuICAgICAgXCJyZXNvbHZlZC1sb2NhbGVcIjogW1V0LCBbR3RdLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZVswXS5ldmFsdWF0ZSh0KS5yZXNvbHZlZExvY2FsZSgpO1xuICAgICAgfV1cbiAgICB9KTtcblxuICAgIHZhciBHciA9IGZ1bmN0aW9uIEdyKHQsIGUpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHQsIHRoaXMuX3dhcm5pbmdIaXN0b3J5ID0ge30sIHRoaXMuX2V2YWx1YXRvciA9IG5ldyB4ZSgpLCB0aGlzLl9kZWZhdWx0VmFsdWUgPSBlID8gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiY29sb3JcIiA9PT0gdC50eXBlICYmIFJyKHQuZGVmYXVsdCkgPyBuZXcgZWUoMCwgMCwgMCwgMCkgOiBcImNvbG9yXCIgPT09IHQudHlwZSA/IGVlLnBhcnNlKHQuZGVmYXVsdCkgfHwgbnVsbCA6IHZvaWQgMCA9PT0gdC5kZWZhdWx0ID8gbnVsbCA6IHQuZGVmYXVsdDtcbiAgICAgIH0oZSkgOiBudWxsLCB0aGlzLl9lbnVtVmFsdWVzID0gZSAmJiBcImVudW1cIiA9PT0gZS50eXBlID8gZS52YWx1ZXMgOiBudWxsO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBacih0KSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KSAmJiB0Lmxlbmd0aCA+IDAgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdFswXSAmJiB0WzBdIGluIHpyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFhyKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IHFlKHpyLCBbXSwgZSA/IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0ge1xuICAgICAgICAgIGNvbG9yOiBxdCxcbiAgICAgICAgICBzdHJpbmc6IFV0LFxuICAgICAgICAgIG51bWJlcjogT3QsXG4gICAgICAgICAgZW51bTogVXQsXG4gICAgICAgICAgYm9vbGVhbjoganQsXG4gICAgICAgICAgZm9ybWF0dGVkOiBadCxcbiAgICAgICAgICByZXNvbHZlZEltYWdlOiBYdFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gXCJhcnJheVwiID09PSB0LnR5cGUgPyBKdChlW3QudmFsdWVdIHx8IEt0LCB0Lmxlbmd0aCkgOiBlW3QudHlwZV07XG4gICAgICB9KGUpIDogdm9pZCAwKSxcbiAgICAgICAgICBuID0gci5wYXJzZSh0LCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBlICYmIFwic3RyaW5nXCIgPT09IGUudHlwZSA/IHtcbiAgICAgICAgdHlwZUFubm90YXRpb246IFwiY29lcmNlXCJcbiAgICAgIH0gOiB2b2lkIDApO1xuICAgICAgcmV0dXJuIG4gPyBCcihuZXcgR3IobiwgZSkpIDogVHIoci5lcnJvcnMpO1xuICAgIH1cblxuICAgIEdyLnByb3RvdHlwZS5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IHQsIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZSwgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IHIsIHRoaXMuX2V2YWx1YXRvci5jYW5vbmljYWwgPSBuLCB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gaSB8fCBudWxsLCB0aGlzLl9ldmFsdWF0b3IuZm9ybWF0dGVkU2VjdGlvbiA9IGEsIHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpO1xuICAgIH0sIEdyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IHQsIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZSB8fCBudWxsLCB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlID0gciB8fCBudWxsLCB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gbiwgdGhpcy5fZXZhbHVhdG9yLmF2YWlsYWJsZUltYWdlcyA9IGkgfHwgbnVsbCwgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBhIHx8IG51bGw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHRoaXMuX2V2YWx1YXRvcik7XG4gICAgICAgIGlmIChudWxsID09IG8gfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgbyAmJiBvICE9IG8pIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9lbnVtVmFsdWVzICYmICEobyBpbiB0aGlzLl9lbnVtVmFsdWVzKSkgdGhyb3cgbmV3IGNlKFwiRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mIFwiICsgT2JqZWN0LmtleXModGhpcy5fZW51bVZhbHVlcykubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgICAgICB9KS5qb2luKFwiLCBcIikgKyBcIiwgYnV0IGZvdW5kIFwiICsgSlNPTi5zdHJpbmdpZnkobykgKyBcIiBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93YXJuaW5nSGlzdG9yeVt0Lm1lc3NhZ2VdIHx8ICh0aGlzLl93YXJuaW5nSGlzdG9yeVt0Lm1lc3NhZ2VdID0gITAsIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNvbnNvbGUgJiYgY29uc29sZS53YXJuKHQubWVzc2FnZSkpLCB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBKciA9IGZ1bmN0aW9uIEpyKHQsIGUpIHtcbiAgICAgIHRoaXMua2luZCA9IHQsIHRoaXMuX3N0eWxlRXhwcmVzc2lvbiA9IGUsIHRoaXMuaXNTdGF0ZURlcGVuZGVudCA9IFwiY29uc3RhbnRcIiAhPT0gdCAmJiAhT2UoZS5leHByZXNzaW9uKTtcbiAgICB9O1xuXG4gICAgSnIucHJvdG90eXBlLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKHQsIGUsIHIsIG4sIGksIGEpO1xuICAgIH0sIEpyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKHQsIGUsIHIsIG4sIGksIGEpO1xuICAgIH07XG5cbiAgICB2YXIgSHIgPSBmdW5jdGlvbiBIcih0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLmtpbmQgPSB0LCB0aGlzLnpvb21TdG9wcyA9IHIsIHRoaXMuX3N0eWxlRXhwcmVzc2lvbiA9IGUsIHRoaXMuaXNTdGF0ZURlcGVuZGVudCA9IFwiY2FtZXJhXCIgIT09IHQgJiYgIU9lKGUuZXhwcmVzc2lvbiksIHRoaXMuaW50ZXJwb2xhdGlvblR5cGUgPSBuO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBZcih0LCBlKSB7XG4gICAgICBpZiAoXCJlcnJvclwiID09PSAodCA9IFhyKHQsIGUpKS5yZXN1bHQpIHJldHVybiB0O1xuICAgICAgdmFyIHIgPSB0LnZhbHVlLmV4cHJlc3Npb24sXG4gICAgICAgICAgbiA9IFJlKHIpO1xuICAgICAgaWYgKCFuICYmICFWcihlKSkgcmV0dXJuIFRyKFtuZXcgRHQoXCJcIiwgXCJkYXRhIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWRcIildKTtcbiAgICAgIHZhciBpID0gVWUociwgW1wiem9vbVwiXSk7XG4gICAgICBpZiAoIWkgJiYgIUZyKGUpKSByZXR1cm4gVHIoW25ldyBEdChcIlwiLCBcInpvb20gZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZFwiKV0pO1xuXG4gICAgICB2YXIgYSA9IGZ1bmN0aW9uIHQoZSkge1xuICAgICAgICB2YXIgciA9IG51bGw7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgbHIpIHIgPSB0KGUucmVzdWx0KTtlbHNlIGlmIChlIGluc3RhbmNlb2YgdXIpIGZvciAodmFyIG4gPSAwLCBpID0gZS5hcmdzOyBuIDwgaS5sZW5ndGggJiYgIShyID0gdChpW25dKSk7IG4gKz0gMSkge1xuICAgICAgICAgIDtcbiAgICAgICAgfSBlbHNlIChlIGluc3RhbmNlb2YgS2UgfHwgZSBpbnN0YW5jZW9mIG9yKSAmJiBlLmlucHV0IGluc3RhbmNlb2YgYmUgJiYgXCJ6b29tXCIgPT09IGUuaW5wdXQubmFtZSAmJiAociA9IGUpO1xuICAgICAgICByZXR1cm4gciBpbnN0YW5jZW9mIER0IHx8IGUuZWFjaENoaWxkKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIG4gPSB0KGUpO1xuICAgICAgICAgIG4gaW5zdGFuY2VvZiBEdCA/IHIgPSBuIDogIXIgJiYgbiA/IHIgPSBuZXcgRHQoXCJcIiwgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKSA6IHIgJiYgbiAmJiByICE9PSBuICYmIChyID0gbmV3IER0KFwiXCIsICdPbmx5IG9uZSB6b29tLWJhc2VkIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBzdWJleHByZXNzaW9uIG1heSBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uJykpO1xuICAgICAgICB9KSwgcjtcbiAgICAgIH0ocik7XG5cbiAgICAgIHJldHVybiBhIHx8IGkgPyBhIGluc3RhbmNlb2YgRHQgPyBUcihbYV0pIDogYSBpbnN0YW5jZW9mIG9yICYmICFEcihlKSA/IFRyKFtuZXcgRHQoXCJcIiwgJ1wiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgcHJvcGVydHknKV0pIDogQnIoYSA/IG5ldyBIcihuID8gXCJjYW1lcmFcIiA6IFwiY29tcG9zaXRlXCIsIHQudmFsdWUsIGEubGFiZWxzLCBhIGluc3RhbmNlb2Ygb3IgPyBhLmludGVycG9sYXRpb24gOiB2b2lkIDApIDogbmV3IEpyKG4gPyBcImNvbnN0YW50XCIgOiBcInNvdXJjZVwiLCB0LnZhbHVlKSkgOiBUcihbbmV3IER0KFwiXCIsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyldKTtcbiAgICB9XG5cbiAgICBIci5wcm90b3R5cGUuZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcodCwgZSwgciwgbiwgaSwgYSk7XG4gICAgfSwgSHIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUodCwgZSwgciwgbiwgaSwgYSk7XG4gICAgfSwgSHIucHJvdG90eXBlLmludGVycG9sYXRpb25GYWN0b3IgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGlvblR5cGUgPyBvci5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUsIHQsIGUsIHIpIDogMDtcbiAgICB9O1xuXG4gICAgdmFyICRyID0gZnVuY3Rpb24gJHIodCwgZSkge1xuICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHQsIHRoaXMuX3NwZWNpZmljYXRpb24gPSBlLCBUdCh0aGlzLCBmdW5jdGlvbiB0KGUsIHIpIHtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgYSxcbiAgICAgICAgICAgIG8gPSBcImNvbG9yXCIgPT09IHIudHlwZSxcbiAgICAgICAgICAgIHMgPSBlLnN0b3BzICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIGUuc3RvcHNbMF1bMF0sXG4gICAgICAgICAgICB1ID0gcyB8fCAhKHMgfHwgdm9pZCAwICE9PSBlLnByb3BlcnR5KSxcbiAgICAgICAgICAgIGwgPSBlLnR5cGUgfHwgKERyKHIpID8gXCJleHBvbmVudGlhbFwiIDogXCJpbnRlcnZhbFwiKTtcbiAgICAgICAgaWYgKG8gJiYgKChlID0gVHQoe30sIGUpKS5zdG9wcyAmJiAoZS5zdG9wcyA9IGUuc3RvcHMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFt0WzBdLCBlZS5wYXJzZSh0WzFdKV07XG4gICAgICAgIH0pKSwgZS5kZWZhdWx0ID0gZWUucGFyc2UoZS5kZWZhdWx0ID8gZS5kZWZhdWx0IDogci5kZWZhdWx0KSksIGUuY29sb3JTcGFjZSAmJiBcInJnYlwiICE9PSBlLmNvbG9yU3BhY2UgJiYgIWFyW2UuY29sb3JTcGFjZV0pIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29sb3Igc3BhY2U6IFwiICsgZS5jb2xvclNwYWNlKTtcbiAgICAgICAgaWYgKFwiZXhwb25lbnRpYWxcIiA9PT0gbCkgbiA9IE5yO2Vsc2UgaWYgKFwiaW50ZXJ2YWxcIiA9PT0gbCkgbiA9IHFyO2Vsc2UgaWYgKFwiY2F0ZWdvcmljYWxcIiA9PT0gbCkge1xuICAgICAgICAgIG4gPSBqciwgaSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBwID0gMCwgYyA9IGUuc3RvcHM7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgaCA9IGNbcF07XG4gICAgICAgICAgICBpW2hbMF1dID0gaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhID0gdHlwZW9mIGUuc3RvcHNbMF1bMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFwiaWRlbnRpdHlcIiAhPT0gbCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGZ1bmN0aW9uIHR5cGUgXCInICsgbCArICdcIicpO1xuICAgICAgICAgIG4gPSBLcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgZm9yICh2YXIgZiA9IHt9LCB5ID0gW10sIGQgPSAwOyBkIDwgZS5zdG9wcy5sZW5ndGg7IGQrKykge1xuICAgICAgICAgICAgdmFyIG0gPSBlLnN0b3BzW2RdLFxuICAgICAgICAgICAgICAgIHYgPSBtWzBdLnpvb207XG4gICAgICAgICAgICB2b2lkIDAgPT09IGZbdl0gJiYgKGZbdl0gPSB7XG4gICAgICAgICAgICAgIHpvb206IHYsXG4gICAgICAgICAgICAgIHR5cGU6IGUudHlwZSxcbiAgICAgICAgICAgICAgcHJvcGVydHk6IGUucHJvcGVydHksXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGUuZGVmYXVsdCxcbiAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICB9LCB5LnB1c2godikpLCBmW3ZdLnN0b3BzLnB1c2goW21bMF0udmFsdWUsIG1bMV1dKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBnID0gW10sIHggPSAwLCBiID0geTsgeCA8IGIubGVuZ3RoOyB4ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB3ID0gYlt4XTtcbiAgICAgICAgICAgIGcucHVzaChbZlt3XS56b29tLCB0KGZbd10sIHIpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF8gPSB7XG4gICAgICAgICAgICBuYW1lOiBcImxpbmVhclwiXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJjb21wb3NpdGVcIixcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlOiBfLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3Rvcjogb3IuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHZvaWQgMCwgXyksXG4gICAgICAgICAgICB6b29tU3RvcHM6IGcubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0WzBdO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBldmFsdWF0ZTogZnVuY3Rpb24gZXZhbHVhdGUodCwgbikge1xuICAgICAgICAgICAgICB2YXIgaSA9IHQuem9vbTtcbiAgICAgICAgICAgICAgcmV0dXJuIE5yKHtcbiAgICAgICAgICAgICAgICBzdG9wczogZyxcbiAgICAgICAgICAgICAgICBiYXNlOiBlLmJhc2VcbiAgICAgICAgICAgICAgfSwgciwgaSkuZXZhbHVhdGUoaSwgbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgdmFyIEEgPSBcImV4cG9uZW50aWFsXCIgPT09IGwgPyB7XG4gICAgICAgICAgICBuYW1lOiBcImV4cG9uZW50aWFsXCIsXG4gICAgICAgICAgICBiYXNlOiB2b2lkIDAgIT09IGUuYmFzZSA/IGUuYmFzZSA6IDFcbiAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJjYW1lcmFcIixcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlOiBBLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3Rvcjogb3IuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHZvaWQgMCwgQSksXG4gICAgICAgICAgICB6b29tU3RvcHM6IGUuc3RvcHMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0WzBdO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBldmFsdWF0ZTogZnVuY3Rpb24gZXZhbHVhdGUodCkge1xuICAgICAgICAgICAgICByZXR1cm4gbihlLCByLCB0Lnpvb20sIGksIGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtpbmQ6IFwic291cmNlXCIsXG4gICAgICAgICAgZXZhbHVhdGU6IGZ1bmN0aW9uIGV2YWx1YXRlKHQsIG8pIHtcbiAgICAgICAgICAgIHZhciBzID0gbyAmJiBvLnByb3BlcnRpZXMgPyBvLnByb3BlcnRpZXNbZS5wcm9wZXJ0eV0gOiB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBzID8gVXIoZS5kZWZhdWx0LCByLmRlZmF1bHQpIDogbihlLCByLCBzLCBpLCBhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KHRoaXMuX3BhcmFtZXRlcnMsIHRoaXMuX3NwZWNpZmljYXRpb24pKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gV3IodCkge1xuICAgICAgdmFyIGUgPSB0LmtleSxcbiAgICAgICAgICByID0gdC52YWx1ZSxcbiAgICAgICAgICBuID0gdC52YWx1ZVNwZWMgfHwge30sXG4gICAgICAgICAgaSA9IHQub2JqZWN0RWxlbWVudFZhbGlkYXRvcnMgfHwge30sXG4gICAgICAgICAgYSA9IHQuc3R5bGUsXG4gICAgICAgICAgbyA9IHQuc3R5bGVTcGVjLFxuICAgICAgICAgIHMgPSBbXSxcbiAgICAgICAgICB1ID0gTHIocik7XG4gICAgICBpZiAoXCJvYmplY3RcIiAhPT0gdSkgcmV0dXJuIFtuZXcgTXQoZSwgciwgXCJvYmplY3QgZXhwZWN0ZWQsIFwiICsgdSArIFwiIGZvdW5kXCIpXTtcblxuICAgICAgZm9yICh2YXIgbCBpbiByKSB7XG4gICAgICAgIHZhciBwID0gbC5zcGxpdChcIi5cIilbMF0sXG4gICAgICAgICAgICBjID0gbltwXSB8fCBuW1wiKlwiXSxcbiAgICAgICAgICAgIGggPSB2b2lkIDA7XG4gICAgICAgIGlmIChpW3BdKSBoID0gaVtwXTtlbHNlIGlmIChuW3BdKSBoID0gU247ZWxzZSBpZiAoaVtcIipcIl0pIGggPSBpW1wiKlwiXTtlbHNlIHtcbiAgICAgICAgICBpZiAoIW5bXCIqXCJdKSB7XG4gICAgICAgICAgICBzLnB1c2gobmV3IE10KGUsIHJbbF0sICd1bmtub3duIHByb3BlcnR5IFwiJyArIGwgKyAnXCInKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBoID0gU247XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHMuY29uY2F0KGgoe1xuICAgICAgICAgIGtleTogKGUgPyBlICsgXCIuXCIgOiBlKSArIGwsXG4gICAgICAgICAgdmFsdWU6IHJbbF0sXG4gICAgICAgICAgdmFsdWVTcGVjOiBjLFxuICAgICAgICAgIHN0eWxlOiBhLFxuICAgICAgICAgIHN0eWxlU3BlYzogbyxcbiAgICAgICAgICBvYmplY3Q6IHIsXG4gICAgICAgICAgb2JqZWN0S2V5OiBsXG4gICAgICAgIH0sIHIpKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgZiBpbiBuKSB7XG4gICAgICAgIGlbZl0gfHwgbltmXS5yZXF1aXJlZCAmJiB2b2lkIDAgPT09IG5bZl0uZGVmYXVsdCAmJiB2b2lkIDAgPT09IHJbZl0gJiYgcy5wdXNoKG5ldyBNdChlLCByLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIicgKyBmICsgJ1wiJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBRcih0KSB7XG4gICAgICB2YXIgZSA9IHQudmFsdWUsXG4gICAgICAgICAgciA9IHQudmFsdWVTcGVjLFxuICAgICAgICAgIG4gPSB0LnN0eWxlLFxuICAgICAgICAgIGkgPSB0LnN0eWxlU3BlYyxcbiAgICAgICAgICBhID0gdC5rZXksXG4gICAgICAgICAgbyA9IHQuYXJyYXlFbGVtZW50VmFsaWRhdG9yIHx8IFNuO1xuICAgICAgaWYgKFwiYXJyYXlcIiAhPT0gTHIoZSkpIHJldHVybiBbbmV3IE10KGEsIGUsIFwiYXJyYXkgZXhwZWN0ZWQsIFwiICsgTHIoZSkgKyBcIiBmb3VuZFwiKV07XG4gICAgICBpZiAoci5sZW5ndGggJiYgZS5sZW5ndGggIT09IHIubGVuZ3RoKSByZXR1cm4gW25ldyBNdChhLCBlLCBcImFycmF5IGxlbmd0aCBcIiArIHIubGVuZ3RoICsgXCIgZXhwZWN0ZWQsIGxlbmd0aCBcIiArIGUubGVuZ3RoICsgXCIgZm91bmRcIildO1xuICAgICAgaWYgKHJbXCJtaW4tbGVuZ3RoXCJdICYmIGUubGVuZ3RoIDwgcltcIm1pbi1sZW5ndGhcIl0pIHJldHVybiBbbmV3IE10KGEsIGUsIFwiYXJyYXkgbGVuZ3RoIGF0IGxlYXN0IFwiICsgcltcIm1pbi1sZW5ndGhcIl0gKyBcIiBleHBlY3RlZCwgbGVuZ3RoIFwiICsgZS5sZW5ndGggKyBcIiBmb3VuZFwiKV07XG4gICAgICB2YXIgcyA9IHtcbiAgICAgICAgdHlwZTogci52YWx1ZSxcbiAgICAgICAgdmFsdWVzOiByLnZhbHVlc1xuICAgICAgfTtcbiAgICAgIGkuJHZlcnNpb24gPCA3ICYmIChzLmZ1bmN0aW9uID0gci5mdW5jdGlvbiksIFwib2JqZWN0XCIgPT09IExyKHIudmFsdWUpICYmIChzID0gci52YWx1ZSk7XG5cbiAgICAgIGZvciAodmFyIHUgPSBbXSwgbCA9IDA7IGwgPCBlLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHUgPSB1LmNvbmNhdChvKHtcbiAgICAgICAgICBhcnJheTogZSxcbiAgICAgICAgICBhcnJheUluZGV4OiBsLFxuICAgICAgICAgIHZhbHVlOiBlW2xdLFxuICAgICAgICAgIHZhbHVlU3BlYzogcyxcbiAgICAgICAgICBzdHlsZTogbixcbiAgICAgICAgICBzdHlsZVNwZWM6IGksXG4gICAgICAgICAga2V5OiBhICsgXCJbXCIgKyBsICsgXCJdXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0bih0KSB7XG4gICAgICB2YXIgZSA9IHQua2V5LFxuICAgICAgICAgIHIgPSB0LnZhbHVlLFxuICAgICAgICAgIG4gPSB0LnZhbHVlU3BlYyxcbiAgICAgICAgICBpID0gTHIocik7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIiA9PT0gaSAmJiByICE9IHIgJiYgKGkgPSBcIk5hTlwiKSwgXCJudW1iZXJcIiAhPT0gaSA/IFtuZXcgTXQoZSwgciwgXCJudW1iZXIgZXhwZWN0ZWQsIFwiICsgaSArIFwiIGZvdW5kXCIpXSA6IFwibWluaW11bVwiIGluIG4gJiYgciA8IG4ubWluaW11bSA/IFtuZXcgTXQoZSwgciwgciArIFwiIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSBcIiArIG4ubWluaW11bSldIDogXCJtYXhpbXVtXCIgaW4gbiAmJiByID4gbi5tYXhpbXVtID8gW25ldyBNdChlLCByLCByICsgXCIgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlIFwiICsgbi5tYXhpbXVtKV0gOiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbih0KSB7XG4gICAgICB2YXIgZSxcbiAgICAgICAgICByLFxuICAgICAgICAgIG4sXG4gICAgICAgICAgaSA9IHQudmFsdWVTcGVjLFxuICAgICAgICAgIGEgPSBWdCh0LnZhbHVlLnR5cGUpLFxuICAgICAgICAgIG8gPSB7fSxcbiAgICAgICAgICBzID0gXCJjYXRlZ29yaWNhbFwiICE9PSBhICYmIHZvaWQgMCA9PT0gdC52YWx1ZS5wcm9wZXJ0eSxcbiAgICAgICAgICB1ID0gIXMsXG4gICAgICAgICAgbCA9IFwiYXJyYXlcIiA9PT0gTHIodC52YWx1ZS5zdG9wcykgJiYgXCJhcnJheVwiID09PSBMcih0LnZhbHVlLnN0b3BzWzBdKSAmJiBcIm9iamVjdFwiID09PSBMcih0LnZhbHVlLnN0b3BzWzBdWzBdKSxcbiAgICAgICAgICBwID0gV3Ioe1xuICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICB2YWx1ZTogdC52YWx1ZSxcbiAgICAgICAgdmFsdWVTcGVjOiB0LnN0eWxlU3BlYy5mdW5jdGlvbixcbiAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgc3RvcHM6IGZ1bmN0aW9uIHN0b3BzKHQpIHtcbiAgICAgICAgICAgIGlmIChcImlkZW50aXR5XCIgPT09IGEpIHJldHVybiBbbmV3IE10KHQua2V5LCB0LnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICAgICAgdmFyIGUgPSBbXSxcbiAgICAgICAgICAgICAgICByID0gdC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBlID0gZS5jb25jYXQoUXIoe1xuICAgICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogcixcbiAgICAgICAgICAgICAgdmFsdWVTcGVjOiB0LnZhbHVlU3BlYyxcbiAgICAgICAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgIGFycmF5RWxlbWVudFZhbGlkYXRvcjogY1xuICAgICAgICAgICAgfSkpLCBcImFycmF5XCIgPT09IExyKHIpICYmIDAgPT09IHIubGVuZ3RoICYmIGUucHVzaChuZXcgTXQodC5rZXksIHIsIFwiYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdG9wXCIpKSwgZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KHQpIHtcbiAgICAgICAgICAgIHJldHVybiBTbih7XG4gICAgICAgICAgICAgIGtleTogdC5rZXksXG4gICAgICAgICAgICAgIHZhbHVlOiB0LnZhbHVlLFxuICAgICAgICAgICAgICB2YWx1ZVNwZWM6IGksXG4gICAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFwiaWRlbnRpdHlcIiA9PT0gYSAmJiBzICYmIHAucHVzaChuZXcgTXQodC5rZXksIHQudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKSwgXCJpZGVudGl0eVwiID09PSBhIHx8IHQudmFsdWUuc3RvcHMgfHwgcC5wdXNoKG5ldyBNdCh0LmtleSwgdC52YWx1ZSwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzdG9wc1wiJykpLCBcImV4cG9uZW50aWFsXCIgPT09IGEgJiYgdC52YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiAhRHIodC52YWx1ZVNwZWMpICYmIHAucHVzaChuZXcgTXQodC5rZXksIHQudmFsdWUsIFwiZXhwb25lbnRpYWwgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIikpLCB0LnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4ICYmICh1ICYmICFWcih0LnZhbHVlU3BlYykgPyBwLnB1c2gobmV3IE10KHQua2V5LCB0LnZhbHVlLCBcInByb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkXCIpKSA6IHMgJiYgIUZyKHQudmFsdWVTcGVjKSAmJiBwLnB1c2gobmV3IE10KHQua2V5LCB0LnZhbHVlLCBcInpvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIikpKSwgXCJjYXRlZ29yaWNhbFwiICE9PSBhICYmICFsIHx8IHZvaWQgMCAhPT0gdC52YWx1ZS5wcm9wZXJ0eSB8fCBwLnB1c2gobmV3IE10KHQua2V5LCB0LnZhbHVlLCAnXCJwcm9wZXJ0eVwiIHByb3BlcnR5IGlzIHJlcXVpcmVkJykpLCBwO1xuXG4gICAgICBmdW5jdGlvbiBjKHQpIHtcbiAgICAgICAgdmFyIGUgPSBbXSxcbiAgICAgICAgICAgIGEgPSB0LnZhbHVlLFxuICAgICAgICAgICAgcyA9IHQua2V5O1xuICAgICAgICBpZiAoXCJhcnJheVwiICE9PSBMcihhKSkgcmV0dXJuIFtuZXcgTXQocywgYSwgXCJhcnJheSBleHBlY3RlZCwgXCIgKyBMcihhKSArIFwiIGZvdW5kXCIpXTtcbiAgICAgICAgaWYgKDIgIT09IGEubGVuZ3RoKSByZXR1cm4gW25ldyBNdChzLCBhLCBcImFycmF5IGxlbmd0aCAyIGV4cGVjdGVkLCBsZW5ndGggXCIgKyBhLmxlbmd0aCArIFwiIGZvdW5kXCIpXTtcblxuICAgICAgICBpZiAobCkge1xuICAgICAgICAgIGlmIChcIm9iamVjdFwiICE9PSBMcihhWzBdKSkgcmV0dXJuIFtuZXcgTXQocywgYSwgXCJvYmplY3QgZXhwZWN0ZWQsIFwiICsgTHIoYVswXSkgKyBcIiBmb3VuZFwiKV07XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gYVswXS56b29tKSByZXR1cm4gW25ldyBNdChzLCBhLCBcIm9iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbVwiKV07XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gYVswXS52YWx1ZSkgcmV0dXJuIFtuZXcgTXQocywgYSwgXCJvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlXCIpXTtcbiAgICAgICAgICBpZiAobiAmJiBuID4gVnQoYVswXS56b29tKSkgcmV0dXJuIFtuZXcgTXQocywgYVswXS56b29tLCBcInN0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyXCIpXTtcbiAgICAgICAgICBWdChhWzBdLnpvb20pICE9PSBuICYmIChuID0gVnQoYVswXS56b29tKSwgciA9IHZvaWQgMCwgbyA9IHt9KSwgZSA9IGUuY29uY2F0KFdyKHtcbiAgICAgICAgICAgIGtleTogcyArIFwiWzBdXCIsXG4gICAgICAgICAgICB2YWx1ZTogYVswXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzoge1xuICAgICAgICAgICAgICB6b29tOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgIHpvb206IHRuLFxuICAgICAgICAgICAgICB2YWx1ZTogaFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGUgPSBlLmNvbmNhdChoKHtcbiAgICAgICAgICBrZXk6IHMgKyBcIlswXVwiLFxuICAgICAgICAgIHZhbHVlOiBhWzBdLFxuICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlY1xuICAgICAgICB9LCBhKSk7XG5cbiAgICAgICAgcmV0dXJuIFpyKEZ0KGFbMV0pKSA/IGUuY29uY2F0KFtuZXcgTXQocyArIFwiWzFdXCIsIGFbMV0sIFwiZXhwcmVzc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGZ1bmN0aW9uIHN0b3BzLlwiKV0pIDogZS5jb25jYXQoU24oe1xuICAgICAgICAgIGtleTogcyArIFwiWzFdXCIsXG4gICAgICAgICAgdmFsdWU6IGFbMV0sXG4gICAgICAgICAgdmFsdWVTcGVjOiBpLFxuICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoKHQsIG4pIHtcbiAgICAgICAgdmFyIHMgPSBMcih0LnZhbHVlKSxcbiAgICAgICAgICAgIHUgPSBWdCh0LnZhbHVlKSxcbiAgICAgICAgICAgIGwgPSBudWxsICE9PSB0LnZhbHVlID8gdC52YWx1ZSA6IG47XG5cbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICBpZiAocyAhPT0gZSkgcmV0dXJuIFtuZXcgTXQodC5rZXksIGwsIHMgKyBcIiBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSBcIiArIGUpXTtcbiAgICAgICAgfSBlbHNlIGUgPSBzO1xuXG4gICAgICAgIGlmIChcIm51bWJlclwiICE9PSBzICYmIFwic3RyaW5nXCIgIT09IHMgJiYgXCJib29sZWFuXCIgIT09IHMpIHJldHVybiBbbmV3IE10KHQua2V5LCBsLCBcInN0b3AgZG9tYWluIHZhbHVlIG11c3QgYmUgYSBudW1iZXIsIHN0cmluZywgb3IgYm9vbGVhblwiKV07XG5cbiAgICAgICAgaWYgKFwibnVtYmVyXCIgIT09IHMgJiYgXCJjYXRlZ29yaWNhbFwiICE9PSBhKSB7XG4gICAgICAgICAgdmFyIHAgPSBcIm51bWJlciBleHBlY3RlZCwgXCIgKyBzICsgXCIgZm91bmRcIjtcbiAgICAgICAgICByZXR1cm4gVnIoaSkgJiYgdm9pZCAwID09PSBhICYmIChwICs9ICdcXG5JZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGEgY2F0ZWdvcmljYWwgZnVuY3Rpb24sIHNwZWNpZnkgYFwidHlwZVwiOiBcImNhdGVnb3JpY2FsXCJgLicpLCBbbmV3IE10KHQua2V5LCBsLCBwKV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJjYXRlZ29yaWNhbFwiICE9PSBhIHx8IFwibnVtYmVyXCIgIT09IHMgfHwgaXNGaW5pdGUodSkgJiYgTWF0aC5mbG9vcih1KSA9PT0gdSA/IFwiY2F0ZWdvcmljYWxcIiAhPT0gYSAmJiBcIm51bWJlclwiID09PSBzICYmIHZvaWQgMCAhPT0gciAmJiB1IDwgciA/IFtuZXcgTXQodC5rZXksIGwsIFwic3RvcCBkb21haW4gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlclwiKV0gOiAociA9IHUsIFwiY2F0ZWdvcmljYWxcIiA9PT0gYSAmJiB1IGluIG8gPyBbbmV3IE10KHQua2V5LCBsLCBcInN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZVwiKV0gOiAob1t1XSA9ICEwLCBbXSkpIDogW25ldyBNdCh0LmtleSwgbCwgXCJpbnRlZ2VyIGV4cGVjdGVkLCBmb3VuZCBcIiArIHUpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybih0KSB7XG4gICAgICB2YXIgZSA9IChcInByb3BlcnR5XCIgPT09IHQuZXhwcmVzc2lvbkNvbnRleHQgPyBZciA6IFhyKShGdCh0LnZhbHVlKSwgdC52YWx1ZVNwZWMpO1xuICAgICAgaWYgKFwiZXJyb3JcIiA9PT0gZS5yZXN1bHQpIHJldHVybiBlLnZhbHVlLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IE10KFwiXCIgKyB0LmtleSArIGUua2V5LCB0LnZhbHVlLCBlLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIgciA9IGUudmFsdWUuZXhwcmVzc2lvbiB8fCBlLnZhbHVlLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjtcbiAgICAgIGlmIChcInByb3BlcnR5XCIgPT09IHQuZXhwcmVzc2lvbkNvbnRleHQgJiYgXCJ0ZXh0LWZvbnRcIiA9PT0gdC5wcm9wZXJ0eUtleSAmJiAhci5vdXRwdXREZWZpbmVkKCkpIHJldHVybiBbbmV3IE10KHQua2V5LCB0LnZhbHVlLCAnSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yIFwiJyArIHQucHJvcGVydHlLZXkgKyAnXCIuIE91dHB1dCB2YWx1ZXMgbXVzdCBiZSBjb250YWluZWQgYXMgbGl0ZXJhbHMgd2l0aGluIHRoZSBleHByZXNzaW9uLicpXTtcbiAgICAgIGlmIChcInByb3BlcnR5XCIgPT09IHQuZXhwcmVzc2lvbkNvbnRleHQgJiYgXCJsYXlvdXRcIiA9PT0gdC5wcm9wZXJ0eVR5cGUgJiYgIU9lKHIpKSByZXR1cm4gW25ldyBNdCh0LmtleSwgdC52YWx1ZSwgJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBsYXlvdXQgcHJvcGVydGllcy4nKV07XG4gICAgICBpZiAoXCJmaWx0ZXJcIiA9PT0gdC5leHByZXNzaW9uQ29udGV4dCAmJiAhT2UocikpIHJldHVybiBbbmV3IE10KHQua2V5LCB0LnZhbHVlLCAnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGZpbHRlcnMuJyldO1xuXG4gICAgICBpZiAodC5leHByZXNzaW9uQ29udGV4dCAmJiAwID09PSB0LmV4cHJlc3Npb25Db250ZXh0LmluZGV4T2YoXCJjbHVzdGVyXCIpKSB7XG4gICAgICAgIGlmICghVWUociwgW1wiem9vbVwiLCBcImZlYXR1cmUtc3RhdGVcIl0pKSByZXR1cm4gW25ldyBNdCh0LmtleSwgdC52YWx1ZSwgJ1wiem9vbVwiIGFuZCBcImZlYXR1cmUtc3RhdGVcIiBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGNsdXN0ZXIgcHJvcGVydGllcy4nKV07XG4gICAgICAgIGlmIChcImNsdXN0ZXItaW5pdGlhbFwiID09PSB0LmV4cHJlc3Npb25Db250ZXh0ICYmICFSZShyKSkgcmV0dXJuIFtuZXcgTXQodC5rZXksIHQudmFsdWUsIFwiRmVhdHVyZSBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggaW5pdGlhbCBleHByZXNzaW9uIHBhcnQgb2YgY2x1c3RlciBwcm9wZXJ0aWVzLlwiKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBubih0KSB7XG4gICAgICB2YXIgZSA9IHQua2V5LFxuICAgICAgICAgIHIgPSB0LnZhbHVlLFxuICAgICAgICAgIG4gPSB0LnZhbHVlU3BlYyxcbiAgICAgICAgICBpID0gW107XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShuLnZhbHVlcykgPyAtMSA9PT0gbi52YWx1ZXMuaW5kZXhPZihWdChyKSkgJiYgaS5wdXNoKG5ldyBNdChlLCByLCBcImV4cGVjdGVkIG9uZSBvZiBbXCIgKyBuLnZhbHVlcy5qb2luKFwiLCBcIikgKyBcIl0sIFwiICsgSlNPTi5zdHJpbmdpZnkocikgKyBcIiBmb3VuZFwiKSkgOiAtMSA9PT0gT2JqZWN0LmtleXMobi52YWx1ZXMpLmluZGV4T2YoVnQocikpICYmIGkucHVzaChuZXcgTXQoZSwgciwgXCJleHBlY3RlZCBvbmUgb2YgW1wiICsgT2JqZWN0LmtleXMobi52YWx1ZXMpLmpvaW4oXCIsIFwiKSArIFwiXSwgXCIgKyBKU09OLnN0cmluZ2lmeShyKSArIFwiIGZvdW5kXCIpKSwgaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhbih0KSB7XG4gICAgICBpZiAoITAgPT09IHQgfHwgITEgPT09IHQpIHJldHVybiAhMDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSB8fCAwID09PSB0Lmxlbmd0aCkgcmV0dXJuICExO1xuXG4gICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgY2FzZSBcImhhc1wiOlxuICAgICAgICAgIHJldHVybiB0Lmxlbmd0aCA+PSAyICYmIFwiJGlkXCIgIT09IHRbMV0gJiYgXCIkdHlwZVwiICE9PSB0WzFdO1xuXG4gICAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICAgIHJldHVybiB0Lmxlbmd0aCA+PSAzICYmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0WzFdIHx8IEFycmF5LmlzQXJyYXkodFsyXSkpO1xuXG4gICAgICAgIGNhc2UgXCIhaW5cIjpcbiAgICAgICAgY2FzZSBcIiFoYXNcIjpcbiAgICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgICByZXR1cm4gITE7XG5cbiAgICAgICAgY2FzZSBcIj09XCI6XG4gICAgICAgIGNhc2UgXCIhPVwiOlxuICAgICAgICBjYXNlIFwiPlwiOlxuICAgICAgICBjYXNlIFwiPj1cIjpcbiAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIDMgIT09IHQubGVuZ3RoIHx8IEFycmF5LmlzQXJyYXkodFsxXSkgfHwgQXJyYXkuaXNBcnJheSh0WzJdKTtcblxuICAgICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgIGNhc2UgXCJhbGxcIjpcbiAgICAgICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQuc2xpY2UoMSk7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHJbZV07XG4gICAgICAgICAgICBpZiAoIWFuKG4pICYmIFwiYm9vbGVhblwiICE9IHR5cGVvZiBuKSByZXR1cm4gITE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICEwO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIH1cblxuICAgICRyLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBuZXcgJHIodC5fcGFyYW1ldGVycywgdC5fc3BlY2lmaWNhdGlvbik7XG4gICAgfSwgJHIuc2VyaWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9wYXJhbWV0ZXJzOiB0Ll9wYXJhbWV0ZXJzLFxuICAgICAgICBfc3BlY2lmaWNhdGlvbjogdC5fc3BlY2lmaWNhdGlvblxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBvbiA9IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVmYXVsdDogITEsXG4gICAgICB0cmFuc2l0aW9uOiAhMSxcbiAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCIsXG4gICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgIGludGVycG9sYXRlZDogITEsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcInpvb21cIiwgXCJmZWF0dXJlXCJdXG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHNuKHQpIHtcbiAgICAgIGlmIChudWxsID09IHQpIHJldHVybiB7XG4gICAgICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSxcbiAgICAgICAgbmVlZEdlb21ldHJ5OiAhMVxuICAgICAgfTtcbiAgICAgIGFuKHQpIHx8ICh0ID0gbG4odCkpO1xuICAgICAgdmFyIGUgPSBYcih0LCBvbik7XG4gICAgICBpZiAoXCJlcnJvclwiID09PSBlLnJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKGUudmFsdWUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmtleSArIFwiOiBcIiArIHQubWVzc2FnZTtcbiAgICAgIH0pLmpvaW4oXCIsIFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcih0LCByLCBuKSB7XG4gICAgICAgICAgcmV0dXJuIGUudmFsdWUuZXZhbHVhdGUodCwgciwge30sIG4pO1xuICAgICAgICB9LFxuICAgICAgICBuZWVkR2VvbWV0cnk6IGZ1bmN0aW9uIHQoZSkge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkgcmV0dXJuICExO1xuICAgICAgICAgIGlmIChcIndpdGhpblwiID09PSBlWzBdKSByZXR1cm4gITA7XG5cbiAgICAgICAgICBmb3IgKHZhciByID0gMTsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGlmICh0KGVbcl0pKSByZXR1cm4gITA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9KHQpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuKHQsIGUpIHtcbiAgICAgIHJldHVybiB0IDwgZSA/IC0xIDogdCA+IGUgPyAxIDogMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsbih0KSB7XG4gICAgICBpZiAoIXQpIHJldHVybiAhMDtcbiAgICAgIHZhciBlLFxuICAgICAgICAgIHIgPSB0WzBdO1xuICAgICAgcmV0dXJuIHQubGVuZ3RoIDw9IDEgPyBcImFueVwiICE9PSByIDogXCI9PVwiID09PSByID8gcG4odFsxXSwgdFsyXSwgXCI9PVwiKSA6IFwiIT1cIiA9PT0gciA/IGZuKHBuKHRbMV0sIHRbMl0sIFwiPT1cIikpIDogXCI8XCIgPT09IHIgfHwgXCI+XCIgPT09IHIgfHwgXCI8PVwiID09PSByIHx8IFwiPj1cIiA9PT0gciA/IHBuKHRbMV0sIHRbMl0sIHIpIDogXCJhbnlcIiA9PT0gciA/IChlID0gdC5zbGljZSgxKSwgW1wiYW55XCJdLmNvbmNhdChlLm1hcChsbikpKSA6IFwiYWxsXCIgPT09IHIgPyBbXCJhbGxcIl0uY29uY2F0KHQuc2xpY2UoMSkubWFwKGxuKSkgOiBcIm5vbmVcIiA9PT0gciA/IFtcImFsbFwiXS5jb25jYXQodC5zbGljZSgxKS5tYXAobG4pLm1hcChmbikpIDogXCJpblwiID09PSByID8gY24odFsxXSwgdC5zbGljZSgyKSkgOiBcIiFpblwiID09PSByID8gZm4oY24odFsxXSwgdC5zbGljZSgyKSkpIDogXCJoYXNcIiA9PT0gciA/IGhuKHRbMV0pIDogXCIhaGFzXCIgPT09IHIgPyBmbihobih0WzFdKSkgOiBcIndpdGhpblwiICE9PSByIHx8IHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG4odCwgZSwgcikge1xuICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCIkdHlwZVwiOlxuICAgICAgICAgIHJldHVybiBbXCJmaWx0ZXItdHlwZS1cIiArIHIsIGVdO1xuXG4gICAgICAgIGNhc2UgXCIkaWRcIjpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLWlkLVwiICsgciwgZV07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLVwiICsgciwgdCwgZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY24odCwgZSkge1xuICAgICAgaWYgKDAgPT09IGUubGVuZ3RoKSByZXR1cm4gITE7XG5cbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwiJHR5cGVcIjpcbiAgICAgICAgICByZXR1cm4gW1wiZmlsdGVyLXR5cGUtaW5cIiwgW1wibGl0ZXJhbFwiLCBlXV07XG5cbiAgICAgICAgY2FzZSBcIiRpZFwiOlxuICAgICAgICAgIHJldHVybiBbXCJmaWx0ZXItaWQtaW5cIiwgW1wibGl0ZXJhbFwiLCBlXV07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZS5sZW5ndGggPiAyMDAgJiYgIWUuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0ICE9IHR5cGVvZiBlWzBdO1xuICAgICAgICAgIH0pID8gW1wiZmlsdGVyLWluLWxhcmdlXCIsIHQsIFtcImxpdGVyYWxcIiwgZS5zb3J0KHVuKV1dIDogW1wiZmlsdGVyLWluLXNtYWxsXCIsIHQsIFtcImxpdGVyYWxcIiwgZV1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhuKHQpIHtcbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwiJHR5cGVcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG5cbiAgICAgICAgY2FzZSBcIiRpZFwiOlxuICAgICAgICAgIHJldHVybiBbXCJmaWx0ZXItaGFzLWlkXCJdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIFtcImZpbHRlci1oYXNcIiwgdF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm4odCkge1xuICAgICAgcmV0dXJuIFtcIiFcIiwgdF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geW4odCkge1xuICAgICAgcmV0dXJuIGFuKEZ0KHQudmFsdWUpKSA/IHJuKFR0KHt9LCB0LCB7XG4gICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiBcImZpbHRlclwiLFxuICAgICAgICB2YWx1ZVNwZWM6IHtcbiAgICAgICAgICB2YWx1ZTogXCJib29sZWFuXCJcbiAgICAgICAgfVxuICAgICAgfSkpIDogZnVuY3Rpb24gdChlKSB7XG4gICAgICAgIHZhciByID0gZS52YWx1ZSxcbiAgICAgICAgICAgIG4gPSBlLmtleTtcbiAgICAgICAgaWYgKFwiYXJyYXlcIiAhPT0gTHIocikpIHJldHVybiBbbmV3IE10KG4sIHIsIFwiYXJyYXkgZXhwZWN0ZWQsIFwiICsgTHIocikgKyBcIiBmb3VuZFwiKV07XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgYSA9IGUuc3R5bGVTcGVjLFxuICAgICAgICAgICAgbyA9IFtdO1xuICAgICAgICBpZiAoci5sZW5ndGggPCAxKSByZXR1cm4gW25ldyBNdChuLCByLCBcImZpbHRlciBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbGVtZW50XCIpXTtcblxuICAgICAgICBzd2l0Y2ggKG8gPSBvLmNvbmNhdChubih7XG4gICAgICAgICAga2V5OiBuICsgXCJbMF1cIixcbiAgICAgICAgICB2YWx1ZTogclswXSxcbiAgICAgICAgICB2YWx1ZVNwZWM6IGEuZmlsdGVyX29wZXJhdG9yLFxuICAgICAgICAgIHN0eWxlOiBlLnN0eWxlLFxuICAgICAgICAgIHN0eWxlU3BlYzogZS5zdHlsZVNwZWNcbiAgICAgICAgfSkpLCBWdChyWzBdKSkge1xuICAgICAgICAgIGNhc2UgXCI8XCI6XG4gICAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgICBjYXNlIFwiPj1cIjpcbiAgICAgICAgICAgIHIubGVuZ3RoID49IDIgJiYgXCIkdHlwZVwiID09PSBWdChyWzFdKSAmJiBvLnB1c2gobmV3IE10KG4sIHIsICdcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJyArIHJbMF0gKyAnXCInKSk7XG5cbiAgICAgICAgICBjYXNlIFwiPT1cIjpcbiAgICAgICAgICBjYXNlIFwiIT1cIjpcbiAgICAgICAgICAgIDMgIT09IHIubGVuZ3RoICYmIG8ucHVzaChuZXcgTXQobiwgciwgJ2ZpbHRlciBhcnJheSBmb3Igb3BlcmF0b3IgXCInICsgclswXSArICdcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycpKTtcblxuICAgICAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICAgIGNhc2UgXCIhaW5cIjpcbiAgICAgICAgICAgIHIubGVuZ3RoID49IDIgJiYgXCJzdHJpbmdcIiAhPT0gKGkgPSBMcihyWzFdKSkgJiYgby5wdXNoKG5ldyBNdChuICsgXCJbMV1cIiwgclsxXSwgXCJzdHJpbmcgZXhwZWN0ZWQsIFwiICsgaSArIFwiIGZvdW5kXCIpKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgcyA9IDI7IHMgPCByLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgIGkgPSBMcihyW3NdKSwgXCIkdHlwZVwiID09PSBWdChyWzFdKSA/IG8gPSBvLmNvbmNhdChubih7XG4gICAgICAgICAgICAgICAga2V5OiBuICsgXCJbXCIgKyBzICsgXCJdXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJbc10sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBhLmdlb21ldHJ5X3R5cGUsXG4gICAgICAgICAgICAgICAgc3R5bGU6IGUuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBlLnN0eWxlU3BlY1xuICAgICAgICAgICAgICB9KSkgOiBcInN0cmluZ1wiICE9PSBpICYmIFwibnVtYmVyXCIgIT09IGkgJiYgXCJib29sZWFuXCIgIT09IGkgJiYgby5wdXNoKG5ldyBNdChuICsgXCJbXCIgKyBzICsgXCJdXCIsIHJbc10sIFwic3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsIFwiICsgaSArIFwiIGZvdW5kXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgICAgY2FzZSBcImFsbFwiOlxuICAgICAgICAgIGNhc2UgXCJub25lXCI6XG4gICAgICAgICAgICBmb3IgKHZhciB1ID0gMTsgdSA8IHIubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgbyA9IG8uY29uY2F0KHQoe1xuICAgICAgICAgICAgICAgIGtleTogbiArIFwiW1wiICsgdSArIFwiXVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByW3VdLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBlLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogZS5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJoYXNcIjpcbiAgICAgICAgICBjYXNlIFwiIWhhc1wiOlxuICAgICAgICAgICAgaSA9IExyKHJbMV0pLCAyICE9PSByLmxlbmd0aCA/IG8ucHVzaChuZXcgTXQobiwgciwgJ2ZpbHRlciBhcnJheSBmb3IgXCInICsgclswXSArICdcIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50cycpKSA6IFwic3RyaW5nXCIgIT09IGkgJiYgby5wdXNoKG5ldyBNdChuICsgXCJbMV1cIiwgclsxXSwgXCJzdHJpbmcgZXhwZWN0ZWQsIFwiICsgaSArIFwiIGZvdW5kXCIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIndpdGhpblwiOlxuICAgICAgICAgICAgaSA9IExyKHJbMV0pLCAyICE9PSByLmxlbmd0aCA/IG8ucHVzaChuZXcgTXQobiwgciwgJ2ZpbHRlciBhcnJheSBmb3IgXCInICsgclswXSArICdcIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50cycpKSA6IFwib2JqZWN0XCIgIT09IGkgJiYgby5wdXNoKG5ldyBNdChuICsgXCJbMV1cIiwgclsxXSwgXCJvYmplY3QgZXhwZWN0ZWQsIFwiICsgaSArIFwiIGZvdW5kXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvO1xuICAgICAgfSh0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkbih0LCBlKSB7XG4gICAgICB2YXIgciA9IHQua2V5LFxuICAgICAgICAgIG4gPSB0LnN0eWxlLFxuICAgICAgICAgIGkgPSB0LnN0eWxlU3BlYyxcbiAgICAgICAgICBhID0gdC52YWx1ZSxcbiAgICAgICAgICBvID0gdC5vYmplY3RLZXksXG4gICAgICAgICAgcyA9IGlbZSArIFwiX1wiICsgdC5sYXllclR5cGVdO1xuICAgICAgaWYgKCFzKSByZXR1cm4gW107XG4gICAgICB2YXIgdSA9IG8ubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG4gICAgICBpZiAoXCJwYWludFwiID09PSBlICYmIHUgJiYgc1t1WzFdXSAmJiBzW3VbMV1dLnRyYW5zaXRpb24pIHJldHVybiBTbih7XG4gICAgICAgIGtleTogcixcbiAgICAgICAgdmFsdWU6IGEsXG4gICAgICAgIHZhbHVlU3BlYzogaS50cmFuc2l0aW9uLFxuICAgICAgICBzdHlsZTogbixcbiAgICAgICAgc3R5bGVTcGVjOiBpXG4gICAgICB9KTtcbiAgICAgIHZhciBsLFxuICAgICAgICAgIHAgPSB0LnZhbHVlU3BlYyB8fCBzW29dO1xuICAgICAgaWYgKCFwKSByZXR1cm4gW25ldyBNdChyLCBhLCAndW5rbm93biBwcm9wZXJ0eSBcIicgKyBvICsgJ1wiJyldO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT09IExyKGEpICYmIFZyKHApICYmICFwLnRva2VucyAmJiAobCA9IC9eeyhbXn1dKyl9JC8uZXhlYyhhKSkpIHJldHVybiBbbmV3IE10KHIsIGEsICdcIicgKyBvICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJwb2xhdGlvbiBzeW50YXhcXG5Vc2UgYW4gaWRlbnRpdHkgcHJvcGVydHkgZnVuY3Rpb24gaW5zdGVhZDogYHsgXCJ0eXBlXCI6IFwiaWRlbnRpdHlcIiwgXCJwcm9wZXJ0eVwiOiAnICsgSlNPTi5zdHJpbmdpZnkobFsxXSkgKyBcIiB9YC5cIildO1xuICAgICAgdmFyIGMgPSBbXTtcbiAgICAgIHJldHVybiBcInN5bWJvbFwiID09PSB0LmxheWVyVHlwZSAmJiAoXCJ0ZXh0LWZpZWxkXCIgPT09IG8gJiYgbiAmJiAhbi5nbHlwaHMgJiYgYy5wdXNoKG5ldyBNdChyLCBhLCAndXNlIG9mIFwidGV4dC1maWVsZFwiIHJlcXVpcmVzIGEgc3R5bGUgXCJnbHlwaHNcIiBwcm9wZXJ0eScpKSwgXCJ0ZXh0LWZvbnRcIiA9PT0gbyAmJiBScihGdChhKSkgJiYgXCJpZGVudGl0eVwiID09PSBWdChhLnR5cGUpICYmIGMucHVzaChuZXcgTXQociwgYSwgJ1widGV4dC1mb250XCIgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGl0eSBmdW5jdGlvbnMnKSkpLCBjLmNvbmNhdChTbih7XG4gICAgICAgIGtleTogdC5rZXksXG4gICAgICAgIHZhbHVlOiBhLFxuICAgICAgICB2YWx1ZVNwZWM6IHAsXG4gICAgICAgIHN0eWxlOiBuLFxuICAgICAgICBzdHlsZVNwZWM6IGksXG4gICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiBcInByb3BlcnR5XCIsXG4gICAgICAgIHByb3BlcnR5VHlwZTogZSxcbiAgICAgICAgcHJvcGVydHlLZXk6IG9cbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtbih0KSB7XG4gICAgICByZXR1cm4gZG4odCwgXCJwYWludFwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2bih0KSB7XG4gICAgICByZXR1cm4gZG4odCwgXCJsYXlvdXRcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ24odCkge1xuICAgICAgdmFyIGUgPSBbXSxcbiAgICAgICAgICByID0gdC52YWx1ZSxcbiAgICAgICAgICBuID0gdC5rZXksXG4gICAgICAgICAgaSA9IHQuc3R5bGUsXG4gICAgICAgICAgYSA9IHQuc3R5bGVTcGVjO1xuICAgICAgci50eXBlIHx8IHIucmVmIHx8IGUucHVzaChuZXcgTXQobiwgciwgJ2VpdGhlciBcInR5cGVcIiBvciBcInJlZlwiIGlzIHJlcXVpcmVkJykpO1xuICAgICAgdmFyIG8sXG4gICAgICAgICAgcyA9IFZ0KHIudHlwZSksXG4gICAgICAgICAgdSA9IFZ0KHIucmVmKTtcbiAgICAgIGlmIChyLmlkKSBmb3IgKHZhciBsID0gVnQoci5pZCksIHAgPSAwOyBwIDwgdC5hcnJheUluZGV4OyBwKyspIHtcbiAgICAgICAgdmFyIGMgPSBpLmxheWVyc1twXTtcbiAgICAgICAgVnQoYy5pZCkgPT09IGwgJiYgZS5wdXNoKG5ldyBNdChuLCByLmlkLCAnZHVwbGljYXRlIGxheWVyIGlkIFwiJyArIHIuaWQgKyAnXCIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICcgKyBjLmlkLl9fbGluZV9fKSk7XG4gICAgICB9XG4gICAgICBpZiAoXCJyZWZcIiBpbiByKSBbXCJ0eXBlXCIsIFwic291cmNlXCIsIFwic291cmNlLWxheWVyXCIsIFwiZmlsdGVyXCIsIFwibGF5b3V0XCJdLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdCBpbiByICYmIGUucHVzaChuZXcgTXQobiwgclt0XSwgJ1wiJyArIHQgKyAnXCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVycycpKTtcbiAgICAgIH0pLCBpLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIFZ0KHQuaWQpID09PSB1ICYmIChvID0gdCk7XG4gICAgICB9KSwgbyA/IG8ucmVmID8gZS5wdXNoKG5ldyBNdChuLCByLnJlZiwgXCJyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllclwiKSkgOiBzID0gVnQoby50eXBlKSA6IGUucHVzaChuZXcgTXQobiwgci5yZWYsICdyZWYgbGF5ZXIgXCInICsgdSArICdcIiBub3QgZm91bmQnKSk7ZWxzZSBpZiAoXCJiYWNrZ3JvdW5kXCIgIT09IHMpIGlmIChyLnNvdXJjZSkge1xuICAgICAgICB2YXIgaCA9IGkuc291cmNlcyAmJiBpLnNvdXJjZXNbci5zb3VyY2VdLFxuICAgICAgICAgICAgZiA9IGggJiYgVnQoaC50eXBlKTtcbiAgICAgICAgaCA/IFwidmVjdG9yXCIgPT09IGYgJiYgXCJyYXN0ZXJcIiA9PT0gcyA/IGUucHVzaChuZXcgTXQobiwgci5zb3VyY2UsICdsYXllciBcIicgKyByLmlkICsgJ1wiIHJlcXVpcmVzIGEgcmFzdGVyIHNvdXJjZScpKSA6IFwicmFzdGVyXCIgPT09IGYgJiYgXCJyYXN0ZXJcIiAhPT0gcyA/IGUucHVzaChuZXcgTXQobiwgci5zb3VyY2UsICdsYXllciBcIicgKyByLmlkICsgJ1wiIHJlcXVpcmVzIGEgdmVjdG9yIHNvdXJjZScpKSA6IFwidmVjdG9yXCIgIT09IGYgfHwgcltcInNvdXJjZS1sYXllclwiXSA/IFwicmFzdGVyLWRlbVwiID09PSBmICYmIFwiaGlsbHNoYWRlXCIgIT09IHMgPyBlLnB1c2gobmV3IE10KG4sIHIuc291cmNlLCBcInJhc3Rlci1kZW0gc291cmNlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBsYXllciB0eXBlICdoaWxsc2hhZGUnLlwiKSkgOiBcImxpbmVcIiAhPT0gcyB8fCAhci5wYWludCB8fCAhci5wYWludFtcImxpbmUtZ3JhZGllbnRcIl0gfHwgXCJnZW9qc29uXCIgPT09IGYgJiYgaC5saW5lTWV0cmljcyB8fCBlLnB1c2gobmV3IE10KG4sIHIsICdsYXllciBcIicgKyByLmlkICsgJ1wiIHNwZWNpZmllcyBhIGxpbmUtZ3JhZGllbnQsIHdoaWNoIHJlcXVpcmVzIGEgR2VvSlNPTiBzb3VyY2Ugd2l0aCBgbGluZU1ldHJpY3NgIGVuYWJsZWQuJykpIDogZS5wdXNoKG5ldyBNdChuLCByLCAnbGF5ZXIgXCInICsgci5pZCArICdcIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiJykpIDogZS5wdXNoKG5ldyBNdChuLCByLnNvdXJjZSwgJ3NvdXJjZSBcIicgKyByLnNvdXJjZSArICdcIiBub3QgZm91bmQnKSk7XG4gICAgICB9IGVsc2UgZS5wdXNoKG5ldyBNdChuLCByLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJykpO1xuICAgICAgcmV0dXJuIGUgPSBlLmNvbmNhdChXcih7XG4gICAgICAgIGtleTogbixcbiAgICAgICAgdmFsdWU6IHIsXG4gICAgICAgIHZhbHVlU3BlYzogYS5sYXllcixcbiAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgXCIqXCI6IGZ1bmN0aW9uIF8oKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiBmdW5jdGlvbiB0eXBlKCkge1xuICAgICAgICAgICAgcmV0dXJuIFNuKHtcbiAgICAgICAgICAgICAga2V5OiBuICsgXCIudHlwZVwiLFxuICAgICAgICAgICAgICB2YWx1ZTogci50eXBlLFxuICAgICAgICAgICAgICB2YWx1ZVNwZWM6IGEubGF5ZXIudHlwZSxcbiAgICAgICAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgIG9iamVjdDogcixcbiAgICAgICAgICAgICAgb2JqZWN0S2V5OiBcInR5cGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWx0ZXI6IHluLFxuICAgICAgICAgIGxheW91dDogZnVuY3Rpb24gbGF5b3V0KHQpIHtcbiAgICAgICAgICAgIHJldHVybiBXcih7XG4gICAgICAgICAgICAgIGxheWVyOiByLFxuICAgICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZSxcbiAgICAgICAgICAgICAgc3R5bGU6IHQuc3R5bGUsXG4gICAgICAgICAgICAgIHN0eWxlU3BlYzogdC5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgXCIqXCI6IGZ1bmN0aW9uIF8odCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHZuKFR0KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJUeXBlOiBzXG4gICAgICAgICAgICAgICAgICB9LCB0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhaW50OiBmdW5jdGlvbiBwYWludCh0KSB7XG4gICAgICAgICAgICByZXR1cm4gV3Ioe1xuICAgICAgICAgICAgICBsYXllcjogcixcbiAgICAgICAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IHQudmFsdWUsXG4gICAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiBfKHQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtbihUdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyVHlwZTogc1xuICAgICAgICAgICAgICAgICAgfSwgdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geG4odCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LmtleSxcbiAgICAgICAgICBuID0gTHIoZSk7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIiAhPT0gbiA/IFtuZXcgTXQociwgZSwgXCJzdHJpbmcgZXhwZWN0ZWQsIFwiICsgbiArIFwiIGZvdW5kXCIpXSA6IFtdO1xuICAgIH1cblxuICAgIHZhciBibiA9IHtcbiAgICAgIHByb21vdGVJZDogZnVuY3Rpb24gcHJvbW90ZUlkKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LmtleSxcbiAgICAgICAgICAgIHIgPSB0LnZhbHVlO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gTHIocikpIHJldHVybiB4bih7XG4gICAgICAgICAga2V5OiBlLFxuICAgICAgICAgIHZhbHVlOiByXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbiA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gcikge1xuICAgICAgICAgIG4ucHVzaC5hcHBseShuLCB4bih7XG4gICAgICAgICAgICBrZXk6IGUgKyBcIi5cIiArIGksXG4gICAgICAgICAgICB2YWx1ZTogcltpXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB3bih0KSB7XG4gICAgICB2YXIgZSA9IHQudmFsdWUsXG4gICAgICAgICAgciA9IHQua2V5LFxuICAgICAgICAgIG4gPSB0LnN0eWxlU3BlYyxcbiAgICAgICAgICBpID0gdC5zdHlsZTtcbiAgICAgIGlmICghZS50eXBlKSByZXR1cm4gW25ldyBNdChyLCBlLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKV07XG4gICAgICB2YXIgYSxcbiAgICAgICAgICBvID0gVnQoZS50eXBlKTtcblxuICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgY2FzZSBcInJhc3RlclwiOlxuICAgICAgICBjYXNlIFwicmFzdGVyLWRlbVwiOlxuICAgICAgICAgIHJldHVybiBXcih7XG4gICAgICAgICAgICBrZXk6IHIsXG4gICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogbltcInNvdXJjZV9cIiArIG8ucmVwbGFjZShcIi1cIiwgXCJfXCIpXSxcbiAgICAgICAgICAgIHN0eWxlOiB0LnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBuLFxuICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IGJuXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcImdlb2pzb25cIjpcbiAgICAgICAgICBpZiAoYSA9IFdyKHtcbiAgICAgICAgICAgIGtleTogcixcbiAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBuLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGU6IGksXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG4sXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczogYm5cbiAgICAgICAgICB9KSwgZS5jbHVzdGVyKSBmb3IgKHZhciBzIGluIGUuY2x1c3RlclByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHZhciB1ID0gZS5jbHVzdGVyUHJvcGVydGllc1tzXSxcbiAgICAgICAgICAgICAgICBsID0gdVswXSxcbiAgICAgICAgICAgICAgICBwID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgbCA/IFtsLCBbXCJhY2N1bXVsYXRlZFwiXSwgW1wiZ2V0XCIsIHNdXSA6IGw7XG4gICAgICAgICAgICBhLnB1c2guYXBwbHkoYSwgcm4oe1xuICAgICAgICAgICAgICBrZXk6IHIgKyBcIi5cIiArIHMgKyBcIi5tYXBcIixcbiAgICAgICAgICAgICAgdmFsdWU6IHVbMV0sXG4gICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiBcImNsdXN0ZXItbWFwXCJcbiAgICAgICAgICAgIH0pKSwgYS5wdXNoLmFwcGx5KGEsIHJuKHtcbiAgICAgICAgICAgICAga2V5OiByICsgXCIuXCIgKyBzICsgXCIucmVkdWNlXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBwLFxuICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogXCJjbHVzdGVyLXJlZHVjZVwiXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhO1xuXG4gICAgICAgIGNhc2UgXCJ2aWRlb1wiOlxuICAgICAgICAgIHJldHVybiBXcih7XG4gICAgICAgICAgICBrZXk6IHIsXG4gICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogbi5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICBzdHlsZTogaSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICAgIHJldHVybiBXcih7XG4gICAgICAgICAgICBrZXk6IHIsXG4gICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogbi5zb3VyY2VfaW1hZ2UsXG4gICAgICAgICAgICBzdHlsZTogaSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJjYW52YXNcIjpcbiAgICAgICAgICByZXR1cm4gW25ldyBNdChyLCBudWxsLCBcIlBsZWFzZSB1c2UgcnVudGltZSBBUElzIHRvIGFkZCBjYW52YXMgc291cmNlcywgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIHRoZW0gaW4gc3R5bGVzaGVldHMuXCIsIFwic291cmNlLmNhbnZhc1wiKV07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbm4oe1xuICAgICAgICAgICAga2V5OiByICsgXCIudHlwZVwiLFxuICAgICAgICAgICAgdmFsdWU6IGUudHlwZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzoge1xuICAgICAgICAgICAgICB2YWx1ZXM6IFtcInZlY3RvclwiLCBcInJhc3RlclwiLCBcInJhc3Rlci1kZW1cIiwgXCJnZW9qc29uXCIsIFwidmlkZW9cIiwgXCJpbWFnZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlOiBpLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBuXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX24odCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LnN0eWxlU3BlYyxcbiAgICAgICAgICBuID0gci5saWdodCxcbiAgICAgICAgICBpID0gdC5zdHlsZSxcbiAgICAgICAgICBhID0gW10sXG4gICAgICAgICAgbyA9IExyKGUpO1xuICAgICAgaWYgKHZvaWQgMCA9PT0gZSkgcmV0dXJuIGE7XG4gICAgICBpZiAoXCJvYmplY3RcIiAhPT0gbykgcmV0dXJuIGEuY29uY2F0KFtuZXcgTXQoXCJsaWdodFwiLCBlLCBcIm9iamVjdCBleHBlY3RlZCwgXCIgKyBvICsgXCIgZm91bmRcIildKTtcblxuICAgICAgZm9yICh2YXIgcyBpbiBlKSB7XG4gICAgICAgIHZhciB1ID0gcy5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtcbiAgICAgICAgYSA9IGEuY29uY2F0KHUgJiYgblt1WzFdXSAmJiBuW3VbMV1dLnRyYW5zaXRpb24gPyBTbih7XG4gICAgICAgICAga2V5OiBzLFxuICAgICAgICAgIHZhbHVlOiBlW3NdLFxuICAgICAgICAgIHZhbHVlU3BlYzogci50cmFuc2l0aW9uLFxuICAgICAgICAgIHN0eWxlOiBpLFxuICAgICAgICAgIHN0eWxlU3BlYzogclxuICAgICAgICB9KSA6IG5bc10gPyBTbih7XG4gICAgICAgICAga2V5OiBzLFxuICAgICAgICAgIHZhbHVlOiBlW3NdLFxuICAgICAgICAgIHZhbHVlU3BlYzogbltzXSxcbiAgICAgICAgICBzdHlsZTogaSxcbiAgICAgICAgICBzdHlsZVNwZWM6IHJcbiAgICAgICAgfSkgOiBbbmV3IE10KHMsIGVbc10sICd1bmtub3duIHByb3BlcnR5IFwiJyArIHMgKyAnXCInKV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICB2YXIgQW4gPSB7XG4gICAgICBcIipcIjogZnVuY3Rpb24gXygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSxcbiAgICAgIGFycmF5OiBRcixcbiAgICAgIGJvb2xlYW46IGZ1bmN0aW9uIGJvb2xlYW4odCkge1xuICAgICAgICB2YXIgZSA9IHQudmFsdWUsXG4gICAgICAgICAgICByID0gdC5rZXksXG4gICAgICAgICAgICBuID0gTHIoZSk7XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5cIiAhPT0gbiA/IFtuZXcgTXQociwgZSwgXCJib29sZWFuIGV4cGVjdGVkLCBcIiArIG4gKyBcIiBmb3VuZFwiKV0gOiBbXTtcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHRuLFxuICAgICAgY29sb3I6IGZ1bmN0aW9uIGNvbG9yKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LmtleSxcbiAgICAgICAgICAgIHIgPSB0LnZhbHVlLFxuICAgICAgICAgICAgbiA9IExyKHIpO1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiAhPT0gbiA/IFtuZXcgTXQoZSwgciwgXCJjb2xvciBleHBlY3RlZCwgXCIgKyBuICsgXCIgZm91bmRcIildIDogbnVsbCA9PT0gdGUocikgPyBbbmV3IE10KGUsIHIsICdjb2xvciBleHBlY3RlZCwgXCInICsgciArICdcIiBmb3VuZCcpXSA6IFtdO1xuICAgICAgfSxcbiAgICAgIGNvbnN0YW50czogQnQsXG4gICAgICBlbnVtOiBubixcbiAgICAgIGZpbHRlcjogeW4sXG4gICAgICBmdW5jdGlvbjogZW4sXG4gICAgICBsYXllcjogZ24sXG4gICAgICBvYmplY3Q6IFdyLFxuICAgICAgc291cmNlOiB3bixcbiAgICAgIGxpZ2h0OiBfbixcbiAgICAgIHN0cmluZzogeG4sXG4gICAgICBmb3JtYXR0ZWQ6IGZ1bmN0aW9uIGZvcm1hdHRlZCh0KSB7XG4gICAgICAgIHJldHVybiAwID09PSB4bih0KS5sZW5ndGggPyBbXSA6IHJuKHQpO1xuICAgICAgfSxcbiAgICAgIHJlc29sdmVkSW1hZ2U6IGZ1bmN0aW9uIHJlc29sdmVkSW1hZ2UodCkge1xuICAgICAgICByZXR1cm4gMCA9PT0geG4odCkubGVuZ3RoID8gW10gOiBybih0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gU24odCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LnZhbHVlU3BlYyxcbiAgICAgICAgICBuID0gdC5zdHlsZVNwZWM7XG4gICAgICByZXR1cm4gci5leHByZXNzaW9uICYmIFJyKFZ0KGUpKSA/IGVuKHQpIDogci5leHByZXNzaW9uICYmIFpyKEZ0KGUpKSA/IHJuKHQpIDogci50eXBlICYmIEFuW3IudHlwZV0gPyBBbltyLnR5cGVdKHQpIDogV3IoVHQoe30sIHQsIHtcbiAgICAgICAgdmFsdWVTcGVjOiByLnR5cGUgPyBuW3IudHlwZV0gOiByXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga24odCkge1xuICAgICAgdmFyIGUgPSB0LnZhbHVlLFxuICAgICAgICAgIHIgPSB0LmtleSxcbiAgICAgICAgICBuID0geG4odCk7XG4gICAgICByZXR1cm4gbi5sZW5ndGggfHwgKC0xID09PSBlLmluZGV4T2YoXCJ7Zm9udHN0YWNrfVwiKSAmJiBuLnB1c2gobmV3IE10KHIsIGUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntmb250c3RhY2t9XCIgdG9rZW4nKSksIC0xID09PSBlLmluZGV4T2YoXCJ7cmFuZ2V9XCIpICYmIG4ucHVzaChuZXcgTXQociwgZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie3JhbmdlfVwiIHRva2VuJykpKSwgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJbih0LCBlKSB7XG4gICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBQdCk7XG4gICAgICB2YXIgciA9IFtdO1xuICAgICAgcmV0dXJuIHIgPSByLmNvbmNhdChTbih7XG4gICAgICAgIGtleTogXCJcIixcbiAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgIHZhbHVlU3BlYzogZS4kcm9vdCxcbiAgICAgICAgc3R5bGVTcGVjOiBlLFxuICAgICAgICBzdHlsZTogdCxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICBnbHlwaHM6IGtuLFxuICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiBfKCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpLCB0LmNvbnN0YW50cyAmJiAociA9IHIuY29uY2F0KEJ0KHtcbiAgICAgICAga2V5OiBcImNvbnN0YW50c1wiLFxuICAgICAgICB2YWx1ZTogdC5jb25zdGFudHMsXG4gICAgICAgIHN0eWxlOiB0LFxuICAgICAgICBzdHlsZVNwZWM6IGVcbiAgICAgIH0pKSksIHpuKHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHpuKHQpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQodCkuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5saW5lIC0gZS5saW5lO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ24odCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IFtdLCByID0gYXJndW1lbnRzLmxlbmd0aDsgci0tOykge1xuICAgICAgICAgIGVbcl0gPSBhcmd1bWVudHNbcl07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gem4odC5hcHBseSh0aGlzLCBlKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIEluLnNvdXJjZSA9IENuKHduKSwgSW4ubGlnaHQgPSBDbihfbiksIEluLmxheWVyID0gQ24oZ24pLCBJbi5maWx0ZXIgPSBDbih5biksIEluLnBhaW50UHJvcGVydHkgPSBDbihtbiksIEluLmxheW91dFByb3BlcnR5ID0gQ24odm4pO1xuICAgIHZhciBFbiA9IEluLFxuICAgICAgICBQbiA9IEVuLmxpZ2h0LFxuICAgICAgICBNbiA9IEVuLnBhaW50UHJvcGVydHksXG4gICAgICAgIEJuID0gRW4ubGF5b3V0UHJvcGVydHk7XG5cbiAgICBmdW5jdGlvbiBUbih0LCBlKSB7XG4gICAgICB2YXIgciA9ICExO1xuICAgICAgaWYgKGUgJiYgZS5sZW5ndGgpIGZvciAodmFyIG4gPSAwLCBpID0gZTsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdC5maXJlKG5ldyBDdChuZXcgRXJyb3IoaVtuXS5tZXNzYWdlKSkpLCByID0gITA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICB2YXIgVm4gPSBGbjtcblxuICAgIGZ1bmN0aW9uIEZuKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdGhpcy5jZWxscyA9IFtdO1xuXG4gICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSB0O1xuICAgICAgICB2YXIgaSA9IG5ldyBJbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0ID0gaVswXSwgdGhpcy5kID0gKGUgPSBpWzFdKSArIDIgKiAociA9IGlbMl0pO1xuXG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgdGhpcy5kICogdGhpcy5kOyBhKyspIHtcbiAgICAgICAgICB2YXIgbyA9IGlbMyArIGFdLFxuICAgICAgICAgICAgICBzID0gaVszICsgYSArIDFdO1xuICAgICAgICAgIG4ucHVzaChvID09PSBzID8gbnVsbCA6IGkuc3ViYXJyYXkobywgcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHUgPSBpWzMgKyBuLmxlbmd0aCArIDFdO1xuICAgICAgICB0aGlzLmtleXMgPSBpLnN1YmFycmF5KGlbMyArIG4ubGVuZ3RoXSwgdSksIHRoaXMuYmJveGVzID0gaS5zdWJhcnJheSh1KSwgdGhpcy5pbnNlcnQgPSB0aGlzLl9pbnNlcnRSZWFkb25seTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZCA9IGUgKyAyICogcjtcblxuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHRoaXMuZCAqIHRoaXMuZDsgbCsrKSB7XG4gICAgICAgICAgbi5wdXNoKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua2V5cyA9IFtdLCB0aGlzLmJib3hlcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm4gPSBlLCB0aGlzLmV4dGVudCA9IHQsIHRoaXMucGFkZGluZyA9IHIsIHRoaXMuc2NhbGUgPSBlIC8gdCwgdGhpcy51aWQgPSAwO1xuICAgICAgdmFyIHAgPSByIC8gZSAqIHQ7XG4gICAgICB0aGlzLm1pbiA9IC1wLCB0aGlzLm1heCA9IHQgKyBwO1xuICAgIH1cblxuICAgIEZuLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy5fZm9yRWFjaENlbGwoZSwgciwgbiwgaSwgdGhpcy5faW5zZXJ0Q2VsbCwgdGhpcy51aWQrKyksIHRoaXMua2V5cy5wdXNoKHQpLCB0aGlzLmJib3hlcy5wdXNoKGUpLCB0aGlzLmJib3hlcy5wdXNoKHIpLCB0aGlzLmJib3hlcy5wdXNoKG4pLCB0aGlzLmJib3hlcy5wdXNoKGkpO1xuICAgIH0sIEZuLnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBcIkNhbm5vdCBpbnNlcnQgaW50byBhIEdyaWRJbmRleCBjcmVhdGVkIGZyb20gYW4gQXJyYXlCdWZmZXIuXCI7XG4gICAgfSwgRm4ucHJvdG90eXBlLl9pbnNlcnRDZWxsID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucHVzaChhKTtcbiAgICB9LCBGbi5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgdmFyIGEgPSB0aGlzLm1pbixcbiAgICAgICAgICBvID0gdGhpcy5tYXg7XG4gICAgICBpZiAodCA8PSBhICYmIGUgPD0gYSAmJiBvIDw9IHIgJiYgbyA8PSBuICYmICFpKSByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcbiAgICAgIHZhciBzID0gW107XG4gICAgICByZXR1cm4gdGhpcy5fZm9yRWFjaENlbGwodCwgZSwgciwgbiwgdGhpcy5fcXVlcnlDZWxsLCBzLCB7fSwgaSksIHM7XG4gICAgfSwgRm4ucHJvdG90eXBlLl9xdWVyeUNlbGwgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcykge1xuICAgICAgdmFyIHUgPSB0aGlzLmNlbGxzW2ldO1xuICAgICAgaWYgKG51bGwgIT09IHUpIGZvciAodmFyIGwgPSB0aGlzLmtleXMsIHAgPSB0aGlzLmJib3hlcywgYyA9IDA7IGMgPCB1Lmxlbmd0aDsgYysrKSB7XG4gICAgICAgIHZhciBoID0gdVtjXTtcblxuICAgICAgICBpZiAodm9pZCAwID09PSBvW2hdKSB7XG4gICAgICAgICAgdmFyIGYgPSA0ICogaDtcbiAgICAgICAgICAocyA/IHMocFtmICsgMF0sIHBbZiArIDFdLCBwW2YgKyAyXSwgcFtmICsgM10pIDogdCA8PSBwW2YgKyAyXSAmJiBlIDw9IHBbZiArIDNdICYmIHIgPj0gcFtmICsgMF0gJiYgbiA+PSBwW2YgKyAxXSkgPyAob1toXSA9ICEwLCBhLnB1c2gobFtoXSkpIDogb1toXSA9ICExO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgRm4ucHJvdG90eXBlLl9mb3JFYWNoQ2VsbCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICBmb3IgKHZhciB1ID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHQpLCBsID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKGUpLCBwID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHIpLCBjID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKG4pLCBoID0gdTsgaCA8PSBwOyBoKyspIHtcbiAgICAgICAgZm9yICh2YXIgZiA9IGw7IGYgPD0gYzsgZisrKSB7XG4gICAgICAgICAgdmFyIHkgPSB0aGlzLmQgKiBmICsgaDtcbiAgICAgICAgICBpZiAoKCFzIHx8IHModGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoaCksIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKGYpLCB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZChoICsgMSksIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKGYgKyAxKSkpICYmIGkuY2FsbCh0aGlzLCB0LCBlLCByLCBuLCB5LCBhLCBvLCBzKSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgRm4ucHJvdG90eXBlLl9jb252ZXJ0RnJvbUNlbGxDb29yZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gKHQgLSB0aGlzLnBhZGRpbmcpIC8gdGhpcy5zY2FsZTtcbiAgICB9LCBGbi5wcm90b3R5cGUuX2NvbnZlcnRUb0NlbGxDb29yZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5kIC0gMSwgTWF0aC5mbG9vcih0ICogdGhpcy5zY2FsZSkgKyB0aGlzLnBhZGRpbmcpKTtcbiAgICB9LCBGbi5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmFycmF5QnVmZmVyKSByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcjtcblxuICAgICAgZm9yICh2YXIgdCA9IHRoaXMuY2VsbHMsIGUgPSAzICsgdGhpcy5jZWxscy5sZW5ndGggKyAxICsgMSwgciA9IDAsIG4gPSAwOyBuIDwgdGhpcy5jZWxscy5sZW5ndGg7IG4rKykge1xuICAgICAgICByICs9IHRoaXMuY2VsbHNbbl0ubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICB2YXIgaSA9IG5ldyBJbnQzMkFycmF5KGUgKyByICsgdGhpcy5rZXlzLmxlbmd0aCArIHRoaXMuYmJveGVzLmxlbmd0aCk7XG4gICAgICBpWzBdID0gdGhpcy5leHRlbnQsIGlbMV0gPSB0aGlzLm4sIGlbMl0gPSB0aGlzLnBhZGRpbmc7XG5cbiAgICAgIGZvciAodmFyIGEgPSBlLCBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgdmFyIHMgPSB0W29dO1xuICAgICAgICBpWzMgKyBvXSA9IGEsIGkuc2V0KHMsIGEpLCBhICs9IHMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaVszICsgdC5sZW5ndGhdID0gYSwgaS5zZXQodGhpcy5rZXlzLCBhKSwgaVszICsgdC5sZW5ndGggKyAxXSA9IGEgKz0gdGhpcy5rZXlzLmxlbmd0aCwgaS5zZXQodGhpcy5iYm94ZXMsIGEpLCBhICs9IHRoaXMuYmJveGVzLmxlbmd0aCwgaS5idWZmZXI7XG4gICAgfTtcbiAgICB2YXIgRG4gPSBvLkltYWdlRGF0YSxcbiAgICAgICAgTG4gPSBvLkltYWdlQml0bWFwLFxuICAgICAgICBSbiA9IHt9O1xuXG4gICAgZnVuY3Rpb24gT24odCwgZSwgcikge1xuICAgICAgdm9pZCAwID09PSByICYmIChyID0ge30pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfY2xhc3NSZWdpc3RyeUtleVwiLCB7XG4gICAgICAgIHZhbHVlOiB0LFxuICAgICAgICB3cml0ZWFibGU6ICExXG4gICAgICB9KSwgUm5bdF0gPSB7XG4gICAgICAgIGtsYXNzOiBlLFxuICAgICAgICBvbWl0OiByLm9taXQgfHwgW10sXG4gICAgICAgIHNoYWxsb3c6IHIuc2hhbGxvdyB8fCBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBVbiBpbiBPbihcIk9iamVjdFwiLCBPYmplY3QpLCBWbi5zZXJpYWxpemUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0LnRvQXJyYXlCdWZmZXIoKTtcbiAgICAgIHJldHVybiBlICYmIGUucHVzaChyKSwge1xuICAgICAgICBidWZmZXI6IHJcbiAgICAgIH07XG4gICAgfSwgVm4uZGVzZXJpYWxpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG5ldyBWbih0LmJ1ZmZlcik7XG4gICAgfSwgT24oXCJHcmlkXCIsIFZuKSwgT24oXCJDb2xvclwiLCBlZSksIE9uKFwiRXJyb3JcIiwgRXJyb3IpLCBPbihcIlJlc29sdmVkSW1hZ2VcIiwgYWUpLCBPbihcIlN0eWxlUHJvcGVydHlGdW5jdGlvblwiLCAkciksIE9uKFwiU3R5bGVFeHByZXNzaW9uXCIsIEdyLCB7XG4gICAgICBvbWl0OiBbXCJfZXZhbHVhdG9yXCJdXG4gICAgfSksIE9uKFwiWm9vbURlcGVuZGVudEV4cHJlc3Npb25cIiwgSHIpLCBPbihcIlpvb21Db25zdGFudEV4cHJlc3Npb25cIiwgSnIpLCBPbihcIkNvbXBvdW5kRXhwcmVzc2lvblwiLCBiZSwge1xuICAgICAgb21pdDogW1wiX2V2YWx1YXRlXCJdXG4gICAgfSksIHpyKSB7XG4gICAgICB6cltVbl0uX2NsYXNzUmVnaXN0cnlLZXkgfHwgT24oXCJFeHByZXNzaW9uX1wiICsgVW4sIHpyW1VuXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gam4odCkge1xuICAgICAgcmV0dXJuIHQgJiYgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgQXJyYXlCdWZmZXIgJiYgKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCB0LmNvbnN0cnVjdG9yICYmIFwiQXJyYXlCdWZmZXJcIiA9PT0gdC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxbih0KSB7XG4gICAgICByZXR1cm4gTG4gJiYgdCBpbnN0YW5jZW9mIExuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE5uKHQsIGUpIHtcbiAgICAgIGlmIChudWxsID09IHQgfHwgXCJib29sZWFuXCIgPT0gdHlwZW9mIHQgfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCBcInN0cmluZ1wiID09IHR5cGVvZiB0IHx8IHQgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHQgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0IGluc3RhbmNlb2YgRGF0ZSB8fCB0IGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gdDtcbiAgICAgIGlmIChqbih0KSB8fCBxbih0KSkgcmV0dXJuIGUgJiYgZS5wdXNoKHQpLCB0O1xuXG4gICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHQpKSB7XG4gICAgICAgIHZhciByID0gdDtcbiAgICAgICAgcmV0dXJuIGUgJiYgZS5wdXNoKHIuYnVmZmVyKSwgcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBEbikgcmV0dXJuIGUgJiYgZS5wdXNoKHQuZGF0YS5idWZmZXIpLCB0O1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwLCBhID0gdDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBuLnB1c2goTm4oYVtpXSwgZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG5cbiAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIHZhciBvID0gdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHMgPSBvLl9jbGFzc1JlZ2lzdHJ5S2V5O1xuICAgICAgICBpZiAoIXMpIHRocm93IG5ldyBFcnJvcihcImNhbid0IHNlcmlhbGl6ZSBvYmplY3Qgb2YgdW5yZWdpc3RlcmVkIGNsYXNzXCIpO1xuICAgICAgICB2YXIgdSA9IG8uc2VyaWFsaXplID8gby5zZXJpYWxpemUodCwgZSkgOiB7fTtcblxuICAgICAgICBpZiAoIW8uc2VyaWFsaXplKSB7XG4gICAgICAgICAgZm9yICh2YXIgbCBpbiB0KSB7XG4gICAgICAgICAgICBpZiAodC5oYXNPd25Qcm9wZXJ0eShsKSAmJiAhKFJuW3NdLm9taXQuaW5kZXhPZihsKSA+PSAwKSkge1xuICAgICAgICAgICAgICB2YXIgcCA9IHRbbF07XG4gICAgICAgICAgICAgIHVbbF0gPSBSbltzXS5zaGFsbG93LmluZGV4T2YobCkgPj0gMCA/IHAgOiBObihwLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0IGluc3RhbmNlb2YgRXJyb3IgJiYgKHUubWVzc2FnZSA9IHQubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodS4kbmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiJG5hbWUgcHJvcGVydHkgaXMgcmVzZXJ2ZWQgZm9yIHdvcmtlciBzZXJpYWxpemF0aW9uIGxvZ2ljLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiT2JqZWN0XCIgIT09IHMgJiYgKHUuJG5hbWUgPSBzKSwgdTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlIFwiICsgdHlwZW9mIHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEtuKHQpIHtcbiAgICAgIGlmIChudWxsID09IHQgfHwgXCJib29sZWFuXCIgPT0gdHlwZW9mIHQgfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCBcInN0cmluZ1wiID09IHR5cGVvZiB0IHx8IHQgaW5zdGFuY2VvZiBCb29sZWFuIHx8IHQgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0IGluc3RhbmNlb2YgRGF0ZSB8fCB0IGluc3RhbmNlb2YgUmVnRXhwIHx8IGpuKHQpIHx8IHFuKHQpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh0KSB8fCB0IGluc3RhbmNlb2YgRG4pIHJldHVybiB0O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHJldHVybiB0Lm1hcChLbik7XG5cbiAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIHZhciBlID0gdC4kbmFtZSB8fCBcIk9iamVjdFwiLFxuICAgICAgICAgICAgciA9IFJuW2VdLmtsYXNzO1xuICAgICAgICBpZiAoIXIpIHRocm93IG5ldyBFcnJvcihcImNhbid0IGRlc2VyaWFsaXplIHVucmVnaXN0ZXJlZCBjbGFzcyBcIiArIGUpO1xuICAgICAgICBpZiAoci5kZXNlcmlhbGl6ZSkgcmV0dXJuIHIuZGVzZXJpYWxpemUodCk7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9IE9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLCBpID0gMCwgYSA9IE9iamVjdC5rZXlzKHQpOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBvID0gYVtpXTtcblxuICAgICAgICAgIGlmIChcIiRuYW1lXCIgIT09IG8pIHtcbiAgICAgICAgICAgIHZhciBzID0gdFtvXTtcbiAgICAgICAgICAgIG5bb10gPSBSbltlXS5zaGFsbG93LmluZGV4T2YobykgPj0gMCA/IHMgOiBLbihzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZGVzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgXCIgKyB0eXBlb2YgdCk7XG4gICAgfVxuXG4gICAgdmFyIEduID0gZnVuY3Rpb24gR24oKSB7XG4gICAgICB0aGlzLmZpcnN0ID0gITA7XG4gICAgfTtcblxuICAgIEduLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSBNYXRoLmZsb29yKHQpO1xuICAgICAgcmV0dXJuIHRoaXMuZmlyc3QgPyAodGhpcy5maXJzdCA9ICExLCB0aGlzLmxhc3RJbnRlZ2VyWm9vbSA9IHIsIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IDAsIHRoaXMubGFzdFpvb20gPSB0LCB0aGlzLmxhc3RGbG9vclpvb20gPSByLCAhMCkgOiAodGhpcy5sYXN0Rmxvb3Jab29tID4gciA/ICh0aGlzLmxhc3RJbnRlZ2VyWm9vbSA9IHIgKyAxLCB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSBlKSA6IHRoaXMubGFzdEZsb29yWm9vbSA8IHIgJiYgKHRoaXMubGFzdEludGVnZXJab29tID0gciwgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gZSksIHQgIT09IHRoaXMubGFzdFpvb20gJiYgKHRoaXMubGFzdFpvb20gPSB0LCB0aGlzLmxhc3RGbG9vclpvb20gPSByLCAhMCkpO1xuICAgIH07XG5cbiAgICB2YXIgWm4gPSB7XG4gICAgICBcIkxhdGluLTEgU3VwcGxlbWVudFwiOiBmdW5jdGlvbiBMYXRpbjFTdXBwbGVtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI4ICYmIHQgPD0gMjU1O1xuICAgICAgfSxcbiAgICAgIEFyYWJpYzogZnVuY3Rpb24gQXJhYmljKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTUzNiAmJiB0IDw9IDE3OTE7XG4gICAgICB9LFxuICAgICAgXCJBcmFiaWMgU3VwcGxlbWVudFwiOiBmdW5jdGlvbiBBcmFiaWNTdXBwbGVtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTg3MiAmJiB0IDw9IDE5MTk7XG4gICAgICB9LFxuICAgICAgXCJBcmFiaWMgRXh0ZW5kZWQtQVwiOiBmdW5jdGlvbiBBcmFiaWNFeHRlbmRlZEEodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAyMjA4ICYmIHQgPD0gMjMwMztcbiAgICAgIH0sXG4gICAgICBcIkhhbmd1bCBKYW1vXCI6IGZ1bmN0aW9uIEhhbmd1bEphbW8odCkge1xuICAgICAgICByZXR1cm4gdCA+PSA0MzUyICYmIHQgPD0gNDYwNztcbiAgICAgIH0sXG4gICAgICBcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcIjogZnVuY3Rpb24gVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDUxMjAgJiYgdCA8PSA1NzU5O1xuICAgICAgfSxcbiAgICAgIEtobWVyOiBmdW5jdGlvbiBLaG1lcih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDYwMTYgJiYgdCA8PSA2MTQzO1xuICAgICAgfSxcbiAgICAgIFwiVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZFwiOiBmdW5jdGlvbiBVbmlmaWVkQ2FuYWRpYW5BYm9yaWdpbmFsU3lsbGFiaWNzRXh0ZW5kZWQodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2MzIwICYmIHQgPD0gNjM5OTtcbiAgICAgIH0sXG4gICAgICBcIkdlbmVyYWwgUHVuY3R1YXRpb25cIjogZnVuY3Rpb24gR2VuZXJhbFB1bmN0dWF0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gODE5MiAmJiB0IDw9IDgzMDM7XG4gICAgICB9LFxuICAgICAgXCJMZXR0ZXJsaWtlIFN5bWJvbHNcIjogZnVuY3Rpb24gTGV0dGVybGlrZVN5bWJvbHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA4NDQ4ICYmIHQgPD0gODUyNztcbiAgICAgIH0sXG4gICAgICBcIk51bWJlciBGb3Jtc1wiOiBmdW5jdGlvbiBOdW1iZXJGb3Jtcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDg1MjggJiYgdCA8PSA4NTkxO1xuICAgICAgfSxcbiAgICAgIFwiTWlzY2VsbGFuZW91cyBUZWNobmljYWxcIjogZnVuY3Rpb24gTWlzY2VsbGFuZW91c1RlY2huaWNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDg5NjAgJiYgdCA8PSA5MjE1O1xuICAgICAgfSxcbiAgICAgIFwiQ29udHJvbCBQaWN0dXJlc1wiOiBmdW5jdGlvbiBDb250cm9sUGljdHVyZXModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA5MjE2ICYmIHQgPD0gOTI3OTtcbiAgICAgIH0sXG4gICAgICBcIk9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uXCI6IGZ1bmN0aW9uIE9wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDkyODAgJiYgdCA8PSA5MzExO1xuICAgICAgfSxcbiAgICAgIFwiRW5jbG9zZWQgQWxwaGFudW1lcmljc1wiOiBmdW5jdGlvbiBFbmNsb3NlZEFscGhhbnVtZXJpY3ModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA5MzEyICYmIHQgPD0gOTQ3MTtcbiAgICAgIH0sXG4gICAgICBcIkdlb21ldHJpYyBTaGFwZXNcIjogZnVuY3Rpb24gR2VvbWV0cmljU2hhcGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gOTYzMiAmJiB0IDw9IDk3Mjc7XG4gICAgICB9LFxuICAgICAgXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHNcIjogZnVuY3Rpb24gTWlzY2VsbGFuZW91c1N5bWJvbHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA5NzI4ICYmIHQgPD0gOTk4MztcbiAgICAgIH0sXG4gICAgICBcIk1pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzXCI6IGZ1bmN0aW9uIE1pc2NlbGxhbmVvdXNTeW1ib2xzQW5kQXJyb3dzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTEwMDggJiYgdCA8PSAxMTI2MztcbiAgICAgIH0sXG4gICAgICBcIkNKSyBSYWRpY2FscyBTdXBwbGVtZW50XCI6IGZ1bmN0aW9uIENKS1JhZGljYWxzU3VwcGxlbWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDExOTA0ICYmIHQgPD0gMTIwMzE7XG4gICAgICB9LFxuICAgICAgXCJLYW5neGkgUmFkaWNhbHNcIjogZnVuY3Rpb24gS2FuZ3hpUmFkaWNhbHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjAzMiAmJiB0IDw9IDEyMjU1O1xuICAgICAgfSxcbiAgICAgIFwiSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVyc1wiOiBmdW5jdGlvbiBJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyMjcyICYmIHQgPD0gMTIyODc7XG4gICAgICB9LFxuICAgICAgXCJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb25cIjogZnVuY3Rpb24gQ0pLU3ltYm9sc0FuZFB1bmN0dWF0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTIyODggJiYgdCA8PSAxMjM1MTtcbiAgICAgIH0sXG4gICAgICBIaXJhZ2FuYTogZnVuY3Rpb24gSGlyYWdhbmEodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjM1MiAmJiB0IDw9IDEyNDQ3O1xuICAgICAgfSxcbiAgICAgIEthdGFrYW5hOiBmdW5jdGlvbiBLYXRha2FuYSh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyNDQ4ICYmIHQgPD0gMTI1NDM7XG4gICAgICB9LFxuICAgICAgQm9wb21vZm86IGZ1bmN0aW9uIEJvcG9tb2ZvKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI1NDQgJiYgdCA8PSAxMjU5MTtcbiAgICAgIH0sXG4gICAgICBcIkhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cIjogZnVuY3Rpb24gSGFuZ3VsQ29tcGF0aWJpbGl0eUphbW8odCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjU5MiAmJiB0IDw9IDEyNjg3O1xuICAgICAgfSxcbiAgICAgIEthbmJ1bjogZnVuY3Rpb24gS2FuYnVuKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI2ODggJiYgdCA8PSAxMjcwMztcbiAgICAgIH0sXG4gICAgICBcIkJvcG9tb2ZvIEV4dGVuZGVkXCI6IGZ1bmN0aW9uIEJvcG9tb2ZvRXh0ZW5kZWQodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMjcwNCAmJiB0IDw9IDEyNzM1O1xuICAgICAgfSxcbiAgICAgIFwiQ0pLIFN0cm9rZXNcIjogZnVuY3Rpb24gQ0pLU3Ryb2tlcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDEyNzM2ICYmIHQgPD0gMTI3ODM7XG4gICAgICB9LFxuICAgICAgXCJLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zXCI6IGZ1bmN0aW9uIEthdGFrYW5hUGhvbmV0aWNFeHRlbnNpb25zKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI3ODQgJiYgdCA8PSAxMjc5OTtcbiAgICAgIH0sXG4gICAgICBcIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHNcIjogZnVuY3Rpb24gRW5jbG9zZWRDSktMZXR0ZXJzQW5kTW9udGhzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTI4MDAgJiYgdCA8PSAxMzA1NTtcbiAgICAgIH0sXG4gICAgICBcIkNKSyBDb21wYXRpYmlsaXR5XCI6IGZ1bmN0aW9uIENKS0NvbXBhdGliaWxpdHkodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMzA1NiAmJiB0IDw9IDEzMzExO1xuICAgICAgfSxcbiAgICAgIFwiQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQVwiOiBmdW5jdGlvbiBDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkEodCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxMzMxMiAmJiB0IDw9IDE5OTAzO1xuICAgICAgfSxcbiAgICAgIFwiWWlqaW5nIEhleGFncmFtIFN5bWJvbHNcIjogZnVuY3Rpb24gWWlqaW5nSGV4YWdyYW1TeW1ib2xzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gMTk5MDQgJiYgdCA8PSAxOTk2NztcbiAgICAgIH0sXG4gICAgICBcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHNcIjogZnVuY3Rpb24gQ0pLVW5pZmllZElkZW9ncmFwaHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSAxOTk2OCAmJiB0IDw9IDQwOTU5O1xuICAgICAgfSxcbiAgICAgIFwiWWkgU3lsbGFibGVzXCI6IGZ1bmN0aW9uIFlpU3lsbGFibGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNDA5NjAgJiYgdCA8PSA0MjEyNztcbiAgICAgIH0sXG4gICAgICBcIllpIFJhZGljYWxzXCI6IGZ1bmN0aW9uIFlpUmFkaWNhbHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA0MjEyOCAmJiB0IDw9IDQyMTkxO1xuICAgICAgfSxcbiAgICAgIFwiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQVwiOiBmdW5jdGlvbiBIYW5ndWxKYW1vRXh0ZW5kZWRBKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNDMzNjAgJiYgdCA8PSA0MzM5MTtcbiAgICAgIH0sXG4gICAgICBcIkhhbmd1bCBTeWxsYWJsZXNcIjogZnVuY3Rpb24gSGFuZ3VsU3lsbGFibGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNDQwMzIgJiYgdCA8PSA1NTIxNTtcbiAgICAgIH0sXG4gICAgICBcIkhhbmd1bCBKYW1vIEV4dGVuZGVkLUJcIjogZnVuY3Rpb24gSGFuZ3VsSmFtb0V4dGVuZGVkQih0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDU1MjE2ICYmIHQgPD0gNTUyOTU7XG4gICAgICB9LFxuICAgICAgXCJQcml2YXRlIFVzZSBBcmVhXCI6IGZ1bmN0aW9uIFByaXZhdGVVc2VBcmVhKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNTczNDQgJiYgdCA8PSA2Mzc0MztcbiAgICAgIH0sXG4gICAgICBcIkNKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcIjogZnVuY3Rpb24gQ0pLQ29tcGF0aWJpbGl0eUlkZW9ncmFwaHModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2Mzc0NCAmJiB0IDw9IDY0MjU1O1xuICAgICAgfSxcbiAgICAgIFwiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BXCI6IGZ1bmN0aW9uIEFyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQSh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDY0MzM2ICYmIHQgPD0gNjUwMjM7XG4gICAgICB9LFxuICAgICAgXCJWZXJ0aWNhbCBGb3Jtc1wiOiBmdW5jdGlvbiBWZXJ0aWNhbEZvcm1zKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjUwNDAgJiYgdCA8PSA2NTA1NTtcbiAgICAgIH0sXG4gICAgICBcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCI6IGZ1bmN0aW9uIENKS0NvbXBhdGliaWxpdHlGb3Jtcyh0KSB7XG4gICAgICAgIHJldHVybiB0ID49IDY1MDcyICYmIHQgPD0gNjUxMDM7XG4gICAgICB9LFxuICAgICAgXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCI6IGZ1bmN0aW9uIFNtYWxsRm9ybVZhcmlhbnRzKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPj0gNjUxMDQgJiYgdCA8PSA2NTEzNTtcbiAgICAgIH0sXG4gICAgICBcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQlwiOiBmdW5jdGlvbiBBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0IodCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2NTEzNiAmJiB0IDw9IDY1Mjc5O1xuICAgICAgfSxcbiAgICAgIFwiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXNcIjogZnVuY3Rpb24gSGFsZndpZHRoQW5kRnVsbHdpZHRoRm9ybXModCkge1xuICAgICAgICByZXR1cm4gdCA+PSA2NTI4MCAmJiB0IDw9IDY1NTE5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBYbih0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQ7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIGlmIChKbihyW2VdLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBKbih0KSB7XG4gICAgICByZXR1cm4gISg3NDYgIT09IHQgJiYgNzQ3ICE9PSB0ICYmICh0IDwgNDM1MiB8fCAhKFpuW1wiQm9wb21vZm8gRXh0ZW5kZWRcIl0odCkgfHwgWm4uQm9wb21vZm8odCkgfHwgWm5bXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiXSh0KSAmJiAhKHQgPj0gNjUwOTcgJiYgdCA8PSA2NTEwMykgfHwgWm5bXCJDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzXCJdKHQpIHx8IFpuW1wiQ0pLIENvbXBhdGliaWxpdHlcIl0odCkgfHwgWm5bXCJDSksgUmFkaWNhbHMgU3VwcGxlbWVudFwiXSh0KSB8fCBabltcIkNKSyBTdHJva2VzXCJdKHQpIHx8ICEoIVpuW1wiQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uXCJdKHQpIHx8IHQgPj0gMTIyOTYgJiYgdCA8PSAxMjMwNSB8fCB0ID49IDEyMzA4ICYmIHQgPD0gMTIzMTkgfHwgMTIzMzYgPT09IHQpIHx8IFpuW1wiQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQVwiXSh0KSB8fCBabltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHNcIl0odCkgfHwgWm5bXCJFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXCJdKHQpIHx8IFpuW1wiSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtb1wiXSh0KSB8fCBabltcIkhhbmd1bCBKYW1vIEV4dGVuZGVkLUFcIl0odCkgfHwgWm5bXCJIYW5ndWwgSmFtbyBFeHRlbmRlZC1CXCJdKHQpIHx8IFpuW1wiSGFuZ3VsIEphbW9cIl0odCkgfHwgWm5bXCJIYW5ndWwgU3lsbGFibGVzXCJdKHQpIHx8IFpuLkhpcmFnYW5hKHQpIHx8IFpuW1wiSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVyc1wiXSh0KSB8fCBabi5LYW5idW4odCkgfHwgWm5bXCJLYW5neGkgUmFkaWNhbHNcIl0odCkgfHwgWm5bXCJLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zXCJdKHQpIHx8IFpuLkthdGFrYW5hKHQpICYmIDEyNTQwICE9PSB0IHx8ICEoIVpuW1wiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXNcIl0odCkgfHwgNjUyODggPT09IHQgfHwgNjUyODkgPT09IHQgfHwgNjUyOTMgPT09IHQgfHwgdCA+PSA2NTMwNiAmJiB0IDw9IDY1MzEwIHx8IDY1MzM5ID09PSB0IHx8IDY1MzQxID09PSB0IHx8IDY1MzQzID09PSB0IHx8IHQgPj0gNjUzNzEgJiYgdCA8PSA2NTUwMyB8fCA2NTUwNyA9PT0gdCB8fCB0ID49IDY1NTEyICYmIHQgPD0gNjU1MTkpIHx8ICEoIVpuW1wiU21hbGwgRm9ybSBWYXJpYW50c1wiXSh0KSB8fCB0ID49IDY1MTEyICYmIHQgPD0gNjUxMTggfHwgdCA+PSA2NTEyMyAmJiB0IDw9IDY1MTI2KSB8fCBabltcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcIl0odCkgfHwgWm5bXCJVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIEV4dGVuZGVkXCJdKHQpIHx8IFpuW1wiVmVydGljYWwgRm9ybXNcIl0odCkgfHwgWm5bXCJZaWppbmcgSGV4YWdyYW0gU3ltYm9sc1wiXSh0KSB8fCBabltcIllpIFN5bGxhYmxlc1wiXSh0KSB8fCBabltcIllpIFJhZGljYWxzXCJdKHQpKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEhuKHQpIHtcbiAgICAgIHJldHVybiAhKEpuKHQpIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAhIShabltcIkxhdGluLTEgU3VwcGxlbWVudFwiXSh0KSAmJiAoMTY3ID09PSB0IHx8IDE2OSA9PT0gdCB8fCAxNzQgPT09IHQgfHwgMTc3ID09PSB0IHx8IDE4OCA9PT0gdCB8fCAxODkgPT09IHQgfHwgMTkwID09PSB0IHx8IDIxNSA9PT0gdCB8fCAyNDcgPT09IHQpIHx8IFpuW1wiR2VuZXJhbCBQdW5jdHVhdGlvblwiXSh0KSAmJiAoODIxNCA9PT0gdCB8fCA4MjI0ID09PSB0IHx8IDgyMjUgPT09IHQgfHwgODI0MCA9PT0gdCB8fCA4MjQxID09PSB0IHx8IDgyNTEgPT09IHQgfHwgODI1MiA9PT0gdCB8fCA4MjU4ID09PSB0IHx8IDgyNjMgPT09IHQgfHwgODI2NCA9PT0gdCB8fCA4MjY1ID09PSB0IHx8IDgyNzMgPT09IHQpIHx8IFpuW1wiTGV0dGVybGlrZSBTeW1ib2xzXCJdKHQpIHx8IFpuW1wiTnVtYmVyIEZvcm1zXCJdKHQpIHx8IFpuW1wiTWlzY2VsbGFuZW91cyBUZWNobmljYWxcIl0odCkgJiYgKHQgPj0gODk2MCAmJiB0IDw9IDg5NjcgfHwgdCA+PSA4OTcyICYmIHQgPD0gODk5MSB8fCB0ID49IDg5OTYgJiYgdCA8PSA5ZTMgfHwgOTAwMyA9PT0gdCB8fCB0ID49IDkwODUgJiYgdCA8PSA5MTE0IHx8IHQgPj0gOTE1MCAmJiB0IDw9IDkxNjUgfHwgOTE2NyA9PT0gdCB8fCB0ID49IDkxNjkgJiYgdCA8PSA5MTc5IHx8IHQgPj0gOTE4NiAmJiB0IDw9IDkyMTUpIHx8IFpuW1wiQ29udHJvbCBQaWN0dXJlc1wiXSh0KSAmJiA5MjUxICE9PSB0IHx8IFpuW1wiT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cIl0odCkgfHwgWm5bXCJFbmNsb3NlZCBBbHBoYW51bWVyaWNzXCJdKHQpIHx8IFpuW1wiR2VvbWV0cmljIFNoYXBlc1wiXSh0KSB8fCBabltcIk1pc2NlbGxhbmVvdXMgU3ltYm9sc1wiXSh0KSAmJiAhKHQgPj0gOTc1NCAmJiB0IDw9IDk3NTkpIHx8IFpuW1wiTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3NcIl0odCkgJiYgKHQgPj0gMTEwMjYgJiYgdCA8PSAxMTA1NSB8fCB0ID49IDExMDg4ICYmIHQgPD0gMTEwOTcgfHwgdCA+PSAxMTE5MiAmJiB0IDw9IDExMjQzKSB8fCBabltcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXSh0KSB8fCBabi5LYXRha2FuYSh0KSB8fCBabltcIlByaXZhdGUgVXNlIEFyZWFcIl0odCkgfHwgWm5bXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiXSh0KSB8fCBabltcIlNtYWxsIEZvcm0gVmFyaWFudHNcIl0odCkgfHwgWm5bXCJIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1wiXSh0KSB8fCA4NzM0ID09PSB0IHx8IDg3NTYgPT09IHQgfHwgODc1NyA9PT0gdCB8fCB0ID49IDk5ODQgJiYgdCA8PSAxMDA4NyB8fCB0ID49IDEwMTAyICYmIHQgPD0gMTAxMzEgfHwgNjU1MzIgPT09IHQgfHwgNjU1MzMgPT09IHQpO1xuICAgICAgfSh0KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWW4odCkge1xuICAgICAgcmV0dXJuIHQgPj0gMTQyNCAmJiB0IDw9IDIzMDMgfHwgWm5bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUFcIl0odCkgfHwgWm5bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcIl0odCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJG4odCwgZSkge1xuICAgICAgcmV0dXJuICEoIWUgJiYgWW4odCkgfHwgdCA+PSAyMzA0ICYmIHQgPD0gMzU4MyB8fCB0ID49IDM4NDAgJiYgdCA8PSA0MjU1IHx8IFpuLktobWVyKHQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXbih0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQ7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIGlmIChZbihyW2VdLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICB2YXIgUW4gPSBudWxsLFxuICAgICAgICB0aSA9IFwidW5hdmFpbGFibGVcIixcbiAgICAgICAgZWkgPSBudWxsLFxuICAgICAgICByaSA9IGZ1bmN0aW9uIHJpKHQpIHtcbiAgICAgIHQgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCAmJiB0LmluZGV4T2YoXCJOZXR3b3JrRXJyb3JcIikgPiAtMSAmJiAodGkgPSBcImVycm9yXCIpLCBRbiAmJiBRbih0KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbmkoKSB7XG4gICAgICBpaS5maXJlKG5ldyB6dChcInBsdWdpblN0YXRlQ2hhbmdlXCIsIHtcbiAgICAgICAgcGx1Z2luU3RhdHVzOiB0aSxcbiAgICAgICAgcGx1Z2luVVJMOiBlaVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHZhciBpaSA9IG5ldyBFdCgpLFxuICAgICAgICBhaSA9IGZ1bmN0aW9uIGFpKCkge1xuICAgICAgcmV0dXJuIHRpO1xuICAgIH0sXG4gICAgICAgIG9pID0gZnVuY3Rpb24gb2koKSB7XG4gICAgICBpZiAoXCJkZWZlcnJlZFwiICE9PSB0aSB8fCAhZWkpIHRocm93IG5ldyBFcnJvcihcInJ0bC10ZXh0LXBsdWdpbiBjYW5ub3QgYmUgZG93bmxvYWRlZCB1bmxlc3MgYSBwbHVnaW5VUkwgaXMgc3BlY2lmaWVkXCIpO1xuICAgICAgdGkgPSBcImxvYWRpbmdcIiwgbmkoKSwgZWkgJiYgd3Qoe1xuICAgICAgICB1cmw6IGVpXG4gICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICB0ID8gcmkodCkgOiAodGkgPSBcImxvYWRlZFwiLCBuaSgpKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgICAgIHNpID0ge1xuICAgICAgYXBwbHlBcmFiaWNTaGFwaW5nOiBudWxsLFxuICAgICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBudWxsLFxuICAgICAgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0OiBudWxsLFxuICAgICAgaXNMb2FkZWQ6IGZ1bmN0aW9uIGlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gXCJsb2FkZWRcIiA9PT0gdGkgfHwgbnVsbCAhPSBzaS5hcHBseUFyYWJpY1NoYXBpbmc7XG4gICAgICB9LFxuICAgICAgaXNMb2FkaW5nOiBmdW5jdGlvbiBpc0xvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiBcImxvYWRpbmdcIiA9PT0gdGk7XG4gICAgICB9LFxuICAgICAgc2V0U3RhdGU6IGZ1bmN0aW9uIHNldFN0YXRlKHQpIHtcbiAgICAgICAgdGkgPSB0LnBsdWdpblN0YXR1cywgZWkgPSB0LnBsdWdpblVSTDtcbiAgICAgIH0sXG4gICAgICBpc1BhcnNlZDogZnVuY3Rpb24gaXNQYXJzZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsICE9IHNpLmFwcGx5QXJhYmljU2hhcGluZyAmJiBudWxsICE9IHNpLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAmJiBudWxsICE9IHNpLnByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDtcbiAgICAgIH0sXG4gICAgICBnZXRQbHVnaW5VUkw6IGZ1bmN0aW9uIGdldFBsdWdpblVSTCgpIHtcbiAgICAgICAgcmV0dXJuIGVpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIHVpID0gZnVuY3Rpb24gdWkodCwgZSkge1xuICAgICAgdGhpcy56b29tID0gdCwgZSA/ICh0aGlzLm5vdyA9IGUubm93LCB0aGlzLmZhZGVEdXJhdGlvbiA9IGUuZmFkZUR1cmF0aW9uLCB0aGlzLnpvb21IaXN0b3J5ID0gZS56b29tSGlzdG9yeSwgdGhpcy50cmFuc2l0aW9uID0gZS50cmFuc2l0aW9uKSA6ICh0aGlzLm5vdyA9IDAsIHRoaXMuZmFkZUR1cmF0aW9uID0gMCwgdGhpcy56b29tSGlzdG9yeSA9IG5ldyBHbigpLCB0aGlzLnRyYW5zaXRpb24gPSB7fSk7XG4gICAgfTtcblxuICAgIHVpLnByb3RvdHlwZS5pc1N1cHBvcnRlZFNjcmlwdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSB0OyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgIGlmICghJG4obltyXS5jaGFyQ29kZUF0KDApLCBlKSkgcmV0dXJuICExO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSh0LCBzaS5pc0xvYWRlZCgpKTtcbiAgICB9LCB1aS5wcm90b3R5cGUuY3Jvc3NGYWRpbmdGYWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5mYWRlRHVyYXRpb24gPyAxIDogTWF0aC5taW4oKHRoaXMubm93IC0gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb21UaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uLCAxKTtcbiAgICB9LCB1aS5wcm90b3R5cGUuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy56b29tLFxuICAgICAgICAgIGUgPSB0IC0gTWF0aC5mbG9vcih0KSxcbiAgICAgICAgICByID0gdGhpcy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuICAgICAgcmV0dXJuIHQgPiB0aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbSA/IHtcbiAgICAgICAgZnJvbVNjYWxlOiAyLFxuICAgICAgICB0b1NjYWxlOiAxLFxuICAgICAgICB0OiBlICsgKDEgLSBlKSAqIHJcbiAgICAgIH0gOiB7XG4gICAgICAgIGZyb21TY2FsZTogLjUsXG4gICAgICAgIHRvU2NhbGU6IDEsXG4gICAgICAgIHQ6IDEgLSAoMSAtIHIpICogZVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIGxpID0gZnVuY3Rpb24gbGkodCwgZSkge1xuICAgICAgdGhpcy5wcm9wZXJ0eSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLmV4cHJlc3Npb24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAoUnIodCkpIHJldHVybiBuZXcgJHIodCwgZSk7XG5cbiAgICAgICAgaWYgKFpyKHQpKSB7XG4gICAgICAgICAgdmFyIHIgPSBZcih0LCBlKTtcbiAgICAgICAgICBpZiAoXCJlcnJvclwiID09PSByLnJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKHIudmFsdWUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5rZXkgKyBcIjogXCIgKyB0Lm1lc3NhZ2U7XG4gICAgICAgICAgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuID0gdDtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgXCJjb2xvclwiID09PSBlLnR5cGUgJiYgKG4gPSBlZS5wYXJzZSh0KSksIHtcbiAgICAgICAgICBraW5kOiBcImNvbnN0YW50XCIsXG4gICAgICAgICAgZXZhbHVhdGU6IGZ1bmN0aW9uIGV2YWx1YXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSh2b2lkIDAgPT09IGUgPyB0LnNwZWNpZmljYXRpb24uZGVmYXVsdCA6IGUsIHQuc3BlY2lmaWNhdGlvbik7XG4gICAgfTtcblxuICAgIGxpLnByb3RvdHlwZS5pc0RhdGFEcml2ZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJzb3VyY2VcIiA9PT0gdGhpcy5leHByZXNzaW9uLmtpbmQgfHwgXCJjb21wb3NpdGVcIiA9PT0gdGhpcy5leHByZXNzaW9uLmtpbmQ7XG4gICAgfSwgbGkucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkucG9zc2libHlFdmFsdWF0ZSh0aGlzLCB0LCBlLCByKTtcbiAgICB9O1xuXG4gICAgdmFyIHBpID0gZnVuY3Rpb24gcGkodCkge1xuICAgICAgdGhpcy5wcm9wZXJ0eSA9IHQsIHRoaXMudmFsdWUgPSBuZXcgbGkodCwgdm9pZCAwKTtcbiAgICB9O1xuXG4gICAgcGkucHJvdG90eXBlLnRyYW5zaXRpb25lZCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gbmV3IGhpKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIGUsIGgoe30sIHQudHJhbnNpdGlvbiwgdGhpcy50cmFuc2l0aW9uKSwgdC5ub3cpO1xuICAgIH0sIHBpLnByb3RvdHlwZS51bnRyYW5zaXRpb25lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgaGkodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgbnVsbCwge30sIDApO1xuICAgIH07XG5cbiAgICB2YXIgY2kgPSBmdW5jdGlvbiBjaSh0KSB7XG4gICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gdCwgdGhpcy5fdmFsdWVzID0gT2JqZWN0LmNyZWF0ZSh0LmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzKTtcbiAgICB9O1xuXG4gICAgY2kucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB3KHRoaXMuX3ZhbHVlc1t0XS52YWx1ZS52YWx1ZSk7XG4gICAgfSwgY2kucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh0KSB8fCAodGhpcy5fdmFsdWVzW3RdID0gbmV3IHBpKHRoaXMuX3ZhbHVlc1t0XS5wcm9wZXJ0eSkpLCB0aGlzLl92YWx1ZXNbdF0udmFsdWUgPSBuZXcgbGkodGhpcy5fdmFsdWVzW3RdLnByb3BlcnR5LCBudWxsID09PSBlID8gdm9pZCAwIDogdyhlKSk7XG4gICAgfSwgY2kucHJvdG90eXBlLmdldFRyYW5zaXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHcodGhpcy5fdmFsdWVzW3RdLnRyYW5zaXRpb24pO1xuICAgIH0sIGNpLnByb3RvdHlwZS5zZXRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh0KSB8fCAodGhpcy5fdmFsdWVzW3RdID0gbmV3IHBpKHRoaXMuX3ZhbHVlc1t0XS5wcm9wZXJ0eSkpLCB0aGlzLl92YWx1ZXNbdF0udHJhbnNpdGlvbiA9IHcoZSkgfHwgdm9pZCAwO1xuICAgIH0sIGNpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0ge30sIGUgPSAwLCByID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSByW2VdLFxuICAgICAgICAgICAgaSA9IHRoaXMuZ2V0VmFsdWUobik7XG4gICAgICAgIHZvaWQgMCAhPT0gaSAmJiAodFtuXSA9IGkpO1xuICAgICAgICB2YXIgYSA9IHRoaXMuZ2V0VHJhbnNpdGlvbihuKTtcbiAgICAgICAgdm9pZCAwICE9PSBhICYmICh0W24gKyBcIi10cmFuc2l0aW9uXCJdID0gYSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIGNpLnByb3RvdHlwZS50cmFuc2l0aW9uZWQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IG5ldyBmaSh0aGlzLl9wcm9wZXJ0aWVzKSwgbiA9IDAsIGkgPSBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG4gICAgICAgIHIuX3ZhbHVlc1thXSA9IHRoaXMuX3ZhbHVlc1thXS50cmFuc2l0aW9uZWQodCwgZS5fdmFsdWVzW2FdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgY2kucHJvdG90eXBlLnVudHJhbnNpdGlvbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IG5ldyBmaSh0aGlzLl9wcm9wZXJ0aWVzKSwgZSA9IDAsIHIgPSBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IHJbZV07XG4gICAgICAgIHQuX3ZhbHVlc1tuXSA9IHRoaXMuX3ZhbHVlc1tuXS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9O1xuXG4gICAgdmFyIGhpID0gZnVuY3Rpb24gaGkodCwgZSwgciwgbiwgaSkge1xuICAgICAgdGhpcy5wcm9wZXJ0eSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLmJlZ2luID0gaSArIG4uZGVsYXkgfHwgMCwgdGhpcy5lbmQgPSB0aGlzLmJlZ2luICsgbi5kdXJhdGlvbiB8fCAwLCB0LnNwZWNpZmljYXRpb24udHJhbnNpdGlvbiAmJiAobi5kZWxheSB8fCBuLmR1cmF0aW9uKSAmJiAodGhpcy5wcmlvciA9IHIpO1xuICAgIH07XG5cbiAgICBoaS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHQubm93IHx8IDAsXG4gICAgICAgICAgaSA9IHRoaXMudmFsdWUucG9zc2libHlFdmFsdWF0ZSh0LCBlLCByKSxcbiAgICAgICAgICBhID0gdGhpcy5wcmlvcjtcblxuICAgICAgaWYgKGEpIHtcbiAgICAgICAgaWYgKG4gPiB0aGlzLmVuZCkgcmV0dXJuIHRoaXMucHJpb3IgPSBudWxsLCBpO1xuICAgICAgICBpZiAodGhpcy52YWx1ZS5pc0RhdGFEcml2ZW4oKSkgcmV0dXJuIHRoaXMucHJpb3IgPSBudWxsLCBpO1xuICAgICAgICBpZiAobiA8IHRoaXMuYmVnaW4pIHJldHVybiBhLnBvc3NpYmx5RXZhbHVhdGUodCwgZSwgcik7XG4gICAgICAgIHZhciBvID0gKG4gLSB0aGlzLmJlZ2luKSAvICh0aGlzLmVuZCAtIHRoaXMuYmVnaW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5pbnRlcnBvbGF0ZShhLnBvc3NpYmx5RXZhbHVhdGUodCwgZSwgciksIGksIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgaWYgKHQgPD0gMCkgcmV0dXJuIDA7XG4gICAgICAgICAgaWYgKHQgPj0gMSkgcmV0dXJuIDE7XG4gICAgICAgICAgdmFyIGUgPSB0ICogdCxcbiAgICAgICAgICAgICAgciA9IGUgKiB0O1xuICAgICAgICAgIHJldHVybiA0ICogKHQgPCAuNSA/IHIgOiAzICogKHQgLSBlKSArIHIgLSAuNzUpO1xuICAgICAgICB9KG8pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcblxuICAgIHZhciBmaSA9IGZ1bmN0aW9uIGZpKHQpIHtcbiAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0LCB0aGlzLl92YWx1ZXMgPSBPYmplY3QuY3JlYXRlKHQuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlcyk7XG4gICAgfTtcblxuICAgIGZpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSBuZXcgbWkodGhpcy5fcHJvcGVydGllcyksIGkgPSAwLCBhID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldO1xuICAgICAgICBuLl92YWx1ZXNbb10gPSB0aGlzLl92YWx1ZXNbb10ucG9zc2libHlFdmFsdWF0ZSh0LCBlLCByKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfSwgZmkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gMCwgZSA9IE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcyk7IHQgPCBlLmxlbmd0aDsgdCArPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZXNbZVt0XV0ucHJpb3IpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH07XG5cbiAgICB2YXIgeWkgPSBmdW5jdGlvbiB5aSh0KSB7XG4gICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gdCwgdGhpcy5fdmFsdWVzID0gT2JqZWN0LmNyZWF0ZSh0LmRlZmF1bHRQcm9wZXJ0eVZhbHVlcyk7XG4gICAgfTtcblxuICAgIHlpLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdyh0aGlzLl92YWx1ZXNbdF0udmFsdWUpO1xuICAgIH0sIHlpLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLl92YWx1ZXNbdF0gPSBuZXcgbGkodGhpcy5fdmFsdWVzW3RdLnByb3BlcnR5LCBudWxsID09PSBlID8gdm9pZCAwIDogdyhlKSk7XG4gICAgfSwgeWkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSB7fSwgZSA9IDAsIHIgPSBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgbiA9IHJbZV0sXG4gICAgICAgICAgICBpID0gdGhpcy5nZXRWYWx1ZShuKTtcbiAgICAgICAgdm9pZCAwICE9PSBpICYmICh0W25dID0gaSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIHlpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSBuZXcgbWkodGhpcy5fcHJvcGVydGllcyksIGkgPSAwLCBhID0gT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKTsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG8gPSBhW2ldO1xuICAgICAgICBuLl92YWx1ZXNbb10gPSB0aGlzLl92YWx1ZXNbb10ucG9zc2libHlFdmFsdWF0ZSh0LCBlLCByKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfTtcblxuICAgIHZhciBkaSA9IGZ1bmN0aW9uIGRpKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMucHJvcGVydHkgPSB0LCB0aGlzLnZhbHVlID0gZSwgdGhpcy5wYXJhbWV0ZXJzID0gcjtcbiAgICB9O1xuXG4gICAgZGkucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJjb25zdGFudFwiID09PSB0aGlzLnZhbHVlLmtpbmQ7XG4gICAgfSwgZGkucHJvdG90eXBlLmNvbnN0YW50T3IgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIFwiY29uc3RhbnRcIiA9PT0gdGhpcy52YWx1ZS5raW5kID8gdGhpcy52YWx1ZS52YWx1ZSA6IHQ7XG4gICAgfSwgZGkucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LmV2YWx1YXRlKHRoaXMudmFsdWUsIHRoaXMucGFyYW1ldGVycywgdCwgZSwgciwgbik7XG4gICAgfTtcblxuICAgIHZhciBtaSA9IGZ1bmN0aW9uIG1pKHQpIHtcbiAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0LCB0aGlzLl92YWx1ZXMgPSBPYmplY3QuY3JlYXRlKHQuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTtcbiAgICB9O1xuXG4gICAgbWkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW3RdO1xuICAgIH07XG5cbiAgICB2YXIgdmkgPSBmdW5jdGlvbiB2aSh0KSB7XG4gICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSB0O1xuICAgIH07XG5cbiAgICB2aS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdC5leHByZXNzaW9uLmV2YWx1YXRlKGUpO1xuICAgIH0sIHZpLnByb3RvdHlwZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IFplW3RoaXMuc3BlY2lmaWNhdGlvbi50eXBlXTtcbiAgICAgIHJldHVybiBuID8gbih0LCBlLCByKSA6IHQ7XG4gICAgfTtcblxuICAgIHZhciBnaSA9IGZ1bmN0aW9uIGdpKHQsIGUpIHtcbiAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHQsIHRoaXMub3ZlcnJpZGVzID0gZTtcbiAgICB9O1xuXG4gICAgZ2kucHJvdG90eXBlLnBvc3NpYmx5RXZhbHVhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG5ldyBkaSh0aGlzLCBcImNvbnN0YW50XCIgPT09IHQuZXhwcmVzc2lvbi5raW5kIHx8IFwiY2FtZXJhXCIgPT09IHQuZXhwcmVzc2lvbi5raW5kID8ge1xuICAgICAgICBraW5kOiBcImNvbnN0YW50XCIsXG4gICAgICAgIHZhbHVlOiB0LmV4cHJlc3Npb24uZXZhbHVhdGUoZSwgbnVsbCwge30sIHIsIG4pXG4gICAgICB9IDogdC5leHByZXNzaW9uLCBlKTtcbiAgICB9LCBnaS5wcm90b3R5cGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKFwiY29uc3RhbnRcIiAhPT0gdC52YWx1ZS5raW5kIHx8IFwiY29uc3RhbnRcIiAhPT0gZS52YWx1ZS5raW5kKSByZXR1cm4gdDtcbiAgICAgIGlmICh2b2lkIDAgPT09IHQudmFsdWUudmFsdWUgfHwgdm9pZCAwID09PSBlLnZhbHVlLnZhbHVlKSByZXR1cm4gbmV3IGRpKHRoaXMsIHtcbiAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICB9LCB0LnBhcmFtZXRlcnMpO1xuICAgICAgdmFyIG4gPSBaZVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICByZXR1cm4gbiA/IG5ldyBkaSh0aGlzLCB7XG4gICAgICAgIGtpbmQ6IFwiY29uc3RhbnRcIixcbiAgICAgICAgdmFsdWU6IG4odC52YWx1ZS52YWx1ZSwgZS52YWx1ZS52YWx1ZSwgcilcbiAgICAgIH0sIHQucGFyYW1ldGVycykgOiB0O1xuICAgIH0sIGdpLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICByZXR1cm4gXCJjb25zdGFudFwiID09PSB0LmtpbmQgPyB0LnZhbHVlIDogdC5ldmFsdWF0ZShlLCByLCBuLCBpLCBhKTtcbiAgICB9O1xuXG4gICAgdmFyIHhpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IHQudmFsdWUpIHJldHVybiBuZXcgZGkodGhpcywge1xuICAgICAgICAgIGtpbmQ6IFwiY29uc3RhbnRcIixcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0sIGUpO1xuXG4gICAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHQuZXhwcmVzc2lvbi5raW5kKSB7XG4gICAgICAgICAgdmFyIGkgPSB0LmV4cHJlc3Npb24uZXZhbHVhdGUoZSwgbnVsbCwge30sIHIsIG4pLFxuICAgICAgICAgICAgICBhID0gXCJyZXNvbHZlZEltYWdlXCIgPT09IHQucHJvcGVydHkuc3BlY2lmaWNhdGlvbi50eXBlICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIGkgPyBpLm5hbWUgOiBpLFxuICAgICAgICAgICAgICBvID0gdGhpcy5fY2FsY3VsYXRlKGEsIGEsIGEsIGUpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBkaSh0aGlzLCB7XG4gICAgICAgICAgICBraW5kOiBcImNvbnN0YW50XCIsXG4gICAgICAgICAgICB2YWx1ZTogb1xuICAgICAgICAgIH0sIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFwiY2FtZXJhXCIgPT09IHQuZXhwcmVzc2lvbi5raW5kKSB7XG4gICAgICAgICAgdmFyIHMgPSB0aGlzLl9jYWxjdWxhdGUodC5leHByZXNzaW9uLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IGUuem9vbSAtIDFcbiAgICAgICAgICB9KSwgdC5leHByZXNzaW9uLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IGUuem9vbVxuICAgICAgICAgIH0pLCB0LmV4cHJlc3Npb24uZXZhbHVhdGUoe1xuICAgICAgICAgICAgem9vbTogZS56b29tICsgMVxuICAgICAgICAgIH0pLCBlKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgZGkodGhpcywge1xuICAgICAgICAgICAga2luZDogXCJjb25zdGFudFwiLFxuICAgICAgICAgICAgdmFsdWU6IHNcbiAgICAgICAgICB9LCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgZGkodGhpcywgdC5leHByZXNzaW9uLCBlKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgaWYgKFwic291cmNlXCIgPT09IHQua2luZCkge1xuICAgICAgICAgIHZhciBvID0gdC5ldmFsdWF0ZShlLCByLCBuLCBpLCBhKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKG8sIG8sIG8sIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiY29tcG9zaXRlXCIgPT09IHQua2luZCA/IHRoaXMuX2NhbGN1bGF0ZSh0LmV2YWx1YXRlKHtcbiAgICAgICAgICB6b29tOiBNYXRoLmZsb29yKGUuem9vbSkgLSAxXG4gICAgICAgIH0sIHIsIG4pLCB0LmV2YWx1YXRlKHtcbiAgICAgICAgICB6b29tOiBNYXRoLmZsb29yKGUuem9vbSlcbiAgICAgICAgfSwgciwgbiksIHQuZXZhbHVhdGUoe1xuICAgICAgICAgIHpvb206IE1hdGguZmxvb3IoZS56b29tKSArIDFcbiAgICAgICAgfSwgciwgbiksIGUpIDogdC52YWx1ZTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9jYWxjdWxhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICByZXR1cm4gbi56b29tID4gbi56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7XG4gICAgICAgICAgZnJvbTogdCxcbiAgICAgICAgICB0bzogZVxuICAgICAgICB9IDoge1xuICAgICAgICAgIGZyb206IHIsXG4gICAgICAgICAgdG86IGVcbiAgICAgICAgfTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oZ2kpLFxuICAgICAgICBiaSA9IGZ1bmN0aW9uIGJpKHQpIHtcbiAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHQ7XG4gICAgfTtcblxuICAgIGJpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIGlmICh2b2lkIDAgIT09IHQudmFsdWUpIHtcbiAgICAgICAgaWYgKFwiY29uc3RhbnRcIiA9PT0gdC5leHByZXNzaW9uLmtpbmQpIHtcbiAgICAgICAgICB2YXIgaSA9IHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlLCBudWxsLCB7fSwgciwgbik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShpLCBpLCBpLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUodC5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyB1aShNYXRoLmZsb29yKGUuem9vbSAtIDEpLCBlKSksIHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgdWkoTWF0aC5mbG9vcihlLnpvb20pLCBlKSksIHQuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgdWkoTWF0aC5mbG9vcihlLnpvb20gKyAxKSwgZSkpLCBlKTtcbiAgICAgIH1cbiAgICB9LCBiaS5wcm90b3R5cGUuX2NhbGN1bGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gbi56b29tID4gbi56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7XG4gICAgICAgIGZyb206IHQsXG4gICAgICAgIHRvOiBlXG4gICAgICB9IDoge1xuICAgICAgICBmcm9tOiByLFxuICAgICAgICB0bzogZVxuICAgICAgfTtcbiAgICB9LCBiaS5wcm90b3R5cGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcblxuICAgIHZhciB3aSA9IGZ1bmN0aW9uIHdpKHQpIHtcbiAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHQ7XG4gICAgfTtcblxuICAgIHdpLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHJldHVybiAhIXQuZXhwcmVzc2lvbi5ldmFsdWF0ZShlLCBudWxsLCB7fSwgciwgbik7XG4gICAgfSwgd2kucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH07XG5cbiAgICB2YXIgX2kgPSBmdW5jdGlvbiBfaSh0KSB7XG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMucHJvcGVydGllcyA9IHQsIHRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzID0ge30sIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMgPSB7fSwgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzID0ge30sIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzID0ge30sIHRoaXMub3ZlcnJpZGFibGVQcm9wZXJ0aWVzID0gW10sIHQpIHtcbiAgICAgICAgdmFyIHIgPSB0W2VdO1xuICAgICAgICByLnNwZWNpZmljYXRpb24ub3ZlcnJpZGFibGUgJiYgdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXMucHVzaChlKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlc1tlXSA9IG5ldyBsaShyLCB2b2lkIDApLFxuICAgICAgICAgICAgaSA9IHRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXNbZV0gPSBuZXcgcGkocik7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlc1tlXSA9IGkudW50cmFuc2l0aW9uZWQoKSwgdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNbZV0gPSBuLnBvc3NpYmx5RXZhbHVhdGUoe30pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBPbihcIkRhdGFEcml2ZW5Qcm9wZXJ0eVwiLCBnaSksIE9uKFwiRGF0YUNvbnN0YW50UHJvcGVydHlcIiwgdmkpLCBPbihcIkNyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHlcIiwgeGkpLCBPbihcIkNyb3NzRmFkZWRQcm9wZXJ0eVwiLCBiaSksIE9uKFwiQ29sb3JSYW1wUHJvcGVydHlcIiwgd2kpO1xuXG4gICAgdmFyIEFpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICBpZiAodC5jYWxsKHRoaXMpLCB0aGlzLmlkID0gZS5pZCwgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLl9mZWF0dXJlRmlsdGVyID0ge1xuICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKCkge1xuICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbmVlZEdlb21ldHJ5OiAhMVxuICAgICAgICB9LCBcImN1c3RvbVwiICE9PSBlLnR5cGUgJiYgKHRoaXMubWV0YWRhdGEgPSAoZSA9IGUpLm1ldGFkYXRhLCB0aGlzLm1pbnpvb20gPSBlLm1pbnpvb20sIHRoaXMubWF4em9vbSA9IGUubWF4em9vbSwgXCJiYWNrZ3JvdW5kXCIgIT09IGUudHlwZSAmJiAodGhpcy5zb3VyY2UgPSBlLnNvdXJjZSwgdGhpcy5zb3VyY2VMYXllciA9IGVbXCJzb3VyY2UtbGF5ZXJcIl0sIHRoaXMuZmlsdGVyID0gZS5maWx0ZXIpLCByLmxheW91dCAmJiAodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgPSBuZXcgeWkoci5sYXlvdXQpKSwgci5wYWludCkpIHtcbiAgICAgICAgICBmb3IgKHZhciBuIGluIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQgPSBuZXcgY2koci5wYWludCksIGUucGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShuLCBlLnBhaW50W25dLCB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgaSBpbiBlLmxheW91dCkge1xuICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXRQcm9wZXJ0eShpLCBlLmxheW91dFtpXSwge1xuICAgICAgICAgICAgICB2YWxpZGF0ZTogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKSwgdGhpcy5wYWludCA9IG5ldyBtaShyLnBhaW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3Jvc3NmYWRlUGFyYW1ldGVycztcbiAgICAgIH0sIGUucHJvdG90eXBlLmdldExheW91dFByb3BlcnR5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwidmlzaWJpbGl0eVwiID09PSB0ID8gdGhpcy52aXNpYmlsaXR5IDogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUodCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgbnVsbCAhPSBlICYmIHRoaXMuX3ZhbGlkYXRlKEJuLCBcImxheWVycy5cIiArIHRoaXMuaWQgKyBcIi5sYXlvdXQuXCIgKyB0LCB0LCBlLCByKSB8fCAoXCJ2aXNpYmlsaXR5XCIgIT09IHQgPyB0aGlzLl91bmV2YWx1YXRlZExheW91dC5zZXRWYWx1ZSh0LCBlKSA6IHRoaXMudmlzaWJpbGl0eSA9IGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZ2V0UGFpbnRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBnKHQsIFwiLXRyYW5zaXRpb25cIikgPyB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LmdldFRyYW5zaXRpb24odC5zbGljZSgwLCAtXCItdHJhbnNpdGlvblwiLmxlbmd0aCkpIDogdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRWYWx1ZSh0KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICBpZiAodm9pZCAwID09PSByICYmIChyID0ge30pLCBudWxsICE9IGUgJiYgdGhpcy5fdmFsaWRhdGUoTW4sIFwibGF5ZXJzLlwiICsgdGhpcy5pZCArIFwiLnBhaW50LlwiICsgdCwgdCwgZSwgcikpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKGcodCwgXCItdHJhbnNpdGlvblwiKSkgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VHJhbnNpdGlvbih0LnNsaWNlKDAsIC1cIi10cmFuc2l0aW9uXCIubGVuZ3RoKSwgZSB8fCB2b2lkIDApLCAhMTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbdF0sXG4gICAgICAgICAgICBpID0gXCJjcm9zcy1mYWRlZC1kYXRhLWRyaXZlblwiID09PSBuLnByb3BlcnR5LnNwZWNpZmljYXRpb25bXCJwcm9wZXJ0eS10eXBlXCJdLFxuICAgICAgICAgICAgYSA9IG4udmFsdWUuaXNEYXRhRHJpdmVuKCksXG4gICAgICAgICAgICBvID0gbi52YWx1ZTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5zZXRWYWx1ZSh0LCBlKSwgdGhpcy5faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUodCk7XG4gICAgICAgIHZhciBzID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW3RdLnZhbHVlO1xuICAgICAgICByZXR1cm4gcy5pc0RhdGFEcml2ZW4oKSB8fCBhIHx8IGkgfHwgdGhpcy5faGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlKHQsIG8sIHMpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlID0gZnVuY3Rpb24gKHQpIHt9LCBlLnByb3RvdHlwZS5faGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuaXNIaWRkZW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy5taW56b29tICYmIHQgPCB0aGlzLm1pbnpvb20pIHx8ICEhKHRoaXMubWF4em9vbSAmJiB0ID49IHRoaXMubWF4em9vbSkgfHwgXCJub25lXCIgPT09IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC50cmFuc2l0aW9uZWQodCwgdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuaGFzVHJhbnNpdGlvbigpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucmVjYWxjdWxhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0LmdldENyb3NzZmFkZVBhcmFtZXRlcnMgJiYgKHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnMgPSB0LmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSksIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ICYmICh0aGlzLmxheW91dCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnBvc3NpYmx5RXZhbHVhdGUodCwgdm9pZCAwLCBlKSksIHRoaXMucGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZSh0LCB2b2lkIDAsIGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHtcbiAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICBcInNvdXJjZS1sYXllclwiOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgIG1pbnpvb206IHRoaXMubWluem9vbSxcbiAgICAgICAgICBtYXh6b29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlcixcbiAgICAgICAgICBsYXlvdXQ6IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ICYmIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnNlcmlhbGl6ZSgpLFxuICAgICAgICAgIHBhaW50OiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSAmJiAodC5sYXlvdXQgPSB0LmxheW91dCB8fCB7fSwgdC5sYXlvdXQudmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eSksIGIodCwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gISh2b2lkIDAgPT09IHQgfHwgXCJsYXlvdXRcIiA9PT0gZSAmJiAhT2JqZWN0LmtleXModCkubGVuZ3RoIHx8IFwicGFpbnRcIiA9PT0gZSAmJiAhT2JqZWN0LmtleXModCkubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBpICYmIChpID0ge30pLCAoIWkgfHwgITEgIT09IGkudmFsaWRhdGUpICYmIFRuKHRoaXMsIHQuY2FsbChFbiwge1xuICAgICAgICAgIGtleTogZSxcbiAgICAgICAgICBsYXllclR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICBvYmplY3RLZXk6IHIsXG4gICAgICAgICAgdmFsdWU6IG4sXG4gICAgICAgICAgc3R5bGVTcGVjOiBQdCxcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZ2x5cGhzOiAhMCxcbiAgICAgICAgICAgIHNwcml0ZTogITBcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzM0QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzVGlsZUNsaXBwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmhhc09mZnNjcmVlblBhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHt9LCBlLnByb3RvdHlwZS5pc1N0YXRlRGVwZW5kZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMucGFpbnQuX3ZhbHVlcykge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5wYWludC5nZXQodCk7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBkaSAmJiBWcihlLnByb3BlcnR5LnNwZWNpZmljYXRpb24pICYmIChcInNvdXJjZVwiID09PSBlLnZhbHVlLmtpbmQgfHwgXCJjb21wb3NpdGVcIiA9PT0gZS52YWx1ZS5raW5kKSAmJiBlLnZhbHVlLmlzU3RhdGVEZXBlbmRlbnQpIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGU7XG4gICAgfShFdCksXG4gICAgICAgIFNpID0ge1xuICAgICAgSW50ODogSW50OEFycmF5LFxuICAgICAgVWludDg6IFVpbnQ4QXJyYXksXG4gICAgICBJbnQxNjogSW50MTZBcnJheSxcbiAgICAgIFVpbnQxNjogVWludDE2QXJyYXksXG4gICAgICBJbnQzMjogSW50MzJBcnJheSxcbiAgICAgIFVpbnQzMjogVWludDMyQXJyYXksXG4gICAgICBGbG9hdDMyOiBGbG9hdDMyQXJyYXlcbiAgICB9LFxuICAgICAgICBraSA9IGZ1bmN0aW9uIGtpKHQsIGUpIHtcbiAgICAgIHRoaXMuX3N0cnVjdEFycmF5ID0gdCwgdGhpcy5fcG9zMSA9IGUgKiB0aGlzLnNpemUsIHRoaXMuX3BvczIgPSB0aGlzLl9wb3MxIC8gMiwgdGhpcy5fcG9zNCA9IHRoaXMuX3BvczEgLyA0LCB0aGlzLl9wb3M4ID0gdGhpcy5fcG9zMSAvIDg7XG4gICAgfSxcbiAgICAgICAgSWkgPSBmdW5jdGlvbiBJaSgpIHtcbiAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9ICExLCB0aGlzLmNhcGFjaXR5ID0gLTEsIHRoaXMucmVzaXplKDApO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB6aSh0LCBlKSB7XG4gICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSAxKTtcbiAgICAgIHZhciByID0gMCxcbiAgICAgICAgICBuID0gMDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lbWJlcnM6IHQubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIGkgPSBTaVt0LnR5cGVdLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgICAgICAgICAgICBhID0gciA9IENpKHIsIE1hdGgubWF4KGUsIGkpKSxcbiAgICAgICAgICAgICAgbyA9IHQuY29tcG9uZW50cyB8fCAxO1xuICAgICAgICAgIHJldHVybiBuID0gTWF0aC5tYXgobiwgaSksIHIgKz0gaSAqIG8sIHtcbiAgICAgICAgICAgIG5hbWU6IHQubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHQudHlwZSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IG8sXG4gICAgICAgICAgICBvZmZzZXQ6IGFcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgc2l6ZTogQ2kociwgTWF0aC5tYXgobiwgZSkpLFxuICAgICAgICBhbGlnbm1lbnQ6IGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ2kodCwgZSkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0IC8gZSkgKiBlO1xuICAgIH1cblxuICAgIElpLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdC5fdHJpbSgpLCBlICYmICh0LmlzVHJhbnNmZXJyZWQgPSAhMCwgZS5wdXNoKHQuYXJyYXlCdWZmZXIpKSwge1xuICAgICAgICBsZW5ndGg6IHQubGVuZ3RoLFxuICAgICAgICBhcnJheUJ1ZmZlcjogdC5hcnJheUJ1ZmZlclxuICAgICAgfTtcbiAgICB9LCBJaS5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGUuYXJyYXlCdWZmZXIgPSB0LmFycmF5QnVmZmVyLCBlLmxlbmd0aCA9IHQubGVuZ3RoLCBlLmNhcGFjaXR5ID0gdC5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoIC8gZS5ieXRlc1BlckVsZW1lbnQsIGUuX3JlZnJlc2hWaWV3cygpLCBlO1xuICAgIH0sIElpLnByb3RvdHlwZS5fdHJpbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGVuZ3RoICE9PSB0aGlzLmNhcGFjaXR5ICYmICh0aGlzLmNhcGFjaXR5ID0gdGhpcy5sZW5ndGgsIHRoaXMuYXJyYXlCdWZmZXIgPSB0aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsIHRoaXMubGVuZ3RoICogdGhpcy5ieXRlc1BlckVsZW1lbnQpLCB0aGlzLl9yZWZyZXNoVmlld3MoKSk7XG4gICAgfSwgSWkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH0sIElpLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5yZXNlcnZlKHQpLCB0aGlzLmxlbmd0aCA9IHQ7XG4gICAgfSwgSWkucHJvdG90eXBlLnJlc2VydmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHQgPiB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgIHRoaXMuY2FwYWNpdHkgPSBNYXRoLm1heCh0LCBNYXRoLmZsb29yKDUgKiB0aGlzLmNhcGFjaXR5KSwgMTI4KSwgdGhpcy5hcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmNhcGFjaXR5ICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuICAgICAgICB2YXIgZSA9IHRoaXMudWludDg7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpLCBlICYmIHRoaXMudWludDguc2V0KGUpO1xuICAgICAgfVxuICAgIH0sIElpLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiX3JlZnJlc2hWaWV3cygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBjb25jcmV0ZSBTdHJ1Y3RBcnJheSBsYXlvdXRcIik7XG4gICAgfTtcblxuICAgIHZhciBFaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUociArIDEpLCB0aGlzLmVtcGxhY2UociwgdCwgZSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSAyICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbbiArIDBdID0gZSwgdGhpcy5pbnQxNltuICsgMV0gPSByLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIEVpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0Mmk0XCIsIEVpKTtcblxuICAgIHZhciBQaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB2YXIgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoaSArIDEpLCB0aGlzLmVtcGxhY2UoaSwgdCwgZSwgciwgbik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgICAgdmFyIGEgPSA0ICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbYSArIDBdID0gZSwgdGhpcy5pbnQxNlthICsgMV0gPSByLCB0aGlzLmludDE2W2EgKyAyXSA9IG4sIHRoaXMuaW50MTZbYSArIDNdID0gaSwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBQaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gOCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDRpOFwiLCBQaSk7XG5cbiAgICB2YXIgTWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKG8gKyAxKSwgdGhpcy5lbXBsYWNlKG8sIHQsIGUsIHIsIG4sIGksIGEpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICAgIHZhciBzID0gNiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W3MgKyAwXSA9IGUsIHRoaXMuaW50MTZbcyArIDFdID0gciwgdGhpcy5pbnQxNltzICsgMl0gPSBuLCB0aGlzLmludDE2W3MgKyAzXSA9IGksIHRoaXMuaW50MTZbcyArIDRdID0gYSwgdGhpcy5pbnQxNltzICsgNV0gPSBvLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIE1pLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMiwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDJpNGkxMlwiLCBNaSk7XG5cbiAgICB2YXIgQmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKG8gKyAxKSwgdGhpcy5lbXBsYWNlKG8sIHQsIGUsIHIsIG4sIGksIGEpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICAgIHZhciBzID0gNCAqIHQsXG4gICAgICAgICAgICB1ID0gOCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W3MgKyAwXSA9IGUsIHRoaXMuaW50MTZbcyArIDFdID0gciwgdGhpcy51aW50OFt1ICsgNF0gPSBuLCB0aGlzLnVpbnQ4W3UgKyA1XSA9IGksIHRoaXMudWludDhbdSArIDZdID0gYSwgdGhpcy51aW50OFt1ICsgN10gPSBvLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIEJpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0Mmk0dWI4XCIsIEJpKTtcblxuICAgIHZhciBUaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHIgKyAxKSwgdGhpcy5lbXBsYWNlKHIsIHQsIGUpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gMiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0MzJbbiArIDBdID0gZSwgdGhpcy5mbG9hdDMyW24gKyAxXSA9IHIsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oSWkpO1xuXG4gICAgVGkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDgsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQyZjhcIiwgVGkpO1xuXG4gICAgdmFyIFZpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwpIHtcbiAgICAgICAgdmFyIHAgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHAgKyAxKSwgdGhpcy5lbXBsYWNlKHAsIHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwKSB7XG4gICAgICAgIHZhciBjID0gMTAgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MTZbYyArIDBdID0gZSwgdGhpcy51aW50MTZbYyArIDFdID0gciwgdGhpcy51aW50MTZbYyArIDJdID0gbiwgdGhpcy51aW50MTZbYyArIDNdID0gaSwgdGhpcy51aW50MTZbYyArIDRdID0gYSwgdGhpcy51aW50MTZbYyArIDVdID0gbywgdGhpcy51aW50MTZbYyArIDZdID0gcywgdGhpcy51aW50MTZbYyArIDddID0gdSwgdGhpcy51aW50MTZbYyArIDhdID0gbCwgdGhpcy51aW50MTZbYyArIDldID0gcCwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBWaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjAsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQxMHVpMjBcIiwgVmkpO1xuXG4gICAgdmFyIEZpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYykge1xuICAgICAgICB2YXIgaCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoaCArIDEpLCB0aGlzLmVtcGxhY2UoaCwgdCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYyk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgpIHtcbiAgICAgICAgdmFyIGYgPSAxMiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W2YgKyAwXSA9IGUsIHRoaXMuaW50MTZbZiArIDFdID0gciwgdGhpcy5pbnQxNltmICsgMl0gPSBuLCB0aGlzLmludDE2W2YgKyAzXSA9IGksIHRoaXMudWludDE2W2YgKyA0XSA9IGEsIHRoaXMudWludDE2W2YgKyA1XSA9IG8sIHRoaXMudWludDE2W2YgKyA2XSA9IHMsIHRoaXMudWludDE2W2YgKyA3XSA9IHUsIHRoaXMuaW50MTZbZiArIDhdID0gbCwgdGhpcy5pbnQxNltmICsgOV0gPSBwLCB0aGlzLmludDE2W2YgKyAxMF0gPSBjLCB0aGlzLmludDE2W2YgKyAxMV0gPSBoLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIEZpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyNCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkyNFwiLCBGaSk7XG5cbiAgICB2YXIgRGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShuICsgMSksIHRoaXMuZW1wbGFjZShuLCB0LCBlLCByKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB2YXIgaSA9IDMgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5mbG9hdDMyW2kgKyAwXSA9IGUsIHRoaXMuZmxvYXQzMltpICsgMV0gPSByLCB0aGlzLmZsb2F0MzJbaSArIDJdID0gbiwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBEaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTIsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQzZjEyXCIsIERpKTtcblxuICAgIHZhciBMaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShlICsgMSksIHRoaXMuZW1wbGFjZShlLCB0KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MzJbMSAqIHQgKyAwXSA9IGUsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oSWkpO1xuXG4gICAgTGkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQxdWw0XCIsIExpKTtcblxuICAgIHZhciBSaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1KSB7XG4gICAgICAgIHZhciBsID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShsICsgMSksIHRoaXMuZW1wbGFjZShsLCB0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCkge1xuICAgICAgICB2YXIgcCA9IDEwICogdCxcbiAgICAgICAgICAgIGMgPSA1ICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbcCArIDBdID0gZSwgdGhpcy5pbnQxNltwICsgMV0gPSByLCB0aGlzLmludDE2W3AgKyAyXSA9IG4sIHRoaXMuaW50MTZbcCArIDNdID0gaSwgdGhpcy5pbnQxNltwICsgNF0gPSBhLCB0aGlzLmludDE2W3AgKyA1XSA9IG8sIHRoaXMudWludDMyW2MgKyAzXSA9IHMsIHRoaXMudWludDE2W3AgKyA4XSA9IHUsIHRoaXMudWludDE2W3AgKyA5XSA9IGwsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oSWkpO1xuXG4gICAgUmkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDIwLCBPbihcIlN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyMFwiLCBSaSk7XG5cbiAgICB2YXIgT2kgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKG8gKyAxKSwgdGhpcy5lbXBsYWNlKG8sIHQsIGUsIHIsIG4sIGksIGEpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICAgIHZhciBzID0gNiAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W3MgKyAwXSA9IGUsIHRoaXMuaW50MTZbcyArIDFdID0gciwgdGhpcy5pbnQxNltzICsgMl0gPSBuLCB0aGlzLmludDE2W3MgKyAzXSA9IGksIHRoaXMuaW50MTZbcyArIDRdID0gYSwgdGhpcy5pbnQxNltzICsgNV0gPSBvLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIE9pLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMiwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyXCIsIE9pKTtcblxuICAgIHZhciBVaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgICB2YXIgYSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoYSArIDEpLCB0aGlzLmVtcGxhY2UoYSwgdCwgZSwgciwgbiwgaSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgdmFyIG8gPSA0ICogdCxcbiAgICAgICAgICAgIHMgPSA4ICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvYXQzMltvICsgMF0gPSBlLCB0aGlzLmZsb2F0MzJbbyArIDFdID0gciwgdGhpcy5mbG9hdDMyW28gKyAyXSA9IG4sIHRoaXMuaW50MTZbcyArIDZdID0gaSwgdGhpcy5pbnQxNltzICsgN10gPSBhLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIFVpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNiwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2XCIsIFVpKTtcblxuICAgIHZhciBqaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGkgKyAxKSwgdGhpcy5lbXBsYWNlKGksIHQsIGUsIHIsIG4pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICAgIHZhciBhID0gMTIgKiB0LFxuICAgICAgICAgICAgbyA9IDMgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy51aW50OFthICsgMF0gPSBlLCB0aGlzLnVpbnQ4W2EgKyAxXSA9IHIsIHRoaXMuZmxvYXQzMltvICsgMV0gPSBuLCB0aGlzLmZsb2F0MzJbbyArIDJdID0gaSwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBqaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTIsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyXCIsIGppKTtcblxuICAgIHZhciBxaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShuICsgMSksIHRoaXMuZW1wbGFjZShuLCB0LCBlLCByKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB2YXIgaSA9IDMgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MTZbaSArIDBdID0gZSwgdGhpcy51aW50MTZbaSArIDFdID0gciwgdGhpcy51aW50MTZbaSArIDJdID0gbiwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBxaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNiwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDN1aTZcIiwgcWkpO1xuXG4gICAgdmFyIE5pID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQsIG0pIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHYgKyAxKSwgdGhpcy5lbXBsYWNlKHYsIHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQsIG0pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkLCBtLCB2KSB7XG4gICAgICAgIHZhciBnID0gMjQgKiB0LFxuICAgICAgICAgICAgeCA9IDEyICogdCxcbiAgICAgICAgICAgIGIgPSA0OCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W2cgKyAwXSA9IGUsIHRoaXMuaW50MTZbZyArIDFdID0gciwgdGhpcy51aW50MTZbZyArIDJdID0gbiwgdGhpcy51aW50MTZbZyArIDNdID0gaSwgdGhpcy51aW50MzJbeCArIDJdID0gYSwgdGhpcy51aW50MzJbeCArIDNdID0gbywgdGhpcy51aW50MzJbeCArIDRdID0gcywgdGhpcy51aW50MTZbZyArIDEwXSA9IHUsIHRoaXMudWludDE2W2cgKyAxMV0gPSBsLCB0aGlzLnVpbnQxNltnICsgMTJdID0gcCwgdGhpcy5mbG9hdDMyW3ggKyA3XSA9IGMsIHRoaXMuZmxvYXQzMlt4ICsgOF0gPSBoLCB0aGlzLnVpbnQ4W2IgKyAzNl0gPSBmLCB0aGlzLnVpbnQ4W2IgKyAzN10gPSB5LCB0aGlzLnVpbnQ4W2IgKyAzOF0gPSBkLCB0aGlzLnVpbnQzMlt4ICsgMTBdID0gbSwgdGhpcy5pbnQxNltnICsgMjJdID0gdiwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBOaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDgsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmM3ViMXVsMWk0OFwiLCBOaSk7XG5cbiAgICB2YXIgS2kgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYywgaCwgZiwgeSwgZCwgbSwgdiwgZywgeCwgYiwgdywgXywgQSwgUywgaywgSSwgeikge1xuICAgICAgICB2YXIgQyA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoQyArIDEpLCB0aGlzLmVtcGxhY2UoQywgdCwgZSwgciwgbiwgaSwgYSwgbywgcywgdSwgbCwgcCwgYywgaCwgZiwgeSwgZCwgbSwgdiwgZywgeCwgYiwgdywgXywgQSwgUywgaywgSSwgeik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHAsIGMsIGgsIGYsIHksIGQsIG0sIHYsIGcsIHgsIGIsIHcsIF8sIEEsIFMsIGssIEksIHosIEMpIHtcbiAgICAgICAgdmFyIEUgPSAzNCAqIHQsXG4gICAgICAgICAgICBQID0gMTcgKiB0O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnQxNltFICsgMF0gPSBlLCB0aGlzLmludDE2W0UgKyAxXSA9IHIsIHRoaXMuaW50MTZbRSArIDJdID0gbiwgdGhpcy5pbnQxNltFICsgM10gPSBpLCB0aGlzLmludDE2W0UgKyA0XSA9IGEsIHRoaXMuaW50MTZbRSArIDVdID0gbywgdGhpcy5pbnQxNltFICsgNl0gPSBzLCB0aGlzLmludDE2W0UgKyA3XSA9IHUsIHRoaXMudWludDE2W0UgKyA4XSA9IGwsIHRoaXMudWludDE2W0UgKyA5XSA9IHAsIHRoaXMudWludDE2W0UgKyAxMF0gPSBjLCB0aGlzLnVpbnQxNltFICsgMTFdID0gaCwgdGhpcy51aW50MTZbRSArIDEyXSA9IGYsIHRoaXMudWludDE2W0UgKyAxM10gPSB5LCB0aGlzLnVpbnQxNltFICsgMTRdID0gZCwgdGhpcy51aW50MTZbRSArIDE1XSA9IG0sIHRoaXMudWludDE2W0UgKyAxNl0gPSB2LCB0aGlzLnVpbnQxNltFICsgMTddID0gZywgdGhpcy51aW50MTZbRSArIDE4XSA9IHgsIHRoaXMudWludDE2W0UgKyAxOV0gPSBiLCB0aGlzLnVpbnQxNltFICsgMjBdID0gdywgdGhpcy51aW50MTZbRSArIDIxXSA9IF8sIHRoaXMudWludDE2W0UgKyAyMl0gPSBBLCB0aGlzLnVpbnQzMltQICsgMTJdID0gUywgdGhpcy5mbG9hdDMyW1AgKyAxM10gPSBrLCB0aGlzLmZsb2F0MzJbUCArIDE0XSA9IEksIHRoaXMuZmxvYXQzMltQICsgMTVdID0geiwgdGhpcy5mbG9hdDMyW1AgKyAxNl0gPSBDLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIEtpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2OCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDhpMTV1aTF1bDRmNjhcIiwgS2kpO1xuXG4gICAgdmFyIEdpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX3JlZnJlc2hWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpLCB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUoZSArIDEpLCB0aGlzLmVtcGxhY2UoZSwgdCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvYXQzMlsxICogdCArIDBdID0gZSwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBHaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNCwgT24oXCJTdHJ1Y3RBcnJheUxheW91dDFmNFwiLCBHaSk7XG5cbiAgICB2YXIgWmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKG4gKyAxKSwgdGhpcy5lbXBsYWNlKG4sIHQsIGUsIHIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICAgIHZhciBpID0gMyAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2W2kgKyAwXSA9IGUsIHRoaXMuaW50MTZbaSArIDFdID0gciwgdGhpcy5pbnQxNltpICsgMl0gPSBuLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIFppLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0M2k2XCIsIFppKTtcblxuICAgIHZhciBYaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICB2YXIgbiA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUobiArIDEpLCB0aGlzLmVtcGxhY2UobiwgdCwgZSwgcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSA0ICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyWzIgKiB0ICsgMF0gPSBlLCB0aGlzLnVpbnQxNltpICsgMl0gPSByLCB0aGlzLnVpbnQxNltpICsgM10gPSBuLCB0O1xuICAgICAgfSwgZTtcbiAgICB9KElpKTtcblxuICAgIFhpLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4LCBPbihcIlN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOFwiLCBYaSk7XG5cbiAgICB2YXIgSmkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlciksIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZUJhY2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IHRoaXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemUociArIDEpLCB0aGlzLmVtcGxhY2UociwgdCwgZSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSAyICogdDtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDE2W24gKyAwXSA9IGUsIHRoaXMudWludDE2W24gKyAxXSA9IHIsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oSWkpO1xuXG4gICAgSmkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQydWk0XCIsIEppKTtcblxuICAgIHZhciBIaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICB9LCBlLnByb3RvdHlwZS5lbXBsYWNlQmFjayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZShlICsgMSksIHRoaXMuZW1wbGFjZShlLCB0KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MTZbMSAqIHQgKyAwXSA9IGUsIHQ7XG4gICAgICB9LCBlO1xuICAgIH0oSWkpO1xuXG4gICAgSGkucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDIsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQxdWkyXCIsIEhpKTtcblxuICAgIHZhciBZaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9yZWZyZXNoVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKSwgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKGkgKyAxKSwgdGhpcy5lbXBsYWNlKGksIHQsIGUsIHIsIG4pO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZW1wbGFjZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICAgIHZhciBhID0gNCAqIHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0MzJbYSArIDBdID0gZSwgdGhpcy5mbG9hdDMyW2EgKyAxXSA9IHIsIHRoaXMuZmxvYXQzMlthICsgMl0gPSBuLCB0aGlzLmZsb2F0MzJbYSArIDNdID0gaSwgdDtcbiAgICAgIH0sIGU7XG4gICAgfShJaSk7XG5cbiAgICBZaS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTYsIE9uKFwiU3RydWN0QXJyYXlMYXlvdXQ0ZjE2XCIsIFlpKTtcblxuICAgIHZhciAkaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZTtcbiAgICAgIHZhciByID0ge1xuICAgICAgICBhbmNob3JQb2ludFg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGFuY2hvclBvaW50WToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgeDE6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHkxOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB4Mjoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgeTI6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGZlYXR1cmVJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlTGF5ZXJJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgYnVja2V0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGFuY2hvclBvaW50OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHIuYW5jaG9yUG9pbnRYLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTtcbiAgICAgIH0sIHIuYW5jaG9yUG9pbnRZLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTtcbiAgICAgIH0sIHIueDEuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdO1xuICAgICAgfSwgci55MS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgM107XG4gICAgICB9LCByLngyLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTtcbiAgICAgIH0sIHIueTIuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdO1xuICAgICAgfSwgci5mZWF0dXJlSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXTtcbiAgICAgIH0sIHIuc291cmNlTGF5ZXJJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDhdO1xuICAgICAgfSwgci5idWNrZXRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldO1xuICAgICAgfSwgci5hbmNob3JQb2ludC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgaSh0aGlzLmFuY2hvclBvaW50WCwgdGhpcy5hbmNob3JQb2ludFkpO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCBlO1xuICAgIH0oa2kpO1xuXG4gICAgJGkucHJvdG90eXBlLnNpemUgPSAyMDtcblxuICAgIHZhciBXaSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgJGkodGhpcywgdCk7XG4gICAgICB9LCBlO1xuICAgIH0oUmkpO1xuXG4gICAgT24oXCJDb2xsaXNpb25Cb3hBcnJheVwiLCBXaSk7XG5cbiAgICB2YXIgUWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGU7XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgYW5jaG9yWDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgYW5jaG9yWToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgZ2x5cGhTdGFydEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBudW1HbHlwaHM6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHZlcnRleFN0YXJ0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVTdGFydEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBsaW5lTGVuZ3RoOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBzZWdtZW50OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBsb3dlclNpemU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyU2l6ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbGluZU9mZnNldFg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVPZmZzZXRZOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB3cml0aW5nTW9kZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgcGxhY2VkT3JpZW50YXRpb246IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGhpZGRlbjoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgY3Jvc3NUaWxlSUQ6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGFzc29jaWF0ZWRJY29uSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gci5hbmNob3JYLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTtcbiAgICAgIH0sIHIuYW5jaG9yWS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07XG4gICAgICB9LCByLmdseXBoU3RhcnRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdO1xuICAgICAgfSwgci5udW1HbHlwaHMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXTtcbiAgICAgIH0sIHIudmVydGV4U3RhcnRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDJdO1xuICAgICAgfSwgci5saW5lU3RhcnRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdO1xuICAgICAgfSwgci5saW5lTGVuZ3RoLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgNF07XG4gICAgICB9LCByLnNlZ21lbnQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF07XG4gICAgICB9LCByLmxvd2VyU2l6ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTtcbiAgICAgIH0sIHIudXBwZXJTaXplLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTJdO1xuICAgICAgfSwgci5saW5lT2Zmc2V0WC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA3XTtcbiAgICAgIH0sIHIubGluZU9mZnNldFkuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgOF07XG4gICAgICB9LCByLndyaXRpbmdNb2RlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzNl07XG4gICAgICB9LCByLnBsYWNlZE9yaWVudGF0aW9uLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN107XG4gICAgICB9LCByLnBsYWNlZE9yaWVudGF0aW9uLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN10gPSB0O1xuICAgICAgfSwgci5oaWRkZW4uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDM4XTtcbiAgICAgIH0sIHIuaGlkZGVuLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzOF0gPSB0O1xuICAgICAgfSwgci5jcm9zc1RpbGVJRC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEwXTtcbiAgICAgIH0sIHIuY3Jvc3NUaWxlSUQuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxMF0gPSB0O1xuICAgICAgfSwgci5hc3NvY2lhdGVkSWNvbkluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyMl07XG4gICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIGU7XG4gICAgfShraSk7XG5cbiAgICBRaS5wcm90b3R5cGUuc2l6ZSA9IDQ4O1xuXG4gICAgdmFyIHRhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRaSh0aGlzLCB0KTtcbiAgICAgIH0sIGU7XG4gICAgfShOaSk7XG5cbiAgICBPbihcIlBsYWNlZFN5bWJvbEFycmF5XCIsIHRhKTtcblxuICAgIHZhciBlYSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZTtcbiAgICAgIHZhciByID0ge1xuICAgICAgICBhbmNob3JYOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBhbmNob3JZOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICByaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgcGxhY2VkSWNvblN5bWJvbEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAga2V5OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0Qm94U3RhcnRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEJveEVuZEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgaWNvbkJveFN0YXJ0SW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGljb25Cb3hFbmRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxJY29uQm94U3RhcnRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVydGljYWxJY29uQm94RW5kSW5kZXg6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGZlYXR1cmVJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXM6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgbnVtSWNvblZlcnRpY2VzOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBudW1WZXJ0aWNhbEljb25WZXJ0aWNlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXM6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIGNyb3NzVGlsZUlEOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0Qm94U2NhbGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRPZmZzZXQwOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0T2Zmc2V0MToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXI6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gci5hbmNob3JYLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTtcbiAgICAgIH0sIHIuYW5jaG9yWS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07XG4gICAgICB9LCByLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTtcbiAgICAgIH0sIHIuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXTtcbiAgICAgIH0sIHIubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07XG4gICAgICB9LCByLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XTtcbiAgICAgIH0sIHIucGxhY2VkSWNvblN5bWJvbEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA2XTtcbiAgICAgIH0sIHIudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDddO1xuICAgICAgfSwgci5rZXkuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA4XTtcbiAgICAgIH0sIHIudGV4dEJveFN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA5XTtcbiAgICAgIH0sIHIudGV4dEJveEVuZEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdO1xuICAgICAgfSwgci52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTFdO1xuICAgICAgfSwgci52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEyXTtcbiAgICAgIH0sIHIuaWNvbkJveFN0YXJ0SW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxM107XG4gICAgICB9LCByLmljb25Cb3hFbmRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE0XTtcbiAgICAgIH0sIHIudmVydGljYWxJY29uQm94U3RhcnRJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE1XTtcbiAgICAgIH0sIHIudmVydGljYWxJY29uQm94RW5kSW5kZXguZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNl07XG4gICAgICB9LCByLmZlYXR1cmVJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE3XTtcbiAgICAgIH0sIHIubnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOF07XG4gICAgICB9LCByLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE5XTtcbiAgICAgIH0sIHIubnVtSWNvblZlcnRpY2VzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjBdO1xuICAgICAgfSwgci5udW1WZXJ0aWNhbEljb25WZXJ0aWNlcy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDIxXTtcbiAgICAgIH0sIHIudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyMl07XG4gICAgICB9LCByLmNyb3NzVGlsZUlELmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTJdO1xuICAgICAgfSwgci5jcm9zc1RpbGVJRC5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEyXSA9IHQ7XG4gICAgICB9LCByLnRleHRCb3hTY2FsZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxM107XG4gICAgICB9LCByLnRleHRPZmZzZXQwLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE0XTtcbiAgICAgIH0sIHIudGV4dE9mZnNldDEuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMTVdO1xuICAgICAgfSwgci5jb2xsaXNpb25DaXJjbGVEaWFtZXRlci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxNl07XG4gICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIGU7XG4gICAgfShraSk7XG5cbiAgICBlYS5wcm90b3R5cGUuc2l6ZSA9IDY4O1xuXG4gICAgdmFyIHJhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBlYSh0aGlzLCB0KTtcbiAgICAgIH0sIGU7XG4gICAgfShLaSk7XG5cbiAgICBPbihcIlN5bWJvbEluc3RhbmNlQXJyYXlcIiwgcmEpO1xuXG4gICAgdmFyIG5hID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0b2Zmc2V0WCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb2F0MzJbMSAqIHQgKyAwXTtcbiAgICAgIH0sIGU7XG4gICAgfShHaSk7XG5cbiAgICBPbihcIkdseXBoT2Zmc2V0QXJyYXlcIiwgbmEpO1xuXG4gICAgdmFyIGlhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0eCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludDE2WzMgKiB0ICsgMF07XG4gICAgICB9LCBlLnByb3RvdHlwZS5nZXR5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbMyAqIHQgKyAxXTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmdldHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50MTZbMyAqIHQgKyAyXTtcbiAgICAgIH0sIGU7XG4gICAgfShaaSk7XG5cbiAgICBPbihcIlN5bWJvbExpbmVWZXJ0ZXhBcnJheVwiLCBpYSk7XG5cbiAgICB2YXIgYWEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGU7XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgZmVhdHVyZUluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VMYXllckluZGV4OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICBidWNrZXRJbmRleDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByLmZlYXR1cmVJbmRleC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDBdO1xuICAgICAgfSwgci5zb3VyY2VMYXllckluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMl07XG4gICAgICB9LCByLmJ1Y2tldEluZGV4LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgM107XG4gICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIGU7XG4gICAgfShraSk7XG5cbiAgICBhYS5wcm90b3R5cGUuc2l6ZSA9IDg7XG5cbiAgICB2YXIgb2EgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IGFhKHRoaXMsIHQpO1xuICAgICAgfSwgZTtcbiAgICB9KFhpKTtcblxuICAgIE9uKFwiRmVhdHVyZUluZGV4QXJyYXlcIiwgb2EpO1xuXG4gICAgdmFyIHNhID0gemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9XSwgNCkubWVtYmVycyxcbiAgICAgICAgdWEgPSBmdW5jdGlvbiB1YSh0KSB7XG4gICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBbXSksIHRoaXMuc2VnbWVudHMgPSB0O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsYSh0LCBlKSB7XG4gICAgICByZXR1cm4gMjU2ICogKHQgPSBwKE1hdGguZmxvb3IodCksIDAsIDI1NSkpICsgcChNYXRoLmZsb29yKGUpLCAwLCAyNTUpO1xuICAgIH1cblxuICAgIHVhLnByb3RvdHlwZS5wcmVwYXJlU2VnbWVudCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiB0ID4gdWEuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggJiYgQShcIk1heCB2ZXJ0aWNlcyBwZXIgc2VnbWVudCBpcyBcIiArIHVhLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIICsgXCI6IGJ1Y2tldCByZXF1ZXN0ZWQgXCIgKyB0KSwgKCFpIHx8IGkudmVydGV4TGVuZ3RoICsgdCA+IHVhLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIIHx8IGkuc29ydEtleSAhPT0gbikgJiYgKGkgPSB7XG4gICAgICAgIHZlcnRleE9mZnNldDogZS5sZW5ndGgsXG4gICAgICAgIHByaW1pdGl2ZU9mZnNldDogci5sZW5ndGgsXG4gICAgICAgIHZlcnRleExlbmd0aDogMCxcbiAgICAgICAgcHJpbWl0aXZlTGVuZ3RoOiAwXG4gICAgICB9LCB2b2lkIDAgIT09IG4gJiYgKGkuc29ydEtleSA9IG4pLCB0aGlzLnNlZ21lbnRzLnB1c2goaSkpLCBpO1xuICAgIH0sIHVhLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWdtZW50cztcbiAgICB9LCB1YS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSAwLCBlID0gdGhpcy5zZWdtZW50czsgdCA8IGUubGVuZ3RoOyB0ICs9IDEpIHtcbiAgICAgICAgdmFyIHIgPSBlW3RdO1xuXG4gICAgICAgIGZvciAodmFyIG4gaW4gci52YW9zKSB7XG4gICAgICAgICAgci52YW9zW25dLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHVhLnNpbXBsZVNlZ21lbnQgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIG5ldyB1YShbe1xuICAgICAgICB2ZXJ0ZXhPZmZzZXQ6IHQsXG4gICAgICAgIHByaW1pdGl2ZU9mZnNldDogZSxcbiAgICAgICAgdmVydGV4TGVuZ3RoOiByLFxuICAgICAgICBwcmltaXRpdmVMZW5ndGg6IG4sXG4gICAgICAgIHZhb3M6IHt9LFxuICAgICAgICBzb3J0S2V5OiAwXG4gICAgICB9XSk7XG4gICAgfSwgdWEuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggPSBNYXRoLnBvdygyLCAxNikgLSAxLCBPbihcIlNlZ21lbnRWZWN0b3JcIiwgdWEpO1xuICAgIHZhciBwYSA9IHppKFt7XG4gICAgICBuYW1lOiBcImFfcGF0dGVybl9mcm9tXCIsXG4gICAgICBjb21wb25lbnRzOiA0LFxuICAgICAgdHlwZTogXCJVaW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9wYXR0ZXJuX3RvXCIsXG4gICAgICBjb21wb25lbnRzOiA0LFxuICAgICAgdHlwZTogXCJVaW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9waXhlbF9yYXRpb19mcm9tXCIsXG4gICAgICBjb21wb25lbnRzOiAxLFxuICAgICAgdHlwZTogXCJVaW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9waXhlbF9yYXRpb190b1wiLFxuICAgICAgY29tcG9uZW50czogMSxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9XSksXG4gICAgICAgIGNhID0gZShmdW5jdGlvbiAodCkge1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIHIsIG4sIGksIGEsIG8sIHMsIHUsIGw7XG5cbiAgICAgICAgZm9yIChuID0gdC5sZW5ndGggLSAociA9IDMgJiB0Lmxlbmd0aCksIGkgPSBlLCBvID0gMzQzMjkxODM1MywgcyA9IDQ2MTg0NTkwNywgbCA9IDA7IGwgPCBuOykge1xuICAgICAgICAgIHUgPSAyNTUgJiB0LmNoYXJDb2RlQXQobCkgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KCsrbCkpIDw8IDggfCAoMjU1ICYgdC5jaGFyQ29kZUF0KCsrbCkpIDw8IDE2IHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2wpKSA8PCAyNCwgKytsLCBpID0gMjc0OTIgKyAoNjU1MzUgJiAoYSA9IDUgKiAoNjU1MzUgJiAoaSA9IChpIF49IHUgPSAoNjU1MzUgJiAodSA9ICh1ID0gKDY1NTM1ICYgdSkgKiBvICsgKCgodSA+Pj4gMTYpICogbyAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1KSA8PCAxNSB8IHUgPj4+IDE3KSkgKiBzICsgKCgodSA+Pj4gMTYpICogcyAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1KSA8PCAxMyB8IGkgPj4+IDE5KSkgKyAoKDUgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSAmIDQyOTQ5NjcyOTUpKSArICgoNTg5NjQgKyAoYSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodSA9IDAsIHIpIHtcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB1IF49ICgyNTUgJiB0LmNoYXJDb2RlQXQobCArIDIpKSA8PCAxNjtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHUgXj0gKDI1NSAmIHQuY2hhckNvZGVBdChsICsgMSkpIDw8IDg7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBpIF49IHUgPSAoNjU1MzUgJiAodSA9ICh1ID0gKDY1NTM1ICYgKHUgXj0gMjU1ICYgdC5jaGFyQ29kZUF0KGwpKSkgKiBvICsgKCgodSA+Pj4gMTYpICogbyAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1KSA8PCAxNSB8IHUgPj4+IDE3KSkgKiBzICsgKCgodSA+Pj4gMTYpICogcyAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkgXj0gdC5sZW5ndGgsIGkgPSAyMjQ2ODIyNTA3ICogKDY1NTM1ICYgKGkgXj0gaSA+Pj4gMTYpKSArICgoMjI0NjgyMjUwNyAqIChpID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpICYgNDI5NDk2NzI5NSwgaSA9IDMyNjY0ODk5MDkgKiAoNjU1MzUgJiAoaSBePSBpID4+PiAxMykpICsgKCgzMjY2NDg5OTA5ICogKGkgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNikgJiA0Mjk0OTY3Mjk1LCAoaSBePSBpID4+PiAxNikgPj4+IDA7XG4gICAgICB9O1xuICAgIH0pLFxuICAgICAgICBoYSA9IGUoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIHIsIG4gPSB0Lmxlbmd0aCwgaSA9IGUgXiBuLCBhID0gMDsgbiA+PSA0Oykge1xuICAgICAgICAgIHIgPSAxNTQwNDgzNDc3ICogKDY1NTM1ICYgKHIgPSAyNTUgJiB0LmNoYXJDb2RlQXQoYSkgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KCsrYSkpIDw8IDggfCAoMjU1ICYgdC5jaGFyQ29kZUF0KCsrYSkpIDw8IDE2IHwgKDI1NSAmIHQuY2hhckNvZGVBdCgrK2EpKSA8PCAyNCkpICsgKCgxNTQwNDgzNDc3ICogKHIgPj4+IDE2KSAmIDY1NTM1KSA8PCAxNiksIGkgPSAxNTQwNDgzNDc3ICogKDY1NTM1ICYgaSkgKyAoKDE1NDA0ODM0NzcgKiAoaSA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSBeIChyID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIChyIF49IHIgPj4+IDI0KSkgKyAoKDE1NDA0ODM0NzcgKiAociA+Pj4gMTYpICYgNjU1MzUpIDw8IDE2KSksIG4gLT0gNCwgKythO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaSBePSAoMjU1ICYgdC5jaGFyQ29kZUF0KGEgKyAyKSkgPDwgMTY7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpIF49ICgyNTUgJiB0LmNoYXJDb2RlQXQoYSArIDEpKSA8PCA4O1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgaSA9IDE1NDA0ODM0NzcgKiAoNjU1MzUgJiAoaSBePSAyNTUgJiB0LmNoYXJDb2RlQXQoYSkpKSArICgoMTU0MDQ4MzQ3NyAqIChpID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkgPSAxNTQwNDgzNDc3ICogKDY1NTM1ICYgKGkgXj0gaSA+Pj4gMTMpKSArICgoMTU0MDQ4MzQ3NyAqIChpID4+PiAxNikgJiA2NTUzNSkgPDwgMTYpLCAoaSBePSBpID4+PiAxNSkgPj4+IDA7XG4gICAgICB9O1xuICAgIH0pLFxuICAgICAgICBmYSA9IGNhLFxuICAgICAgICB5YSA9IGhhO1xuICAgIGZhLm11cm11cjMgPSBjYSwgZmEubXVybXVyMiA9IHlhO1xuXG4gICAgdmFyIGRhID0gZnVuY3Rpb24gZGEoKSB7XG4gICAgICB0aGlzLmlkcyA9IFtdLCB0aGlzLnBvc2l0aW9ucyA9IFtdLCB0aGlzLmluZGV4ZWQgPSAhMTtcbiAgICB9O1xuXG4gICAgZGEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLmlkcy5wdXNoKHZhKHQpKSwgdGhpcy5wb3NpdGlvbnMucHVzaChlLCByLCBuKTtcbiAgICB9LCBkYS5wcm90b3R5cGUuZ2V0UG9zaXRpb25zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSB2YSh0KSwgciA9IDAsIG4gPSB0aGlzLmlkcy5sZW5ndGggLSAxOyByIDwgbjspIHtcbiAgICAgICAgdmFyIGkgPSByICsgbiA+PiAxO1xuICAgICAgICB0aGlzLmlkc1tpXSA+PSBlID8gbiA9IGkgOiByID0gaSArIDE7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGEgPSBbXTsgdGhpcy5pZHNbcl0gPT09IGU7KSB7XG4gICAgICAgIGEucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IHRoaXMucG9zaXRpb25zWzMgKiByXSxcbiAgICAgICAgICBzdGFydDogdGhpcy5wb3NpdGlvbnNbMyAqIHIgKyAxXSxcbiAgICAgICAgICBlbmQ6IHRoaXMucG9zaXRpb25zWzMgKiByICsgMl1cbiAgICAgICAgfSksIHIrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgZGEuc2VyaWFsaXplID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IEZsb2F0NjRBcnJheSh0LmlkcyksXG4gICAgICAgICAgbiA9IG5ldyBVaW50MzJBcnJheSh0LnBvc2l0aW9ucyk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gdChlLCByLCBuLCBpKSB7XG4gICAgICAgIGZvciAoOyBuIDwgaTspIHtcbiAgICAgICAgICBmb3IgKHZhciBhID0gZVtuICsgaSA+PiAxXSwgbyA9IG4gLSAxLCBzID0gaSArIDE7Oykge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBvKys7XG4gICAgICAgICAgICB9IHdoaWxlIChlW29dIDwgYSk7XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgfSB3aGlsZSAoZVtzXSA+IGEpO1xuXG4gICAgICAgICAgICBpZiAobyA+PSBzKSBicmVhaztcbiAgICAgICAgICAgIGdhKGUsIG8sIHMpLCBnYShyLCAzICogbywgMyAqIHMpLCBnYShyLCAzICogbyArIDEsIDMgKiBzICsgMSksIGdhKHIsIDMgKiBvICsgMiwgMyAqIHMgKyAyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzIC0gbiA8IGkgLSBzID8gKHQoZSwgciwgbiwgcyksIG4gPSBzICsgMSkgOiAodChlLCByLCBzICsgMSwgaSksIGkgPSBzKTtcbiAgICAgICAgfVxuICAgICAgfShyLCBuLCAwLCByLmxlbmd0aCAtIDEpLCBlICYmIGUucHVzaChyLmJ1ZmZlciwgbi5idWZmZXIpLCB7XG4gICAgICAgIGlkczogcixcbiAgICAgICAgcG9zaXRpb25zOiBuXG4gICAgICB9O1xuICAgIH0sIGRhLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gbmV3IGRhKCk7XG4gICAgICByZXR1cm4gZS5pZHMgPSB0LmlkcywgZS5wb3NpdGlvbnMgPSB0LnBvc2l0aW9ucywgZS5pbmRleGVkID0gITAsIGU7XG4gICAgfTtcbiAgICB2YXIgbWEgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG4gICAgZnVuY3Rpb24gdmEodCkge1xuICAgICAgdmFyIGUgPSArdDtcbiAgICAgIHJldHVybiAhaXNOYU4oZSkgJiYgZSA8PSBtYSA/IGUgOiBmYShTdHJpbmcodCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdhKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdFtlXTtcbiAgICAgIHRbZV0gPSB0W3JdLCB0W3JdID0gbjtcbiAgICB9XG5cbiAgICBPbihcIkZlYXR1cmVQb3NpdGlvbk1hcFwiLCBkYSk7XG5cbiAgICB2YXIgeGEgPSBmdW5jdGlvbiB4YSh0LCBlKSB7XG4gICAgICB0aGlzLmdsID0gdC5nbCwgdGhpcy5sb2NhdGlvbiA9IGU7XG4gICAgfSxcbiAgICAgICAgYmEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByKSwgdGhpcy5jdXJyZW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ICE9PSB0ICYmICh0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLmxvY2F0aW9uLCB0KSk7XG4gICAgICB9LCBlO1xuICAgIH0oeGEpLFxuICAgICAgICB3YSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUsIHIpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHIpLCB0aGlzLmN1cnJlbnQgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgIT09IHQgJiYgKHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZ2wudW5pZm9ybTFmKHRoaXMubG9jYXRpb24sIHQpKTtcbiAgICAgIH0sIGU7XG4gICAgfSh4YSksXG4gICAgICAgIF9hID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IFswLCAwXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdFswXSA9PT0gdGhpcy5jdXJyZW50WzBdICYmIHRbMV0gPT09IHRoaXMuY3VycmVudFsxXSB8fCAodGhpcy5jdXJyZW50ID0gdCwgdGhpcy5nbC51bmlmb3JtMmYodGhpcy5sb2NhdGlvbiwgdFswXSwgdFsxXSkpO1xuICAgICAgfSwgZTtcbiAgICB9KHhhKSxcbiAgICAgICAgQWEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByKSwgdGhpcy5jdXJyZW50ID0gWzAsIDAsIDBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0WzBdID09PSB0aGlzLmN1cnJlbnRbMF0gJiYgdFsxXSA9PT0gdGhpcy5jdXJyZW50WzFdICYmIHRbMl0gPT09IHRoaXMuY3VycmVudFsyXSB8fCAodGhpcy5jdXJyZW50ID0gdCwgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5sb2NhdGlvbiwgdFswXSwgdFsxXSwgdFsyXSkpO1xuICAgICAgfSwgZTtcbiAgICB9KHhhKSxcbiAgICAgICAgU2EgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCByKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCByKSwgdGhpcy5jdXJyZW50ID0gWzAsIDAsIDAsIDBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0WzBdID09PSB0aGlzLmN1cnJlbnRbMF0gJiYgdFsxXSA9PT0gdGhpcy5jdXJyZW50WzFdICYmIHRbMl0gPT09IHRoaXMuY3VycmVudFsyXSAmJiB0WzNdID09PSB0aGlzLmN1cnJlbnRbM10gfHwgKHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMubG9jYXRpb24sIHRbMF0sIHRbMV0sIHRbMl0sIHRbM10pKTtcbiAgICAgIH0sIGU7XG4gICAgfSh4YSksXG4gICAgICAgIGthID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IGVlLnRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnIgPT09IHRoaXMuY3VycmVudC5yICYmIHQuZyA9PT0gdGhpcy5jdXJyZW50LmcgJiYgdC5iID09PSB0aGlzLmN1cnJlbnQuYiAmJiB0LmEgPT09IHRoaXMuY3VycmVudC5hIHx8ICh0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB0LnIsIHQuZywgdC5iLCB0LmEpKTtcbiAgICAgIH0sIGU7XG4gICAgfSh4YSksXG4gICAgICAgIElhID0gbmV3IEZsb2F0MzJBcnJheSgxNiksXG4gICAgICAgIHphID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgcikge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuY3VycmVudCA9IElhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodFsxMl0gIT09IHRoaXMuY3VycmVudFsxMl0gfHwgdFswXSAhPT0gdGhpcy5jdXJyZW50WzBdKSByZXR1cm4gdGhpcy5jdXJyZW50ID0gdCwgdm9pZCB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwgITEsIHQpO1xuXG4gICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgMTY7IGUrKykge1xuICAgICAgICAgIGlmICh0W2VdICE9PSB0aGlzLmN1cnJlbnRbZV0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmxvY2F0aW9uLCAhMSwgdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfSh4YSk7XG5cbiAgICBmdW5jdGlvbiBDYSh0KSB7XG4gICAgICByZXR1cm4gW2xhKDI1NSAqIHQuciwgMjU1ICogdC5nKSwgbGEoMjU1ICogdC5iLCAyNTUgKiB0LmEpXTtcbiAgICB9XG5cbiAgICB2YXIgRWEgPSBmdW5jdGlvbiBFYSh0LCBlLCByKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdCwgdGhpcy51bmlmb3JtTmFtZXMgPSBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJ1X1wiICsgdDtcbiAgICAgIH0pLCB0aGlzLnR5cGUgPSByO1xuICAgIH07XG5cbiAgICBFYS5wcm90b3R5cGUuc2V0VW5pZm9ybSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0LnNldChyLmNvbnN0YW50T3IodGhpcy52YWx1ZSkpO1xuICAgIH0sIEVhLnByb3RvdHlwZS5nZXRCaW5kaW5nID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiBcImNvbG9yXCIgPT09IHRoaXMudHlwZSA/IG5ldyBrYSh0LCBlKSA6IG5ldyB3YSh0LCBlKTtcbiAgICB9O1xuXG4gICAgdmFyIFBhID0gZnVuY3Rpb24gUGEodCwgZSkge1xuICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSBlLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJ1X1wiICsgdDtcbiAgICAgIH0pLCB0aGlzLnBhdHRlcm5Gcm9tID0gbnVsbCwgdGhpcy5wYXR0ZXJuVG8gPSBudWxsLCB0aGlzLnBpeGVsUmF0aW9Gcm9tID0gMSwgdGhpcy5waXhlbFJhdGlvVG8gPSAxO1xuICAgIH07XG5cbiAgICBQYS5wcm90b3R5cGUuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMucGl4ZWxSYXRpb0Zyb20gPSBlLnBpeGVsUmF0aW8sIHRoaXMucGl4ZWxSYXRpb1RvID0gdC5waXhlbFJhdGlvLCB0aGlzLnBhdHRlcm5Gcm9tID0gZS50bGJyLCB0aGlzLnBhdHRlcm5UbyA9IHQudGxicjtcbiAgICB9LCBQYS5wcm90b3R5cGUuc2V0VW5pZm9ybSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IFwidV9wYXR0ZXJuX3RvXCIgPT09IG4gPyB0aGlzLnBhdHRlcm5UbyA6IFwidV9wYXR0ZXJuX2Zyb21cIiA9PT0gbiA/IHRoaXMucGF0dGVybkZyb20gOiBcInVfcGl4ZWxfcmF0aW9fdG9cIiA9PT0gbiA/IHRoaXMucGl4ZWxSYXRpb1RvIDogXCJ1X3BpeGVsX3JhdGlvX2Zyb21cIiA9PT0gbiA/IHRoaXMucGl4ZWxSYXRpb0Zyb20gOiBudWxsO1xuICAgICAgaSAmJiB0LnNldChpKTtcbiAgICB9LCBQYS5wcm90b3R5cGUuZ2V0QmluZGluZyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gXCJ1X3BhdHRlcm5cIiA9PT0gci5zdWJzdHIoMCwgOSkgPyBuZXcgU2EodCwgZSkgOiBuZXcgd2EodCwgZSk7XG4gICAgfTtcblxuICAgIHZhciBNYSA9IGZ1bmN0aW9uIE1hKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHQsIHRoaXMudHlwZSA9IHIsIHRoaXMubWF4VmFsdWUgPSAwLCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogXCJhX1wiICsgdCxcbiAgICAgICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgICAgICBjb21wb25lbnRzOiBcImNvbG9yXCIgPT09IHIgPyAyIDogMSxcbiAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfTtcbiAgICAgIH0pLCB0aGlzLnBhaW50VmVydGV4QXJyYXkgPSBuZXcgbigpO1xuICAgIH07XG5cbiAgICBNYS5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gdGhpcy5wYWludFZlcnRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBvID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyB1aSgwKSwgZSwge30sIG4sIFtdLCBpKTtcbiAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksIHRoaXMuX3NldFBhaW50VmFsdWUoYSwgdCwgbyk7XG4gICAgfSwgTWEucHJvdG90eXBlLnVwZGF0ZVBhaW50QXJyYXkgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe1xuICAgICAgICB6b29tOiAwXG4gICAgICB9LCByLCBuKTtcblxuICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZSh0LCBlLCBpKTtcbiAgICB9LCBNYS5wcm90b3R5cGUuX3NldFBhaW50VmFsdWUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKFwiY29sb3JcIiA9PT0gdGhpcy50eXBlKSBmb3IgKHZhciBuID0gQ2EociksIGkgPSB0OyBpIDwgZTsgaSsrKSB7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIG5bMF0sIG5bMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgYSA9IHQ7IGEgPCBlOyBhKyspIHtcbiAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShhLCByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBNYXRoLmFicyhyKSk7XG4gICAgICB9XG4gICAgfSwgTWEucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyICYmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyID8gdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSkgOiB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKTtcbiAgICB9LCBNYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfTtcblxuICAgIHZhciBCYSA9IGZ1bmN0aW9uIEJhKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHQsIHRoaXMudW5pZm9ybU5hbWVzID0gZS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwidV9cIiArIHQgKyBcIl90XCI7XG4gICAgICB9KSwgdGhpcy50eXBlID0gciwgdGhpcy51c2VJbnRlZ2VyWm9vbSA9IG4sIHRoaXMuem9vbSA9IGksIHRoaXMubWF4VmFsdWUgPSAwLCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IGUubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogXCJhX1wiICsgdCxcbiAgICAgICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgICAgICBjb21wb25lbnRzOiBcImNvbG9yXCIgPT09IHIgPyA0IDogMixcbiAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfTtcbiAgICAgIH0pLCB0aGlzLnBhaW50VmVydGV4QXJyYXkgPSBuZXcgYSgpO1xuICAgIH07XG5cbiAgICBCYS5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyB1aSh0aGlzLnpvb20pLCBlLCB7fSwgbiwgW10sIGkpLFxuICAgICAgICAgIG8gPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IHVpKHRoaXMuem9vbSArIDEpLCBlLCB7fSwgbiwgW10sIGkpLFxuICAgICAgICAgIHMgPSB0aGlzLnBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LnJlc2l6ZSh0KSwgdGhpcy5fc2V0UGFpbnRWYWx1ZShzLCB0LCBhLCBvKTtcbiAgICB9LCBCYS5wcm90b3R5cGUudXBkYXRlUGFpbnRBcnJheSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7XG4gICAgICAgIHpvb206IHRoaXMuem9vbVxuICAgICAgfSwgciwgbiksXG4gICAgICAgICAgYSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7XG4gICAgICAgIHpvb206IHRoaXMuem9vbSArIDFcbiAgICAgIH0sIHIsIG4pO1xuXG4gICAgICB0aGlzLl9zZXRQYWludFZhbHVlKHQsIGUsIGksIGEpO1xuICAgIH0sIEJhLnByb3RvdHlwZS5fc2V0UGFpbnRWYWx1ZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBpZiAoXCJjb2xvclwiID09PSB0aGlzLnR5cGUpIGZvciAodmFyIGkgPSBDYShyKSwgYSA9IENhKG4pLCBvID0gdDsgbyA8IGU7IG8rKykge1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShvLCBpWzBdLCBpWzFdLCBhWzBdLCBhWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIHMgPSB0OyBzIDwgZTsgcysrKSB7XG4gICAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2Uocywgciwgbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgTWF0aC5hYnMociksIE1hdGguYWJzKG4pKTtcbiAgICAgIH1cbiAgICB9LCBCYS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIgJiYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5idWZmZXIgPyB0aGlzLnBhaW50VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5wYWludFZlcnRleEFycmF5KSA6IHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCkpO1xuICAgIH0sIEJhLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9LCBCYS5wcm90b3R5cGUuc2V0VW5pZm9ybSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXMudXNlSW50ZWdlclpvb20gPyBNYXRoLmZsb29yKGUuem9vbSkgOiBlLnpvb20sXG4gICAgICAgICAgbiA9IHAodGhpcy5leHByZXNzaW9uLmludGVycG9sYXRpb25GYWN0b3IociwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKSwgMCwgMSk7XG4gICAgICB0LnNldChuKTtcbiAgICB9LCBCYS5wcm90b3R5cGUuZ2V0QmluZGluZyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gbmV3IHdhKHQsIGUpO1xuICAgIH07XG5cbiAgICB2YXIgVGEgPSBmdW5jdGlvbiBUYSh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSB0LCB0aGlzLnR5cGUgPSBlLCB0aGlzLnVzZUludGVnZXJab29tID0gciwgdGhpcy56b29tID0gbiwgdGhpcy5sYXllcklkID0gYSwgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5ID0gbmV3IGkoKSwgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBpKCk7XG4gICAgfTtcblxuICAgIFRhLnByb3RvdHlwZS5wb3B1bGF0ZVBhaW50QXJyYXkgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LnJlc2l6ZSh0KSwgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUodCksIHRoaXMuX3NldFBhaW50VmFsdWVzKG4sIHQsIGUucGF0dGVybnMgJiYgZS5wYXR0ZXJuc1t0aGlzLmxheWVySWRdLCByKTtcbiAgICB9LCBUYS5wcm90b3R5cGUudXBkYXRlUGFpbnRBcnJheSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLl9zZXRQYWludFZhbHVlcyh0LCBlLCByLnBhdHRlcm5zICYmIHIucGF0dGVybnNbdGhpcy5sYXllcklkXSwgaSk7XG4gICAgfSwgVGEucHJvdG90eXBlLl9zZXRQYWludFZhbHVlcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBpZiAobiAmJiByKSB7XG4gICAgICAgIHZhciBpID0gbltyLm1pbl0sXG4gICAgICAgICAgICBhID0gbltyLm1pZF0sXG4gICAgICAgICAgICBvID0gbltyLm1heF07XG4gICAgICAgIGlmIChpICYmIGEgJiYgbykgZm9yICh2YXIgcyA9IHQ7IHMgPCBlOyBzKyspIHtcbiAgICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShzLCBhLnRsWzBdLCBhLnRsWzFdLCBhLmJyWzBdLCBhLmJyWzFdLCBpLnRsWzBdLCBpLnRsWzFdLCBpLmJyWzBdLCBpLmJyWzFdLCBhLnBpeGVsUmF0aW8sIGkucGl4ZWxSYXRpbyksIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShzLCBhLnRsWzBdLCBhLnRsWzFdLCBhLmJyWzBdLCBhLmJyWzFdLCBvLnRsWzBdLCBvLnRsWzFdLCBvLmJyWzBdLCBvLmJyWzFdLCBhLnBpeGVsUmF0aW8sIG8ucGl4ZWxSYXRpbyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBUYS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIgJiYgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyICYmICh0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LCBwYS5tZW1iZXJzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCksIHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSwgcGEubWVtYmVycywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpKTtcbiAgICB9LCBUYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy56b29tSW5QYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9O1xuXG4gICAgdmFyIFZhID0gZnVuY3Rpb24gVmEodCwgZSwgcikge1xuICAgICAgdGhpcy5iaW5kZXJzID0ge30sIHRoaXMuX2J1ZmZlcnMgPSBbXTtcbiAgICAgIHZhciBuID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgaW4gdC5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgIGlmIChyKGkpKSB7XG4gICAgICAgICAgdmFyIGEgPSB0LnBhaW50LmdldChpKTtcblxuICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgZGkgJiYgVnIoYS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSkge1xuICAgICAgICAgICAgdmFyIG8gPSBEYShpLCB0LnR5cGUpLFxuICAgICAgICAgICAgICAgIHMgPSBhLnZhbHVlLFxuICAgICAgICAgICAgICAgIHUgPSBhLnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICBsID0gYS5wcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbSxcbiAgICAgICAgICAgICAgICBwID0gYS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uW1wicHJvcGVydHktdHlwZVwiXSxcbiAgICAgICAgICAgICAgICBjID0gXCJjcm9zcy1mYWRlZFwiID09PSBwIHx8IFwiY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW5cIiA9PT0gcDtcbiAgICAgICAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHMua2luZCkgdGhpcy5iaW5kZXJzW2ldID0gYyA/IG5ldyBQYShzLnZhbHVlLCBvKSA6IG5ldyBFYShzLnZhbHVlLCBvLCB1KSwgbi5wdXNoKFwiL3VfXCIgKyBpKTtlbHNlIGlmIChcInNvdXJjZVwiID09PSBzLmtpbmQgfHwgYykge1xuICAgICAgICAgICAgICB2YXIgaCA9IExhKGksIHUsIFwic291cmNlXCIpO1xuICAgICAgICAgICAgICB0aGlzLmJpbmRlcnNbaV0gPSBjID8gbmV3IFRhKHMsIHUsIGwsIGUsIGgsIHQuaWQpIDogbmV3IE1hKHMsIG8sIHUsIGgpLCBuLnB1c2goXCIvYV9cIiArIGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGYgPSBMYShpLCB1LCBcImNvbXBvc2l0ZVwiKTtcbiAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW2ldID0gbmV3IEJhKHMsIG8sIHUsIGwsIGUsIGYpLCBuLnB1c2goXCIvel9cIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlS2V5ID0gbi5zb3J0KCkuam9pbihcIlwiKTtcbiAgICB9O1xuXG4gICAgVmEucHJvdG90eXBlLmdldE1heFZhbHVlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5iaW5kZXJzW3RdO1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBNYSB8fCBlIGluc3RhbmNlb2YgQmEgPyBlLm1heFZhbHVlIDogMDtcbiAgICB9LCBWYS5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5cyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICBmb3IgKHZhciBhIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgbyA9IHRoaXMuYmluZGVyc1thXTtcbiAgICAgICAgKG8gaW5zdGFuY2VvZiBNYSB8fCBvIGluc3RhbmNlb2YgQmEgfHwgbyBpbnN0YW5jZW9mIFRhKSAmJiBvLnBvcHVsYXRlUGFpbnRBcnJheSh0LCBlLCByLCBuLCBpKTtcbiAgICAgIH1cbiAgICB9LCBWYS5wcm90b3R5cGUuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5iaW5kZXJzW3JdO1xuICAgICAgICBuIGluc3RhbmNlb2YgUGEgJiYgbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnModCwgZSk7XG4gICAgICB9XG4gICAgfSwgVmEucHJvdG90eXBlLnVwZGF0ZVBhaW50QXJyYXlzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gITE7XG5cbiAgICAgIGZvciAodmFyIG8gaW4gdCkge1xuICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IGUuZ2V0UG9zaXRpb25zKG8pOyBzIDwgdS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgIHZhciBsID0gdVtzXSxcbiAgICAgICAgICAgICAgcCA9IHIuZmVhdHVyZShsLmluZGV4KTtcblxuICAgICAgICAgIGZvciAodmFyIGMgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICB2YXIgaCA9IHRoaXMuYmluZGVyc1tjXTtcblxuICAgICAgICAgICAgaWYgKChoIGluc3RhbmNlb2YgTWEgfHwgaCBpbnN0YW5jZW9mIEJhIHx8IGggaW5zdGFuY2VvZiBUYSkgJiYgITAgPT09IGguZXhwcmVzc2lvbi5pc1N0YXRlRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgIHZhciBmID0gbi5wYWludC5nZXQoYyk7XG4gICAgICAgICAgICAgIGguZXhwcmVzc2lvbiA9IGYudmFsdWUsIGgudXBkYXRlUGFpbnRBcnJheShsLnN0YXJ0LCBsLmVuZCwgcCwgdFtvXSwgaSksIGEgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgVmEucHJvdG90eXBlLmRlZmluZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYmluZGVyc1tlXTtcbiAgICAgICAgKHIgaW5zdGFuY2VvZiBFYSB8fCByIGluc3RhbmNlb2YgUGEpICYmIHQucHVzaC5hcHBseSh0LCByLnVuaWZvcm1OYW1lcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCIjZGVmaW5lIEhBU19VTklGT1JNX1wiICsgdDtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBWYS5wcm90b3R5cGUuZ2V0QmluZGVyQXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5iaW5kZXJzW2VdO1xuICAgICAgICBpZiAociBpbnN0YW5jZW9mIE1hIHx8IHIgaW5zdGFuY2VvZiBCYSkgZm9yICh2YXIgbiA9IDA7IG4gPCByLnBhaW50VmVydGV4QXR0cmlidXRlcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIHQucHVzaChyLnBhaW50VmVydGV4QXR0cmlidXRlc1tuXS5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgVGEpIGZvciAodmFyIGkgPSAwOyBpIDwgcGEubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHQucHVzaChwYS5tZW1iZXJzW2ldLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIFZhLnByb3RvdHlwZS5nZXRCaW5kZXJVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5iaW5kZXJzW2VdO1xuICAgICAgICBpZiAociBpbnN0YW5jZW9mIEVhIHx8IHIgaW5zdGFuY2VvZiBQYSB8fCByIGluc3RhbmNlb2YgQmEpIGZvciAodmFyIG4gPSAwLCBpID0gci51bmlmb3JtTmFtZXM7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgdC5wdXNoKGlbbl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIFZhLnByb3RvdHlwZS5nZXRQYWludFZlcnRleEJ1ZmZlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnVmZmVycztcbiAgICB9LCBWYS5wcm90b3R5cGUuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSBbXTtcblxuICAgICAgZm9yICh2YXIgbiBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmJpbmRlcnNbbl07XG4gICAgICAgIGlmIChpIGluc3RhbmNlb2YgRWEgfHwgaSBpbnN0YW5jZW9mIFBhIHx8IGkgaW5zdGFuY2VvZiBCYSkgZm9yICh2YXIgYSA9IDAsIG8gPSBpLnVuaWZvcm1OYW1lczsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICB2YXIgcyA9IG9bYV07XG5cbiAgICAgICAgICBpZiAoZVtzXSkge1xuICAgICAgICAgICAgdmFyIHUgPSBpLmdldEJpbmRpbmcodCwgZVtzXSwgcyk7XG4gICAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBzLFxuICAgICAgICAgICAgICBwcm9wZXJ0eTogbixcbiAgICAgICAgICAgICAgYmluZGluZzogdVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIFZhLnByb3RvdHlwZS5zZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgYSA9IGU7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXSxcbiAgICAgICAgICAgIHMgPSBvLm5hbWUsXG4gICAgICAgICAgICB1ID0gby5wcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5iaW5kZXJzW3VdLnNldFVuaWZvcm0oby5iaW5kaW5nLCBuLCByLmdldCh1KSwgcyk7XG4gICAgICB9XG4gICAgfSwgVmEucHJvdG90eXBlLnVwZGF0ZVBhaW50QnVmZmVycyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuX2J1ZmZlcnMgPSBbXSwgdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5iaW5kZXJzW2VdO1xuXG4gICAgICAgIGlmICh0ICYmIHIgaW5zdGFuY2VvZiBUYSkge1xuICAgICAgICAgIHZhciBuID0gMiA9PT0gdC5mcm9tU2NhbGUgPyByLnpvb21JblBhaW50VmVydGV4QnVmZmVyIDogci56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgbiAmJiB0aGlzLl9idWZmZXJzLnB1c2gobik7XG4gICAgICAgIH0gZWxzZSAociBpbnN0YW5jZW9mIE1hIHx8IHIgaW5zdGFuY2VvZiBCYSkgJiYgci5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLl9idWZmZXJzLnB1c2goci5wYWludFZlcnRleEJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSwgVmEucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuYmluZGVycykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYmluZGVyc1tlXTtcbiAgICAgICAgKHIgaW5zdGFuY2VvZiBNYSB8fCByIGluc3RhbmNlb2YgQmEgfHwgciBpbnN0YW5jZW9mIFRhKSAmJiByLnVwbG9hZCh0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVQYWludEJ1ZmZlcnMoKTtcbiAgICB9LCBWYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5iaW5kZXJzW3RdO1xuICAgICAgICAoZSBpbnN0YW5jZW9mIE1hIHx8IGUgaW5zdGFuY2VvZiBCYSB8fCBlIGluc3RhbmNlb2YgVGEpICYmIGUuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgRmEgPSBmdW5jdGlvbiBGYSh0LCBlLCByKSB7XG4gICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSBmdW5jdGlvbiByKCkge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9KSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSB7fTtcblxuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSB0OyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2EuaWRdID0gbmV3IFZhKGEsIGUsIHIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBsb2FkID0gITEsIHRoaXMuX2ZlYXR1cmVNYXAgPSBuZXcgZGEoKSwgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gRGEodCwgZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgXCJ0ZXh0LW9wYWNpdHlcIjogW1wib3BhY2l0eVwiXSxcbiAgICAgICAgXCJpY29uLW9wYWNpdHlcIjogW1wib3BhY2l0eVwiXSxcbiAgICAgICAgXCJ0ZXh0LWNvbG9yXCI6IFtcImZpbGxfY29sb3JcIl0sXG4gICAgICAgIFwiaWNvbi1jb2xvclwiOiBbXCJmaWxsX2NvbG9yXCJdLFxuICAgICAgICBcInRleHQtaGFsby1jb2xvclwiOiBbXCJoYWxvX2NvbG9yXCJdLFxuICAgICAgICBcImljb24taGFsby1jb2xvclwiOiBbXCJoYWxvX2NvbG9yXCJdLFxuICAgICAgICBcInRleHQtaGFsby1ibHVyXCI6IFtcImhhbG9fYmx1clwiXSxcbiAgICAgICAgXCJpY29uLWhhbG8tYmx1clwiOiBbXCJoYWxvX2JsdXJcIl0sXG4gICAgICAgIFwidGV4dC1oYWxvLXdpZHRoXCI6IFtcImhhbG9fd2lkdGhcIl0sXG4gICAgICAgIFwiaWNvbi1oYWxvLXdpZHRoXCI6IFtcImhhbG9fd2lkdGhcIl0sXG4gICAgICAgIFwibGluZS1nYXAtd2lkdGhcIjogW1wiZ2Fwd2lkdGhcIl0sXG4gICAgICAgIFwibGluZS1wYXR0ZXJuXCI6IFtcInBhdHRlcm5fdG9cIiwgXCJwYXR0ZXJuX2Zyb21cIiwgXCJwaXhlbF9yYXRpb190b1wiLCBcInBpeGVsX3JhdGlvX2Zyb21cIl0sXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCI6IFtcInBhdHRlcm5fdG9cIiwgXCJwYXR0ZXJuX2Zyb21cIiwgXCJwaXhlbF9yYXRpb190b1wiLCBcInBpeGVsX3JhdGlvX2Zyb21cIl0sXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOiBbXCJwYXR0ZXJuX3RvXCIsIFwicGF0dGVybl9mcm9tXCIsIFwicGl4ZWxfcmF0aW9fdG9cIiwgXCJwaXhlbF9yYXRpb19mcm9tXCJdXG4gICAgICB9W3RdIHx8IFt0LnJlcGxhY2UoZSArIFwiLVwiLCBcIlwiKS5yZXBsYWNlKC8tL2csIFwiX1wiKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTGEodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB7XG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgc291cmNlOiBUaSxcbiAgICAgICAgICBjb21wb3NpdGU6IFlpXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlcjoge1xuICAgICAgICAgIHNvdXJjZTogR2ksXG4gICAgICAgICAgY29tcG9zaXRlOiBUaVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgICAgIGkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFwibGluZS1wYXR0ZXJuXCI6IHtcbiAgICAgICAgICAgIHNvdXJjZTogVmksXG4gICAgICAgICAgICBjb21wb3NpdGU6IFZpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImZpbGwtcGF0dGVyblwiOiB7XG4gICAgICAgICAgICBzb3VyY2U6IFZpLFxuICAgICAgICAgICAgY29tcG9zaXRlOiBWaVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IHtcbiAgICAgICAgICAgIHNvdXJjZTogVmksXG4gICAgICAgICAgICBjb21wb3NpdGU6IFZpXG4gICAgICAgICAgfVxuICAgICAgICB9W3RdO1xuICAgICAgfSh0KTtcblxuICAgICAgcmV0dXJuIGkgJiYgaVtyXSB8fCBuW2VdW3JdO1xuICAgIH1cblxuICAgIEZhLnByb3RvdHlwZS5wb3B1bGF0ZVBhaW50QXJyYXlzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIGZvciAodmFyIG8gaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbb10ucG9wdWxhdGVQYWludEFycmF5cyh0LCBlLCBuLCBpLCBhKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCAwICE9PSBlLmlkICYmIHRoaXMuX2ZlYXR1cmVNYXAuYWRkKGUuaWQsIHIsIHRoaXMuX2J1ZmZlck9mZnNldCwgdCksIHRoaXMuX2J1ZmZlck9mZnNldCA9IHQsIHRoaXMubmVlZHNVcGxvYWQgPSAhMDtcbiAgICB9LCBGYS5wcm90b3R5cGUudXBkYXRlUGFpbnRBcnJheXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSByOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgbyA9IGFbaV07XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tvLmlkXS51cGRhdGVQYWludEFycmF5cyh0LCB0aGlzLl9mZWF0dXJlTWFwLCBlLCBvLCBuKSB8fCB0aGlzLm5lZWRzVXBsb2FkO1xuICAgICAgfVxuICAgIH0sIEZhLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW3RdO1xuICAgIH0sIEZhLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHRoaXMubmVlZHNVcGxvYWQpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2VdLnVwbG9hZCh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSAhMTtcbiAgICAgIH1cbiAgICB9LCBGYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbdF0uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sIE9uKFwiQ29uc3RhbnRCaW5kZXJcIiwgRWEpLCBPbihcIkNyb3NzRmFkZWRDb25zdGFudEJpbmRlclwiLCBQYSksIE9uKFwiU291cmNlRXhwcmVzc2lvbkJpbmRlclwiLCBNYSksIE9uKFwiQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlclwiLCBUYSksIE9uKFwiQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlclwiLCBCYSksIE9uKFwiUHJvZ3JhbUNvbmZpZ3VyYXRpb25cIiwgVmEsIHtcbiAgICAgIG9taXQ6IFtcIl9idWZmZXJzXCJdXG4gICAgfSksIE9uKFwiUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXRcIiwgRmEpO1xuICAgIHZhciBSYSA9IE1hdGgucG93KDIsIDE0KSAtIDEsXG4gICAgICAgIE9hID0gLVJhIC0gMTtcblxuICAgIGZ1bmN0aW9uIFVhKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSA4MTkyIC8gdC5leHRlbnQsIHIgPSB0LmxvYWRHZW9tZXRyeSgpLCBuID0gMDsgbiA8IHIubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHJbbl0sIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICAgIHZhciBvID0gaVthXSxcbiAgICAgICAgICAgICAgcyA9IE1hdGgucm91bmQoby54ICogZSksXG4gICAgICAgICAgICAgIHUgPSBNYXRoLnJvdW5kKG8ueSAqIGUpO1xuICAgICAgICAgIG8ueCA9IHAocywgT2EsIFJhKSwgby55ID0gcCh1LCBPYSwgUmEpLCAocyA8IG8ueCB8fCBzID4gby54ICsgMSB8fCB1IDwgby55IHx8IHUgPiBvLnkgKyAxKSAmJiBBKFwiR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gamEodCwgZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdC50eXBlLFxuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgcHJvcGVydGllczogdC5wcm9wZXJ0aWVzLFxuICAgICAgICBnZW9tZXRyeTogZSA/IFVhKHQpIDogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcWEodCwgZSwgciwgbiwgaSkge1xuICAgICAgdC5lbXBsYWNlQmFjaygyICogZSArIChuICsgMSkgLyAyLCAyICogciArIChpICsgMSkgLyAyKTtcbiAgICB9XG5cbiAgICB2YXIgTmEgPSBmdW5jdGlvbiBOYSh0KSB7XG4gICAgICB0aGlzLnpvb20gPSB0Lnpvb20sIHRoaXMub3ZlcnNjYWxpbmcgPSB0Lm92ZXJzY2FsaW5nLCB0aGlzLmxheWVycyA9IHQubGF5ZXJzLCB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSksIHRoaXMuaW5kZXggPSB0LmluZGV4LCB0aGlzLmhhc1BhdHRlcm4gPSAhMSwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBFaSgpLCB0aGlzLmluZGV4QXJyYXkgPSBuZXcgcWkoKSwgdGhpcy5zZWdtZW50cyA9IG5ldyB1YSgpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBGYSh0LmxheWVycywgdC56b29tKSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlzU3RhdGVEZXBlbmRlbnQoKTtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBLYSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgaWYgKFFhKGUsIHRbcl0pKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICBpZiAoUWEodCwgZVtuXSkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEhSmEodCwgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR2EodCwgZSwgcikge1xuICAgICAgcmV0dXJuICEhUWEodCwgZSkgfHwgISFZYShlLCB0LCByKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBaYSh0LCBlKSB7XG4gICAgICBpZiAoMSA9PT0gdC5sZW5ndGgpIHJldHVybiBXYShlLCB0WzBdKTtcblxuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSBlW3JdLCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoUWEodCwgbltpXSkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHQubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgaWYgKFdhKGUsIHRbYV0pKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykge1xuICAgICAgICBpZiAoSmEodCwgZVtvXSkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFhhKHQsIGUsIHIpIHtcbiAgICAgIGlmICh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKEphKHQsIGUpKSByZXR1cm4gITA7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgaWYgKFlhKGVbbl0sIHQsIHIpKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChZYSh0W2ldLCBlLCByKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSmEodCwgZSkge1xuICAgICAgaWYgKDAgPT09IHQubGVuZ3RoIHx8IDAgPT09IGUubGVuZ3RoKSByZXR1cm4gITE7XG5cbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGggLSAxOyByKyspIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IHRbcl0sIGkgPSB0W3IgKyAxXSwgYSA9IDA7IGEgPCBlLmxlbmd0aCAtIDE7IGErKykge1xuICAgICAgICAgIGlmIChIYShuLCBpLCBlW2FdLCBlW2EgKyAxXSkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSGEodCwgZSwgciwgbikge1xuICAgICAgcmV0dXJuIFModCwgciwgbikgIT09IFMoZSwgciwgbikgJiYgUyh0LCBlLCByKSAhPT0gUyh0LCBlLCBuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBZYSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHIgKiByO1xuICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gdC5kaXN0U3FyKGVbMF0pIDwgbjtcblxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgkYSh0LCBlW2kgLSAxXSwgZVtpXSkgPCBuKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkYSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGUuZGlzdFNxcihyKTtcbiAgICAgIGlmICgwID09PSBuKSByZXR1cm4gdC5kaXN0U3FyKGUpO1xuICAgICAgdmFyIGkgPSAoKHQueCAtIGUueCkgKiAoci54IC0gZS54KSArICh0LnkgLSBlLnkpICogKHIueSAtIGUueSkpIC8gbjtcbiAgICAgIHJldHVybiB0LmRpc3RTcXIoaSA8IDAgPyBlIDogaSA+IDEgPyByIDogci5zdWIoZSkuX211bHQoaSkuX2FkZChlKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV2EodCwgZSkge1xuICAgICAgZm9yICh2YXIgciwgbiwgaSwgYSA9ICExLCBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAociA9IHRbb10pLmxlbmd0aCAtIDE7IHMgPCByLmxlbmd0aDsgdSA9IHMrKykge1xuICAgICAgICAgIChuID0gcltzXSkueSA+IGUueSAhPSAoaSA9IHJbdV0pLnkgPiBlLnkgJiYgZS54IDwgKGkueCAtIG4ueCkgKiAoZS55IC0gbi55KSAvIChpLnkgLSBuLnkpICsgbi54ICYmIChhID0gIWEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFFhKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAhMSwgbiA9IDAsIGkgPSB0Lmxlbmd0aCAtIDE7IG4gPCB0Lmxlbmd0aDsgaSA9IG4rKykge1xuICAgICAgICB2YXIgYSA9IHRbbl0sXG4gICAgICAgICAgICBvID0gdFtpXTtcbiAgICAgICAgYS55ID4gZS55ICE9IG8ueSA+IGUueSAmJiBlLnggPCAoby54IC0gYS54KSAqIChlLnkgLSBhLnkpIC8gKG8ueSAtIGEueSkgKyBhLnggJiYgKHIgPSAhcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gclswXSxcbiAgICAgICAgICBpID0gclsyXTtcbiAgICAgIGlmICh0LnggPCBuLnggJiYgZS54IDwgbi54IHx8IHQueCA+IGkueCAmJiBlLnggPiBpLnggfHwgdC55IDwgbi55ICYmIGUueSA8IG4ueSB8fCB0LnkgPiBpLnkgJiYgZS55ID4gaS55KSByZXR1cm4gITE7XG4gICAgICB2YXIgYSA9IFModCwgZSwgclswXSk7XG4gICAgICByZXR1cm4gYSAhPT0gUyh0LCBlLCByWzFdKSB8fCBhICE9PSBTKHQsIGUsIHJbMl0pIHx8IGEgIT09IFModCwgZSwgclszXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW8odCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlLnBhaW50LmdldCh0KS52YWx1ZTtcbiAgICAgIHJldHVybiBcImNvbnN0YW50XCIgPT09IG4ua2luZCA/IG4udmFsdWUgOiByLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoZS5pZCkuZ2V0TWF4VmFsdWUodCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm8odCkge1xuICAgICAgcmV0dXJuIE1hdGguc3FydCh0WzBdICogdFswXSArIHRbMV0gKiB0WzFdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBubyh0LCBlLCByLCBuLCBhKSB7XG4gICAgICBpZiAoIWVbMF0gJiYgIWVbMV0pIHJldHVybiB0O1xuXG4gICAgICB2YXIgbyA9IGkuY29udmVydChlKS5fbXVsdChhKTtcblxuICAgICAgXCJ2aWV3cG9ydFwiID09PSByICYmIG8uX3JvdGF0ZSgtbik7XG5cbiAgICAgIGZvciAodmFyIHMgPSBbXSwgdSA9IDA7IHUgPCB0Lmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIHMucHVzaCh0W3VdLnN1YihvKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIE5hLnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHRoaXMubGF5ZXJzWzBdLFxuICAgICAgICAgIGkgPSBbXSxcbiAgICAgICAgICBhID0gbnVsbCxcbiAgICAgICAgICBvID0gITE7XG4gICAgICBcImNpcmNsZVwiID09PSBuLnR5cGUgJiYgKG8gPSAhKGEgPSBuLmxheW91dC5nZXQoXCJjaXJjbGUtc29ydC1rZXlcIikpLmlzQ29uc3RhbnQoKSk7XG5cbiAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gdDsgcyA8IHUubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgdmFyIGwgPSB1W3NdLFxuICAgICAgICAgICAgcCA9IGwuZmVhdHVyZSxcbiAgICAgICAgICAgIGMgPSBsLmlkLFxuICAgICAgICAgICAgaCA9IGwuaW5kZXgsXG4gICAgICAgICAgICBmID0gbC5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeSxcbiAgICAgICAgICAgIGQgPSBqYShwLCB5KTtcblxuICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyB1aSh0aGlzLnpvb20pLCBkLCByKSkge1xuICAgICAgICAgIHZhciBtID0gbyA/IGEuZXZhbHVhdGUoZCwge30sIHIpIDogdm9pZCAwLFxuICAgICAgICAgICAgICB2ID0ge1xuICAgICAgICAgICAgaWQ6IGMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBwLnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBmLFxuICAgICAgICAgICAgaW5kZXg6IGgsXG4gICAgICAgICAgICBnZW9tZXRyeTogeSA/IGQuZ2VvbWV0cnkgOiBVYShwKSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7fSxcbiAgICAgICAgICAgIHNvcnRLZXk6IG1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGkucHVzaCh2KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvICYmIGkuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zb3J0S2V5IC0gZS5zb3J0S2V5O1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGcgPSAwLCB4ID0gaTsgZyA8IHgubGVuZ3RoOyBnICs9IDEpIHtcbiAgICAgICAgdmFyIGIgPSB4W2ddLFxuICAgICAgICAgICAgdyA9IGIuZ2VvbWV0cnksXG4gICAgICAgICAgICBfID0gYi5pbmRleCxcbiAgICAgICAgICAgIEEgPSBiLnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBTID0gdFtfXS5mZWF0dXJlO1xuICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYiwgdywgXywgciksIGUuZmVhdHVyZUluZGV4Lmluc2VydChTLCB3LCBfLCBBLCB0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICB9LCBOYS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoICYmIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsIGUsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIHIpO1xuICAgIH0sIE5hLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgIH0sIE5hLnByb3RvdHlwZS51cGxvYWRQZW5kaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH0sIE5hLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy51cGxvYWRlZCB8fCAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBzYSksIHRoaXMuaW5kZXhCdWZmZXIgPSB0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSkpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQodCksIHRoaXMudXBsb2FkZWQgPSAhMDtcbiAgICB9LCBOYS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyICYmICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCksIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpKTtcbiAgICB9LCBOYS5wcm90b3R5cGUuYWRkRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgYSA9IGU7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIG8gPSAwLCBzID0gYVtpXTsgbyA8IHMubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgdSA9IHNbb10sXG4gICAgICAgICAgICAgIGwgPSB1LngsXG4gICAgICAgICAgICAgIHAgPSB1Lnk7XG5cbiAgICAgICAgICBpZiAoIShsIDwgMCB8fCBsID49IDgxOTIgfHwgcCA8IDAgfHwgcCA+PSA4MTkyKSkge1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSwgdC5zb3J0S2V5KSxcbiAgICAgICAgICAgICAgICBoID0gYy52ZXJ0ZXhMZW5ndGg7XG4gICAgICAgICAgICBxYSh0aGlzLmxheW91dFZlcnRleEFycmF5LCBsLCBwLCAtMSwgLTEpLCBxYSh0aGlzLmxheW91dFZlcnRleEFycmF5LCBsLCBwLCAxLCAtMSksIHFhKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGwsIHAsIDEsIDEpLCBxYSh0aGlzLmxheW91dFZlcnRleEFycmF5LCBsLCBwLCAtMSwgMSksIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhoLCBoICsgMSwgaCArIDIpLCB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaCwgaCArIDMsIGggKyAyKSwgYy52ZXJ0ZXhMZW5ndGggKz0gNCwgYy5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgdCwgciwge30sIG4pO1xuICAgIH0sIE9uKFwiQ2lyY2xlQnVja2V0XCIsIE5hLCB7XG4gICAgICBvbWl0OiBbXCJsYXllcnNcIl1cbiAgICB9KTtcbiAgICB2YXIgaW8gPSBuZXcgX2koe1xuICAgICAgXCJjaXJjbGUtc29ydC1rZXlcIjogbmV3IGdpKFB0LmxheW91dF9jaXJjbGVbXCJjaXJjbGUtc29ydC1rZXlcIl0pXG4gICAgfSksXG4gICAgICAgIGFvID0ge1xuICAgICAgcGFpbnQ6IG5ldyBfaSh7XG4gICAgICAgIFwiY2lyY2xlLXJhZGl1c1wiOiBuZXcgZ2koUHQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXJhZGl1c1wiXSksXG4gICAgICAgIFwiY2lyY2xlLWNvbG9yXCI6IG5ldyBnaShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtY29sb3JcIl0pLFxuICAgICAgICBcImNpcmNsZS1ibHVyXCI6IG5ldyBnaShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtYmx1clwiXSksXG4gICAgICAgIFwiY2lyY2xlLW9wYWNpdHlcIjogbmV3IGdpKFB0LnBhaW50X2NpcmNsZVtcImNpcmNsZS1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IG5ldyB2aShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtdHJhbnNsYXRlXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgdmkoUHQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgICAgICBcImNpcmNsZS1waXRjaC1zY2FsZVwiOiBuZXcgdmkoUHQucGFpbnRfY2lyY2xlW1wiY2lyY2xlLXBpdGNoLXNjYWxlXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyB2aShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6IG5ldyBnaShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IG5ldyBnaShQdC5wYWludF9jaXJjbGVbXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCJdKSxcbiAgICAgICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogbmV3IGdpKFB0LnBhaW50X2NpcmNsZVtcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiXSlcbiAgICAgIH0pLFxuICAgICAgbGF5b3V0OiBpb1xuICAgIH0sXG4gICAgICAgIG9vID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRmxvYXQzMkFycmF5ID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5cbiAgICBmdW5jdGlvbiBzbyh0KSB7XG4gICAgICByZXR1cm4gdFswXSA9IDEsIHRbMV0gPSAwLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNF0gPSAwLCB0WzVdID0gMSwgdFs2XSA9IDAsIHRbN10gPSAwLCB0WzhdID0gMCwgdFs5XSA9IDAsIHRbMTBdID0gMSwgdFsxMV0gPSAwLCB0WzEyXSA9IDAsIHRbMTNdID0gMCwgdFsxNF0gPSAwLCB0WzE1XSA9IDEsIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW8odCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlWzBdLFxuICAgICAgICAgIGkgPSBlWzFdLFxuICAgICAgICAgIGEgPSBlWzJdLFxuICAgICAgICAgIG8gPSBlWzNdLFxuICAgICAgICAgIHMgPSBlWzRdLFxuICAgICAgICAgIHUgPSBlWzVdLFxuICAgICAgICAgIGwgPSBlWzZdLFxuICAgICAgICAgIHAgPSBlWzddLFxuICAgICAgICAgIGMgPSBlWzhdLFxuICAgICAgICAgIGggPSBlWzldLFxuICAgICAgICAgIGYgPSBlWzEwXSxcbiAgICAgICAgICB5ID0gZVsxMV0sXG4gICAgICAgICAgZCA9IGVbMTJdLFxuICAgICAgICAgIG0gPSBlWzEzXSxcbiAgICAgICAgICB2ID0gZVsxNF0sXG4gICAgICAgICAgZyA9IGVbMTVdLFxuICAgICAgICAgIHggPSByWzBdLFxuICAgICAgICAgIGIgPSByWzFdLFxuICAgICAgICAgIHcgPSByWzJdLFxuICAgICAgICAgIF8gPSByWzNdO1xuICAgICAgcmV0dXJuIHRbMF0gPSB4ICogbiArIGIgKiBzICsgdyAqIGMgKyBfICogZCwgdFsxXSA9IHggKiBpICsgYiAqIHUgKyB3ICogaCArIF8gKiBtLCB0WzJdID0geCAqIGEgKyBiICogbCArIHcgKiBmICsgXyAqIHYsIHRbM10gPSB4ICogbyArIGIgKiBwICsgdyAqIHkgKyBfICogZywgdFs0XSA9ICh4ID0gcls0XSkgKiBuICsgKGIgPSByWzVdKSAqIHMgKyAodyA9IHJbNl0pICogYyArIChfID0gcls3XSkgKiBkLCB0WzVdID0geCAqIGkgKyBiICogdSArIHcgKiBoICsgXyAqIG0sIHRbNl0gPSB4ICogYSArIGIgKiBsICsgdyAqIGYgKyBfICogdiwgdFs3XSA9IHggKiBvICsgYiAqIHAgKyB3ICogeSArIF8gKiBnLCB0WzhdID0gKHggPSByWzhdKSAqIG4gKyAoYiA9IHJbOV0pICogcyArICh3ID0gclsxMF0pICogYyArIChfID0gclsxMV0pICogZCwgdFs5XSA9IHggKiBpICsgYiAqIHUgKyB3ICogaCArIF8gKiBtLCB0WzEwXSA9IHggKiBhICsgYiAqIGwgKyB3ICogZiArIF8gKiB2LCB0WzExXSA9IHggKiBvICsgYiAqIHAgKyB3ICogeSArIF8gKiBnLCB0WzEyXSA9ICh4ID0gclsxMl0pICogbiArIChiID0gclsxM10pICogcyArICh3ID0gclsxNF0pICogYyArIChfID0gclsxNV0pICogZCwgdFsxM10gPSB4ICogaSArIGIgKiB1ICsgdyAqIGggKyBfICogbSwgdFsxNF0gPSB4ICogYSArIGIgKiBsICsgdyAqIGYgKyBfICogdiwgdFsxNV0gPSB4ICogbyArIGIgKiBwICsgdyAqIHkgKyBfICogZywgdDtcbiAgICB9XG5cbiAgICBNYXRoLmh5cG90IHx8IChNYXRoLmh5cG90ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCA9IGFyZ3VtZW50cywgZSA9IDAsIHIgPSBhcmd1bWVudHMubGVuZ3RoOyByLS07KSB7XG4gICAgICAgIGUgKz0gdFtyXSAqIHRbcl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBNYXRoLnNxcnQoZSk7XG4gICAgfSk7XG4gICAgdmFyIGxvLFxuICAgICAgICBwbyA9IHVvO1xuXG4gICAgZnVuY3Rpb24gY28odCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlWzBdLFxuICAgICAgICAgIGkgPSBlWzFdLFxuICAgICAgICAgIGEgPSBlWzJdLFxuICAgICAgICAgIG8gPSBlWzNdO1xuICAgICAgcmV0dXJuIHRbMF0gPSByWzBdICogbiArIHJbNF0gKiBpICsgcls4XSAqIGEgKyByWzEyXSAqIG8sIHRbMV0gPSByWzFdICogbiArIHJbNV0gKiBpICsgcls5XSAqIGEgKyByWzEzXSAqIG8sIHRbMl0gPSByWzJdICogbiArIHJbNl0gKiBpICsgclsxMF0gKiBhICsgclsxNF0gKiBvLCB0WzNdID0gclszXSAqIG4gKyByWzddICogaSArIHJbMTFdICogYSArIHJbMTVdICogbywgdDtcbiAgICB9XG5cbiAgICBsbyA9IG5ldyBvbygzKSwgb28gIT0gRmxvYXQzMkFycmF5ICYmIChsb1swXSA9IDAsIGxvWzFdID0gMCwgbG9bMl0gPSAwKSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBuZXcgb28oNCk7XG4gICAgICBvbyAhPSBGbG9hdDMyQXJyYXkgJiYgKHRbMF0gPSAwLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwKTtcbiAgICB9KCk7XG4gICAgdmFyIGhvID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gbmV3IG9vKDIpO1xuICAgICAgb28gIT0gRmxvYXQzMkFycmF5ICYmICh0WzBdID0gMCwgdFsxXSA9IDApO1xuICAgIH0oKSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgYW8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IE5hKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQ7XG4gICAgICAgIHJldHVybiBlbyhcImNpcmNsZS1yYWRpdXNcIiwgdGhpcywgZSkgKyBlbyhcImNpcmNsZS1zdHJva2Utd2lkdGhcIiwgdGhpcywgZSkgKyBybyh0aGlzLnBhaW50LmdldChcImNpcmNsZS10cmFuc2xhdGVcIikpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlJbnRlcnNlY3RzRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICAgIGZvciAodmFyIHUgPSBubyh0LCB0aGlzLnBhaW50LmdldChcImNpcmNsZS10cmFuc2xhdGVcIiksIHRoaXMucGFpbnQuZ2V0KFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIiksIGEuYW5nbGUsIG8pLCBsID0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcmFkaXVzXCIpLmV2YWx1YXRlKGUsIHIpICsgdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCIpLmV2YWx1YXRlKGUsIHIpLCBwID0gXCJtYXBcIiA9PT0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCIpLCBjID0gcCA/IHUgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiB0Lm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvKHQsIGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KHUsIHMpLCBoID0gcCA/IGwgKiBvIDogbCwgZiA9IDAsIHkgPSBuOyBmIDwgeS5sZW5ndGg7IGYgKz0gMSkge1xuICAgICAgICAgIGZvciAodmFyIGQgPSAwLCBtID0geVtmXTsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB2ID0gbVtkXSxcbiAgICAgICAgICAgICAgICBnID0gcCA/IHYgOiBmbyh2LCBzKSxcbiAgICAgICAgICAgICAgICB4ID0gaCxcbiAgICAgICAgICAgICAgICBiID0gY28oW10sIFt2LngsIHYueSwgMCwgMV0sIHMpO1xuICAgICAgICAgICAgaWYgKFwidmlld3BvcnRcIiA9PT0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIikgJiYgXCJtYXBcIiA9PT0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCIpID8geCAqPSBiWzNdIC8gYS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIDogXCJtYXBcIiA9PT0gdGhpcy5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIikgJiYgXCJ2aWV3cG9ydFwiID09PSB0aGlzLnBhaW50LmdldChcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIikgJiYgKHggKj0gYS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gYlszXSksIEdhKGMsIGcsIHgpKSByZXR1cm4gITA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZTtcbiAgICB9KEFpKSk7XG5cbiAgICBmdW5jdGlvbiBmbyh0LCBlKSB7XG4gICAgICB2YXIgciA9IGNvKFtdLCBbdC54LCB0LnksIDAsIDFdLCBlKTtcbiAgICAgIHJldHVybiBuZXcgaShyWzBdIC8gclszXSwgclsxXSAvIHJbM10pO1xuICAgIH1cblxuICAgIHZhciB5byA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGU7XG4gICAgfShOYSk7XG5cbiAgICBmdW5jdGlvbiBtbyh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IGUud2lkdGgsXG4gICAgICAgICAgYSA9IGUuaGVpZ2h0O1xuXG4gICAgICBpZiAobikge1xuICAgICAgICBpZiAobiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSBuID0gbmV3IFVpbnQ4QXJyYXkobi5idWZmZXIpO2Vsc2UgaWYgKG4ubGVuZ3RoICE9PSBpICogYSAqIHIpIHRocm93IG5ldyBSYW5nZUVycm9yKFwibWlzbWF0Y2hlZCBpbWFnZSBzaXplXCIpO1xuICAgICAgfSBlbHNlIG4gPSBuZXcgVWludDhBcnJheShpICogYSAqIHIpO1xuXG4gICAgICByZXR1cm4gdC53aWR0aCA9IGksIHQuaGVpZ2h0ID0gYSwgdC5kYXRhID0gbiwgdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2byh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGUud2lkdGgsXG4gICAgICAgICAgaSA9IGUuaGVpZ2h0O1xuXG4gICAgICBpZiAobiAhPT0gdC53aWR0aCB8fCBpICE9PSB0LmhlaWdodCkge1xuICAgICAgICB2YXIgYSA9IG1vKHt9LCB7XG4gICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgIH0sIHIpO1xuICAgICAgICBnbyh0LCBhLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1pbih0LndpZHRoLCBuKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWluKHQuaGVpZ2h0LCBpKVxuICAgICAgICB9LCByKSwgdC53aWR0aCA9IG4sIHQuaGVpZ2h0ID0gaSwgdC5kYXRhID0gYS5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdvKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIGlmICgwID09PSBpLndpZHRoIHx8IDAgPT09IGkuaGVpZ2h0KSByZXR1cm4gZTtcbiAgICAgIGlmIChpLndpZHRoID4gdC53aWR0aCB8fCBpLmhlaWdodCA+IHQuaGVpZ2h0IHx8IHIueCA+IHQud2lkdGggLSBpLndpZHRoIHx8IHIueSA+IHQuaGVpZ2h0IC0gaS5oZWlnaHQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwib3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weVwiKTtcbiAgICAgIGlmIChpLndpZHRoID4gZS53aWR0aCB8fCBpLmhlaWdodCA+IGUuaGVpZ2h0IHx8IG4ueCA+IGUud2lkdGggLSBpLndpZHRoIHx8IG4ueSA+IGUuaGVpZ2h0IC0gaS5oZWlnaHQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwib3V0IG9mIHJhbmdlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5XCIpO1xuXG4gICAgICBmb3IgKHZhciBvID0gdC5kYXRhLCBzID0gZS5kYXRhLCB1ID0gMDsgdSA8IGkuaGVpZ2h0OyB1KyspIHtcbiAgICAgICAgZm9yICh2YXIgbCA9ICgoci55ICsgdSkgKiB0LndpZHRoICsgci54KSAqIGEsIHAgPSAoKG4ueSArIHUpICogZS53aWR0aCArIG4ueCkgKiBhLCBjID0gMDsgYyA8IGkud2lkdGggKiBhOyBjKyspIHtcbiAgICAgICAgICBzW3AgKyBjXSA9IG9bbCArIGNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIE9uKFwiSGVhdG1hcEJ1Y2tldFwiLCB5bywge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCJdXG4gICAgfSk7XG5cbiAgICB2YXIgeG8gPSBmdW5jdGlvbiB4byh0LCBlKSB7XG4gICAgICBtbyh0aGlzLCB0LCAxLCBlKTtcbiAgICB9O1xuXG4gICAgeG8ucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2byh0aGlzLCB0LCAxKTtcbiAgICB9LCB4by5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IHhvKHtcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgICAgIH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH0sIHhvLmNvcHkgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgZ28odCwgZSwgciwgbiwgaSwgMSk7XG4gICAgfTtcblxuICAgIHZhciBibyA9IGZ1bmN0aW9uIGJvKHQsIGUpIHtcbiAgICAgIG1vKHRoaXMsIHQsIDQsIGUpO1xuICAgIH07XG5cbiAgICBiby5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZvKHRoaXMsIHQsIDQpO1xuICAgIH0sIGJvLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGUgPyB0aGlzLmRhdGEuc2V0KHQpIDogdGhpcy5kYXRhID0gdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID8gbmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpIDogdDtcbiAgICB9LCBiby5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IGJvKHtcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgICAgIH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH0sIGJvLmNvcHkgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgZ28odCwgZSwgciwgbiwgaSwgNCk7XG4gICAgfSwgT24oXCJBbHBoYUltYWdlXCIsIHhvKSwgT24oXCJSR0JBSW1hZ2VcIiwgYm8pO1xuICAgIHZhciB3byA9IHtcbiAgICAgIHBhaW50OiBuZXcgX2koe1xuICAgICAgICBcImhlYXRtYXAtcmFkaXVzXCI6IG5ldyBnaShQdC5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1yYWRpdXNcIl0pLFxuICAgICAgICBcImhlYXRtYXAtd2VpZ2h0XCI6IG5ldyBnaShQdC5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC13ZWlnaHRcIl0pLFxuICAgICAgICBcImhlYXRtYXAtaW50ZW5zaXR5XCI6IG5ldyB2aShQdC5wYWludF9oZWF0bWFwW1wiaGVhdG1hcC1pbnRlbnNpdHlcIl0pLFxuICAgICAgICBcImhlYXRtYXAtY29sb3JcIjogbmV3IHdpKFB0LnBhaW50X2hlYXRtYXBbXCJoZWF0bWFwLWNvbG9yXCJdKSxcbiAgICAgICAgXCJoZWF0bWFwLW9wYWNpdHlcIjogbmV3IHZpKFB0LnBhaW50X2hlYXRtYXBbXCJoZWF0bWFwLW9wYWNpdHlcIl0pXG4gICAgICB9KVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBfbyh0KSB7XG4gICAgICB2YXIgZSA9IHt9LFxuICAgICAgICAgIHIgPSB0LnJlc29sdXRpb24gfHwgMjU2LFxuICAgICAgICAgIG4gPSB0LmNsaXBzID8gdC5jbGlwcy5sZW5ndGggOiAxLFxuICAgICAgICAgIGkgPSB0LmltYWdlIHx8IG5ldyBibyh7XG4gICAgICAgIHdpZHRoOiByLFxuICAgICAgICBoZWlnaHQ6IG5cbiAgICAgIH0pLFxuICAgICAgICAgIGEgPSBmdW5jdGlvbiBhKHIsIG4sIF9hMikge1xuICAgICAgICBlW3QuZXZhbHVhdGlvbktleV0gPSBfYTI7XG4gICAgICAgIHZhciBvID0gdC5leHByZXNzaW9uLmV2YWx1YXRlKGUpO1xuICAgICAgICBpLmRhdGFbciArIG4gKyAwXSA9IE1hdGguZmxvb3IoMjU1ICogby5yIC8gby5hKSwgaS5kYXRhW3IgKyBuICsgMV0gPSBNYXRoLmZsb29yKDI1NSAqIG8uZyAvIG8uYSksIGkuZGF0YVtyICsgbiArIDJdID0gTWF0aC5mbG9vcigyNTUgKiBvLmIgLyBvLmEpLCBpLmRhdGFbciArIG4gKyAzXSA9IE1hdGguZmxvb3IoMjU1ICogby5hKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0LmNsaXBzKSBmb3IgKHZhciBvID0gMCwgcyA9IDA7IG8gPCBuOyArK28sIHMgKz0gNCAqIHIpIHtcbiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGwgPSAwOyB1IDwgcjsgdSsrLCBsICs9IDQpIHtcbiAgICAgICAgICB2YXIgcCA9IHUgLyAociAtIDEpLFxuICAgICAgICAgICAgICBjID0gdC5jbGlwc1tvXTtcbiAgICAgICAgICBhKHMsIGwsIGMuc3RhcnQgKiAoMSAtIHApICsgYy5lbmQgKiBwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGZvciAodmFyIGggPSAwLCBmID0gMDsgaCA8IHI7IGgrKywgZiArPSA0KSB7XG4gICAgICAgIGEoMCwgZiwgaCAvIChyIC0gMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgdmFyIEFvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgd28pLCB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuY3JlYXRlQnVja2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB5byh0KTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIFwiaGVhdG1hcC1jb2xvclwiID09PSB0ICYmIHRoaXMuX3VwZGF0ZUNvbG9yUmFtcCgpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX3VwZGF0ZUNvbG9yUmFtcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSBfbyh7XG4gICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW1wiaGVhdG1hcC1jb2xvclwiXS52YWx1ZS5leHByZXNzaW9uLFxuICAgICAgICAgIGV2YWx1YXRpb25LZXk6IFwiaGVhdG1hcERlbnNpdHlcIixcbiAgICAgICAgICBpbWFnZTogdGhpcy5jb2xvclJhbXBcbiAgICAgICAgfSksIHRoaXMuY29sb3JSYW1wVGV4dHVyZSA9IG51bGw7XG4gICAgICB9LCBlLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGVhdG1hcEZibyAmJiAodGhpcy5oZWF0bWFwRmJvLmRlc3Ryb3koKSwgdGhpcy5oZWF0bWFwRmJvID0gbnVsbCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeVJhZGl1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeUludGVyc2VjdHNGZWF0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5oYXNPZmZzY3JlZW5QYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy5wYWludC5nZXQoXCJoZWF0bWFwLW9wYWNpdHlcIikgJiYgXCJub25lXCIgIT09IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgIH0sIGU7XG4gICAgfShBaSksXG4gICAgICAgIFNvID0ge1xuICAgICAgcGFpbnQ6IG5ldyBfaSh7XG4gICAgICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIjogbmV3IHZpKFB0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCJdKSxcbiAgICAgICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiBuZXcgdmkoUHQucGFpbnRfaGlsbHNoYWRlW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIl0pLFxuICAgICAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjogbmV3IHZpKFB0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIl0pLFxuICAgICAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjogbmV3IHZpKFB0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIl0pLFxuICAgICAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjogbmV3IHZpKFB0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIl0pLFxuICAgICAgICBcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIjogbmV3IHZpKFB0LnBhaW50X2hpbGxzaGFkZVtcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIl0pXG4gICAgICB9KVxuICAgIH0sXG4gICAgICAgIGtvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgU28pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5oYXNPZmZzY3JlZW5QYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy5wYWludC5nZXQoXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCIpICYmIFwibm9uZVwiICE9PSB0aGlzLnZpc2liaWxpdHk7XG4gICAgICB9LCBlO1xuICAgIH0oQWkpLFxuICAgICAgICBJbyA9IHppKFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpLm1lbWJlcnMsXG4gICAgICAgIHpvID0gRW8sXG4gICAgICAgIENvID0gRW87XG5cbiAgICBmdW5jdGlvbiBFbyh0LCBlLCByKSB7XG4gICAgICByID0gciB8fCAyO1xuICAgICAgdmFyIG4sXG4gICAgICAgICAgaSxcbiAgICAgICAgICBhLFxuICAgICAgICAgIG8sXG4gICAgICAgICAgcyxcbiAgICAgICAgICB1LFxuICAgICAgICAgIGwsXG4gICAgICAgICAgcCA9IGUgJiYgZS5sZW5ndGgsXG4gICAgICAgICAgYyA9IHAgPyBlWzBdICogciA6IHQubGVuZ3RoLFxuICAgICAgICAgIGggPSBQbyh0LCAwLCBjLCByLCAhMCksXG4gICAgICAgICAgZiA9IFtdO1xuICAgICAgaWYgKCFoIHx8IGgubmV4dCA9PT0gaC5wcmV2KSByZXR1cm4gZjtcblxuICAgICAgaWYgKHAgJiYgKGggPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGEsXG4gICAgICAgICAgICBvLFxuICAgICAgICAgICAgcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGEgPSBlLmxlbmd0aDsgaSA8IGE7IGkrKykge1xuICAgICAgICAgIChvID0gUG8odCwgZVtpXSAqIG4sIGkgPCBhIC0gMSA/IGVbaSArIDFdICogbiA6IHQubGVuZ3RoLCBuLCAhMSkpID09PSBvLm5leHQgJiYgKG8uc3RlaW5lciA9ICEwKSwgcy5wdXNoKGpvKG8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAocy5zb3J0KExvKSwgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgUm8oc1tpXSwgciksIHIgPSBNbyhyLCByLm5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KHQsIGUsIGgsIHIpKSwgdC5sZW5ndGggPiA4MCAqIHIpIHtcbiAgICAgICAgbiA9IGEgPSB0WzBdLCBpID0gbyA9IHRbMV07XG5cbiAgICAgICAgZm9yICh2YXIgeSA9IHI7IHkgPCBjOyB5ICs9IHIpIHtcbiAgICAgICAgICAocyA9IHRbeV0pIDwgbiAmJiAobiA9IHMpLCAodSA9IHRbeSArIDFdKSA8IGkgJiYgKGkgPSB1KSwgcyA+IGEgJiYgKGEgPSBzKSwgdSA+IG8gJiYgKG8gPSB1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGwgPSAwICE9PSAobCA9IE1hdGgubWF4KGEgLSBuLCBvIC0gaSkpID8gMSAvIGwgOiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQm8oaCwgZiwgciwgbiwgaSwgbCksIGY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUG8odCwgZSwgciwgbiwgaSkge1xuICAgICAgdmFyIGEsIG87XG4gICAgICBpZiAoaSA9PT0gdHModCwgZSwgciwgbikgPiAwKSBmb3IgKGEgPSBlOyBhIDwgcjsgYSArPSBuKSB7XG4gICAgICAgIG8gPSAkbyhhLCB0W2FdLCB0W2EgKyAxXSwgbyk7XG4gICAgICB9IGVsc2UgZm9yIChhID0gciAtIG47IGEgPj0gZTsgYSAtPSBuKSB7XG4gICAgICAgIG8gPSAkbyhhLCB0W2FdLCB0W2EgKyAxXSwgbyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbyAmJiBHbyhvLCBvLm5leHQpICYmIChXbyhvKSwgbyA9IG8ubmV4dCksIG87XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTW8odCwgZSkge1xuICAgICAgaWYgKCF0KSByZXR1cm4gdDtcbiAgICAgIGUgfHwgKGUgPSB0KTtcbiAgICAgIHZhciByLFxuICAgICAgICAgIG4gPSB0O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChyID0gITEsIG4uc3RlaW5lciB8fCAhR28obiwgbi5uZXh0KSAmJiAwICE9PSBLbyhuLnByZXYsIG4sIG4ubmV4dCkpIG4gPSBuLm5leHQ7ZWxzZSB7XG4gICAgICAgICAgaWYgKFdvKG4pLCAobiA9IGUgPSBuLnByZXYpID09PSBuLm5leHQpIGJyZWFrO1xuICAgICAgICAgIHIgPSAhMDtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAociB8fCBuICE9PSBlKTtcblxuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQm8odCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgIW8gJiYgYSAmJiBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIHZhciBpID0gdDtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIG51bGwgPT09IGkueiAmJiAoaS56ID0gVW8oaS54LCBpLnksIGUsIHIsIG4pKSwgaS5wcmV2WiA9IGkucHJldiwgaS5uZXh0WiA9IGkubmV4dCwgaSA9IGkubmV4dDtcbiAgICAgICAgICB9IHdoaWxlIChpICE9PSB0KTtcblxuICAgICAgICAgIGkucHJldloubmV4dFogPSBudWxsLCBpLnByZXZaID0gbnVsbCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgICAgIHIsXG4gICAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIHUsXG4gICAgICAgICAgICAgICAgbCA9IDE7XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgZm9yIChyID0gdCwgdCA9IG51bGwsIGEgPSBudWxsLCBvID0gMDsgcjspIHtcbiAgICAgICAgICAgICAgICBmb3IgKG8rKywgbiA9IHIsIHMgPSAwLCBlID0gMDsgZSA8IGwgJiYgKHMrKywgbiA9IG4ubmV4dFopOyBlKyspIHtcbiAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKHUgPSBsOyBzID4gMCB8fCB1ID4gMCAmJiBuOykge1xuICAgICAgICAgICAgICAgICAgMCAhPT0gcyAmJiAoMCA9PT0gdSB8fCAhbiB8fCByLnogPD0gbi56KSA/IChpID0gciwgciA9IHIubmV4dFosIHMtLSkgOiAoaSA9IG4sIG4gPSBuLm5leHRaLCB1LS0pLCBhID8gYS5uZXh0WiA9IGkgOiB0ID0gaSwgaS5wcmV2WiA9IGEsIGEgPSBpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHIgPSBuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYS5uZXh0WiA9IG51bGwsIGwgKj0gMjtcbiAgICAgICAgICAgIH0gd2hpbGUgKG8gPiAxKTtcbiAgICAgICAgICB9KGkpO1xuICAgICAgICB9KHQsIG4sIGksIGEpO1xuXG4gICAgICAgIGZvciAodmFyIHMsIHUsIGwgPSB0OyB0LnByZXYgIT09IHQubmV4dDspIHtcbiAgICAgICAgICBpZiAocyA9IHQucHJldiwgdSA9IHQubmV4dCwgYSA/IFZvKHQsIG4sIGksIGEpIDogVG8odCkpIGUucHVzaChzLmkgLyByKSwgZS5wdXNoKHQuaSAvIHIpLCBlLnB1c2godS5pIC8gciksIFdvKHQpLCB0ID0gdS5uZXh0LCBsID0gdS5uZXh0O2Vsc2UgaWYgKCh0ID0gdSkgPT09IGwpIHtcbiAgICAgICAgICAgIG8gPyAxID09PSBvID8gQm8odCA9IEZvKE1vKHQpLCBlLCByKSwgZSwgciwgbiwgaSwgYSwgMikgOiAyID09PSBvICYmIERvKHQsIGUsIHIsIG4sIGksIGEpIDogQm8oTW8odCksIGUsIHIsIG4sIGksIGEsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVG8odCkge1xuICAgICAgdmFyIGUgPSB0LnByZXYsXG4gICAgICAgICAgciA9IHQsXG4gICAgICAgICAgbiA9IHQubmV4dDtcbiAgICAgIGlmIChLbyhlLCByLCBuKSA+PSAwKSByZXR1cm4gITE7XG5cbiAgICAgIGZvciAodmFyIGkgPSB0Lm5leHQubmV4dDsgaSAhPT0gdC5wcmV2Oykge1xuICAgICAgICBpZiAocW8oZS54LCBlLnksIHIueCwgci55LCBuLngsIG4ueSwgaS54LCBpLnkpICYmIEtvKGkucHJldiwgaSwgaS5uZXh0KSA+PSAwKSByZXR1cm4gITE7XG4gICAgICAgIGkgPSBpLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBWbyh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IHQucHJldixcbiAgICAgICAgICBhID0gdCxcbiAgICAgICAgICBvID0gdC5uZXh0O1xuICAgICAgaWYgKEtvKGksIGEsIG8pID49IDApIHJldHVybiAhMTtcblxuICAgICAgZm9yICh2YXIgcyA9IGkueCA+IGEueCA/IGkueCA+IG8ueCA/IGkueCA6IG8ueCA6IGEueCA+IG8ueCA/IGEueCA6IG8ueCwgdSA9IGkueSA+IGEueSA/IGkueSA+IG8ueSA/IGkueSA6IG8ueSA6IGEueSA+IG8ueSA/IGEueSA6IG8ueSwgbCA9IFVvKGkueCA8IGEueCA/IGkueCA8IG8ueCA/IGkueCA6IG8ueCA6IGEueCA8IG8ueCA/IGEueCA6IG8ueCwgaS55IDwgYS55ID8gaS55IDwgby55ID8gaS55IDogby55IDogYS55IDwgby55ID8gYS55IDogby55LCBlLCByLCBuKSwgcCA9IFVvKHMsIHUsIGUsIHIsIG4pLCBjID0gdC5wcmV2WiwgaCA9IHQubmV4dFo7IGMgJiYgYy56ID49IGwgJiYgaCAmJiBoLnogPD0gcDspIHtcbiAgICAgICAgaWYgKGMgIT09IHQucHJldiAmJiBjICE9PSB0Lm5leHQgJiYgcW8oaS54LCBpLnksIGEueCwgYS55LCBvLngsIG8ueSwgYy54LCBjLnkpICYmIEtvKGMucHJldiwgYywgYy5uZXh0KSA+PSAwKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChjID0gYy5wcmV2WiwgaCAhPT0gdC5wcmV2ICYmIGggIT09IHQubmV4dCAmJiBxbyhpLngsIGkueSwgYS54LCBhLnksIG8ueCwgby55LCBoLngsIGgueSkgJiYgS28oaC5wcmV2LCBoLCBoLm5leHQpID49IDApIHJldHVybiAhMTtcbiAgICAgICAgaCA9IGgubmV4dFo7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBjICYmIGMueiA+PSBsOykge1xuICAgICAgICBpZiAoYyAhPT0gdC5wcmV2ICYmIGMgIT09IHQubmV4dCAmJiBxbyhpLngsIGkueSwgYS54LCBhLnksIG8ueCwgby55LCBjLngsIGMueSkgJiYgS28oYy5wcmV2LCBjLCBjLm5leHQpID49IDApIHJldHVybiAhMTtcbiAgICAgICAgYyA9IGMucHJldlo7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBoICYmIGgueiA8PSBwOykge1xuICAgICAgICBpZiAoaCAhPT0gdC5wcmV2ICYmIGggIT09IHQubmV4dCAmJiBxbyhpLngsIGkueSwgYS54LCBhLnksIG8ueCwgby55LCBoLngsIGgueSkgJiYgS28oaC5wcmV2LCBoLCBoLm5leHQpID49IDApIHJldHVybiAhMTtcbiAgICAgICAgaCA9IGgubmV4dFo7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGbyh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIGkgPSBuLnByZXYsXG4gICAgICAgICAgICBhID0gbi5uZXh0Lm5leHQ7XG4gICAgICAgICFHbyhpLCBhKSAmJiBabyhpLCBuLCBuLm5leHQsIGEpICYmIEhvKGksIGEpICYmIEhvKGEsIGkpICYmIChlLnB1c2goaS5pIC8gciksIGUucHVzaChuLmkgLyByKSwgZS5wdXNoKGEuaSAvIHIpLCBXbyhuKSwgV28obi5uZXh0KSwgbiA9IHQgPSBhKSwgbiA9IG4ubmV4dDtcbiAgICAgIH0gd2hpbGUgKG4gIT09IHQpO1xuXG4gICAgICByZXR1cm4gTW8obik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRG8odCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdmFyIG8gPSB0O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGZvciAodmFyIHMgPSBvLm5leHQubmV4dDsgcyAhPT0gby5wcmV2Oykge1xuICAgICAgICAgIGlmIChvLmkgIT09IHMuaSAmJiBObyhvLCBzKSkge1xuICAgICAgICAgICAgdmFyIHUgPSBZbyhvLCBzKTtcbiAgICAgICAgICAgIHJldHVybiBvID0gTW8obywgby5uZXh0KSwgdSA9IE1vKHUsIHUubmV4dCksIEJvKG8sIGUsIHIsIG4sIGksIGEpLCB2b2lkIEJvKHUsIGUsIHIsIG4sIGksIGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHMgPSBzLm5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBvID0gby5uZXh0O1xuICAgICAgfSB3aGlsZSAobyAhPT0gdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG8odCwgZSkge1xuICAgICAgcmV0dXJuIHQueCAtIGUueDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBSbyh0LCBlKSB7XG4gICAgICBpZiAoZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByLFxuICAgICAgICAgICAgbiA9IGUsXG4gICAgICAgICAgICBpID0gdC54LFxuICAgICAgICAgICAgYSA9IHQueSxcbiAgICAgICAgICAgIG8gPSAtMSAvIDA7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChhIDw9IG4ueSAmJiBhID49IG4ubmV4dC55ICYmIG4ubmV4dC55ICE9PSBuLnkpIHtcbiAgICAgICAgICAgIHZhciBzID0gbi54ICsgKGEgLSBuLnkpICogKG4ubmV4dC54IC0gbi54KSAvIChuLm5leHQueSAtIG4ueSk7XG5cbiAgICAgICAgICAgIGlmIChzIDw9IGkgJiYgcyA+IG8pIHtcbiAgICAgICAgICAgICAgaWYgKG8gPSBzLCBzID09PSBpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IG4ueSkgcmV0dXJuIG47XG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IG4ubmV4dC55KSByZXR1cm4gbi5uZXh0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgciA9IG4ueCA8IG4ubmV4dC54ID8gbiA6IG4ubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuID0gbi5uZXh0O1xuICAgICAgICB9IHdoaWxlIChuICE9PSBlKTtcblxuICAgICAgICBpZiAoIXIpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoaSA9PT0gbykgcmV0dXJuIHI7XG4gICAgICAgIHZhciB1LFxuICAgICAgICAgICAgbCA9IHIsXG4gICAgICAgICAgICBwID0gci54LFxuICAgICAgICAgICAgYyA9IHIueSxcbiAgICAgICAgICAgIGggPSAxIC8gMDtcbiAgICAgICAgbiA9IHI7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGkgPj0gbi54ICYmIG4ueCA+PSBwICYmIGkgIT09IG4ueCAmJiBxbyhhIDwgYyA/IGkgOiBvLCBhLCBwLCBjLCBhIDwgYyA/IG8gOiBpLCBhLCBuLngsIG4ueSkgJiYgKHUgPSBNYXRoLmFicyhhIC0gbi55KSAvIChpIC0gbi54KSwgSG8obiwgdCkgJiYgKHUgPCBoIHx8IHUgPT09IGggJiYgKG4ueCA+IHIueCB8fCBuLnggPT09IHIueCAmJiBPbyhyLCBuKSkpICYmIChyID0gbiwgaCA9IHUpKSwgbiA9IG4ubmV4dDtcbiAgICAgICAgfSB3aGlsZSAobiAhPT0gbCk7XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KHQsIGUpKSB7XG4gICAgICAgIHZhciByID0gWW8oZSwgdCk7XG4gICAgICAgIE1vKGUsIGUubmV4dCksIE1vKHIsIHIubmV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gT28odCwgZSkge1xuICAgICAgcmV0dXJuIEtvKHQucHJldiwgdCwgZS5wcmV2KSA8IDAgJiYgS28oZS5uZXh0LCB0LCB0Lm5leHQpIDwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVbyh0LCBlLCByLCBuLCBpKSB7XG4gICAgICByZXR1cm4gKHQgPSAxNDMxNjU1NzY1ICYgKCh0ID0gODU4OTkzNDU5ICYgKCh0ID0gMjUyNjQ1MTM1ICYgKCh0ID0gMTY3MTE5MzUgJiAoKHQgPSAzMjc2NyAqICh0IC0gcikgKiBpKSB8IHQgPDwgOCkpIHwgdCA8PCA0KSkgfCB0IDw8IDIpKSB8IHQgPDwgMSkpIHwgKGUgPSAxNDMxNjU1NzY1ICYgKChlID0gODU4OTkzNDU5ICYgKChlID0gMjUyNjQ1MTM1ICYgKChlID0gMTY3MTE5MzUgJiAoKGUgPSAzMjc2NyAqIChlIC0gbikgKiBpKSB8IGUgPDwgOCkpIHwgZSA8PCA0KSkgfCBlIDw8IDIpKSB8IGUgPDwgMSkpIDw8IDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gam8odCkge1xuICAgICAgdmFyIGUgPSB0LFxuICAgICAgICAgIHIgPSB0O1xuXG4gICAgICBkbyB7XG4gICAgICAgIChlLnggPCByLnggfHwgZS54ID09PSByLnggJiYgZS55IDwgci55KSAmJiAociA9IGUpLCBlID0gZS5uZXh0O1xuICAgICAgfSB3aGlsZSAoZSAhPT0gdCk7XG5cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHFvKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMpIHtcbiAgICAgIHJldHVybiAoaSAtIG8pICogKGUgLSBzKSAtICh0IC0gbykgKiAoYSAtIHMpID49IDAgJiYgKHQgLSBvKSAqIChuIC0gcykgLSAociAtIG8pICogKGUgLSBzKSA+PSAwICYmIChyIC0gbykgKiAoYSAtIHMpIC0gKGkgLSBvKSAqIChuIC0gcykgPj0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBObyh0LCBlKSB7XG4gICAgICByZXR1cm4gdC5uZXh0LmkgIT09IGUuaSAmJiB0LnByZXYuaSAhPT0gZS5pICYmICFmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IHQ7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChyLmkgIT09IHQuaSAmJiByLm5leHQuaSAhPT0gdC5pICYmIHIuaSAhPT0gZS5pICYmIHIubmV4dC5pICE9PSBlLmkgJiYgWm8ociwgci5uZXh0LCB0LCBlKSkgcmV0dXJuICEwO1xuICAgICAgICAgIHIgPSByLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHIgIT09IHQpO1xuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0odCwgZSkgJiYgKEhvKHQsIGUpICYmIEhvKGUsIHQpICYmIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciByID0gdCxcbiAgICAgICAgICAgIG4gPSAhMSxcbiAgICAgICAgICAgIGkgPSAodC54ICsgZS54KSAvIDIsXG4gICAgICAgICAgICBhID0gKHQueSArIGUueSkgLyAyO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICByLnkgPiBhICE9IHIubmV4dC55ID4gYSAmJiByLm5leHQueSAhPT0gci55ICYmIGkgPCAoci5uZXh0LnggLSByLngpICogKGEgLSByLnkpIC8gKHIubmV4dC55IC0gci55KSArIHIueCAmJiAobiA9ICFuKSwgciA9IHIubmV4dDtcbiAgICAgICAgfSB3aGlsZSAociAhPT0gdCk7XG5cbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9KHQsIGUpICYmIChLbyh0LnByZXYsIHQsIGUucHJldikgfHwgS28odCwgZS5wcmV2LCBlKSkgfHwgR28odCwgZSkgJiYgS28odC5wcmV2LCB0LCB0Lm5leHQpID4gMCAmJiBLbyhlLnByZXYsIGUsIGUubmV4dCkgPiAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBLbyh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gKGUueSAtIHQueSkgKiAoci54IC0gZS54KSAtIChlLnggLSB0LngpICogKHIueSAtIGUueSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR28odCwgZSkge1xuICAgICAgcmV0dXJuIHQueCA9PT0gZS54ICYmIHQueSA9PT0gZS55O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFpvKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBpID0gSm8oS28odCwgZSwgcikpLFxuICAgICAgICAgIGEgPSBKbyhLbyh0LCBlLCBuKSksXG4gICAgICAgICAgbyA9IEpvKEtvKHIsIG4sIHQpKSxcbiAgICAgICAgICBzID0gSm8oS28ociwgbiwgZSkpO1xuICAgICAgcmV0dXJuIGkgIT09IGEgJiYgbyAhPT0gcyB8fCAhKDAgIT09IGkgfHwgIVhvKHQsIHIsIGUpKSB8fCAhKDAgIT09IGEgfHwgIVhvKHQsIG4sIGUpKSB8fCAhKDAgIT09IG8gfHwgIVhvKHIsIHQsIG4pKSB8fCAhKDAgIT09IHMgfHwgIVhvKHIsIGUsIG4pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBYbyh0LCBlLCByKSB7XG4gICAgICByZXR1cm4gZS54IDw9IE1hdGgubWF4KHQueCwgci54KSAmJiBlLnggPj0gTWF0aC5taW4odC54LCByLngpICYmIGUueSA8PSBNYXRoLm1heCh0LnksIHIueSkgJiYgZS55ID49IE1hdGgubWluKHQueSwgci55KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBKbyh0KSB7XG4gICAgICByZXR1cm4gdCA+IDAgPyAxIDogdCA8IDAgPyAtMSA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSG8odCwgZSkge1xuICAgICAgcmV0dXJuIEtvKHQucHJldiwgdCwgdC5uZXh0KSA8IDAgPyBLbyh0LCBlLCB0Lm5leHQpID49IDAgJiYgS28odCwgdC5wcmV2LCBlKSA+PSAwIDogS28odCwgZSwgdC5wcmV2KSA8IDAgfHwgS28odCwgdC5uZXh0LCBlKSA8IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWW8odCwgZSkge1xuICAgICAgdmFyIHIgPSBuZXcgUW8odC5pLCB0LngsIHQueSksXG4gICAgICAgICAgbiA9IG5ldyBRbyhlLmksIGUueCwgZS55KSxcbiAgICAgICAgICBpID0gdC5uZXh0LFxuICAgICAgICAgIGEgPSBlLnByZXY7XG4gICAgICByZXR1cm4gdC5uZXh0ID0gZSwgZS5wcmV2ID0gdCwgci5uZXh0ID0gaSwgaS5wcmV2ID0gciwgbi5uZXh0ID0gciwgci5wcmV2ID0gbiwgYS5uZXh0ID0gbiwgbi5wcmV2ID0gYSwgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkbyh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IG5ldyBRbyh0LCBlLCByKTtcbiAgICAgIHJldHVybiBuID8gKGkubmV4dCA9IG4ubmV4dCwgaS5wcmV2ID0gbiwgbi5uZXh0LnByZXYgPSBpLCBuLm5leHQgPSBpKSA6IChpLnByZXYgPSBpLCBpLm5leHQgPSBpKSwgaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXbyh0KSB7XG4gICAgICB0Lm5leHQucHJldiA9IHQucHJldiwgdC5wcmV2Lm5leHQgPSB0Lm5leHQsIHQucHJldlogJiYgKHQucHJldloubmV4dFogPSB0Lm5leHRaKSwgdC5uZXh0WiAmJiAodC5uZXh0Wi5wcmV2WiA9IHQucHJldlopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFFvKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuaSA9IHQsIHRoaXMueCA9IGUsIHRoaXMueSA9IHIsIHRoaXMucHJldiA9IG51bGwsIHRoaXMubmV4dCA9IG51bGwsIHRoaXMueiA9IG51bGwsIHRoaXMucHJldlogPSBudWxsLCB0aGlzLm5leHRaID0gbnVsbCwgdGhpcy5zdGVpbmVyID0gITE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHModCwgZSwgciwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSBlLCBvID0gciAtIG47IGEgPCByOyBhICs9IG4pIHtcbiAgICAgICAgaSArPSAodFtvXSAtIHRbYV0pICogKHRbYSArIDFdICsgdFtvICsgMV0pLCBvID0gYTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXModCwgZSwgciwgbiwgaSkge1xuICAgICAgIWZ1bmN0aW9uIHQoZSwgciwgbiwgaSwgYSkge1xuICAgICAgICBmb3IgKDsgaSA+IG47KSB7XG4gICAgICAgICAgaWYgKGkgLSBuID4gNjAwKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGkgLSBuICsgMSxcbiAgICAgICAgICAgICAgICBzID0gciAtIG4gKyAxLFxuICAgICAgICAgICAgICAgIHUgPSBNYXRoLmxvZyhvKSxcbiAgICAgICAgICAgICAgICBsID0gLjUgKiBNYXRoLmV4cCgyICogdSAvIDMpLFxuICAgICAgICAgICAgICAgIHAgPSAuNSAqIE1hdGguc3FydCh1ICogbCAqIChvIC0gbCkgLyBvKSAqIChzIC0gbyAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIHQoZSwgciwgTWF0aC5tYXgobiwgTWF0aC5mbG9vcihyIC0gcyAqIGwgLyBvICsgcCkpLCBNYXRoLm1pbihpLCBNYXRoLmZsb29yKHIgKyAobyAtIHMpICogbCAvIG8gKyBwKSksIGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjID0gZVtyXSxcbiAgICAgICAgICAgICAgaCA9IG4sXG4gICAgICAgICAgICAgIGYgPSBpO1xuXG4gICAgICAgICAgZm9yIChycyhlLCBuLCByKSwgYShlW2ldLCBjKSA+IDAgJiYgcnMoZSwgbiwgaSk7IGggPCBmOykge1xuICAgICAgICAgICAgZm9yIChycyhlLCBoLCBmKSwgaCsrLCBmLS07IGEoZVtoXSwgYykgPCAwOykge1xuICAgICAgICAgICAgICBoKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoOyBhKGVbZl0sIGMpID4gMDspIHtcbiAgICAgICAgICAgICAgZi0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIDAgPT09IGEoZVtuXSwgYykgPyBycyhlLCBuLCBmKSA6IHJzKGUsICsrZiwgaSksIGYgPD0gciAmJiAobiA9IGYgKyAxKSwgciA8PSBmICYmIChpID0gZiAtIDEpO1xuICAgICAgICB9XG4gICAgICB9KHQsIGUsIHIgfHwgMCwgbiB8fCB0Lmxlbmd0aCAtIDEsIGkgfHwgbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJzKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdFtlXTtcbiAgICAgIHRbZV0gPSB0W3JdLCB0W3JdID0gbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBucyh0LCBlKSB7XG4gICAgICByZXR1cm4gdCA8IGUgPyAtMSA6IHQgPiBlID8gMSA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXModCwgZSkge1xuICAgICAgdmFyIHIgPSB0Lmxlbmd0aDtcbiAgICAgIGlmIChyIDw9IDEpIHJldHVybiBbdF07XG5cbiAgICAgIGZvciAodmFyIG4sIGksIGEgPSBbXSwgbyA9IDA7IG8gPCByOyBvKyspIHtcbiAgICAgICAgdmFyIHMgPSBrKHRbb10pO1xuICAgICAgICAwICE9PSBzICYmICh0W29dLmFyZWEgPSBNYXRoLmFicyhzKSwgdm9pZCAwID09PSBpICYmIChpID0gcyA8IDApLCBpID09PSBzIDwgMCA/IChuICYmIGEucHVzaChuKSwgbiA9IFt0W29dXSkgOiBuLnB1c2godFtvXSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAobiAmJiBhLnB1c2gobiksIGUgPiAxKSBmb3IgKHZhciB1ID0gMDsgdSA8IGEubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgYVt1XS5sZW5ndGggPD0gZSB8fCAoZXMoYVt1XSwgZSwgMSwgYVt1XS5sZW5ndGggLSAxLCBhcyksIGFbdV0gPSBhW3VdLnNsaWNlKDAsIGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzKHQsIGUpIHtcbiAgICAgIHJldHVybiBlLmFyZWEgLSB0LmFyZWE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb3ModCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IHIucGF0dGVybkRlcGVuZGVuY2llcywgaSA9ICExLCBhID0gMCwgbyA9IGU7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgIHZhciBzID0gb1thXS5wYWludC5nZXQodCArIFwiLXBhdHRlcm5cIik7XG4gICAgICAgIHMuaXNDb25zdGFudCgpIHx8IChpID0gITApO1xuICAgICAgICB2YXIgdSA9IHMuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgdSAmJiAoaSA9ICEwLCBuW3UudG9dID0gITAsIG5bdS5mcm9tXSA9ICEwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ModCwgZSwgciwgbiwgaSkge1xuICAgICAgZm9yICh2YXIgYSA9IGkucGF0dGVybkRlcGVuZGVuY2llcywgbyA9IDAsIHMgPSBlOyBvIDwgcy5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICB2YXIgdSA9IHNbb10sXG4gICAgICAgICAgICBsID0gdS5wYWludC5nZXQodCArIFwiLXBhdHRlcm5cIikudmFsdWU7XG5cbiAgICAgICAgaWYgKFwiY29uc3RhbnRcIiAhPT0gbC5raW5kKSB7XG4gICAgICAgICAgdmFyIHAgPSBsLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IG4gLSAxXG4gICAgICAgICAgfSwgciwge30sIGkuYXZhaWxhYmxlSW1hZ2VzKSxcbiAgICAgICAgICAgICAgYyA9IGwuZXZhbHVhdGUoe1xuICAgICAgICAgICAgem9vbTogblxuICAgICAgICAgIH0sIHIsIHt9LCBpLmF2YWlsYWJsZUltYWdlcyksXG4gICAgICAgICAgICAgIGggPSBsLmV2YWx1YXRlKHtcbiAgICAgICAgICAgIHpvb206IG4gKyAxXG4gICAgICAgICAgfSwgciwge30sIGkuYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICBjID0gYyAmJiBjLm5hbWUgPyBjLm5hbWUgOiBjLCBoID0gaCAmJiBoLm5hbWUgPyBoLm5hbWUgOiBoLCBhW3AgPSBwICYmIHAubmFtZSA/IHAubmFtZSA6IHBdID0gITAsIGFbY10gPSAhMCwgYVtoXSA9ICEwLCByLnBhdHRlcm5zW3UuaWRdID0ge1xuICAgICAgICAgICAgbWluOiBwLFxuICAgICAgICAgICAgbWlkOiBjLFxuICAgICAgICAgICAgbWF4OiBoXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBFby5kZXZpYXRpb24gPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSBlICYmIGUubGVuZ3RoLFxuICAgICAgICAgIGEgPSBNYXRoLmFicyh0cyh0LCAwLCBpID8gZVswXSAqIHIgOiB0Lmxlbmd0aCwgcikpO1xuICAgICAgaWYgKGkpIGZvciAodmFyIG8gPSAwLCBzID0gZS5sZW5ndGg7IG8gPCBzOyBvKyspIHtcbiAgICAgICAgYSAtPSBNYXRoLmFicyh0cyh0LCBlW29dICogciwgbyA8IHMgLSAxID8gZVtvICsgMV0gKiByIDogdC5sZW5ndGgsIHIpKTtcbiAgICAgIH1cbiAgICAgIHZhciB1ID0gMDtcblxuICAgICAgZm9yIChvID0gMDsgbyA8IG4ubGVuZ3RoOyBvICs9IDMpIHtcbiAgICAgICAgdmFyIGwgPSBuW29dICogcixcbiAgICAgICAgICAgIHAgPSBuW28gKyAxXSAqIHIsXG4gICAgICAgICAgICBjID0gbltvICsgMl0gKiByO1xuICAgICAgICB1ICs9IE1hdGguYWJzKCh0W2xdIC0gdFtjXSkgKiAodFtwICsgMV0gLSB0W2wgKyAxXSkgLSAodFtsXSAtIHRbcF0pICogKHRbYyArIDFdIC0gdFtsICsgMV0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDAgPT09IGEgJiYgMCA9PT0gdSA/IDAgOiBNYXRoLmFicygodSAtIGEpIC8gYSk7XG4gICAgfSwgRW8uZmxhdHRlbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdFswXVswXS5sZW5ndGgsIHIgPSB7XG4gICAgICAgIHZlcnRpY2VzOiBbXSxcbiAgICAgICAgaG9sZXM6IFtdLFxuICAgICAgICBkaW1lbnNpb25zOiBlXG4gICAgICB9LCBuID0gMCwgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgdFtpXS5sZW5ndGg7IGErKykge1xuICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgZTsgbysrKSB7XG4gICAgICAgICAgICByLnZlcnRpY2VzLnB1c2godFtpXVthXVtvXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSA+IDAgJiYgci5ob2xlcy5wdXNoKG4gKz0gdFtpIC0gMV0ubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgem8uZGVmYXVsdCA9IENvO1xuXG4gICAgdmFyIHVzID0gZnVuY3Rpb24gdXModCkge1xuICAgICAgdGhpcy56b29tID0gdC56b29tLCB0aGlzLm92ZXJzY2FsaW5nID0gdC5vdmVyc2NhbGluZywgdGhpcy5sYXllcnMgPSB0LmxheWVycywgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pLCB0aGlzLmluZGV4ID0gdC5pbmRleCwgdGhpcy5oYXNQYXR0ZXJuID0gITEsIHRoaXMucGF0dGVybkZlYXR1cmVzID0gW10sIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRWkoKSwgdGhpcy5pbmRleEFycmF5ID0gbmV3IHFpKCksIHRoaXMuaW5kZXhBcnJheTIgPSBuZXcgSmkoKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgRmEodC5sYXllcnMsIHQuem9vbSksIHRoaXMuc2VnbWVudHMgPSBuZXcgdWEoKSwgdGhpcy5zZWdtZW50czIgPSBuZXcgdWEoKSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlzU3RhdGVEZXBlbmRlbnQoKTtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB1cy5wcm90b3R5cGUucG9wdWxhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gb3MoXCJmaWxsXCIsIHRoaXMubGF5ZXJzLCBlKTtcblxuICAgICAgZm9yICh2YXIgbiA9IHRoaXMubGF5ZXJzWzBdLmxheW91dC5nZXQoXCJmaWxsLXNvcnQta2V5XCIpLCBpID0gIW4uaXNDb25zdGFudCgpLCBhID0gW10sIG8gPSAwLCBzID0gdDsgbyA8IHMubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgdmFyIHUgPSBzW29dLFxuICAgICAgICAgICAgbCA9IHUuZmVhdHVyZSxcbiAgICAgICAgICAgIHAgPSB1LmlkLFxuICAgICAgICAgICAgYyA9IHUuaW5kZXgsXG4gICAgICAgICAgICBoID0gdS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgZiA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeSxcbiAgICAgICAgICAgIHkgPSBqYShsLCBmKTtcblxuICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyB1aSh0aGlzLnpvb20pLCB5LCByKSkge1xuICAgICAgICAgIHZhciBkID0gaSA/IG4uZXZhbHVhdGUoeSwge30sIHIsIGUuYXZhaWxhYmxlSW1hZ2VzKSA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgbSA9IHtcbiAgICAgICAgICAgIGlkOiBwLFxuICAgICAgICAgICAgcHJvcGVydGllczogbC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdHlwZTogbC50eXBlLFxuICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogaCxcbiAgICAgICAgICAgIGluZGV4OiBjLFxuICAgICAgICAgICAgZ2VvbWV0cnk6IGYgPyB5Lmdlb21ldHJ5IDogVWEobCksXG4gICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICBzb3J0S2V5OiBkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhLnB1c2gobSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaSAmJiBhLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQuc29ydEtleSAtIGUuc29ydEtleTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciB2ID0gMCwgZyA9IGE7IHYgPCBnLmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgIHZhciB4ID0gZ1t2XSxcbiAgICAgICAgICAgIGIgPSB4Lmdlb21ldHJ5LFxuICAgICAgICAgICAgdyA9IHguaW5kZXgsXG4gICAgICAgICAgICBfID0geC5zb3VyY2VMYXllckluZGV4O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICB2YXIgQSA9IHNzKFwiZmlsbFwiLCB0aGlzLmxheWVycywgeCwgdGhpcy56b29tLCBlKTtcbiAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKEEpO1xuICAgICAgICB9IGVsc2UgdGhpcy5hZGRGZWF0dXJlKHgsIGIsIHcsIHIsIHt9KTtcblxuICAgICAgICBlLmZlYXR1cmVJbmRleC5pbnNlcnQodFt3XS5mZWF0dXJlLCBiLCB3LCBfLCB0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICB9LCB1cy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoICYmIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHQsIGUsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIHIpO1xuICAgIH0sIHVzLnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMucGF0dGVybkZlYXR1cmVzOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IGlbbl07XG4gICAgICAgIHRoaXMuYWRkRmVhdHVyZShhLCBhLmdlb21ldHJ5LCBhLmluZGV4LCBlLCByKTtcbiAgICAgIH1cbiAgICB9LCB1cy5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICB9LCB1cy5wcm90b3R5cGUudXBsb2FkUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9LCB1cy5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMudXBsb2FkZWQgfHwgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgSW8pLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpLCB0aGlzLmluZGV4QnVmZmVyMiA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5MikpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQodCksIHRoaXMudXBsb2FkZWQgPSAhMDtcbiAgICB9LCB1cy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyICYmICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLmluZGV4QnVmZmVyMi5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCksIHRoaXMuc2VnbWVudHMyLmRlc3Ryb3koKSk7XG4gICAgfSwgdXMucHJvdG90eXBlLmFkZEZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgZm9yICh2YXIgYSA9IDAsIG8gPSBpcyhlLCA1MDApOyBhIDwgby5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBzID0gb1thXSwgdSA9IDAsIGwgPSAwLCBwID0gczsgbCA8IHAubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgICB1ICs9IHBbbF0ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgYyA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQodSwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KSwgaCA9IGMudmVydGV4TGVuZ3RoLCBmID0gW10sIHkgPSBbXSwgZCA9IDAsIG0gPSBzOyBkIDwgbS5sZW5ndGg7IGQgKz0gMSkge1xuICAgICAgICAgIHZhciB2ID0gbVtkXTtcblxuICAgICAgICAgIGlmICgwICE9PSB2Lmxlbmd0aCkge1xuICAgICAgICAgICAgdiAhPT0gc1swXSAmJiB5LnB1c2goZi5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgIHZhciBnID0gdGhpcy5zZWdtZW50czIucHJlcGFyZVNlZ21lbnQodi5sZW5ndGgsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheTIpLFxuICAgICAgICAgICAgICAgIHggPSBnLnZlcnRleExlbmd0aDtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodlswXS54LCB2WzBdLnkpLCB0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKHggKyB2Lmxlbmd0aCAtIDEsIHgpLCBmLnB1c2godlswXS54KSwgZi5wdXNoKHZbMF0ueSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAxOyBiIDwgdi5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHZbYl0ueCwgdltiXS55KSwgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayh4ICsgYiAtIDEsIHggKyBiKSwgZi5wdXNoKHZbYl0ueCksIGYucHVzaCh2W2JdLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnLnZlcnRleExlbmd0aCArPSB2Lmxlbmd0aCwgZy5wcmltaXRpdmVMZW5ndGggKz0gdi5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdyA9IHpvKGYsIHkpLCBfID0gMDsgXyA8IHcubGVuZ3RoOyBfICs9IDMpIHtcbiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaCArIHdbX10sIGggKyB3W18gKyAxXSwgaCArIHdbXyArIDJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGMudmVydGV4TGVuZ3RoICs9IHUsIGMucHJpbWl0aXZlTGVuZ3RoICs9IHcubGVuZ3RoIC8gMztcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgdCwgciwgaSwgbik7XG4gICAgfSwgT24oXCJGaWxsQnVja2V0XCIsIHVzLCB7XG4gICAgICBvbWl0OiBbXCJsYXllcnNcIiwgXCJwYXR0ZXJuRmVhdHVyZXNcIl1cbiAgICB9KTtcblxuICAgIHZhciBscyA9IG5ldyBfaSh7XG4gICAgICBcImZpbGwtc29ydC1rZXlcIjogbmV3IGdpKFB0LmxheW91dF9maWxsW1wiZmlsbC1zb3J0LWtleVwiXSlcbiAgICB9KSxcbiAgICAgICAgcHMgPSB7XG4gICAgICBwYWludDogbmV3IF9pKHtcbiAgICAgICAgXCJmaWxsLWFudGlhbGlhc1wiOiBuZXcgdmkoUHQucGFpbnRfZmlsbFtcImZpbGwtYW50aWFsaWFzXCJdKSxcbiAgICAgICAgXCJmaWxsLW9wYWNpdHlcIjogbmV3IGdpKFB0LnBhaW50X2ZpbGxbXCJmaWxsLW9wYWNpdHlcIl0pLFxuICAgICAgICBcImZpbGwtY29sb3JcIjogbmV3IGdpKFB0LnBhaW50X2ZpbGxbXCJmaWxsLWNvbG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjogbmV3IGdpKFB0LnBhaW50X2ZpbGxbXCJmaWxsLW91dGxpbmUtY29sb3JcIl0pLFxuICAgICAgICBcImZpbGwtdHJhbnNsYXRlXCI6IG5ldyB2aShQdC5wYWludF9maWxsW1wiZmlsbC10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgdmkoUHQucGFpbnRfZmlsbFtcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgICAgIFwiZmlsbC1wYXR0ZXJuXCI6IG5ldyB4aShQdC5wYWludF9maWxsW1wiZmlsbC1wYXR0ZXJuXCJdKVxuICAgICAgfSksXG4gICAgICBsYXlvdXQ6IGxzXG4gICAgfSxcbiAgICAgICAgY3MgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBwcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgdC5wcm90b3R5cGUucmVjYWxjdWxhdGUuY2FsbCh0aGlzLCBlLCByKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnBhaW50Ll92YWx1ZXNbXCJmaWxsLW91dGxpbmUtY29sb3JcIl07XG4gICAgICAgIFwiY29uc3RhbnRcIiA9PT0gbi52YWx1ZS5raW5kICYmIHZvaWQgMCA9PT0gbi52YWx1ZS52YWx1ZSAmJiAodGhpcy5wYWludC5fdmFsdWVzW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdID0gdGhpcy5wYWludC5fdmFsdWVzW1wiZmlsbC1jb2xvclwiXSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IHVzKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBybyh0aGlzLnBhaW50LmdldChcImZpbGwtdHJhbnNsYXRlXCIpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgICByZXR1cm4gWmEobm8odCwgdGhpcy5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZVwiKSwgdGhpcy5wYWludC5nZXQoXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIiksIGEuYW5nbGUsIG8pLCBuKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzVGlsZUNsaXBwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGU7XG4gICAgfShBaSksXG4gICAgICAgIGhzID0gemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfbm9ybWFsX2VkXCIsXG4gICAgICBjb21wb25lbnRzOiA0LFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpLm1lbWJlcnMsXG4gICAgICAgIGZzID0geXM7XG5cbiAgICBmdW5jdGlvbiB5cyh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB7fSwgdGhpcy5leHRlbnQgPSByLCB0aGlzLnR5cGUgPSAwLCB0aGlzLl9wYmYgPSB0LCB0aGlzLl9nZW9tZXRyeSA9IC0xLCB0aGlzLl9rZXlzID0gbiwgdGhpcy5fdmFsdWVzID0gaSwgdC5yZWFkRmllbGRzKGRzLCB0aGlzLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcyh0LCBlLCByKSB7XG4gICAgICAxID09IHQgPyBlLmlkID0gci5yZWFkVmFyaW50KCkgOiAyID09IHQgPyBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByID0gdC5yZWFkVmFyaW50KCkgKyB0LnBvczsgdC5wb3MgPCByOykge1xuICAgICAgICAgIHZhciBuID0gZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICAgIGkgPSBlLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO1xuXG4gICAgICAgICAgZS5wcm9wZXJ0aWVzW25dID0gaTtcbiAgICAgICAgfVxuICAgICAgfShyLCBlKSA6IDMgPT0gdCA/IGUudHlwZSA9IHIucmVhZFZhcmludCgpIDogNCA9PSB0ICYmIChlLl9nZW9tZXRyeSA9IHIucG9zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtcyh0KSB7XG4gICAgICBmb3IgKHZhciBlLCByLCBuID0gMCwgaSA9IDAsIGEgPSB0Lmxlbmd0aCwgbyA9IGEgLSAxOyBpIDwgYTsgbyA9IGkrKykge1xuICAgICAgICBuICs9ICgociA9IHRbb10pLnggLSAoZSA9IHRbaV0pLngpICogKGUueSArIHIueSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIHlzLnR5cGVzID0gW1wiVW5rbm93blwiLCBcIlBvaW50XCIsIFwiTGluZVN0cmluZ1wiLCBcIlBvbHlnb25cIl0sIHlzLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX3BiZjtcbiAgICAgIHQucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICAgIGZvciAodmFyIGUsIHIgPSB0LnJlYWRWYXJpbnQoKSArIHQucG9zLCBuID0gMSwgYSA9IDAsIG8gPSAwLCBzID0gMCwgdSA9IFtdOyB0LnBvcyA8IHI7KSB7XG4gICAgICAgIGlmIChhIDw9IDApIHtcbiAgICAgICAgICB2YXIgbCA9IHQucmVhZFZhcmludCgpO1xuICAgICAgICAgIG4gPSA3ICYgbCwgYSA9IGwgPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLS0sIDEgPT09IG4gfHwgMiA9PT0gbikgbyArPSB0LnJlYWRTVmFyaW50KCksIHMgKz0gdC5yZWFkU1ZhcmludCgpLCAxID09PSBuICYmIChlICYmIHUucHVzaChlKSwgZSA9IFtdKSwgZS5wdXNoKG5ldyBpKG8sIHMpKTtlbHNlIHtcbiAgICAgICAgICBpZiAoNyAhPT0gbikgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiICsgbik7XG4gICAgICAgICAgZSAmJiBlLnB1c2goZVswXS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiB1LnB1c2goZSksIHU7XG4gICAgfSwgeXMucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuX3BiZjtcbiAgICAgIHQucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICAgIGZvciAodmFyIGUgPSB0LnJlYWRWYXJpbnQoKSArIHQucG9zLCByID0gMSwgbiA9IDAsIGkgPSAwLCBhID0gMCwgbyA9IDEgLyAwLCBzID0gLTEgLyAwLCB1ID0gMSAvIDAsIGwgPSAtMSAvIDA7IHQucG9zIDwgZTspIHtcbiAgICAgICAgaWYgKG4gPD0gMCkge1xuICAgICAgICAgIHZhciBwID0gdC5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgciA9IDcgJiBwLCBuID0gcCA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4tLSwgMSA9PT0gciB8fCAyID09PSByKSAoaSArPSB0LnJlYWRTVmFyaW50KCkpIDwgbyAmJiAobyA9IGkpLCBpID4gcyAmJiAocyA9IGkpLCAoYSArPSB0LnJlYWRTVmFyaW50KCkpIDwgdSAmJiAodSA9IGEpLCBhID4gbCAmJiAobCA9IGEpO2Vsc2UgaWYgKDcgIT09IHIpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gY29tbWFuZCBcIiArIHIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW28sIHUsIHMsIGxdO1xuICAgIH0sIHlzLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4sXG4gICAgICAgICAgaSxcbiAgICAgICAgICBhID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCByKSxcbiAgICAgICAgICBvID0gdGhpcy5leHRlbnQgKiB0LFxuICAgICAgICAgIHMgPSB0aGlzLmV4dGVudCAqIGUsXG4gICAgICAgICAgdSA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgICAgbCA9IHlzLnR5cGVzW3RoaXMudHlwZV07XG5cbiAgICAgIGZ1bmN0aW9uIHAodCkge1xuICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICB2YXIgciA9IHRbZV07XG4gICAgICAgICAgdFtlXSA9IFszNjAgKiAoci54ICsgbykgLyBhIC0gMTgwLCAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKCgxODAgLSAzNjAgKiAoci55ICsgcykgLyBhKSAqIE1hdGguUEkgLyAxODApKSAtIDkwXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdmFyIGMgPSBbXTtcblxuICAgICAgICAgIGZvciAobiA9IDA7IG4gPCB1Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjW25dID0gdVtuXVswXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwKHUgPSBjKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZm9yIChuID0gMDsgbiA8IHUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIHAodVtuXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGZvciAodSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgZSA9IHQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGUgPD0gMSkgcmV0dXJuIFt0XTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciwgbiwgaSA9IFtdLCBhID0gMDsgYSA8IGU7IGErKykge1xuICAgICAgICAgICAgICB2YXIgbyA9IG1zKHRbYV0pO1xuICAgICAgICAgICAgICAwICE9PSBvICYmICh2b2lkIDAgPT09IG4gJiYgKG4gPSBvIDwgMCksIG4gPT09IG8gPCAwID8gKHIgJiYgaS5wdXNoKHIpLCByID0gW3RbYV1dKSA6IHIucHVzaCh0W2FdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByICYmIGkucHVzaChyKSwgaTtcbiAgICAgICAgICB9KHUpLCBuID0gMDsgbiA8IHUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHAodVtuXVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAgIDEgPT09IHUubGVuZ3RoID8gdSA9IHVbMF0gOiBsID0gXCJNdWx0aVwiICsgbDtcbiAgICAgIHZhciBoID0ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICB0eXBlOiBsLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB1XG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgICAgfTtcbiAgICAgIHJldHVybiBcImlkXCIgaW4gdGhpcyAmJiAoaC5pZCA9IHRoaXMuaWQpLCBoO1xuICAgIH07XG4gICAgdmFyIHZzID0gZ3M7XG5cbiAgICBmdW5jdGlvbiBncyh0LCBlKSB7XG4gICAgICB0aGlzLnZlcnNpb24gPSAxLCB0aGlzLm5hbWUgPSBudWxsLCB0aGlzLmV4dGVudCA9IDQwOTYsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5fcGJmID0gdCwgdGhpcy5fa2V5cyA9IFtdLCB0aGlzLl92YWx1ZXMgPSBbXSwgdGhpcy5fZmVhdHVyZXMgPSBbXSwgdC5yZWFkRmllbGRzKHhzLCB0aGlzLCBlKSwgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geHModCwgZSwgcikge1xuICAgICAgMTUgPT09IHQgPyBlLnZlcnNpb24gPSByLnJlYWRWYXJpbnQoKSA6IDEgPT09IHQgPyBlLm5hbWUgPSByLnJlYWRTdHJpbmcoKSA6IDUgPT09IHQgPyBlLmV4dGVudCA9IHIucmVhZFZhcmludCgpIDogMiA9PT0gdCA/IGUuX2ZlYXR1cmVzLnB1c2goci5wb3MpIDogMyA9PT0gdCA/IGUuX2tleXMucHVzaChyLnJlYWRTdHJpbmcoKSkgOiA0ID09PSB0ICYmIGUuX3ZhbHVlcy5wdXNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBudWxsLCByID0gdC5yZWFkVmFyaW50KCkgKyB0LnBvczsgdC5wb3MgPCByOykge1xuICAgICAgICAgIHZhciBuID0gdC5yZWFkVmFyaW50KCkgPj4gMztcbiAgICAgICAgICBlID0gMSA9PT0gbiA/IHQucmVhZFN0cmluZygpIDogMiA9PT0gbiA/IHQucmVhZEZsb2F0KCkgOiAzID09PSBuID8gdC5yZWFkRG91YmxlKCkgOiA0ID09PSBuID8gdC5yZWFkVmFyaW50NjQoKSA6IDUgPT09IG4gPyB0LnJlYWRWYXJpbnQoKSA6IDYgPT09IG4gPyB0LnJlYWRTVmFyaW50KCkgOiA3ID09PSBuID8gdC5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfShyKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnModCwgZSwgcikge1xuICAgICAgaWYgKDMgPT09IHQpIHtcbiAgICAgICAgdmFyIG4gPSBuZXcgdnMociwgci5yZWFkVmFyaW50KCkgKyByLnBvcyk7XG4gICAgICAgIG4ubGVuZ3RoICYmIChlW24ubmFtZV0gPSBuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncy5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodCA8IDAgfHwgdCA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbiAgICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1t0XTtcblxuICAgICAgdmFyIGUgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcblxuICAgICAgcmV0dXJuIG5ldyBmcyh0aGlzLl9wYmYsIGUsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xuICAgIH07XG5cbiAgICB2YXIgd3MgPSB7XG4gICAgICBWZWN0b3JUaWxlOiBmdW5jdGlvbiBWZWN0b3JUaWxlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSB0LnJlYWRGaWVsZHMoYnMsIHt9LCBlKTtcbiAgICAgIH0sXG4gICAgICBWZWN0b3JUaWxlRmVhdHVyZTogZnMsXG4gICAgICBWZWN0b3JUaWxlTGF5ZXI6IHZzXG4gICAgfSxcbiAgICAgICAgX3MgPSB3cy5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyxcbiAgICAgICAgQXMgPSBNYXRoLnBvdygyLCAxMyk7XG5cbiAgICBmdW5jdGlvbiBTcyh0LCBlLCByLCBuLCBpLCBhLCBvLCBzKSB7XG4gICAgICB0LmVtcGxhY2VCYWNrKGUsIHIsIDIgKiBNYXRoLmZsb29yKG4gKiBBcykgKyBvLCBpICogQXMgKiAyLCBhICogQXMgKiAyLCBNYXRoLnJvdW5kKHMpKTtcbiAgICB9XG5cbiAgICB2YXIga3MgPSBmdW5jdGlvbiBrcyh0KSB7XG4gICAgICB0aGlzLnpvb20gPSB0Lnpvb20sIHRoaXMub3ZlcnNjYWxpbmcgPSB0Lm92ZXJzY2FsaW5nLCB0aGlzLmxheWVycyA9IHQubGF5ZXJzLCB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSksIHRoaXMuaW5kZXggPSB0LmluZGV4LCB0aGlzLmhhc1BhdHRlcm4gPSAhMSwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBNaSgpLCB0aGlzLmluZGV4QXJyYXkgPSBuZXcgcWkoKSwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgRmEodC5sYXllcnMsIHQuem9vbSksIHRoaXMuc2VnbWVudHMgPSBuZXcgdWEoKSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlzU3RhdGVEZXBlbmRlbnQoKTtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBJcyh0LCBlKSB7XG4gICAgICByZXR1cm4gdC54ID09PSBlLnggJiYgKHQueCA8IDAgfHwgdC54ID4gODE5MikgfHwgdC55ID09PSBlLnkgJiYgKHQueSA8IDAgfHwgdC55ID4gODE5Mik7XG4gICAgfVxuXG4gICAga3MucHJvdG90eXBlLnBvcHVsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuZmVhdHVyZXMgPSBbXSwgdGhpcy5oYXNQYXR0ZXJuID0gb3MoXCJmaWxsLWV4dHJ1c2lvblwiLCB0aGlzLmxheWVycywgZSk7XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gdDsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dLFxuICAgICAgICAgICAgbyA9IGEuZmVhdHVyZSxcbiAgICAgICAgICAgIHMgPSBhLmlkLFxuICAgICAgICAgICAgdSA9IGEuaW5kZXgsXG4gICAgICAgICAgICBsID0gYS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgcCA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeSxcbiAgICAgICAgICAgIGMgPSBqYShvLCBwKTtcblxuICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyB1aSh0aGlzLnpvb20pLCBjLCByKSkge1xuICAgICAgICAgIHZhciBoID0ge1xuICAgICAgICAgICAgaWQ6IHMsXG4gICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBsLFxuICAgICAgICAgICAgaW5kZXg6IHUsXG4gICAgICAgICAgICBnZW9tZXRyeTogcCA/IGMuZ2VvbWV0cnkgOiBVYShvKSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IG8ucHJvcGVydGllcyxcbiAgICAgICAgICAgIHR5cGU6IG8udHlwZSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7fVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID8gdGhpcy5mZWF0dXJlcy5wdXNoKHNzKFwiZmlsbC1leHRydXNpb25cIiwgdGhpcy5sYXllcnMsIGgsIHRoaXMuem9vbSwgZSkpIDogdGhpcy5hZGRGZWF0dXJlKGgsIGguZ2VvbWV0cnksIHUsIHIsIHt9KSwgZS5mZWF0dXJlSW5kZXguaW5zZXJ0KG8sIGguZ2VvbWV0cnksIHUsIGwsIHRoaXMuaW5kZXgsICEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGtzLnByb3RvdHlwZS5hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHRoaXMuZmVhdHVyZXM7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBhID0gaVtuXTtcbiAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGEsIGEuZ2VvbWV0cnksIGEuaW5kZXgsIGUsIHIpO1xuICAgICAgfVxuICAgIH0sIGtzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGggJiYgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXModCwgZSwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgcik7XG4gICAgfSwga3MucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgfSwga3MucHJvdG90eXBlLnVwbG9hZFBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfSwga3MucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnVwbG9hZGVkIHx8ICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGhzKSwgdGhpcy5pbmRleEJ1ZmZlciA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZCh0KSwgdGhpcy51cGxvYWRlZCA9ICEwO1xuICAgIH0sIGtzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCkpO1xuICAgIH0sIGtzLnByb3RvdHlwZS5hZGRGZWF0dXJlID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGZvciAodmFyIGEgPSAwLCBvID0gaXMoZSwgNTAwKTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgcyA9IG9bYV0sIHUgPSAwLCBsID0gMCwgcCA9IHM7IGwgPCBwLmxlbmd0aDsgbCArPSAxKSB7XG4gICAgICAgICAgdSArPSBwW2xdLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSksIGggPSAwLCBmID0gczsgaCA8IGYubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICB2YXIgeSA9IGZbaF07XG4gICAgICAgICAgaWYgKDAgIT09IHkubGVuZ3RoICYmICEoKEIgPSB5KS5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueCA8IDA7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueCA+IDgxOTI7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueSA8IDA7XG4gICAgICAgICAgfSkgfHwgQi5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQueSA+IDgxOTI7XG4gICAgICAgICAgfSkpKSBmb3IgKHZhciBkID0gMCwgbSA9IDA7IG0gPCB5Lmxlbmd0aDsgbSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHlbbV07XG5cbiAgICAgICAgICAgIGlmIChtID49IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGcgPSB5W20gLSAxXTtcblxuICAgICAgICAgICAgICBpZiAoIUlzKHYsIGcpKSB7XG4gICAgICAgICAgICAgICAgYy52ZXJ0ZXhMZW5ndGggKyA0ID4gdWEuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggJiYgKGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSkpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHggPSB2LnN1YihnKS5fcGVycCgpLl91bml0KCksXG4gICAgICAgICAgICAgICAgICAgIGIgPSBnLmRpc3Qodik7XG5cbiAgICAgICAgICAgICAgICBkICsgYiA+IDMyNzY4ICYmIChkID0gMCksIFNzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHYueCwgdi55LCB4LngsIHgueSwgMCwgMCwgZCksIFNzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHYueCwgdi55LCB4LngsIHgueSwgMCwgMSwgZCksIFNzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGcueCwgZy55LCB4LngsIHgueSwgMCwgMCwgZCArPSBiKSwgU3ModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgZy54LCBnLnksIHgueCwgeC55LCAwLCAxLCBkKTtcbiAgICAgICAgICAgICAgICB2YXIgdyA9IGMudmVydGV4TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh3LCB3ICsgMiwgdyArIDEpLCB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodyArIDEsIHcgKyAyLCB3ICsgMyksIGMudmVydGV4TGVuZ3RoICs9IDQsIGMucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYy52ZXJ0ZXhMZW5ndGggKyB1ID4gdWEuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggJiYgKGMgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KHUsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSkpLCBcIlBvbHlnb25cIiA9PT0gX3NbdC50eXBlXSkge1xuICAgICAgICAgIGZvciAodmFyIF8gPSBbXSwgQSA9IFtdLCBTID0gYy52ZXJ0ZXhMZW5ndGgsIGsgPSAwLCBJID0gczsgayA8IEkubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB6ID0gSVtrXTtcblxuICAgICAgICAgICAgaWYgKDAgIT09IHoubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHogIT09IHNbMF0gJiYgQS5wdXNoKF8ubGVuZ3RoIC8gMik7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgQyA9IDA7IEMgPCB6Lmxlbmd0aDsgQysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIEUgPSB6W0NdO1xuICAgICAgICAgICAgICAgIFNzKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIEUueCwgRS55LCAwLCAwLCAxLCAxLCAwKSwgXy5wdXNoKEUueCksIF8ucHVzaChFLnkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgUCA9IHpvKF8sIEEpLCBNID0gMDsgTSA8IFAubGVuZ3RoOyBNICs9IDMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhTICsgUFtNXSwgUyArIFBbTSArIDJdLCBTICsgUFtNICsgMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGMucHJpbWl0aXZlTGVuZ3RoICs9IFAubGVuZ3RoIC8gMywgYy52ZXJ0ZXhMZW5ndGggKz0gdTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgQjtcbiAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIHQsIHIsIGksIG4pO1xuICAgIH0sIE9uKFwiRmlsbEV4dHJ1c2lvbkJ1Y2tldFwiLCBrcywge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCIsIFwiZmVhdHVyZXNcIl1cbiAgICB9KTtcblxuICAgIHZhciB6cyA9IHtcbiAgICAgIHBhaW50OiBuZXcgX2koe1xuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjogbmV3IHZpKFB0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBuZXcgZ2koUHRbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogbmV3IHZpKFB0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IHZpKFB0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IG5ldyB4aShQdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IG5ldyBnaShQdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24taGVpZ2h0XCJdKSxcbiAgICAgICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyBnaShQdFtcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tYmFzZVwiXSksXG4gICAgICAgIFwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIjogbmV3IHZpKFB0W1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiXSlcbiAgICAgIH0pXG4gICAgfSxcbiAgICAgICAgQ3MgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCB6cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcga3ModCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeVJhZGl1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJvKHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmlzM0QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgYSwgbywgcywgdSkge1xuICAgICAgICB2YXIgbCA9IG5vKHQsIHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpLCB0aGlzLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIiksIG8uYW5nbGUsIHMpLFxuICAgICAgICAgICAgcCA9IHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCIpLmV2YWx1YXRlKGUsIHIpLFxuICAgICAgICAgICAgYyA9IHRoaXMucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tYmFzZVwiKS5ldmFsdWF0ZShlLCByKSxcbiAgICAgICAgICAgIGggPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIGZvciAodmFyIGEgPSBbXSwgbyA9IDAsIHMgPSB0OyBvIDwgcy5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgICAgdmFyIHUgPSBzW29dLFxuICAgICAgICAgICAgICAgIGwgPSBbdS54LCB1LnksIDAsIDFdO1xuICAgICAgICAgICAgY28obCwgbCwgZSksIGEucHVzaChuZXcgaShsWzBdIC8gbFszXSwgbFsxXSAvIGxbM10pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfShsLCB1KSxcbiAgICAgICAgICAgIGYgPSBmdW5jdGlvbiAodCwgZSwgciwgbikge1xuICAgICAgICAgIGZvciAodmFyIGEgPSBbXSwgbyA9IFtdLCBzID0gbls4XSAqIGUsIHUgPSBuWzldICogZSwgbCA9IG5bMTBdICogZSwgcCA9IG5bMTFdICogZSwgYyA9IG5bOF0gKiByLCBoID0gbls5XSAqIHIsIGYgPSBuWzEwXSAqIHIsIHkgPSBuWzExXSAqIHIsIGQgPSAwLCBtID0gdDsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHYgPSBbXSwgZyA9IFtdLCB4ID0gMCwgYiA9IG1bZF07IHggPCBiLmxlbmd0aDsgeCArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciB3ID0gYlt4XSxcbiAgICAgICAgICAgICAgICAgIF8gPSB3LngsXG4gICAgICAgICAgICAgICAgICBBID0gdy55LFxuICAgICAgICAgICAgICAgICAgUyA9IG5bMF0gKiBfICsgbls0XSAqIEEgKyBuWzEyXSxcbiAgICAgICAgICAgICAgICAgIGsgPSBuWzFdICogXyArIG5bNV0gKiBBICsgblsxM10sXG4gICAgICAgICAgICAgICAgICBJID0gblsyXSAqIF8gKyBuWzZdICogQSArIG5bMTRdLFxuICAgICAgICAgICAgICAgICAgeiA9IG5bM10gKiBfICsgbls3XSAqIEEgKyBuWzE1XSxcbiAgICAgICAgICAgICAgICAgIEMgPSBJICsgbCxcbiAgICAgICAgICAgICAgICAgIEUgPSB6ICsgcCxcbiAgICAgICAgICAgICAgICAgIFAgPSBTICsgYyxcbiAgICAgICAgICAgICAgICAgIE0gPSBrICsgaCxcbiAgICAgICAgICAgICAgICAgIEIgPSBJICsgZixcbiAgICAgICAgICAgICAgICAgIFQgPSB6ICsgeSxcbiAgICAgICAgICAgICAgICAgIFYgPSBuZXcgaSgoUyArIHMpIC8gRSwgKGsgKyB1KSAvIEUpO1xuICAgICAgICAgICAgICBWLnogPSBDIC8gRSwgdi5wdXNoKFYpO1xuICAgICAgICAgICAgICB2YXIgRiA9IG5ldyBpKFAgLyBULCBNIC8gVCk7XG4gICAgICAgICAgICAgIEYueiA9IEIgLyBULCBnLnB1c2goRik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGEucHVzaCh2KSwgby5wdXNoKGcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbYSwgb107XG4gICAgICAgIH0obiwgYywgcCwgdSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgdmFyIG4gPSAxIC8gMDtcbiAgICAgICAgICBaYShyLCBlKSAmJiAobiA9IFBzKHIsIGVbMF0pKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgYSA9IGVbaV0sIG8gPSB0W2ldLCBzID0gMDsgcyA8IGEubGVuZ3RoIC0gMTsgcysrKSB7XG4gICAgICAgICAgICAgIHZhciB1ID0gYVtzXSxcbiAgICAgICAgICAgICAgICAgIGwgPSBbdSwgYVtzICsgMV0sIG9bcyArIDFdLCBvW3NdLCB1XTtcbiAgICAgICAgICAgICAgS2EociwgbCkgJiYgKG4gPSBNYXRoLm1pbihuLCBQcyhyLCBsKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuICE9PSAxIC8gMCAmJiBuO1xuICAgICAgICB9KGZbMF0sIGZbMV0sIGgpO1xuICAgICAgfSwgZTtcbiAgICB9KEFpKTtcblxuICAgIGZ1bmN0aW9uIEVzKHQsIGUpIHtcbiAgICAgIHJldHVybiB0LnggKiBlLnggKyB0LnkgKiBlLnk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUHModCwgZSkge1xuICAgICAgaWYgKDEgPT09IHQubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIHIsIG4gPSAwLCBpID0gZVtuKytdOyAhciB8fCBpLmVxdWFscyhyKTspIHtcbiAgICAgICAgICBpZiAoIShyID0gZVtuKytdKSkgcmV0dXJuIDEgLyAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICg7IG4gPCBlLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgdmFyIGEgPSBlW25dLFxuICAgICAgICAgICAgICBvID0gdFswXSxcbiAgICAgICAgICAgICAgcyA9IHIuc3ViKGkpLFxuICAgICAgICAgICAgICB1ID0gYS5zdWIoaSksXG4gICAgICAgICAgICAgIGwgPSBvLnN1YihpKSxcbiAgICAgICAgICAgICAgcCA9IEVzKHMsIHMpLFxuICAgICAgICAgICAgICBjID0gRXMocywgdSksXG4gICAgICAgICAgICAgIGggPSBFcyh1LCB1KSxcbiAgICAgICAgICAgICAgZiA9IEVzKGwsIHMpLFxuICAgICAgICAgICAgICB5ID0gRXMobCwgdSksXG4gICAgICAgICAgICAgIGQgPSBwICogaCAtIGMgKiBjLFxuICAgICAgICAgICAgICBtID0gKGggKiBmIC0gYyAqIHkpIC8gZCxcbiAgICAgICAgICAgICAgdiA9IChwICogeSAtIGMgKiBmKSAvIGQsXG4gICAgICAgICAgICAgIGcgPSBpLnogKiAoMSAtIG0gLSB2KSArIHIueiAqIG0gKyBhLnogKiB2O1xuICAgICAgICAgIGlmIChpc0Zpbml0ZShnKSkgcmV0dXJuIGc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMSAvIDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHggPSAxIC8gMCwgYiA9IDAsIHcgPSBlOyBiIDwgdy5sZW5ndGg7IGIgKz0gMSkge1xuICAgICAgICB4ID0gTWF0aC5taW4oeCwgd1tiXS56KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgdmFyIE1zID0gemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3Nfbm9ybWFsXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX2RhdGFcIixcbiAgICAgIGNvbXBvbmVudHM6IDQsXG4gICAgICB0eXBlOiBcIlVpbnQ4XCJcbiAgICB9XSwgNCkubWVtYmVycyxcbiAgICAgICAgQnMgPSB6aShbe1xuICAgICAgbmFtZTogXCJhX3V2X3hcIixcbiAgICAgIGNvbXBvbmVudHM6IDEsXG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9zcGxpdF9pbmRleFwiLFxuICAgICAgY29tcG9uZW50czogMSxcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiXG4gICAgfV0pLm1lbWJlcnMsXG4gICAgICAgIFRzID0gd3MuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMsXG4gICAgICAgIFZzID0gTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIDM3LjUpLFxuICAgICAgICBGcyA9IE1hdGgucG93KDIsIDE0KSAvIC41LFxuICAgICAgICBEcyA9IGZ1bmN0aW9uIERzKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcztcbiAgICAgIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy5vdmVyc2NhbGluZyA9IHQub3ZlcnNjYWxpbmcsIHRoaXMubGF5ZXJzID0gdC5sYXllcnMsIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KSwgdGhpcy5pbmRleCA9IHQuaW5kZXgsIHRoaXMuaGFzUGF0dGVybiA9ICExLCB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdLCB0aGlzLmxpbmVDbGlwc0FycmF5ID0gW10sIHRoaXMuZ3JhZGllbnRzID0ge30sIHRoaXMubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZS5ncmFkaWVudHNbdC5pZF0gPSB7fTtcbiAgICAgIH0pLCB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IEJpKCksIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyID0gbmV3IFRpKCksIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBxaSgpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBGYSh0LmxheWVycywgdC56b29tKSwgdGhpcy5zZWdtZW50cyA9IG5ldyB1YSgpLCB0aGlzLm1heExpbmVMZW5ndGggPSAwLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaXNTdGF0ZURlcGVuZGVudCgpO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmlkO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIERzLnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0aGlzLmhhc1BhdHRlcm4gPSBvcyhcImxpbmVcIiwgdGhpcy5sYXllcnMsIGUpO1xuXG4gICAgICBmb3IgKHZhciBuID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldChcImxpbmUtc29ydC1rZXlcIiksIGkgPSAhbi5pc0NvbnN0YW50KCksIGEgPSBbXSwgbyA9IDAsIHMgPSB0OyBvIDwgcy5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICB2YXIgdSA9IHNbb10sXG4gICAgICAgICAgICBsID0gdS5mZWF0dXJlLFxuICAgICAgICAgICAgcCA9IHUuaWQsXG4gICAgICAgICAgICBjID0gdS5pbmRleCxcbiAgICAgICAgICAgIGggPSB1LnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBmID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5LFxuICAgICAgICAgICAgeSA9IGphKGwsIGYpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IHVpKHRoaXMuem9vbSksIHksIHIpKSB7XG4gICAgICAgICAgdmFyIGQgPSBpID8gbi5ldmFsdWF0ZSh5LCB7fSwgcikgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIG0gPSB7XG4gICAgICAgICAgICBpZDogcCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGwucHJvcGVydGllcyxcbiAgICAgICAgICAgIHR5cGU6IGwudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IGgsXG4gICAgICAgICAgICBpbmRleDogYyxcbiAgICAgICAgICAgIGdlb21ldHJ5OiBmID8geS5nZW9tZXRyeSA6IFVhKGwpLFxuICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogZFxuICAgICAgICAgIH07XG4gICAgICAgICAgYS5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGkgJiYgYS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgdiA9IDAsIGcgPSBhOyB2IDwgZy5sZW5ndGg7IHYgKz0gMSkge1xuICAgICAgICB2YXIgeCA9IGdbdl0sXG4gICAgICAgICAgICBiID0geC5nZW9tZXRyeSxcbiAgICAgICAgICAgIHcgPSB4LmluZGV4LFxuICAgICAgICAgICAgXyA9IHguc291cmNlTGF5ZXJJbmRleDtcblxuICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgdmFyIEEgPSBzcyhcImxpbmVcIiwgdGhpcy5sYXllcnMsIHgsIHRoaXMuem9vbSwgZSk7XG4gICAgICAgICAgdGhpcy5wYXR0ZXJuRmVhdHVyZXMucHVzaChBKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuYWRkRmVhdHVyZSh4LCBiLCB3LCByLCB7fSk7XG5cbiAgICAgICAgZS5mZWF0dXJlSW5kZXguaW5zZXJ0KHRbd10uZmVhdHVyZSwgYiwgdywgXywgdGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgfSwgRHMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCAmJiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LCBlLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCByKTtcbiAgICB9LCBEcy5wcm90b3R5cGUuYWRkRmVhdHVyZXMgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiA9IDAsIGkgPSB0aGlzLnBhdHRlcm5GZWF0dXJlczsgbiA8IGkubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBpW25dO1xuICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYSwgYS5nZW9tZXRyeSwgYS5pbmRleCwgZSwgcik7XG4gICAgICB9XG4gICAgfSwgRHMucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gMCA9PT0gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgfSwgRHMucHJvdG90eXBlLnVwbG9hZFBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfSwgRHMucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnVwbG9hZGVkIHx8ICgwICE9PSB0aGlzLmxheW91dFZlcnRleEFycmF5Mi5sZW5ndGggJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyMiA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLCBCcykpLCB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIE1zKSwgdGhpcy5pbmRleEJ1ZmZlciA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KSksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZCh0KSwgdGhpcy51cGxvYWRlZCA9ICEwO1xuICAgIH0sIERzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCkpO1xuICAgIH0sIERzLnByb3RvdHlwZS5saW5lRmVhdHVyZUNsaXBzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0LnByb3BlcnRpZXMgJiYgdC5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KFwibWFwYm94X2NsaXBfc3RhcnRcIikgJiYgdC5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KFwibWFwYm94X2NsaXBfZW5kXCIpKSByZXR1cm4ge1xuICAgICAgICBzdGFydDogK3QucHJvcGVydGllcy5tYXBib3hfY2xpcF9zdGFydCxcbiAgICAgICAgZW5kOiArdC5wcm9wZXJ0aWVzLm1hcGJveF9jbGlwX2VuZFxuICAgICAgfTtcbiAgICB9LCBEcy5wcm90b3R5cGUuYWRkRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSA9IHRoaXMubGF5ZXJzWzBdLmxheW91dCxcbiAgICAgICAgICBvID0gYS5nZXQoXCJsaW5lLWpvaW5cIikuZXZhbHVhdGUodCwge30pLFxuICAgICAgICAgIHMgPSBhLmdldChcImxpbmUtY2FwXCIpLFxuICAgICAgICAgIHUgPSBhLmdldChcImxpbmUtbWl0ZXItbGltaXRcIiksXG4gICAgICAgICAgbCA9IGEuZ2V0KFwibGluZS1yb3VuZC1saW1pdFwiKTtcbiAgICAgIHRoaXMubGluZUNsaXBzID0gdGhpcy5saW5lRmVhdHVyZUNsaXBzKHQpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMCwgYyA9IGU7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgIHRoaXMuYWRkTGluZShjW3BdLCB0LCBvLCBzLCB1LCBsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgdCwgciwgaSwgbik7XG4gICAgfSwgRHMucHJvdG90eXBlLmFkZExpbmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgaWYgKHRoaXMuZGlzdGFuY2UgPSAwLCB0aGlzLnNjYWxlZERpc3RhbmNlID0gMCwgdGhpcy50b3RhbERpc3RhbmNlID0gMCwgdGhpcy5saW5lQ2xpcHMpIHtcbiAgICAgICAgdGhpcy5saW5lQ2xpcHNBcnJheS5wdXNoKHRoaXMubGluZUNsaXBzKTtcblxuICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IHQubGVuZ3RoIC0gMTsgbysrKSB7XG4gICAgICAgICAgdGhpcy50b3RhbERpc3RhbmNlICs9IHRbb10uZGlzdCh0W28gKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCksIHRoaXMubWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMubWF4TGluZUxlbmd0aCwgdGhpcy50b3RhbERpc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcyA9IFwiUG9seWdvblwiID09PSBUc1tlLnR5cGVdLCB1ID0gdC5sZW5ndGg7IHUgPj0gMiAmJiB0W3UgLSAxXS5lcXVhbHModFt1IC0gMl0pOykge1xuICAgICAgICB1LS07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgdSAtIDEgJiYgdFtsXS5lcXVhbHModFtsICsgMV0pOykge1xuICAgICAgICBsKys7XG4gICAgICB9XG5cbiAgICAgIGlmICghKHUgPCAocyA/IDMgOiAyKSkpIHtcbiAgICAgICAgXCJiZXZlbFwiID09PSByICYmIChpID0gMS4wNSk7XG4gICAgICAgIHZhciBwLFxuICAgICAgICAgICAgYyA9IHRoaXMub3ZlcnNjYWxpbmcgPD0gMTYgPyAxMjI4ODAgLyAoNTEyICogdGhpcy5vdmVyc2NhbGluZykgOiAwLFxuICAgICAgICAgICAgaCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoMTAgKiB1LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpLFxuICAgICAgICAgICAgZiA9IHZvaWQgMCxcbiAgICAgICAgICAgIHkgPSB2b2lkIDAsXG4gICAgICAgICAgICBkID0gdm9pZCAwLFxuICAgICAgICAgICAgbSA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMSwgcyAmJiAobSA9IHRbbF0uc3ViKHAgPSB0W3UgLSAyXSkuX3VuaXQoKS5fcGVycCgpKTtcblxuICAgICAgICBmb3IgKHZhciB2ID0gbDsgdiA8IHU7IHYrKykge1xuICAgICAgICAgIGlmICghKHkgPSB2ID09PSB1IC0gMSA/IHMgPyB0W2wgKyAxXSA6IHZvaWQgMCA6IHRbdiArIDFdKSB8fCAhdFt2XS5lcXVhbHMoeSkpIHtcbiAgICAgICAgICAgIG0gJiYgKGQgPSBtKSwgcCAmJiAoZiA9IHApLCBwID0gdFt2XSwgbSA9IHkgPyB5LnN1YihwKS5fdW5pdCgpLl9wZXJwKCkgOiBkO1xuICAgICAgICAgICAgdmFyIGcgPSAoZCA9IGQgfHwgbSkuYWRkKG0pO1xuICAgICAgICAgICAgMCA9PT0gZy54ICYmIDAgPT09IGcueSB8fCBnLl91bml0KCk7XG5cbiAgICAgICAgICAgIHZhciB4ID0gZC54ICogbS54ICsgZC55ICogbS55LFxuICAgICAgICAgICAgICAgIGIgPSBnLnggKiBtLnggKyBnLnkgKiBtLnksXG4gICAgICAgICAgICAgICAgdyA9IDAgIT09IGIgPyAxIC8gYiA6IDEgLyAwLFxuICAgICAgICAgICAgICAgIF8gPSAyICogTWF0aC5zcXJ0KDIgLSAyICogYiksXG4gICAgICAgICAgICAgICAgQSA9IGIgPCBWcyAmJiBmICYmIHksXG4gICAgICAgICAgICAgICAgUyA9IGQueCAqIG0ueSAtIGQueSAqIG0ueCA+IDA7XG5cbiAgICAgICAgICAgIGlmIChBICYmIHYgPiBsKSB7XG4gICAgICAgICAgICAgIHZhciBrID0gcC5kaXN0KGYpO1xuXG4gICAgICAgICAgICAgIGlmIChrID4gMiAqIGMpIHtcbiAgICAgICAgICAgICAgICB2YXIgSSA9IHAuc3ViKHAuc3ViKGYpLl9tdWx0KGMgLyBrKS5fcm91bmQoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZShmLCBJKSwgdGhpcy5hZGRDdXJyZW50VmVydGV4KEksIGQsIDAsIDAsIGgpLCBmID0gSTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeiA9IGYgJiYgeSxcbiAgICAgICAgICAgICAgICBDID0geiA/IHIgOiBzID8gXCJidXR0XCIgOiBuO1xuICAgICAgICAgICAgaWYgKHogJiYgXCJyb3VuZFwiID09PSBDICYmICh3IDwgYSA/IEMgPSBcIm1pdGVyXCIgOiB3IDw9IDIgJiYgKEMgPSBcImZha2Vyb3VuZFwiKSksIFwibWl0ZXJcIiA9PT0gQyAmJiB3ID4gaSAmJiAoQyA9IFwiYmV2ZWxcIiksIFwiYmV2ZWxcIiA9PT0gQyAmJiAodyA+IDIgJiYgKEMgPSBcImZsaXBiZXZlbFwiKSwgdyA8IGkgJiYgKEMgPSBcIm1pdGVyXCIpKSwgZiAmJiB0aGlzLnVwZGF0ZURpc3RhbmNlKGYsIHApLCBcIm1pdGVyXCIgPT09IEMpIGcuX211bHQodyksIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBnLCAwLCAwLCBoKTtlbHNlIGlmIChcImZsaXBiZXZlbFwiID09PSBDKSB7XG4gICAgICAgICAgICAgIGlmICh3ID4gMTAwKSBnID0gbS5tdWx0KC0xKTtlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgRSA9IHcgKiBkLmFkZChtKS5tYWcoKSAvIGQuc3ViKG0pLm1hZygpO1xuXG4gICAgICAgICAgICAgICAgZy5fcGVycCgpLl9tdWx0KEUgKiAoUyA/IC0xIDogMSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBnLCAwLCAwLCBoKSwgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIGcubXVsdCgtMSksIDAsIDAsIGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcImJldmVsXCIgPT09IEMgfHwgXCJmYWtlcm91bmRcIiA9PT0gQykge1xuICAgICAgICAgICAgICB2YXIgUCA9IC1NYXRoLnNxcnQodyAqIHcgLSAxKSxcbiAgICAgICAgICAgICAgICAgIE0gPSBTID8gUCA6IDAsXG4gICAgICAgICAgICAgICAgICBCID0gUyA/IDAgOiBQO1xuICAgICAgICAgICAgICBpZiAoZiAmJiB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgZCwgTSwgQiwgaCksIFwiZmFrZXJvdW5kXCIgPT09IEMpIGZvciAodmFyIFQgPSBNYXRoLnJvdW5kKDE4MCAqIF8gLyBNYXRoLlBJIC8gMjApLCBWID0gMTsgViA8IFQ7IFYrKykge1xuICAgICAgICAgICAgICAgIHZhciBGID0gViAvIFQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoLjUgIT09IEYpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBEID0gRiAtIC41O1xuICAgICAgICAgICAgICAgICAgRiArPSBGICogRCAqIChGIC0gMSkgKiAoKDEuMDkwNCArIHggKiAoeCAqICgzLjU1NjQ1IC0gMS40MzUxOSAqIHgpIC0gMy4yNDUyKSkgKiBEICogRCArICguODQ4MDEzICsgeCAqICguMjE1NjM4ICogeCAtIDEuMDYwMjEpKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIEwgPSBtLnN1YihkKS5fbXVsdChGKS5fYWRkKGQpLl91bml0KCkuX211bHQoUyA/IC0xIDogMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgocCwgTC54LCBMLnksICExLCBTLCAwLCBoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB5ICYmIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBtLCAtTSwgLUIsIGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcImJ1dHRcIiA9PT0gQykgdGhpcy5hZGRDdXJyZW50VmVydGV4KHAsIGcsIDAsIDAsIGgpO2Vsc2UgaWYgKFwic3F1YXJlXCIgPT09IEMpIHtcbiAgICAgICAgICAgICAgdmFyIFIgPSBmID8gMSA6IC0xO1xuICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgZywgUiwgUiwgaCk7XG4gICAgICAgICAgICB9IGVsc2UgXCJyb3VuZFwiID09PSBDICYmIChmICYmICh0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgZCwgMCwgMCwgaCksIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBkLCAxLCAxLCBoLCAhMCkpLCB5ICYmICh0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgocCwgbSwgLTEsIC0xLCBoLCAhMCksIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBtLCAwLCAwLCBoKSkpO1xuXG4gICAgICAgICAgICBpZiAoQSAmJiB2IDwgdSAtIDEpIHtcbiAgICAgICAgICAgICAgdmFyIE8gPSBwLmRpc3QoeSk7XG5cbiAgICAgICAgICAgICAgaWYgKE8gPiAyICogYykge1xuICAgICAgICAgICAgICAgIHZhciBVID0gcC5hZGQoeS5zdWIocCkuX211bHQoYyAvIE8pLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlKHAsIFUpLCB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoVSwgbSwgMCwgMCwgaCksIHAgPSBVO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgRHMucHJvdG90eXBlLmFkZEN1cnJlbnRWZXJ0ZXggPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdm9pZCAwID09PSBhICYmIChhID0gITEpO1xuICAgICAgdmFyIG8gPSBlLnkgKiBuIC0gZS54LFxuICAgICAgICAgIHMgPSAtZS55IC0gZS54ICogbjtcbiAgICAgIHRoaXMuYWRkSGFsZlZlcnRleCh0LCBlLnggKyBlLnkgKiByLCBlLnkgLSBlLnggKiByLCBhLCAhMSwgciwgaSksIHRoaXMuYWRkSGFsZlZlcnRleCh0LCBvLCBzLCBhLCAhMCwgLW4sIGkpLCB0aGlzLmRpc3RhbmNlID4gRnMgLyAyICYmIDAgPT09IHRoaXMudG90YWxEaXN0YW5jZSAmJiAodGhpcy5kaXN0YW5jZSA9IDAsIHRoaXMuYWRkQ3VycmVudFZlcnRleCh0LCBlLCByLCBuLCBpLCBhKSk7XG4gICAgfSwgRHMucHJvdG90eXBlLmFkZEhhbGZWZXJ0ZXggPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSwgYSwgbykge1xuICAgICAgdmFyIHMgPSAuNSAqICh0aGlzLmxpbmVDbGlwcyA/IHRoaXMuc2NhbGVkRGlzdGFuY2UgKiAoRnMgLSAxKSA6IHRoaXMuc2NhbGVkRGlzdGFuY2UpO1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjaygodC54IDw8IDEpICsgKG4gPyAxIDogMCksICh0LnkgPDwgMSkgKyAoaSA/IDEgOiAwKSwgTWF0aC5yb3VuZCg2MyAqIGUpICsgMTI4LCBNYXRoLnJvdW5kKDYzICogcikgKyAxMjgsIDEgKyAoMCA9PT0gYSA/IDAgOiBhIDwgMCA/IC0xIDogMSkgfCAoNjMgJiBzKSA8PCAyLCBzID4+IDYpLCB0aGlzLmxpbmVDbGlwcyAmJiB0aGlzLmxheW91dFZlcnRleEFycmF5Mi5lbXBsYWNlQmFjaygodGhpcy5zY2FsZWREaXN0YW5jZSAtIHRoaXMubGluZUNsaXBzLnN0YXJ0KSAvICh0aGlzLmxpbmVDbGlwcy5lbmQgLSB0aGlzLmxpbmVDbGlwcy5zdGFydCksIHRoaXMubGluZUNsaXBzQXJyYXkubGVuZ3RoKTtcbiAgICAgIHZhciB1ID0gby52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgIHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDAgJiYgKHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCB1KSwgby5wcmltaXRpdmVMZW5ndGgrKyksIGkgPyB0aGlzLmUyID0gdSA6IHRoaXMuZTEgPSB1O1xuICAgIH0sIERzLnByb3RvdHlwZS51cGRhdGVTY2FsZWREaXN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSB0aGlzLmxpbmVDbGlwcyA/IHRoaXMubGluZUNsaXBzLnN0YXJ0ICsgKHRoaXMubGluZUNsaXBzLmVuZCAtIHRoaXMubGluZUNsaXBzLnN0YXJ0KSAqIHRoaXMuZGlzdGFuY2UgLyB0aGlzLnRvdGFsRGlzdGFuY2UgOiB0aGlzLmRpc3RhbmNlO1xuICAgIH0sIERzLnByb3RvdHlwZS51cGRhdGVEaXN0YW5jZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLmRpc3RhbmNlICs9IHQuZGlzdChlKSwgdGhpcy51cGRhdGVTY2FsZWREaXN0YW5jZSgpO1xuICAgIH0sIE9uKFwiTGluZUJ1Y2tldFwiLCBEcywge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCIsIFwicGF0dGVybkZlYXR1cmVzXCJdXG4gICAgfSk7XG4gICAgdmFyIExzID0gbmV3IF9pKHtcbiAgICAgIFwibGluZS1jYXBcIjogbmV3IHZpKFB0LmxheW91dF9saW5lW1wibGluZS1jYXBcIl0pLFxuICAgICAgXCJsaW5lLWpvaW5cIjogbmV3IGdpKFB0LmxheW91dF9saW5lW1wibGluZS1qb2luXCJdKSxcbiAgICAgIFwibGluZS1taXRlci1saW1pdFwiOiBuZXcgdmkoUHQubGF5b3V0X2xpbmVbXCJsaW5lLW1pdGVyLWxpbWl0XCJdKSxcbiAgICAgIFwibGluZS1yb3VuZC1saW1pdFwiOiBuZXcgdmkoUHQubGF5b3V0X2xpbmVbXCJsaW5lLXJvdW5kLWxpbWl0XCJdKSxcbiAgICAgIFwibGluZS1zb3J0LWtleVwiOiBuZXcgZ2koUHQubGF5b3V0X2xpbmVbXCJsaW5lLXNvcnQta2V5XCJdKVxuICAgIH0pLFxuICAgICAgICBScyA9IHtcbiAgICAgIHBhaW50OiBuZXcgX2koe1xuICAgICAgICBcImxpbmUtb3BhY2l0eVwiOiBuZXcgZ2koUHQucGFpbnRfbGluZVtcImxpbmUtb3BhY2l0eVwiXSksXG4gICAgICAgIFwibGluZS1jb2xvclwiOiBuZXcgZ2koUHQucGFpbnRfbGluZVtcImxpbmUtY29sb3JcIl0pLFxuICAgICAgICBcImxpbmUtdHJhbnNsYXRlXCI6IG5ldyB2aShQdC5wYWludF9saW5lW1wibGluZS10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgdmkoUHQucGFpbnRfbGluZVtcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgICAgIFwibGluZS13aWR0aFwiOiBuZXcgZ2koUHQucGFpbnRfbGluZVtcImxpbmUtd2lkdGhcIl0pLFxuICAgICAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IG5ldyBnaShQdC5wYWludF9saW5lW1wibGluZS1nYXAtd2lkdGhcIl0pLFxuICAgICAgICBcImxpbmUtb2Zmc2V0XCI6IG5ldyBnaShQdC5wYWludF9saW5lW1wibGluZS1vZmZzZXRcIl0pLFxuICAgICAgICBcImxpbmUtYmx1clwiOiBuZXcgZ2koUHQucGFpbnRfbGluZVtcImxpbmUtYmx1clwiXSksXG4gICAgICAgIFwibGluZS1kYXNoYXJyYXlcIjogbmV3IGJpKFB0LnBhaW50X2xpbmVbXCJsaW5lLWRhc2hhcnJheVwiXSksXG4gICAgICAgIFwibGluZS1wYXR0ZXJuXCI6IG5ldyB4aShQdC5wYWludF9saW5lW1wibGluZS1wYXR0ZXJuXCJdKSxcbiAgICAgICAgXCJsaW5lLWdyYWRpZW50XCI6IG5ldyB3aShQdC5wYWludF9saW5lW1wibGluZS1ncmFkaWVudFwiXSlcbiAgICAgIH0pLFxuICAgICAgbGF5b3V0OiBMc1xuICAgIH0sXG4gICAgICAgIE9zID0gbmV3IChmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgcmV0dXJuIHIgPSBuZXcgdWkoTWF0aC5mbG9vcihyLnpvb20pLCB7XG4gICAgICAgICAgbm93OiByLm5vdyxcbiAgICAgICAgICBmYWRlRHVyYXRpb246IHIuZmFkZUR1cmF0aW9uLFxuICAgICAgICAgIHpvb21IaXN0b3J5OiByLnpvb21IaXN0b3J5LFxuICAgICAgICAgIHRyYW5zaXRpb246IHIudHJhbnNpdGlvblxuICAgICAgICB9KSwgdC5wcm90b3R5cGUucG9zc2libHlFdmFsdWF0ZS5jYWxsKHRoaXMsIGUsIHIpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiAoZSwgciwgbiwgaSkge1xuICAgICAgICByZXR1cm4gciA9IGgoe30sIHIsIHtcbiAgICAgICAgICB6b29tOiBNYXRoLmZsb29yKHIuem9vbSlcbiAgICAgICAgfSksIHQucHJvdG90eXBlLmV2YWx1YXRlLmNhbGwodGhpcywgZSwgciwgbiwgaSk7XG4gICAgICB9LCBlO1xuICAgIH0oZ2kpKShScy5wYWludC5wcm9wZXJ0aWVzW1wibGluZS13aWR0aFwiXS5zcGVjaWZpY2F0aW9uKTtcbiAgICBPcy51c2VJbnRlZ2VyWm9vbSA9ICEwO1xuXG4gICAgdmFyIFVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgUnMpLCB0aGlzLmdyYWRpZW50VmVyc2lvbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLl9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIFwibGluZS1ncmFkaWVudFwiID09PSB0ICYmICh0aGlzLnN0ZXBJbnRlcnBvbGFudCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tcImxpbmUtZ3JhZGllbnRcIl0udmFsdWUuZXhwcmVzc2lvbi5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBLZSwgdGhpcy5ncmFkaWVudFZlcnNpb24gPSAodGhpcy5ncmFkaWVudFZlcnNpb24gKyAxKSAlIHMpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZ3JhZGllbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW1wibGluZS1ncmFkaWVudFwiXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgfSwgZS5wcm90b3R5cGUucmVjYWxjdWxhdGUgPSBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICB0LnByb3RvdHlwZS5yZWNhbGN1bGF0ZS5jYWxsKHRoaXMsIGUsIHIpLCB0aGlzLnBhaW50Ll92YWx1ZXNbXCJsaW5lLWZsb29yd2lkdGhcIl0gPSBPcy5wb3NzaWJseUV2YWx1YXRlKHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5fdmFsdWVzW1wibGluZS13aWR0aFwiXS52YWx1ZSwgZSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbmV3IERzKHQpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlSYWRpdXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQsXG4gICAgICAgICAgICByID0ganMoZW8oXCJsaW5lLXdpZHRoXCIsIHRoaXMsIGUpLCBlbyhcImxpbmUtZ2FwLXdpZHRoXCIsIHRoaXMsIGUpKSxcbiAgICAgICAgICAgIG4gPSBlbyhcImxpbmUtb2Zmc2V0XCIsIHRoaXMsIGUpO1xuICAgICAgICByZXR1cm4gciAvIDIgKyBNYXRoLmFicyhuKSArIHJvKHRoaXMucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGVcIikpO1xuICAgICAgfSwgZS5wcm90b3R5cGUucXVlcnlJbnRlcnNlY3RzRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBhLCBvLCBzKSB7XG4gICAgICAgIHZhciB1ID0gbm8odCwgdGhpcy5wYWludC5nZXQoXCJsaW5lLXRyYW5zbGF0ZVwiKSwgdGhpcy5wYWludC5nZXQoXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIiksIG8uYW5nbGUsIHMpLFxuICAgICAgICAgICAgbCA9IHMgLyAyICoganModGhpcy5wYWludC5nZXQoXCJsaW5lLXdpZHRoXCIpLmV2YWx1YXRlKGUsIHIpLCB0aGlzLnBhaW50LmdldChcImxpbmUtZ2FwLXdpZHRoXCIpLmV2YWx1YXRlKGUsIHIpKSxcbiAgICAgICAgICAgIHAgPSB0aGlzLnBhaW50LmdldChcImxpbmUtb2Zmc2V0XCIpLmV2YWx1YXRlKGUsIHIpO1xuICAgICAgICByZXR1cm4gcCAmJiAobiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgZm9yICh2YXIgciA9IFtdLCBuID0gbmV3IGkoMCwgMCksIGEgPSAwOyBhIDwgdC5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgZm9yICh2YXIgbyA9IHRbYV0sIHMgPSBbXSwgdSA9IDA7IHUgPCBvLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsID0gb1t1XSxcbiAgICAgICAgICAgICAgICAgIHAgPSBvW3UgKyAxXSxcbiAgICAgICAgICAgICAgICAgIGMgPSAwID09PSB1ID8gbiA6IGwuc3ViKG9bdSAtIDFdKS5fdW5pdCgpLl9wZXJwKCksXG4gICAgICAgICAgICAgICAgICBoID0gdSA9PT0gby5sZW5ndGggLSAxID8gbiA6IHAuc3ViKGwpLl91bml0KCkuX3BlcnAoKSxcbiAgICAgICAgICAgICAgICAgIGYgPSBjLl9hZGQoaCkuX3VuaXQoKTtcblxuICAgICAgICAgICAgICBmLl9tdWx0KDEgLyAoZi54ICogaC54ICsgZi55ICogaC55KSksIHMucHVzaChmLl9tdWx0KGUpLl9hZGQobCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByLnB1c2gocyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH0obiwgcCAqIHMpKSwgZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIHZhciBpID0gZVtuXTtcbiAgICAgICAgICAgIGlmICh0Lmxlbmd0aCA+PSAzKSBmb3IgKHZhciBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgICAgaWYgKFFhKHQsIGlbYV0pKSByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoWGEodCwgaSwgcikpIHJldHVybiAhMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH0odSwgbiwgbCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5pc1RpbGVDbGlwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9LCBlO1xuICAgIH0oQWkpO1xuXG4gICAgZnVuY3Rpb24ganModCwgZSkge1xuICAgICAgcmV0dXJuIGUgPiAwID8gZSArIDIgKiB0IDogdDtcbiAgICB9XG5cbiAgICB2YXIgcXMgPSB6aShbe1xuICAgICAgbmFtZTogXCJhX3Bvc19vZmZzZXRcIixcbiAgICAgIGNvbXBvbmVudHM6IDQsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfZGF0YVwiLFxuICAgICAgY29tcG9uZW50czogNCxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfcGl4ZWxvZmZzZXRcIixcbiAgICAgIGNvbXBvbmVudHM6IDQsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9XSwgNCksXG4gICAgICAgIE5zID0gemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wcm9qZWN0ZWRfcG9zXCIsXG4gICAgICBjb21wb25lbnRzOiAzLFxuICAgICAgdHlwZTogXCJGbG9hdDMyXCJcbiAgICB9XSwgNCksXG4gICAgICAgIEtzID0gKHppKFt7XG4gICAgICBuYW1lOiBcImFfZmFkZV9vcGFjaXR5XCIsXG4gICAgICBjb21wb25lbnRzOiAxLFxuICAgICAgdHlwZTogXCJVaW50MzJcIlxuICAgIH1dLCA0KSwgemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wbGFjZWRcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIlVpbnQ4XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfc2hpZnRcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIlxuICAgIH1dKSksXG4gICAgICAgIEdzID0gKHppKFt7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImFuY2hvclBvaW50WFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJhbmNob3JQb2ludFlcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieDFcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieTFcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieDJcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieTJcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcImZlYXR1cmVJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwic291cmNlTGF5ZXJJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwiYnVja2V0SW5kZXhcIlxuICAgIH1dKSwgemkoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3NcIixcbiAgICAgIGNvbXBvbmVudHM6IDIsXG4gICAgICB0eXBlOiBcIkludDE2XCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfYW5jaG9yX3Bvc1wiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiSW50MTZcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiYV9leHRydWRlXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpKSxcbiAgICAgICAgWnMgPSB6aShbe1xuICAgICAgbmFtZTogXCJhX3Bvc1wiLFxuICAgICAgY29tcG9uZW50czogMixcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX3JhZGl1c1wiLFxuICAgICAgY29tcG9uZW50czogMSxcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJhX2ZsYWdzXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgdHlwZTogXCJJbnQxNlwiXG4gICAgfV0sIDQpO1xuXG4gICAgZnVuY3Rpb24gWHModCwgZSwgcikge1xuICAgICAgcmV0dXJuIHQuc2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnRleHQgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgIHZhciBuID0gZS5sYXlvdXQuZ2V0KFwidGV4dC10cmFuc2Zvcm1cIikuZXZhbHVhdGUociwge30pO1xuICAgICAgICAgIHJldHVybiBcInVwcGVyY2FzZVwiID09PSBuID8gdCA9IHQudG9Mb2NhbGVVcHBlckNhc2UoKSA6IFwibG93ZXJjYXNlXCIgPT09IG4gJiYgKHQgPSB0LnRvTG9jYWxlTG93ZXJDYXNlKCkpLCBzaS5hcHBseUFyYWJpY1NoYXBpbmcgJiYgKHQgPSBzaS5hcHBseUFyYWJpY1NoYXBpbmcodCkpLCB0O1xuICAgICAgICB9KHQudGV4dCwgZSwgcik7XG4gICAgICB9KSwgdDtcbiAgICB9XG5cbiAgICB6aShbe1xuICAgICAgbmFtZTogXCJ0cmlhbmdsZVwiLFxuICAgICAgY29tcG9uZW50czogMyxcbiAgICAgIHR5cGU6IFwiVWludDE2XCJcbiAgICB9XSksIHppKFt7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImFuY2hvclhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwiYW5jaG9yWVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwiZ2x5cGhTdGFydEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJudW1HbHlwaHNcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcInZlcnRleFN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDMyXCIsXG4gICAgICBuYW1lOiBcImxpbmVTdGFydEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQzMlwiLFxuICAgICAgbmFtZTogXCJsaW5lTGVuZ3RoXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJzZWdtZW50XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJsb3dlclNpemVcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInVwcGVyU2l6ZVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICBuYW1lOiBcImxpbmVPZmZzZXRYXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgIG5hbWU6IFwibGluZU9mZnNldFlcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDhcIixcbiAgICAgIG5hbWU6IFwid3JpdGluZ01vZGVcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDhcIixcbiAgICAgIG5hbWU6IFwicGxhY2VkT3JpZW50YXRpb25cIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDhcIixcbiAgICAgIG5hbWU6IFwiaGlkZGVuXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQzMlwiLFxuICAgICAgbmFtZTogXCJjcm9zc1RpbGVJRFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJhc3NvY2lhdGVkSWNvbkluZGV4XCJcbiAgICB9XSksIHppKFt7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcImFuY2hvclhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwiYW5jaG9yWVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJyaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJjZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwibGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJwbGFjZWRJY29uU3ltYm9sSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwidmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcImtleVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidGV4dEJveFN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInRleHRCb3hFbmRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidmVydGljYWxUZXh0Qm94U3RhcnRJbmRleFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwidmVydGljYWxUZXh0Qm94RW5kSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcImljb25Cb3hTdGFydEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJpY29uQm94RW5kSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInZlcnRpY2FsSWNvbkJveEVuZEluZGV4XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJmZWF0dXJlSW5kZXhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcIm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQxNlwiLFxuICAgICAgbmFtZTogXCJudW1WZXJ0aWNhbEdseXBoVmVydGljZXNcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcIm51bUljb25WZXJ0aWNlc1wiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJVaW50MTZcIixcbiAgICAgIG5hbWU6IFwibnVtVmVydGljYWxJY29uVmVydGljZXNcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiVWludDE2XCIsXG4gICAgICBuYW1lOiBcInVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzXCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIlVpbnQzMlwiLFxuICAgICAgbmFtZTogXCJjcm9zc1RpbGVJRFwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICBuYW1lOiBcInRleHRCb3hTY2FsZVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJGbG9hdDMyXCIsXG4gICAgICBjb21wb25lbnRzOiAyLFxuICAgICAgbmFtZTogXCJ0ZXh0T2Zmc2V0XCJcbiAgICB9LCB7XG4gICAgICB0eXBlOiBcIkZsb2F0MzJcIixcbiAgICAgIG5hbWU6IFwiY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXJcIlxuICAgIH1dKSwgemkoW3tcbiAgICAgIHR5cGU6IFwiRmxvYXQzMlwiLFxuICAgICAgbmFtZTogXCJvZmZzZXRYXCJcbiAgICB9XSksIHppKFt7XG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBuYW1lOiBcInhcIlxuICAgIH0sIHtcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIG5hbWU6IFwieVwiXG4gICAgfSwge1xuICAgICAgdHlwZTogXCJJbnQxNlwiLFxuICAgICAgbmFtZTogXCJ0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvclwiXG4gICAgfV0pO1xuXG4gICAgdmFyIEpzID0ge1xuICAgICAgXCIhXCI6IFwi77iVXCIsXG4gICAgICBcIiNcIjogXCLvvINcIixcbiAgICAgICQ6IFwi77yEXCIsXG4gICAgICBcIiVcIjogXCLvvIVcIixcbiAgICAgIFwiJlwiOiBcIu+8hlwiLFxuICAgICAgXCIoXCI6IFwi77i1XCIsXG4gICAgICBcIilcIjogXCLvuLZcIixcbiAgICAgIFwiKlwiOiBcIu+8ilwiLFxuICAgICAgXCIrXCI6IFwi77yLXCIsXG4gICAgICBcIixcIjogXCLvuJBcIixcbiAgICAgIFwiLVwiOiBcIu+4slwiLFxuICAgICAgXCIuXCI6IFwi44O7XCIsXG4gICAgICBcIi9cIjogXCLvvI9cIixcbiAgICAgIFwiOlwiOiBcIu+4k1wiLFxuICAgICAgXCI7XCI6IFwi77iUXCIsXG4gICAgICBcIjxcIjogXCLvuL9cIixcbiAgICAgIFwiPVwiOiBcIu+8nVwiLFxuICAgICAgXCI+XCI6IFwi77mAXCIsXG4gICAgICBcIj9cIjogXCLvuJZcIixcbiAgICAgIFwiQFwiOiBcIu+8oFwiLFxuICAgICAgXCJbXCI6IFwi77mHXCIsXG4gICAgICBcIlxcXFxcIjogXCLvvLxcIixcbiAgICAgIFwiXVwiOiBcIu+5iFwiLFxuICAgICAgXCJeXCI6IFwi77y+XCIsXG4gICAgICBfOiBcIu+4s1wiLFxuICAgICAgXCJgXCI6IFwi772AXCIsXG4gICAgICBcIntcIjogXCLvuLdcIixcbiAgICAgIFwifFwiOiBcIuKAlVwiLFxuICAgICAgXCJ9XCI6IFwi77i4XCIsXG4gICAgICBcIn5cIjogXCLvvZ5cIixcbiAgICAgIFwiwqJcIjogXCLvv6BcIixcbiAgICAgIFwiwqNcIjogXCLvv6FcIixcbiAgICAgIFwiwqVcIjogXCLvv6VcIixcbiAgICAgIFwiwqZcIjogXCLvv6RcIixcbiAgICAgIFwiwqxcIjogXCLvv6JcIixcbiAgICAgIFwiwq9cIjogXCLvv6NcIixcbiAgICAgIFwi4oCTXCI6IFwi77iyXCIsXG4gICAgICBcIuKAlFwiOiBcIu+4sVwiLFxuICAgICAgXCLigJhcIjogXCLvuYNcIixcbiAgICAgIFwi4oCZXCI6IFwi77mEXCIsXG4gICAgICBcIuKAnFwiOiBcIu+5gVwiLFxuICAgICAgXCLigJ1cIjogXCLvuYJcIixcbiAgICAgIFwi4oCmXCI6IFwi77iZXCIsXG4gICAgICBcIuKAp1wiOiBcIuODu1wiLFxuICAgICAgXCLigqlcIjogXCLvv6ZcIixcbiAgICAgIFwi44CBXCI6IFwi77iRXCIsXG4gICAgICBcIuOAglwiOiBcIu+4klwiLFxuICAgICAgXCLjgIhcIjogXCLvuL9cIixcbiAgICAgIFwi44CJXCI6IFwi77mAXCIsXG4gICAgICBcIuOAilwiOiBcIu+4vVwiLFxuICAgICAgXCLjgItcIjogXCLvuL5cIixcbiAgICAgIFwi44CMXCI6IFwi77mBXCIsXG4gICAgICBcIuOAjVwiOiBcIu+5glwiLFxuICAgICAgXCLjgI5cIjogXCLvuYNcIixcbiAgICAgIFwi44CPXCI6IFwi77mEXCIsXG4gICAgICBcIuOAkFwiOiBcIu+4u1wiLFxuICAgICAgXCLjgJFcIjogXCLvuLxcIixcbiAgICAgIFwi44CUXCI6IFwi77i5XCIsXG4gICAgICBcIuOAlVwiOiBcIu+4ulwiLFxuICAgICAgXCLjgJZcIjogXCLvuJdcIixcbiAgICAgIFwi44CXXCI6IFwi77iYXCIsXG4gICAgICBcIu+8gVwiOiBcIu+4lVwiLFxuICAgICAgXCLvvIhcIjogXCLvuLVcIixcbiAgICAgIFwi77yJXCI6IFwi77i2XCIsXG4gICAgICBcIu+8jFwiOiBcIu+4kFwiLFxuICAgICAgXCLvvI1cIjogXCLvuLJcIixcbiAgICAgIFwi77yOXCI6IFwi44O7XCIsXG4gICAgICBcIu+8mlwiOiBcIu+4k1wiLFxuICAgICAgXCLvvJtcIjogXCLvuJRcIixcbiAgICAgIFwi77ycXCI6IFwi77i/XCIsXG4gICAgICBcIu+8nlwiOiBcIu+5gFwiLFxuICAgICAgXCLvvJ9cIjogXCLvuJZcIixcbiAgICAgIFwi77y7XCI6IFwi77mHXCIsXG4gICAgICBcIu+8vVwiOiBcIu+5iFwiLFxuICAgICAgXCLvvL9cIjogXCLvuLNcIixcbiAgICAgIFwi772bXCI6IFwi77i3XCIsXG4gICAgICBcIu+9nFwiOiBcIuKAlVwiLFxuICAgICAgXCLvvZ1cIjogXCLvuLhcIixcbiAgICAgIFwi772fXCI6IFwi77i1XCIsXG4gICAgICBcIu+9oFwiOiBcIu+4tlwiLFxuICAgICAgXCLvvaFcIjogXCLvuJJcIixcbiAgICAgIFwi772iXCI6IFwi77mBXCIsXG4gICAgICBcIu+9o1wiOiBcIu+5glwiXG4gICAgfSxcbiAgICAgICAgSHMgPSBmdW5jdGlvbiBIcyh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB2YXIgYSxcbiAgICAgICAgICBvLFxuICAgICAgICAgIHMgPSA4ICogaSAtIG4gLSAxLFxuICAgICAgICAgIHUgPSAoMSA8PCBzKSAtIDEsXG4gICAgICAgICAgbCA9IHUgPj4gMSxcbiAgICAgICAgICBwID0gLTcsXG4gICAgICAgICAgYyA9IHIgPyBpIC0gMSA6IDAsXG4gICAgICAgICAgaCA9IHIgPyAtMSA6IDEsXG4gICAgICAgICAgZiA9IHRbZSArIGNdO1xuXG4gICAgICBmb3IgKGMgKz0gaCwgYSA9IGYgJiAoMSA8PCAtcCkgLSAxLCBmID4+PSAtcCwgcCArPSBzOyBwID4gMDsgYSA9IDI1NiAqIGEgKyB0W2UgKyBjXSwgYyArPSBoLCBwIC09IDgpIHtcbiAgICAgICAgO1xuICAgICAgfVxuXG4gICAgICBmb3IgKG8gPSBhICYgKDEgPDwgLXApIC0gMSwgYSA+Pj0gLXAsIHAgKz0gbjsgcCA+IDA7IG8gPSAyNTYgKiBvICsgdFtlICsgY10sIGMgKz0gaCwgcCAtPSA4KSB7XG4gICAgICAgIDtcbiAgICAgIH1cblxuICAgICAgaWYgKDAgPT09IGEpIGEgPSAxIC0gbDtlbHNlIHtcbiAgICAgICAgaWYgKGEgPT09IHUpIHJldHVybiBvID8gTmFOIDogMSAvIDAgKiAoZiA/IC0xIDogMSk7XG4gICAgICAgIG8gKz0gTWF0aC5wb3coMiwgbiksIGEgLT0gbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoZiA/IC0xIDogMSkgKiBvICogTWF0aC5wb3coMiwgYSAtIG4pO1xuICAgIH0sXG4gICAgICAgIFlzID0gZnVuY3Rpb24gWXModCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgdmFyIG8sXG4gICAgICAgICAgcyxcbiAgICAgICAgICB1LFxuICAgICAgICAgIGwgPSA4ICogYSAtIGkgLSAxLFxuICAgICAgICAgIHAgPSAoMSA8PCBsKSAtIDEsXG4gICAgICAgICAgYyA9IHAgPj4gMSxcbiAgICAgICAgICBoID0gMjMgPT09IGkgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDAsXG4gICAgICAgICAgZiA9IG4gPyAwIDogYSAtIDEsXG4gICAgICAgICAgeSA9IG4gPyAxIDogLTEsXG4gICAgICAgICAgZCA9IGUgPCAwIHx8IDAgPT09IGUgJiYgMSAvIGUgPCAwID8gMSA6IDA7XG5cbiAgICAgIGZvciAoZSA9IE1hdGguYWJzKGUpLCBpc05hTihlKSB8fCBlID09PSAxIC8gMCA/IChzID0gaXNOYU4oZSkgPyAxIDogMCwgbyA9IHApIDogKG8gPSBNYXRoLmZsb29yKE1hdGgubG9nKGUpIC8gTWF0aC5MTjIpLCBlICogKHUgPSBNYXRoLnBvdygyLCAtbykpIDwgMSAmJiAoby0tLCB1ICo9IDIpLCAoZSArPSBvICsgYyA+PSAxID8gaCAvIHUgOiBoICogTWF0aC5wb3coMiwgMSAtIGMpKSAqIHUgPj0gMiAmJiAobysrLCB1IC89IDIpLCBvICsgYyA+PSBwID8gKHMgPSAwLCBvID0gcCkgOiBvICsgYyA+PSAxID8gKHMgPSAoZSAqIHUgLSAxKSAqIE1hdGgucG93KDIsIGkpLCBvICs9IGMpIDogKHMgPSBlICogTWF0aC5wb3coMiwgYyAtIDEpICogTWF0aC5wb3coMiwgaSksIG8gPSAwKSk7IGkgPj0gODsgdFtyICsgZl0gPSAyNTUgJiBzLCBmICs9IHksIHMgLz0gMjU2LCBpIC09IDgpIHtcbiAgICAgICAgO1xuICAgICAgfVxuXG4gICAgICBmb3IgKG8gPSBvIDw8IGkgfCBzLCBsICs9IGk7IGwgPiAwOyB0W3IgKyBmXSA9IDI1NSAmIG8sIGYgKz0geSwgbyAvPSAyNTYsIGwgLT0gOCkge1xuICAgICAgICA7XG4gICAgICB9XG5cbiAgICAgIHRbciArIGYgLSB5XSB8PSAxMjggKiBkO1xuICAgIH0sXG4gICAgICAgICRzID0gV3M7XG5cbiAgICBmdW5jdGlvbiBXcyh0KSB7XG4gICAgICB0aGlzLmJ1ZiA9IEFycmF5QnVmZmVyLmlzVmlldyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodCkgPyB0IDogbmV3IFVpbnQ4QXJyYXkodCB8fCAwKSwgdGhpcy5wb3MgPSAwLCB0aGlzLnR5cGUgPSAwLCB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbiAgICB9XG5cbiAgICBXcy5WYXJpbnQgPSAwLCBXcy5GaXhlZDY0ID0gMSwgV3MuQnl0ZXMgPSAyLCBXcy5GaXhlZDMyID0gNTtcbiAgICB2YXIgUXMgPSBcInVuZGVmaW5lZFwiID09IHR5cGVvZiBUZXh0RGVjb2RlciA/IG51bGwgOiBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gICAgZnVuY3Rpb24gdHUodCkge1xuICAgICAgcmV0dXJuIHQudHlwZSA9PT0gV3MuQnl0ZXMgPyB0LnJlYWRWYXJpbnQoKSArIHQucG9zIDogdC5wb3MgKyAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV1KHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiByID8gNDI5NDk2NzI5NiAqIGUgKyAodCA+Pj4gMCkgOiA0Mjk0OTY3Mjk2ICogKGUgPj4+IDApICsgKHQgPj4+IDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1KHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gZSA8PSAxNjM4MyA/IDEgOiBlIDw9IDIwOTcxNTEgPyAyIDogZSA8PSAyNjg0MzU0NTUgPyAzIDogTWF0aC5mbG9vcihNYXRoLmxvZyhlKSAvICg3ICogTWF0aC5MTjIpKTtcbiAgICAgIHIucmVhbGxvYyhuKTtcblxuICAgICAgZm9yICh2YXIgaSA9IHIucG9zIC0gMTsgaSA+PSB0OyBpLS0pIHtcbiAgICAgICAgci5idWZbaSArIG5dID0gci5idWZbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVWYXJpbnQodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXUodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVTVmFyaW50KHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF1KHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLndyaXRlRmxvYXQodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb3UodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVEb3VibGUodFtyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3UodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGUud3JpdGVCb29sZWFuKHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHV1KHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLndyaXRlRml4ZWQzMih0W3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsdSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZVNGaXhlZDMyKHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1KHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBlLndyaXRlRml4ZWQ2NCh0W3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdSh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgZS53cml0ZVNGaXhlZDY0KHRbcl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1KHQsIGUpIHtcbiAgICAgIHJldHVybiAodFtlXSB8IHRbZSArIDFdIDw8IDggfCB0W2UgKyAyXSA8PCAxNikgKyAxNjc3NzIxNiAqIHRbZSArIDNdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZ1KHQsIGUsIHIpIHtcbiAgICAgIHRbcl0gPSBlLCB0W3IgKyAxXSA9IGUgPj4+IDgsIHRbciArIDJdID0gZSA+Pj4gMTYsIHRbciArIDNdID0gZSA+Pj4gMjQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geXUodCwgZSkge1xuICAgICAgcmV0dXJuICh0W2VdIHwgdFtlICsgMV0gPDwgOCB8IHRbZSArIDJdIDw8IDE2KSArICh0W2UgKyAzXSA8PCAyNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHUodCwgZSwgcikge1xuICAgICAgMSA9PT0gdCAmJiByLnJlYWRNZXNzYWdlKG11LCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtdSh0LCBlLCByKSB7XG4gICAgICBpZiAoMyA9PT0gdCkge1xuICAgICAgICB2YXIgbiA9IHIucmVhZE1lc3NhZ2UodnUsIHt9KSxcbiAgICAgICAgICAgIGkgPSBuLndpZHRoLFxuICAgICAgICAgICAgYSA9IG4uaGVpZ2h0LFxuICAgICAgICAgICAgbyA9IG4ubGVmdCxcbiAgICAgICAgICAgIHMgPSBuLnRvcCxcbiAgICAgICAgICAgIHUgPSBuLmFkdmFuY2U7XG4gICAgICAgIGUucHVzaCh7XG4gICAgICAgICAgaWQ6IG4uaWQsXG4gICAgICAgICAgYml0bWFwOiBuZXcgeG8oe1xuICAgICAgICAgICAgd2lkdGg6IGkgKyA2LFxuICAgICAgICAgICAgaGVpZ2h0OiBhICsgNlxuICAgICAgICAgIH0sIG4uYml0bWFwKSxcbiAgICAgICAgICBtZXRyaWNzOiB7XG4gICAgICAgICAgICB3aWR0aDogaSxcbiAgICAgICAgICAgIGhlaWdodDogYSxcbiAgICAgICAgICAgIGxlZnQ6IG8sXG4gICAgICAgICAgICB0b3A6IHMsXG4gICAgICAgICAgICBhZHZhbmNlOiB1XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2dSh0LCBlLCByKSB7XG4gICAgICAxID09PSB0ID8gZS5pZCA9IHIucmVhZFZhcmludCgpIDogMiA9PT0gdCA/IGUuYml0bWFwID0gci5yZWFkQnl0ZXMoKSA6IDMgPT09IHQgPyBlLndpZHRoID0gci5yZWFkVmFyaW50KCkgOiA0ID09PSB0ID8gZS5oZWlnaHQgPSByLnJlYWRWYXJpbnQoKSA6IDUgPT09IHQgPyBlLmxlZnQgPSByLnJlYWRTVmFyaW50KCkgOiA2ID09PSB0ID8gZS50b3AgPSByLnJlYWRTVmFyaW50KCkgOiA3ID09PSB0ICYmIChlLmFkdmFuY2UgPSByLnJlYWRWYXJpbnQoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ3UodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSAwLCBuID0gMCwgaSA9IHQ7IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBhID0gaVtuXTtcbiAgICAgICAgZSArPSBhLncgKiBhLmgsIHIgPSBNYXRoLm1heChyLCBhLncpO1xuICAgICAgfVxuXG4gICAgICB0LnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaCAtIHQuaDtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBvID0gW3tcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgdzogTWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguc3FydChlIC8gLjk1KSksIHIpLFxuICAgICAgICBoOiAxIC8gMFxuICAgICAgfV0sIHMgPSAwLCB1ID0gMCwgbCA9IDAsIHAgPSB0OyBsIDwgcC5sZW5ndGg7IGwgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBjID0gcFtsXSwgaCA9IG8ubGVuZ3RoIC0gMTsgaCA+PSAwOyBoLS0pIHtcbiAgICAgICAgICB2YXIgZiA9IG9baF07XG5cbiAgICAgICAgICBpZiAoIShjLncgPiBmLncgfHwgYy5oID4gZi5oKSkge1xuICAgICAgICAgICAgaWYgKGMueCA9IGYueCwgYy55ID0gZi55LCB1ID0gTWF0aC5tYXgodSwgYy55ICsgYy5oKSwgcyA9IE1hdGgubWF4KHMsIGMueCArIGMudyksIGMudyA9PT0gZi53ICYmIGMuaCA9PT0gZi5oKSB7XG4gICAgICAgICAgICAgIHZhciB5ID0gby5wb3AoKTtcbiAgICAgICAgICAgICAgaCA8IG8ubGVuZ3RoICYmIChvW2hdID0geSk7XG4gICAgICAgICAgICB9IGVsc2UgYy5oID09PSBmLmggPyAoZi54ICs9IGMudywgZi53IC09IGMudykgOiBjLncgPT09IGYudyA/IChmLnkgKz0gYy5oLCBmLmggLT0gYy5oKSA6IChvLnB1c2goe1xuICAgICAgICAgICAgICB4OiBmLnggKyBjLncsXG4gICAgICAgICAgICAgIHk6IGYueSxcbiAgICAgICAgICAgICAgdzogZi53IC0gYy53LFxuICAgICAgICAgICAgICBoOiBjLmhcbiAgICAgICAgICAgIH0pLCBmLnkgKz0gYy5oLCBmLmggLT0gYy5oKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHc6IHMsXG4gICAgICAgIGg6IHUsXG4gICAgICAgIGZpbGw6IGUgLyAocyAqIHUpIHx8IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgV3MucHJvdG90eXBlID0ge1xuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgICAgfSxcbiAgICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uIHJlYWRGaWVsZHModCwgZSwgcikge1xuICAgICAgICBmb3IgKHIgPSByIHx8IHRoaXMubGVuZ3RoOyB0aGlzLnBvcyA8IHI7KSB7XG4gICAgICAgICAgdmFyIG4gPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgaSA9IG4gPj4gMyxcbiAgICAgICAgICAgICAgYSA9IHRoaXMucG9zO1xuICAgICAgICAgIHRoaXMudHlwZSA9IDcgJiBuLCB0KGksIGUsIHRoaXMpLCB0aGlzLnBvcyA9PT0gYSAmJiB0aGlzLnNraXAobik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0sXG4gICAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24gcmVhZE1lc3NhZ2UodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsIGUsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgICAgfSxcbiAgICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbiByZWFkRml4ZWQzMigpIHtcbiAgICAgICAgdmFyIHQgPSBodSh0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gNCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uIHJlYWRTRml4ZWQzMigpIHtcbiAgICAgICAgdmFyIHQgPSB5dSh0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gNCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24gcmVhZEZpeGVkNjQoKSB7XG4gICAgICAgIHZhciB0ID0gaHUodGhpcy5idWYsIHRoaXMucG9zKSArIDQyOTQ5NjcyOTYgKiBodSh0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDgsIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbiByZWFkU0ZpeGVkNjQoKSB7XG4gICAgICAgIHZhciB0ID0gaHUodGhpcy5idWYsIHRoaXMucG9zKSArIDQyOTQ5NjcyOTYgKiB5dSh0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDgsIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZEZsb2F0OiBmdW5jdGlvbiByZWFkRmxvYXQoKSB7XG4gICAgICAgIHZhciB0ID0gSHModGhpcy5idWYsIHRoaXMucG9zLCAhMCwgMjMsIDQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gNCwgdDtcbiAgICAgIH0sXG4gICAgICByZWFkRG91YmxlOiBmdW5jdGlvbiByZWFkRG91YmxlKCkge1xuICAgICAgICB2YXIgdCA9IEhzKHRoaXMuYnVmLCB0aGlzLnBvcywgITAsIDUyLCA4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDgsIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFZhcmludDogZnVuY3Rpb24gcmVhZFZhcmludCh0KSB7XG4gICAgICAgIHZhciBlLFxuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIG4gPSB0aGlzLmJ1ZjtcbiAgICAgICAgcmV0dXJuIGUgPSAxMjcgJiAociA9IG5bdGhpcy5wb3MrK10pLCByIDwgMTI4ID8gZSA6IChlIHw9ICgxMjcgJiAociA9IG5bdGhpcy5wb3MrK10pKSA8PCA3LCByIDwgMTI4ID8gZSA6IChlIHw9ICgxMjcgJiAociA9IG5bdGhpcy5wb3MrK10pKSA8PCAxNCwgciA8IDEyOCA/IGUgOiAoZSB8PSAoMTI3ICYgKHIgPSBuW3RoaXMucG9zKytdKSkgPDwgMjEsIHIgPCAxMjggPyBlIDogZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICB2YXIgbixcbiAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgYSA9IHIuYnVmO1xuICAgICAgICAgIGlmIChuID0gKDExMiAmIChpID0gYVtyLnBvcysrXSkpID4+IDQsIGkgPCAxMjgpIHJldHVybiBldSh0LCBuLCBlKTtcbiAgICAgICAgICBpZiAobiB8PSAoMTI3ICYgKGkgPSBhW3IucG9zKytdKSkgPDwgMywgaSA8IDEyOCkgcmV0dXJuIGV1KHQsIG4sIGUpO1xuICAgICAgICAgIGlmIChuIHw9ICgxMjcgJiAoaSA9IGFbci5wb3MrK10pKSA8PCAxMCwgaSA8IDEyOCkgcmV0dXJuIGV1KHQsIG4sIGUpO1xuICAgICAgICAgIGlmIChuIHw9ICgxMjcgJiAoaSA9IGFbci5wb3MrK10pKSA8PCAxNywgaSA8IDEyOCkgcmV0dXJuIGV1KHQsIG4sIGUpO1xuICAgICAgICAgIGlmIChuIHw9ICgxMjcgJiAoaSA9IGFbci5wb3MrK10pKSA8PCAyNCwgaSA8IDEyOCkgcmV0dXJuIGV1KHQsIG4sIGUpO1xuICAgICAgICAgIGlmIChuIHw9ICgxICYgKGkgPSBhW3IucG9zKytdKSkgPDwgMzEsIGkgPCAxMjgpIHJldHVybiBldSh0LCBuLCBlKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlc1wiKTtcbiAgICAgICAgfShlIHw9ICgxNSAmIChyID0gblt0aGlzLnBvc10pKSA8PCAyOCwgdCwgdGhpcykpKSk7XG4gICAgICB9LFxuICAgICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbiByZWFkVmFyaW50NjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRWYXJpbnQoITApO1xuICAgICAgfSxcbiAgICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbiByZWFkU1ZhcmludCgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIHQgJSAyID09IDEgPyAodCArIDEpIC8gLTIgOiB0IC8gMjtcbiAgICAgIH0sXG4gICAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24gcmVhZEJvb2xlYW4oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICAgIH0sXG4gICAgICByZWFkU3RyaW5nOiBmdW5jdGlvbiByZWFkU3RyaW5nKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBlID0gdGhpcy5wb3M7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA9IHQsIHQgLSBlID49IDEyICYmIFFzID8gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICByZXR1cm4gUXMuZGVjb2RlKHQuc3ViYXJyYXkoZSwgcikpO1xuICAgICAgICB9KHRoaXMuYnVmLCBlLCB0KSA6IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IFwiXCIsIGkgPSBlOyBpIDwgcjspIHtcbiAgICAgICAgICAgIHZhciBhLFxuICAgICAgICAgICAgICAgIG8sXG4gICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICB1ID0gdFtpXSxcbiAgICAgICAgICAgICAgICBsID0gbnVsbCxcbiAgICAgICAgICAgICAgICBwID0gdSA+IDIzOSA/IDQgOiB1ID4gMjIzID8gMyA6IHUgPiAxOTEgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChpICsgcCA+IHIpIGJyZWFrO1xuICAgICAgICAgICAgMSA9PT0gcCA/IHUgPCAxMjggJiYgKGwgPSB1KSA6IDIgPT09IHAgPyAxMjggPT0gKDE5MiAmIChhID0gdFtpICsgMV0pKSAmJiAobCA9ICgzMSAmIHUpIDw8IDYgfCA2MyAmIGEpIDw9IDEyNyAmJiAobCA9IG51bGwpIDogMyA9PT0gcCA/IChvID0gdFtpICsgMl0sIDEyOCA9PSAoMTkyICYgKGEgPSB0W2kgKyAxXSkpICYmIDEyOCA9PSAoMTkyICYgbykgJiYgKChsID0gKDE1ICYgdSkgPDwgMTIgfCAoNjMgJiBhKSA8PCA2IHwgNjMgJiBvKSA8PSAyMDQ3IHx8IGwgPj0gNTUyOTYgJiYgbCA8PSA1NzM0MykgJiYgKGwgPSBudWxsKSkgOiA0ID09PSBwICYmIChvID0gdFtpICsgMl0sIHMgPSB0W2kgKyAzXSwgMTI4ID09ICgxOTIgJiAoYSA9IHRbaSArIDFdKSkgJiYgMTI4ID09ICgxOTIgJiBvKSAmJiAxMjggPT0gKDE5MiAmIHMpICYmICgobCA9ICgxNSAmIHUpIDw8IDE4IHwgKDYzICYgYSkgPDwgMTIgfCAoNjMgJiBvKSA8PCA2IHwgNjMgJiBzKSA8PSA2NTUzNSB8fCBsID49IDExMTQxMTIpICYmIChsID0gbnVsbCkpLCBudWxsID09PSBsID8gKGwgPSA2NTUzMywgcCA9IDEpIDogbCA+IDY1NTM1ICYmIChsIC09IDY1NTM2LCBuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobCA+Pj4gMTAgJiAxMDIzIHwgNTUyOTYpLCBsID0gNTYzMjAgfCAxMDIzICYgbCksIG4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsKSwgaSArPSBwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9KHRoaXMuYnVmLCBlLCB0KTtcbiAgICAgIH0sXG4gICAgICByZWFkQnl0ZXM6IGZ1bmN0aW9uIHJlYWRCeXRlcygpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgZSA9IHRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLCB0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID0gdCwgZTtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkVmFyaW50OiBmdW5jdGlvbiByZWFkUGFja2VkVmFyaW50KHQsIGUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gV3MuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtcbiAgICAgICAgdmFyIHIgPSB0dSh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IHI7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZFZhcmludChlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24gcmVhZFBhY2tlZFNWYXJpbnQodCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBXcy5CeXRlcykgcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICB2YXIgZSA9IHR1KHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbiByZWFkUGFja2VkQm9vbGVhbih0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFdzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHZhciBlID0gdHUodGhpcyk7XG5cbiAgICAgICAgZm9yICh0ID0gdCB8fCBbXTsgdGhpcy5wb3MgPCBlOykge1xuICAgICAgICAgIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZEZsb2F0OiBmdW5jdGlvbiByZWFkUGFja2VkRmxvYXQodCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBXcy5CeXRlcykgcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgdmFyIGUgPSB0dSh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24gcmVhZFBhY2tlZERvdWJsZSh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFdzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgdmFyIGUgPSB0dSh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfSxcbiAgICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbiByZWFkUGFja2VkRml4ZWQzMih0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFdzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlID0gdHUodGhpcyk7XG5cbiAgICAgICAgZm9yICh0ID0gdCB8fCBbXTsgdGhpcy5wb3MgPCBlOykge1xuICAgICAgICAgIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbiByZWFkUGFja2VkU0ZpeGVkMzIodCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBXcy5CeXRlcykgcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgdmFyIGUgPSB0dSh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9LFxuICAgICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRQYWNrZWRGaXhlZDY0KHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gV3MuQnl0ZXMpIHJldHVybiB0LnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgdmFyIGUgPSB0dSh0aGlzKTtcblxuICAgICAgICBmb3IgKHQgPSB0IHx8IFtdOyB0aGlzLnBvcyA8IGU7KSB7XG4gICAgICAgICAgdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uIHJlYWRQYWNrZWRTRml4ZWQ2NCh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFdzLkJ5dGVzKSByZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZSA9IHR1KHRoaXMpO1xuXG4gICAgICAgIGZvciAodCA9IHQgfHwgW107IHRoaXMucG9zIDwgZTspIHtcbiAgICAgICAgICB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sXG4gICAgICBza2lwOiBmdW5jdGlvbiBza2lwKHQpIHtcbiAgICAgICAgdmFyIGUgPSA3ICYgdDtcbiAgICAgICAgaWYgKGUgPT09IFdzLlZhcmludCkgZm9yICg7IHRoaXMuYnVmW3RoaXMucG9zKytdID4gMTI3Oykge1xuICAgICAgICAgIDtcbiAgICAgICAgfSBlbHNlIGlmIChlID09PSBXcy5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO2Vsc2UgaWYgKGUgPT09IFdzLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7ZWxzZSB7XG4gICAgICAgICAgaWYgKGUgIT09IFdzLkZpeGVkNjQpIHRocm93IG5ldyBFcnJvcihcIlVuaW1wbGVtZW50ZWQgdHlwZTogXCIgKyBlKTtcbiAgICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgd3JpdGVUYWc6IGZ1bmN0aW9uIHdyaXRlVGFnKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh0IDw8IDMgfCBlKTtcbiAgICAgIH0sXG4gICAgICByZWFsbG9jOiBmdW5jdGlvbiByZWFsbG9jKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMubGVuZ3RoIHx8IDE2OyBlIDwgdGhpcy5wb3MgKyB0Oykge1xuICAgICAgICAgIGUgKj0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciByID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICAgICAgci5zZXQodGhpcy5idWYpLCB0aGlzLmJ1ZiA9IHIsIHRoaXMubGVuZ3RoID0gZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSB0aGlzLnBvcywgdGhpcy5wb3MgPSAwLCB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgICB9LFxuICAgICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbiB3cml0ZUZpeGVkMzIodCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCksIGZ1KHRoaXMuYnVmLCB0LCB0aGlzLnBvcyksIHRoaXMucG9zICs9IDQ7XG4gICAgICB9LFxuICAgICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24gd3JpdGVTRml4ZWQzMih0KSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KSwgZnUodGhpcy5idWYsIHQsIHRoaXMucG9zKSwgdGhpcy5wb3MgKz0gNDtcbiAgICAgIH0sXG4gICAgICB3cml0ZUZpeGVkNjQ6IGZ1bmN0aW9uIHdyaXRlRml4ZWQ2NCh0KSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KSwgZnUodGhpcy5idWYsIC0xICYgdCwgdGhpcy5wb3MpLCBmdSh0aGlzLmJ1ZiwgTWF0aC5mbG9vcih0ICogKDEgLyA0Mjk0OTY3Mjk2KSksIHRoaXMucG9zICsgNCksIHRoaXMucG9zICs9IDg7XG4gICAgICB9LFxuICAgICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24gd3JpdGVTRml4ZWQ2NCh0KSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KSwgZnUodGhpcy5idWYsIC0xICYgdCwgdGhpcy5wb3MpLCBmdSh0aGlzLmJ1ZiwgTWF0aC5mbG9vcih0ICogKDEgLyA0Mjk0OTY3Mjk2KSksIHRoaXMucG9zICsgNCksIHRoaXMucG9zICs9IDg7XG4gICAgICB9LFxuICAgICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlVmFyaW50KHQpIHtcbiAgICAgICAgKHQgPSArdCB8fCAwKSA+IDI2ODQzNTQ1NSB8fCB0IDwgMCA/IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdmFyIHIsIG47XG4gICAgICAgICAgaWYgKHQgPj0gMCA/IChyID0gdCAlIDQyOTQ5NjcyOTYgfCAwLCBuID0gdCAvIDQyOTQ5NjcyOTYgfCAwKSA6IChuID0gfigtdCAvIDQyOTQ5NjcyOTYpLCA0Mjk0OTY3Mjk1IF4gKHIgPSB+KC10ICUgNDI5NDk2NzI5NikpID8gciA9IHIgKyAxIHwgMCA6IChyID0gMCwgbiA9IG4gKyAxIHwgMCkpLCB0ID49IDB4MTAwMDAwMDAwMDAwMDAwMDAgfHwgdCA8IC0weDEwMDAwMDAwMDAwMDAwMDAwKSB0aHJvdyBuZXcgRXJyb3IoXCJHaXZlbiB2YXJpbnQgZG9lc24ndCBmaXQgaW50byAxMCBieXRlc1wiKTtcbiAgICAgICAgICBlLnJlYWxsb2MoMTApLCBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgICAgICAgci5idWZbci5wb3MrK10gPSAxMjcgJiB0IHwgMTI4LCB0ID4+Pj0gNywgci5idWZbci5wb3MrK10gPSAxMjcgJiB0IHwgMTI4LCB0ID4+Pj0gNywgci5idWZbci5wb3MrK10gPSAxMjcgJiB0IHwgMTI4LCB0ID4+Pj0gNywgci5idWZbci5wb3MrK10gPSAxMjcgJiB0IHwgMTI4LCByLmJ1ZltyLnBvc10gPSAxMjcgJiAodCA+Pj49IDcpO1xuICAgICAgICAgIH0ociwgMCwgZSksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICB2YXIgciA9ICg3ICYgdCkgPDwgNDtcbiAgICAgICAgICAgIGUuYnVmW2UucG9zKytdIHw9IHIgfCAoKHQgPj4+PSAzKSA/IDEyOCA6IDApLCB0ICYmIChlLmJ1ZltlLnBvcysrXSA9IDEyNyAmIHQgfCAoKHQgPj4+PSA3KSA/IDEyOCA6IDApLCB0ICYmIChlLmJ1ZltlLnBvcysrXSA9IDEyNyAmIHQgfCAoKHQgPj4+PSA3KSA/IDEyOCA6IDApLCB0ICYmIChlLmJ1ZltlLnBvcysrXSA9IDEyNyAmIHQgfCAoKHQgPj4+PSA3KSA/IDEyOCA6IDApLCB0ICYmIChlLmJ1ZltlLnBvcysrXSA9IDEyNyAmIHQgfCAoKHQgPj4+PSA3KSA/IDEyOCA6IDApLCB0ICYmIChlLmJ1ZltlLnBvcysrXSA9IDEyNyAmIHQpKSkpKTtcbiAgICAgICAgICB9KG4sIGUpO1xuICAgICAgICB9KHQsIHRoaXMpIDogKHRoaXMucmVhbGxvYyg0KSwgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAxMjcgJiB0IHwgKHQgPiAxMjcgPyAxMjggOiAwKSwgdCA8PSAxMjcgfHwgKHRoaXMuYnVmW3RoaXMucG9zKytdID0gMTI3ICYgKHQgPj4+PSA3KSB8ICh0ID4gMTI3ID8gMTI4IDogMCksIHQgPD0gMTI3IHx8ICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IDEyNyAmICh0ID4+Pj0gNykgfCAodCA+IDEyNyA/IDEyOCA6IDApLCB0IDw9IDEyNyB8fCAodGhpcy5idWZbdGhpcy5wb3MrK10gPSB0ID4+PiA3ICYgMTI3KSkpKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlU1ZhcmludCh0KSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodCA8IDAgPyAyICogLXQgLSAxIDogMiAqIHQpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24gd3JpdGVCb29sZWFuKHQpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHQpKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24gd3JpdGVTdHJpbmcodCkge1xuICAgICAgICB0ID0gU3RyaW5nKHQpLCB0aGlzLnJlYWxsb2MoNCAqIHQubGVuZ3RoKSwgdGhpcy5wb3MrKztcbiAgICAgICAgdmFyIGUgPSB0aGlzLnBvcztcblxuICAgICAgICB0aGlzLnBvcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiwgaSwgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBpZiAoKG4gPSBlLmNoYXJDb2RlQXQoYSkpID4gNTUyOTUgJiYgbiA8IDU3MzQ0KSB7XG4gICAgICAgICAgICAgIGlmICghaSkge1xuICAgICAgICAgICAgICAgIG4gPiA1NjMxOSB8fCBhICsgMSA9PT0gZS5sZW5ndGggPyAodFtyKytdID0gMjM5LCB0W3IrK10gPSAxOTEsIHRbcisrXSA9IDE4OSkgOiBpID0gbjtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChuIDwgNTYzMjApIHtcbiAgICAgICAgICAgICAgICB0W3IrK10gPSAyMzksIHRbcisrXSA9IDE5MSwgdFtyKytdID0gMTg5LCBpID0gbjtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG4gPSBpIC0gNTUyOTYgPDwgMTAgfCBuIC0gNTYzMjAgfCA2NTUzNiwgaSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaSAmJiAodFtyKytdID0gMjM5LCB0W3IrK10gPSAxOTEsIHRbcisrXSA9IDE4OSwgaSA9IG51bGwpO1xuXG4gICAgICAgICAgICBuIDwgMTI4ID8gdFtyKytdID0gbiA6IChuIDwgMjA0OCA/IHRbcisrXSA9IG4gPj4gNiB8IDE5MiA6IChuIDwgNjU1MzYgPyB0W3IrK10gPSBuID4+IDEyIHwgMjI0IDogKHRbcisrXSA9IG4gPj4gMTggfCAyNDAsIHRbcisrXSA9IG4gPj4gMTIgJiA2MyB8IDEyOCksIHRbcisrXSA9IG4gPj4gNiAmIDYzIHwgMTI4KSwgdFtyKytdID0gNjMgJiBuIHwgMTI4KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSh0aGlzLmJ1ZiwgdCwgdGhpcy5wb3MpO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5wb3MgLSBlO1xuICAgICAgICByID49IDEyOCAmJiBydShlLCByLCB0aGlzKSwgdGhpcy5wb3MgPSBlIC0gMSwgdGhpcy53cml0ZVZhcmludChyKSwgdGhpcy5wb3MgKz0gcjtcbiAgICAgIH0sXG4gICAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbiB3cml0ZUZsb2F0KHQpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpLCBZcyh0aGlzLmJ1ZiwgdCwgdGhpcy5wb3MsICEwLCAyMywgNCksIHRoaXMucG9zICs9IDQ7XG4gICAgICB9LFxuICAgICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uIHdyaXRlRG91YmxlKHQpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpLCBZcyh0aGlzLmJ1ZiwgdCwgdGhpcy5wb3MsICEwLCA1MiwgOCksIHRoaXMucG9zICs9IDg7XG4gICAgICB9LFxuICAgICAgd3JpdGVCeXRlczogZnVuY3Rpb24gd3JpdGVCeXRlcyh0KSB7XG4gICAgICAgIHZhciBlID0gdC5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoZSksIHRoaXMucmVhbGxvYyhlKTtcblxuICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGU7IHIrKykge1xuICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdFtyXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlUmF3TWVzc2FnZTogZnVuY3Rpb24gd3JpdGVSYXdNZXNzYWdlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICAgICAgdmFyIHIgPSB0aGlzLnBvcztcbiAgICAgICAgdChlLCB0aGlzKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnBvcyAtIHI7XG4gICAgICAgIG4gPj0gMTI4ICYmIHJ1KHIsIG4sIHRoaXMpLCB0aGlzLnBvcyA9IHIgLSAxLCB0aGlzLndyaXRlVmFyaW50KG4pLCB0aGlzLnBvcyArPSBuO1xuICAgICAgfSxcbiAgICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24gd3JpdGVNZXNzYWdlKHQsIGUsIHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCBXcy5CeXRlcyksIHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsIHIpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkVmFyaW50OiBmdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludCh0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIG51LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludCh0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIGl1LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbih0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIHN1LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVBhY2tlZEZsb2F0OiBmdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgYXUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkRG91YmxlOiBmdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZSh0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIG91LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMih0LCBlKSB7XG4gICAgICAgIGUubGVuZ3RoICYmIHRoaXMud3JpdGVNZXNzYWdlKHQsIHV1LCBlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgbHUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KHQsIGUpIHtcbiAgICAgICAgZS5sZW5ndGggJiYgdGhpcy53cml0ZU1lc3NhZ2UodCwgcHUsIGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQodCwgZSkge1xuICAgICAgICBlLmxlbmd0aCAmJiB0aGlzLndyaXRlTWVzc2FnZSh0LCBjdSwgZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVCeXRlc0ZpZWxkOiBmdW5jdGlvbiB3cml0ZUJ5dGVzRmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsIFdzLkJ5dGVzKSwgdGhpcy53cml0ZUJ5dGVzKGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbiB3cml0ZUZpeGVkMzJGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgV3MuRml4ZWQzMiksIHRoaXMud3JpdGVGaXhlZDMyKGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlU0ZpeGVkMzJGaWVsZDogZnVuY3Rpb24gd3JpdGVTRml4ZWQzMkZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCBXcy5GaXhlZDMyKSwgdGhpcy53cml0ZVNGaXhlZDMyKGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbiB3cml0ZUZpeGVkNjRGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgV3MuRml4ZWQ2NCksIHRoaXMud3JpdGVGaXhlZDY0KGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlU0ZpeGVkNjRGaWVsZDogZnVuY3Rpb24gd3JpdGVTRml4ZWQ2NEZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCBXcy5GaXhlZDY0KSwgdGhpcy53cml0ZVNGaXhlZDY0KGUpO1xuICAgICAgfSxcbiAgICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uIHdyaXRlVmFyaW50RmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsIFdzLlZhcmludCksIHRoaXMud3JpdGVWYXJpbnQoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uIHdyaXRlU1ZhcmludEZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCBXcy5WYXJpbnQpLCB0aGlzLndyaXRlU1ZhcmludChlKTtcbiAgICAgIH0sXG4gICAgICB3cml0ZVN0cmluZ0ZpZWxkOiBmdW5jdGlvbiB3cml0ZVN0cmluZ0ZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0LCBXcy5CeXRlcyksIHRoaXMud3JpdGVTdHJpbmcoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVGbG9hdEZpZWxkOiBmdW5jdGlvbiB3cml0ZUZsb2F0RmllbGQodCwgZSkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHQsIFdzLkZpeGVkMzIpLCB0aGlzLndyaXRlRmxvYXQoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24gd3JpdGVEb3VibGVGaWVsZCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodCwgV3MuRml4ZWQ2NCksIHRoaXMud3JpdGVEb3VibGUoZSk7XG4gICAgICB9LFxuICAgICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uIHdyaXRlQm9vbGVhbkZpZWxkKHQsIGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHQsIEJvb2xlYW4oZSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgeHUgPSBmdW5jdGlvbiB4dSh0LCBlKSB7XG4gICAgICB2YXIgciA9IGUucGl4ZWxSYXRpbyxcbiAgICAgICAgICBuID0gZS52ZXJzaW9uLFxuICAgICAgICAgIGkgPSBlLnN0cmV0Y2hYLFxuICAgICAgICAgIGEgPSBlLnN0cmV0Y2hZLFxuICAgICAgICAgIG8gPSBlLmNvbnRlbnQ7XG4gICAgICB0aGlzLnBhZGRlZFJlY3QgPSB0LCB0aGlzLnBpeGVsUmF0aW8gPSByLCB0aGlzLnN0cmV0Y2hYID0gaSwgdGhpcy5zdHJldGNoWSA9IGEsIHRoaXMuY29udGVudCA9IG8sIHRoaXMudmVyc2lvbiA9IG47XG4gICAgfSxcbiAgICAgICAgYnUgPSB7XG4gICAgICB0bDoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgYnI6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHRsYnI6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlTaXplOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYnUudGwuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFt0aGlzLnBhZGRlZFJlY3QueCArIDEsIHRoaXMucGFkZGVkUmVjdC55ICsgMV07XG4gICAgfSwgYnUuYnIuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFt0aGlzLnBhZGRlZFJlY3QueCArIHRoaXMucGFkZGVkUmVjdC53IC0gMSwgdGhpcy5wYWRkZWRSZWN0LnkgKyB0aGlzLnBhZGRlZFJlY3QuaCAtIDFdO1xuICAgIH0sIGJ1LnRsYnIuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGwuY29uY2F0KHRoaXMuYnIpO1xuICAgIH0sIGJ1LmRpc3BsYXlTaXplLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbKHRoaXMucGFkZGVkUmVjdC53IC0gMikgLyB0aGlzLnBpeGVsUmF0aW8sICh0aGlzLnBhZGRlZFJlY3QuaCAtIDIpIC8gdGhpcy5waXhlbFJhdGlvXTtcbiAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4dS5wcm90b3R5cGUsIGJ1KTtcblxuICAgIHZhciB3dSA9IGZ1bmN0aW9uIHd1KHQsIGUpIHtcbiAgICAgIHZhciByID0ge30sXG4gICAgICAgICAgbiA9IHt9O1xuICAgICAgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzID0gW107XG4gICAgICB2YXIgaSA9IFtdO1xuICAgICAgdGhpcy5hZGRJbWFnZXModCwgciwgaSksIHRoaXMuYWRkSW1hZ2VzKGUsIG4sIGkpO1xuICAgICAgdmFyIGEgPSBndShpKSxcbiAgICAgICAgICBvID0gbmV3IGJvKHtcbiAgICAgICAgd2lkdGg6IGEudyB8fCAxLFxuICAgICAgICBoZWlnaHQ6IGEuaCB8fCAxXG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgcyBpbiB0KSB7XG4gICAgICAgIHZhciB1ID0gdFtzXSxcbiAgICAgICAgICAgIGwgPSByW3NdLnBhZGRlZFJlY3Q7XG4gICAgICAgIGJvLmNvcHkodS5kYXRhLCBvLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBsLnggKyAxLFxuICAgICAgICAgIHk6IGwueSArIDFcbiAgICAgICAgfSwgdS5kYXRhKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcCBpbiBlKSB7XG4gICAgICAgIHZhciBjID0gZVtwXSxcbiAgICAgICAgICAgIGggPSBuW3BdLnBhZGRlZFJlY3QsXG4gICAgICAgICAgICBmID0gaC54ICsgMSxcbiAgICAgICAgICAgIHkgPSBoLnkgKyAxLFxuICAgICAgICAgICAgZCA9IGMuZGF0YS53aWR0aCxcbiAgICAgICAgICAgIG0gPSBjLmRhdGEuaGVpZ2h0O1xuICAgICAgICBiby5jb3B5KGMuZGF0YSwgbywge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogZixcbiAgICAgICAgICB5OiB5XG4gICAgICAgIH0sIGMuZGF0YSksIGJvLmNvcHkoYy5kYXRhLCBvLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiBtIC0gMVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogZixcbiAgICAgICAgICB5OiB5IC0gMVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2lkdGg6IGQsXG4gICAgICAgICAgaGVpZ2h0OiAxXG4gICAgICAgIH0pLCBiby5jb3B5KGMuZGF0YSwgbywge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogZixcbiAgICAgICAgICB5OiB5ICsgbVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2lkdGg6IGQsXG4gICAgICAgICAgaGVpZ2h0OiAxXG4gICAgICAgIH0pLCBiby5jb3B5KGMuZGF0YSwgbywge1xuICAgICAgICAgIHg6IGQgLSAxLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IGYgLSAxLFxuICAgICAgICAgIHk6IHlcbiAgICAgICAgfSwge1xuICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgIGhlaWdodDogbVxuICAgICAgICB9KSwgYm8uY29weShjLmRhdGEsIG8sIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IGYgKyBkLFxuICAgICAgICAgIHk6IHlcbiAgICAgICAgfSwge1xuICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgIGhlaWdodDogbVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbWFnZSA9IG8sIHRoaXMuaWNvblBvc2l0aW9ucyA9IHIsIHRoaXMucGF0dGVyblBvc2l0aW9ucyA9IG47XG4gICAgfTtcblxuICAgIHd1LnByb3RvdHlwZS5hZGRJbWFnZXMgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgZm9yICh2YXIgbiBpbiB0KSB7XG4gICAgICAgIHZhciBpID0gdFtuXSxcbiAgICAgICAgICAgIGEgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHc6IGkuZGF0YS53aWR0aCArIDIsXG4gICAgICAgICAgaDogaS5kYXRhLmhlaWdodCArIDJcbiAgICAgICAgfTtcbiAgICAgICAgci5wdXNoKGEpLCBlW25dID0gbmV3IHh1KGEsIGkpLCBpLmhhc1JlbmRlckNhbGxiYWNrICYmIHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcy5wdXNoKG4pO1xuICAgICAgfVxuICAgIH0sIHd1LnByb3RvdHlwZS5wYXRjaFVwZGF0ZWRJbWFnZXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciBpbiB0LmRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyksIHQudXBkYXRlZEltYWdlcykge1xuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMuaWNvblBvc2l0aW9uc1tyXSwgdC5nZXRJbWFnZShyKSwgZSksIHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5wYXR0ZXJuUG9zaXRpb25zW3JdLCB0LmdldEltYWdlKHIpLCBlKTtcbiAgICAgIH1cbiAgICB9LCB3dS5wcm90b3R5cGUucGF0Y2hVcGRhdGVkSW1hZ2UgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKHQgJiYgZSAmJiB0LnZlcnNpb24gIT09IGUudmVyc2lvbikge1xuICAgICAgICB0LnZlcnNpb24gPSBlLnZlcnNpb247XG4gICAgICAgIHZhciBuID0gdC50bDtcbiAgICAgICAgci51cGRhdGUoZS5kYXRhLCB2b2lkIDAsIHtcbiAgICAgICAgICB4OiBuWzBdLFxuICAgICAgICAgIHk6IG5bMV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgT24oXCJJbWFnZVBvc2l0aW9uXCIsIHh1KSwgT24oXCJJbWFnZUF0bGFzXCIsIHd1KTtcblxuICAgIHZhciBfdSA9IHtcbiAgICAgIGhvcml6b250YWw6IDEsXG4gICAgICB2ZXJ0aWNhbDogMixcbiAgICAgIGhvcml6b250YWxPbmx5OiAzXG4gICAgfSxcbiAgICAgICAgQXUgPSBmdW5jdGlvbiBBdSgpIHtcbiAgICAgIHRoaXMuc2NhbGUgPSAxLCB0aGlzLmZvbnRTdGFjayA9IFwiXCIsIHRoaXMuaW1hZ2VOYW1lID0gbnVsbDtcbiAgICB9O1xuXG4gICAgQXUuZm9yVGV4dCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IG5ldyBBdSgpO1xuICAgICAgcmV0dXJuIHIuc2NhbGUgPSB0IHx8IDEsIHIuZm9udFN0YWNrID0gZSwgcjtcbiAgICB9LCBBdS5mb3JJbWFnZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IG5ldyBBdSgpO1xuICAgICAgcmV0dXJuIGUuaW1hZ2VOYW1lID0gdCwgZTtcbiAgICB9O1xuXG4gICAgdmFyIFN1ID0gZnVuY3Rpb24gU3UoKSB7XG4gICAgICB0aGlzLnRleHQgPSBcIlwiLCB0aGlzLnNlY3Rpb25JbmRleCA9IFtdLCB0aGlzLnNlY3Rpb25zID0gW10sIHRoaXMuaW1hZ2VTZWN0aW9uSUQgPSBudWxsO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBrdSh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkKSB7XG4gICAgICB2YXIgbSxcbiAgICAgICAgICB2ID0gU3UuZnJvbUZlYXR1cmUodCwgaSk7XG4gICAgICBjID09PSBfdS52ZXJ0aWNhbCAmJiB2LnZlcnRpY2FsaXplUHVuY3R1YXRpb24oKTtcbiAgICAgIHZhciBnID0gc2kucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0LFxuICAgICAgICAgIHggPSBzaS5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ7XG5cbiAgICAgIGlmIChnICYmIDEgPT09IHYuc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIG0gPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBiID0gMCwgdyA9IGcodi50b1N0cmluZygpLCBCdSh2LCBsLCBhLCBlLCBuLCBmLCB5KSk7IGIgPCB3Lmxlbmd0aDsgYiArPSAxKSB7XG4gICAgICAgICAgdmFyIF8gPSB3W2JdLFxuICAgICAgICAgICAgICBBID0gbmV3IFN1KCk7XG4gICAgICAgICAgQS50ZXh0ID0gXywgQS5zZWN0aW9ucyA9IHYuc2VjdGlvbnM7XG5cbiAgICAgICAgICBmb3IgKHZhciBTID0gMDsgUyA8IF8ubGVuZ3RoOyBTKyspIHtcbiAgICAgICAgICAgIEEuc2VjdGlvbkluZGV4LnB1c2goMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbS5wdXNoKEEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHgpIHtcbiAgICAgICAgbSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGsgPSAwLCBJID0geCh2LnRleHQsIHYuc2VjdGlvbkluZGV4LCBCdSh2LCBsLCBhLCBlLCBuLCBmLCB5KSk7IGsgPCBJLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgICAgdmFyIHogPSBJW2tdLFxuICAgICAgICAgICAgICBDID0gbmV3IFN1KCk7XG4gICAgICAgICAgQy50ZXh0ID0gelswXSwgQy5zZWN0aW9uSW5kZXggPSB6WzFdLCBDLnNlY3Rpb25zID0gdi5zZWN0aW9ucywgbS5wdXNoKEMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIHIgPSBbXSwgbiA9IHQudGV4dCwgaSA9IDAsIGEgPSAwLCBvID0gZTsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICB2YXIgcyA9IG9bYV07XG4gICAgICAgICAgci5wdXNoKHQuc3Vic3RyaW5nKGksIHMpKSwgaSA9IHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaSA8IG4ubGVuZ3RoICYmIHIucHVzaCh0LnN1YnN0cmluZyhpLCBuLmxlbmd0aCkpLCByO1xuICAgICAgfSh2LCBCdSh2LCBsLCBhLCBlLCBuLCBmLCB5KSk7XG5cbiAgICAgIHZhciBFID0gW10sXG4gICAgICAgICAgUCA9IHtcbiAgICAgICAgcG9zaXRpb25lZExpbmVzOiBFLFxuICAgICAgICB0ZXh0OiB2LnRvU3RyaW5nKCksXG4gICAgICAgIHRvcDogcFsxXSxcbiAgICAgICAgYm90dG9tOiBwWzFdLFxuICAgICAgICBsZWZ0OiBwWzBdLFxuICAgICAgICByaWdodDogcFswXSxcbiAgICAgICAgd3JpdGluZ01vZGU6IGMsXG4gICAgICAgIGljb25zSW5UZXh0OiAhMSxcbiAgICAgICAgdmVydGljYWxpemFibGU6ICExXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjKSB7XG4gICAgICAgIGZvciAodmFyIGggPSAwLCBmID0gLTE3LCB5ID0gMCwgZCA9IDAsIG0gPSBcInJpZ2h0XCIgPT09IHMgPyAxIDogXCJsZWZ0XCIgPT09IHMgPyAwIDogLjUsIHYgPSAwLCBnID0gMCwgeCA9IGk7IGcgPCB4Lmxlbmd0aDsgZyArPSAxKSB7XG4gICAgICAgICAgdmFyIGIgPSB4W2ddO1xuICAgICAgICAgIGIudHJpbSgpO1xuXG4gICAgICAgICAgdmFyIHcgPSBiLmdldE1heFNjYWxlKCksXG4gICAgICAgICAgICAgIF8gPSAyNCAqICh3IC0gMSksXG4gICAgICAgICAgICAgIEEgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzOiBbXSxcbiAgICAgICAgICAgIGxpbmVPZmZzZXQ6IDBcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdC5wb3NpdGlvbmVkTGluZXNbdl0gPSBBO1xuICAgICAgICAgIHZhciBTID0gQS5wb3NpdGlvbmVkR2x5cGhzLFxuICAgICAgICAgICAgICBrID0gMDtcblxuICAgICAgICAgIGlmIChiLmxlbmd0aCgpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBJID0gMDsgSSA8IGIubGVuZ3RoKCk7IEkrKykge1xuICAgICAgICAgICAgICB2YXIgeiA9IGIuZ2V0U2VjdGlvbihJKSxcbiAgICAgICAgICAgICAgICAgIEMgPSBiLmdldFNlY3Rpb25JbmRleChJKSxcbiAgICAgICAgICAgICAgICAgIEUgPSBiLmdldENoYXJDb2RlKEkpLFxuICAgICAgICAgICAgICAgICAgUCA9IDAsXG4gICAgICAgICAgICAgICAgICBNID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIEIgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgVCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICBWID0gMjQsXG4gICAgICAgICAgICAgICAgICBGID0gISh1ID09PSBfdS5ob3Jpem9udGFsIHx8ICFwICYmICFKbihFKSB8fCBwICYmIChJdVtFXSB8fCAoSyA9IEUsIFpuLkFyYWJpYyhLKSB8fCBabltcIkFyYWJpYyBTdXBwbGVtZW50XCJdKEspIHx8IFpuW1wiQXJhYmljIEV4dGVuZGVkLUFcIl0oSykgfHwgWm5bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUFcIl0oSykgfHwgWm5bXCJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUJcIl0oSykpKSk7XG5cbiAgICAgICAgICAgICAgaWYgKHouaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIEQgPSBuW3ouaW1hZ2VOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIUQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIFQgPSB6LmltYWdlTmFtZSwgdC5pY29uc0luVGV4dCA9IHQuaWNvbnNJblRleHQgfHwgITAsIEIgPSBELnBhZGRlZFJlY3Q7XG4gICAgICAgICAgICAgICAgdmFyIEwgPSBELmRpc3BsYXlTaXplO1xuICAgICAgICAgICAgICAgIHouc2NhbGUgPSAyNCAqIHouc2NhbGUgLyBjLCBQID0gXyArICgyNCAtIExbMV0gKiB6LnNjYWxlKSwgViA9IChNID0ge1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IExbMF0sXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IExbMV0sXG4gICAgICAgICAgICAgICAgICBsZWZ0OiAxLFxuICAgICAgICAgICAgICAgICAgdG9wOiAtMyxcbiAgICAgICAgICAgICAgICAgIGFkdmFuY2U6IEYgPyBMWzFdIDogTFswXVxuICAgICAgICAgICAgICAgIH0pLmFkdmFuY2U7XG4gICAgICAgICAgICAgICAgdmFyIFIgPSBGID8gTFswXSAqIHouc2NhbGUgLSAyNCAqIHcgOiBMWzFdICogei5zY2FsZSAtIDI0ICogdztcbiAgICAgICAgICAgICAgICBSID4gMCAmJiBSID4gayAmJiAoayA9IFIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBPID0gclt6LmZvbnRTdGFja10sXG4gICAgICAgICAgICAgICAgICAgIFUgPSBPICYmIE9bRV07XG4gICAgICAgICAgICAgICAgaWYgKFUgJiYgVS5yZWN0KSBCID0gVS5yZWN0LCBNID0gVS5tZXRyaWNzO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIGogPSBlW3ouZm9udFN0YWNrXSxcbiAgICAgICAgICAgICAgICAgICAgICBxID0gaiAmJiBqW0VdO1xuICAgICAgICAgICAgICAgICAgaWYgKCFxKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIE0gPSBxLm1ldHJpY3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFAgPSAyNCAqICh3IC0gei5zY2FsZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBGID8gKHQudmVydGljYWxpemFibGUgPSAhMCwgUy5wdXNoKHtcbiAgICAgICAgICAgICAgICBnbHlwaDogRSxcbiAgICAgICAgICAgICAgICBpbWFnZU5hbWU6IFQsXG4gICAgICAgICAgICAgICAgeDogaCxcbiAgICAgICAgICAgICAgICB5OiBmICsgUCxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogRixcbiAgICAgICAgICAgICAgICBzY2FsZTogei5zY2FsZSxcbiAgICAgICAgICAgICAgICBmb250U3RhY2s6IHouZm9udFN0YWNrLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleDogQyxcbiAgICAgICAgICAgICAgICBtZXRyaWNzOiBNLFxuICAgICAgICAgICAgICAgIHJlY3Q6IEJcbiAgICAgICAgICAgICAgfSksIGggKz0gViAqIHouc2NhbGUgKyBsKSA6IChTLnB1c2goe1xuICAgICAgICAgICAgICAgIGdseXBoOiBFLFxuICAgICAgICAgICAgICAgIGltYWdlTmFtZTogVCxcbiAgICAgICAgICAgICAgICB4OiBoLFxuICAgICAgICAgICAgICAgIHk6IGYgKyBQLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsOiBGLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB6LnNjYWxlLFxuICAgICAgICAgICAgICAgIGZvbnRTdGFjazogei5mb250U3RhY2ssXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4OiBDLFxuICAgICAgICAgICAgICAgIG1ldHJpY3M6IE0sXG4gICAgICAgICAgICAgICAgcmVjdDogQlxuICAgICAgICAgICAgICB9KSwgaCArPSBNLmFkdmFuY2UgKiB6LnNjYWxlICsgbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDAgIT09IFMubGVuZ3RoICYmICh5ID0gTWF0aC5tYXgoaCAtIGwsIHkpLCBWdShTLCAwLCBTLmxlbmd0aCAtIDEsIG0sIGspKSwgaCA9IDA7XG4gICAgICAgICAgICB2YXIgTiA9IGEgKiB3ICsgaztcbiAgICAgICAgICAgIEEubGluZU9mZnNldCA9IE1hdGgubWF4KGssIF8pLCBmICs9IE4sIGQgPSBNYXRoLm1heChOLCBkKSwgKyt2O1xuICAgICAgICAgIH0gZWxzZSBmICs9IGEsICsrdjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBLLFxuICAgICAgICAgICAgRyA9IGYgLSAtMTcsXG4gICAgICAgICAgICBaID0gVHUobyksXG4gICAgICAgICAgICBYID0gWi5ob3Jpem9udGFsQWxpZ24sXG4gICAgICAgICAgICBKID0gWi52ZXJ0aWNhbEFsaWduO1xuICAgICAgICAoZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUpIHtcbiAgICAgICAgICB2YXIgbCxcbiAgICAgICAgICAgICAgcCA9IChlIC0gcikgKiBpO1xuICAgICAgICAgIGwgPSBhICE9PSBvID8gLXMgKiBuIC0gLTE3IDogKC1uICogdSArIC41KSAqIG87XG5cbiAgICAgICAgICBmb3IgKHZhciBjID0gMCwgaCA9IHQ7IGMgPCBoLmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBmID0gMCwgeSA9IGhbY10ucG9zaXRpb25lZEdseXBoczsgZiA8IHkubGVuZ3RoOyBmICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGQgPSB5W2ZdO1xuICAgICAgICAgICAgICBkLnggKz0gcCwgZC55ICs9IGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSh0LnBvc2l0aW9uZWRMaW5lcywgbSwgWCwgSiwgeSwgZCwgYSwgRywgaS5sZW5ndGgpLCB0LnRvcCArPSAtSiAqIEcsIHQuYm90dG9tID0gdC50b3AgKyBHLCB0LmxlZnQgKz0gLVggKiB5LCB0LnJpZ2h0ID0gdC5sZWZ0ICsgeTtcbiAgICAgIH0oUCwgZSwgciwgbiwgbSwgbywgcywgdSwgYywgbCwgaCwgZCksICFmdW5jdGlvbiAodCkge1xuICAgICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQ7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgaWYgKDAgIT09IHJbZV0ucG9zaXRpb25lZEdseXBocy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0oRSkgJiYgUDtcbiAgICB9XG5cbiAgICBTdS5mcm9tRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gbmV3IFN1KCksIG4gPSAwOyBuIDwgdC5zZWN0aW9ucy5sZW5ndGg7IG4rKykge1xuICAgICAgICB2YXIgaSA9IHQuc2VjdGlvbnNbbl07XG4gICAgICAgIGkuaW1hZ2UgPyByLmFkZEltYWdlU2VjdGlvbihpKSA6IHIuYWRkVGV4dFNlY3Rpb24oaSwgZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIFN1LnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9LCBTdS5wcm90b3R5cGUuZ2V0U2VjdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWN0aW9uc1t0aGlzLnNlY3Rpb25JbmRleFt0XV07XG4gICAgfSwgU3UucHJvdG90eXBlLmdldFNlY3Rpb25JbmRleCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXhbdF07XG4gICAgfSwgU3UucHJvdG90eXBlLmdldENoYXJDb2RlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQuY2hhckNvZGVBdCh0KTtcbiAgICB9LCBTdS5wcm90b3R5cGUudmVydGljYWxpemVQdW5jdHVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSBcIlwiLCByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICB2YXIgbiA9IHQuY2hhckNvZGVBdChyICsgMSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgaSA9IHQuY2hhckNvZGVBdChyIC0gMSkgfHwgbnVsbDtcbiAgICAgICAgICBlICs9IG4gJiYgSG4obikgJiYgIUpzW3RbciArIDFdXSB8fCBpICYmIEhuKGkpICYmICFKc1t0W3IgLSAxXV0gfHwgIUpzW3Rbcl1dID8gdFtyXSA6IEpzW3Rbcl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KHRoaXMudGV4dCk7XG4gICAgfSwgU3UucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciB0ID0gMCwgZSA9IDA7IGUgPCB0aGlzLnRleHQubGVuZ3RoICYmIEl1W3RoaXMudGV4dC5jaGFyQ29kZUF0KGUpXTsgZSsrKSB7XG4gICAgICAgIHQrKztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgciA9IHRoaXMudGV4dC5sZW5ndGgsIG4gPSB0aGlzLnRleHQubGVuZ3RoIC0gMTsgbiA+PSAwICYmIG4gPj0gdCAmJiBJdVt0aGlzLnRleHQuY2hhckNvZGVBdChuKV07IG4tLSkge1xuICAgICAgICByLS07XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcodCwgciksIHRoaXMuc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9uSW5kZXguc2xpY2UodCwgcik7XG4gICAgfSwgU3UucHJvdG90eXBlLnN1YnN0cmluZyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IG5ldyBTdSgpO1xuICAgICAgcmV0dXJuIHIudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcodCwgZSksIHIuc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9uSW5kZXguc2xpY2UodCwgZSksIHIuc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zLCByO1xuICAgIH0sIFN1LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfSwgU3UucHJvdG90eXBlLmdldE1heFNjYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4LnJlZHVjZShmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoZSwgdC5zZWN0aW9uc1tyXS5zY2FsZSk7XG4gICAgICB9LCAwKTtcbiAgICB9LCBTdS5wcm90b3R5cGUuYWRkVGV4dFNlY3Rpb24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy50ZXh0ICs9IHQudGV4dCwgdGhpcy5zZWN0aW9ucy5wdXNoKEF1LmZvclRleHQodC5zY2FsZSwgdC5mb250U3RhY2sgfHwgZSkpO1xuXG4gICAgICBmb3IgKHZhciByID0gdGhpcy5zZWN0aW9ucy5sZW5ndGggLSAxLCBuID0gMDsgbiA8IHQudGV4dC5sZW5ndGg7ICsrbikge1xuICAgICAgICB0aGlzLnNlY3Rpb25JbmRleC5wdXNoKHIpO1xuICAgICAgfVxuICAgIH0sIFN1LnByb3RvdHlwZS5hZGRJbWFnZVNlY3Rpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0LmltYWdlID8gdC5pbWFnZS5uYW1lIDogXCJcIjtcblxuICAgICAgaWYgKDAgIT09IGUubGVuZ3RoKSB7XG4gICAgICAgIHZhciByID0gdGhpcy5nZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUoKTtcbiAgICAgICAgciA/ICh0aGlzLnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyKSwgdGhpcy5zZWN0aW9ucy5wdXNoKEF1LmZvckltYWdlKGUpKSwgdGhpcy5zZWN0aW9uSW5kZXgucHVzaCh0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDEpKSA6IEEoXCJSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyA2NDAxXCIpO1xuICAgICAgfSBlbHNlIEEoXCJDYW4ndCBhZGQgRm9ybWF0dGVkU2VjdGlvbiB3aXRoIGFuIGVtcHR5IGltYWdlLlwiKTtcbiAgICB9LCBTdS5wcm90b3R5cGUuZ2V0TmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VTZWN0aW9uSUQgPyB0aGlzLmltYWdlU2VjdGlvbklEID49IDYzNzQzID8gbnVsbCA6ICsrdGhpcy5pbWFnZVNlY3Rpb25JRCA6ICh0aGlzLmltYWdlU2VjdGlvbklEID0gNTczNDQsIHRoaXMuaW1hZ2VTZWN0aW9uSUQpO1xuICAgIH07XG4gICAgdmFyIEl1ID0ge1xuICAgICAgOTogITAsXG4gICAgICAxMDogITAsXG4gICAgICAxMTogITAsXG4gICAgICAxMjogITAsXG4gICAgICAxMzogITAsXG4gICAgICAzMjogITBcbiAgICB9LFxuICAgICAgICB6dSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gQ3UodCwgZSwgciwgbiwgaSwgYSkge1xuICAgICAgaWYgKGUuaW1hZ2VOYW1lKSB7XG4gICAgICAgIHZhciBvID0gbltlLmltYWdlTmFtZV07XG4gICAgICAgIHJldHVybiBvID8gby5kaXNwbGF5U2l6ZVswXSAqIGUuc2NhbGUgKiAyNCAvIGEgKyBpIDogMDtcbiAgICAgIH1cblxuICAgICAgdmFyIHMgPSByW2UuZm9udFN0YWNrXSxcbiAgICAgICAgICB1ID0gcyAmJiBzW3RdO1xuICAgICAgcmV0dXJuIHUgPyB1Lm1ldHJpY3MuYWR2YW5jZSAqIGUuc2NhbGUgKyBpIDogMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBFdSh0LCBlLCByLCBuKSB7XG4gICAgICB2YXIgaSA9IE1hdGgucG93KHQgLSBlLCAyKTtcbiAgICAgIHJldHVybiBuID8gdCA8IGUgPyBpIC8gMiA6IDIgKiBpIDogaSArIE1hdGguYWJzKHIpICogcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBQdSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICByZXR1cm4gMTAgPT09IHQgJiYgKG4gLT0gMWU0KSwgciAmJiAobiArPSAxNTApLCA0MCAhPT0gdCAmJiA2NTI4OCAhPT0gdCB8fCAobiArPSA1MCksIDQxICE9PSBlICYmIDY1Mjg5ICE9PSBlIHx8IChuICs9IDUwKSwgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBNdSh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBmb3IgKHZhciBvID0gbnVsbCwgcyA9IEV1KGUsIHIsIGksIGEpLCB1ID0gMCwgbCA9IG47IHUgPCBsLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgIHZhciBwID0gbFt1XSxcbiAgICAgICAgICAgIGMgPSBFdShlIC0gcC54LCByLCBpLCBhKSArIHAuYmFkbmVzcztcbiAgICAgICAgYyA8PSBzICYmIChvID0gcCwgcyA9IGMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdCxcbiAgICAgICAgeDogZSxcbiAgICAgICAgcHJpb3JCcmVhazogbyxcbiAgICAgICAgYmFkbmVzczogc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCdSh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICBpZiAoXCJwb2ludFwiICE9PSBhKSByZXR1cm4gW107XG4gICAgICBpZiAoIXQpIHJldHVybiBbXTtcblxuICAgICAgZm9yICh2YXIgcywgdSA9IFtdLCBsID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IDAsIHMgPSAwOyBzIDwgdC5sZW5ndGgoKTsgcysrKSB7XG4gICAgICAgICAgdmFyIHUgPSB0LmdldFNlY3Rpb24ocyk7XG4gICAgICAgICAgbyArPSBDdSh0LmdldENoYXJDb2RlKHMpLCB1LCBuLCBpLCBlLCBhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvIC8gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG8gLyByKSk7XG4gICAgICB9KHQsIGUsIHIsIG4sIGksIG8pLCBwID0gdC50ZXh0LmluZGV4T2YoXCLigItcIikgPj0gMCwgYyA9IDAsIGggPSAwOyBoIDwgdC5sZW5ndGgoKTsgaCsrKSB7XG4gICAgICAgIHZhciBmID0gdC5nZXRTZWN0aW9uKGgpLFxuICAgICAgICAgICAgeSA9IHQuZ2V0Q2hhckNvZGUoaCk7XG5cbiAgICAgICAgaWYgKEl1W3ldIHx8IChjICs9IEN1KHksIGYsIG4sIGksIGUsIG8pKSwgaCA8IHQubGVuZ3RoKCkgLSAxKSB7XG4gICAgICAgICAgdmFyIGQgPSAhKChzID0geSkgPCAxMTkwNCB8fCAhKFpuW1wiQm9wb21vZm8gRXh0ZW5kZWRcIl0ocykgfHwgWm4uQm9wb21vZm8ocykgfHwgWm5bXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiXShzKSB8fCBabltcIkNKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcIl0ocykgfHwgWm5bXCJDSksgQ29tcGF0aWJpbGl0eVwiXShzKSB8fCBabltcIkNKSyBSYWRpY2FscyBTdXBwbGVtZW50XCJdKHMpIHx8IFpuW1wiQ0pLIFN0cm9rZXNcIl0ocykgfHwgWm5bXCJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb25cIl0ocykgfHwgWm5bXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBXCJdKHMpIHx8IFpuW1wiQ0pLIFVuaWZpZWQgSWRlb2dyYXBoc1wiXShzKSB8fCBabltcIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHNcIl0ocykgfHwgWm5bXCJIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1wiXShzKSB8fCBabi5IaXJhZ2FuYShzKSB8fCBabltcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIl0ocykgfHwgWm5bXCJLYW5neGkgUmFkaWNhbHNcIl0ocykgfHwgWm5bXCJLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zXCJdKHMpIHx8IFpuLkthdGFrYW5hKHMpIHx8IFpuW1wiVmVydGljYWwgRm9ybXNcIl0ocykgfHwgWm5bXCJZaSBSYWRpY2Fsc1wiXShzKSB8fCBabltcIllpIFN5bGxhYmxlc1wiXShzKSkpO1xuICAgICAgICAgICh6dVt5XSB8fCBkIHx8IGYuaW1hZ2VOYW1lKSAmJiB1LnB1c2goTXUoaCArIDEsIGMsIGwsIHUsIFB1KHksIHQuZ2V0Q2hhckNvZGUoaCArIDEpLCBkICYmIHApLCAhMSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiB0KGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyB0KGUucHJpb3JCcmVhaykuY29uY2F0KGUuaW5kZXgpIDogW107XG4gICAgICB9KE11KHQubGVuZ3RoKCksIGMsIGwsIHUsIDAsICEwKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVHUodCkge1xuICAgICAgdmFyIGUgPSAuNSxcbiAgICAgICAgICByID0gLjU7XG5cbiAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgICAgZSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgY2FzZSBcInRvcC1sZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJib3R0b20tbGVmdFwiOlxuICAgICAgICAgIGUgPSAwO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgIGNhc2UgXCJib3R0b20tbGVmdFwiOlxuICAgICAgICAgIHIgPSAxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgICByID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBlLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiByXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFZ1KHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGlmIChuIHx8IGkpIGZvciAodmFyIGEgPSB0W3JdLCBvID0gKHRbcl0ueCArIGEubWV0cmljcy5hZHZhbmNlICogYS5zY2FsZSkgKiBuLCBzID0gZTsgcyA8PSByOyBzKyspIHtcbiAgICAgICAgdFtzXS54IC09IG8sIHRbc10ueSArPSBpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIEZ1KHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHZhciBvLFxuICAgICAgICAgIHMgPSB0LmltYWdlO1xuXG4gICAgICBpZiAocy5jb250ZW50KSB7XG4gICAgICAgIHZhciB1ID0gcy5jb250ZW50LFxuICAgICAgICAgICAgbCA9IHMucGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICBvID0gW3VbMF0gLyBsLCB1WzFdIC8gbCwgcy5kaXNwbGF5U2l6ZVswXSAtIHVbMl0gLyBsLCBzLmRpc3BsYXlTaXplWzFdIC0gdVszXSAvIGxdO1xuICAgICAgfVxuXG4gICAgICB2YXIgcCxcbiAgICAgICAgICBjLFxuICAgICAgICAgIGgsXG4gICAgICAgICAgZixcbiAgICAgICAgICB5ID0gZS5sZWZ0ICogYSxcbiAgICAgICAgICBkID0gZS5yaWdodCAqIGE7XG4gICAgICBcIndpZHRoXCIgPT09IHIgfHwgXCJib3RoXCIgPT09IHIgPyAoZiA9IGlbMF0gKyB5IC0gblszXSwgYyA9IGlbMF0gKyBkICsgblsxXSkgOiBjID0gKGYgPSBpWzBdICsgKHkgKyBkIC0gcy5kaXNwbGF5U2l6ZVswXSkgLyAyKSArIHMuZGlzcGxheVNpemVbMF07XG4gICAgICB2YXIgbSA9IGUudG9wICogYSxcbiAgICAgICAgICB2ID0gZS5ib3R0b20gKiBhO1xuICAgICAgcmV0dXJuIFwiaGVpZ2h0XCIgPT09IHIgfHwgXCJib3RoXCIgPT09IHIgPyAocCA9IGlbMV0gKyBtIC0gblswXSwgaCA9IGlbMV0gKyB2ICsgblsyXSkgOiBoID0gKHAgPSBpWzFdICsgKG0gKyB2IC0gcy5kaXNwbGF5U2l6ZVsxXSkgLyAyKSArIHMuZGlzcGxheVNpemVbMV0sIHtcbiAgICAgICAgaW1hZ2U6IHMsXG4gICAgICAgIHRvcDogcCxcbiAgICAgICAgcmlnaHQ6IGMsXG4gICAgICAgIGJvdHRvbTogaCxcbiAgICAgICAgbGVmdDogZixcbiAgICAgICAgY29sbGlzaW9uUGFkZGluZzogb1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB6dVsxMF0gPSAhMCwgenVbMzJdID0gITAsIHp1WzM4XSA9ICEwLCB6dVs0MF0gPSAhMCwgenVbNDFdID0gITAsIHp1WzQzXSA9ICEwLCB6dVs0NV0gPSAhMCwgenVbNDddID0gITAsIHp1WzE3M10gPSAhMCwgenVbMTgzXSA9ICEwLCB6dVs4MjAzXSA9ICEwLCB6dVs4MjA4XSA9ICEwLCB6dVs4MjExXSA9ICEwLCB6dVs4MjMxXSA9ICEwO1xuXG4gICAgdmFyIER1ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgciwgbiwgaSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgciksIHRoaXMuYW5nbGUgPSBuLCB2b2lkIDAgIT09IGkgJiYgKHRoaXMuc2VnbWVudCA9IGkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBlKHRoaXMueCwgdGhpcy55LCB0aGlzLmFuZ2xlLCB0aGlzLnNlZ21lbnQpO1xuICAgICAgfSwgZTtcbiAgICB9KGkpO1xuXG4gICAgZnVuY3Rpb24gTHUodCwgZSkge1xuICAgICAgdmFyIHIgPSBlLmV4cHJlc3Npb247XG4gICAgICBpZiAoXCJjb25zdGFudFwiID09PSByLmtpbmQpIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwiY29uc3RhbnRcIixcbiAgICAgICAgbGF5b3V0U2l6ZTogci5ldmFsdWF0ZShuZXcgdWkodCArIDEpKVxuICAgICAgfTtcbiAgICAgIGlmIChcInNvdXJjZVwiID09PSByLmtpbmQpIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwic291cmNlXCJcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIG4gPSByLnpvb21TdG9wcywgaSA9IHIuaW50ZXJwb2xhdGlvblR5cGUsIGEgPSAwOyBhIDwgbi5sZW5ndGggJiYgblthXSA8PSB0Oykge1xuICAgICAgICBhKys7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG8gPSBhID0gTWF0aC5tYXgoMCwgYSAtIDEpOyBvIDwgbi5sZW5ndGggJiYgbltvXSA8IHQgKyAxOykge1xuICAgICAgICBvKys7XG4gICAgICB9XG5cbiAgICAgIG8gPSBNYXRoLm1pbihuLmxlbmd0aCAtIDEsIG8pO1xuICAgICAgdmFyIHMgPSBuW2FdLFxuICAgICAgICAgIHUgPSBuW29dO1xuICAgICAgcmV0dXJuIFwiY29tcG9zaXRlXCIgPT09IHIua2luZCA/IHtcbiAgICAgICAga2luZDogXCJjb21wb3NpdGVcIixcbiAgICAgICAgbWluWm9vbTogcyxcbiAgICAgICAgbWF4Wm9vbTogdSxcbiAgICAgICAgaW50ZXJwb2xhdGlvblR5cGU6IGlcbiAgICAgIH0gOiB7XG4gICAgICAgIGtpbmQ6IFwiY2FtZXJhXCIsXG4gICAgICAgIG1pblpvb206IHMsXG4gICAgICAgIG1heFpvb206IHUsXG4gICAgICAgIG1pblNpemU6IHIuZXZhbHVhdGUobmV3IHVpKHMpKSxcbiAgICAgICAgbWF4U2l6ZTogci5ldmFsdWF0ZShuZXcgdWkodSkpLFxuICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZTogaVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBSdSh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGUudVNpemUsXG4gICAgICAgICAgaSA9IHIubG93ZXJTaXplO1xuICAgICAgcmV0dXJuIFwic291cmNlXCIgPT09IHQua2luZCA/IGkgLyAxMjggOiBcImNvbXBvc2l0ZVwiID09PSB0LmtpbmQgPyBHZShpIC8gMTI4LCByLnVwcGVyU2l6ZSAvIDEyOCwgZS51U2l6ZVQpIDogbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBPdSh0LCBlKSB7XG4gICAgICB2YXIgciA9IDAsXG4gICAgICAgICAgbiA9IDA7XG4gICAgICBpZiAoXCJjb25zdGFudFwiID09PSB0LmtpbmQpIG4gPSB0LmxheW91dFNpemU7ZWxzZSBpZiAoXCJzb3VyY2VcIiAhPT0gdC5raW5kKSB7XG4gICAgICAgIHZhciBpID0gdC5pbnRlcnBvbGF0aW9uVHlwZSxcbiAgICAgICAgICAgIGEgPSBpID8gcChvci5pbnRlcnBvbGF0aW9uRmFjdG9yKGksIGUsIHQubWluWm9vbSwgdC5tYXhab29tKSwgMCwgMSkgOiAwO1xuICAgICAgICBcImNhbWVyYVwiID09PSB0LmtpbmQgPyBuID0gR2UodC5taW5TaXplLCB0Lm1heFNpemUsIGEpIDogciA9IGE7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1U2l6ZVQ6IHIsXG4gICAgICAgIHVTaXplOiBuXG4gICAgICB9O1xuICAgIH1cblxuICAgIE9uKFwiQW5jaG9yXCIsIER1KTtcbiAgICB2YXIgVXUgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgIGdldFNpemVEYXRhOiBMdSxcbiAgICAgIGV2YWx1YXRlU2l6ZUZvckZlYXR1cmU6IFJ1LFxuICAgICAgZXZhbHVhdGVTaXplRm9yWm9vbTogT3UsXG4gICAgICBTSVpFX1BBQ0tfRkFDVE9SOiAxMjhcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGp1KHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IGUuc2VnbWVudCkgcmV0dXJuICEwO1xuXG4gICAgICBmb3IgKHZhciBhID0gZSwgbyA9IGUuc2VnbWVudCArIDEsIHMgPSAwOyBzID4gLXIgLyAyOykge1xuICAgICAgICBpZiAoLS1vIDwgMCkgcmV0dXJuICExO1xuICAgICAgICBzIC09IHRbb10uZGlzdChhKSwgYSA9IHRbb107XG4gICAgICB9XG5cbiAgICAgIHMgKz0gdFtvXS5kaXN0KHRbbyArIDFdKSwgbysrO1xuXG4gICAgICBmb3IgKHZhciB1ID0gW10sIGwgPSAwOyBzIDwgciAvIDI7KSB7XG4gICAgICAgIHZhciBwID0gdFtvXSxcbiAgICAgICAgICAgIGMgPSB0W28gKyAxXTtcbiAgICAgICAgaWYgKCFjKSByZXR1cm4gITE7XG4gICAgICAgIHZhciBoID0gdFtvIC0gMV0uYW5nbGVUbyhwKSAtIHAuYW5nbGVUbyhjKTtcblxuICAgICAgICBmb3IgKGggPSBNYXRoLmFicygoaCArIDMgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkgLSBNYXRoLlBJKSwgdS5wdXNoKHtcbiAgICAgICAgICBkaXN0YW5jZTogcyxcbiAgICAgICAgICBhbmdsZURlbHRhOiBoXG4gICAgICAgIH0pLCBsICs9IGg7IHMgLSB1WzBdLmRpc3RhbmNlID4gbjspIHtcbiAgICAgICAgICBsIC09IHUuc2hpZnQoKS5hbmdsZURlbHRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGwgPiBpKSByZXR1cm4gITE7XG4gICAgICAgIG8rKywgcyArPSBwLmRpc3QoYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxdSh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IDA7IHIgPCB0Lmxlbmd0aCAtIDE7IHIrKykge1xuICAgICAgICBlICs9IHRbcl0uZGlzdCh0W3IgKyAxXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE51KHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0ID8gLjYgKiBlICogciA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gS3UodCwgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHQgPyB0LnJpZ2h0IC0gdC5sZWZ0IDogMCwgZSA/IGUucmlnaHQgLSBlLmxlZnQgOiAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHdSh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICBmb3IgKHZhciBvID0gTnUociwgaSwgYSksIHMgPSBLdShyLCBuKSAqIGEsIHUgPSAwLCBsID0gcXUodCkgLyAyLCBwID0gMDsgcCA8IHQubGVuZ3RoIC0gMTsgcCsrKSB7XG4gICAgICAgIHZhciBjID0gdFtwXSxcbiAgICAgICAgICAgIGggPSB0W3AgKyAxXSxcbiAgICAgICAgICAgIGYgPSBjLmRpc3QoaCk7XG5cbiAgICAgICAgaWYgKHUgKyBmID4gbCkge1xuICAgICAgICAgIHZhciB5ID0gKGwgLSB1KSAvIGYsXG4gICAgICAgICAgICAgIGQgPSBHZShjLngsIGgueCwgeSksXG4gICAgICAgICAgICAgIG0gPSBHZShjLnksIGgueSwgeSksXG4gICAgICAgICAgICAgIHYgPSBuZXcgRHUoZCwgbSwgaC5hbmdsZVRvKGMpLCBwKTtcbiAgICAgICAgICByZXR1cm4gdi5fcm91bmQoKSwgIW8gfHwganUodCwgdiwgcywgbywgZSkgPyB2IDogdm9pZCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdSArPSBmO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIFp1KHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUpIHtcbiAgICAgIHZhciBsID0gTnUobiwgYSwgbyksXG4gICAgICAgICAgcCA9IEt1KG4sIGkpLFxuICAgICAgICAgIGMgPSBwICogbyxcbiAgICAgICAgICBoID0gMCA9PT0gdFswXS54IHx8IHRbMF0ueCA9PT0gdSB8fCAwID09PSB0WzBdLnkgfHwgdFswXS55ID09PSB1O1xuICAgICAgcmV0dXJuIGUgLSBjIDwgZSAvIDQgJiYgKGUgPSBjICsgZSAvIDQpLCBmdW5jdGlvbiB0KGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwpIHtcbiAgICAgICAgZm9yICh2YXIgcCA9IG8gLyAyLCBjID0gcXUoZSksIGggPSAwLCBmID0gciAtIG4sIHkgPSBbXSwgZCA9IDA7IGQgPCBlLmxlbmd0aCAtIDE7IGQrKykge1xuICAgICAgICAgIGZvciAodmFyIG0gPSBlW2RdLCB2ID0gZVtkICsgMV0sIGcgPSBtLmRpc3QodiksIHggPSB2LmFuZ2xlVG8obSk7IGYgKyBuIDwgaCArIGc7KSB7XG4gICAgICAgICAgICB2YXIgYiA9ICgoZiArPSBuKSAtIGgpIC8gZyxcbiAgICAgICAgICAgICAgICB3ID0gR2UobS54LCB2LngsIGIpLFxuICAgICAgICAgICAgICAgIF8gPSBHZShtLnksIHYueSwgYik7XG5cbiAgICAgICAgICAgIGlmICh3ID49IDAgJiYgdyA8IGwgJiYgXyA+PSAwICYmIF8gPCBsICYmIGYgLSBwID49IDAgJiYgZiArIHAgPD0gYykge1xuICAgICAgICAgICAgICB2YXIgQSA9IG5ldyBEdSh3LCBfLCB4LCBkKTtcbiAgICAgICAgICAgICAgQS5fcm91bmQoKSwgaSAmJiAhanUoZSwgQSwgbywgaSwgYSkgfHwgeS5wdXNoKEEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGggKz0gZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1IHx8IHkubGVuZ3RoIHx8IHMgfHwgKHkgPSB0KGUsIGggLyAyLCBuLCBpLCBhLCBvLCBzLCAhMCwgbCkpLCB5O1xuICAgICAgfSh0LCBoID8gZSAvIDIgKiBzICUgZSA6IChwIC8gMiArIDIgKiBhKSAqIG8gKiBzICUgZSwgZSwgbCwgciwgYywgaCwgITEsIHUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFh1KHQsIGUsIHIsIG4sIGEpIHtcbiAgICAgIGZvciAodmFyIG8gPSBbXSwgcyA9IDA7IHMgPCB0Lmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGZvciAodmFyIHUgPSB0W3NdLCBsID0gdm9pZCAwLCBwID0gMDsgcCA8IHUubGVuZ3RoIC0gMTsgcCsrKSB7XG4gICAgICAgICAgdmFyIGMgPSB1W3BdLFxuICAgICAgICAgICAgICBoID0gdVtwICsgMV07XG4gICAgICAgICAgYy54IDwgZSAmJiBoLnggPCBlIHx8IChjLnggPCBlID8gYyA9IG5ldyBpKGUsIGMueSArIChlIC0gYy54KSAvIChoLnggLSBjLngpICogKGgueSAtIGMueSkpLl9yb3VuZCgpIDogaC54IDwgZSAmJiAoaCA9IG5ldyBpKGUsIGMueSArIChlIC0gYy54KSAvIChoLnggLSBjLngpICogKGgueSAtIGMueSkpLl9yb3VuZCgpKSwgYy55IDwgciAmJiBoLnkgPCByIHx8IChjLnkgPCByID8gYyA9IG5ldyBpKGMueCArIChyIC0gYy55KSAvIChoLnkgLSBjLnkpICogKGgueCAtIGMueCksIHIpLl9yb3VuZCgpIDogaC55IDwgciAmJiAoaCA9IG5ldyBpKGMueCArIChyIC0gYy55KSAvIChoLnkgLSBjLnkpICogKGgueCAtIGMueCksIHIpLl9yb3VuZCgpKSwgYy54ID49IG4gJiYgaC54ID49IG4gfHwgKGMueCA+PSBuID8gYyA9IG5ldyBpKG4sIGMueSArIChuIC0gYy54KSAvIChoLnggLSBjLngpICogKGgueSAtIGMueSkpLl9yb3VuZCgpIDogaC54ID49IG4gJiYgKGggPSBuZXcgaShuLCBjLnkgKyAobiAtIGMueCkgLyAoaC54IC0gYy54KSAqIChoLnkgLSBjLnkpKS5fcm91bmQoKSksIGMueSA+PSBhICYmIGgueSA+PSBhIHx8IChjLnkgPj0gYSA/IGMgPSBuZXcgaShjLnggKyAoYSAtIGMueSkgLyAoaC55IC0gYy55KSAqIChoLnggLSBjLngpLCBhKS5fcm91bmQoKSA6IGgueSA+PSBhICYmIChoID0gbmV3IGkoYy54ICsgKGEgLSBjLnkpIC8gKGgueSAtIGMueSkgKiAoaC54IC0gYy54KSwgYSkuX3JvdW5kKCkpLCBsICYmIGMuZXF1YWxzKGxbbC5sZW5ndGggLSAxXSkgfHwgby5wdXNoKGwgPSBbY10pLCBsLnB1c2goaCkpKSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEp1KHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBhID0gW10sXG4gICAgICAgICAgbyA9IHQuaW1hZ2UsXG4gICAgICAgICAgcyA9IG8ucGl4ZWxSYXRpbyxcbiAgICAgICAgICB1ID0gby5wYWRkZWRSZWN0LncgLSAyLFxuICAgICAgICAgIGwgPSBvLnBhZGRlZFJlY3QuaCAtIDIsXG4gICAgICAgICAgcCA9IHQucmlnaHQgLSB0LmxlZnQsXG4gICAgICAgICAgYyA9IHQuYm90dG9tIC0gdC50b3AsXG4gICAgICAgICAgaCA9IG8uc3RyZXRjaFggfHwgW1swLCB1XV0sXG4gICAgICAgICAgZiA9IG8uc3RyZXRjaFkgfHwgW1swLCBsXV0sXG4gICAgICAgICAgeSA9IGZ1bmN0aW9uIHkodCwgZSkge1xuICAgICAgICByZXR1cm4gdCArIGVbMV0gLSBlWzBdO1xuICAgICAgfSxcbiAgICAgICAgICBkID0gaC5yZWR1Y2UoeSwgMCksXG4gICAgICAgICAgbSA9IGYucmVkdWNlKHksIDApLFxuICAgICAgICAgIHYgPSB1IC0gZCxcbiAgICAgICAgICBnID0gbCAtIG0sXG4gICAgICAgICAgeCA9IDAsXG4gICAgICAgICAgYiA9IGQsXG4gICAgICAgICAgdyA9IDAsXG4gICAgICAgICAgXyA9IG0sXG4gICAgICAgICAgQSA9IDAsXG4gICAgICAgICAgUyA9IHYsXG4gICAgICAgICAgayA9IDAsXG4gICAgICAgICAgSSA9IGc7XG5cbiAgICAgIGlmIChvLmNvbnRlbnQgJiYgbikge1xuICAgICAgICB2YXIgeiA9IG8uY29udGVudDtcbiAgICAgICAgeCA9IEh1KGgsIDAsIHpbMF0pLCB3ID0gSHUoZiwgMCwgelsxXSksIGIgPSBIdShoLCB6WzBdLCB6WzJdKSwgXyA9IEh1KGYsIHpbMV0sIHpbM10pLCBBID0gelswXSAtIHgsIGsgPSB6WzFdIC0gdywgUyA9IHpbMl0gLSB6WzBdIC0gYiwgSSA9IHpbM10gLSB6WzFdIC0gXztcbiAgICAgIH1cblxuICAgICAgdmFyIEMgPSBmdW5jdGlvbiBDKG4sIGEsIHUsIGwpIHtcbiAgICAgICAgdmFyIGggPSAkdShuLnN0cmV0Y2ggLSB4LCBiLCBwLCB0LmxlZnQpLFxuICAgICAgICAgICAgZiA9IFd1KG4uZml4ZWQgLSBBLCBTLCBuLnN0cmV0Y2gsIGQpLFxuICAgICAgICAgICAgeSA9ICR1KGEuc3RyZXRjaCAtIHcsIF8sIGMsIHQudG9wKSxcbiAgICAgICAgICAgIHYgPSBXdShhLmZpeGVkIC0gaywgSSwgYS5zdHJldGNoLCBtKSxcbiAgICAgICAgICAgIGcgPSAkdSh1LnN0cmV0Y2ggLSB4LCBiLCBwLCB0LmxlZnQpLFxuICAgICAgICAgICAgeiA9IFd1KHUuZml4ZWQgLSBBLCBTLCB1LnN0cmV0Y2gsIGQpLFxuICAgICAgICAgICAgQyA9ICR1KGwuc3RyZXRjaCAtIHcsIF8sIGMsIHQudG9wKSxcbiAgICAgICAgICAgIEUgPSBXdShsLmZpeGVkIC0gaywgSSwgbC5zdHJldGNoLCBtKSxcbiAgICAgICAgICAgIFAgPSBuZXcgaShoLCB5KSxcbiAgICAgICAgICAgIE0gPSBuZXcgaShnLCB5KSxcbiAgICAgICAgICAgIEIgPSBuZXcgaShnLCBDKSxcbiAgICAgICAgICAgIFQgPSBuZXcgaShoLCBDKSxcbiAgICAgICAgICAgIFYgPSBuZXcgaShmIC8gcywgdiAvIHMpLFxuICAgICAgICAgICAgRiA9IG5ldyBpKHogLyBzLCBFIC8gcyksXG4gICAgICAgICAgICBEID0gZSAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgICAgaWYgKEQpIHtcbiAgICAgICAgICB2YXIgTCA9IE1hdGguc2luKEQpLFxuICAgICAgICAgICAgICBSID0gTWF0aC5jb3MoRCksXG4gICAgICAgICAgICAgIE8gPSBbUiwgLUwsIEwsIFJdO1xuICAgICAgICAgIFAuX21hdE11bHQoTyksIE0uX21hdE11bHQoTyksIFQuX21hdE11bHQoTyksIEIuX21hdE11bHQoTyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgVSA9IG4uc3RyZXRjaCArIG4uZml4ZWQsXG4gICAgICAgICAgICBqID0gYS5zdHJldGNoICsgYS5maXhlZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bDogUCxcbiAgICAgICAgICB0cjogTSxcbiAgICAgICAgICBibDogVCxcbiAgICAgICAgICBicjogQixcbiAgICAgICAgICB0ZXg6IHtcbiAgICAgICAgICAgIHg6IG8ucGFkZGVkUmVjdC54ICsgMSArIFUsXG4gICAgICAgICAgICB5OiBvLnBhZGRlZFJlY3QueSArIDEgKyBqLFxuICAgICAgICAgICAgdzogdS5zdHJldGNoICsgdS5maXhlZCAtIFUsXG4gICAgICAgICAgICBoOiBsLnN0cmV0Y2ggKyBsLmZpeGVkIC0galxuICAgICAgICAgIH0sXG4gICAgICAgICAgd3JpdGluZ01vZGU6IHZvaWQgMCxcbiAgICAgICAgICBnbHlwaE9mZnNldDogWzAsIDBdLFxuICAgICAgICAgIHNlY3Rpb25JbmRleDogMCxcbiAgICAgICAgICBwaXhlbE9mZnNldFRMOiBWLFxuICAgICAgICAgIHBpeGVsT2Zmc2V0QlI6IEYsXG4gICAgICAgICAgbWluRm9udFNjYWxlWDogUyAvIHMgLyBwLFxuICAgICAgICAgIG1pbkZvbnRTY2FsZVk6IEkgLyBzIC8gYyxcbiAgICAgICAgICBpc1NERjogclxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgaWYgKG4gJiYgKG8uc3RyZXRjaFggfHwgby5zdHJldGNoWSkpIGZvciAodmFyIEUgPSBZdShoLCB2LCBkKSwgUCA9IFl1KGYsIGcsIG0pLCBNID0gMDsgTSA8IEUubGVuZ3RoIC0gMTsgTSsrKSB7XG4gICAgICAgIGZvciAodmFyIEIgPSBFW01dLCBUID0gRVtNICsgMV0sIFYgPSAwOyBWIDwgUC5sZW5ndGggLSAxOyBWKyspIHtcbiAgICAgICAgICBhLnB1c2goQyhCLCBQW1ZdLCBULCBQW1YgKyAxXSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgYS5wdXNoKEMoe1xuICAgICAgICBmaXhlZDogMCxcbiAgICAgICAgc3RyZXRjaDogLTFcbiAgICAgIH0sIHtcbiAgICAgICAgZml4ZWQ6IDAsXG4gICAgICAgIHN0cmV0Y2g6IC0xXG4gICAgICB9LCB7XG4gICAgICAgIGZpeGVkOiAwLFxuICAgICAgICBzdHJldGNoOiB1ICsgMVxuICAgICAgfSwge1xuICAgICAgICBmaXhlZDogMCxcbiAgICAgICAgc3RyZXRjaDogbCArIDFcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEh1KHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSAwLCBpID0gMCwgYSA9IHQ7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXTtcbiAgICAgICAgbiArPSBNYXRoLm1heChlLCBNYXRoLm1pbihyLCBvWzFdKSkgLSBNYXRoLm1heChlLCBNYXRoLm1pbihyLCBvWzBdKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFl1KHQsIGUsIHIpIHtcbiAgICAgIGZvciAodmFyIG4gPSBbe1xuICAgICAgICBmaXhlZDogLTEsXG4gICAgICAgIHN0cmV0Y2g6IDBcbiAgICAgIH1dLCBpID0gMCwgYSA9IHQ7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvID0gYVtpXSxcbiAgICAgICAgICAgIHMgPSBvWzBdLFxuICAgICAgICAgICAgdSA9IG9bMV0sXG4gICAgICAgICAgICBsID0gbltuLmxlbmd0aCAtIDFdO1xuICAgICAgICBuLnB1c2goe1xuICAgICAgICAgIGZpeGVkOiBzIC0gbC5zdHJldGNoLFxuICAgICAgICAgIHN0cmV0Y2g6IGwuc3RyZXRjaFxuICAgICAgICB9KSwgbi5wdXNoKHtcbiAgICAgICAgICBmaXhlZDogcyAtIGwuc3RyZXRjaCxcbiAgICAgICAgICBzdHJldGNoOiBsLnN0cmV0Y2ggKyAodSAtIHMpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbi5wdXNoKHtcbiAgICAgICAgZml4ZWQ6IGUgKyAxLFxuICAgICAgICBzdHJldGNoOiByXG4gICAgICB9KSwgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkdSh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gdCAvIGUgKiByICsgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXdSh0LCBlLCByLCBuKSB7XG4gICAgICByZXR1cm4gdCAtIGUgKiByIC8gbjtcbiAgICB9XG5cbiAgICB2YXIgUXUgPSBmdW5jdGlvbiBRdSh0LCBlLCByLCBuLCBhLCBvLCBzLCB1LCBsLCBwKSB7XG4gICAgICBpZiAodGhpcy5ib3hTdGFydEluZGV4ID0gdC5sZW5ndGgsIGwpIHtcbiAgICAgICAgdmFyIGMgPSBvLnRvcCxcbiAgICAgICAgICAgIGggPSBvLmJvdHRvbSxcbiAgICAgICAgICAgIGYgPSBvLmNvbGxpc2lvblBhZGRpbmc7XG4gICAgICAgIGYgJiYgKGMgLT0gZlsxXSwgaCArPSBmWzNdKTtcbiAgICAgICAgdmFyIHkgPSBoIC0gYztcbiAgICAgICAgeSA+IDAgJiYgKHkgPSBNYXRoLm1heCgxMCwgeSksIHRoaXMuY2lyY2xlRGlhbWV0ZXIgPSB5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBkID0gby50b3AgKiBzIC0gdSxcbiAgICAgICAgICAgIG0gPSBvLmJvdHRvbSAqIHMgKyB1LFxuICAgICAgICAgICAgdiA9IG8ubGVmdCAqIHMgLSB1LFxuICAgICAgICAgICAgZyA9IG8ucmlnaHQgKiBzICsgdSxcbiAgICAgICAgICAgIHggPSBvLmNvbGxpc2lvblBhZGRpbmc7XG5cbiAgICAgICAgaWYgKHggJiYgKHYgLT0geFswXSAqIHMsIGQgLT0geFsxXSAqIHMsIGcgKz0geFsyXSAqIHMsIG0gKz0geFszXSAqIHMpLCBwKSB7XG4gICAgICAgICAgdmFyIGIgPSBuZXcgaSh2LCBkKSxcbiAgICAgICAgICAgICAgdyA9IG5ldyBpKGcsIGQpLFxuICAgICAgICAgICAgICBfID0gbmV3IGkodiwgbSksXG4gICAgICAgICAgICAgIEEgPSBuZXcgaShnLCBtKSxcbiAgICAgICAgICAgICAgUyA9IHAgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgICAgICAgYi5fcm90YXRlKFMpLCB3Ll9yb3RhdGUoUyksIF8uX3JvdGF0ZShTKSwgQS5fcm90YXRlKFMpLCB2ID0gTWF0aC5taW4oYi54LCB3LngsIF8ueCwgQS54KSwgZyA9IE1hdGgubWF4KGIueCwgdy54LCBfLngsIEEueCksIGQgPSBNYXRoLm1pbihiLnksIHcueSwgXy55LCBBLnkpLCBtID0gTWF0aC5tYXgoYi55LCB3LnksIF8ueSwgQS55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQuZW1wbGFjZUJhY2soZS54LCBlLnksIHYsIGQsIGcsIG0sIHIsIG4sIGEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJveEVuZEluZGV4ID0gdC5sZW5ndGg7XG4gICAgfSxcbiAgICAgICAgdGwgPSBmdW5jdGlvbiB0bCh0LCBlKSB7XG4gICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gW10pLCB2b2lkIDAgPT09IGUgJiYgKGUgPSBlbCksIHRoaXMuZGF0YSA9IHQsIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aCwgdGhpcy5jb21wYXJlID0gZSwgdGhpcy5sZW5ndGggPiAwKSBmb3IgKHZhciByID0gKHRoaXMubGVuZ3RoID4+IDEpIC0gMTsgciA+PSAwOyByLS0pIHtcbiAgICAgICAgdGhpcy5fZG93bihyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZWwodCwgZSkge1xuICAgICAgcmV0dXJuIHQgPCBlID8gLTEgOiB0ID4gZSA/IDEgOiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJsKHQsIGUsIHIpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDEpLCB2b2lkIDAgPT09IHIgJiYgKHIgPSAhMSk7XG5cbiAgICAgIGZvciAodmFyIG4gPSAxIC8gMCwgYSA9IDEgLyAwLCBvID0gLTEgLyAwLCBzID0gLTEgLyAwLCB1ID0gdFswXSwgbCA9IDA7IGwgPCB1Lmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciBwID0gdVtsXTtcbiAgICAgICAgKCFsIHx8IHAueCA8IG4pICYmIChuID0gcC54KSwgKCFsIHx8IHAueSA8IGEpICYmIChhID0gcC55KSwgKCFsIHx8IHAueCA+IG8pICYmIChvID0gcC54KSwgKCFsIHx8IHAueSA+IHMpICYmIChzID0gcC55KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGMgPSBNYXRoLm1pbihvIC0gbiwgcyAtIGEpLFxuICAgICAgICAgIGggPSBjIC8gMixcbiAgICAgICAgICBmID0gbmV3IHRsKFtdLCBubCk7XG4gICAgICBpZiAoMCA9PT0gYykgcmV0dXJuIG5ldyBpKG4sIGEpO1xuXG4gICAgICBmb3IgKHZhciB5ID0gbjsgeSA8IG87IHkgKz0gYykge1xuICAgICAgICBmb3IgKHZhciBkID0gYTsgZCA8IHM7IGQgKz0gYykge1xuICAgICAgICAgIGYucHVzaChuZXcgaWwoeSArIGgsIGQgKyBoLCBoLCB0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgbSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCByID0gMCwgbiA9IDAsIGkgPSB0WzBdLCBhID0gMCwgbyA9IGkubGVuZ3RoLCBzID0gbyAtIDE7IGEgPCBvOyBzID0gYSsrKSB7XG4gICAgICAgICAgdmFyIHUgPSBpW2FdLFxuICAgICAgICAgICAgICBsID0gaVtzXSxcbiAgICAgICAgICAgICAgcCA9IHUueCAqIGwueSAtIGwueCAqIHUueTtcbiAgICAgICAgICByICs9ICh1LnggKyBsLngpICogcCwgbiArPSAodS55ICsgbC55KSAqIHAsIGUgKz0gMyAqIHA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IGlsKHIgLyBlLCBuIC8gZSwgMCwgdCk7XG4gICAgICB9KHQpLCB2ID0gZi5sZW5ndGg7IGYubGVuZ3RoOykge1xuICAgICAgICB2YXIgZyA9IGYucG9wKCk7XG4gICAgICAgIChnLmQgPiBtLmQgfHwgIW0uZCkgJiYgKG0gPSBnLCByICYmIGNvbnNvbGUubG9nKFwiZm91bmQgYmVzdCAlZCBhZnRlciAlZCBwcm9iZXNcIiwgTWF0aC5yb3VuZCgxZTQgKiBnLmQpIC8gMWU0LCB2KSksIGcubWF4IC0gbS5kIDw9IGUgfHwgKGYucHVzaChuZXcgaWwoZy5wLnggLSAoaCA9IGcuaCAvIDIpLCBnLnAueSAtIGgsIGgsIHQpKSwgZi5wdXNoKG5ldyBpbChnLnAueCArIGgsIGcucC55IC0gaCwgaCwgdCkpLCBmLnB1c2gobmV3IGlsKGcucC54IC0gaCwgZy5wLnkgKyBoLCBoLCB0KSksIGYucHVzaChuZXcgaWwoZy5wLnggKyBoLCBnLnAueSArIGgsIGgsIHQpKSwgdiArPSA0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHIgJiYgKGNvbnNvbGUubG9nKFwibnVtIHByb2JlczogXCIgKyB2KSwgY29uc29sZS5sb2coXCJiZXN0IGRpc3RhbmNlOiBcIiArIG0uZCkpLCBtLnA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmwodCwgZSkge1xuICAgICAgcmV0dXJuIGUubWF4IC0gdC5tYXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaWwodCwgZSwgciwgbikge1xuICAgICAgdGhpcy5wID0gbmV3IGkodCwgZSksIHRoaXMuaCA9IHIsIHRoaXMuZCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIHIgPSAhMSwgbiA9IDEgLyAwLCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBhID0gZVtpXSwgbyA9IDAsIHMgPSBhLmxlbmd0aCwgdSA9IHMgLSAxOyBvIDwgczsgdSA9IG8rKykge1xuICAgICAgICAgICAgdmFyIGwgPSBhW29dLFxuICAgICAgICAgICAgICAgIHAgPSBhW3VdO1xuICAgICAgICAgICAgbC55ID4gdC55ICE9IHAueSA+IHQueSAmJiB0LnggPCAocC54IC0gbC54KSAqICh0LnkgLSBsLnkpIC8gKHAueSAtIGwueSkgKyBsLnggJiYgKHIgPSAhciksIG4gPSBNYXRoLm1pbihuLCAkYSh0LCBsLCBwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyID8gMSA6IC0xKSAqIE1hdGguc3FydChuKTtcbiAgICAgIH0odGhpcy5wLCBuKSwgdGhpcy5tYXggPSB0aGlzLmQgKyB0aGlzLmggKiBNYXRoLlNRUlQyO1xuICAgIH1cblxuICAgIHRsLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuZGF0YS5wdXNoKHQpLCB0aGlzLmxlbmd0aCsrLCB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH0sIHRsLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoMCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmRhdGFbMF0sXG4gICAgICAgICAgICBlID0gdGhpcy5kYXRhLnBvcCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGgtLSwgdGhpcy5sZW5ndGggPiAwICYmICh0aGlzLmRhdGFbMF0gPSBlLCB0aGlzLl9kb3duKDApKSwgdDtcbiAgICAgIH1cbiAgICB9LCB0bC5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfSwgdGwucHJvdG90eXBlLl91cCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5kYXRhLCByID0gdGhpcy5jb21wYXJlLCBuID0gZVt0XTsgdCA+IDA7KSB7XG4gICAgICAgIHZhciBpID0gdCAtIDEgPj4gMSxcbiAgICAgICAgICAgIGEgPSBlW2ldO1xuICAgICAgICBpZiAocihuLCBhKSA+PSAwKSBicmVhaztcbiAgICAgICAgZVt0XSA9IGEsIHQgPSBpO1xuICAgICAgfVxuXG4gICAgICBlW3RdID0gbjtcbiAgICB9LCB0bC5wcm90b3R5cGUuX2Rvd24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IHRoaXMuZGF0YSwgciA9IHRoaXMuY29tcGFyZSwgbiA9IHRoaXMubGVuZ3RoID4+IDEsIGkgPSBlW3RdOyB0IDwgbjspIHtcbiAgICAgICAgdmFyIGEgPSAxICsgKHQgPDwgMSksXG4gICAgICAgICAgICBvID0gZVthXSxcbiAgICAgICAgICAgIHMgPSBhICsgMTtcbiAgICAgICAgaWYgKHMgPCB0aGlzLmxlbmd0aCAmJiByKGVbc10sIG8pIDwgMCAmJiAoYSA9IHMsIG8gPSBlW3NdKSwgcihvLCBpKSA+PSAwKSBicmVhaztcbiAgICAgICAgZVt0XSA9IG8sIHQgPSBhO1xuICAgICAgfVxuXG4gICAgICBlW3RdID0gaTtcbiAgICB9O1xuICAgIHZhciBhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIGZ1bmN0aW9uIG9sKHQsIGUpIHtcbiAgICAgIHJldHVybiBlWzFdICE9PSBhbCA/IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIHZhciBuID0gMCxcbiAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAoZSA9IE1hdGguYWJzKGUpLCByID0gTWF0aC5hYnMociksIHQpIHtcbiAgICAgICAgICBjYXNlIFwidG9wLXJpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcInRvcC1sZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgaSA9IHIgLSA3O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgaSA9IDcgLSByO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSBcInRvcC1yaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJib3R0b20tcmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgIG4gPSAtZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInRvcC1sZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1sZWZ0XCI6XG4gICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgIG4gPSBlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtuLCBpXTtcbiAgICAgIH0odCwgZVswXSwgZVsxXSkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IDAsXG4gICAgICAgICAgICBuID0gMDtcbiAgICAgICAgZSA8IDAgJiYgKGUgPSAwKTtcbiAgICAgICAgdmFyIGkgPSBlIC8gTWF0aC5zcXJ0KDIpO1xuXG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgIGNhc2UgXCJ0b3AtcmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwidG9wLWxlZnRcIjpcbiAgICAgICAgICAgIG4gPSBpIC0gNztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImJvdHRvbS1yaWdodFwiOlxuICAgICAgICAgIGNhc2UgXCJib3R0b20tbGVmdFwiOlxuICAgICAgICAgICAgbiA9IDcgLSBpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICBuID0gNyAtIGU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgICAgICAgIG4gPSBlIC0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgIGNhc2UgXCJ0b3AtcmlnaHRcIjpcbiAgICAgICAgICBjYXNlIFwiYm90dG9tLXJpZ2h0XCI6XG4gICAgICAgICAgICByID0gLWk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJ0b3AtbGVmdFwiOlxuICAgICAgICAgIGNhc2UgXCJib3R0b20tbGVmdFwiOlxuICAgICAgICAgICAgciA9IGk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICByID0gZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICByID0gLWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3IsIG5dO1xuICAgICAgfSh0LCBlWzBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbCh0KSB7XG4gICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgIGNhc2UgXCJ0b3AtcmlnaHRcIjpcbiAgICAgICAgY2FzZSBcImJvdHRvbS1yaWdodFwiOlxuICAgICAgICAgIHJldHVybiBcInJpZ2h0XCI7XG5cbiAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgY2FzZSBcInRvcC1sZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJib3R0b20tbGVmdFwiOlxuICAgICAgICAgIHJldHVybiBcImxlZnRcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiY2VudGVyXCI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWwodCwgZSwgciwgbiwgYSwgbywgcywgdSwgbCwgcCwgYywgaCwgZiwgeSwgZCkge1xuICAgICAgdmFyIG0gPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgYSwgbywgcywgdSkge1xuICAgICAgICBmb3IgKHZhciBsID0gbi5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGVcIikuZXZhbHVhdGUobywge30pICogTWF0aC5QSSAvIDE4MCwgcCA9IFtdLCBjID0gMCwgaCA9IGUucG9zaXRpb25lZExpbmVzOyBjIDwgaC5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgIGZvciAodmFyIGYgPSBoW2NdLCB5ID0gMCwgZCA9IGYucG9zaXRpb25lZEdseXBoczsgeSA8IGQubGVuZ3RoOyB5ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBtID0gZFt5XTtcblxuICAgICAgICAgICAgaWYgKG0ucmVjdCkge1xuICAgICAgICAgICAgICB2YXIgdiA9IG0ucmVjdCB8fCB7fSxcbiAgICAgICAgICAgICAgICAgIGcgPSA0LFxuICAgICAgICAgICAgICAgICAgeCA9ICEwLFxuICAgICAgICAgICAgICAgICAgYiA9IDEsXG4gICAgICAgICAgICAgICAgICB3ID0gMCxcbiAgICAgICAgICAgICAgICAgIF8gPSAoYSB8fCB1KSAmJiBtLnZlcnRpY2FsLFxuICAgICAgICAgICAgICAgICAgQSA9IG0ubWV0cmljcy5hZHZhbmNlICogbS5zY2FsZSAvIDI7XG5cbiAgICAgICAgICAgICAgaWYgKHUgJiYgZS52ZXJ0aWNhbGl6YWJsZSAmJiAodyA9IGYubGluZU9mZnNldCAvIDIgLSAobS5pbWFnZU5hbWUgPyAtKDI0IC0gbS5tZXRyaWNzLndpZHRoICogbS5zY2FsZSkgLyAyIDogMjQgKiAobS5zY2FsZSAtIDEpKSksIG0uaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIFMgPSBzW20uaW1hZ2VOYW1lXTtcbiAgICAgICAgICAgICAgICB4ID0gUy5zZGYsIGcgPSAxIC8gKGIgPSBTLnBpeGVsUmF0aW8pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGsgPSBhID8gW20ueCArIEEsIG0ueV0gOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICBJID0gYSA/IFswLCAwXSA6IFttLnggKyBBICsgclswXSwgbS55ICsgclsxXSAtIHddLFxuICAgICAgICAgICAgICAgICAgeiA9IFswLCAwXTtcbiAgICAgICAgICAgICAgXyAmJiAoeiA9IEksIEkgPSBbMCwgMF0pO1xuICAgICAgICAgICAgICB2YXIgQyA9IChtLm1ldHJpY3MubGVmdCAtIGcpICogbS5zY2FsZSAtIEEgKyBJWzBdLFxuICAgICAgICAgICAgICAgICAgRSA9ICgtbS5tZXRyaWNzLnRvcCAtIGcpICogbS5zY2FsZSArIElbMV0sXG4gICAgICAgICAgICAgICAgICBQID0gQyArIHYudyAqIG0uc2NhbGUgLyBiLFxuICAgICAgICAgICAgICAgICAgTSA9IEUgKyB2LmggKiBtLnNjYWxlIC8gYixcbiAgICAgICAgICAgICAgICAgIEIgPSBuZXcgaShDLCBFKSxcbiAgICAgICAgICAgICAgICAgIFQgPSBuZXcgaShQLCBFKSxcbiAgICAgICAgICAgICAgICAgIFYgPSBuZXcgaShDLCBNKSxcbiAgICAgICAgICAgICAgICAgIEYgPSBuZXcgaShQLCBNKTtcblxuICAgICAgICAgICAgICBpZiAoXykge1xuICAgICAgICAgICAgICAgIHZhciBEID0gbmV3IGkoLUEsIEEgLSAtMTcpLFxuICAgICAgICAgICAgICAgICAgICBMID0gLU1hdGguUEkgLyAyLFxuICAgICAgICAgICAgICAgICAgICBSID0gMTIgLSBBLFxuICAgICAgICAgICAgICAgICAgICBPID0gbmV3IGkoMjIgLSBSLCAtKG0uaW1hZ2VOYW1lID8gUiA6IDApKSxcbiAgICAgICAgICAgICAgICAgICAgVSA9IG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoaSwgW251bGxdLmNvbmNhdCh6KSkpKCk7XG4gICAgICAgICAgICAgICAgQi5fcm90YXRlQXJvdW5kKEwsIEQpLl9hZGQoTykuX2FkZChVKSwgVC5fcm90YXRlQXJvdW5kKEwsIEQpLl9hZGQoTykuX2FkZChVKSwgVi5fcm90YXRlQXJvdW5kKEwsIEQpLl9hZGQoTykuX2FkZChVKSwgRi5fcm90YXRlQXJvdW5kKEwsIEQpLl9hZGQoTykuX2FkZChVKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBNYXRoLnNpbihsKSxcbiAgICAgICAgICAgICAgICAgICAgcSA9IE1hdGguY29zKGwpLFxuICAgICAgICAgICAgICAgICAgICBOID0gW3EsIC1qLCBqLCBxXTtcbiAgICAgICAgICAgICAgICBCLl9tYXRNdWx0KE4pLCBULl9tYXRNdWx0KE4pLCBWLl9tYXRNdWx0KE4pLCBGLl9tYXRNdWx0KE4pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIEsgPSBuZXcgaSgwLCAwKSxcbiAgICAgICAgICAgICAgICAgIEcgPSBuZXcgaSgwLCAwKTtcbiAgICAgICAgICAgICAgcC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0bDogQixcbiAgICAgICAgICAgICAgICB0cjogVCxcbiAgICAgICAgICAgICAgICBibDogVixcbiAgICAgICAgICAgICAgICBicjogRixcbiAgICAgICAgICAgICAgICB0ZXg6IHYsXG4gICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IGUud3JpdGluZ01vZGUsXG4gICAgICAgICAgICAgICAgZ2x5cGhPZmZzZXQ6IGssXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4OiBtLnNlY3Rpb25JbmRleCxcbiAgICAgICAgICAgICAgICBpc1NERjogeCxcbiAgICAgICAgICAgICAgICBwaXhlbE9mZnNldFRMOiBLLFxuICAgICAgICAgICAgICAgIHBpeGVsT2Zmc2V0QlI6IEcsXG4gICAgICAgICAgICAgICAgbWluRm9udFNjYWxlWDogMCxcbiAgICAgICAgICAgICAgICBtaW5Gb250U2NhbGVZOiAwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfSgwLCByLCB1LCBhLCBvLCBzLCBuLCB0LmFsbG93VmVydGljYWxQbGFjZW1lbnQpLFxuICAgICAgICAgIHYgPSB0LnRleHRTaXplRGF0YSxcbiAgICAgICAgICBnID0gbnVsbDtcblxuICAgICAgXCJzb3VyY2VcIiA9PT0gdi5raW5kID8gKGcgPSBbMTI4ICogYS5sYXlvdXQuZ2V0KFwidGV4dC1zaXplXCIpLmV2YWx1YXRlKHMsIHt9KV0pWzBdID4gMzI2NDAgJiYgQSh0LmxheWVySWRzWzBdICsgJzogVmFsdWUgZm9yIFwidGV4dC1zaXplXCIgaXMgPj0gMjU1LiBSZWR1Y2UgeW91ciBcInRleHQtc2l6ZVwiLicpIDogXCJjb21wb3NpdGVcIiA9PT0gdi5raW5kICYmICgoZyA9IFsxMjggKiB5LmNvbXBvc2l0ZVRleHRTaXplc1swXS5ldmFsdWF0ZShzLCB7fSwgZCksIDEyOCAqIHkuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKHMsIHt9LCBkKV0pWzBdID4gMzI2NDAgfHwgZ1sxXSA+IDMyNjQwKSAmJiBBKHQubGF5ZXJJZHNbMF0gKyAnOiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuJyksIHQuYWRkU3ltYm9scyh0LnRleHQsIG0sIGcsIHUsIG8sIHMsIHAsIGUsIGwubGluZVN0YXJ0SW5kZXgsIGwubGluZUxlbmd0aCwgZiwgZCk7XG5cbiAgICAgIGZvciAodmFyIHggPSAwLCBiID0gYzsgeCA8IGIubGVuZ3RoOyB4ICs9IDEpIHtcbiAgICAgICAgaFtiW3hdXSA9IHQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gNCAqIG0ubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxsKHQpIHtcbiAgICAgIGZvciAodmFyIGUgaW4gdCkge1xuICAgICAgICByZXR1cm4gdFtlXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGwodCwgZSwgciwgbikge1xuICAgICAgdmFyIGkgPSB0LmNvbXBhcmVUZXh0O1xuXG4gICAgICBpZiAoZSBpbiBpKSB7XG4gICAgICAgIGZvciAodmFyIGEgPSBpW2VdLCBvID0gYS5sZW5ndGggLSAxOyBvID49IDA7IG8tLSkge1xuICAgICAgICAgIGlmIChuLmRpc3QoYVtvXSkgPCByKSByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpW2VdID0gW107XG5cbiAgICAgIHJldHVybiBpW2VdLnB1c2gobiksICExO1xuICAgIH1cblxuICAgIHZhciBjbCA9IHdzLlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzLFxuICAgICAgICBobCA9IFt7XG4gICAgICBuYW1lOiBcImFfZmFkZV9vcGFjaXR5XCIsXG4gICAgICBjb21wb25lbnRzOiAxLFxuICAgICAgdHlwZTogXCJVaW50OFwiLFxuICAgICAgb2Zmc2V0OiAwXG4gICAgfV07XG5cbiAgICBmdW5jdGlvbiBmbCh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoKSB7XG4gICAgICB2YXIgZiA9IHMgPyBNYXRoLm1pbigzMjY0MCwgTWF0aC5yb3VuZChzWzBdKSkgOiAwLFxuICAgICAgICAgIHkgPSBzID8gTWF0aC5taW4oMzI2NDAsIE1hdGgucm91bmQoc1sxXSkpIDogMDtcbiAgICAgIHQuZW1wbGFjZUJhY2soZSwgciwgTWF0aC5yb3VuZCgzMiAqIG4pLCBNYXRoLnJvdW5kKDMyICogaSksIGEsIG8sIChmIDw8IDEpICsgKHUgPyAxIDogMCksIHksIDE2ICogbCwgMTYgKiBwLCAyNTYgKiBjLCAyNTYgKiBoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB5bCh0LCBlLCByKSB7XG4gICAgICB0LmVtcGxhY2VCYWNrKGUueCwgZS55LCByKSwgdC5lbXBsYWNlQmFjayhlLngsIGUueSwgciksIHQuZW1wbGFjZUJhY2soZS54LCBlLnksIHIpLCB0LmVtcGxhY2VCYWNrKGUueCwgZS55LCByKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkbCh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gMCwgciA9IHQuc2VjdGlvbnM7IGUgPCByLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgIGlmIChXbihyW2VdLnRleHQpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG5cbiAgICB2YXIgbWwgPSBmdW5jdGlvbiBtbCh0KSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IEZpKCksIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBxaSgpLCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHQsIHRoaXMuc2VnbWVudHMgPSBuZXcgdWEoKSwgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRGkoKSwgdGhpcy5vcGFjaXR5VmVydGV4QXJyYXkgPSBuZXcgTGkoKSwgdGhpcy5wbGFjZWRTeW1ib2xBcnJheSA9IG5ldyB0YSgpO1xuICAgIH07XG5cbiAgICBtbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCAmJiAwID09PSB0aGlzLmluZGV4QXJyYXkubGVuZ3RoICYmIDAgPT09IHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aCAmJiAwID09PSB0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgfSwgbWwucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLmlzRW1wdHkoKSB8fCAociAmJiAodGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBxcy5tZW1iZXJzKSwgdGhpcy5pbmRleEJ1ZmZlciA9IHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5LCBlKSwgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksIE5zLm1lbWJlcnMsICEwKSwgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyID0gdC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5vcGFjaXR5VmVydGV4QXJyYXksIGhsLCAhMCksIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5pdGVtU2l6ZSA9IDEpLCAociB8fCBuKSAmJiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQodCkpO1xuICAgIH0sIG1sLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgJiYgKHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKSwgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKSwgdGhpcy5zZWdtZW50cy5kZXN0cm95KCksIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5kZXN0cm95KCkpO1xuICAgIH0sIE9uKFwiU3ltYm9sQnVmZmVyc1wiLCBtbCk7XG5cbiAgICB2YXIgdmwgPSBmdW5jdGlvbiB2bCh0LCBlLCByKSB7XG4gICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IHQoKSwgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzID0gZSwgdGhpcy5pbmRleEFycmF5ID0gbmV3IHIoKSwgdGhpcy5zZWdtZW50cyA9IG5ldyB1YSgpLCB0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5ID0gbmV3IGppKCk7XG4gICAgfTtcblxuICAgIHZsLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSB0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmxheW91dEF0dHJpYnV0ZXMpLCB0aGlzLmluZGV4QnVmZmVyID0gdC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpLCB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlciA9IHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXksIEtzLm1lbWJlcnMsICEwKTtcbiAgICB9LCB2bC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyICYmICh0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpLCB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKSwgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIuZGVzdHJveSgpKTtcbiAgICB9LCBPbihcIkNvbGxpc2lvbkJ1ZmZlcnNcIiwgdmwpO1xuXG4gICAgdmFyIGdsID0gZnVuY3Rpb24gZ2wodCkge1xuICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IHQuY29sbGlzaW9uQm94QXJyYXksIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy5vdmVyc2NhbGluZyA9IHQub3ZlcnNjYWxpbmcsIHRoaXMubGF5ZXJzID0gdC5sYXllcnMsIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KSwgdGhpcy5pbmRleCA9IHQuaW5kZXgsIHRoaXMucGl4ZWxSYXRpbyA9IHQucGl4ZWxSYXRpbywgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gdC5zb3VyY2VMYXllckluZGV4LCB0aGlzLmhhc1BhdHRlcm4gPSAhMSwgdGhpcy5oYXNSVExUZXh0ID0gITEsIHRoaXMuc29ydEtleVJhbmdlcyA9IFtdLCB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5ID0gW10sIHRoaXMucGxhY2VtZW50SW52UHJvak1hdHJpeCA9IHNvKFtdKSwgdGhpcy5wbGFjZW1lbnRWaWV3cG9ydE1hdHJpeCA9IHNvKFtdKTtcbiAgICAgIHZhciBlID0gdGhpcy5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7XG4gICAgICB0aGlzLnRleHRTaXplRGF0YSA9IEx1KHRoaXMuem9vbSwgZVtcInRleHQtc2l6ZVwiXSksIHRoaXMuaWNvblNpemVEYXRhID0gTHUodGhpcy56b29tLCBlW1wiaWNvbi1zaXplXCJdKTtcbiAgICAgIHZhciByID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LFxuICAgICAgICAgIG4gPSByLmdldChcInN5bWJvbC1zb3J0LWtleVwiKSxcbiAgICAgICAgICBpID0gci5nZXQoXCJzeW1ib2wtei1vcmRlclwiKTtcbiAgICAgIHRoaXMuY2FuT3ZlcmxhcCA9IHIuZ2V0KFwidGV4dC1hbGxvdy1vdmVybGFwXCIpIHx8IHIuZ2V0KFwiaWNvbi1hbGxvdy1vdmVybGFwXCIpIHx8IHIuZ2V0KFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCIpIHx8IHIuZ2V0KFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCIpLCB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ID0gXCJ2aWV3cG9ydC15XCIgIT09IGkgJiYgIW4uaXNDb25zdGFudCgpLCB0aGlzLnNvcnRGZWF0dXJlc0J5WSA9IChcInZpZXdwb3J0LXlcIiA9PT0gaSB8fCBcImF1dG9cIiA9PT0gaSAmJiAhdGhpcy5zb3J0RmVhdHVyZXNCeUtleSkgJiYgdGhpcy5jYW5PdmVybGFwLCBcInBvaW50XCIgPT09IHIuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSAmJiAodGhpcy53cml0aW5nTW9kZXMgPSByLmdldChcInRleHQtd3JpdGluZy1tb2RlXCIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gX3VbdF07XG4gICAgICB9KSksIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5pc1N0YXRlRGVwZW5kZW50KCk7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuaWQ7XG4gICAgICB9KSwgdGhpcy5zb3VyY2VJRCA9IHQuc291cmNlSUQ7XG4gICAgfTtcblxuICAgIGdsLnByb3RvdHlwZS5jcmVhdGVBcnJheXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRleHQgPSBuZXcgbWwobmV3IEZhKHRoaXMubGF5ZXJzLCB0aGlzLnpvb20sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAvXnRleHQvLnRlc3QodCk7XG4gICAgICB9KSksIHRoaXMuaWNvbiA9IG5ldyBtbChuZXcgRmEodGhpcy5sYXllcnMsIHRoaXMuem9vbSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIC9eaWNvbi8udGVzdCh0KTtcbiAgICAgIH0pKSwgdGhpcy5nbHlwaE9mZnNldEFycmF5ID0gbmV3IG5hKCksIHRoaXMubGluZVZlcnRleEFycmF5ID0gbmV3IGlhKCksIHRoaXMuc3ltYm9sSW5zdGFuY2VzID0gbmV3IHJhKCk7XG4gICAgfSwgZ2wucHJvdG90eXBlLmNhbGN1bGF0ZUdseXBoRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgdC5sZW5ndGg7IGErKykge1xuICAgICAgICBpZiAoZVt0LmNoYXJDb2RlQXQoYSldID0gITAsIChyIHx8IG4pICYmIGkpIHtcbiAgICAgICAgICB2YXIgbyA9IEpzW3QuY2hhckF0KGEpXTtcbiAgICAgICAgICBvICYmIChlW28uY2hhckNvZGVBdCgwKV0gPSAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBnbC5wcm90b3R5cGUucG9wdWxhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0aGlzLmxheWVyc1swXSxcbiAgICAgICAgICBpID0gbi5sYXlvdXQsXG4gICAgICAgICAgYSA9IGkuZ2V0KFwidGV4dC1mb250XCIpLFxuICAgICAgICAgIG8gPSBpLmdldChcInRleHQtZmllbGRcIiksXG4gICAgICAgICAgcyA9IGkuZ2V0KFwiaWNvbi1pbWFnZVwiKSxcbiAgICAgICAgICB1ID0gKFwiY29uc3RhbnRcIiAhPT0gby52YWx1ZS5raW5kIHx8IG8udmFsdWUudmFsdWUgaW5zdGFuY2VvZiBpZSAmJiAhby52YWx1ZS52YWx1ZS5pc0VtcHR5KCkgfHwgby52YWx1ZS52YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+IDApICYmIChcImNvbnN0YW50XCIgIT09IGEudmFsdWUua2luZCB8fCBhLnZhbHVlLnZhbHVlLmxlbmd0aCA+IDApLFxuICAgICAgICAgIGwgPSBcImNvbnN0YW50XCIgIT09IHMudmFsdWUua2luZCB8fCAhIXMudmFsdWUudmFsdWUgfHwgT2JqZWN0LmtleXMocy5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgIHAgPSBpLmdldChcInN5bWJvbC1zb3J0LWtleVwiKTtcblxuICAgICAgaWYgKHRoaXMuZmVhdHVyZXMgPSBbXSwgdSB8fCBsKSB7XG4gICAgICAgIGZvciAodmFyIGMgPSBlLmljb25EZXBlbmRlbmNpZXMsIGggPSBlLmdseXBoRGVwZW5kZW5jaWVzLCBmID0gZS5hdmFpbGFibGVJbWFnZXMsIHkgPSBuZXcgdWkodGhpcy56b29tKSwgZCA9IDAsIG0gPSB0OyBkIDwgbS5sZW5ndGg7IGQgKz0gMSkge1xuICAgICAgICAgIHZhciB2ID0gbVtkXSxcbiAgICAgICAgICAgICAgZyA9IHYuZmVhdHVyZSxcbiAgICAgICAgICAgICAgeCA9IHYuaWQsXG4gICAgICAgICAgICAgIGIgPSB2LmluZGV4LFxuICAgICAgICAgICAgICB3ID0gdi5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICBfID0gbi5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnksXG4gICAgICAgICAgICAgIEEgPSBqYShnLCBfKTtcblxuICAgICAgICAgIGlmIChuLl9mZWF0dXJlRmlsdGVyLmZpbHRlcih5LCBBLCByKSkge1xuICAgICAgICAgICAgXyB8fCAoQS5nZW9tZXRyeSA9IFVhKGcpKTtcbiAgICAgICAgICAgIHZhciBTID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgICB2YXIgayA9IG4uZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKFwidGV4dC1maWVsZFwiLCBBLCByLCBmKSxcbiAgICAgICAgICAgICAgICAgIEkgPSBpZS5mYWN0b3J5KGspO1xuICAgICAgICAgICAgICBkbChJKSAmJiAodGhpcy5oYXNSVExUZXh0ID0gITApLCAoIXRoaXMuaGFzUlRMVGV4dCB8fCBcInVuYXZhaWxhYmxlXCIgPT09IGFpKCkgfHwgdGhpcy5oYXNSVExUZXh0ICYmIHNpLmlzUGFyc2VkKCkpICYmIChTID0gWHMoSSwgbiwgQSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeiA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICAgICAgdmFyIEMgPSBuLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhcImljb24taW1hZ2VcIiwgQSwgciwgZik7XG4gICAgICAgICAgICAgIHogPSBDIGluc3RhbmNlb2YgYWUgPyBDIDogYWUuZnJvbVN0cmluZyhDKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFMgfHwgeikge1xuICAgICAgICAgICAgICB2YXIgRSA9IHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgPyBwLmV2YWx1YXRlKEEsIHt9LCByKSA6IHZvaWQgMDtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5mZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogeCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBTLFxuICAgICAgICAgICAgICAgIGljb246IHosXG4gICAgICAgICAgICAgICAgaW5kZXg6IGIsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogdyxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogQS5nZW9tZXRyeSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBnLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogY2xbZy50eXBlXSxcbiAgICAgICAgICAgICAgICBzb3J0S2V5OiBFXG4gICAgICAgICAgICAgIH0pLCB6ICYmIChjW3oubmFtZV0gPSAhMCksIFMpIHtcbiAgICAgICAgICAgICAgICB2YXIgUCA9IGEuZXZhbHVhdGUoQSwge30sIHIpLmpvaW4oXCIsXCIpLFxuICAgICAgICAgICAgICAgICAgICBNID0gXCJtYXBcIiA9PT0gaS5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSAmJiBcInBvaW50XCIgIT09IGkuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQgPSB0aGlzLndyaXRpbmdNb2RlcyAmJiB0aGlzLndyaXRpbmdNb2Rlcy5pbmRleE9mKF91LnZlcnRpY2FsKSA+PSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgQiA9IDAsIFQgPSBTLnNlY3Rpb25zOyBCIDwgVC5sZW5ndGg7IEIgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIFYgPSBUW0JdO1xuICAgICAgICAgICAgICAgICAgaWYgKFYuaW1hZ2UpIGNbVi5pbWFnZS5uYW1lXSA9ICEwO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgRiA9IFhuKFMudG9TdHJpbmcoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBEID0gVi5mb250U3RhY2sgfHwgUCxcbiAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBoW0RdID0gaFtEXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyhWLnRleHQsIEwsIE0sIHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCwgRik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgXCJsaW5lXCIgPT09IGkuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSAmJiAodGhpcy5mZWF0dXJlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIGUgPSB7fSxcbiAgICAgICAgICAgICAgciA9IHt9LFxuICAgICAgICAgICAgICBuID0gW10sXG4gICAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgZnVuY3Rpb24gYShlKSB7XG4gICAgICAgICAgICBuLnB1c2godFtlXSksIGkrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBvKHQsIGUsIGkpIHtcbiAgICAgICAgICAgIHZhciBhID0gclt0XTtcbiAgICAgICAgICAgIHJldHVybiBkZWxldGUgclt0XSwgcltlXSA9IGEsIG5bYV0uZ2VvbWV0cnlbMF0ucG9wKCksIG5bYV0uZ2VvbWV0cnlbMF0gPSBuW2FdLmdlb21ldHJ5WzBdLmNvbmNhdChpWzBdKSwgYTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBzKHQsIHIsIGkpIHtcbiAgICAgICAgICAgIHZhciBhID0gZVtyXTtcbiAgICAgICAgICAgIHJldHVybiBkZWxldGUgZVtyXSwgZVt0XSA9IGEsIG5bYV0uZ2VvbWV0cnlbMF0uc2hpZnQoKSwgblthXS5nZW9tZXRyeVswXSA9IGlbMF0uY29uY2F0KG5bYV0uZ2VvbWV0cnlbMF0pLCBhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIHUodCwgZSwgcikge1xuICAgICAgICAgICAgdmFyIG4gPSByID8gZVswXVtlWzBdLmxlbmd0aCAtIDFdIDogZVswXVswXTtcbiAgICAgICAgICAgIHJldHVybiB0ICsgXCI6XCIgKyBuLnggKyBcIjpcIiArIG4ueTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHQubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gdFtsXSxcbiAgICAgICAgICAgICAgICBjID0gcC5nZW9tZXRyeSxcbiAgICAgICAgICAgICAgICBoID0gcC50ZXh0ID8gcC50ZXh0LnRvU3RyaW5nKCkgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoaCkge1xuICAgICAgICAgICAgICB2YXIgZiA9IHUoaCwgYyksXG4gICAgICAgICAgICAgICAgICB5ID0gdShoLCBjLCAhMCk7XG5cbiAgICAgICAgICAgICAgaWYgKGYgaW4gciAmJiB5IGluIGUgJiYgcltmXSAhPT0gZVt5XSkge1xuICAgICAgICAgICAgICAgIHZhciBkID0gcyhmLCB5LCBjKSxcbiAgICAgICAgICAgICAgICAgICAgbSA9IG8oZiwgeSwgbltkXS5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVbZl0sIGRlbGV0ZSByW3ldLCByW3UoaCwgblttXS5nZW9tZXRyeSwgITApXSA9IG0sIG5bZF0uZ2VvbWV0cnkgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgZiBpbiByID8gbyhmLCB5LCBjKSA6IHkgaW4gZSA/IHMoZiwgeSwgYykgOiAoYShsKSwgZVtmXSA9IGkgLSAxLCByW3ldID0gaSAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGEobCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5nZW9tZXRyeTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSh0aGlzLmZlYXR1cmVzKSksIHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgJiYgdGhpcy5mZWF0dXJlcy5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHQuc29ydEtleSAtIGUuc29ydEtleTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZ2wucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCAmJiAodGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyh0LCBlLCB0aGlzLmxheWVycywgciksIHRoaXMuaWNvbi5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXModCwgZSwgdGhpcy5sYXllcnMsIHIpKTtcbiAgICB9LCBnbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGggJiYgIXRoaXMuaGFzUlRMVGV4dDtcbiAgICB9LCBnbC5wcm90b3R5cGUudXBsb2FkUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkIHx8IHRoaXMuaWNvbi5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfSwgZ2wucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAhdGhpcy51cGxvYWRlZCAmJiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmICh0aGlzLnRleHRDb2xsaXNpb25Cb3gudXBsb2FkKHQpLCB0aGlzLmljb25Db2xsaXNpb25Cb3gudXBsb2FkKHQpKSwgdGhpcy50ZXh0LnVwbG9hZCh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSwgIXRoaXMudXBsb2FkZWQsIHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpLCB0aGlzLmljb24udXBsb2FkKHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZLCAhdGhpcy51cGxvYWRlZCwgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCksIHRoaXMudXBsb2FkZWQgPSAhMDtcbiAgICB9LCBnbC5wcm90b3R5cGUuZGVzdHJveURlYnVnRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGV4dENvbGxpc2lvbkJveC5kZXN0cm95KCksIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5kZXN0cm95KCk7XG4gICAgfSwgZ2wucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRleHQuZGVzdHJveSgpLCB0aGlzLmljb24uZGVzdHJveSgpLCB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMuZGVzdHJveURlYnVnRGF0YSgpO1xuICAgIH0sIGdsLnByb3RvdHlwZS5hZGRUb0xpbmVWZXJ0ZXhBcnJheSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHZvaWQgMCAhPT0gdC5zZWdtZW50KSB7XG4gICAgICAgIGZvciAodmFyIG4gPSB0LmRpc3QoZVt0LnNlZ21lbnQgKyAxXSksIGkgPSB0LmRpc3QoZVt0LnNlZ21lbnRdKSwgYSA9IHt9LCBvID0gdC5zZWdtZW50ICsgMTsgbyA8IGUubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgICBhW29dID0ge1xuICAgICAgICAgICAgeDogZVtvXS54LFxuICAgICAgICAgICAgeTogZVtvXS55LFxuICAgICAgICAgICAgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IG5cbiAgICAgICAgICB9LCBvIDwgZS5sZW5ndGggLSAxICYmIChuICs9IGVbbyArIDFdLmRpc3QoZVtvXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcyA9IHQuc2VnbWVudCB8fCAwOyBzID49IDA7IHMtLSkge1xuICAgICAgICAgIGFbc10gPSB7XG4gICAgICAgICAgICB4OiBlW3NdLngsXG4gICAgICAgICAgICB5OiBlW3NdLnksXG4gICAgICAgICAgICB0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjogaVxuICAgICAgICAgIH0sIHMgPiAwICYmIChpICs9IGVbcyAtIDFdLmRpc3QoZVtzXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCBlLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgdmFyIGwgPSBhW3VdO1xuICAgICAgICAgIHRoaXMubGluZVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKGwueCwgbC55LCBsLnRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lU3RhcnRJbmRleDogcixcbiAgICAgICAgbGluZUxlbmd0aDogdGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoIC0gclxuICAgICAgfTtcbiAgICB9LCBnbC5wcm90b3R5cGUuYWRkU3ltYm9scyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjKSB7XG4gICAgICBmb3IgKHZhciBoID0gdC5pbmRleEFycmF5LCBmID0gdC5sYXlvdXRWZXJ0ZXhBcnJheSwgeSA9IHQuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCAqIGUubGVuZ3RoLCBmLCBoLCB0aGlzLmNhbk92ZXJsYXAgPyBhLnNvcnRLZXkgOiB2b2lkIDApLCBkID0gdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCwgbSA9IHkudmVydGV4TGVuZ3RoLCB2ID0gdGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIG8gPT09IF91LnZlcnRpY2FsID8gTWF0aC5QSSAvIDIgOiAwLCBnID0gYS50ZXh0ICYmIGEudGV4dC5zZWN0aW9ucywgeCA9IDA7IHggPCBlLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgIHZhciBiID0gZVt4XSxcbiAgICAgICAgICAgIHcgPSBiLnRsLFxuICAgICAgICAgICAgXyA9IGIudHIsXG4gICAgICAgICAgICBBID0gYi5ibCxcbiAgICAgICAgICAgIFMgPSBiLmJyLFxuICAgICAgICAgICAgayA9IGIudGV4LFxuICAgICAgICAgICAgSSA9IGIucGl4ZWxPZmZzZXRUTCxcbiAgICAgICAgICAgIHogPSBiLnBpeGVsT2Zmc2V0QlIsXG4gICAgICAgICAgICBDID0gYi5taW5Gb250U2NhbGVYLFxuICAgICAgICAgICAgRSA9IGIubWluRm9udFNjYWxlWSxcbiAgICAgICAgICAgIFAgPSBiLmdseXBoT2Zmc2V0LFxuICAgICAgICAgICAgTSA9IGIuaXNTREYsXG4gICAgICAgICAgICBCID0gYi5zZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICBUID0geS52ZXJ0ZXhMZW5ndGgsXG4gICAgICAgICAgICBWID0gUFsxXTtcbiAgICAgICAgZmwoZiwgcy54LCBzLnksIHcueCwgViArIHcueSwgay54LCBrLnksIHIsIE0sIEkueCwgSS55LCBDLCBFKSwgZmwoZiwgcy54LCBzLnksIF8ueCwgViArIF8ueSwgay54ICsgay53LCBrLnksIHIsIE0sIHoueCwgSS55LCBDLCBFKSwgZmwoZiwgcy54LCBzLnksIEEueCwgViArIEEueSwgay54LCBrLnkgKyBrLmgsIHIsIE0sIEkueCwgei55LCBDLCBFKSwgZmwoZiwgcy54LCBzLnksIFMueCwgViArIFMueSwgay54ICsgay53LCBrLnkgKyBrLmgsIHIsIE0sIHoueCwgei55LCBDLCBFKSwgeWwodC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksIHMsIHYpLCBoLmVtcGxhY2VCYWNrKFQsIFQgKyAxLCBUICsgMiksIGguZW1wbGFjZUJhY2soVCArIDEsIFQgKyAyLCBUICsgMyksIHkudmVydGV4TGVuZ3RoICs9IDQsIHkucHJpbWl0aXZlTGVuZ3RoICs9IDIsIHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5lbXBsYWNlQmFjayhQWzBdKSwgeCAhPT0gZS5sZW5ndGggLSAxICYmIEIgPT09IGVbeCArIDFdLnNlY3Rpb25JbmRleCB8fCB0LnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKGYubGVuZ3RoLCBhLCBhLmluZGV4LCB7fSwgYywgZyAmJiBnW0JdKTtcbiAgICAgIH1cblxuICAgICAgdC5wbGFjZWRTeW1ib2xBcnJheS5lbXBsYWNlQmFjayhzLngsIHMueSwgZCwgdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCAtIGQsIG0sIHUsIGwsIHMuc2VnbWVudCwgciA/IHJbMF0gOiAwLCByID8gclsxXSA6IDAsIG5bMF0sIG5bMV0sIG8sIDAsICExLCAwLCBwKTtcbiAgICB9LCBnbC5wcm90b3R5cGUuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEpIHtcbiAgICAgIHJldHVybiBlLmVtcGxhY2VCYWNrKDAsIDApLCB0LmVtcGxhY2VCYWNrKHIueCwgci55LCBuLCBpLCBNYXRoLnJvdW5kKGEueCksIE1hdGgucm91bmQoYS55KSk7XG4gICAgfSwgZ2wucHJvdG90eXBlLmFkZENvbGxpc2lvbkRlYnVnVmVydGljZXMgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgYSwgbywgcykge1xuICAgICAgdmFyIHUgPSBhLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIGEubGF5b3V0VmVydGV4QXJyYXksIGEuaW5kZXhBcnJheSksXG4gICAgICAgICAgbCA9IHUudmVydGV4TGVuZ3RoLFxuICAgICAgICAgIHAgPSBhLmxheW91dFZlcnRleEFycmF5LFxuICAgICAgICAgIGMgPSBhLmNvbGxpc2lvblZlcnRleEFycmF5LFxuICAgICAgICAgIGggPSBzLmFuY2hvclgsXG4gICAgICAgICAgZiA9IHMuYW5jaG9yWTtcbiAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KHAsIGMsIG8sIGgsIGYsIG5ldyBpKHQsIGUpKSwgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgocCwgYywgbywgaCwgZiwgbmV3IGkociwgZSkpLCB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChwLCBjLCBvLCBoLCBmLCBuZXcgaShyLCBuKSksIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KHAsIGMsIG8sIGgsIGYsIG5ldyBpKHQsIG4pKSwgdS52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgIHZhciB5ID0gYS5pbmRleEFycmF5O1xuICAgICAgeS5lbXBsYWNlQmFjayhsLCBsICsgMSksIHkuZW1wbGFjZUJhY2sobCArIDEsIGwgKyAyKSwgeS5lbXBsYWNlQmFjayhsICsgMiwgbCArIDMpLCB5LmVtcGxhY2VCYWNrKGwgKyAzLCBsKSwgdS5wcmltaXRpdmVMZW5ndGggKz0gNDtcbiAgICB9LCBnbC5wcm90b3R5cGUuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuKSB7XG4gICAgICBmb3IgKHZhciBpID0gdDsgaSA8IGU7IGkrKykge1xuICAgICAgICB2YXIgYSA9IHRoaXMuY29sbGlzaW9uQm94QXJyYXkuZ2V0KGkpO1xuICAgICAgICB0aGlzLmFkZENvbGxpc2lvbkRlYnVnVmVydGljZXMoYS54MSwgYS55MSwgYS54MiwgYS55MiwgbiA/IHRoaXMudGV4dENvbGxpc2lvbkJveCA6IHRoaXMuaWNvbkNvbGxpc2lvbkJveCwgYS5hbmNob3JQb2ludCwgcik7XG4gICAgICB9XG4gICAgfSwgZ2wucHJvdG90eXBlLmdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5oYXNEZWJ1Z0RhdGEoKSAmJiB0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKSwgdGhpcy50ZXh0Q29sbGlzaW9uQm94ID0gbmV3IHZsKE9pLCBHcy5tZW1iZXJzLCBKaSksIHRoaXMuaWNvbkNvbGxpc2lvbkJveCA9IG5ldyB2bChPaSwgR3MubWVtYmVycywgSmkpO1xuXG4gICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KHQpO1xuICAgICAgICB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoZS50ZXh0Qm94U3RhcnRJbmRleCwgZS50ZXh0Qm94RW5kSW5kZXgsIGUsICEwKSwgdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCwgZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCwgZSwgITApLCB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoZS5pY29uQm94U3RhcnRJbmRleCwgZS5pY29uQm94RW5kSW5kZXgsIGUsICExKSwgdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKGUudmVydGljYWxJY29uQm94U3RhcnRJbmRleCwgZS52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCwgZSwgITEpO1xuICAgICAgfVxuICAgIH0sIGdsLnByb3RvdHlwZS5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1KSB7XG4gICAgICBmb3IgKHZhciBsID0ge30sIHAgPSBlOyBwIDwgcjsgcCsrKSB7XG4gICAgICAgIHZhciBjID0gdC5nZXQocCk7XG4gICAgICAgIGwudGV4dEJveCA9IHtcbiAgICAgICAgICB4MTogYy54MSxcbiAgICAgICAgICB5MTogYy55MSxcbiAgICAgICAgICB4MjogYy54MixcbiAgICAgICAgICB5MjogYy55MixcbiAgICAgICAgICBhbmNob3JQb2ludFg6IGMuYW5jaG9yUG9pbnRYLFxuICAgICAgICAgIGFuY2hvclBvaW50WTogYy5hbmNob3JQb2ludFlcbiAgICAgICAgfSwgbC50ZXh0RmVhdHVyZUluZGV4ID0gYy5mZWF0dXJlSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBoID0gbjsgaCA8IGk7IGgrKykge1xuICAgICAgICB2YXIgZiA9IHQuZ2V0KGgpO1xuICAgICAgICBsLnZlcnRpY2FsVGV4dEJveCA9IHtcbiAgICAgICAgICB4MTogZi54MSxcbiAgICAgICAgICB5MTogZi55MSxcbiAgICAgICAgICB4MjogZi54MixcbiAgICAgICAgICB5MjogZi55MixcbiAgICAgICAgICBhbmNob3JQb2ludFg6IGYuYW5jaG9yUG9pbnRYLFxuICAgICAgICAgIGFuY2hvclBvaW50WTogZi5hbmNob3JQb2ludFlcbiAgICAgICAgfSwgbC52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSBmLmZlYXR1cmVJbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHkgPSBhOyB5IDwgbzsgeSsrKSB7XG4gICAgICAgIHZhciBkID0gdC5nZXQoeSk7XG4gICAgICAgIGwuaWNvbkJveCA9IHtcbiAgICAgICAgICB4MTogZC54MSxcbiAgICAgICAgICB5MTogZC55MSxcbiAgICAgICAgICB4MjogZC54MixcbiAgICAgICAgICB5MjogZC55MixcbiAgICAgICAgICBhbmNob3JQb2ludFg6IGQuYW5jaG9yUG9pbnRYLFxuICAgICAgICAgIGFuY2hvclBvaW50WTogZC5hbmNob3JQb2ludFlcbiAgICAgICAgfSwgbC5pY29uRmVhdHVyZUluZGV4ID0gZC5mZWF0dXJlSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBtID0gczsgbSA8IHU7IG0rKykge1xuICAgICAgICB2YXIgdiA9IHQuZ2V0KG0pO1xuICAgICAgICBsLnZlcnRpY2FsSWNvbkJveCA9IHtcbiAgICAgICAgICB4MTogdi54MSxcbiAgICAgICAgICB5MTogdi55MSxcbiAgICAgICAgICB4Mjogdi54MixcbiAgICAgICAgICB5Mjogdi55MixcbiAgICAgICAgICBhbmNob3JQb2ludFg6IHYuYW5jaG9yUG9pbnRYLFxuICAgICAgICAgIGFuY2hvclBvaW50WTogdi5hbmNob3JQb2ludFlcbiAgICAgICAgfSwgbC52ZXJ0aWNhbEljb25GZWF0dXJlSW5kZXggPSB2LmZlYXR1cmVJbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsO1xuICAgIH0sIGdsLnByb3RvdHlwZS5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzID0gW107XG5cbiAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoZSk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzLnB1c2godGhpcy5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbCh0LCByLnRleHRCb3hTdGFydEluZGV4LCByLnRleHRCb3hFbmRJbmRleCwgci52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LCByLnZlcnRpY2FsVGV4dEJveEVuZEluZGV4LCByLmljb25Cb3hTdGFydEluZGV4LCByLmljb25Cb3hFbmRJbmRleCwgci52ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4LCByLnZlcnRpY2FsSWNvbkJveEVuZEluZGV4KSk7XG4gICAgICB9XG4gICAgfSwgZ2wucHJvdG90eXBlLmhhc1RleHREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH0sIGdsLnByb3RvdHlwZS5oYXNJY29uRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9LCBnbC5wcm90b3R5cGUuaGFzRGVidWdEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dENvbGxpc2lvbkJveCAmJiB0aGlzLmljb25Db2xsaXNpb25Cb3g7XG4gICAgfSwgZ2wucHJvdG90eXBlLmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkgJiYgdGhpcy50ZXh0Q29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfSwgZ2wucHJvdG90eXBlLmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkgJiYgdGhpcy5pY29uQ29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfSwgZ2wucHJvdG90eXBlLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGUpLCBuID0gci52ZXJ0ZXhTdGFydEluZGV4ICsgNCAqIHIubnVtR2x5cGhzLCBpID0gci52ZXJ0ZXhTdGFydEluZGV4OyBpIDwgbjsgaSArPSA0KSB7XG4gICAgICAgIHQuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpLCBpICsgMSwgaSArIDIpLCB0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaSArIDEsIGkgKyAyLCBpICsgMyk7XG4gICAgICB9XG4gICAgfSwgZ2wucHJvdG90eXBlLmdldFNvcnRlZFN5bWJvbEluZGV4ZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IHQgJiYgdm9pZCAwICE9PSB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcykgcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzO1xuXG4gICAgICBmb3IgKHZhciBlID0gTWF0aC5zaW4odCksIHIgPSBNYXRoLmNvcyh0KSwgbiA9IFtdLCBpID0gW10sIGEgPSBbXSwgbyA9IDA7IG8gPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7ICsrbykge1xuICAgICAgICBhLnB1c2gobyk7XG4gICAgICAgIHZhciBzID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KG8pO1xuICAgICAgICBuLnB1c2goMCB8IE1hdGgucm91bmQoZSAqIHMuYW5jaG9yWCArIHIgKiBzLmFuY2hvclkpKSwgaS5wdXNoKHMuZmVhdHVyZUluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGEuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gblt0XSAtIG5bZV0gfHwgaVtlXSAtIGlbdF07XG4gICAgICB9KSwgYTtcbiAgICB9LCBnbC5wcm90b3R5cGUuYWRkVG9Tb3J0S2V5UmFuZ2VzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdGhpcy5zb3J0S2V5UmFuZ2VzW3RoaXMuc29ydEtleVJhbmdlcy5sZW5ndGggLSAxXTtcbiAgICAgIHIgJiYgci5zb3J0S2V5ID09PSBlID8gci5zeW1ib2xJbnN0YW5jZUVuZCA9IHQgKyAxIDogdGhpcy5zb3J0S2V5UmFuZ2VzLnB1c2goe1xuICAgICAgICBzb3J0S2V5OiBlLFxuICAgICAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiB0LFxuICAgICAgICBzeW1ib2xJbnN0YW5jZUVuZDogdCArIDFcbiAgICAgIH0pO1xuICAgIH0sIGdsLnByb3RvdHlwZS5zb3J0RmVhdHVyZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5zb3J0RmVhdHVyZXNCeVkgJiYgdGhpcy5zb3J0ZWRBbmdsZSAhPT0gdCAmJiAhKHRoaXMudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAxIHx8IHRoaXMuaWNvbi5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAxKSkge1xuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcyA9IHRoaXMuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0KSwgdGhpcy5zb3J0ZWRBbmdsZSA9IHQsIHRoaXMudGV4dC5pbmRleEFycmF5LmNsZWFyKCksIHRoaXMuaWNvbi5pbmRleEFycmF5LmNsZWFyKCksIHRoaXMuZmVhdHVyZVNvcnRPcmRlciA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXM7IHIgPCBuLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQobltyXSk7XG4gICAgICAgICAgdGhpcy5mZWF0dXJlU29ydE9yZGVyLnB1c2goaS5mZWF0dXJlSW5kZXgpLCBbaS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgaS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIGkubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAodCwgciwgbikge1xuICAgICAgICAgICAgdCA+PSAwICYmIG4uaW5kZXhPZih0KSA9PT0gciAmJiBlLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2woZS50ZXh0LCB0KTtcbiAgICAgICAgICB9KSwgaS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA+PSAwICYmIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLnRleHQsIGkudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLCBpLnBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwICYmIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLmljb24sIGkucGxhY2VkSWNvblN5bWJvbEluZGV4KSwgaS52ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwICYmIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLmljb24sIGkudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXh0LmluZGV4QnVmZmVyICYmIHRoaXMudGV4dC5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMudGV4dC5pbmRleEFycmF5KSwgdGhpcy5pY29uLmluZGV4QnVmZmVyICYmIHRoaXMuaWNvbi5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMuaWNvbi5pbmRleEFycmF5KTtcbiAgICAgIH1cbiAgICB9LCBPbihcIlN5bWJvbEJ1Y2tldFwiLCBnbCwge1xuICAgICAgb21pdDogW1wibGF5ZXJzXCIsIFwiY29sbGlzaW9uQm94QXJyYXlcIiwgXCJmZWF0dXJlc1wiLCBcImNvbXBhcmVUZXh0XCJdXG4gICAgfSksIGdsLk1BWF9HTFlQSFMgPSA2NTUzNSwgZ2wuYWRkRHluYW1pY0F0dHJpYnV0ZXMgPSB5bDtcblxuICAgIHZhciB4bCA9IG5ldyBfaSh7XG4gICAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJzeW1ib2wtcGxhY2VtZW50XCJdKSxcbiAgICAgIFwic3ltYm9sLXNwYWNpbmdcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJzeW1ib2wtc3BhY2luZ1wiXSksXG4gICAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSksXG4gICAgICBcInN5bWJvbC1zb3J0LWtleVwiOiBuZXcgZ2koUHQubGF5b3V0X3N5bWJvbFtcInN5bWJvbC1zb3J0LWtleVwiXSksXG4gICAgICBcInN5bWJvbC16LW9yZGVyXCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wic3ltYm9sLXotb3JkZXJcIl0pLFxuICAgICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLWFsbG93LW92ZXJsYXBcIl0pLFxuICAgICAgXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgICAgXCJpY29uLW9wdGlvbmFsXCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1vcHRpb25hbFwiXSksXG4gICAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFxuICAgICAgXCJpY29uLXNpemVcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLXNpemVcIl0pLFxuICAgICAgXCJpY29uLXRleHQtZml0XCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi10ZXh0LWZpdFwiXSksXG4gICAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcImljb24tdGV4dC1maXQtcGFkZGluZ1wiXSksXG4gICAgICBcImljb24taW1hZ2VcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLWltYWdlXCJdKSxcbiAgICAgIFwiaWNvbi1yb3RhdGVcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLXJvdGF0ZVwiXSksXG4gICAgICBcImljb24tcGFkZGluZ1wiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcImljb24tcGFkZGluZ1wiXSksXG4gICAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1rZWVwLXVwcmlnaHRcIl0pLFxuICAgICAgXCJpY29uLW9mZnNldFwiOiBuZXcgZ2koUHQubGF5b3V0X3N5bWJvbFtcImljb24tb2Zmc2V0XCJdKSxcbiAgICAgIFwiaWNvbi1hbmNob3JcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJpY29uLWFuY2hvclwiXSksXG4gICAgICBcImljb24tcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1wiaWNvbi1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgICAgXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgICBcInRleHQtZmllbGRcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWZpZWxkXCJdKSxcbiAgICAgIFwidGV4dC1mb250XCI6IG5ldyBnaShQdC5sYXlvdXRfc3ltYm9sW1widGV4dC1mb250XCJdKSxcbiAgICAgIFwidGV4dC1zaXplXCI6IG5ldyBnaShQdC5sYXlvdXRfc3ltYm9sW1widGV4dC1zaXplXCJdKSxcbiAgICAgIFwidGV4dC1tYXgtd2lkdGhcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LW1heC13aWR0aFwiXSksXG4gICAgICBcInRleHQtbGluZS1oZWlnaHRcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWxpbmUtaGVpZ2h0XCJdKSxcbiAgICAgIFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiOiBuZXcgZ2koUHQubGF5b3V0X3N5bWJvbFtcInRleHQtbGV0dGVyLXNwYWNpbmdcIl0pLFxuICAgICAgXCJ0ZXh0LWp1c3RpZnlcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWp1c3RpZnlcIl0pLFxuICAgICAgXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIl0pLFxuICAgICAgXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtdmFyaWFibGUtYW5jaG9yXCJdKSxcbiAgICAgIFwidGV4dC1hbmNob3JcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LWFuY2hvclwiXSksXG4gICAgICBcInRleHQtbWF4LWFuZ2xlXCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1widGV4dC1tYXgtYW5nbGVcIl0pLFxuICAgICAgXCJ0ZXh0LXdyaXRpbmctbW9kZVwiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtd3JpdGluZy1tb2RlXCJdKSxcbiAgICAgIFwidGV4dC1yb3RhdGVcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LXJvdGF0ZVwiXSksXG4gICAgICBcInRleHQtcGFkZGluZ1wiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtcGFkZGluZ1wiXSksXG4gICAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IG5ldyB2aShQdC5sYXlvdXRfc3ltYm9sW1widGV4dC1rZWVwLXVwcmlnaHRcIl0pLFxuICAgICAgXCJ0ZXh0LXRyYW5zZm9ybVwiOiBuZXcgZ2koUHQubGF5b3V0X3N5bWJvbFtcInRleHQtdHJhbnNmb3JtXCJdKSxcbiAgICAgIFwidGV4dC1vZmZzZXRcIjogbmV3IGdpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LW9mZnNldFwiXSksXG4gICAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgICBcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOiBuZXcgdmkoUHQubGF5b3V0X3N5bWJvbFtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgICBcInRleHQtb3B0aW9uYWxcIjogbmV3IHZpKFB0LmxheW91dF9zeW1ib2xbXCJ0ZXh0LW9wdGlvbmFsXCJdKVxuICAgIH0pLFxuICAgICAgICBibCA9IHtcbiAgICAgIHBhaW50OiBuZXcgX2koe1xuICAgICAgICBcImljb24tb3BhY2l0eVwiOiBuZXcgZ2koUHQucGFpbnRfc3ltYm9sW1wiaWNvbi1vcGFjaXR5XCJdKSxcbiAgICAgICAgXCJpY29uLWNvbG9yXCI6IG5ldyBnaShQdC5wYWludF9zeW1ib2xbXCJpY29uLWNvbG9yXCJdKSxcbiAgICAgICAgXCJpY29uLWhhbG8tY29sb3JcIjogbmV3IGdpKFB0LnBhaW50X3N5bWJvbFtcImljb24taGFsby1jb2xvclwiXSksXG4gICAgICAgIFwiaWNvbi1oYWxvLXdpZHRoXCI6IG5ldyBnaShQdC5wYWludF9zeW1ib2xbXCJpY29uLWhhbG8td2lkdGhcIl0pLFxuICAgICAgICBcImljb24taGFsby1ibHVyXCI6IG5ldyBnaShQdC5wYWludF9zeW1ib2xbXCJpY29uLWhhbG8tYmx1clwiXSksXG4gICAgICAgIFwiaWNvbi10cmFuc2xhdGVcIjogbmV3IHZpKFB0LnBhaW50X3N5bWJvbFtcImljb24tdHJhbnNsYXRlXCJdKSxcbiAgICAgICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IHZpKFB0LnBhaW50X3N5bWJvbFtcImljb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgICAgIFwidGV4dC1vcGFjaXR5XCI6IG5ldyBnaShQdC5wYWludF9zeW1ib2xbXCJ0ZXh0LW9wYWNpdHlcIl0pLFxuICAgICAgICBcInRleHQtY29sb3JcIjogbmV3IGdpKFB0LnBhaW50X3N5bWJvbFtcInRleHQtY29sb3JcIl0sIHtcbiAgICAgICAgICBydW50aW1lVHlwZTogcXQsXG4gICAgICAgICAgZ2V0T3ZlcnJpZGU6IGZ1bmN0aW9uIGdldE92ZXJyaWRlKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0LnRleHRDb2xvcjtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhhc092ZXJyaWRlOiBmdW5jdGlvbiBoYXNPdmVycmlkZSh0KSB7XG4gICAgICAgICAgICByZXR1cm4gISF0LnRleHRDb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcInRleHQtaGFsby1jb2xvclwiOiBuZXcgZ2koUHQucGFpbnRfc3ltYm9sW1widGV4dC1oYWxvLWNvbG9yXCJdKSxcbiAgICAgICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogbmV3IGdpKFB0LnBhaW50X3N5bWJvbFtcInRleHQtaGFsby13aWR0aFwiXSksXG4gICAgICAgIFwidGV4dC1oYWxvLWJsdXJcIjogbmV3IGdpKFB0LnBhaW50X3N5bWJvbFtcInRleHQtaGFsby1ibHVyXCJdKSxcbiAgICAgICAgXCJ0ZXh0LXRyYW5zbGF0ZVwiOiBuZXcgdmkoUHQucGFpbnRfc3ltYm9sW1widGV4dC10cmFuc2xhdGVcIl0pLFxuICAgICAgICBcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgdmkoUHQucGFpbnRfc3ltYm9sW1widGV4dC10cmFuc2xhdGUtYW5jaG9yXCJdKVxuICAgICAgfSksXG4gICAgICBsYXlvdXQ6IHhsXG4gICAgfSxcbiAgICAgICAgd2wgPSBmdW5jdGlvbiB3bCh0KSB7XG4gICAgICB0aGlzLnR5cGUgPSB0LnByb3BlcnR5Lm92ZXJyaWRlcyA/IHQucHJvcGVydHkub3ZlcnJpZGVzLnJ1bnRpbWVUeXBlIDogUnQsIHRoaXMuZGVmYXVsdFZhbHVlID0gdDtcbiAgICB9O1xuXG4gICAgd2wucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0LmZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5vdmVycmlkZXM7XG4gICAgICAgIGlmIChlICYmIGUuaGFzT3ZlcnJpZGUodC5mb3JtYXR0ZWRTZWN0aW9uKSkgcmV0dXJuIGUuZ2V0T3ZlcnJpZGUodC5mb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQuZmVhdHVyZSAmJiB0LmZlYXR1cmVTdGF0ZSA/IHRoaXMuZGVmYXVsdFZhbHVlLmV2YWx1YXRlKHQuZmVhdHVyZSwgdC5mZWF0dXJlU3RhdGUpIDogdGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbi5kZWZhdWx0O1xuICAgIH0sIHdsLnByb3RvdHlwZS5lYWNoQ2hpbGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWUuaXNDb25zdGFudCgpIHx8IHQodGhpcy5kZWZhdWx0VmFsdWUudmFsdWUuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICB9LCB3bC5wcm90b3R5cGUub3V0cHV0RGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCB3bC5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgT24oXCJGb3JtYXRTZWN0aW9uT3ZlcnJpZGVcIiwgd2wsIHtcbiAgICAgIG9taXQ6IFtcImRlZmF1bHRWYWx1ZVwiXVxuICAgIH0pO1xuXG4gICAgdmFyIF9sID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwgYmwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgIGlmICh0LnByb3RvdHlwZS5yZWNhbGN1bGF0ZS5jYWxsKHRoaXMsIGUsIHIpLCBcImF1dG9cIiA9PT0gdGhpcy5sYXlvdXQuZ2V0KFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIikgJiYgKHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSA9IFwicG9pbnRcIiAhPT0gdGhpcy5sYXlvdXQuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSA/IFwibWFwXCIgOiBcInZpZXdwb3J0XCIpLCBcImF1dG9cIiA9PT0gdGhpcy5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIikgJiYgKHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSA9IFwicG9pbnRcIiAhPT0gdGhpcy5sYXlvdXQuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSA/IFwibWFwXCIgOiBcInZpZXdwb3J0XCIpLCBcImF1dG9cIiA9PT0gdGhpcy5sYXlvdXQuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIikgJiYgKHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiXSA9IHRoaXMubGF5b3V0LmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpKSwgXCJhdXRvXCIgPT09IHRoaXMubGF5b3V0LmdldChcImljb24tcGl0Y2gtYWxpZ25tZW50XCIpICYmICh0aGlzLmxheW91dC5fdmFsdWVzW1wiaWNvbi1waXRjaC1hbGlnbm1lbnRcIl0gPSB0aGlzLmxheW91dC5nZXQoXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiKSksIFwicG9pbnRcIiA9PT0gdGhpcy5sYXlvdXQuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSkge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5sYXlvdXQuZ2V0KFwidGV4dC13cml0aW5nLW1vZGVcIik7XG5cbiAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IFtdLCBhID0gMCwgbyA9IG47IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBzID0gb1thXTtcbiAgICAgICAgICAgICAgaS5pbmRleE9mKHMpIDwgMCAmJiBpLnB1c2gocyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXdyaXRpbmctbW9kZVwiXSA9IGk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMubGF5b3V0Ll92YWx1ZXNbXCJ0ZXh0LXdyaXRpbmctbW9kZVwiXSA9IFtcImhvcml6b250YWxcIl07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRQYWludE92ZXJyaWRlcygpO1xuICAgICAgfSwgZS5wcm90b3R5cGUuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmxheW91dC5nZXQodCkuZXZhbHVhdGUoZSwge30sIHIsIG4pLFxuICAgICAgICAgICAgYSA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXNbdF07XG4gICAgICAgIHJldHVybiBhLmlzRGF0YURyaXZlbigpIHx8IFpyKGEudmFsdWUpIHx8ICFpID8gaSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgveyhbXnt9XSspfS9nLCBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICAgICAgcmV0dXJuIHIgaW4gdCA/IFN0cmluZyh0W3JdKSA6IFwiXCI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0oZS5wcm9wZXJ0aWVzLCBpKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgZ2wodCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeVJhZGl1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9LCBlLnByb3RvdHlwZS5xdWVyeUludGVyc2VjdHNGZWF0dXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fc2V0UGFpbnRPdmVycmlkZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgPSAwLCByID0gYmwucGFpbnQub3ZlcnJpZGFibGVQcm9wZXJ0aWVzOyB0IDwgci5sZW5ndGg7IHQgKz0gMSkge1xuICAgICAgICAgIHZhciBuID0gclt0XTtcblxuICAgICAgICAgIGlmIChlLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsIG4pKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICBhID0gdGhpcy5wYWludC5nZXQobiksXG4gICAgICAgICAgICAgICAgbyA9IG5ldyB3bChhKSxcbiAgICAgICAgICAgICAgICBzID0gbmV3IEdyKG8sIGEucHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgICAgICAgICBpID0gXCJjb25zdGFudFwiID09PSBhLnZhbHVlLmtpbmQgfHwgXCJzb3VyY2VcIiA9PT0gYS52YWx1ZS5raW5kID8gbmV3IEpyKFwic291cmNlXCIsIHMpIDogbmV3IEhyKFwiY29tcG9zaXRlXCIsIHMsIGEudmFsdWUuem9vbVN0b3BzLCBhLnZhbHVlLl9pbnRlcnBvbGF0aW9uVHlwZSksIHRoaXMucGFpbnQuX3ZhbHVlc1tuXSA9IG5ldyBkaShhLnByb3BlcnR5LCBpLCBhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZS5wcm90b3R5cGUuX2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZSA9IGZ1bmN0aW9uICh0LCByLCBuKSB7XG4gICAgICAgIHJldHVybiAhKCF0aGlzLmxheW91dCB8fCByLmlzRGF0YURyaXZlbigpIHx8IG4uaXNEYXRhRHJpdmVuKCkpICYmIGUuaGFzUGFpbnRPdmVycmlkZSh0aGlzLmxheW91dCwgdCk7XG4gICAgICB9LCBlLmhhc1BhaW50T3ZlcnJpZGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgciA9IHQuZ2V0KFwidGV4dC1maWVsZFwiKSxcbiAgICAgICAgICAgIG4gPSBibC5wYWludC5wcm9wZXJ0aWVzW2VdLFxuICAgICAgICAgICAgaSA9ICExLFxuICAgICAgICAgICAgYSA9IGZ1bmN0aW9uIGEodCkge1xuICAgICAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdDsgZSA8IHIubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChuLm92ZXJyaWRlcyAmJiBuLm92ZXJyaWRlcy5oYXNPdmVycmlkZShyW2VdKSkgcmV0dXJuIHZvaWQgKGkgPSAhMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcImNvbnN0YW50XCIgPT09IHIudmFsdWUua2luZCAmJiByLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgaWUpIGEoci52YWx1ZS52YWx1ZS5zZWN0aW9ucyk7ZWxzZSBpZiAoXCJzb3VyY2VcIiA9PT0gci52YWx1ZS5raW5kKSB7XG4gICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiBvKHQpIHtcbiAgICAgICAgICAgIGkgfHwgKHQgaW5zdGFuY2VvZiBwZSAmJiB1ZSh0LnZhbHVlKSA9PT0gWnQgPyBhKHQudmFsdWUuc2VjdGlvbnMpIDogdCBpbnN0YW5jZW9mIHllID8gYSh0LnNlY3Rpb25zKSA6IHQuZWFjaENoaWxkKG8pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzID0gci52YWx1ZTtcblxuICAgICAgICAgIHMuX3N0eWxlRXhwcmVzc2lvbiAmJiBvKHMuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH0sIGU7XG4gICAgfShBaSksXG4gICAgICAgIEFsID0ge1xuICAgICAgcGFpbnQ6IG5ldyBfaSh7XG4gICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBuZXcgdmkoUHQucGFpbnRfYmFja2dyb3VuZFtcImJhY2tncm91bmQtY29sb3JcIl0pLFxuICAgICAgICBcImJhY2tncm91bmQtcGF0dGVyblwiOiBuZXcgYmkoUHQucGFpbnRfYmFja2dyb3VuZFtcImJhY2tncm91bmQtcGF0dGVyblwiXSksXG4gICAgICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IG5ldyB2aShQdC5wYWludF9iYWNrZ3JvdW5kW1wiYmFja2dyb3VuZC1vcGFjaXR5XCJdKVxuICAgICAgfSlcbiAgICB9LFxuICAgICAgICBTbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIEFsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZTtcbiAgICB9KEFpKSxcbiAgICAgICAga2wgPSB7XG4gICAgICBwYWludDogbmV3IF9pKHtcbiAgICAgICAgXCJyYXN0ZXItb3BhY2l0eVwiOiBuZXcgdmkoUHQucGFpbnRfcmFzdGVyW1wicmFzdGVyLW9wYWNpdHlcIl0pLFxuICAgICAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IG5ldyB2aShQdC5wYWludF9yYXN0ZXJbXCJyYXN0ZXItaHVlLXJvdGF0ZVwiXSksXG4gICAgICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IG5ldyB2aShQdC5wYWludF9yYXN0ZXJbXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIl0pLFxuICAgICAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOiBuZXcgdmkoUHQucGFpbnRfcmFzdGVyW1wicmFzdGVyLWJyaWdodG5lc3MtbWF4XCJdKSxcbiAgICAgICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBuZXcgdmkoUHQucGFpbnRfcmFzdGVyW1wicmFzdGVyLXNhdHVyYXRpb25cIl0pLFxuICAgICAgICBcInJhc3Rlci1jb250cmFzdFwiOiBuZXcgdmkoUHQucGFpbnRfcmFzdGVyW1wicmFzdGVyLWNvbnRyYXN0XCJdKSxcbiAgICAgICAgXCJyYXN0ZXItcmVzYW1wbGluZ1wiOiBuZXcgdmkoUHQucGFpbnRfcmFzdGVyW1wicmFzdGVyLXJlc2FtcGxpbmdcIl0pLFxuICAgICAgICBcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCI6IG5ldyB2aShQdC5wYWludF9yYXN0ZXJbXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiXSlcbiAgICAgIH0pXG4gICAgfSxcbiAgICAgICAgSWwgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlLCBrbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGU7XG4gICAgfShBaSksXG4gICAgICAgIHpsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSkge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwge30pLCB0aGlzLmltcGxlbWVudGF0aW9uID0gZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuaXMzRCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiM2RcIiA9PT0gdGhpcy5pbXBsZW1lbnRhdGlvbi5yZW5kZXJpbmdNb2RlO1xuICAgICAgfSwgZS5wcm90b3R5cGUuaGFzT2Zmc2NyZWVuUGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXI7XG4gICAgICB9LCBlLnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uICgpIHt9LCBlLnByb3RvdHlwZS51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uICgpIHt9LCBlLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge30sIGUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHt9LCBlLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24ub25BZGQgJiYgdGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCh0LCB0LnBhaW50ZXIuY29udGV4dC5nbCk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUgJiYgdGhpcy5pbXBsZW1lbnRhdGlvbi5vblJlbW92ZSh0LCB0LnBhaW50ZXIuY29udGV4dC5nbCk7XG4gICAgICB9LCBlO1xuICAgIH0oQWkpLFxuICAgICAgICBDbCA9IHtcbiAgICAgIGNpcmNsZTogaG8sXG4gICAgICBoZWF0bWFwOiBBbyxcbiAgICAgIGhpbGxzaGFkZToga28sXG4gICAgICBmaWxsOiBjcyxcbiAgICAgIFwiZmlsbC1leHRydXNpb25cIjogQ3MsXG4gICAgICBsaW5lOiBVcyxcbiAgICAgIHN5bWJvbDogX2wsXG4gICAgICBiYWNrZ3JvdW5kOiBTbCxcbiAgICAgIHJhc3RlcjogSWxcbiAgICB9LFxuICAgICAgICBFbCA9IG8uSFRNTEltYWdlRWxlbWVudCxcbiAgICAgICAgUGwgPSBvLkhUTUxDYW52YXNFbGVtZW50LFxuICAgICAgICBNbCA9IG8uSFRNTFZpZGVvRWxlbWVudCxcbiAgICAgICAgQmwgPSBvLkltYWdlRGF0YSxcbiAgICAgICAgVGwgPSBvLkltYWdlQml0bWFwLFxuICAgICAgICBWbCA9IGZ1bmN0aW9uIFZsKHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHQsIHRoaXMuZm9ybWF0ID0gciwgdGhpcy50ZXh0dXJlID0gdC5nbC5jcmVhdGVUZXh0dXJlKCksIHRoaXMudXBkYXRlKGUsIG4pO1xuICAgIH07XG5cbiAgICBWbC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdC53aWR0aCxcbiAgICAgICAgICBpID0gdC5oZWlnaHQsXG4gICAgICAgICAgYSA9ICEodGhpcy5zaXplICYmIHRoaXMuc2l6ZVswXSA9PT0gbiAmJiB0aGlzLnNpemVbMV0gPT09IGkgfHwgciksXG4gICAgICAgICAgbyA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICBzID0gby5nbDtcbiAgICAgIGlmICh0aGlzLnVzZU1pcG1hcCA9IEJvb2xlYW4oZSAmJiBlLnVzZU1pcG1hcCksIHMuYmluZFRleHR1cmUocy5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpLCBvLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXQoITEpLCBvLnBpeGVsU3RvcmVVbnBhY2suc2V0KDEpLCBvLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldCh0aGlzLmZvcm1hdCA9PT0gcy5SR0JBICYmICghZSB8fCAhMSAhPT0gZS5wcmVtdWx0aXBseSkpLCBhKSB0aGlzLnNpemUgPSBbbiwgaV0sIHQgaW5zdGFuY2VvZiBFbCB8fCB0IGluc3RhbmNlb2YgUGwgfHwgdCBpbnN0YW5jZW9mIE1sIHx8IHQgaW5zdGFuY2VvZiBCbCB8fCBUbCAmJiB0IGluc3RhbmNlb2YgVGwgPyBzLnRleEltYWdlMkQocy5URVhUVVJFXzJELCAwLCB0aGlzLmZvcm1hdCwgdGhpcy5mb3JtYXQsIHMuVU5TSUdORURfQllURSwgdCkgOiBzLnRleEltYWdlMkQocy5URVhUVVJFXzJELCAwLCB0aGlzLmZvcm1hdCwgbiwgaSwgMCwgdGhpcy5mb3JtYXQsIHMuVU5TSUdORURfQllURSwgdC5kYXRhKTtlbHNlIHtcbiAgICAgICAgdmFyIHUgPSByIHx8IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgICAgIGwgPSB1LngsXG4gICAgICAgICAgICBwID0gdS55O1xuICAgICAgICB0IGluc3RhbmNlb2YgRWwgfHwgdCBpbnN0YW5jZW9mIFBsIHx8IHQgaW5zdGFuY2VvZiBNbCB8fCB0IGluc3RhbmNlb2YgQmwgfHwgVGwgJiYgdCBpbnN0YW5jZW9mIFRsID8gcy50ZXhTdWJJbWFnZTJEKHMuVEVYVFVSRV8yRCwgMCwgbCwgcCwgcy5SR0JBLCBzLlVOU0lHTkVEX0JZVEUsIHQpIDogcy50ZXhTdWJJbWFnZTJEKHMuVEVYVFVSRV8yRCwgMCwgbCwgcCwgbiwgaSwgcy5SR0JBLCBzLlVOU0lHTkVEX0JZVEUsIHQuZGF0YSk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZU1pcG1hcCAmJiB0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSAmJiBzLmdlbmVyYXRlTWlwbWFwKHMuVEVYVFVSRV8yRCk7XG4gICAgfSwgVmwucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICBuLmJpbmRUZXh0dXJlKG4uVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKSwgciAhPT0gbi5MSU5FQVJfTUlQTUFQX05FQVJFU1QgfHwgdGhpcy5pc1NpemVQb3dlck9mVHdvKCkgfHwgKHIgPSBuLkxJTkVBUiksIHQgIT09IHRoaXMuZmlsdGVyICYmIChuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELCBuLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdCksIG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsIG4uVEVYVFVSRV9NSU5fRklMVEVSLCByIHx8IHQpLCB0aGlzLmZpbHRlciA9IHQpLCBlICE9PSB0aGlzLndyYXAgJiYgKG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsIG4uVEVYVFVSRV9XUkFQX1MsIGUpLCBuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELCBuLlRFWFRVUkVfV1JBUF9ULCBlKSwgdGhpcy53cmFwID0gZSk7XG4gICAgfSwgVmwucHJvdG90eXBlLmlzU2l6ZVBvd2VyT2ZUd28gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplWzBdID09PSB0aGlzLnNpemVbMV0gJiYgTWF0aC5sb2codGhpcy5zaXplWzBdKSAvIE1hdGguTE4yICUgMSA9PSAwO1xuICAgIH0sIFZsLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jb250ZXh0LmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKSwgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIEZsID0gZnVuY3Rpb24gRmwodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgdGhpcy5fY2FsbGJhY2sgPSB0LCB0aGlzLl90cmlnZ2VyZWQgPSAhMSwgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgJiYgKHRoaXMuX2NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgdGhpcy5fY2hhbm5lbC5wb3J0Mi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGUuX3RyaWdnZXJlZCA9ICExLCBlLl9jYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIEZsLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgdGhpcy5fdHJpZ2dlcmVkIHx8ICh0aGlzLl90cmlnZ2VyZWQgPSAhMCwgdGhpcy5fY2hhbm5lbCA/IHRoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UoITApIDogc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQuX3RyaWdnZXJlZCA9ICExLCB0Ll9jYWxsYmFjaygpO1xuICAgICAgfSwgMCkpO1xuICAgIH0sIEZsLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWxldGUgdGhpcy5fY2hhbm5lbCwgdGhpcy5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB9O1xuXG4gICAgdmFyIERsID0gZnVuY3Rpb24gRGwodCwgZSwgcikge1xuICAgICAgdGhpcy50YXJnZXQgPSB0LCB0aGlzLnBhcmVudCA9IGUsIHRoaXMubWFwSWQgPSByLCB0aGlzLmNhbGxiYWNrcyA9IHt9LCB0aGlzLnRhc2tzID0ge30sIHRoaXMudGFza1F1ZXVlID0gW10sIHRoaXMuY2FuY2VsQ2FsbGJhY2tzID0ge30sIHYoW1wicmVjZWl2ZVwiLCBcInByb2Nlc3NcIl0sIHRoaXMpLCB0aGlzLmludm9rZXIgPSBuZXcgRmwodGhpcy5wcm9jZXNzKSwgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5yZWNlaXZlLCAhMSksIHRoaXMuZ2xvYmFsU2NvcGUgPSBJKCkgPyB0IDogbztcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTGwodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSAyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYgLyBNYXRoLnBvdygyLCByKTtcbiAgICAgIHJldHVybiBbdCAqIG4gLSAyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyLCBlICogbiAtIDIgKiBNYXRoLlBJICogNjM3ODEzNyAvIDJdO1xuICAgIH1cblxuICAgIERsLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGkpIHtcbiAgICAgIHZhciBhID0gdGhpcztcbiAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9ICExKTtcbiAgICAgIHZhciBvID0gTWF0aC5yb3VuZCgxZTE4ICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICByICYmICh0aGlzLmNhbGxiYWNrc1tvXSA9IHIpO1xuICAgICAgdmFyIHMgPSBFKHRoaXMuZ2xvYmFsU2NvcGUpID8gdm9pZCAwIDogW107XG4gICAgICByZXR1cm4gdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBpZDogbyxcbiAgICAgICAgdHlwZTogdCxcbiAgICAgICAgaGFzQ2FsbGJhY2s6ICEhcixcbiAgICAgICAgdGFyZ2V0TWFwSWQ6IG4sXG4gICAgICAgIG11c3RRdWV1ZTogaSxcbiAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgIGRhdGE6IE5uKGUsIHMpXG4gICAgICB9LCBzKSwge1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICByICYmIGRlbGV0ZSBhLmNhbGxiYWNrc1tvXSwgYS50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaWQ6IG8sXG4gICAgICAgICAgICB0eXBlOiBcIjxjYW5jZWw+XCIsXG4gICAgICAgICAgICB0YXJnZXRNYXBJZDogbixcbiAgICAgICAgICAgIHNvdXJjZU1hcElkOiBhLm1hcElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgRGwucHJvdG90eXBlLnJlY2VpdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0LmRhdGEsXG4gICAgICAgICAgciA9IGUuaWQ7XG4gICAgICBpZiAociAmJiAoIWUudGFyZ2V0TWFwSWQgfHwgdGhpcy5tYXBJZCA9PT0gZS50YXJnZXRNYXBJZCkpIGlmIChcIjxjYW5jZWw+XCIgPT09IGUudHlwZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50YXNrc1tyXTtcbiAgICAgICAgdmFyIG4gPSB0aGlzLmNhbmNlbENhbGxiYWNrc1tyXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW3JdLCBuICYmIG4oKTtcbiAgICAgIH0gZWxzZSBJKCkgfHwgZS5tdXN0UXVldWUgPyAodGhpcy50YXNrc1tyXSA9IGUsIHRoaXMudGFza1F1ZXVlLnB1c2gociksIHRoaXMuaW52b2tlci50cmlnZ2VyKCkpIDogdGhpcy5wcm9jZXNzVGFzayhyLCBlKTtcbiAgICB9LCBEbC5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLnRhc2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLnRhc2tRdWV1ZS5zaGlmdCgpLFxuICAgICAgICAgICAgZSA9IHRoaXMudGFza3NbdF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRhc2tzW3RdLCB0aGlzLnRhc2tRdWV1ZS5sZW5ndGggJiYgdGhpcy5pbnZva2VyLnRyaWdnZXIoKSwgZSAmJiB0aGlzLnByb2Nlc3NUYXNrKHQsIGUpO1xuICAgICAgfVxuICAgIH0sIERsLnByb3RvdHlwZS5wcm9jZXNzVGFzayA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG5cbiAgICAgIGlmIChcIjxyZXNwb25zZT5cIiA9PT0gZS50eXBlKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5jYWxsYmFja3NbdF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1t0XSwgbiAmJiAoZS5lcnJvciA/IG4oS24oZS5lcnJvcikpIDogbihudWxsLCBLbihlLmRhdGEpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaSA9ICExLFxuICAgICAgICAgICAgYSA9IEUodGhpcy5nbG9iYWxTY29wZSkgPyB2b2lkIDAgOiBbXSxcbiAgICAgICAgICAgIG8gPSBlLmhhc0NhbGxiYWNrID8gZnVuY3Rpb24gKGUsIG4pIHtcbiAgICAgICAgICBpID0gITAsIGRlbGV0ZSByLmNhbmNlbENhbGxiYWNrc1t0XSwgci50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaWQ6IHQsXG4gICAgICAgICAgICB0eXBlOiBcIjxyZXNwb25zZT5cIixcbiAgICAgICAgICAgIHNvdXJjZU1hcElkOiByLm1hcElkLFxuICAgICAgICAgICAgZXJyb3I6IGUgPyBObihlKSA6IG51bGwsXG4gICAgICAgICAgICBkYXRhOiBObihuLCBhKVxuICAgICAgICAgIH0sIGEpO1xuICAgICAgICB9IDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpID0gITA7XG4gICAgICAgIH0sXG4gICAgICAgICAgICBzID0gbnVsbCxcbiAgICAgICAgICAgIHUgPSBLbihlLmRhdGEpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRbZS50eXBlXSkgcyA9IHRoaXMucGFyZW50W2UudHlwZV0oZS5zb3VyY2VNYXBJZCwgdSwgbyk7ZWxzZSBpZiAodGhpcy5wYXJlbnQuZ2V0V29ya2VyU291cmNlKSB7XG4gICAgICAgICAgdmFyIGwgPSBlLnR5cGUuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHMgPSB0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2UoZS5zb3VyY2VNYXBJZCwgbFswXSwgdS5zb3VyY2UpW2xbMV1dKHUsIG8pO1xuICAgICAgICB9IGVsc2UgbyhuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBmdW5jdGlvbiBcIiArIGUudHlwZSkpO1xuICAgICAgICAhaSAmJiBzICYmIHMuY2FuY2VsICYmICh0aGlzLmNhbmNlbENhbGxiYWNrc1t0XSA9IHMuY2FuY2VsKTtcbiAgICAgIH1cbiAgICB9LCBEbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5pbnZva2VyLnJlbW92ZSgpLCB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLnJlY2VpdmUsICExKTtcbiAgICB9O1xuXG4gICAgdmFyIFJsID0gZnVuY3Rpb24gUmwodCwgZSkge1xuICAgICAgdCAmJiAoZSA/IHRoaXMuc2V0U291dGhXZXN0KHQpLnNldE5vcnRoRWFzdChlKSA6IDQgPT09IHQubGVuZ3RoID8gdGhpcy5zZXRTb3V0aFdlc3QoW3RbMF0sIHRbMV1dKS5zZXROb3J0aEVhc3QoW3RbMl0sIHRbM11dKSA6IHRoaXMuc2V0U291dGhXZXN0KHRbMF0pLnNldE5vcnRoRWFzdCh0WzFdKSk7XG4gICAgfTtcblxuICAgIFJsLnByb3RvdHlwZS5zZXROb3J0aEVhc3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25lID0gdCBpbnN0YW5jZW9mIE9sID8gbmV3IE9sKHQubG5nLCB0LmxhdCkgOiBPbC5jb252ZXJ0KHQpLCB0aGlzO1xuICAgIH0sIFJsLnByb3RvdHlwZS5zZXRTb3V0aFdlc3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N3ID0gdCBpbnN0YW5jZW9mIE9sID8gbmV3IE9sKHQubG5nLCB0LmxhdCkgOiBPbC5jb252ZXJ0KHQpLCB0aGlzO1xuICAgIH0sIFJsLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUsXG4gICAgICAgICAgcixcbiAgICAgICAgICBuID0gdGhpcy5fc3csXG4gICAgICAgICAgaSA9IHRoaXMuX25lO1xuICAgICAgaWYgKHQgaW5zdGFuY2VvZiBPbCkgZSA9IHQsIHIgPSB0O2Vsc2Uge1xuICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgUmwpKSByZXR1cm4gQXJyYXkuaXNBcnJheSh0KSA/IDQgPT09IHQubGVuZ3RoIHx8IHQuZXZlcnkoQXJyYXkuaXNBcnJheSkgPyB0aGlzLmV4dGVuZChSbC5jb252ZXJ0KHQpKSA6IHRoaXMuZXh0ZW5kKE9sLmNvbnZlcnQodCkpIDogdGhpcztcbiAgICAgICAgaWYgKHIgPSB0Ll9uZSwgIShlID0gdC5fc3cpIHx8ICFyKSByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuIHx8IGkgPyAobi5sbmcgPSBNYXRoLm1pbihlLmxuZywgbi5sbmcpLCBuLmxhdCA9IE1hdGgubWluKGUubGF0LCBuLmxhdCksIGkubG5nID0gTWF0aC5tYXgoci5sbmcsIGkubG5nKSwgaS5sYXQgPSBNYXRoLm1heChyLmxhdCwgaS5sYXQpKSA6ICh0aGlzLl9zdyA9IG5ldyBPbChlLmxuZywgZS5sYXQpLCB0aGlzLl9uZSA9IG5ldyBPbChyLmxuZywgci5sYXQpKSwgdGhpcztcbiAgICB9LCBSbC5wcm90b3R5cGUuZ2V0Q2VudGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBPbCgodGhpcy5fc3cubG5nICsgdGhpcy5fbmUubG5nKSAvIDIsICh0aGlzLl9zdy5sYXQgKyB0aGlzLl9uZS5sYXQpIC8gMik7XG4gICAgfSwgUmwucHJvdG90eXBlLmdldFNvdXRoV2VzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdztcbiAgICB9LCBSbC5wcm90b3R5cGUuZ2V0Tm9ydGhFYXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25lO1xuICAgIH0sIFJsLnByb3RvdHlwZS5nZXROb3J0aFdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IE9sKHRoaXMuZ2V0V2VzdCgpLCB0aGlzLmdldE5vcnRoKCkpO1xuICAgIH0sIFJsLnByb3RvdHlwZS5nZXRTb3V0aEVhc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IE9sKHRoaXMuZ2V0RWFzdCgpLCB0aGlzLmdldFNvdXRoKCkpO1xuICAgIH0sIFJsLnByb3RvdHlwZS5nZXRXZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N3LmxuZztcbiAgICB9LCBSbC5wcm90b3R5cGUuZ2V0U291dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3cubGF0O1xuICAgIH0sIFJsLnByb3RvdHlwZS5nZXRFYXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25lLmxuZztcbiAgICB9LCBSbC5wcm90b3R5cGUuZ2V0Tm9ydGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbmUubGF0O1xuICAgIH0sIFJsLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFt0aGlzLl9zdy50b0FycmF5KCksIHRoaXMuX25lLnRvQXJyYXkoKV07XG4gICAgfSwgUmwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiTG5nTGF0Qm91bmRzKFwiICsgdGhpcy5fc3cudG9TdHJpbmcoKSArIFwiLCBcIiArIHRoaXMuX25lLnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICB9LCBSbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhKHRoaXMuX3N3ICYmIHRoaXMuX25lKTtcbiAgICB9LCBSbC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBPbC5jb252ZXJ0KHQpLFxuICAgICAgICAgIHIgPSBlLmxuZyxcbiAgICAgICAgICBuID0gZS5sYXQsXG4gICAgICAgICAgaSA9IHRoaXMuX3N3LmxuZyA8PSByICYmIHIgPD0gdGhpcy5fbmUubG5nO1xuICAgICAgcmV0dXJuIHRoaXMuX3N3LmxuZyA+IHRoaXMuX25lLmxuZyAmJiAoaSA9IHRoaXMuX3N3LmxuZyA+PSByICYmIHIgPj0gdGhpcy5fbmUubG5nKSwgdGhpcy5fc3cubGF0IDw9IG4gJiYgbiA8PSB0aGlzLl9uZS5sYXQgJiYgaTtcbiAgICB9LCBSbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAhdCB8fCB0IGluc3RhbmNlb2YgUmwgPyB0IDogbmV3IFJsKHQpO1xuICAgIH07XG5cbiAgICB2YXIgT2wgPSBmdW5jdGlvbiBPbCh0LCBlKSB7XG4gICAgICBpZiAoaXNOYU4odCkgfHwgaXNOYU4oZSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IG9iamVjdDogKFwiICsgdCArIFwiLCBcIiArIGUgKyBcIilcIik7XG4gICAgICBpZiAodGhpcy5sbmcgPSArdCwgdGhpcy5sYXQgPSArZSwgdGhpcy5sYXQgPiA5MCB8fCB0aGlzLmxhdCA8IC05MCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwXCIpO1xuICAgIH07XG5cbiAgICBPbC5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgT2woYyh0aGlzLmxuZywgLTE4MCwgMTgwKSwgdGhpcy5sYXQpO1xuICAgIH0sIE9sLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFt0aGlzLmxuZywgdGhpcy5sYXRdO1xuICAgIH0sIE9sLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBcIkxuZ0xhdChcIiArIHRoaXMubG5nICsgXCIsIFwiICsgdGhpcy5sYXQgKyBcIilcIjtcbiAgICB9LCBPbC5wcm90b3R5cGUuZGlzdGFuY2VUbyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IE1hdGguUEkgLyAxODAsXG4gICAgICAgICAgciA9IHRoaXMubGF0ICogZSxcbiAgICAgICAgICBuID0gdC5sYXQgKiBlLFxuICAgICAgICAgIGkgPSBNYXRoLnNpbihyKSAqIE1hdGguc2luKG4pICsgTWF0aC5jb3MocikgKiBNYXRoLmNvcyhuKSAqIE1hdGguY29zKCh0LmxuZyAtIHRoaXMubG5nKSAqIGUpO1xuICAgICAgcmV0dXJuIDYzNzEwMDguOCAqIE1hdGguYWNvcyhNYXRoLm1pbihpLCAxKSk7XG4gICAgfSwgT2wucHJvdG90eXBlLnRvQm91bmRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IDApO1xuICAgICAgdmFyIGUgPSAzNjAgKiB0IC8gNDAwNzUwMTcsXG4gICAgICAgICAgciA9IGUgLyBNYXRoLmNvcyhNYXRoLlBJIC8gMTgwICogdGhpcy5sYXQpO1xuICAgICAgcmV0dXJuIG5ldyBSbChuZXcgT2wodGhpcy5sbmcgLSByLCB0aGlzLmxhdCAtIGUpLCBuZXcgT2wodGhpcy5sbmcgKyByLCB0aGlzLmxhdCArIGUpKTtcbiAgICB9LCBPbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgT2wpIHJldHVybiB0O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkgJiYgKDIgPT09IHQubGVuZ3RoIHx8IDMgPT09IHQubGVuZ3RoKSkgcmV0dXJuIG5ldyBPbChOdW1iZXIodFswXSksIE51bWJlcih0WzFdKSk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodCkgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiBudWxsICE9PSB0KSByZXR1cm4gbmV3IE9sKE51bWJlcihcImxuZ1wiIGluIHQgPyB0LmxuZyA6IHQubG9uKSwgTnVtYmVyKHQubGF0KSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIGFuIG9iamVjdCB7bG9uOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpO1xuICAgIH07XG4gICAgdmFyIFVsID0gMiAqIE1hdGguUEkgKiA2MzcxMDA4Ljg7XG5cbiAgICBmdW5jdGlvbiBqbCh0KSB7XG4gICAgICByZXR1cm4gVWwgKiBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcWwodCkge1xuICAgICAgcmV0dXJuICgxODAgKyB0KSAvIDM2MDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBObCh0KSB7XG4gICAgICByZXR1cm4gKDE4MCAtIDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIHQgKiBNYXRoLlBJIC8gMzYwKSkpIC8gMzYwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEtsKHQsIGUpIHtcbiAgICAgIHJldHVybiB0IC8gamwoZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR2wodCkge1xuICAgICAgcmV0dXJuIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoKDE4MCAtIDM2MCAqIHQpICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XG4gICAgfVxuXG4gICAgdmFyIFpsID0gZnVuY3Rpb24gWmwodCwgZSwgcikge1xuICAgICAgdm9pZCAwID09PSByICYmIChyID0gMCksIHRoaXMueCA9ICt0LCB0aGlzLnkgPSArZSwgdGhpcy56ID0gK3I7XG4gICAgfTtcblxuICAgIFpsLmZyb21MbmdMYXQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0gMCk7XG4gICAgICB2YXIgciA9IE9sLmNvbnZlcnQodCk7XG4gICAgICByZXR1cm4gbmV3IFpsKHFsKHIubG5nKSwgTmwoci5sYXQpLCBLbChlLCByLmxhdCkpO1xuICAgIH0sIFpsLnByb3RvdHlwZS50b0xuZ0xhdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgT2woMzYwICogdGhpcy54IC0gMTgwLCBHbCh0aGlzLnkpKTtcbiAgICB9LCBabC5wcm90b3R5cGUudG9BbHRpdHVkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnogKiBqbChHbCh0aGlzLnkpKTtcbiAgICB9LCBabC5wcm90b3R5cGUubWV0ZXJJbk1lcmNhdG9yQ29vcmRpbmF0ZVVuaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIDEgLyBVbCAqICh0ID0gR2wodGhpcy55KSwgMSAvIE1hdGguY29zKHQgKiBNYXRoLlBJIC8gMTgwKSk7XG4gICAgICB2YXIgdDtcbiAgICB9O1xuXG4gICAgdmFyIFhsID0gZnVuY3Rpb24gWGwodCwgZSwgcikge1xuICAgICAgdGhpcy56ID0gdCwgdGhpcy54ID0gZSwgdGhpcy55ID0gciwgdGhpcy5rZXkgPSBZbCgwLCB0LCB0LCBlLCByKTtcbiAgICB9O1xuXG4gICAgWGwucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy56ID09PSB0LnogJiYgdGhpcy54ID09PSB0LnggJiYgdGhpcy55ID09PSB0Lnk7XG4gICAgfSwgWGwucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgcixcbiAgICAgICAgICBuLFxuICAgICAgICAgIGksXG4gICAgICAgICAgYSxcbiAgICAgICAgICBvLFxuICAgICAgICAgIHMgPSAobiA9IHRoaXMueSwgaSA9IHRoaXMueiwgYSA9IExsKDI1NiAqIChyID0gdGhpcy54KSwgMjU2ICogKG4gPSBNYXRoLnBvdygyLCBpKSAtIG4gLSAxKSwgaSksIG8gPSBMbCgyNTYgKiAociArIDEpLCAyNTYgKiAobiArIDEpLCBpKSwgYVswXSArIFwiLFwiICsgYVsxXSArIFwiLFwiICsgb1swXSArIFwiLFwiICsgb1sxXSksXG4gICAgICAgICAgdSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgIGZvciAodmFyIG4sIGkgPSBcIlwiLCBhID0gdDsgYSA+IDA7IGEtLSkge1xuICAgICAgICAgIGkgKz0gKGUgJiAobiA9IDEgPDwgYSAtIDEpID8gMSA6IDApICsgKHIgJiBuID8gMiA6IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuXG4gICAgICByZXR1cm4gdFsodGhpcy54ICsgdGhpcy55KSAlIHQubGVuZ3RoXS5yZXBsYWNlKFwie3ByZWZpeH1cIiwgKHRoaXMueCAlIDE2KS50b1N0cmluZygxNikgKyAodGhpcy55ICUgMTYpLnRvU3RyaW5nKDE2KSkucmVwbGFjZShcInt6fVwiLCBTdHJpbmcodGhpcy56KSkucmVwbGFjZShcInt4fVwiLCBTdHJpbmcodGhpcy54KSkucmVwbGFjZShcInt5fVwiLCBTdHJpbmcoXCJ0bXNcIiA9PT0gZSA/IE1hdGgucG93KDIsIHRoaXMueikgLSB0aGlzLnkgLSAxIDogdGhpcy55KSkucmVwbGFjZShcIntxdWFka2V5fVwiLCB1KS5yZXBsYWNlKFwie2Jib3gtZXBzZy0zODU3fVwiLCBzKTtcbiAgICB9LCBYbC5wcm90b3R5cGUuZ2V0VGlsZVBvaW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gTWF0aC5wb3coMiwgdGhpcy56KTtcbiAgICAgIHJldHVybiBuZXcgaSg4MTkyICogKHQueCAqIGUgLSB0aGlzLngpLCA4MTkyICogKHQueSAqIGUgLSB0aGlzLnkpKTtcbiAgICB9LCBYbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy56ICsgXCIvXCIgKyB0aGlzLnggKyBcIi9cIiArIHRoaXMueTtcbiAgICB9O1xuXG4gICAgdmFyIEpsID0gZnVuY3Rpb24gSmwodCwgZSkge1xuICAgICAgdGhpcy53cmFwID0gdCwgdGhpcy5jYW5vbmljYWwgPSBlLCB0aGlzLmtleSA9IFlsKHQsIGUueiwgZS56LCBlLngsIGUueSk7XG4gICAgfSxcbiAgICAgICAgSGwgPSBmdW5jdGlvbiBIbCh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLm92ZXJzY2FsZWRaID0gdCwgdGhpcy53cmFwID0gZSwgdGhpcy5jYW5vbmljYWwgPSBuZXcgWGwociwgK24sICtpKSwgdGhpcy5rZXkgPSBZbChlLCB0LCByLCBuLCBpKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gWWwodCwgZSwgciwgbiwgaSkge1xuICAgICAgKHQgKj0gMikgPCAwICYmICh0ID0gLTEgKiB0IC0gMSk7XG4gICAgICB2YXIgYSA9IDEgPDwgcjtcbiAgICAgIHJldHVybiAoYSAqIGEgKiB0ICsgYSAqIGkgKyBuKS50b1N0cmluZygzNikgKyByLnRvU3RyaW5nKDM2KSArIGUudG9TdHJpbmcoMzYpO1xuICAgIH1cblxuICAgIEhsLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMub3ZlcnNjYWxlZFogPT09IHQub3ZlcnNjYWxlZFogJiYgdGhpcy53cmFwID09PSB0LndyYXAgJiYgdGhpcy5jYW5vbmljYWwuZXF1YWxzKHQuY2Fub25pY2FsKTtcbiAgICB9LCBIbC5wcm90b3R5cGUuc2NhbGVkVG8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNhbm9uaWNhbC56IC0gdDtcbiAgICAgIHJldHVybiB0ID4gdGhpcy5jYW5vbmljYWwueiA/IG5ldyBIbCh0LCB0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpIDogbmV3IEhsKHQsIHRoaXMud3JhcCwgdCwgdGhpcy5jYW5vbmljYWwueCA+PiBlLCB0aGlzLmNhbm9uaWNhbC55ID4+IGUpO1xuICAgIH0sIEhsLnByb3RvdHlwZS5jYWxjdWxhdGVTY2FsZWRLZXkgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIHIgPSB0aGlzLmNhbm9uaWNhbC56IC0gdDtcbiAgICAgIHJldHVybiB0ID4gdGhpcy5jYW5vbmljYWwueiA/IFlsKHRoaXMud3JhcCAqICtlLCB0LCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KSA6IFlsKHRoaXMud3JhcCAqICtlLCB0LCB0LCB0aGlzLmNhbm9uaWNhbC54ID4+IHIsIHRoaXMuY2Fub25pY2FsLnkgPj4gcik7XG4gICAgfSwgSGwucHJvdG90eXBlLmlzQ2hpbGRPZiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodC53cmFwICE9PSB0aGlzLndyYXApIHJldHVybiAhMTtcbiAgICAgIHZhciBlID0gdGhpcy5jYW5vbmljYWwueiAtIHQuY2Fub25pY2FsLno7XG4gICAgICByZXR1cm4gMCA9PT0gdC5vdmVyc2NhbGVkWiB8fCB0Lm92ZXJzY2FsZWRaIDwgdGhpcy5vdmVyc2NhbGVkWiAmJiB0LmNhbm9uaWNhbC54ID09PSB0aGlzLmNhbm9uaWNhbC54ID4+IGUgJiYgdC5jYW5vbmljYWwueSA9PT0gdGhpcy5jYW5vbmljYWwueSA+PiBlO1xuICAgIH0sIEhsLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA+PSB0KSByZXR1cm4gW25ldyBIbCh0aGlzLm92ZXJzY2FsZWRaICsgMSwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KV07XG4gICAgICB2YXIgZSA9IHRoaXMuY2Fub25pY2FsLnogKyAxLFxuICAgICAgICAgIHIgPSAyICogdGhpcy5jYW5vbmljYWwueCxcbiAgICAgICAgICBuID0gMiAqIHRoaXMuY2Fub25pY2FsLnk7XG4gICAgICByZXR1cm4gW25ldyBIbChlLCB0aGlzLndyYXAsIGUsIHIsIG4pLCBuZXcgSGwoZSwgdGhpcy53cmFwLCBlLCByICsgMSwgbiksIG5ldyBIbChlLCB0aGlzLndyYXAsIGUsIHIsIG4gKyAxKSwgbmV3IEhsKGUsIHRoaXMud3JhcCwgZSwgciArIDEsIG4gKyAxKV07XG4gICAgfSwgSGwucHJvdG90eXBlLmlzTGVzc1RoYW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMud3JhcCA8IHQud3JhcCB8fCAhKHRoaXMud3JhcCA+IHQud3JhcCkgJiYgKHRoaXMub3ZlcnNjYWxlZFogPCB0Lm92ZXJzY2FsZWRaIHx8ICEodGhpcy5vdmVyc2NhbGVkWiA+IHQub3ZlcnNjYWxlZFopICYmICh0aGlzLmNhbm9uaWNhbC54IDwgdC5jYW5vbmljYWwueCB8fCAhKHRoaXMuY2Fub25pY2FsLnggPiB0LmNhbm9uaWNhbC54KSAmJiB0aGlzLmNhbm9uaWNhbC55IDwgdC5jYW5vbmljYWwueSkpO1xuICAgIH0sIEhsLnByb3RvdHlwZS53cmFwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBIbCh0aGlzLm92ZXJzY2FsZWRaLCAwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICB9LCBIbC5wcm90b3R5cGUudW53cmFwVG8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG5ldyBIbCh0aGlzLm92ZXJzY2FsZWRaLCB0LCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICB9LCBIbC5wcm90b3R5cGUub3ZlcnNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHRoaXMub3ZlcnNjYWxlZFogLSB0aGlzLmNhbm9uaWNhbC56KTtcbiAgICB9LCBIbC5wcm90b3R5cGUudG9VbndyYXBwZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IEpsKHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwpO1xuICAgIH0sIEhsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLm92ZXJzY2FsZWRaICsgXCIvXCIgKyB0aGlzLmNhbm9uaWNhbC54ICsgXCIvXCIgKyB0aGlzLmNhbm9uaWNhbC55O1xuICAgIH0sIEhsLnByb3RvdHlwZS5nZXRUaWxlUG9pbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsLmdldFRpbGVQb2ludChuZXcgWmwodC54IC0gdGhpcy53cmFwLCB0LnkpKTtcbiAgICB9LCBPbihcIkNhbm9uaWNhbFRpbGVJRFwiLCBYbCksIE9uKFwiT3ZlcnNjYWxlZFRpbGVJRFwiLCBIbCwge1xuICAgICAgb21pdDogW1wicG9zTWF0cml4XCJdXG4gICAgfSk7XG5cbiAgICB2YXIgJGwgPSBmdW5jdGlvbiAkbCh0LCBlLCByKSB7XG4gICAgICBpZiAodGhpcy51aWQgPSB0LCBlLmhlaWdodCAhPT0gZS53aWR0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJERU0gdGlsZXMgbXVzdCBiZSBzcXVhcmVcIik7XG4gICAgICBpZiAociAmJiBcIm1hcGJveFwiICE9PSByICYmIFwidGVycmFyaXVtXCIgIT09IHIpIHJldHVybiBBKCdcIicgKyByICsgJ1wiIGlzIG5vdCBhIHZhbGlkIGVuY29kaW5nIHR5cGUuIFZhbGlkIHR5cGVzIGluY2x1ZGUgXCJtYXBib3hcIiBhbmQgXCJ0ZXJyYXJpdW1cIi4nKTtcbiAgICAgIHRoaXMuc3RyaWRlID0gZS5oZWlnaHQ7XG4gICAgICB2YXIgbiA9IHRoaXMuZGltID0gZS5oZWlnaHQgLSAyO1xuICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGUuZGF0YS5idWZmZXIpLCB0aGlzLmVuY29kaW5nID0gciB8fCBcIm1hcGJveFwiO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KC0xLCBpKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KDAsIGkpXSwgdGhpcy5kYXRhW3RoaXMuX2lkeChuLCBpKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KG4gLSAxLCBpKV0sIHRoaXMuZGF0YVt0aGlzLl9pZHgoaSwgLTEpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoaSwgMCldLCB0aGlzLmRhdGFbdGhpcy5faWR4KGksIG4pXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoaSwgbiAtIDEpXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeCgtMSwgLTEpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoMCwgMCldLCB0aGlzLmRhdGFbdGhpcy5faWR4KG4sIC0xKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KG4gLSAxLCAwKV0sIHRoaXMuZGF0YVt0aGlzLl9pZHgoLTEsIG4pXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoMCwgbiAtIDEpXSwgdGhpcy5kYXRhW3RoaXMuX2lkeChuLCBuKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KG4gLSAxLCBuIC0gMSldO1xuICAgIH07XG5cbiAgICAkbC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlciksXG4gICAgICAgICAgbiA9IDQgKiB0aGlzLl9pZHgodCwgZSk7XG5cbiAgICAgIHJldHVybiAoXCJ0ZXJyYXJpdW1cIiA9PT0gdGhpcy5lbmNvZGluZyA/IHRoaXMuX3VucGFja1RlcnJhcml1bSA6IHRoaXMuX3VucGFja01hcGJveCkocltuXSwgcltuICsgMV0sIHJbbiArIDJdKTtcbiAgICB9LCAkbC5wcm90b3R5cGUuZ2V0VW5wYWNrVmVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwidGVycmFyaXVtXCIgPT09IHRoaXMuZW5jb2RpbmcgPyBbMjU2LCAxLCAxIC8gMjU2LCAzMjc2OF0gOiBbNjU1My42LCAyNS42LCAuMSwgMWU0XTtcbiAgICB9LCAkbC5wcm90b3R5cGUuX2lkeCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodCA8IC0xIHx8IHQgPj0gdGhpcy5kaW0gKyAxIHx8IGUgPCAtMSB8fCBlID49IHRoaXMuZGltICsgMSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBERU0gZGF0YVwiKTtcbiAgICAgIHJldHVybiAoZSArIDEpICogdGhpcy5zdHJpZGUgKyAodCArIDEpO1xuICAgIH0sICRsLnByb3RvdHlwZS5fdW5wYWNrTWFwYm94ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiAoMjU2ICogdCAqIDI1NiArIDI1NiAqIGUgKyByKSAvIDEwIC0gMWU0O1xuICAgIH0sICRsLnByb3RvdHlwZS5fdW5wYWNrVGVycmFyaXVtID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiAyNTYgKiB0ICsgZSArIHIgLyAyNTYgLSAzMjc2ODtcbiAgICB9LCAkbC5wcm90b3R5cGUuZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBibyh7XG4gICAgICAgIHdpZHRoOiB0aGlzLnN0cmlkZSxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnN0cmlkZVxuICAgICAgfSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikpO1xuICAgIH0sICRsLnByb3RvdHlwZS5iYWNrZmlsbEJvcmRlciA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICBpZiAodGhpcy5kaW0gIT09IHQuZGltKSB0aHJvdyBuZXcgRXJyb3IoXCJkZW0gZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICAgICAgdmFyIG4gPSBlICogdGhpcy5kaW0sXG4gICAgICAgICAgaSA9IGUgKiB0aGlzLmRpbSArIHRoaXMuZGltLFxuICAgICAgICAgIGEgPSByICogdGhpcy5kaW0sXG4gICAgICAgICAgbyA9IHIgKiB0aGlzLmRpbSArIHRoaXMuZGltO1xuXG4gICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICBuID0gaSAtIDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGkgPSBuICsgMTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChyKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgYSA9IG8gLSAxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBvID0gYSArIDE7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHMgPSAtZSAqIHRoaXMuZGltLCB1ID0gLXIgKiB0aGlzLmRpbSwgbCA9IGE7IGwgPCBvOyBsKyspIHtcbiAgICAgICAgZm9yICh2YXIgcCA9IG47IHAgPCBpOyBwKyspIHtcbiAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KHAsIGwpXSA9IHQuZGF0YVt0aGlzLl9pZHgocCArIHMsIGwgKyB1KV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBPbihcIkRFTURhdGFcIiwgJGwpO1xuXG4gICAgdmFyIFdsID0gZnVuY3Rpb24gV2wodCkge1xuICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXIgPSB7fSwgdGhpcy5fbnVtYmVyVG9TdHJpbmcgPSBbXTtcblxuICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKSB7XG4gICAgICAgIHZhciByID0gdFtlXTtcbiAgICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXJbcl0gPSBlLCB0aGlzLl9udW1iZXJUb1N0cmluZ1tlXSA9IHI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFdsLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ1RvTnVtYmVyW3RdO1xuICAgIH0sIFdsLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW3RdO1xuICAgIH07XG5cbiAgICB2YXIgUWwgPSBmdW5jdGlvbiBRbCh0LCBlLCByLCBuLCBpKSB7XG4gICAgICB0aGlzLnR5cGUgPSBcIkZlYXR1cmVcIiwgdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUgPSB0LCB0Ll96ID0gZSwgdC5feCA9IHIsIHQuX3kgPSBuLCB0aGlzLnByb3BlcnRpZXMgPSB0LnByb3BlcnRpZXMsIHRoaXMuaWQgPSBpO1xuICAgIH0sXG4gICAgICAgIHRwID0ge1xuICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0cC5nZW9tZXRyeS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSB0aGlzLl9nZW9tZXRyeSAmJiAodGhpcy5fZ2VvbWV0cnkgPSB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS50b0dlb0pTT04odGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUuX3gsIHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLl95LCB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS5feikuZ2VvbWV0cnkpLCB0aGlzLl9nZW9tZXRyeTtcbiAgICB9LCB0cC5nZW9tZXRyeS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fZ2VvbWV0cnkgPSB0O1xuICAgIH0sIFFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuZ2VvbWV0cnlcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGUgaW4gdGhpcykge1xuICAgICAgICBcIl9nZW9tZXRyeVwiICE9PSBlICYmIFwiX3ZlY3RvclRpbGVGZWF0dXJlXCIgIT09IGUgJiYgKHRbZV0gPSB0aGlzW2VdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUWwucHJvdG90eXBlLCB0cCk7XG5cbiAgICB2YXIgZXAgPSBmdW5jdGlvbiBlcCgpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSB7fSwgdGhpcy5zdGF0ZUNoYW5nZXMgPSB7fSwgdGhpcy5kZWxldGVkU3RhdGVzID0ge307XG4gICAgfTtcblxuICAgIGVwLnByb3RvdHlwZS51cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IFN0cmluZyhlKTtcbiAgICAgIGlmICh0aGlzLnN0YXRlQ2hhbmdlc1t0XSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3RdIHx8IHt9LCB0aGlzLnN0YXRlQ2hhbmdlc1t0XVtuXSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3RdW25dIHx8IHt9LCBoKHRoaXMuc3RhdGVDaGFuZ2VzW3RdW25dLCByKSwgbnVsbCA9PT0gdGhpcy5kZWxldGVkU3RhdGVzW3RdKSBmb3IgKHZhciBpIGluIHRoaXMuZGVsZXRlZFN0YXRlc1t0XSA9IHt9LCB0aGlzLnN0YXRlW3RdKSB7XG4gICAgICAgIGkgIT09IG4gJiYgKHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtpXSA9IG51bGwpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gJiYgbnVsbCA9PT0gdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dKSBmb3IgKHZhciBhIGluIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSA9IHt9LCB0aGlzLnN0YXRlW3RdW25dKSB7XG4gICAgICAgIHJbYV0gfHwgKHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXVthXSA9IG51bGwpO1xuICAgICAgfSBlbHNlIGZvciAodmFyIG8gaW4gcikge1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dICYmIG51bGwgPT09IHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXVtvXSAmJiBkZWxldGUgdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dW29dO1xuICAgICAgfVxuICAgIH0sIGVwLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKG51bGwgIT09IHRoaXMuZGVsZXRlZFN0YXRlc1t0XSkge1xuICAgICAgICB2YXIgbiA9IFN0cmluZyhlKTtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1t0XSA9IHRoaXMuZGVsZXRlZFN0YXRlc1t0XSB8fCB7fSwgciAmJiB2b2lkIDAgIT09IGUpIG51bGwgIT09IHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSAmJiAodGhpcy5kZWxldGVkU3RhdGVzW3RdW25dID0gdGhpcy5kZWxldGVkU3RhdGVzW3RdW25dIHx8IHt9LCB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl1bcl0gPSBudWxsKTtlbHNlIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZUNoYW5nZXNbdF0gJiYgdGhpcy5zdGF0ZUNoYW5nZXNbdF1bbl0pIGZvciAociBpbiB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF1bbl0gPSB7fSwgdGhpcy5zdGF0ZUNoYW5nZXNbdF1bbl0pIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXVtyXSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtuXSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0gPSBudWxsO1xuICAgICAgfVxuICAgIH0sIGVwLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IFN0cmluZyhlKSxcbiAgICAgICAgICBuID0gaCh7fSwgKHRoaXMuc3RhdGVbdF0gfHwge30pW3JdLCAodGhpcy5zdGF0ZUNoYW5nZXNbdF0gfHwge30pW3JdKTtcbiAgICAgIGlmIChudWxsID09PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbdF0pIHJldHVybiB7fTtcblxuICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1t0XSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuZGVsZXRlZFN0YXRlc1t0XVtlXTtcbiAgICAgICAgaWYgKG51bGwgPT09IGkpIHJldHVybiB7fTtcblxuICAgICAgICBmb3IgKHZhciBhIGluIGkpIHtcbiAgICAgICAgICBkZWxldGUgblthXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9LCBlcC5wcm90b3R5cGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0LnNldEZlYXR1cmVTdGF0ZSh0aGlzLnN0YXRlLCBlKTtcbiAgICB9LCBlcC5wcm90b3R5cGUuY29hbGVzY2VDaGFuZ2VzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0ge307XG5cbiAgICAgIGZvciAodmFyIG4gaW4gdGhpcy5zdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtuXSA9IHRoaXMuc3RhdGVbbl0gfHwge307XG4gICAgICAgIHZhciBpID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLnN0YXRlQ2hhbmdlc1tuXSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbl1bYV0gfHwgKHRoaXMuc3RhdGVbbl1bYV0gPSB7fSksIGgodGhpcy5zdGF0ZVtuXVthXSwgdGhpcy5zdGF0ZUNoYW5nZXNbbl1bYV0pLCBpW2FdID0gdGhpcy5zdGF0ZVtuXVthXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJbbl0gPSBpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBvIGluIHRoaXMuZGVsZXRlZFN0YXRlcykge1xuICAgICAgICB0aGlzLnN0YXRlW29dID0gdGhpcy5zdGF0ZVtvXSB8fCB7fTtcbiAgICAgICAgdmFyIHMgPSB7fTtcbiAgICAgICAgaWYgKG51bGwgPT09IHRoaXMuZGVsZXRlZFN0YXRlc1tvXSkgZm9yICh2YXIgdSBpbiB0aGlzLnN0YXRlW29dKSB7XG4gICAgICAgICAgc1t1XSA9IHt9LCB0aGlzLnN0YXRlW29dW3VdID0ge307XG4gICAgICAgIH0gZWxzZSBmb3IgKHZhciBsIGluIHRoaXMuZGVsZXRlZFN0YXRlc1tvXSkge1xuICAgICAgICAgIGlmIChudWxsID09PSB0aGlzLmRlbGV0ZWRTdGF0ZXNbb11bbF0pIHRoaXMuc3RhdGVbb11bbF0gPSB7fTtlbHNlIGZvciAodmFyIHAgPSAwLCBjID0gT2JqZWN0LmtleXModGhpcy5kZWxldGVkU3RhdGVzW29dW2xdKTsgcCA8IGMubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW29dW2xdW2NbcF1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzW2xdID0gdGhpcy5zdGF0ZVtvXVtsXTtcbiAgICAgICAgfVxuICAgICAgICByW29dID0gcltvXSB8fCB7fSwgaChyW29dLCBzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VzID0ge30sIHRoaXMuZGVsZXRlZFN0YXRlcyA9IHt9LCAwICE9PSBPYmplY3Qua2V5cyhyKS5sZW5ndGgpIGZvciAodmFyIGYgaW4gdCkge1xuICAgICAgICB0W2ZdLnNldEZlYXR1cmVTdGF0ZShyLCBlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHJwID0gZnVuY3Rpb24gcnAodCwgZSkge1xuICAgICAgdGhpcy50aWxlSUQgPSB0LCB0aGlzLnggPSB0LmNhbm9uaWNhbC54LCB0aGlzLnkgPSB0LmNhbm9uaWNhbC55LCB0aGlzLnogPSB0LmNhbm9uaWNhbC56LCB0aGlzLmdyaWQgPSBuZXcgVm4oODE5MiwgMTYsIDApLCB0aGlzLmdyaWQzRCA9IG5ldyBWbig4MTkyLCAxNiwgMCksIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkgPSBuZXcgb2EoKSwgdGhpcy5wcm9tb3RlSWQgPSBlO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBucCh0LCBlLCByLCBuLCBpKSB7XG4gICAgICByZXR1cm4geCh0LCBmdW5jdGlvbiAodCwgYSkge1xuICAgICAgICB2YXIgbyA9IGUgaW5zdGFuY2VvZiBtaSA/IGUuZ2V0KGEpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG8gJiYgby5ldmFsdWF0ZSA/IG8uZXZhbHVhdGUociwgbiwgaSkgOiBvO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDEgLyAwLCByID0gMSAvIDAsIG4gPSAtMSAvIDAsIGkgPSAtMSAvIDAsIGEgPSAwLCBvID0gdDsgYSA8IG8ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgdmFyIHMgPSBvW2FdO1xuICAgICAgICBlID0gTWF0aC5taW4oZSwgcy54KSwgciA9IE1hdGgubWluKHIsIHMueSksIG4gPSBNYXRoLm1heChuLCBzLngpLCBpID0gTWF0aC5tYXgoaSwgcy55KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWluWDogZSxcbiAgICAgICAgbWluWTogcixcbiAgICAgICAgbWF4WDogbixcbiAgICAgICAgbWF4WTogaVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcCh0LCBlKSB7XG4gICAgICByZXR1cm4gZSAtIHQ7XG4gICAgfVxuXG4gICAgcnAucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuZmVhdHVyZUluZGV4QXJyYXkubGVuZ3RoO1xuICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5lbXBsYWNlQmFjayhyLCBuLCBpKTtcblxuICAgICAgZm9yICh2YXIgcyA9IGEgPyB0aGlzLmdyaWQzRCA6IHRoaXMuZ3JpZCwgdSA9IDA7IHUgPCBlLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIGZvciAodmFyIGwgPSBlW3VdLCBwID0gWzEgLyAwLCAxIC8gMCwgLTEgLyAwLCAtMSAvIDBdLCBjID0gMDsgYyA8IGwubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICB2YXIgaCA9IGxbY107XG4gICAgICAgICAgcFswXSA9IE1hdGgubWluKHBbMF0sIGgueCksIHBbMV0gPSBNYXRoLm1pbihwWzFdLCBoLnkpLCBwWzJdID0gTWF0aC5tYXgocFsyXSwgaC54KSwgcFszXSA9IE1hdGgubWF4KHBbM10sIGgueSk7XG4gICAgICAgIH1cblxuICAgICAgICBwWzBdIDwgODE5MiAmJiBwWzFdIDwgODE5MiAmJiBwWzJdID49IDAgJiYgcFszXSA+PSAwICYmIHMuaW5zZXJ0KG8sIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pO1xuICAgICAgfVxuICAgIH0sIHJwLnByb3RvdHlwZS5sb2FkVlRMYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy52dExheWVycyB8fCAodGhpcy52dExheWVycyA9IG5ldyB3cy5WZWN0b3JUaWxlKG5ldyAkcyh0aGlzLnJhd1RpbGVEYXRhKSkubGF5ZXJzLCB0aGlzLnNvdXJjZUxheWVyQ29kZXIgPSBuZXcgV2wodGhpcy52dExheWVycyA/IE9iamVjdC5rZXlzKHRoaXMudnRMYXllcnMpLnNvcnQoKSA6IFtcIl9nZW9qc29uVGlsZUxheWVyXCJdKSksIHRoaXMudnRMYXllcnM7XG4gICAgfSwgcnAucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4pIHtcbiAgICAgIHZhciBhID0gdGhpcztcbiAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgIGZvciAodmFyIG8gPSB0LnBhcmFtcyB8fCB7fSwgcyA9IDgxOTIgLyB0LnRpbGVTaXplIC8gdC5zY2FsZSwgdSA9IHNuKG8uZmlsdGVyKSwgbCA9IHQucXVlcnlHZW9tZXRyeSwgcCA9IHQucXVlcnlQYWRkaW5nICogcywgYyA9IGlwKGwpLCBoID0gdGhpcy5ncmlkLnF1ZXJ5KGMubWluWCAtIHAsIGMubWluWSAtIHAsIGMubWF4WCArIHAsIGMubWF4WSArIHApLCBmID0gaXAodC5jYW1lcmFRdWVyeUdlb21ldHJ5KSwgeSA9IHRoaXMuZ3JpZDNELnF1ZXJ5KGYubWluWCAtIHAsIGYubWluWSAtIHAsIGYubWF4WCArIHAsIGYubWF4WSArIHAsIGZ1bmN0aW9uIChlLCByLCBuLCBhKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgZSwgciwgbiwgYSkge1xuICAgICAgICAgIGZvciAodmFyIG8gPSAwLCBzID0gdDsgbyA8IHMubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB1ID0gc1tvXTtcbiAgICAgICAgICAgIGlmIChlIDw9IHUueCAmJiByIDw9IHUueSAmJiBuID49IHUueCAmJiBhID49IHUueSkgcmV0dXJuICEwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsID0gW25ldyBpKGUsIHIpLCBuZXcgaShlLCBhKSwgbmV3IGkobiwgYSksIG5ldyBpKG4sIHIpXTtcbiAgICAgICAgICBpZiAodC5sZW5ndGggPiAyKSBmb3IgKHZhciBwID0gMCwgYyA9IGw7IHAgPCBjLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICAgICAgICBpZiAoUWEodCwgY1twXSkpIHJldHVybiAhMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBoID0gMDsgaCA8IHQubGVuZ3RoIC0gMTsgaCsrKSB7XG4gICAgICAgICAgICBpZiAodG8odFtoXSwgdFtoICsgMV0sIGwpKSByZXR1cm4gITA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9KHQuY2FtZXJhUXVlcnlHZW9tZXRyeSwgZSAtIHAsIHIgLSBwLCBuICsgcCwgYSArIHApO1xuICAgICAgfSksIGQgPSAwLCBtID0geTsgZCA8IG0ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgaC5wdXNoKG1bZF0pO1xuICAgICAgfVxuXG4gICAgICBoLnNvcnQoYXApO1xuXG4gICAgICBmb3IgKHZhciB2LCBnID0ge30sIHggPSBmdW5jdGlvbiB4KGkpIHtcbiAgICAgICAgdmFyIHAgPSBoW2ldO1xuXG4gICAgICAgIGlmIChwICE9PSB2KSB7XG4gICAgICAgICAgdiA9IHA7XG4gICAgICAgICAgdmFyIGMgPSBhLmZlYXR1cmVJbmRleEFycmF5LmdldChwKSxcbiAgICAgICAgICAgICAgZiA9IG51bGw7XG4gICAgICAgICAgYS5sb2FkTWF0Y2hpbmdGZWF0dXJlKGcsIGMuYnVja2V0SW5kZXgsIGMuc291cmNlTGF5ZXJJbmRleCwgYy5mZWF0dXJlSW5kZXgsIHUsIG8ubGF5ZXJzLCBvLmF2YWlsYWJsZUltYWdlcywgZSwgciwgbiwgZnVuY3Rpb24gKGUsIHIsIG4pIHtcbiAgICAgICAgICAgIHJldHVybiBmIHx8IChmID0gVWEoZSkpLCByLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUobCwgZSwgbiwgZiwgYS56LCB0LnRyYW5zZm9ybSwgcywgdC5waXhlbFBvc01hdHJpeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGIgPSAwOyBiIDwgaC5sZW5ndGg7IGIrKykge1xuICAgICAgICB4KGIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZztcbiAgICB9LCBycC5wcm90b3R5cGUubG9hZE1hdGNoaW5nRmVhdHVyZSA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwKSB7XG4gICAgICB2YXIgYyA9IHRoaXMuYnVja2V0TGF5ZXJJRHNbZV07XG5cbiAgICAgIGlmICghYSB8fCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHRbcl0pID49IDApIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0oYSwgYykpIHtcbiAgICAgICAgdmFyIGYgPSB0aGlzLnNvdXJjZUxheWVyQ29kZXIuZGVjb2RlKHIpLFxuICAgICAgICAgICAgeSA9IHRoaXMudnRMYXllcnNbZl0uZmVhdHVyZShuKTtcblxuICAgICAgICBpZiAoaS5uZWVkR2VvbWV0cnkpIHtcbiAgICAgICAgICB2YXIgZCA9IGphKHksICEwKTtcbiAgICAgICAgICBpZiAoIWkuZmlsdGVyKG5ldyB1aSh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIGQsIHRoaXMudGlsZUlELmNhbm9uaWNhbCkpIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICghaS5maWx0ZXIobmV3IHVpKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgeSkpIHJldHVybjtcblxuICAgICAgICBmb3IgKHZhciBtID0gdGhpcy5nZXRJZCh5LCBmKSwgdiA9IDA7IHYgPCBjLmxlbmd0aDsgdisrKSB7XG4gICAgICAgICAgdmFyIGcgPSBjW3ZdO1xuXG4gICAgICAgICAgaWYgKCEoYSAmJiBhLmluZGV4T2YoZykgPCAwKSkge1xuICAgICAgICAgICAgdmFyIHggPSBzW2ddO1xuXG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICB2YXIgYiA9IHt9O1xuICAgICAgICAgICAgICB2b2lkIDAgIT09IG0gJiYgbCAmJiAoYiA9IGwuZ2V0U3RhdGUoeC5zb3VyY2VMYXllciB8fCBcIl9nZW9qc29uVGlsZUxheWVyXCIsIG0pKTtcbiAgICAgICAgICAgICAgdmFyIHcgPSBoKHt9LCB1W2ddKTtcbiAgICAgICAgICAgICAgdy5wYWludCA9IG5wKHcucGFpbnQsIHgucGFpbnQsIHksIGIsIG8pLCB3LmxheW91dCA9IG5wKHcubGF5b3V0LCB4LmxheW91dCwgeSwgYiwgbyk7XG5cbiAgICAgICAgICAgICAgdmFyIF8gPSAhcCB8fCBwKHksIHgsIGIpO1xuXG4gICAgICAgICAgICAgIGlmIChfKSB7XG4gICAgICAgICAgICAgICAgdmFyIEEgPSBuZXcgUWwoeSwgdGhpcy56LCB0aGlzLngsIHRoaXMueSwgbSk7XG4gICAgICAgICAgICAgICAgQS5sYXllciA9IHc7XG4gICAgICAgICAgICAgICAgdmFyIFMgPSB0W2ddO1xuICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gUyAmJiAoUyA9IHRbZ10gPSBbXSksIFMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXg6IG4sXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlOiBBLFxuICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uWjogX1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgcnAucHJvdG90eXBlLmxvb2t1cFN5bWJvbEZlYXR1cmVzID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMpIHtcbiAgICAgIHZhciB1ID0ge307XG4gICAgICB0aGlzLmxvYWRWVExheWVycygpO1xuXG4gICAgICBmb3IgKHZhciBsID0gc24oaSksIHAgPSAwLCBjID0gdDsgcCA8IGMubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKHUsIHIsIG4sIGNbcF0sIGwsIGEsIG8sIHMsIGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdTtcbiAgICB9LCBycC5wcm90b3R5cGUuaGFzTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0aGlzLmJ1Y2tldExheWVySURzOyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBuID0gMCwgaSA9IHJbZV07IG4gPCBpLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgICAgaWYgKHQgPT09IGlbbl0pIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgcnAucHJvdG90eXBlLmdldElkID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdC5pZDtcbiAgICAgIHJldHVybiB0aGlzLnByb21vdGVJZCAmJiBcImJvb2xlYW5cIiA9PSB0eXBlb2YgKHIgPSB0LnByb3BlcnRpZXNbXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5wcm9tb3RlSWQgPyB0aGlzLnByb21vdGVJZCA6IHRoaXMucHJvbW90ZUlkW2VdXSkgJiYgKHIgPSBOdW1iZXIocikpLCByO1xuICAgIH0sIE9uKFwiRmVhdHVyZUluZGV4XCIsIHJwLCB7XG4gICAgICBvbWl0OiBbXCJyYXdUaWxlRGF0YVwiLCBcInNvdXJjZUxheWVyQ29kZXJcIl1cbiAgICB9KTtcblxuICAgIHZhciBvcCA9IGZ1bmN0aW9uIG9wKHQsIGUpIHtcbiAgICAgIHRoaXMudGlsZUlEID0gdCwgdGhpcy51aWQgPSB5KCksIHRoaXMudXNlcyA9IDAsIHRoaXMudGlsZVNpemUgPSBlLCB0aGlzLmJ1Y2tldHMgPSB7fSwgdGhpcy5leHBpcmF0aW9uVGltZSA9IG51bGwsIHRoaXMucXVlcnlQYWRkaW5nID0gMCwgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gITEsIHRoaXMuaGFzUlRMVGV4dCA9ICExLCB0aGlzLmRlcGVuZGVuY2llcyA9IHt9LCB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPSAwLCB0aGlzLnN0YXRlID0gXCJsb2FkaW5nXCI7XG4gICAgfTtcblxuICAgIG9wLnByb3RvdHlwZS5yZWdpc3RlckZhZGVEdXJhdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHQgKyB0aGlzLnRpbWVBZGRlZDtcbiAgICAgIGUgPCBSLm5vdygpIHx8IHRoaXMuZmFkZUVuZFRpbWUgJiYgZSA8IHRoaXMuZmFkZUVuZFRpbWUgfHwgKHRoaXMuZmFkZUVuZFRpbWUgPSBlKTtcbiAgICB9LCBvcC5wcm90b3R5cGUud2FzUmVxdWVzdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiZXJyb3JlZFwiID09PSB0aGlzLnN0YXRlIHx8IFwibG9hZGVkXCIgPT09IHRoaXMuc3RhdGUgfHwgXCJyZWxvYWRpbmdcIiA9PT0gdGhpcy5zdGF0ZTtcbiAgICB9LCBvcC5wcm90b3R5cGUubG9hZFZlY3RvckRhdGEgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGF0YSgpICYmIHRoaXMudW5sb2FkVmVjdG9yRGF0YSgpLCB0aGlzLnN0YXRlID0gXCJsb2FkZWRcIiwgdCkge1xuICAgICAgICBmb3IgKHZhciBuIGluIHQuZmVhdHVyZUluZGV4ICYmICh0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IHQuZmVhdHVyZUluZGV4LCB0LnJhd1RpbGVEYXRhID8gKHRoaXMubGF0ZXN0UmF3VGlsZURhdGEgPSB0LnJhd1RpbGVEYXRhLCB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IHQucmF3VGlsZURhdGEpIDogdGhpcy5sYXRlc3RSYXdUaWxlRGF0YSAmJiAodGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSB0aGlzLmxhdGVzdFJhd1RpbGVEYXRhKSksIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSB0LmNvbGxpc2lvbkJveEFycmF5LCB0aGlzLmJ1Y2tldHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgaWYgKCFlKSByZXR1cm4gcjtcblxuICAgICAgICAgIGZvciAodmFyIG4gPSBmdW5jdGlvbiBuKCkge1xuICAgICAgICAgICAgdmFyIHQgPSBhW2ldLFxuICAgICAgICAgICAgICAgIG4gPSB0LmxheWVySWRzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5nZXRMYXllcih0KTtcbiAgICAgICAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICAgICAgaWYgKDAgIT09IG4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHQubGF5ZXJzID0gbiwgdC5zdGF0ZURlcGVuZGVudExheWVySWRzICYmICh0LnN0YXRlRGVwZW5kZW50TGF5ZXJzID0gdC5zdGF0ZURlcGVuZGVudExheWVySWRzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaWQgPT09IHQ7XG4gICAgICAgICAgICAgICAgfSlbMF07XG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBvID0gMCwgcyA9IG47IG8gPCBzLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgICAgICAgcltzW29dLmlkXSA9IHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBpID0gMCwgYSA9IHQ7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBuKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH0odC5idWNrZXRzLCBlLnN0eWxlKSwgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gITEsIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5idWNrZXRzW25dO1xuXG4gICAgICAgICAgaWYgKGkgaW5zdGFuY2VvZiBnbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9ICEwLCAhcikgYnJlYWs7XG4gICAgICAgICAgICBpLmp1c3RSZWxvYWRlZCA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1JUTFRleHQgPSAhMSwgdGhpcy5oYXNTeW1ib2xCdWNrZXRzKSBmb3IgKHZhciBhIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgIHZhciBvID0gdGhpcy5idWNrZXRzW2FdO1xuXG4gICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBnbCAmJiBvLmhhc1JUTFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9ICEwLCBzaS5pc0xvYWRpbmcoKSB8fCBzaS5pc0xvYWRlZCgpIHx8IFwiZGVmZXJyZWRcIiAhPT0gYWkoKSB8fCBvaSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcyBpbiB0aGlzLnF1ZXJ5UGFkZGluZyA9IDAsIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgIHZhciB1ID0gdGhpcy5idWNrZXRzW3NdO1xuICAgICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gTWF0aC5tYXgodGhpcy5xdWVyeVBhZGRpbmcsIGUuc3R5bGUuZ2V0TGF5ZXIocykucXVlcnlSYWRpdXModSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdC5pbWFnZUF0bGFzICYmICh0aGlzLmltYWdlQXRsYXMgPSB0LmltYWdlQXRsYXMpLCB0LmdseXBoQXRsYXNJbWFnZSAmJiAodGhpcy5nbHlwaEF0bGFzSW1hZ2UgPSB0LmdseXBoQXRsYXNJbWFnZSk7XG4gICAgICB9IGVsc2UgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBXaSgpO1xuICAgIH0sIG9wLnByb3RvdHlwZS51bmxvYWRWZWN0b3JEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgdGhpcy5idWNrZXRzW3RdLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWNrZXRzID0ge30sIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUgJiYgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZS5kZXN0cm95KCksIHRoaXMuaW1hZ2VBdGxhcyAmJiAodGhpcy5pbWFnZUF0bGFzID0gbnVsbCksIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUgJiYgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZS5kZXN0cm95KCksIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4ID0gbnVsbCwgdGhpcy5zdGF0ZSA9IFwidW5sb2FkZWRcIjtcbiAgICB9LCBvcC5wcm90b3R5cGUuZ2V0QnVja2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1Y2tldHNbdC5pZF07XG4gICAgfSwgb3AucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICB2YXIgciA9IHRoaXMuYnVja2V0c1tlXTtcbiAgICAgICAgci51cGxvYWRQZW5kaW5nKCkgJiYgci51cGxvYWQodCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuID0gdC5nbDtcbiAgICAgIHRoaXMuaW1hZ2VBdGxhcyAmJiAhdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkICYmICh0aGlzLmltYWdlQXRsYXNUZXh0dXJlID0gbmV3IFZsKHQsIHRoaXMuaW1hZ2VBdGxhcy5pbWFnZSwgbi5SR0JBKSwgdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkID0gITApLCB0aGlzLmdseXBoQXRsYXNJbWFnZSAmJiAodGhpcy5nbHlwaEF0bGFzVGV4dHVyZSA9IG5ldyBWbCh0LCB0aGlzLmdseXBoQXRsYXNJbWFnZSwgbi5BTFBIQSksIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gbnVsbCk7XG4gICAgfSwgb3AucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5pbWFnZUF0bGFzICYmIHRoaXMuaW1hZ2VBdGxhcy5wYXRjaFVwZGF0ZWRJbWFnZXModCwgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZSk7XG4gICAgfSwgb3AucHJvdG90eXBlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggJiYgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPyB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5xdWVyeSh7XG4gICAgICAgIHF1ZXJ5R2VvbWV0cnk6IG4sXG4gICAgICAgIGNhbWVyYVF1ZXJ5R2VvbWV0cnk6IGksXG4gICAgICAgIHNjYWxlOiBhLFxuICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IGwsXG4gICAgICAgIHRyYW5zZm9ybTogcyxcbiAgICAgICAgcGFyYW1zOiBvLFxuICAgICAgICBxdWVyeVBhZGRpbmc6IHRoaXMucXVlcnlQYWRkaW5nICogdVxuICAgICAgfSwgdCwgZSwgcikgOiB7fTtcbiAgICB9LCBvcC5wcm90b3R5cGUucXVlcnlTb3VyY2VGZWF0dXJlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4O1xuXG4gICAgICBpZiAociAmJiByLnJhd1RpbGVEYXRhKSB7XG4gICAgICAgIHZhciBuID0gci5sb2FkVlRMYXllcnMoKSxcbiAgICAgICAgICAgIGkgPSBlID8gZS5zb3VyY2VMYXllciA6IFwiXCIsXG4gICAgICAgICAgICBhID0gbi5fZ2VvanNvblRpbGVMYXllciB8fCBuW2ldO1xuICAgICAgICBpZiAoYSkgZm9yICh2YXIgbyA9IHNuKGUgJiYgZS5maWx0ZXIpLCBzID0gdGhpcy50aWxlSUQuY2Fub25pY2FsLCB1ID0gcy56LCBsID0gcy54LCBwID0gcy55LCBjID0ge1xuICAgICAgICAgIHo6IHUsXG4gICAgICAgICAgeDogbCxcbiAgICAgICAgICB5OiBwXG4gICAgICAgIH0sIGggPSAwOyBoIDwgYS5sZW5ndGg7IGgrKykge1xuICAgICAgICAgIHZhciBmID0gYS5mZWF0dXJlKGgpO1xuXG4gICAgICAgICAgaWYgKG8ubmVlZEdlb21ldHJ5KSB7XG4gICAgICAgICAgICB2YXIgeSA9IGphKGYsICEwKTtcbiAgICAgICAgICAgIGlmICghby5maWx0ZXIobmV3IHVpKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgeSwgdGhpcy50aWxlSUQuY2Fub25pY2FsKSkgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghby5maWx0ZXIobmV3IHVpKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZikpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgdmFyIGQgPSByLmdldElkKGYsIGkpLFxuICAgICAgICAgICAgICBtID0gbmV3IFFsKGYsIHUsIGwsIHAsIGQpO1xuICAgICAgICAgIG0udGlsZSA9IGMsIHQucHVzaChtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIG9wLnByb3RvdHlwZS5oYXNEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwibG9hZGVkXCIgPT09IHRoaXMuc3RhdGUgfHwgXCJyZWxvYWRpbmdcIiA9PT0gdGhpcy5zdGF0ZSB8fCBcImV4cGlyZWRcIiA9PT0gdGhpcy5zdGF0ZTtcbiAgICB9LCBvcC5wcm90b3R5cGUucGF0dGVybnNMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbWFnZUF0bGFzICYmICEhT2JqZWN0LmtleXModGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMpLmxlbmd0aDtcbiAgICB9LCBvcC5wcm90b3R5cGUuc2V0RXhwaXJ5RGF0YSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuZXhwaXJhdGlvblRpbWU7XG5cbiAgICAgIGlmICh0LmNhY2hlQ29udHJvbCkge1xuICAgICAgICB2YXIgciA9IHoodC5jYWNoZUNvbnRyb2wpO1xuICAgICAgICByW1wibWF4LWFnZVwiXSAmJiAodGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyAxZTMgKiByW1wibWF4LWFnZVwiXSk7XG4gICAgICB9IGVsc2UgdC5leHBpcmVzICYmICh0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUodC5leHBpcmVzKS5nZXRUaW1lKCkpO1xuXG4gICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICB2YXIgbiA9IERhdGUubm93KCksXG4gICAgICAgICAgICBpID0gITE7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lID4gbikgaSA9ICExO2Vsc2UgaWYgKGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA8IGUpIGkgPSAhMDtlbHNlIHtcbiAgICAgICAgICAgIHZhciBhID0gdGhpcy5leHBpcmF0aW9uVGltZSAtIGU7XG4gICAgICAgICAgICBhID8gdGhpcy5leHBpcmF0aW9uVGltZSA9IG4gKyBNYXRoLm1heChhLCAzZTQpIDogaSA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGkgPSAhMDtcbiAgICAgICAgaSA/ICh0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQrKywgdGhpcy5zdGF0ZSA9IFwiZXhwaXJlZFwiKSA6IHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfSwgb3AucHJvdG90eXBlLmdldEV4cGlyeVRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkgcmV0dXJuIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA/IDFlMyAqICgxIDw8IE1hdGgubWluKHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCAtIDEsIDMxKSkgOiBNYXRoLm1pbih0aGlzLmV4cGlyYXRpb25UaW1lIC0gbmV3IERhdGUoKS5nZXRUaW1lKCksIE1hdGgucG93KDIsIDMxKSAtIDEpO1xuICAgIH0sIG9wLnByb3RvdHlwZS5zZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4ICYmIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhICYmIDAgIT09IE9iamVjdC5rZXlzKHQpLmxlbmd0aCkge1xuICAgICAgICB2YXIgciA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGZvciAodmFyIG4gaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgaWYgKGUuc3R5bGUuaGFzTGF5ZXIobikpIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5idWNrZXRzW25dLFxuICAgICAgICAgICAgICAgIGEgPSBpLmxheWVyc1swXS5zb3VyY2VMYXllciB8fCBcIl9nZW9qc29uVGlsZUxheWVyXCIsXG4gICAgICAgICAgICAgICAgbyA9IHJbYV0sXG4gICAgICAgICAgICAgICAgcyA9IHRbYV07XG5cbiAgICAgICAgICAgIGlmIChvICYmIHMgJiYgMCAhPT0gT2JqZWN0LmtleXMocykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGkudXBkYXRlKHMsIG8sIHRoaXMuaW1hZ2VBdGxhcyAmJiB0aGlzLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9ucyB8fCB7fSk7XG4gICAgICAgICAgICAgIHZhciB1ID0gZSAmJiBlLnN0eWxlICYmIGUuc3R5bGUuZ2V0TGF5ZXIobik7XG4gICAgICAgICAgICAgIHUgJiYgKHRoaXMucXVlcnlQYWRkaW5nID0gTWF0aC5tYXgodGhpcy5xdWVyeVBhZGRpbmcsIHUucXVlcnlSYWRpdXMoaSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBvcC5wcm90b3R5cGUuaG9sZGluZ0ZvckZhZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWw7XG4gICAgfSwgb3AucHJvdG90eXBlLnN5bWJvbEZhZGVGaW5pc2hlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsIHx8IHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA8IFIubm93KCk7XG4gICAgfSwgb3AucHJvdG90eXBlLmNsZWFyRmFkZUhvbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPSB2b2lkIDA7XG4gICAgfSwgb3AucHJvdG90eXBlLnNldEhvbGREdXJhdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPSBSLm5vdygpICsgdDtcbiAgICB9LCBvcC5wcm90b3R5cGUuc2V0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIHIgPSB7fSwgbiA9IDAsIGkgPSBlOyBuIDwgaS5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICByW2lbbl1dID0gITA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzW3RdID0gcjtcbiAgICB9LCBvcC5wcm90b3R5cGUuaGFzRGVwZW5kZW5jeSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0gMCwgbiA9IHQ7IHIgPCBuLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5kZXBlbmRlbmNpZXNbbltyXV07XG4gICAgICAgIGlmIChpKSBmb3IgKHZhciBhID0gMCwgbyA9IGU7IGEgPCBvLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICAgICAgaWYgKGlbb1thXV0pIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfTtcblxuICAgIHZhciBzcCA9IG8ucGVyZm9ybWFuY2UsXG4gICAgICAgIHVwID0gZnVuY3Rpb24gdXAodCkge1xuICAgICAgdGhpcy5fbWFya3MgPSB7XG4gICAgICAgIHN0YXJ0OiBbdC51cmwsIFwic3RhcnRcIl0uam9pbihcIiNcIiksXG4gICAgICAgIGVuZDogW3QudXJsLCBcImVuZFwiXS5qb2luKFwiI1wiKSxcbiAgICAgICAgbWVhc3VyZTogdC51cmwudG9TdHJpbmcoKVxuICAgICAgfSwgc3AubWFyayh0aGlzLl9tYXJrcy5zdGFydCk7XG4gICAgfTtcblxuICAgIHVwLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzcC5tYXJrKHRoaXMuX21hcmtzLmVuZCk7XG4gICAgICB2YXIgdCA9IHNwLmdldEVudHJpZXNCeU5hbWUodGhpcy5fbWFya3MubWVhc3VyZSk7XG4gICAgICByZXR1cm4gMCA9PT0gdC5sZW5ndGggJiYgKHNwLm1lYXN1cmUodGhpcy5fbWFya3MubWVhc3VyZSwgdGhpcy5fbWFya3Muc3RhcnQsIHRoaXMuX21hcmtzLmVuZCksIHQgPSBzcC5nZXRFbnRyaWVzQnlOYW1lKHRoaXMuX21hcmtzLm1lYXN1cmUpLCBzcC5jbGVhck1hcmtzKHRoaXMuX21hcmtzLnN0YXJ0KSwgc3AuY2xlYXJNYXJrcyh0aGlzLl9tYXJrcy5lbmQpLCBzcC5jbGVhck1lYXN1cmVzKHRoaXMuX21hcmtzLm1lYXN1cmUpKSwgdDtcbiAgICB9LCB0LkFjdG9yID0gRGwsIHQuQWxwaGFJbWFnZSA9IHhvLCB0LkNhbm9uaWNhbFRpbGVJRCA9IFhsLCB0LkNvbGxpc2lvbkJveEFycmF5ID0gV2ksIHQuQ29sb3IgPSBlZSwgdC5ERU1EYXRhID0gJGwsIHQuRGF0YUNvbnN0YW50UHJvcGVydHkgPSB2aSwgdC5EaWN0aW9uYXJ5Q29kZXIgPSBXbCwgdC5FWFRFTlQgPSA4MTkyLCB0LkVycm9yRXZlbnQgPSBDdCwgdC5FdmFsdWF0aW9uUGFyYW1ldGVycyA9IHVpLCB0LkV2ZW50ID0genQsIHQuRXZlbnRlZCA9IEV0LCB0LkZlYXR1cmVJbmRleCA9IHJwLCB0LkZpbGxCdWNrZXQgPSB1cywgdC5GaWxsRXh0cnVzaW9uQnVja2V0ID0ga3MsIHQuSW1hZ2VBdGxhcyA9IHd1LCB0LkltYWdlUG9zaXRpb24gPSB4dSwgdC5MaW5lQnVja2V0ID0gRHMsIHQuTG5nTGF0ID0gT2wsIHQuTG5nTGF0Qm91bmRzID0gUmwsIHQuTWVyY2F0b3JDb29yZGluYXRlID0gWmwsIHQuT05FX0VNID0gMjQsIHQuT3ZlcnNjYWxlZFRpbGVJRCA9IEhsLCB0LlBvaW50ID0gaSwgdC5Qb2ludCQxID0gaSwgdC5Qcm9wZXJ0aWVzID0gX2ksIHQuUHJvdG9idWYgPSAkcywgdC5SR0JBSW1hZ2UgPSBibywgdC5SZXF1ZXN0TWFuYWdlciA9IEcsIHQuUmVxdWVzdFBlcmZvcm1hbmNlID0gdXAsIHQuUmVzb3VyY2VUeXBlID0geXQsIHQuU2VnbWVudFZlY3RvciA9IHVhLCB0LlNvdXJjZUZlYXR1cmVTdGF0ZSA9IGVwLCB0LlN0cnVjdEFycmF5TGF5b3V0MXVpMiA9IEhpLCB0LlN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYgPSBVaSwgdC5TdHJ1Y3RBcnJheUxheW91dDJpNCA9IEVpLCB0LlN0cnVjdEFycmF5TGF5b3V0M3VpNiA9IHFpLCB0LlN0cnVjdEFycmF5TGF5b3V0NGk4ID0gUGksIHQuU3ltYm9sQnVja2V0ID0gZ2wsIHQuVGV4dHVyZSA9IFZsLCB0LlRpbGUgPSBvcCwgdC5UcmFuc2l0aW9uYWJsZSA9IGNpLCB0LlVuaWZvcm0xZiA9IHdhLCB0LlVuaWZvcm0xaSA9IGJhLCB0LlVuaWZvcm0yZiA9IF9hLCB0LlVuaWZvcm0zZiA9IEFhLCB0LlVuaWZvcm00ZiA9IFNhLCB0LlVuaWZvcm1Db2xvciA9IGthLCB0LlVuaWZvcm1NYXRyaXg0ZiA9IHphLCB0LlVud3JhcHBlZFRpbGVJRCA9IEpsLCB0LlZhbGlkYXRpb25FcnJvciA9IE10LCB0LldyaXRpbmdNb2RlID0gX3UsIHQuWm9vbUhpc3RvcnkgPSBHbiwgdC5hZGQgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHRbMF0gPSBlWzBdICsgclswXSwgdFsxXSA9IGVbMV0gKyByWzFdLCB0WzJdID0gZVsyXSArIHJbMl0sIHQ7XG4gICAgfSwgdC5hZGREeW5hbWljQXR0cmlidXRlcyA9IHlsLCB0LmFzeW5jQWxsID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmICghdC5sZW5ndGgpIHJldHVybiByKG51bGwsIFtdKTtcbiAgICAgIHZhciBuID0gdC5sZW5ndGgsXG4gICAgICAgICAgaSA9IG5ldyBBcnJheSh0Lmxlbmd0aCksXG4gICAgICAgICAgYSA9IG51bGw7XG4gICAgICB0LmZvckVhY2goZnVuY3Rpb24gKHQsIG8pIHtcbiAgICAgICAgZSh0LCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHQgJiYgKGEgPSB0KSwgaVtvXSA9IGUsIDAgPT0gLS1uICYmIHIoYSwgaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgdC5iZXppZXIgPSB1LCB0LmJpbmRBbGwgPSB2LCB0LmJyb3dzZXIgPSBSLCB0LmNhY2hlRW50cnlQb3NzaWJseUFkZGVkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICsraHQgPiB1dCAmJiAodC5nZXRBY3RvcigpLnNlbmQoXCJlbmZvcmNlQ2FjaGVTaXplTGltaXRcIiwgc3QpLCBodCA9IDApO1xuICAgIH0sIHQuY2xhbXAgPSBwLCB0LmNsZWFyVGlsZUNhY2hlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gby5jYWNoZXMuZGVsZXRlKFwibWFwYm94LXRpbGVzXCIpO1xuICAgICAgdCAmJiBlLmNhdGNoKHQpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdCgpO1xuICAgICAgfSk7XG4gICAgfSwgdC5jbGlwTGluZSA9IFh1LCB0LmNsb25lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gbmV3IG9vKDE2KTtcbiAgICAgIHJldHVybiBlWzBdID0gdFswXSwgZVsxXSA9IHRbMV0sIGVbMl0gPSB0WzJdLCBlWzNdID0gdFszXSwgZVs0XSA9IHRbNF0sIGVbNV0gPSB0WzVdLCBlWzZdID0gdFs2XSwgZVs3XSA9IHRbN10sIGVbOF0gPSB0WzhdLCBlWzldID0gdFs5XSwgZVsxMF0gPSB0WzEwXSwgZVsxMV0gPSB0WzExXSwgZVsxMl0gPSB0WzEyXSwgZVsxM10gPSB0WzEzXSwgZVsxNF0gPSB0WzE0XSwgZVsxNV0gPSB0WzE1XSwgZTtcbiAgICB9LCB0LmNsb25lJDEgPSB3LCB0LmNsb25lJDIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBuZXcgb28oMyk7XG4gICAgICByZXR1cm4gZVswXSA9IHRbMF0sIGVbMV0gPSB0WzFdLCBlWzJdID0gdFsyXSwgZTtcbiAgICB9LCB0LmNvbGxpc2lvbkNpcmNsZUxheW91dCA9IFpzLCB0LmNvbmZpZyA9IE8sIHQuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSBuZXcgb28oMTYpO1xuICAgICAgcmV0dXJuIG9vICE9IEZsb2F0MzJBcnJheSAmJiAodFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzExXSA9IDAsIHRbMTJdID0gMCwgdFsxM10gPSAwLCB0WzE0XSA9IDApLCB0WzBdID0gMSwgdFs1XSA9IDEsIHRbMTBdID0gMSwgdFsxNV0gPSAxLCB0O1xuICAgIH0sIHQuY3JlYXRlJDEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IG5ldyBvbyg5KTtcbiAgICAgIHJldHVybiBvbyAhPSBGbG9hdDMyQXJyYXkgJiYgKHRbMV0gPSAwLCB0WzJdID0gMCwgdFszXSA9IDAsIHRbNV0gPSAwLCB0WzZdID0gMCwgdFs3XSA9IDApLCB0WzBdID0gMSwgdFs0XSA9IDEsIHRbOF0gPSAxLCB0O1xuICAgIH0sIHQuY3JlYXRlJDIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IG5ldyBvbyg0KTtcbiAgICAgIHJldHVybiBvbyAhPSBGbG9hdDMyQXJyYXkgJiYgKHRbMV0gPSAwLCB0WzJdID0gMCksIHRbMF0gPSAxLCB0WzNdID0gMSwgdDtcbiAgICB9LCB0LmNyZWF0ZUNvbW1vbmpzTW9kdWxlID0gZSwgdC5jcmVhdGVFeHByZXNzaW9uID0gWHIsIHQuY3JlYXRlTGF5b3V0ID0gemksIHQuY3JlYXRlU3R5bGVMYXllciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gXCJjdXN0b21cIiA9PT0gdC50eXBlID8gbmV3IHpsKHQpIDogbmV3IENsW3QudHlwZV0odCk7XG4gICAgfSwgdC5jcm9zcyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGVbMF0sXG4gICAgICAgICAgaSA9IGVbMV0sXG4gICAgICAgICAgYSA9IGVbMl0sXG4gICAgICAgICAgbyA9IHJbMF0sXG4gICAgICAgICAgcyA9IHJbMV0sXG4gICAgICAgICAgdSA9IHJbMl07XG4gICAgICByZXR1cm4gdFswXSA9IGkgKiB1IC0gYSAqIHMsIHRbMV0gPSBhICogbyAtIG4gKiB1LCB0WzJdID0gbiAqIHMgLSBpICogbywgdDtcbiAgICB9LCB0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIHQoZSwgcikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHIpIHx8IGUubGVuZ3RoICE9PSByLmxlbmd0aCkgcmV0dXJuICExO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgIGlmICghdChlW25dLCByW25dKSkgcmV0dXJuICExO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiBudWxsICE9PSBlICYmIG51bGwgIT09IHIpIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHIpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGUpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocikubGVuZ3RoKSByZXR1cm4gITE7XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7XG4gICAgICAgICAgaWYgKCF0KGVbaV0sIHJbaV0pKSByZXR1cm4gITE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlID09PSByO1xuICAgIH0sIHQuZG90ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiB0WzBdICogZVswXSArIHRbMV0gKiBlWzFdICsgdFsyXSAqIGVbMl07XG4gICAgfSwgdC5kb3QkMSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gdFswXSAqIGVbMF0gKyB0WzFdICogZVsxXSArIHRbMl0gKiBlWzJdICsgdFszXSAqIGVbM107XG4gICAgfSwgdC5lYXNlID0gbCwgdC5lbWl0VmFsaWRhdGlvbkVycm9ycyA9IFRuLCB0LmVuZHNXaXRoID0gZywgdC5lbmZvcmNlQ2FjaGVTaXplTGltaXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgbHQoKSwgdHQgJiYgdHQudGhlbihmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLmtleXMoKS50aGVuKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCByLmxlbmd0aCAtIHQ7IG4rKykge1xuICAgICAgICAgICAgZS5kZWxldGUocltuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSA9IFJ1LCB0LmV2YWx1YXRlU2l6ZUZvclpvb20gPSBPdSwgdC5ldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0ID0gb2wsIHQuZXZlbnRlZCA9IGlpLCB0LmV4dGVuZCA9IGgsIHQuZmVhdHVyZUZpbHRlciA9IHNuLCB0LmZpbHRlck9iamVjdCA9IGIsIHQuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gTWF0aC5zaW4oZSksXG4gICAgICAgICAgbiA9IE1hdGguY29zKGUpO1xuICAgICAgcmV0dXJuIHRbMF0gPSBuLCB0WzFdID0gciwgdFsyXSA9IDAsIHRbM10gPSAtciwgdFs0XSA9IG4sIHRbNV0gPSAwLCB0WzZdID0gMCwgdFs3XSA9IDAsIHRbOF0gPSAxLCB0O1xuICAgIH0sIHQuZ2V0QW5jaG9yQWxpZ25tZW50ID0gVHUsIHQuZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiA9IHNsLCB0LmdldEFycmF5QnVmZmVyID0gd3QsIHQuZ2V0SW1hZ2UgPSBTdCwgdC5nZXRKU09OID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiBidChoKHQsIHtcbiAgICAgICAgdHlwZTogXCJqc29uXCJcbiAgICAgIH0pLCBlKTtcbiAgICB9LCB0LmdldFJUTFRleHRQbHVnaW5TdGF0dXMgPSBhaSwgdC5nZXRSZWZlcnJlciA9IG10LCB0LmdldFZpZGVvID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByLFxuICAgICAgICAgIG4sXG4gICAgICAgICAgaSA9IG8uZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgICAgaS5tdXRlZCA9ICEwLCBpLm9ubG9hZHN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlKG51bGwsIGkpO1xuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCB0Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBzID0gby5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic291cmNlXCIpO1xuICAgICAgICByID0gdFthXSwgbiA9IHZvaWQgMCwgKG4gPSBvLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpKS5ocmVmID0gciwgKG4ucHJvdG9jb2wgIT09IG8uZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgfHwgbi5ob3N0ICE9PSBvLmRvY3VtZW50LmxvY2F0aW9uLmhvc3QpICYmIChpLmNyb3NzT3JpZ2luID0gXCJBbm9ueW1vdXNcIiksIHMuc3JjID0gdFthXSwgaS5hcHBlbmRDaGlsZChzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7fVxuICAgICAgfTtcbiAgICB9LCB0LmlkZW50aXR5ID0gc28sIHQuaW52ZXJ0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICBpID0gZVsyXSxcbiAgICAgICAgICBhID0gZVszXSxcbiAgICAgICAgICBvID0gZVs0XSxcbiAgICAgICAgICBzID0gZVs1XSxcbiAgICAgICAgICB1ID0gZVs2XSxcbiAgICAgICAgICBsID0gZVs3XSxcbiAgICAgICAgICBwID0gZVs4XSxcbiAgICAgICAgICBjID0gZVs5XSxcbiAgICAgICAgICBoID0gZVsxMF0sXG4gICAgICAgICAgZiA9IGVbMTFdLFxuICAgICAgICAgIHkgPSBlWzEyXSxcbiAgICAgICAgICBkID0gZVsxM10sXG4gICAgICAgICAgbSA9IGVbMTRdLFxuICAgICAgICAgIHYgPSBlWzE1XSxcbiAgICAgICAgICBnID0gciAqIHMgLSBuICogbyxcbiAgICAgICAgICB4ID0gciAqIHUgLSBpICogbyxcbiAgICAgICAgICBiID0gciAqIGwgLSBhICogbyxcbiAgICAgICAgICB3ID0gbiAqIHUgLSBpICogcyxcbiAgICAgICAgICBfID0gbiAqIGwgLSBhICogcyxcbiAgICAgICAgICBBID0gaSAqIGwgLSBhICogdSxcbiAgICAgICAgICBTID0gcCAqIGQgLSBjICogeSxcbiAgICAgICAgICBrID0gcCAqIG0gLSBoICogeSxcbiAgICAgICAgICBJID0gcCAqIHYgLSBmICogeSxcbiAgICAgICAgICB6ID0gYyAqIG0gLSBoICogZCxcbiAgICAgICAgICBDID0gYyAqIHYgLSBmICogZCxcbiAgICAgICAgICBFID0gaCAqIHYgLSBmICogbSxcbiAgICAgICAgICBQID0gZyAqIEUgLSB4ICogQyArIGIgKiB6ICsgdyAqIEkgLSBfICogayArIEEgKiBTO1xuXG4gICAgICByZXR1cm4gUCA/ICh0WzBdID0gKHMgKiBFIC0gdSAqIEMgKyBsICogeikgKiAoUCA9IDEgLyBQKSwgdFsxXSA9IChpICogQyAtIG4gKiBFIC0gYSAqIHopICogUCwgdFsyXSA9IChkICogQSAtIG0gKiBfICsgdiAqIHcpICogUCwgdFszXSA9IChoICogXyAtIGMgKiBBIC0gZiAqIHcpICogUCwgdFs0XSA9ICh1ICogSSAtIG8gKiBFIC0gbCAqIGspICogUCwgdFs1XSA9IChyICogRSAtIGkgKiBJICsgYSAqIGspICogUCwgdFs2XSA9IChtICogYiAtIHkgKiBBIC0gdiAqIHgpICogUCwgdFs3XSA9IChwICogQSAtIGggKiBiICsgZiAqIHgpICogUCwgdFs4XSA9IChvICogQyAtIHMgKiBJICsgbCAqIFMpICogUCwgdFs5XSA9IChuICogSSAtIHIgKiBDIC0gYSAqIFMpICogUCwgdFsxMF0gPSAoeSAqIF8gLSBkICogYiArIHYgKiBnKSAqIFAsIHRbMTFdID0gKGMgKiBiIC0gcCAqIF8gLSBmICogZykgKiBQLCB0WzEyXSA9IChzICogayAtIG8gKiB6IC0gdSAqIFMpICogUCwgdFsxM10gPSAociAqIHogLSBuICogayArIGkgKiBTKSAqIFAsIHRbMTRdID0gKGQgKiB4IC0geSAqIHcgLSBtICogZykgKiBQLCB0WzE1XSA9IChwICogdyAtIGMgKiB4ICsgaCAqIGcpICogUCwgdCkgOiBudWxsO1xuICAgIH0sIHQuaXNDaGFyID0gWm4sIHQuaXNNYXBib3hVUkwgPSBaLCB0LmtleXNEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gW107XG5cbiAgICAgIGZvciAodmFyIG4gaW4gdCkge1xuICAgICAgICBuIGluIGUgfHwgci5wdXNoKG4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LCB0Lm1ha2VSZXF1ZXN0ID0gYnQsIHQubWFwT2JqZWN0ID0geCwgdC5tZXJjYXRvclhmcm9tTG5nID0gcWwsIHQubWVyY2F0b3JZZnJvbUxhdCA9IE5sLCB0Lm1lcmNhdG9yWmZyb21BbHRpdHVkZSA9IEtsLCB0Lm11bCA9IHBvLCB0Lm11bHRpcGx5ID0gdW8sIHQubXZ0ID0gd3MsIHQubmV4dFBvd2VyT2ZUd28gPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQgPD0gMSA/IDEgOiBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2codCkgLyBNYXRoLkxOMikpO1xuICAgIH0sIHQubm9ybWFsaXplID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gZVswXSxcbiAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICBpID0gZVsyXSxcbiAgICAgICAgICBhID0gciAqIHIgKyBuICogbiArIGkgKiBpO1xuICAgICAgcmV0dXJuIGEgPiAwICYmIChhID0gMSAvIE1hdGguc3FydChhKSksIHRbMF0gPSBlWzBdICogYSwgdFsxXSA9IGVbMV0gKiBhLCB0WzJdID0gZVsyXSAqIGEsIHQ7XG4gICAgfSwgdC5udW1iZXIgPSBHZSwgdC5vZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBmdCwgdC5vcnRobyA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvKSB7XG4gICAgICB2YXIgcyA9IDEgLyAoZSAtIHIpLFxuICAgICAgICAgIHUgPSAxIC8gKG4gLSBpKSxcbiAgICAgICAgICBsID0gMSAvIChhIC0gbyk7XG4gICAgICByZXR1cm4gdFswXSA9IC0yICogcywgdFsxXSA9IDAsIHRbMl0gPSAwLCB0WzNdID0gMCwgdFs0XSA9IDAsIHRbNV0gPSAtMiAqIHUsIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzEwXSA9IDIgKiBsLCB0WzExXSA9IDAsIHRbMTJdID0gKGUgKyByKSAqIHMsIHRbMTNdID0gKGkgKyBuKSAqIHUsIHRbMTRdID0gKG8gKyBhKSAqIGwsIHRbMTVdID0gMSwgdDtcbiAgICB9LCB0LnBhcnNlR2x5cGhQQkYgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG5ldyAkcyh0KS5yZWFkRmllbGRzKGR1LCBbXSk7XG4gICAgfSwgdC5wYmYgPSAkcywgdC5wZXJmb3JtU3ltYm9sTGF5b3V0ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8pIHtcbiAgICAgIHQuY3JlYXRlQXJyYXlzKCksIHQudGlsZVBpeGVsUmF0aW8gPSA4MTkyIC8gKDUxMiAqIHQub3ZlcnNjYWxpbmcpLCB0LmNvbXBhcmVUZXh0ID0ge30sIHQuaWNvbnNOZWVkTGluZWFyID0gITE7XG4gICAgICB2YXIgcyA9IHQubGF5ZXJzWzBdLmxheW91dCxcbiAgICAgICAgICB1ID0gdC5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXMsXG4gICAgICAgICAgbCA9IHt9O1xuXG4gICAgICBpZiAoXCJjb21wb3NpdGVcIiA9PT0gdC50ZXh0U2l6ZURhdGEua2luZCkge1xuICAgICAgICB2YXIgcCA9IHQudGV4dFNpemVEYXRhLFxuICAgICAgICAgICAgYyA9IHAubWF4Wm9vbTtcbiAgICAgICAgbC5jb21wb3NpdGVUZXh0U2l6ZXMgPSBbdVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyB1aShwLm1pblpvb20pLCBvKSwgdVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyB1aShjKSwgbyldO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJjb21wb3NpdGVcIiA9PT0gdC5pY29uU2l6ZURhdGEua2luZCkge1xuICAgICAgICB2YXIgaCA9IHQuaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgZiA9IGgubWF4Wm9vbTtcbiAgICAgICAgbC5jb21wb3NpdGVJY29uU2l6ZXMgPSBbdVtcImljb24tc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyB1aShoLm1pblpvb20pLCBvKSwgdVtcImljb24tc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyB1aShmKSwgbyldO1xuICAgICAgfVxuXG4gICAgICBsLmxheW91dFRleHRTaXplID0gdVtcInRleHQtc2l6ZVwiXS5wb3NzaWJseUV2YWx1YXRlKG5ldyB1aSh0Lnpvb20gKyAxKSwgbyksIGwubGF5b3V0SWNvblNpemUgPSB1W1wiaWNvbi1zaXplXCJdLnBvc3NpYmx5RXZhbHVhdGUobmV3IHVpKHQuem9vbSArIDEpLCBvKSwgbC50ZXh0TWF4U2l6ZSA9IHVbXCJ0ZXh0LXNpemVcIl0ucG9zc2libHlFdmFsdWF0ZShuZXcgdWkoMTgpKTtcblxuICAgICAgZm9yICh2YXIgeSA9IDI0ICogcy5nZXQoXCJ0ZXh0LWxpbmUtaGVpZ2h0XCIpLCBkID0gXCJtYXBcIiA9PT0gcy5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSAmJiBcInBvaW50XCIgIT09IHMuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSwgbSA9IHMuZ2V0KFwidGV4dC1rZWVwLXVwcmlnaHRcIiksIHYgPSBzLmdldChcInRleHQtc2l6ZVwiKSwgZyA9IGZ1bmN0aW9uIGcoKSB7XG4gICAgICAgIHZhciBhID0gYlt4XSxcbiAgICAgICAgICAgIHUgPSBzLmdldChcInRleHQtZm9udFwiKS5ldmFsdWF0ZShhLCB7fSwgbykuam9pbihcIixcIiksXG4gICAgICAgICAgICBwID0gdi5ldmFsdWF0ZShhLCB7fSwgbyksXG4gICAgICAgICAgICBjID0gbC5sYXlvdXRUZXh0U2l6ZS5ldmFsdWF0ZShhLCB7fSwgbyksXG4gICAgICAgICAgICBoID0gbC5sYXlvdXRJY29uU2l6ZS5ldmFsdWF0ZShhLCB7fSwgbyksXG4gICAgICAgICAgICBmID0ge1xuICAgICAgICAgIGhvcml6b250YWw6IHt9LFxuICAgICAgICAgIHZlcnRpY2FsOiB2b2lkIDBcbiAgICAgICAgfSxcbiAgICAgICAgICAgIGcgPSBhLnRleHQsXG4gICAgICAgICAgICB3ID0gWzAsIDBdO1xuXG4gICAgICAgIGlmIChnKSB7XG4gICAgICAgICAgdmFyIF8gPSBnLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIFMgPSAyNCAqIHMuZ2V0KFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiKS5ldmFsdWF0ZShhLCB7fSwgbyksXG4gICAgICAgICAgICAgIGsgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSB0OyBlIDwgci5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgICAgICBpZiAobiA9IHJbZV0uY2hhckNvZGVBdCgwKSwgWm4uQXJhYmljKG4pIHx8IFpuW1wiQXJhYmljIFN1cHBsZW1lbnRcIl0obikgfHwgWm5bXCJBcmFiaWMgRXh0ZW5kZWQtQVwiXShuKSB8fCBabltcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQVwiXShuKSB8fCBabltcIkFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQlwiXShuKSkgcmV0dXJuICExO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9KF8pID8gUyA6IDAsXG4gICAgICAgICAgICAgIEkgPSBzLmdldChcInRleHQtYW5jaG9yXCIpLmV2YWx1YXRlKGEsIHt9LCBvKSxcbiAgICAgICAgICAgICAgeiA9IHMuZ2V0KFwidGV4dC12YXJpYWJsZS1hbmNob3JcIik7XG5cbiAgICAgICAgICBpZiAoIXopIHtcbiAgICAgICAgICAgIHZhciBDID0gcy5nZXQoXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIikuZXZhbHVhdGUoYSwge30sIG8pO1xuICAgICAgICAgICAgdyA9IEMgPyBvbChJLCBbMjQgKiBDLCBhbF0pIDogcy5nZXQoXCJ0ZXh0LW9mZnNldFwiKS5ldmFsdWF0ZShhLCB7fSwgbykubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiAyNCAqIHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgRSA9IGQgPyBcImNlbnRlclwiIDogcy5nZXQoXCJ0ZXh0LWp1c3RpZnlcIikuZXZhbHVhdGUoYSwge30sIG8pLFxuICAgICAgICAgICAgICBQID0gcy5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLFxuICAgICAgICAgICAgICBNID0gXCJwb2ludFwiID09PSBQID8gMjQgKiBzLmdldChcInRleHQtbWF4LXdpZHRoXCIpLmV2YWx1YXRlKGEsIHt9LCBvKSA6IDAsXG4gICAgICAgICAgICAgIEIgPSBmdW5jdGlvbiBCKCkge1xuICAgICAgICAgICAgdC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIFhuKF8pICYmIChmLnZlcnRpY2FsID0ga3UoZywgZSwgciwgaSwgdSwgTSwgeSwgSSwgXCJsZWZ0XCIsIGssIHcsIF91LnZlcnRpY2FsLCAhMCwgUCwgYywgcCkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoIWQgJiYgeikge1xuICAgICAgICAgICAgZm9yICh2YXIgVCA9IFwiYXV0b1wiID09PSBFID8gei5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNsKHQpO1xuICAgICAgICAgICAgfSkgOiBbRV0sIFYgPSAhMSwgRiA9IDA7IEYgPCBULmxlbmd0aDsgRisrKSB7XG4gICAgICAgICAgICAgIHZhciBEID0gVFtGXTtcbiAgICAgICAgICAgICAgaWYgKCFmLmhvcml6b250YWxbRF0pIGlmIChWKSBmLmhvcml6b250YWxbRF0gPSBmLmhvcml6b250YWxbMF07ZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIEwgPSBrdShnLCBlLCByLCBpLCB1LCBNLCB5LCBcImNlbnRlclwiLCBELCBrLCB3LCBfdS5ob3Jpem9udGFsLCAhMSwgUCwgYywgcCk7XG4gICAgICAgICAgICAgICAgTCAmJiAoZi5ob3Jpem9udGFsW0RdID0gTCwgViA9IDEgPT09IEwucG9zaXRpb25lZExpbmVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBcImF1dG9cIiA9PT0gRSAmJiAoRSA9IHNsKEkpKTtcbiAgICAgICAgICAgIHZhciBSID0ga3UoZywgZSwgciwgaSwgdSwgTSwgeSwgSSwgRSwgaywgdywgX3UuaG9yaXpvbnRhbCwgITEsIFAsIGMsIHApO1xuICAgICAgICAgICAgUiAmJiAoZi5ob3Jpem9udGFsW0VdID0gUiksIEIoKSwgWG4oXykgJiYgZCAmJiBtICYmIChmLnZlcnRpY2FsID0ga3UoZywgZSwgciwgaSwgdSwgTSwgeSwgSSwgRSwgaywgdywgX3UudmVydGljYWwsICExLCBQLCBjLCBwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIE8gPSB2b2lkIDAsXG4gICAgICAgICAgICBVID0gITE7XG5cbiAgICAgICAgaWYgKGEuaWNvbiAmJiBhLmljb24ubmFtZSkge1xuICAgICAgICAgIHZhciBqID0gblthLmljb24ubmFtZV07XG4gICAgICAgICAgaiAmJiAoTyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgICB2YXIgbiA9IFR1KHIpLFxuICAgICAgICAgICAgICAgIGkgPSBlWzBdIC0gdC5kaXNwbGF5U2l6ZVswXSAqIG4uaG9yaXpvbnRhbEFsaWduLFxuICAgICAgICAgICAgICAgIGEgPSBlWzFdIC0gdC5kaXNwbGF5U2l6ZVsxXSAqIG4udmVydGljYWxBbGlnbjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGltYWdlOiB0LFxuICAgICAgICAgICAgICB0b3A6IGEsXG4gICAgICAgICAgICAgIGJvdHRvbTogYSArIHQuZGlzcGxheVNpemVbMV0sXG4gICAgICAgICAgICAgIGxlZnQ6IGksXG4gICAgICAgICAgICAgIHJpZ2h0OiBpICsgdC5kaXNwbGF5U2l6ZVswXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KGlbYS5pY29uLm5hbWVdLCBzLmdldChcImljb24tb2Zmc2V0XCIpLmV2YWx1YXRlKGEsIHt9LCBvKSwgcy5nZXQoXCJpY29uLWFuY2hvclwiKS5ldmFsdWF0ZShhLCB7fSwgbykpLCBVID0gai5zZGYsIHZvaWQgMCA9PT0gdC5zZGZJY29ucyA/IHQuc2RmSWNvbnMgPSBqLnNkZiA6IHQuc2RmSWNvbnMgIT09IGouc2RmICYmIEEoXCJTdHlsZSBzaGVldCB3YXJuaW5nOiBDYW5ub3QgbWl4IFNERiBhbmQgbm9uLVNERiBpY29ucyBpbiBvbmUgYnVmZmVyXCIpLCAoai5waXhlbFJhdGlvICE9PSB0LnBpeGVsUmF0aW8gfHwgMCAhPT0gcy5nZXQoXCJpY29uLXJvdGF0ZVwiKS5jb25zdGFudE9yKDEpKSAmJiAodC5pY29uc05lZWRMaW5lYXIgPSAhMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHEgPSBsbChmLmhvcml6b250YWwpIHx8IGYudmVydGljYWw7XG4gICAgICAgIHQuaWNvbnNJblRleHQgPSAhIXEgJiYgcS5pY29uc0luVGV4dCwgKHEgfHwgTykgJiYgZnVuY3Rpb24gKHQsIGUsIHIsIG4sIGksIGEsIG8sIHMsIHUsIGwsIHApIHtcbiAgICAgICAgICB2YXIgYyA9IGEudGV4dE1heFNpemUuZXZhbHVhdGUoZSwge30pO1xuICAgICAgICAgIHZvaWQgMCA9PT0gYyAmJiAoYyA9IG8pO1xuXG4gICAgICAgICAgdmFyIGgsXG4gICAgICAgICAgICAgIGYgPSB0LmxheWVyc1swXS5sYXlvdXQsXG4gICAgICAgICAgICAgIHkgPSBmLmdldChcImljb24tb2Zmc2V0XCIpLmV2YWx1YXRlKGUsIHt9LCBwKSxcbiAgICAgICAgICAgICAgZCA9IGxsKHIuaG9yaXpvbnRhbCksXG4gICAgICAgICAgICAgIG0gPSBvIC8gMjQsXG4gICAgICAgICAgICAgIHYgPSB0LnRpbGVQaXhlbFJhdGlvICogbSxcbiAgICAgICAgICAgICAgZyA9IHQudGlsZVBpeGVsUmF0aW8gKiBjIC8gMjQsXG4gICAgICAgICAgICAgIHggPSB0LnRpbGVQaXhlbFJhdGlvICogcyxcbiAgICAgICAgICAgICAgYiA9IHQudGlsZVBpeGVsUmF0aW8gKiBmLmdldChcInN5bWJvbC1zcGFjaW5nXCIpLFxuICAgICAgICAgICAgICB3ID0gZi5nZXQoXCJ0ZXh0LXBhZGRpbmdcIikgKiB0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICBfID0gZi5nZXQoXCJpY29uLXBhZGRpbmdcIikgKiB0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICBTID0gZi5nZXQoXCJ0ZXh0LW1heC1hbmdsZVwiKSAvIDE4MCAqIE1hdGguUEksXG4gICAgICAgICAgICAgIGsgPSBcIm1hcFwiID09PSBmLmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpICYmIFwicG9pbnRcIiAhPT0gZi5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLFxuICAgICAgICAgICAgICBJID0gXCJtYXBcIiA9PT0gZi5nZXQoXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiKSAmJiBcInBvaW50XCIgIT09IGYuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxcbiAgICAgICAgICAgICAgeiA9IGYuZ2V0KFwic3ltYm9sLXBsYWNlbWVudFwiKSxcbiAgICAgICAgICAgICAgQyA9IGIgLyAyLFxuICAgICAgICAgICAgICBFID0gZi5nZXQoXCJpY29uLXRleHQtZml0XCIpO1xuXG4gICAgICAgICAgbiAmJiBcIm5vbmVcIiAhPT0gRSAmJiAodC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHIudmVydGljYWwgJiYgKGggPSBGdShuLCByLnZlcnRpY2FsLCBFLCBmLmdldChcImljb24tdGV4dC1maXQtcGFkZGluZ1wiKSwgeSwgbSkpLCBkICYmIChuID0gRnUobiwgZCwgRSwgZi5nZXQoXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIiksIHksIG0pKSk7XG5cbiAgICAgICAgICB2YXIgUCA9IGZ1bmN0aW9uIFAocywgYykge1xuICAgICAgICAgICAgYy54IDwgMCB8fCBjLnggPj0gODE5MiB8fCBjLnkgPCAwIHx8IGMueSA+PSA4MTkyIHx8IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBpLCBhLCBvLCBzLCB1LCBsLCBwLCBjLCBoLCBmLCB5LCBkLCBtLCB2LCBnLCB4LCBiLCB3LCBfLCBTLCBrKSB7XG4gICAgICAgICAgICAgIHZhciBJLFxuICAgICAgICAgICAgICAgICAgeixcbiAgICAgICAgICAgICAgICAgIEMsXG4gICAgICAgICAgICAgICAgICBFLFxuICAgICAgICAgICAgICAgICAgUCxcbiAgICAgICAgICAgICAgICAgIE0gPSB0LmFkZFRvTGluZVZlcnRleEFycmF5KGUsIHIpLFxuICAgICAgICAgICAgICAgICAgQiA9IDAsXG4gICAgICAgICAgICAgICAgICBUID0gMCxcbiAgICAgICAgICAgICAgICAgIFYgPSAwLFxuICAgICAgICAgICAgICAgICAgRiA9IDAsXG4gICAgICAgICAgICAgICAgICBEID0gLTEsXG4gICAgICAgICAgICAgICAgICBMID0gLTEsXG4gICAgICAgICAgICAgICAgICBSID0ge30sXG4gICAgICAgICAgICAgICAgICBPID0gZmEoXCJcIiksXG4gICAgICAgICAgICAgICAgICBVID0gMCxcbiAgICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHMuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKFwidGV4dC1yYWRpYWwtb2Zmc2V0XCIpID8gKFUgPSAoSSA9IHMubGF5b3V0LmdldChcInRleHQtb2Zmc2V0XCIpLmV2YWx1YXRlKGIsIHt9LCBTKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQgKiB0O1xuICAgICAgICAgICAgICB9KSlbMF0sIGogPSBJWzFdKSA6IChVID0gMjQgKiBzLmxheW91dC5nZXQoXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIikuZXZhbHVhdGUoYiwge30sIFMpLCBqID0gYWwpLCB0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgbi52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHZhciBxID0gcy5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGVcIikuZXZhbHVhdGUoYiwge30sIFMpICsgOTA7XG4gICAgICAgICAgICAgICAgRSA9IG5ldyBRdSh1LCBlLCBsLCBwLCBjLCBuLnZlcnRpY2FsLCBoLCBmLCB5LCBxKSwgbyAmJiAoUCA9IG5ldyBRdSh1LCBlLCBsLCBwLCBjLCBvLCBtLCB2LCB5LCBxKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIHZhciBOID0gcy5sYXlvdXQuZ2V0KFwiaWNvbi1yb3RhdGVcIikuZXZhbHVhdGUoYiwge30pLFxuICAgICAgICAgICAgICAgICAgICBLID0gXCJub25lXCIgIT09IHMubGF5b3V0LmdldChcImljb24tdGV4dC1maXRcIiksXG4gICAgICAgICAgICAgICAgICAgIEcgPSBKdShpLCBOLCBfLCBLKSxcbiAgICAgICAgICAgICAgICAgICAgWiA9IG8gPyBKdShvLCBOLCBfLCBLKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBDID0gbmV3IFF1KHUsIGUsIGwsIHAsIGMsIGksIG0sIHYsICExLCBOKSwgQiA9IDQgKiBHLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgWCA9IHQuaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgICAgICAgICBKID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcInNvdXJjZVwiID09PSBYLmtpbmQgPyAoSiA9IFsxMjggKiBzLmxheW91dC5nZXQoXCJpY29uLXNpemVcIikuZXZhbHVhdGUoYiwge30pXSlbMF0gPiAzMjY0MCAmJiBBKHQubGF5ZXJJZHNbMF0gKyAnOiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAyNTUuIFJlZHVjZSB5b3VyIFwiaWNvbi1zaXplXCIuJykgOiBcImNvbXBvc2l0ZVwiID09PSBYLmtpbmQgJiYgKChKID0gWzEyOCAqIHcuY29tcG9zaXRlSWNvblNpemVzWzBdLmV2YWx1YXRlKGIsIHt9LCBTKSwgMTI4ICogdy5jb21wb3NpdGVJY29uU2l6ZXNbMV0uZXZhbHVhdGUoYiwge30sIFMpXSlbMF0gPiAzMjY0MCB8fCBKWzFdID4gMzI2NDApICYmIEEodC5sYXllcklkc1swXSArICc6IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49IDI1NS4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi4nKSwgdC5hZGRTeW1ib2xzKHQuaWNvbiwgRywgSiwgeCwgZywgYiwgITEsIGUsIE0ubGluZVN0YXJ0SW5kZXgsIE0ubGluZUxlbmd0aCwgLTEsIFMpLCBEID0gdC5pY29uLnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDEsIFogJiYgKFQgPSA0ICogWi5sZW5ndGgsIHQuYWRkU3ltYm9scyh0Lmljb24sIFosIEosIHgsIGcsIGIsIF91LnZlcnRpY2FsLCBlLCBNLmxpbmVTdGFydEluZGV4LCBNLmxpbmVMZW5ndGgsIC0xLCBTKSwgTCA9IHQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAodmFyIEggaW4gbi5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIFkgPSBuLmhvcml6b250YWxbSF07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXopIHtcbiAgICAgICAgICAgICAgICAgIE8gPSBmYShZLnRleHQpO1xuICAgICAgICAgICAgICAgICAgdmFyICQgPSBzLmxheW91dC5nZXQoXCJ0ZXh0LXJvdGF0ZVwiKS5ldmFsdWF0ZShiLCB7fSwgUyk7XG4gICAgICAgICAgICAgICAgICB6ID0gbmV3IFF1KHUsIGUsIGwsIHAsIGMsIFksIGgsIGYsIHksICQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBXID0gMSA9PT0gWS5wb3NpdGlvbmVkTGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChWICs9IHVsKHQsIGUsIFksIGEsIHMsIHksIGIsIGQsIE0sIG4udmVydGljYWwgPyBfdS5ob3Jpem9udGFsIDogX3UuaG9yaXpvbnRhbE9ubHksIFcgPyBPYmplY3Qua2V5cyhuLmhvcml6b250YWwpIDogW0hdLCBSLCBELCB3LCBTKSwgVykgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBuLnZlcnRpY2FsICYmIChGICs9IHVsKHQsIGUsIG4udmVydGljYWwsIGEsIHMsIHksIGIsIGQsIE0sIF91LnZlcnRpY2FsLCBbXCJ2ZXJ0aWNhbFwiXSwgUiwgTCwgdywgUykpO1xuXG4gICAgICAgICAgICAgIHZhciBRID0geiA/IHouYm94U3RhcnRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgdHQgPSB6ID8gei5ib3hFbmRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZXQgPSBFID8gRS5ib3hTdGFydEluZGV4IDogdC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBydCA9IEUgPyBFLmJveEVuZEluZGV4IDogdC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBudCA9IEMgPyBDLmJveFN0YXJ0SW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGl0ID0gQyA/IEMuYm94RW5kSW5kZXggOiB0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGF0ID0gUCA/IFAuYm94U3RhcnRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgb3QgPSBQID8gUC5ib3hFbmRJbmRleCA6IHQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgc3QgPSAtMSxcbiAgICAgICAgICAgICAgICAgIHV0ID0gZnVuY3Rpb24gdXQodCwgZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuY2lyY2xlRGlhbWV0ZXIgPyBNYXRoLm1heCh0LmNpcmNsZURpYW1ldGVyLCBlKSA6IGU7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgc3QgPSB1dCh6LCBzdCksIHN0ID0gdXQoRSwgc3QpLCBzdCA9IHV0KEMsIHN0KTtcbiAgICAgICAgICAgICAgdmFyIGx0ID0gKHN0ID0gdXQoUCwgc3QpKSA+IC0xID8gMSA6IDA7XG4gICAgICAgICAgICAgIGx0ICYmIChzdCAqPSBrIC8gMjQpLCB0LmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoID49IGdsLk1BWF9HTFlQSFMgJiYgQShcIlRvbyBtYW55IGdseXBocyBiZWluZyByZW5kZXJlZCBpbiBhIHRpbGUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMjkwN1wiKSwgdm9pZCAwICE9PSBiLnNvcnRLZXkgJiYgdC5hZGRUb1NvcnRLZXlSYW5nZXModC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoLCBiLnNvcnRLZXkpLCB0LnN5bWJvbEluc3RhbmNlcy5lbXBsYWNlQmFjayhlLngsIGUueSwgUi5yaWdodCA+PSAwID8gUi5yaWdodCA6IC0xLCBSLmNlbnRlciA+PSAwID8gUi5jZW50ZXIgOiAtMSwgUi5sZWZ0ID49IDAgPyBSLmxlZnQgOiAtMSwgUi52ZXJ0aWNhbCB8fCAtMSwgRCwgTCwgTywgUSwgdHQsIGV0LCBydCwgbnQsIGl0LCBhdCwgb3QsIGwsIFYsIEYsIEIsIFQsIGx0LCAwLCBoLCBVLCBqLCBzdCk7XG4gICAgICAgICAgICB9KHQsIGMsIHMsIHIsIG4sIGksIGgsIHQubGF5ZXJzWzBdLCB0LmNvbGxpc2lvbkJveEFycmF5LCBlLmluZGV4LCBlLnNvdXJjZUxheWVySW5kZXgsIHQuaW5kZXgsIHYsIHcsIGssIHUsIHgsIF8sIEksIHksIGUsIGEsIGwsIHAsIG8pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoXCJsaW5lXCIgPT09IHopIGZvciAodmFyIE0gPSAwLCBCID0gWHUoZS5nZW9tZXRyeSwgMCwgMCwgODE5MiwgODE5Mik7IE0gPCBCLmxlbmd0aDsgTSArPSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBUID0gQltNXSwgViA9IDAsIEYgPSBadShULCBiLCBTLCByLnZlcnRpY2FsIHx8IGQsIG4sIDI0LCBnLCB0Lm92ZXJzY2FsaW5nLCA4MTkyKTsgViA8IEYubGVuZ3RoOyBWICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIEQgPSBGW1ZdO1xuICAgICAgICAgICAgICBkICYmIHBsKHQsIGQudGV4dCwgQywgRCkgfHwgUChULCBEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFwibGluZS1jZW50ZXJcIiA9PT0geikgZm9yICh2YXIgTCA9IDAsIFIgPSBlLmdlb21ldHJ5OyBMIDwgUi5sZW5ndGg7IEwgKz0gMSkge1xuICAgICAgICAgICAgdmFyIE8gPSBSW0xdO1xuXG4gICAgICAgICAgICBpZiAoTy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHZhciBVID0gR3UoTywgUywgci52ZXJ0aWNhbCB8fCBkLCBuLCAyNCwgZyk7XG4gICAgICAgICAgICAgIFUgJiYgUChPLCBVKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFwiUG9seWdvblwiID09PSBlLnR5cGUpIGZvciAodmFyIGogPSAwLCBxID0gaXMoZS5nZW9tZXRyeSwgMCk7IGogPCBxLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICB2YXIgTiA9IHFbal0sXG4gICAgICAgICAgICAgICAgSyA9IHJsKE4sIDE2KTtcbiAgICAgICAgICAgIFAoTlswXSwgbmV3IER1KEsueCwgSy55LCAwKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChcIkxpbmVTdHJpbmdcIiA9PT0gZS50eXBlKSBmb3IgKHZhciBHID0gMCwgWiA9IGUuZ2VvbWV0cnk7IEcgPCBaLmxlbmd0aDsgRyArPSAxKSB7XG4gICAgICAgICAgICB2YXIgWCA9IFpbR107XG4gICAgICAgICAgICBQKFgsIG5ldyBEdShYWzBdLngsIFhbMF0ueSwgMCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCJQb2ludFwiID09PSBlLnR5cGUpIGZvciAodmFyIEogPSAwLCBIID0gZS5nZW9tZXRyeTsgSiA8IEgubGVuZ3RoOyBKICs9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIFkgPSAwLCAkID0gSFtKXTsgWSA8ICQubGVuZ3RoOyBZICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIFcgPSAkW1ldO1xuICAgICAgICAgICAgICBQKFtXXSwgbmV3IER1KFcueCwgVy55LCAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KHQsIGEsIGYsIE8sIG4sIGwsIGMsIGgsIHcsIFUsIG8pO1xuICAgICAgfSwgeCA9IDAsIGIgPSB0LmZlYXR1cmVzOyB4IDwgYi5sZW5ndGg7IHggKz0gMSkge1xuICAgICAgICBnKCk7XG4gICAgICB9XG5cbiAgICAgIGEgJiYgdC5nZW5lcmF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycygpO1xuICAgIH0sIHQucGVyc3BlY3RpdmUgPSBmdW5jdGlvbiAodCwgZSwgciwgbiwgaSkge1xuICAgICAgdmFyIGEsXG4gICAgICAgICAgbyA9IDEgLyBNYXRoLnRhbihlIC8gMik7XG4gICAgICByZXR1cm4gdFswXSA9IG8gLyByLCB0WzFdID0gMCwgdFsyXSA9IDAsIHRbM10gPSAwLCB0WzRdID0gMCwgdFs1XSA9IG8sIHRbNl0gPSAwLCB0WzddID0gMCwgdFs4XSA9IDAsIHRbOV0gPSAwLCB0WzExXSA9IC0xLCB0WzEyXSA9IDAsIHRbMTNdID0gMCwgdFsxNV0gPSAwLCBudWxsICE9IGkgJiYgaSAhPT0gMSAvIDAgPyAodFsxMF0gPSAoaSArIG4pICogKGEgPSAxIC8gKG4gLSBpKSksIHRbMTRdID0gMiAqIGkgKiBuICogYSkgOiAodFsxMF0gPSAtMSwgdFsxNF0gPSAtMiAqIG4pLCB0O1xuICAgIH0sIHQucGljayA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByID0ge30sIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykge1xuICAgICAgICB2YXIgaSA9IGVbbl07XG4gICAgICAgIGkgaW4gdCAmJiAocltpXSA9IHRbaV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LCB0LnBsdWdpbiA9IHNpLCB0LnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbiA9IEthLCB0LnBvc3RNYXBMb2FkRXZlbnQgPSBvdCwgdC5wb3N0VHVybnN0aWxlRXZlbnQgPSBpdCwgdC5wb3RwYWNrID0gZ3UsIHQucmVmUHJvcGVydGllcyA9IFtcInR5cGVcIiwgXCJzb3VyY2VcIiwgXCJzb3VyY2UtbGF5ZXJcIiwgXCJtaW56b29tXCIsIFwibWF4em9vbVwiLCBcImZpbHRlclwiLCBcImxheW91dFwiXSwgdC5yZWdpc3RlciA9IE9uLCB0LnJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQoe1xuICAgICAgICBwbHVnaW5TdGF0dXM6IHRpLFxuICAgICAgICBwbHVnaW5VUkw6IGVpXG4gICAgICB9KSwgaWkub24oXCJwbHVnaW5TdGF0ZUNoYW5nZVwiLCB0KSwgdDtcbiAgICB9LCB0LnJlbmRlckNvbG9yUmFtcCA9IF9vLCB0LnJvdGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IGVbMF0sXG4gICAgICAgICAgaSA9IGVbMV0sXG4gICAgICAgICAgYSA9IGVbMl0sXG4gICAgICAgICAgbyA9IGVbM10sXG4gICAgICAgICAgcyA9IE1hdGguc2luKHIpLFxuICAgICAgICAgIHUgPSBNYXRoLmNvcyhyKTtcbiAgICAgIHJldHVybiB0WzBdID0gbiAqIHUgKyBhICogcywgdFsxXSA9IGkgKiB1ICsgbyAqIHMsIHRbMl0gPSBuICogLXMgKyBhICogdSwgdFszXSA9IGkgKiAtcyArIG8gKiB1LCB0O1xuICAgIH0sIHQucm90YXRlWCA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IE1hdGguc2luKHIpLFxuICAgICAgICAgIGkgPSBNYXRoLmNvcyhyKSxcbiAgICAgICAgICBhID0gZVs0XSxcbiAgICAgICAgICBvID0gZVs1XSxcbiAgICAgICAgICBzID0gZVs2XSxcbiAgICAgICAgICB1ID0gZVs3XSxcbiAgICAgICAgICBsID0gZVs4XSxcbiAgICAgICAgICBwID0gZVs5XSxcbiAgICAgICAgICBjID0gZVsxMF0sXG4gICAgICAgICAgaCA9IGVbMTFdO1xuICAgICAgcmV0dXJuIGUgIT09IHQgJiYgKHRbMF0gPSBlWzBdLCB0WzFdID0gZVsxXSwgdFsyXSA9IGVbMl0sIHRbM10gPSBlWzNdLCB0WzEyXSA9IGVbMTJdLCB0WzEzXSA9IGVbMTNdLCB0WzE0XSA9IGVbMTRdLCB0WzE1XSA9IGVbMTVdKSwgdFs0XSA9IGEgKiBpICsgbCAqIG4sIHRbNV0gPSBvICogaSArIHAgKiBuLCB0WzZdID0gcyAqIGkgKyBjICogbiwgdFs3XSA9IHUgKiBpICsgaCAqIG4sIHRbOF0gPSBsICogaSAtIGEgKiBuLCB0WzldID0gcCAqIGkgLSBvICogbiwgdFsxMF0gPSBjICogaSAtIHMgKiBuLCB0WzExXSA9IGggKiBpIC0gdSAqIG4sIHQ7XG4gICAgfSwgdC5yb3RhdGVaID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gTWF0aC5zaW4ociksXG4gICAgICAgICAgaSA9IE1hdGguY29zKHIpLFxuICAgICAgICAgIGEgPSBlWzBdLFxuICAgICAgICAgIG8gPSBlWzFdLFxuICAgICAgICAgIHMgPSBlWzJdLFxuICAgICAgICAgIHUgPSBlWzNdLFxuICAgICAgICAgIGwgPSBlWzRdLFxuICAgICAgICAgIHAgPSBlWzVdLFxuICAgICAgICAgIGMgPSBlWzZdLFxuICAgICAgICAgIGggPSBlWzddO1xuICAgICAgcmV0dXJuIGUgIT09IHQgJiYgKHRbOF0gPSBlWzhdLCB0WzldID0gZVs5XSwgdFsxMF0gPSBlWzEwXSwgdFsxMV0gPSBlWzExXSwgdFsxMl0gPSBlWzEyXSwgdFsxM10gPSBlWzEzXSwgdFsxNF0gPSBlWzE0XSwgdFsxNV0gPSBlWzE1XSksIHRbMF0gPSBhICogaSArIGwgKiBuLCB0WzFdID0gbyAqIGkgKyBwICogbiwgdFsyXSA9IHMgKiBpICsgYyAqIG4sIHRbM10gPSB1ICogaSArIGggKiBuLCB0WzRdID0gbCAqIGkgLSBhICogbiwgdFs1XSA9IHAgKiBpIC0gbyAqIG4sIHRbNl0gPSBjICogaSAtIHMgKiBuLCB0WzddID0gaCAqIGkgLSB1ICogbiwgdDtcbiAgICB9LCB0LnNjYWxlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gclswXSxcbiAgICAgICAgICBpID0gclsxXSxcbiAgICAgICAgICBhID0gclsyXTtcbiAgICAgIHJldHVybiB0WzBdID0gZVswXSAqIG4sIHRbMV0gPSBlWzFdICogbiwgdFsyXSA9IGVbMl0gKiBuLCB0WzNdID0gZVszXSAqIG4sIHRbNF0gPSBlWzRdICogaSwgdFs1XSA9IGVbNV0gKiBpLCB0WzZdID0gZVs2XSAqIGksIHRbN10gPSBlWzddICogaSwgdFs4XSA9IGVbOF0gKiBhLCB0WzldID0gZVs5XSAqIGEsIHRbMTBdID0gZVsxMF0gKiBhLCB0WzExXSA9IGVbMTFdICogYSwgdFsxMl0gPSBlWzEyXSwgdFsxM10gPSBlWzEzXSwgdFsxNF0gPSBlWzE0XSwgdFsxNV0gPSBlWzE1XSwgdDtcbiAgICB9LCB0LnNjYWxlJDEgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHRbMF0gPSBlWzBdICogciwgdFsxXSA9IGVbMV0gKiByLCB0WzJdID0gZVsyXSAqIHIsIHRbM10gPSBlWzNdICogciwgdDtcbiAgICB9LCB0LnNjYWxlJDIgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgcmV0dXJuIHRbMF0gPSBlWzBdICogciwgdFsxXSA9IGVbMV0gKiByLCB0WzJdID0gZVsyXSAqIHIsIHQ7XG4gICAgfSwgdC5zZXRDYWNoZUxpbWl0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBzdCA9IHQsIHV0ID0gZTtcbiAgICB9LCB0LnNldFJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgaWYgKHZvaWQgMCA9PT0gciAmJiAociA9ICExKSwgXCJkZWZlcnJlZFwiID09PSB0aSB8fCBcImxvYWRpbmdcIiA9PT0gdGkgfHwgXCJsb2FkZWRcIiA9PT0gdGkpIHRocm93IG5ldyBFcnJvcihcInNldFJUTFRleHRQbHVnaW4gY2Fubm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cIik7XG4gICAgICBlaSA9IFIucmVzb2x2ZVVSTCh0KSwgdGkgPSBcImRlZmVycmVkXCIsIFFuID0gZSwgbmkoKSwgciB8fCBvaSgpO1xuICAgIH0sIHQuc3BoZXJpY2FsVG9DYXJ0ZXNpYW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0WzBdLFxuICAgICAgICAgIHIgPSB0WzFdLFxuICAgICAgICAgIG4gPSB0WzJdO1xuICAgICAgcmV0dXJuIHIgKz0gOTAsIHIgKj0gTWF0aC5QSSAvIDE4MCwgbiAqPSBNYXRoLlBJIC8gMTgwLCB7XG4gICAgICAgIHg6IGUgKiBNYXRoLmNvcyhyKSAqIE1hdGguc2luKG4pLFxuICAgICAgICB5OiBlICogTWF0aC5zaW4ocikgKiBNYXRoLnNpbihuKSxcbiAgICAgICAgejogZSAqIE1hdGguY29zKG4pXG4gICAgICB9O1xuICAgIH0sIHQuc3FyTGVuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdFswXSxcbiAgICAgICAgICByID0gdFsxXTtcbiAgICAgIHJldHVybiBlICogZSArIHIgKiByO1xuICAgIH0sIHQuc3R5bGVTcGVjID0gUHQsIHQuc3ViID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHJldHVybiB0WzBdID0gZVswXSAtIHJbMF0sIHRbMV0gPSBlWzFdIC0gclsxXSwgdFsyXSA9IGVbMl0gLSByWzJdLCB0O1xuICAgIH0sIHQuc3ltYm9sU2l6ZSA9IFV1LCB0LnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbiAodCwgZSwgcikge1xuICAgICAgdmFyIG4gPSBlWzBdLFxuICAgICAgICAgIGkgPSBlWzFdLFxuICAgICAgICAgIGEgPSBlWzJdO1xuICAgICAgcmV0dXJuIHRbMF0gPSBuICogclswXSArIGkgKiByWzNdICsgYSAqIHJbNl0sIHRbMV0gPSBuICogclsxXSArIGkgKiByWzRdICsgYSAqIHJbN10sIHRbMl0gPSBuICogclsyXSArIGkgKiByWzVdICsgYSAqIHJbOF0sIHQ7XG4gICAgfSwgdC50cmFuc2Zvcm1NYXQ0ID0gY28sIHQudHJhbnNsYXRlID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuLFxuICAgICAgICAgIGksXG4gICAgICAgICAgYSxcbiAgICAgICAgICBvLFxuICAgICAgICAgIHMsXG4gICAgICAgICAgdSxcbiAgICAgICAgICBsLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgYyxcbiAgICAgICAgICBoLFxuICAgICAgICAgIGYsXG4gICAgICAgICAgeSxcbiAgICAgICAgICBkID0gclswXSxcbiAgICAgICAgICBtID0gclsxXSxcbiAgICAgICAgICB2ID0gclsyXTtcbiAgICAgIHJldHVybiBlID09PSB0ID8gKHRbMTJdID0gZVswXSAqIGQgKyBlWzRdICogbSArIGVbOF0gKiB2ICsgZVsxMl0sIHRbMTNdID0gZVsxXSAqIGQgKyBlWzVdICogbSArIGVbOV0gKiB2ICsgZVsxM10sIHRbMTRdID0gZVsyXSAqIGQgKyBlWzZdICogbSArIGVbMTBdICogdiArIGVbMTRdLCB0WzE1XSA9IGVbM10gKiBkICsgZVs3XSAqIG0gKyBlWzExXSAqIHYgKyBlWzE1XSkgOiAoaSA9IGVbMV0sIGEgPSBlWzJdLCBvID0gZVszXSwgcyA9IGVbNF0sIHUgPSBlWzVdLCBsID0gZVs2XSwgcCA9IGVbN10sIGMgPSBlWzhdLCBoID0gZVs5XSwgZiA9IGVbMTBdLCB5ID0gZVsxMV0sIHRbMF0gPSBuID0gZVswXSwgdFsxXSA9IGksIHRbMl0gPSBhLCB0WzNdID0gbywgdFs0XSA9IHMsIHRbNV0gPSB1LCB0WzZdID0gbCwgdFs3XSA9IHAsIHRbOF0gPSBjLCB0WzldID0gaCwgdFsxMF0gPSBmLCB0WzExXSA9IHksIHRbMTJdID0gbiAqIGQgKyBzICogbSArIGMgKiB2ICsgZVsxMl0sIHRbMTNdID0gaSAqIGQgKyB1ICogbSArIGggKiB2ICsgZVsxM10sIHRbMTRdID0gYSAqIGQgKyBsICogbSArIGYgKiB2ICsgZVsxNF0sIHRbMTVdID0gbyAqIGQgKyBwICogbSArIHkgKiB2ICsgZVsxNV0pLCB0O1xuICAgIH0sIHQudHJpZ2dlclBsdWdpbkNvbXBsZXRpb25FdmVudCA9IHJpLCB0LnVuaXF1ZUlkID0geSwgdC52YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBbXSxcbiAgICAgICAgICByID0gdC5pZDtcbiAgICAgIHJldHVybiB2b2lkIDAgPT09IHIgJiYgZS5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogXCJsYXllcnMuXCIgKyByICsgJzogbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImlkXCInXG4gICAgICB9KSwgdm9pZCAwID09PSB0LnJlbmRlciAmJiBlLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBcImxheWVycy5cIiArIHIgKyAnOiBtaXNzaW5nIHJlcXVpcmVkIG1ldGhvZCBcInJlbmRlclwiJ1xuICAgICAgfSksIHQucmVuZGVyaW5nTW9kZSAmJiBcIjJkXCIgIT09IHQucmVuZGVyaW5nTW9kZSAmJiBcIjNkXCIgIT09IHQucmVuZGVyaW5nTW9kZSAmJiBlLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBcImxheWVycy5cIiArIHIgKyAnOiBwcm9wZXJ0eSBcInJlbmRlcmluZ01vZGVcIiBtdXN0IGJlIGVpdGhlciBcIjJkXCIgb3IgXCIzZFwiJ1xuICAgICAgfSksIGU7XG4gICAgfSwgdC52YWxpZGF0ZUxpZ2h0ID0gUG4sIHQudmFsaWRhdGVTdHlsZSA9IEVuLCB0LnZhbHVlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IFtdO1xuXG4gICAgICBmb3IgKHZhciByIGluIHQpIHtcbiAgICAgICAgZS5wdXNoKHRbcl0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9LCB0LnZlY3RvclRpbGUgPSB3cywgdC52ZXJzaW9uID0gXCIxLjE1LjBcIiwgdC53YXJuT25jZSA9IEEsIHQud2VicFN1cHBvcnRlZCA9IFUsIHQud2luZG93ID0gbywgdC53cmFwID0gYztcbiAgfSk7XG4gIGRlZmluZShbXCIuL3NoYXJlZFwiXSwgZnVuY3Rpb24gKGUpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIHQoZSkge1xuICAgICAgdmFyIHIgPSB0eXBlb2YgZTtcbiAgICAgIGlmIChcIm51bWJlclwiID09PSByIHx8IFwiYm9vbGVhblwiID09PSByIHx8IFwic3RyaW5nXCIgPT09IHIgfHwgbnVsbCA9PSBlKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBcIltcIiwgbyA9IDAsIG4gPSBlOyBvIDwgbi5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgIGkgKz0gdChuW29dKSArIFwiLFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkgKyBcIl1cIjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcyA9IE9iamVjdC5rZXlzKGUpLnNvcnQoKSwgYSA9IFwie1wiLCBsID0gMDsgbCA8IHMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgYSArPSBKU09OLnN0cmluZ2lmeShzW2xdKSArIFwiOlwiICsgdChlW3NbbF1dKSArIFwiLFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYSArIFwifVwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHIocikge1xuICAgICAgZm9yICh2YXIgaSA9IFwiXCIsIG8gPSAwLCBuID0gZS5yZWZQcm9wZXJ0aWVzOyBvIDwgbi5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICBpICs9IFwiL1wiICsgdChyW25bb11dKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgdmFyIGkgPSBmdW5jdGlvbiBpKGUpIHtcbiAgICAgIHRoaXMua2V5Q2FjaGUgPSB7fSwgZSAmJiB0aGlzLnJlcGxhY2UoZSk7XG4gICAgfTtcblxuICAgIGkucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fbGF5ZXJDb25maWdzID0ge30sIHRoaXMuX2xheWVycyA9IHt9LCB0aGlzLnVwZGF0ZShlLCBbXSk7XG4gICAgfSwgaS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHQsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gPSB0aGlzLCBuID0gMCwgcyA9IHQ7IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIHZhciBhID0gc1tuXTtcbiAgICAgICAgdGhpcy5fbGF5ZXJDb25maWdzW2EuaWRdID0gYTtcbiAgICAgICAgdmFyIGwgPSB0aGlzLl9sYXllcnNbYS5pZF0gPSBlLmNyZWF0ZVN0eWxlTGF5ZXIoYSk7XG4gICAgICAgIGwuX2ZlYXR1cmVGaWx0ZXIgPSBlLmZlYXR1cmVGaWx0ZXIobC5maWx0ZXIpLCB0aGlzLmtleUNhY2hlW2EuaWRdICYmIGRlbGV0ZSB0aGlzLmtleUNhY2hlW2EuaWRdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB1ID0gMCwgaCA9IGk7IHUgPCBoLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgIHZhciBjID0gaFt1XTtcbiAgICAgICAgZGVsZXRlIHRoaXMua2V5Q2FjaGVbY10sIGRlbGV0ZSB0aGlzLl9sYXllckNvbmZpZ3NbY10sIGRlbGV0ZSB0aGlzLl9sYXllcnNbY107XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmFtaWxpZXNCeVNvdXJjZSA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBwID0gMCwgZiA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB7fSwgbyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgdmFyIG4gPSB0ICYmIHRbZVtvXS5pZF0gfHwgcihlW29dKTtcbiAgICAgICAgICB0ICYmICh0W2Vbb10uaWRdID0gbik7XG4gICAgICAgICAgdmFyIHMgPSBpW25dO1xuICAgICAgICAgIHMgfHwgKHMgPSBpW25dID0gW10pLCBzLnB1c2goZVtvXSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGwgaW4gaSkge1xuICAgICAgICAgIGEucHVzaChpW2xdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfShlLnZhbHVlcyh0aGlzLl9sYXllckNvbmZpZ3MpLCB0aGlzLmtleUNhY2hlKTsgcCA8IGYubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgdmFyIGQgPSBmW3BdLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBvLl9sYXllcnNbZS5pZF07XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgZyA9IGRbMF07XG5cbiAgICAgICAgaWYgKFwibm9uZVwiICE9PSBnLnZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgdiA9IGcuc291cmNlIHx8IFwiXCIsXG4gICAgICAgICAgICAgIG0gPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbdl07XG4gICAgICAgICAgbSB8fCAobSA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVt2XSA9IHt9KTtcbiAgICAgICAgICB2YXIgeSA9IGcuc291cmNlTGF5ZXIgfHwgXCJfZ2VvanNvblRpbGVMYXllclwiLFxuICAgICAgICAgICAgICB4ID0gbVt5XTtcbiAgICAgICAgICB4IHx8ICh4ID0gbVt5XSA9IFtdKSwgeC5wdXNoKGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvID0gZnVuY3Rpb24gbyh0KSB7XG4gICAgICB2YXIgciA9IHt9LFxuICAgICAgICAgIGkgPSBbXTtcblxuICAgICAgZm9yICh2YXIgbyBpbiB0KSB7XG4gICAgICAgIHZhciBuID0gdFtvXSxcbiAgICAgICAgICAgIHMgPSByW29dID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiBuKSB7XG4gICAgICAgICAgdmFyIGwgPSBuWythXTtcblxuICAgICAgICAgIGlmIChsICYmIDAgIT09IGwuYml0bWFwLndpZHRoICYmIDAgIT09IGwuYml0bWFwLmhlaWdodCkge1xuICAgICAgICAgICAgdmFyIHUgPSB7XG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgIHc6IGwuYml0bWFwLndpZHRoICsgMixcbiAgICAgICAgICAgICAgaDogbC5iaXRtYXAuaGVpZ2h0ICsgMlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGkucHVzaCh1KSwgc1thXSA9IHtcbiAgICAgICAgICAgICAgcmVjdDogdSxcbiAgICAgICAgICAgICAgbWV0cmljczogbC5tZXRyaWNzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaCA9IGUucG90cGFjayhpKSxcbiAgICAgICAgICBjID0gbmV3IGUuQWxwaGFJbWFnZSh7XG4gICAgICAgIHdpZHRoOiBoLncgfHwgMSxcbiAgICAgICAgaGVpZ2h0OiBoLmggfHwgMVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIHAgaW4gdCkge1xuICAgICAgICB2YXIgZiA9IHRbcF07XG5cbiAgICAgICAgZm9yICh2YXIgZCBpbiBmKSB7XG4gICAgICAgICAgdmFyIGcgPSBmWytkXTtcblxuICAgICAgICAgIGlmIChnICYmIDAgIT09IGcuYml0bWFwLndpZHRoICYmIDAgIT09IGcuYml0bWFwLmhlaWdodCkge1xuICAgICAgICAgICAgdmFyIHYgPSByW3BdW2RdLnJlY3Q7XG4gICAgICAgICAgICBlLkFscGhhSW1hZ2UuY29weShnLmJpdG1hcCwgYywge1xuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHg6IHYueCArIDEsXG4gICAgICAgICAgICAgIHk6IHYueSArIDFcbiAgICAgICAgICAgIH0sIGcuYml0bWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5pbWFnZSA9IGMsIHRoaXMucG9zaXRpb25zID0gcjtcbiAgICB9O1xuXG4gICAgZS5yZWdpc3RlcihcIkdseXBoQXRsYXNcIiwgbyk7XG5cbiAgICB2YXIgbiA9IGZ1bmN0aW9uIG4odCkge1xuICAgICAgdGhpcy50aWxlSUQgPSBuZXcgZS5PdmVyc2NhbGVkVGlsZUlEKHQudGlsZUlELm92ZXJzY2FsZWRaLCB0LnRpbGVJRC53cmFwLCB0LnRpbGVJRC5jYW5vbmljYWwueiwgdC50aWxlSUQuY2Fub25pY2FsLngsIHQudGlsZUlELmNhbm9uaWNhbC55KSwgdGhpcy51aWQgPSB0LnVpZCwgdGhpcy56b29tID0gdC56b29tLCB0aGlzLnBpeGVsUmF0aW8gPSB0LnBpeGVsUmF0aW8sIHRoaXMudGlsZVNpemUgPSB0LnRpbGVTaXplLCB0aGlzLnNvdXJjZSA9IHQuc291cmNlLCB0aGlzLm92ZXJzY2FsaW5nID0gdGhpcy50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzID0gdC5zaG93Q29sbGlzaW9uQm94ZXMsIHRoaXMuY29sbGVjdFJlc291cmNlVGltaW5nID0gISF0LmNvbGxlY3RSZXNvdXJjZVRpbWluZywgdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPSAhIXQucmV0dXJuRGVwZW5kZW5jaWVzLCB0aGlzLnByb21vdGVJZCA9IHQucHJvbW90ZUlkO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzKHQsIHIsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gPSBuZXcgZS5FdmFsdWF0aW9uUGFyYW1ldGVycyhyKSwgbiA9IDAsIHMgPSB0OyBuIDwgcy5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICBzW25dLnJlY2FsY3VsYXRlKG8sIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGEodCwgcikge1xuICAgICAgdmFyIGkgPSBlLmdldEFycmF5QnVmZmVyKHQucmVxdWVzdCwgZnVuY3Rpb24gKHQsIGksIG8sIG4pIHtcbiAgICAgICAgdCA/IHIodCkgOiBpICYmIHIobnVsbCwge1xuICAgICAgICAgIHZlY3RvclRpbGU6IG5ldyBlLnZlY3RvclRpbGUuVmVjdG9yVGlsZShuZXcgZS5wYmYoaSkpLFxuICAgICAgICAgIHJhd0RhdGE6IGksXG4gICAgICAgICAgY2FjaGVDb250cm9sOiBvLFxuICAgICAgICAgIGV4cGlyZXM6IG5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGkuY2FuY2VsKCksIHIoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbi5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAodCwgciwgaSwgbiwgYSkge1xuICAgICAgdmFyIGwgPSB0aGlzO1xuICAgICAgdGhpcy5zdGF0dXMgPSBcInBhcnNpbmdcIiwgdGhpcy5kYXRhID0gdCwgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBlLkNvbGxpc2lvbkJveEFycmF5KCk7XG4gICAgICB2YXIgdSA9IG5ldyBlLkRpY3Rpb25hcnlDb2RlcihPYmplY3Qua2V5cyh0LmxheWVycykuc29ydCgpKSxcbiAgICAgICAgICBoID0gbmV3IGUuRmVhdHVyZUluZGV4KHRoaXMudGlsZUlELCB0aGlzLnByb21vdGVJZCk7XG4gICAgICBoLmJ1Y2tldExheWVySURzID0gW107XG4gICAgICB2YXIgYyxcbiAgICAgICAgICBwLFxuICAgICAgICAgIGYsXG4gICAgICAgICAgZCxcbiAgICAgICAgICBnID0ge30sXG4gICAgICAgICAgdiA9IHtcbiAgICAgICAgZmVhdHVyZUluZGV4OiBoLFxuICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgcGF0dGVybkRlcGVuZGVuY2llczoge30sXG4gICAgICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBpXG4gICAgICB9LFxuICAgICAgICAgIG0gPSByLmZhbWlsaWVzQnlTb3VyY2VbdGhpcy5zb3VyY2VdO1xuXG4gICAgICBmb3IgKHZhciB5IGluIG0pIHtcbiAgICAgICAgdmFyIHggPSB0LmxheWVyc1t5XTtcblxuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgIDEgPT09IHgudmVyc2lvbiAmJiBlLndhcm5PbmNlKCdWZWN0b3IgdGlsZSBzb3VyY2UgXCInICsgdGhpcy5zb3VyY2UgKyAnXCIgbGF5ZXIgXCInICsgeSArICdcIiBkb2VzIG5vdCB1c2UgdmVjdG9yIHRpbGUgc3BlYyB2MiBhbmQgdGhlcmVmb3JlIG1heSBoYXZlIHNvbWUgcmVuZGVyaW5nIGVycm9ycy4nKTtcblxuICAgICAgICAgIGZvciAodmFyIHcgPSB1LmVuY29kZSh5KSwgUyA9IFtdLCBJID0gMDsgSSA8IHgubGVuZ3RoOyBJKyspIHtcbiAgICAgICAgICAgIHZhciBNID0geC5mZWF0dXJlKEkpLFxuICAgICAgICAgICAgICAgIGIgPSBoLmdldElkKE0sIHkpO1xuICAgICAgICAgICAgUy5wdXNoKHtcbiAgICAgICAgICAgICAgZmVhdHVyZTogTSxcbiAgICAgICAgICAgICAgaWQ6IGIsXG4gICAgICAgICAgICAgIGluZGV4OiBJLFxuICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiB3XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBfID0gMCwgayA9IG1beV07IF8gPCBrLmxlbmd0aDsgXyArPSAxKSB7XG4gICAgICAgICAgICB2YXIgUCA9IGtbX10sXG4gICAgICAgICAgICAgICAgVCA9IFBbMF07XG4gICAgICAgICAgICBULm1pbnpvb20gJiYgdGhpcy56b29tIDwgTWF0aC5mbG9vcihULm1pbnpvb20pIHx8IFQubWF4em9vbSAmJiB0aGlzLnpvb20gPj0gVC5tYXh6b29tIHx8IFwibm9uZVwiICE9PSBULnZpc2liaWxpdHkgJiYgKHMoUCwgdGhpcy56b29tLCBpKSwgKGdbVC5pZF0gPSBULmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgIGluZGV4OiBoLmJ1Y2tldExheWVySURzLmxlbmd0aCxcbiAgICAgICAgICAgICAgbGF5ZXJzOiBQLFxuICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXG4gICAgICAgICAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IHRoaXMub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiB3LFxuICAgICAgICAgICAgICBzb3VyY2VJRDogdGhpcy5zb3VyY2VcbiAgICAgICAgICAgIH0pKS5wb3B1bGF0ZShTLCB2LCB0aGlzLnRpbGVJRC5jYW5vbmljYWwpLCBoLmJ1Y2tldExheWVySURzLnB1c2goUC5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuaWQ7XG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgQyA9IGUubWFwT2JqZWN0KHYuZ2x5cGhEZXBlbmRlbmNpZXMsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoTnVtYmVyKTtcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXMoQykubGVuZ3RoID8gbi5zZW5kKFwiZ2V0R2x5cGhzXCIsIHtcbiAgICAgICAgdWlkOiB0aGlzLnVpZCxcbiAgICAgICAgc3RhY2tzOiBDXG4gICAgICB9LCBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICBjIHx8IChjID0gZSwgcCA9IHQsIHouY2FsbChsKSk7XG4gICAgICB9KSA6IHAgPSB7fTtcbiAgICAgIHZhciBEID0gT2JqZWN0LmtleXModi5pY29uRGVwZW5kZW5jaWVzKTtcbiAgICAgIEQubGVuZ3RoID8gbi5zZW5kKFwiZ2V0SW1hZ2VzXCIsIHtcbiAgICAgICAgaWNvbnM6IEQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgIHRpbGVJRDogdGhpcy50aWxlSUQsXG4gICAgICAgIHR5cGU6IFwiaWNvbnNcIlxuICAgICAgfSwgZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgYyB8fCAoYyA9IGUsIGYgPSB0LCB6LmNhbGwobCkpO1xuICAgICAgfSkgOiBmID0ge307XG4gICAgICB2YXIgTCA9IE9iamVjdC5rZXlzKHYucGF0dGVybkRlcGVuZGVuY2llcyk7XG5cbiAgICAgIGZ1bmN0aW9uIHooKSB7XG4gICAgICAgIGlmIChjKSByZXR1cm4gYShjKTtcblxuICAgICAgICBpZiAocCAmJiBmICYmIGQpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBvKHApLFxuICAgICAgICAgICAgICByID0gbmV3IGUuSW1hZ2VBdGxhcyhmLCBkKTtcblxuICAgICAgICAgIGZvciAodmFyIG4gaW4gZykge1xuICAgICAgICAgICAgdmFyIGwgPSBnW25dO1xuICAgICAgICAgICAgbCBpbnN0YW5jZW9mIGUuU3ltYm9sQnVja2V0ID8gKHMobC5sYXllcnMsIHRoaXMuem9vbSwgaSksIGUucGVyZm9ybVN5bWJvbExheW91dChsLCBwLCB0LnBvc2l0aW9ucywgZiwgci5pY29uUG9zaXRpb25zLCB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcywgdGhpcy50aWxlSUQuY2Fub25pY2FsKSkgOiBsLmhhc1BhdHRlcm4gJiYgKGwgaW5zdGFuY2VvZiBlLkxpbmVCdWNrZXQgfHwgbCBpbnN0YW5jZW9mIGUuRmlsbEJ1Y2tldCB8fCBsIGluc3RhbmNlb2YgZS5GaWxsRXh0cnVzaW9uQnVja2V0KSAmJiAocyhsLmxheWVycywgdGhpcy56b29tLCBpKSwgbC5hZGRGZWF0dXJlcyh2LCB0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHIucGF0dGVyblBvc2l0aW9ucykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhdHVzID0gXCJkb25lXCIsIGEobnVsbCwge1xuICAgICAgICAgICAgYnVja2V0czogZS52YWx1ZXMoZykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhZS5pc0VtcHR5KCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleDogaCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgZ2x5cGhBdGxhc0ltYWdlOiB0LmltYWdlLFxuICAgICAgICAgICAgaW1hZ2VBdGxhczogcixcbiAgICAgICAgICAgIGdseXBoTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IHAgOiBudWxsLFxuICAgICAgICAgICAgaWNvbk1hcDogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBmIDogbnVsbCxcbiAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IHQucG9zaXRpb25zIDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEwubGVuZ3RoID8gbi5zZW5kKFwiZ2V0SW1hZ2VzXCIsIHtcbiAgICAgICAgaWNvbnM6IEwsXG4gICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgIHRpbGVJRDogdGhpcy50aWxlSUQsXG4gICAgICAgIHR5cGU6IFwicGF0dGVybnNcIlxuICAgICAgfSwgZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgYyB8fCAoYyA9IGUsIGQgPSB0LCB6LmNhbGwobCkpO1xuICAgICAgfSkgOiBkID0ge30sIHouY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdmFyIGwgPSBmdW5jdGlvbiBsKGUsIHQsIHIsIGkpIHtcbiAgICAgIHRoaXMuYWN0b3IgPSBlLCB0aGlzLmxheWVySW5kZXggPSB0LCB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IHIsIHRoaXMubG9hZFZlY3RvckRhdGEgPSBpIHx8IGEsIHRoaXMubG9hZGluZyA9IHt9LCB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIH07XG5cbiAgICBsLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICB2YXIgaSA9IHRoaXMsXG4gICAgICAgICAgbyA9IHQudWlkO1xuICAgICAgdGhpcy5sb2FkaW5nIHx8ICh0aGlzLmxvYWRpbmcgPSB7fSk7XG4gICAgICB2YXIgcyA9ICEhKHQgJiYgdC5yZXF1ZXN0ICYmIHQucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcpICYmIG5ldyBlLlJlcXVlc3RQZXJmb3JtYW5jZSh0LnJlcXVlc3QpLFxuICAgICAgICAgIGEgPSB0aGlzLmxvYWRpbmdbb10gPSBuZXcgbih0KTtcbiAgICAgIGEuYWJvcnQgPSB0aGlzLmxvYWRWZWN0b3JEYXRhKHQsIGZ1bmN0aW9uICh0LCBuKSB7XG4gICAgICAgIGlmIChkZWxldGUgaS5sb2FkaW5nW29dLCB0IHx8ICFuKSByZXR1cm4gYS5zdGF0dXMgPSBcImRvbmVcIiwgaS5sb2FkZWRbb10gPSBhLCByKHQpO1xuICAgICAgICB2YXIgbCA9IG4ucmF3RGF0YSxcbiAgICAgICAgICAgIHUgPSB7fTtcbiAgICAgICAgbi5leHBpcmVzICYmICh1LmV4cGlyZXMgPSBuLmV4cGlyZXMpLCBuLmNhY2hlQ29udHJvbCAmJiAodS5jYWNoZUNvbnRyb2wgPSBuLmNhY2hlQ29udHJvbCk7XG4gICAgICAgIHZhciBoID0ge307XG5cbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICB2YXIgYyA9IHMuZmluaXNoKCk7XG4gICAgICAgICAgYyAmJiAoaC5yZXNvdXJjZVRpbWluZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGEudmVjdG9yVGlsZSA9IG4udmVjdG9yVGlsZSwgYS5wYXJzZShuLnZlY3RvclRpbGUsIGkubGF5ZXJJbmRleCwgaS5hdmFpbGFibGVJbWFnZXMsIGkuYWN0b3IsIGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICAgICAgaWYgKHQgfHwgIWkpIHJldHVybiByKHQpO1xuICAgICAgICAgIHIobnVsbCwgZS5leHRlbmQoe1xuICAgICAgICAgICAgcmF3VGlsZURhdGE6IGwuc2xpY2UoMClcbiAgICAgICAgICB9LCBpLCB1LCBoKSk7XG4gICAgICAgIH0pLCBpLmxvYWRlZCA9IGkubG9hZGVkIHx8IHt9LCBpLmxvYWRlZFtvXSA9IGE7XG4gICAgICB9KTtcbiAgICB9LCBsLnByb3RvdHlwZS5yZWxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHZhciByID0gdGhpcyxcbiAgICAgICAgICBpID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgbyA9IGUudWlkLFxuICAgICAgICAgIG4gPSB0aGlzO1xuXG4gICAgICBpZiAoaSAmJiBpW29dKSB7XG4gICAgICAgIHZhciBzID0gaVtvXTtcbiAgICAgICAgcy5zaG93Q29sbGlzaW9uQm94ZXMgPSBlLnNob3dDb2xsaXNpb25Cb3hlcztcblxuICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoZSwgaSkge1xuICAgICAgICAgIHZhciBvID0gcy5yZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICBvICYmIChkZWxldGUgcy5yZWxvYWRDYWxsYmFjaywgcy5wYXJzZShzLnZlY3RvclRpbGUsIG4ubGF5ZXJJbmRleCwgci5hdmFpbGFibGVJbWFnZXMsIG4uYWN0b3IsIG8pKSwgdChlLCBpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBcInBhcnNpbmdcIiA9PT0gcy5zdGF0dXMgPyBzLnJlbG9hZENhbGxiYWNrID0gYSA6IFwiZG9uZVwiID09PSBzLnN0YXR1cyAmJiAocy52ZWN0b3JUaWxlID8gcy5wYXJzZShzLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHRoaXMuYWN0b3IsIGEpIDogYSgpKTtcbiAgICAgIH1cbiAgICB9LCBsLnByb3RvdHlwZS5hYm9ydFRpbGUgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdmFyIHIgPSB0aGlzLmxvYWRpbmcsXG4gICAgICAgICAgaSA9IGUudWlkO1xuICAgICAgciAmJiByW2ldICYmIHJbaV0uYWJvcnQgJiYgKHJbaV0uYWJvcnQoKSwgZGVsZXRlIHJbaV0pLCB0KCk7XG4gICAgfSwgbC5wcm90b3R5cGUucmVtb3ZlVGlsZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgIGkgPSBlLnVpZDtcbiAgICAgIHIgJiYgcltpXSAmJiBkZWxldGUgcltpXSwgdCgpO1xuICAgIH07XG5cbiAgICB2YXIgdSA9IGUud2luZG93LkltYWdlQml0bWFwLFxuICAgICAgICBoID0gZnVuY3Rpb24gaCgpIHtcbiAgICAgIHRoaXMubG9hZGVkID0ge307XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGMoZSwgdCkge1xuICAgICAgaWYgKDAgIT09IGUubGVuZ3RoKSB7XG4gICAgICAgIHAoZVswXSwgdCk7XG5cbiAgICAgICAgZm9yICh2YXIgciA9IDE7IHIgPCBlLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgcChlW3JdLCAhdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwLCBpID0gMCwgbyA9IGUubGVuZ3RoLCBuID0gbyAtIDE7IGkgPCBvOyBuID0gaSsrKSB7XG4gICAgICAgIHIgKz0gKGVbaV1bMF0gLSBlW25dWzBdKSAqIChlW25dWzFdICsgZVtpXVsxXSk7XG4gICAgICB9XG5cbiAgICAgIHIgPj0gMCAhPSAhIXQgJiYgZS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgaC5wcm90b3R5cGUubG9hZFRpbGUgPSBmdW5jdGlvbiAodCwgcikge1xuICAgICAgdmFyIGkgPSB0LnVpZCxcbiAgICAgICAgICBvID0gdC5lbmNvZGluZyxcbiAgICAgICAgICBuID0gdC5yYXdJbWFnZURhdGEsXG4gICAgICAgICAgcyA9IHUgJiYgbiBpbnN0YW5jZW9mIHUgPyB0aGlzLmdldEltYWdlRGF0YShuKSA6IG4sXG4gICAgICAgICAgYSA9IG5ldyBlLkRFTURhdGEoaSwgcywgbyk7XG4gICAgICB0aGlzLmxvYWRlZCA9IHRoaXMubG9hZGVkIHx8IHt9LCB0aGlzLmxvYWRlZFtpXSA9IGEsIHIobnVsbCwgYSk7XG4gICAgfSwgaC5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzICYmIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dCB8fCAodGhpcy5vZmZzY3JlZW5DYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHQud2lkdGgsIHQuaGVpZ2h0KSwgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0ID0gdGhpcy5vZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpKSwgdGhpcy5vZmZzY3JlZW5DYW52YXMud2lkdGggPSB0LndpZHRoLCB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQgPSB0LmhlaWdodCwgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmRyYXdJbWFnZSh0LCAwLCAwLCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICB2YXIgciA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dC5nZXRJbWFnZURhdGEoLTEsIC0xLCB0LndpZHRoICsgMiwgdC5oZWlnaHQgKyAyKTtcbiAgICAgIHJldHVybiB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMub2Zmc2NyZWVuQ2FudmFzLndpZHRoLCB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQpLCBuZXcgZS5SR0JBSW1hZ2Uoe1xuICAgICAgICB3aWR0aDogci53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiByLmhlaWdodFxuICAgICAgfSwgci5kYXRhKTtcbiAgICB9LCBoLnByb3RvdHlwZS5yZW1vdmVUaWxlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgciA9IGUudWlkO1xuICAgICAgdCAmJiB0W3JdICYmIGRlbGV0ZSB0W3JdO1xuICAgIH07XG5cbiAgICB2YXIgZiA9IGUudmVjdG9yVGlsZS5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OLFxuICAgICAgICBkID0gZnVuY3Rpb24gZCh0KSB7XG4gICAgICB0aGlzLl9mZWF0dXJlID0gdCwgdGhpcy5leHRlbnQgPSBlLkVYVEVOVCwgdGhpcy50eXBlID0gdC50eXBlLCB0aGlzLnByb3BlcnRpZXMgPSB0LnRhZ3MsIFwiaWRcIiBpbiB0ICYmICFpc05hTih0LmlkKSAmJiAodGhpcy5pZCA9IHBhcnNlSW50KHQuaWQsIDEwKSk7XG4gICAgfTtcblxuICAgIGQucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgxID09PSB0aGlzLl9mZWF0dXJlLnR5cGUpIHtcbiAgICAgICAgZm9yICh2YXIgdCA9IFtdLCByID0gMCwgaSA9IHRoaXMuX2ZlYXR1cmUuZ2VvbWV0cnk7IHIgPCBpLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgdmFyIG8gPSBpW3JdO1xuICAgICAgICAgIHQucHVzaChbbmV3IGUuUG9pbnQkMShvWzBdLCBvWzFdKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSBbXSwgcyA9IDAsIGEgPSB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5OyBzIDwgYS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBsID0gW10sIHUgPSAwLCBoID0gYVtzXTsgdSA8IGgubGVuZ3RoOyB1ICs9IDEpIHtcbiAgICAgICAgICB2YXIgYyA9IGhbdV07XG4gICAgICAgICAgbC5wdXNoKG5ldyBlLlBvaW50JDEoY1swXSwgY1sxXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbi5wdXNoKGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9LCBkLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgcmV0dXJuIGYuY2FsbCh0aGlzLCBlLCB0LCByKTtcbiAgICB9O1xuXG4gICAgdmFyIGcgPSBmdW5jdGlvbiBnKHQpIHtcbiAgICAgIHRoaXMubGF5ZXJzID0ge1xuICAgICAgICBfZ2VvanNvblRpbGVMYXllcjogdGhpc1xuICAgICAgfSwgdGhpcy5uYW1lID0gXCJfZ2VvanNvblRpbGVMYXllclwiLCB0aGlzLmV4dGVudCA9IGUuRVhURU5ULCB0aGlzLmxlbmd0aCA9IHQubGVuZ3RoLCB0aGlzLl9mZWF0dXJlcyA9IHQ7XG4gICAgfTtcblxuICAgIGcucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIG5ldyBkKHRoaXMuX2ZlYXR1cmVzW2VdKTtcbiAgICB9O1xuXG4gICAgdmFyIHYgPSBlLnZlY3RvclRpbGUuVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgIG0gPSB5O1xuXG4gICAgZnVuY3Rpb24geShlLCB0KSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSB0IHx8IHt9LCB0aGlzLmZlYXR1cmVzID0gZSwgdGhpcy5sZW5ndGggPSBlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB4KGUsIHQpIHtcbiAgICAgIHRoaXMuaWQgPSBcIm51bWJlclwiID09IHR5cGVvZiBlLmlkID8gZS5pZCA6IHZvaWQgMCwgdGhpcy50eXBlID0gZS50eXBlLCB0aGlzLnJhd0dlb21ldHJ5ID0gMSA9PT0gZS50eXBlID8gW2UuZ2VvbWV0cnldIDogZS5nZW9tZXRyeSwgdGhpcy5wcm9wZXJ0aWVzID0gZS50YWdzLCB0aGlzLmV4dGVudCA9IHQgfHwgNDA5NjtcbiAgICB9XG5cbiAgICB5LnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBuZXcgeCh0aGlzLmZlYXR1cmVzW2VdLCB0aGlzLm9wdGlvbnMuZXh0ZW50KTtcbiAgICB9LCB4LnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMucmF3R2VvbWV0cnk7XG4gICAgICB0aGlzLmdlb21ldHJ5ID0gW107XG5cbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICBmb3IgKHZhciBpID0gdFtyXSwgbyA9IFtdLCBuID0gMDsgbiA8IGkubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICBvLnB1c2gobmV3IGUuUG9pbnQkMShpW25dWzBdLCBpW25dWzFdKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdlb21ldHJ5LnB1c2gobyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdlb21ldHJ5O1xuICAgIH0sIHgucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmdlb21ldHJ5IHx8IHRoaXMubG9hZEdlb21ldHJ5KCk7XG5cbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLmdlb21ldHJ5LCB0ID0gMSAvIDAsIHIgPSAtMSAvIDAsIGkgPSAxIC8gMCwgbyA9IC0xIC8gMCwgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAodmFyIHMgPSBlW25dLCBhID0gMDsgYSA8IHMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICB2YXIgbCA9IHNbYV07XG4gICAgICAgICAgdCA9IE1hdGgubWluKHQsIGwueCksIHIgPSBNYXRoLm1heChyLCBsLngpLCBpID0gTWF0aC5taW4oaSwgbC55KSwgbyA9IE1hdGgubWF4KG8sIGwueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFt0LCBpLCByLCBvXTtcbiAgICB9LCB4LnByb3RvdHlwZS50b0dlb0pTT04gPSB2LnByb3RvdHlwZS50b0dlb0pTT047XG4gICAgdmFyIHcgPSBJLFxuICAgICAgICBTID0gbTtcblxuICAgIGZ1bmN0aW9uIEkodCkge1xuICAgICAgdmFyIHIgPSBuZXcgZS5wYmYoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICBmb3IgKHZhciByIGluIGUubGF5ZXJzKSB7XG4gICAgICAgICAgdC53cml0ZU1lc3NhZ2UoMywgTSwgZS5sYXllcnNbcl0pO1xuICAgICAgICB9XG4gICAgICB9KHQsIHIpLCByLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE0oZSwgdCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0LndyaXRlVmFyaW50RmllbGQoMTUsIGUudmVyc2lvbiB8fCAxKSwgdC53cml0ZVN0cmluZ0ZpZWxkKDEsIGUubmFtZSB8fCBcIlwiKSwgdC53cml0ZVZhcmludEZpZWxkKDUsIGUuZXh0ZW50IHx8IDQwOTYpO1xuICAgICAgdmFyIGkgPSB7XG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICBrZXljYWNoZToge30sXG4gICAgICAgIHZhbHVlY2FjaGU6IHt9XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICBpLmZlYXR1cmUgPSBlLmZlYXR1cmUociksIHQud3JpdGVNZXNzYWdlKDIsIGIsIGkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbyA9IGkua2V5cztcblxuICAgICAgZm9yIChyID0gMDsgciA8IG8ubGVuZ3RoOyByKyspIHtcbiAgICAgICAgdC53cml0ZVN0cmluZ0ZpZWxkKDMsIG9bcl0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbiA9IGkudmFsdWVzO1xuXG4gICAgICBmb3IgKHIgPSAwOyByIDwgbi5sZW5ndGg7IHIrKykge1xuICAgICAgICB0LndyaXRlTWVzc2FnZSg0LCBDLCBuW3JdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS5mZWF0dXJlO1xuICAgICAgdm9pZCAwICE9PSByLmlkICYmIHQud3JpdGVWYXJpbnRGaWVsZCgxLCByLmlkKSwgdC53cml0ZU1lc3NhZ2UoMiwgXywgZSksIHQud3JpdGVWYXJpbnRGaWVsZCgzLCByLnR5cGUpLCB0LndyaXRlTWVzc2FnZSg0LCBULCByKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS5mZWF0dXJlLFxuICAgICAgICAgIGkgPSBlLmtleXMsXG4gICAgICAgICAgbyA9IGUudmFsdWVzLFxuICAgICAgICAgIG4gPSBlLmtleWNhY2hlLFxuICAgICAgICAgIHMgPSBlLnZhbHVlY2FjaGU7XG5cbiAgICAgIGZvciAodmFyIGEgaW4gci5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIHZhciBsID0gblthXTtcbiAgICAgICAgdm9pZCAwID09PSBsICYmIChpLnB1c2goYSksIG5bYV0gPSBsID0gaS5sZW5ndGggLSAxKSwgdC53cml0ZVZhcmludChsKTtcbiAgICAgICAgdmFyIHUgPSByLnByb3BlcnRpZXNbYV0sXG4gICAgICAgICAgICBoID0gdHlwZW9mIHU7XG4gICAgICAgIFwic3RyaW5nXCIgIT09IGggJiYgXCJib29sZWFuXCIgIT09IGggJiYgXCJudW1iZXJcIiAhPT0gaCAmJiAodSA9IEpTT04uc3RyaW5naWZ5KHUpKTtcbiAgICAgICAgdmFyIGMgPSBoICsgXCI6XCIgKyB1LFxuICAgICAgICAgICAgcCA9IHNbY107XG4gICAgICAgIHZvaWQgMCA9PT0gcCAmJiAoby5wdXNoKHUpLCBzW2NdID0gcCA9IG8ubGVuZ3RoIC0gMSksIHQud3JpdGVWYXJpbnQocCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gayhlLCB0KSB7XG4gICAgICByZXR1cm4gKHQgPDwgMykgKyAoNyAmIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFAoZSkge1xuICAgICAgcmV0dXJuIGUgPDwgMSBeIGUgPj4gMzE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVChlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gZS5sb2FkR2VvbWV0cnkoKSwgaSA9IGUudHlwZSwgbyA9IDAsIG4gPSAwLCBzID0gci5sZW5ndGgsIGEgPSAwOyBhIDwgczsgYSsrKSB7XG4gICAgICAgIHZhciBsID0gclthXSxcbiAgICAgICAgICAgIHUgPSAxO1xuICAgICAgICAxID09PSBpICYmICh1ID0gbC5sZW5ndGgpLCB0LndyaXRlVmFyaW50KGsoMSwgdSkpO1xuXG4gICAgICAgIGZvciAodmFyIGggPSAzID09PSBpID8gbC5sZW5ndGggLSAxIDogbC5sZW5ndGgsIGMgPSAwOyBjIDwgaDsgYysrKSB7XG4gICAgICAgICAgMSA9PT0gYyAmJiAxICE9PSBpICYmIHQud3JpdGVWYXJpbnQoaygyLCBoIC0gMSkpO1xuICAgICAgICAgIHZhciBwID0gbFtjXS54IC0gbyxcbiAgICAgICAgICAgICAgZiA9IGxbY10ueSAtIG47XG4gICAgICAgICAgdC53cml0ZVZhcmludChQKHApKSwgdC53cml0ZVZhcmludChQKGYpKSwgbyArPSBwLCBuICs9IGY7XG4gICAgICAgIH1cblxuICAgICAgICAzID09PSBpICYmIHQud3JpdGVWYXJpbnQoayg3LCAxKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQyhlLCB0KSB7XG4gICAgICB2YXIgciA9IHR5cGVvZiBlO1xuICAgICAgXCJzdHJpbmdcIiA9PT0gciA/IHQud3JpdGVTdHJpbmdGaWVsZCgxLCBlKSA6IFwiYm9vbGVhblwiID09PSByID8gdC53cml0ZUJvb2xlYW5GaWVsZCg3LCBlKSA6IFwibnVtYmVyXCIgPT09IHIgJiYgKGUgJSAxICE9IDAgPyB0LndyaXRlRG91YmxlRmllbGQoMywgZSkgOiBlIDwgMCA/IHQud3JpdGVTVmFyaW50RmllbGQoNiwgZSkgOiB0LndyaXRlVmFyaW50RmllbGQoNSwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEQoZSwgdCwgciwgaSkge1xuICAgICAgTChlLCByLCBpKSwgTCh0LCAyICogciwgMiAqIGkpLCBMKHQsIDIgKiByICsgMSwgMiAqIGkgKyAxKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMKGUsIHQsIHIpIHtcbiAgICAgIHZhciBpID0gZVt0XTtcbiAgICAgIGVbdF0gPSBlW3JdLCBlW3JdID0gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6KGUsIHQsIHIsIGkpIHtcbiAgICAgIHZhciBvID0gZSAtIHIsXG4gICAgICAgICAgbiA9IHQgLSBpO1xuICAgICAgcmV0dXJuIG8gKiBvICsgbiAqIG47XG4gICAgfVxuXG4gICAgdy5mcm9tVmVjdG9yVGlsZUpzID0gSSwgdy5mcm9tR2VvanNvblZ0ID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHQgPSB0IHx8IHt9O1xuICAgICAgdmFyIHIgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiBlKSB7XG4gICAgICAgIHJbaV0gPSBuZXcgbShlW2ldLmZlYXR1cmVzLCB0KSwgcltpXS5uYW1lID0gaSwgcltpXS52ZXJzaW9uID0gdC52ZXJzaW9uLCByW2ldLmV4dGVudCA9IHQuZXh0ZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gSSh7XG4gICAgICAgIGxheWVyczogclxuICAgICAgfSk7XG4gICAgfSwgdy5HZW9KU09OV3JhcHBlciA9IFM7XG5cbiAgICB2YXIgTyA9IGZ1bmN0aW9uIE8oZSkge1xuICAgICAgcmV0dXJuIGVbMF07XG4gICAgfSxcbiAgICAgICAgRSA9IGZ1bmN0aW9uIEUoZSkge1xuICAgICAgcmV0dXJuIGVbMV07XG4gICAgfSxcbiAgICAgICAgRiA9IGZ1bmN0aW9uIEYoZSwgdCwgciwgaSwgbykge1xuICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gTyksIHZvaWQgMCA9PT0gciAmJiAociA9IEUpLCB2b2lkIDAgPT09IGkgJiYgKGkgPSA2NCksIHZvaWQgMCA9PT0gbyAmJiAobyA9IEZsb2F0NjRBcnJheSksIHRoaXMubm9kZVNpemUgPSBpLCB0aGlzLnBvaW50cyA9IGU7XG5cbiAgICAgIGZvciAodmFyIG4gPSBlLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheSwgcyA9IHRoaXMuaWRzID0gbmV3IG4oZS5sZW5ndGgpLCBhID0gdGhpcy5jb29yZHMgPSBuZXcgbygyICogZS5sZW5ndGgpLCBsID0gMDsgbCA8IGUubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgc1tsXSA9IGwsIGFbMiAqIGxdID0gdChlW2xdKSwgYVsyICogbCArIDFdID0gcihlW2xdKTtcbiAgICAgIH1cblxuICAgICAgIWZ1bmN0aW9uIGUodCwgciwgaSwgbywgbiwgcykge1xuICAgICAgICBpZiAoIShuIC0gbyA8PSBpKSkge1xuICAgICAgICAgIHZhciBhID0gbyArIG4gPj4gMTtcbiAgICAgICAgICAhZnVuY3Rpb24gZSh0LCByLCBpLCBvLCBuLCBzKSB7XG4gICAgICAgICAgICBmb3IgKDsgbiA+IG87KSB7XG4gICAgICAgICAgICAgIGlmIChuIC0gbyA+IDYwMCkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gbiAtIG8gKyAxLFxuICAgICAgICAgICAgICAgICAgICBsID0gaSAtIG8gKyAxLFxuICAgICAgICAgICAgICAgICAgICB1ID0gTWF0aC5sb2coYSksXG4gICAgICAgICAgICAgICAgICAgIGggPSAuNSAqIE1hdGguZXhwKDIgKiB1IC8gMyksXG4gICAgICAgICAgICAgICAgICAgIGMgPSAuNSAqIE1hdGguc3FydCh1ICogaCAqIChhIC0gaCkgLyBhKSAqIChsIC0gYSAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBlKHQsIHIsIGksIE1hdGgubWF4KG8sIE1hdGguZmxvb3IoaSAtIGwgKiBoIC8gYSArIGMpKSwgTWF0aC5taW4obiwgTWF0aC5mbG9vcihpICsgKGEgLSBsKSAqIGggLyBhICsgYykpLCBzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBwID0gclsyICogaSArIHNdLFxuICAgICAgICAgICAgICAgICAgZiA9IG8sXG4gICAgICAgICAgICAgICAgICBkID0gbjtcblxuICAgICAgICAgICAgICBmb3IgKEQodCwgciwgbywgaSksIHJbMiAqIG4gKyBzXSA+IHAgJiYgRCh0LCByLCBvLCBuKTsgZiA8IGQ7KSB7XG4gICAgICAgICAgICAgICAgZm9yIChEKHQsIHIsIGYsIGQpLCBmKyssIGQtLTsgclsyICogZiArIHNdIDwgcDspIHtcbiAgICAgICAgICAgICAgICAgIGYrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKDsgclsyICogZCArIHNdID4gcDspIHtcbiAgICAgICAgICAgICAgICAgIGQtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByWzIgKiBvICsgc10gPT09IHAgPyBEKHQsIHIsIG8sIGQpIDogRCh0LCByLCArK2QsIG4pLCBkIDw9IGkgJiYgKG8gPSBkICsgMSksIGkgPD0gZCAmJiAobiA9IGQgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KHQsIHIsIGEsIG8sIG4sIHMgJSAyKSwgZSh0LCByLCBpLCBvLCBhIC0gMSwgcyArIDEpLCBlKHQsIHIsIGksIGEgKyAxLCBuLCBzICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0ocywgYSwgaSwgMCwgcy5sZW5ndGggLSAxLCAwKTtcbiAgICB9O1xuXG4gICAgRi5wcm90b3R5cGUucmFuZ2UgPSBmdW5jdGlvbiAoZSwgdCwgciwgaSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCByLCBpLCBvLCBuLCBzKSB7XG4gICAgICAgIGZvciAodmFyIGEsIGwsIHUgPSBbMCwgZS5sZW5ndGggLSAxLCAwXSwgaCA9IFtdOyB1Lmxlbmd0aDspIHtcbiAgICAgICAgICB2YXIgYyA9IHUucG9wKCksXG4gICAgICAgICAgICAgIHAgPSB1LnBvcCgpLFxuICAgICAgICAgICAgICBmID0gdS5wb3AoKTtcbiAgICAgICAgICBpZiAocCAtIGYgPD0gcykgZm9yICh2YXIgZCA9IGY7IGQgPD0gcDsgZCsrKSB7XG4gICAgICAgICAgICBsID0gdFsyICogZCArIDFdLCAoYSA9IHRbMiAqIGRdKSA+PSByICYmIGEgPD0gbyAmJiBsID49IGkgJiYgbCA8PSBuICYmIGgucHVzaChlW2RdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGcgPSBNYXRoLmZsb29yKChmICsgcCkgLyAyKTtcbiAgICAgICAgICAgIGwgPSB0WzIgKiBnICsgMV0sIChhID0gdFsyICogZ10pID49IHIgJiYgYSA8PSBvICYmIGwgPj0gaSAmJiBsIDw9IG4gJiYgaC5wdXNoKGVbZ10pO1xuICAgICAgICAgICAgdmFyIHYgPSAoYyArIDEpICUgMjtcbiAgICAgICAgICAgICgwID09PSBjID8gciA8PSBhIDogaSA8PSBsKSAmJiAodS5wdXNoKGYpLCB1LnB1c2goZyAtIDEpLCB1LnB1c2godikpLCAoMCA9PT0gYyA/IG8gPj0gYSA6IG4gPj0gbCkgJiYgKHUucHVzaChnICsgMSksIHUucHVzaChwKSwgdS5wdXNoKHYpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH0odGhpcy5pZHMsIHRoaXMuY29vcmRzLCBlLCB0LCByLCBpLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9LCBGLnByb3RvdHlwZS53aXRoaW4gPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCByLCBpLCBvLCBuKSB7XG4gICAgICAgIGZvciAodmFyIHMgPSBbMCwgZS5sZW5ndGggLSAxLCAwXSwgYSA9IFtdLCBsID0gbyAqIG87IHMubGVuZ3RoOykge1xuICAgICAgICAgIHZhciB1ID0gcy5wb3AoKSxcbiAgICAgICAgICAgICAgaCA9IHMucG9wKCksXG4gICAgICAgICAgICAgIGMgPSBzLnBvcCgpO1xuICAgICAgICAgIGlmIChoIC0gYyA8PSBuKSBmb3IgKHZhciBwID0gYzsgcCA8PSBoOyBwKyspIHtcbiAgICAgICAgICAgIHoodFsyICogcF0sIHRbMiAqIHAgKyAxXSwgciwgaSkgPD0gbCAmJiBhLnB1c2goZVtwXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmID0gTWF0aC5mbG9vcigoYyArIGgpIC8gMiksXG4gICAgICAgICAgICAgICAgZCA9IHRbMiAqIGZdLFxuICAgICAgICAgICAgICAgIGcgPSB0WzIgKiBmICsgMV07XG4gICAgICAgICAgICB6KGQsIGcsIHIsIGkpIDw9IGwgJiYgYS5wdXNoKGVbZl0pO1xuICAgICAgICAgICAgdmFyIHYgPSAodSArIDEpICUgMjtcbiAgICAgICAgICAgICgwID09PSB1ID8gciAtIG8gPD0gZCA6IGkgLSBvIDw9IGcpICYmIChzLnB1c2goYyksIHMucHVzaChmIC0gMSksIHMucHVzaCh2KSksICgwID09PSB1ID8gciArIG8gPj0gZCA6IGkgKyBvID49IGcpICYmIChzLnB1c2goZiArIDEpLCBzLnB1c2goaCksIHMucHVzaCh2KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9KHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgZSwgdCwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfTtcblxuICAgIHZhciBOID0ge1xuICAgICAgbWluWm9vbTogMCxcbiAgICAgIG1heFpvb206IDE2LFxuICAgICAgbWluUG9pbnRzOiAyLFxuICAgICAgcmFkaXVzOiA0MCxcbiAgICAgIGV4dGVudDogNTEyLFxuICAgICAgbm9kZVNpemU6IDY0LFxuICAgICAgbG9nOiAhMSxcbiAgICAgIGdlbmVyYXRlSWQ6ICExLFxuICAgICAgcmVkdWNlOiBudWxsLFxuICAgICAgbWFwOiBmdW5jdGlvbiBtYXAoZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBKID0gZnVuY3Rpb24gSihlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBWKE9iamVjdC5jcmVhdGUoTiksIGUpLCB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFooZSwgdCwgciwgaSwgbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogZSxcbiAgICAgICAgeTogdCxcbiAgICAgICAgem9vbTogMSAvIDAsXG4gICAgICAgIGlkOiByLFxuICAgICAgICBwYXJlbnRJZDogLTEsXG4gICAgICAgIG51bVBvaW50czogaSxcbiAgICAgICAgcHJvcGVydGllczogb1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBKGUsIHQpIHtcbiAgICAgIHZhciByID0gZS5nZW9tZXRyeS5jb29yZGluYXRlcyxcbiAgICAgICAgICBpID0gclsxXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IFkoclswXSksXG4gICAgICAgIHk6IGooaSksXG4gICAgICAgIHpvb206IDEgLyAwLFxuICAgICAgICBpbmRleDogdCxcbiAgICAgICAgcGFyZW50SWQ6IC0xXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEIoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGlkOiBlLmlkLFxuICAgICAgICBwcm9wZXJ0aWVzOiBHKGUpLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgIHR5cGU6IFwiUG9pbnRcIixcbiAgICAgICAgICBjb29yZGluYXRlczogWyhpID0gZS54LCAzNjAgKiAoaSAtIC41KSksICh0ID0gZS55LCByID0gKDE4MCAtIDM2MCAqIHQpICogTWF0aC5QSSAvIDE4MCwgMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHIpKSAvIE1hdGguUEkgLSA5MCldXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgdCwgciwgaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHKGUpIHtcbiAgICAgIHZhciB0ID0gZS5udW1Qb2ludHMsXG4gICAgICAgICAgciA9IHQgPj0gMWU0ID8gTWF0aC5yb3VuZCh0IC8gMWUzKSArIFwia1wiIDogdCA+PSAxZTMgPyBNYXRoLnJvdW5kKHQgLyAxMDApIC8gMTAgKyBcImtcIiA6IHQ7XG4gICAgICByZXR1cm4gVihWKHt9LCBlLnByb3BlcnRpZXMpLCB7XG4gICAgICAgIGNsdXN0ZXI6ICEwLFxuICAgICAgICBjbHVzdGVyX2lkOiBlLmlkLFxuICAgICAgICBwb2ludF9jb3VudDogdCxcbiAgICAgICAgcG9pbnRfY291bnRfYWJicmV2aWF0ZWQ6IHJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFkoZSkge1xuICAgICAgcmV0dXJuIGUgLyAzNjAgKyAuNTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqKGUpIHtcbiAgICAgIHZhciB0ID0gTWF0aC5zaW4oZSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICAgIHIgPSAuNSAtIC4yNSAqIE1hdGgubG9nKCgxICsgdCkgLyAoMSAtIHQpKSAvIE1hdGguUEk7XG4gICAgICByZXR1cm4gciA8IDAgPyAwIDogciA+IDEgPyAxIDogcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBWKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkge1xuICAgICAgICBlW3JdID0gdFtyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gWChlKSB7XG4gICAgICByZXR1cm4gZS54O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFcoZSkge1xuICAgICAgcmV0dXJuIGUueTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBSKGUsIHQsIHIsIGksIG8sIG4pIHtcbiAgICAgIHZhciBzID0gbyAtIHIsXG4gICAgICAgICAgYSA9IG4gLSBpO1xuXG4gICAgICBpZiAoMCAhPT0gcyB8fCAwICE9PSBhKSB7XG4gICAgICAgIHZhciBsID0gKChlIC0gcikgKiBzICsgKHQgLSBpKSAqIGEpIC8gKHMgKiBzICsgYSAqIGEpO1xuICAgICAgICBsID4gMSA/IChyID0gbywgaSA9IG4pIDogbCA+IDAgJiYgKHIgKz0gcyAqIGwsIGkgKz0gYSAqIGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHMgPSBlIC0gcikgKiBzICsgKGEgPSB0IC0gaSkgKiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHEoZSwgdCwgciwgaSkge1xuICAgICAgdmFyIG8gPSB7XG4gICAgICAgIGlkOiB2b2lkIDAgPT09IGUgPyBudWxsIDogZSxcbiAgICAgICAgdHlwZTogdCxcbiAgICAgICAgZ2VvbWV0cnk6IHIsXG4gICAgICAgIHRhZ3M6IGksXG4gICAgICAgIG1pblg6IDEgLyAwLFxuICAgICAgICBtaW5ZOiAxIC8gMCxcbiAgICAgICAgbWF4WDogLTEgLyAwLFxuICAgICAgICBtYXhZOiAtMSAvIDBcbiAgICAgIH07XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHQgPSBlLmdlb21ldHJ5LFxuICAgICAgICAgICAgciA9IGUudHlwZTtcbiAgICAgICAgaWYgKFwiUG9pbnRcIiA9PT0gciB8fCBcIk11bHRpUG9pbnRcIiA9PT0gciB8fCBcIkxpbmVTdHJpbmdcIiA9PT0gcikgVShlLCB0KTtlbHNlIGlmIChcIlBvbHlnb25cIiA9PT0gciB8fCBcIk11bHRpTGluZVN0cmluZ1wiID09PSByKSBmb3IgKHZhciBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBVKGUsIHRbaV0pO1xuICAgICAgICB9IGVsc2UgaWYgKFwiTXVsdGlQb2x5Z29uXCIgPT09IHIpIGZvciAoaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0W2ldLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgICBVKGUsIHRbaV1bb10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfShvKSwgbztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBVKGUsIHQpIHtcbiAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIgKz0gMykge1xuICAgICAgICBlLm1pblggPSBNYXRoLm1pbihlLm1pblgsIHRbcl0pLCBlLm1pblkgPSBNYXRoLm1pbihlLm1pblksIHRbciArIDFdKSwgZS5tYXhYID0gTWF0aC5tYXgoZS5tYXhYLCB0W3JdKSwgZS5tYXhZID0gTWF0aC5tYXgoZS5tYXhZLCB0W3IgKyAxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJChlLCB0LCByLCBpKSB7XG4gICAgICBpZiAodC5nZW9tZXRyeSkge1xuICAgICAgICB2YXIgbyA9IHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsXG4gICAgICAgICAgICBuID0gdC5nZW9tZXRyeS50eXBlLFxuICAgICAgICAgICAgcyA9IE1hdGgucG93KHIudG9sZXJhbmNlIC8gKCgxIDw8IHIubWF4Wm9vbSkgKiByLmV4dGVudCksIDIpLFxuICAgICAgICAgICAgYSA9IFtdLFxuICAgICAgICAgICAgbCA9IHQuaWQ7XG4gICAgICAgIGlmIChyLnByb21vdGVJZCA/IGwgPSB0LnByb3BlcnRpZXNbci5wcm9tb3RlSWRdIDogci5nZW5lcmF0ZUlkICYmIChsID0gaSB8fCAwKSwgXCJQb2ludFwiID09PSBuKSBIKG8sIGEpO2Vsc2UgaWYgKFwiTXVsdGlQb2ludFwiID09PSBuKSBmb3IgKHZhciB1ID0gMDsgdSA8IG8ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICBIKG9bdV0sIGEpO1xuICAgICAgICB9IGVsc2UgaWYgKFwiTGluZVN0cmluZ1wiID09PSBuKSBLKG8sIGEsIHMsICExKTtlbHNlIGlmIChcIk11bHRpTGluZVN0cmluZ1wiID09PSBuKSB7XG4gICAgICAgICAgaWYgKHIubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCBvLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgIEsob1t1XSwgYSA9IFtdLCBzLCAhMSksIGUucHVzaChxKGwsIFwiTGluZVN0cmluZ1wiLCBhLCB0LnByb3BlcnRpZXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIFEobywgYSwgcywgITEpO1xuICAgICAgICB9IGVsc2UgaWYgKFwiUG9seWdvblwiID09PSBuKSBRKG8sIGEsIHMsICEwKTtlbHNlIHtcbiAgICAgICAgICBpZiAoXCJNdWx0aVBvbHlnb25cIiAhPT0gbikge1xuICAgICAgICAgICAgaWYgKFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIgPT09IG4pIHtcbiAgICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHQuZ2VvbWV0cnkuZ2VvbWV0cmllcy5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICQoZSwge1xuICAgICAgICAgICAgICAgICAgaWQ6IGwsXG4gICAgICAgICAgICAgICAgICBnZW9tZXRyeTogdC5nZW9tZXRyeS5nZW9tZXRyaWVzW3VdLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogdC5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgfSwgciwgaSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodSA9IDA7IHUgPCBvLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICB2YXIgaCA9IFtdO1xuICAgICAgICAgICAgUShvW3VdLCBoLCBzLCAhMCksIGEucHVzaChoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZS5wdXNoKHEobCwgbiwgYSwgdC5wcm9wZXJ0aWVzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSChlLCB0KSB7XG4gICAgICB0LnB1c2goZWUoZVswXSkpLCB0LnB1c2godGUoZVsxXSkpLCB0LnB1c2goMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSyhlLCB0LCByLCBpKSB7XG4gICAgICBmb3IgKHZhciBvLCBuLCBzID0gMCwgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBsID0gZWUoZVthXVswXSksXG4gICAgICAgICAgICB1ID0gdGUoZVthXVsxXSk7XG4gICAgICAgIHQucHVzaChsKSwgdC5wdXNoKHUpLCB0LnB1c2goMCksIGEgPiAwICYmIChzICs9IGkgPyAobyAqIHUgLSBsICogbikgLyAyIDogTWF0aC5zcXJ0KE1hdGgucG93KGwgLSBvLCAyKSArIE1hdGgucG93KHUgLSBuLCAyKSkpLCBvID0gbCwgbiA9IHU7XG4gICAgICB9XG5cbiAgICAgIHZhciBoID0gdC5sZW5ndGggLSAzO1xuICAgICAgdFsyXSA9IDEsIGZ1bmN0aW9uIGUodCwgciwgaSwgbykge1xuICAgICAgICBmb3IgKHZhciBuLCBzID0gbywgYSA9IGkgLSByID4+IDEsIGwgPSBpIC0gciwgdSA9IHRbcl0sIGggPSB0W3IgKyAxXSwgYyA9IHRbaV0sIHAgPSB0W2kgKyAxXSwgZiA9IHIgKyAzOyBmIDwgaTsgZiArPSAzKSB7XG4gICAgICAgICAgdmFyIGQgPSBSKHRbZl0sIHRbZiArIDFdLCB1LCBoLCBjLCBwKTtcbiAgICAgICAgICBpZiAoZCA+IHMpIG4gPSBmLCBzID0gZDtlbHNlIGlmIChkID09PSBzKSB7XG4gICAgICAgICAgICB2YXIgZyA9IE1hdGguYWJzKGYgLSBhKTtcbiAgICAgICAgICAgIGcgPCBsICYmIChuID0gZiwgbCA9IGcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHMgPiBvICYmIChuIC0gciA+IDMgJiYgZSh0LCByLCBuLCBvKSwgdFtuICsgMl0gPSBzLCBpIC0gbiA+IDMgJiYgZSh0LCBuLCBpLCBvKSk7XG4gICAgICB9KHQsIDAsIGgsIHIpLCB0W2ggKyAyXSA9IDEsIHQuc2l6ZSA9IE1hdGguYWJzKHMpLCB0LnN0YXJ0ID0gMCwgdC5lbmQgPSB0LnNpemU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUShlLCB0LCByLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgdmFyIG4gPSBbXTtcbiAgICAgICAgSyhlW29dLCBuLCByLCBpKSwgdC5wdXNoKG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVlKGUpIHtcbiAgICAgIHJldHVybiBlIC8gMzYwICsgLjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGUoZSkge1xuICAgICAgdmFyIHQgPSBNYXRoLnNpbihlICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgICAgciA9IC41IC0gLjI1ICogTWF0aC5sb2coKDEgKyB0KSAvICgxIC0gdCkpIC8gTWF0aC5QSTtcbiAgICAgIHJldHVybiByIDwgMCA/IDAgOiByID4gMSA/IDEgOiByO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlKGUsIHQsIHIsIGksIG8sIG4sIHMsIGEpIHtcbiAgICAgIGlmIChpIC89IHQsIG4gPj0gKHIgLz0gdCkgJiYgcyA8IGkpIHJldHVybiBlO1xuICAgICAgaWYgKHMgPCByIHx8IG4gPj0gaSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGZvciAodmFyIGwgPSBbXSwgdSA9IDA7IHUgPCBlLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIHZhciBoID0gZVt1XSxcbiAgICAgICAgICAgIGMgPSBoLmdlb21ldHJ5LFxuICAgICAgICAgICAgcCA9IGgudHlwZSxcbiAgICAgICAgICAgIGYgPSAwID09PSBvID8gaC5taW5YIDogaC5taW5ZLFxuICAgICAgICAgICAgZCA9IDAgPT09IG8gPyBoLm1heFggOiBoLm1heFk7XG4gICAgICAgIGlmIChmID49IHIgJiYgZCA8IGkpIGwucHVzaChoKTtlbHNlIGlmICghKGQgPCByIHx8IGYgPj0gaSkpIHtcbiAgICAgICAgICB2YXIgZyA9IFtdO1xuICAgICAgICAgIGlmIChcIlBvaW50XCIgPT09IHAgfHwgXCJNdWx0aVBvaW50XCIgPT09IHApIGllKGMsIGcsIHIsIGksIG8pO2Vsc2UgaWYgKFwiTGluZVN0cmluZ1wiID09PSBwKSBvZShjLCBnLCByLCBpLCBvLCAhMSwgYS5saW5lTWV0cmljcyk7ZWxzZSBpZiAoXCJNdWx0aUxpbmVTdHJpbmdcIiA9PT0gcCkgc2UoYywgZywgciwgaSwgbywgITEpO2Vsc2UgaWYgKFwiUG9seWdvblwiID09PSBwKSBzZShjLCBnLCByLCBpLCBvLCAhMCk7ZWxzZSBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gcCkgZm9yICh2YXIgdiA9IDA7IHYgPCBjLmxlbmd0aDsgdisrKSB7XG4gICAgICAgICAgICB2YXIgbSA9IFtdO1xuICAgICAgICAgICAgc2UoY1t2XSwgbSwgciwgaSwgbywgITApLCBtLmxlbmd0aCAmJiBnLnB1c2gobSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGcubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoYS5saW5lTWV0cmljcyAmJiBcIkxpbmVTdHJpbmdcIiA9PT0gcCkge1xuICAgICAgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgZy5sZW5ndGg7IHYrKykge1xuICAgICAgICAgICAgICAgIGwucHVzaChxKGguaWQsIHAsIGdbdl0sIGgudGFncykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFwiTGluZVN0cmluZ1wiICE9PSBwICYmIFwiTXVsdGlMaW5lU3RyaW5nXCIgIT09IHAgfHwgKDEgPT09IGcubGVuZ3RoID8gKHAgPSBcIkxpbmVTdHJpbmdcIiwgZyA9IGdbMF0pIDogcCA9IFwiTXVsdGlMaW5lU3RyaW5nXCIpLCBcIlBvaW50XCIgIT09IHAgJiYgXCJNdWx0aVBvaW50XCIgIT09IHAgfHwgKHAgPSAzID09PSBnLmxlbmd0aCA/IFwiUG9pbnRcIiA6IFwiTXVsdGlQb2ludFwiKSwgbC5wdXNoKHEoaC5pZCwgcCwgZywgaC50YWdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsLmxlbmd0aCA/IGwgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGllKGUsIHQsIHIsIGksIG8pIHtcbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4gKz0gMykge1xuICAgICAgICB2YXIgcyA9IGVbbiArIG9dO1xuICAgICAgICBzID49IHIgJiYgcyA8PSBpICYmICh0LnB1c2goZVtuXSksIHQucHVzaChlW24gKyAxXSksIHQucHVzaChlW24gKyAyXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9lKGUsIHQsIHIsIGksIG8sIG4sIHMpIHtcbiAgICAgIGZvciAodmFyIGEsIGwsIHUgPSBuZShlKSwgaCA9IDAgPT09IG8gPyBsZSA6IHVlLCBjID0gZS5zdGFydCwgcCA9IDA7IHAgPCBlLmxlbmd0aCAtIDM7IHAgKz0gMykge1xuICAgICAgICB2YXIgZiA9IGVbcF0sXG4gICAgICAgICAgICBkID0gZVtwICsgMV0sXG4gICAgICAgICAgICBnID0gZVtwICsgMl0sXG4gICAgICAgICAgICB2ID0gZVtwICsgM10sXG4gICAgICAgICAgICBtID0gZVtwICsgNF0sXG4gICAgICAgICAgICB5ID0gMCA9PT0gbyA/IGYgOiBkLFxuICAgICAgICAgICAgeCA9IDAgPT09IG8gPyB2IDogbSxcbiAgICAgICAgICAgIHcgPSAhMTtcbiAgICAgICAgcyAmJiAoYSA9IE1hdGguc3FydChNYXRoLnBvdyhmIC0gdiwgMikgKyBNYXRoLnBvdyhkIC0gbSwgMikpKSwgeSA8IHIgPyB4ID4gciAmJiAobCA9IGgodSwgZiwgZCwgdiwgbSwgciksIHMgJiYgKHUuc3RhcnQgPSBjICsgYSAqIGwpKSA6IHkgPiBpID8geCA8IGkgJiYgKGwgPSBoKHUsIGYsIGQsIHYsIG0sIGkpLCBzICYmICh1LnN0YXJ0ID0gYyArIGEgKiBsKSkgOiBhZSh1LCBmLCBkLCBnKSwgeCA8IHIgJiYgeSA+PSByICYmIChsID0gaCh1LCBmLCBkLCB2LCBtLCByKSwgdyA9ICEwKSwgeCA+IGkgJiYgeSA8PSBpICYmIChsID0gaCh1LCBmLCBkLCB2LCBtLCBpKSwgdyA9ICEwKSwgIW4gJiYgdyAmJiAocyAmJiAodS5lbmQgPSBjICsgYSAqIGwpLCB0LnB1c2godSksIHUgPSBuZShlKSksIHMgJiYgKGMgKz0gYSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBTID0gZS5sZW5ndGggLSAzO1xuICAgICAgZiA9IGVbU10sIGQgPSBlW1MgKyAxXSwgZyA9IGVbUyArIDJdLCAoeSA9IDAgPT09IG8gPyBmIDogZCkgPj0gciAmJiB5IDw9IGkgJiYgYWUodSwgZiwgZCwgZyksIFMgPSB1Lmxlbmd0aCAtIDMsIG4gJiYgUyA+PSAzICYmICh1W1NdICE9PSB1WzBdIHx8IHVbUyArIDFdICE9PSB1WzFdKSAmJiBhZSh1LCB1WzBdLCB1WzFdLCB1WzJdKSwgdS5sZW5ndGggJiYgdC5wdXNoKHUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5lKGUpIHtcbiAgICAgIHZhciB0ID0gW107XG4gICAgICByZXR1cm4gdC5zaXplID0gZS5zaXplLCB0LnN0YXJ0ID0gZS5zdGFydCwgdC5lbmQgPSBlLmVuZCwgdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZShlLCB0LCByLCBpLCBvLCBuKSB7XG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IGUubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgb2UoZVtzXSwgdCwgciwgaSwgbywgbiwgITEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFlKGUsIHQsIHIsIGkpIHtcbiAgICAgIGUucHVzaCh0KSwgZS5wdXNoKHIpLCBlLnB1c2goaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGUoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgdmFyIHMgPSAobiAtIHQpIC8gKGkgLSB0KTtcbiAgICAgIHJldHVybiBlLnB1c2gobiksIGUucHVzaChyICsgKG8gLSByKSAqIHMpLCBlLnB1c2goMSksIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWUoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgdmFyIHMgPSAobiAtIHIpIC8gKG8gLSByKTtcbiAgICAgIHJldHVybiBlLnB1c2godCArIChpIC0gdCkgKiBzKSwgZS5wdXNoKG4pLCBlLnB1c2goMSksIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGUoZSwgdCkge1xuICAgICAgZm9yICh2YXIgciA9IFtdLCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG8sXG4gICAgICAgICAgICBuID0gZVtpXSxcbiAgICAgICAgICAgIHMgPSBuLnR5cGU7XG4gICAgICAgIGlmIChcIlBvaW50XCIgPT09IHMgfHwgXCJNdWx0aVBvaW50XCIgPT09IHMgfHwgXCJMaW5lU3RyaW5nXCIgPT09IHMpIG8gPSBjZShuLmdlb21ldHJ5LCB0KTtlbHNlIGlmIChcIk11bHRpTGluZVN0cmluZ1wiID09PSBzIHx8IFwiUG9seWdvblwiID09PSBzKSB7XG4gICAgICAgICAgbyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBuLmdlb21ldHJ5Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBvLnB1c2goY2Uobi5nZW9tZXRyeVthXSwgdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcIk11bHRpUG9seWdvblwiID09PSBzKSBmb3IgKG8gPSBbXSwgYSA9IDA7IGEgPCBuLmdlb21ldHJ5Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgZm9yICh2YXIgbCA9IFtdLCB1ID0gMDsgdSA8IG4uZ2VvbWV0cnlbYV0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGwucHVzaChjZShuLmdlb21ldHJ5W2FdW3VdLCB0KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgby5wdXNoKGwpO1xuICAgICAgICB9XG4gICAgICAgIHIucHVzaChxKG4uaWQsIHMsIG8sIG4udGFncykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjZShlLCB0KSB7XG4gICAgICB2YXIgciA9IFtdO1xuICAgICAgci5zaXplID0gZS5zaXplLCB2b2lkIDAgIT09IGUuc3RhcnQgJiYgKHIuc3RhcnQgPSBlLnN0YXJ0LCByLmVuZCA9IGUuZW5kKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHIucHVzaChlW2ldICsgdCwgZVtpICsgMV0sIGVbaSArIDJdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGUoZSwgdCkge1xuICAgICAgaWYgKGUudHJhbnNmb3JtZWQpIHJldHVybiBlO1xuICAgICAgdmFyIHIsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBvLFxuICAgICAgICAgIG4gPSAxIDw8IGUueixcbiAgICAgICAgICBzID0gZS54LFxuICAgICAgICAgIGEgPSBlLnk7XG5cbiAgICAgIGZvciAociA9IDA7IHIgPCBlLmZlYXR1cmVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIHZhciBsID0gZS5mZWF0dXJlc1tyXSxcbiAgICAgICAgICAgIHUgPSBsLmdlb21ldHJ5LFxuICAgICAgICAgICAgaCA9IGwudHlwZTtcbiAgICAgICAgaWYgKGwuZ2VvbWV0cnkgPSBbXSwgMSA9PT0gaCkgZm9yIChpID0gMDsgaSA8IHUubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICBsLmdlb21ldHJ5LnB1c2goZmUodVtpXSwgdVtpICsgMV0sIHQsIG4sIHMsIGEpKTtcbiAgICAgICAgfSBlbHNlIGZvciAoaSA9IDA7IGkgPCB1Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGMgPSBbXTtcblxuICAgICAgICAgIGZvciAobyA9IDA7IG8gPCB1W2ldLmxlbmd0aDsgbyArPSAyKSB7XG4gICAgICAgICAgICBjLnB1c2goZmUodVtpXVtvXSwgdVtpXVtvICsgMV0sIHQsIG4sIHMsIGEpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsLmdlb21ldHJ5LnB1c2goYyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUudHJhbnNmb3JtZWQgPSAhMCwgZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmZShlLCB0LCByLCBpLCBvLCBuKSB7XG4gICAgICByZXR1cm4gW01hdGgucm91bmQociAqIChlICogaSAtIG8pKSwgTWF0aC5yb3VuZChyICogKHQgKiBpIC0gbikpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZShlLCB0LCByLCBpLCBvKSB7XG4gICAgICBmb3IgKHZhciBuID0gdCA9PT0gby5tYXhab29tID8gMCA6IG8udG9sZXJhbmNlIC8gKCgxIDw8IHQpICogby5leHRlbnQpLCBzID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogcixcbiAgICAgICAgeTogaSxcbiAgICAgICAgejogdCxcbiAgICAgICAgdHJhbnNmb3JtZWQ6ICExLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgICAgfSwgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHMubnVtRmVhdHVyZXMrKywgZ2UocywgZVthXSwgbiwgbyk7XG4gICAgICAgIHZhciBsID0gZVthXS5taW5YLFxuICAgICAgICAgICAgdSA9IGVbYV0ubWluWSxcbiAgICAgICAgICAgIGggPSBlW2FdLm1heFgsXG4gICAgICAgICAgICBjID0gZVthXS5tYXhZO1xuICAgICAgICBsIDwgcy5taW5YICYmIChzLm1pblggPSBsKSwgdSA8IHMubWluWSAmJiAocy5taW5ZID0gdSksIGggPiBzLm1heFggJiYgKHMubWF4WCA9IGgpLCBjID4gcy5tYXhZICYmIChzLm1heFkgPSBjKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2UoZSwgdCwgciwgaSkge1xuICAgICAgdmFyIG8gPSB0Lmdlb21ldHJ5LFxuICAgICAgICAgIG4gPSB0LnR5cGUsXG4gICAgICAgICAgcyA9IFtdO1xuICAgICAgaWYgKFwiUG9pbnRcIiA9PT0gbiB8fCBcIk11bHRpUG9pbnRcIiA9PT0gbikgZm9yICh2YXIgYSA9IDA7IGEgPCBvLmxlbmd0aDsgYSArPSAzKSB7XG4gICAgICAgIHMucHVzaChvW2FdKSwgcy5wdXNoKG9bYSArIDFdKSwgZS5udW1Qb2ludHMrKywgZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICB9IGVsc2UgaWYgKFwiTGluZVN0cmluZ1wiID09PSBuKSB2ZShzLCBvLCBlLCByLCAhMSwgITEpO2Vsc2UgaWYgKFwiTXVsdGlMaW5lU3RyaW5nXCIgPT09IG4gfHwgXCJQb2x5Z29uXCIgPT09IG4pIGZvciAoYSA9IDA7IGEgPCBvLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZlKHMsIG9bYV0sIGUsIHIsIFwiUG9seWdvblwiID09PSBuLCAwID09PSBhKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gbikgZm9yICh2YXIgbCA9IDA7IGwgPCBvLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciB1ID0gb1tsXTtcblxuICAgICAgICBmb3IgKGEgPSAwOyBhIDwgdS5sZW5ndGg7IGErKykge1xuICAgICAgICAgIHZlKHMsIHVbYV0sIGUsIHIsICEwLCAwID09PSBhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGggPSB0LnRhZ3MgfHwgbnVsbDtcblxuICAgICAgICBpZiAoXCJMaW5lU3RyaW5nXCIgPT09IG4gJiYgaS5saW5lTWV0cmljcykge1xuICAgICAgICAgIGZvciAodmFyIGMgaW4gaCA9IHt9LCB0LnRhZ3MpIHtcbiAgICAgICAgICAgIGhbY10gPSB0LnRhZ3NbY107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaC5tYXBib3hfY2xpcF9zdGFydCA9IG8uc3RhcnQgLyBvLnNpemUsIGgubWFwYm94X2NsaXBfZW5kID0gby5lbmQgLyBvLnNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcCA9IHtcbiAgICAgICAgICBnZW9tZXRyeTogcyxcbiAgICAgICAgICB0eXBlOiBcIlBvbHlnb25cIiA9PT0gbiB8fCBcIk11bHRpUG9seWdvblwiID09PSBuID8gMyA6IFwiTGluZVN0cmluZ1wiID09PSBuIHx8IFwiTXVsdGlMaW5lU3RyaW5nXCIgPT09IG4gPyAyIDogMSxcbiAgICAgICAgICB0YWdzOiBoXG4gICAgICAgIH07XG4gICAgICAgIG51bGwgIT09IHQuaWQgJiYgKHAuaWQgPSB0LmlkKSwgZS5mZWF0dXJlcy5wdXNoKHApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZlKGUsIHQsIHIsIGksIG8sIG4pIHtcbiAgICAgIHZhciBzID0gaSAqIGk7XG4gICAgICBpZiAoaSA+IDAgJiYgdC5zaXplIDwgKG8gPyBzIDogaSkpIHIubnVtUG9pbnRzICs9IHQubGVuZ3RoIC8gMztlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgYSA9IFtdLCBsID0gMDsgbCA8IHQubGVuZ3RoOyBsICs9IDMpIHtcbiAgICAgICAgICAoMCA9PT0gaSB8fCB0W2wgKyAyXSA+IHMpICYmIChyLm51bVNpbXBsaWZpZWQrKywgYS5wdXNoKHRbbF0pLCBhLnB1c2godFtsICsgMV0pKSwgci5udW1Qb2ludHMrKztcbiAgICAgICAgfVxuXG4gICAgICAgIG8gJiYgZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgICBmb3IgKHZhciByID0gMCwgaSA9IDAsIG8gPSBlLmxlbmd0aCwgbiA9IG8gLSAyOyBpIDwgbzsgbiA9IGksIGkgKz0gMikge1xuICAgICAgICAgICAgciArPSAoZVtpXSAtIGVbbl0pICogKGVbaSArIDFdICsgZVtuICsgMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyID4gMCA9PT0gdCkgZm9yIChpID0gMCwgbyA9IGUubGVuZ3RoOyBpIDwgbyAvIDI7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIHMgPSBlW2ldLFxuICAgICAgICAgICAgICAgIGEgPSBlW2kgKyAxXTtcbiAgICAgICAgICAgIGVbaV0gPSBlW28gLSAyIC0gaV0sIGVbaSArIDFdID0gZVtvIC0gMSAtIGldLCBlW28gLSAyIC0gaV0gPSBzLCBlW28gLSAxIC0gaV0gPSBhO1xuICAgICAgICAgIH1cbiAgICAgICAgfShhLCBuKSwgZS5wdXNoKGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lKGUsIHQpIHtcbiAgICAgIHZhciByID0gKHQgPSB0aGlzLm9wdGlvbnMgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICBmb3IgKHZhciByIGluIHQpIHtcbiAgICAgICAgICBlW3JdID0gdFtyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfShPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIHQpKS5kZWJ1ZztcblxuICAgICAgaWYgKHIgJiYgY29uc29sZS50aW1lKFwicHJlcHJvY2VzcyBkYXRhXCIpLCB0Lm1heFpvb20gPCAwIHx8IHQubWF4Wm9vbSA+IDI0KSB0aHJvdyBuZXcgRXJyb3IoXCJtYXhab29tIHNob3VsZCBiZSBpbiB0aGUgMC0yNCByYW5nZVwiKTtcbiAgICAgIGlmICh0LnByb21vdGVJZCAmJiB0LmdlbmVyYXRlSWQpIHRocm93IG5ldyBFcnJvcihcInByb21vdGVJZCBhbmQgZ2VuZXJhdGVJZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cIik7XG5cbiAgICAgIHZhciBpID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdmFyIHIgPSBbXTtcbiAgICAgICAgaWYgKFwiRmVhdHVyZUNvbGxlY3Rpb25cIiA9PT0gZS50eXBlKSBmb3IgKHZhciBpID0gMDsgaSA8IGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAkKHIsIGUuZmVhdHVyZXNbaV0sIHQsIGkpO1xuICAgICAgICB9IGVsc2UgJChyLCBcIkZlYXR1cmVcIiA9PT0gZS50eXBlID8gZSA6IHtcbiAgICAgICAgICBnZW9tZXRyeTogZVxuICAgICAgICB9LCB0KTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KGUsIHQpO1xuXG4gICAgICB0aGlzLnRpbGVzID0ge30sIHRoaXMudGlsZUNvb3JkcyA9IFtdLCByICYmIChjb25zb2xlLnRpbWVFbmQoXCJwcmVwcm9jZXNzIGRhdGFcIiksIGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsIHQuaW5kZXhNYXhab29tLCB0LmluZGV4TWF4UG9pbnRzKSwgY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksIHRoaXMuc3RhdHMgPSB7fSwgdGhpcy50b3RhbCA9IDApLCAoaSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHZhciByID0gdC5idWZmZXIgLyB0LmV4dGVudCxcbiAgICAgICAgICAgIGkgPSBlLFxuICAgICAgICAgICAgbyA9IHJlKGUsIDEsIC0xIC0gciwgciwgMCwgLTEsIDIsIHQpLFxuICAgICAgICAgICAgbiA9IHJlKGUsIDEsIDEgLSByLCAyICsgciwgMCwgLTEsIDIsIHQpO1xuICAgICAgICByZXR1cm4gKG8gfHwgbikgJiYgKGkgPSByZShlLCAxLCAtciwgMSArIHIsIDAsIC0xLCAyLCB0KSB8fCBbXSwgbyAmJiAoaSA9IGhlKG8sIDEpLmNvbmNhdChpKSksIG4gJiYgKGkgPSBpLmNvbmNhdChoZShuLCAtMSkpKSksIGk7XG4gICAgICB9KGksIHQpKS5sZW5ndGggJiYgdGhpcy5zcGxpdFRpbGUoaSwgMCwgMCwgMCksIHIgJiYgKGkubGVuZ3RoICYmIGNvbnNvbGUubG9nKFwiZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkXCIsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKSwgY29uc29sZS50aW1lRW5kKFwiZ2VuZXJhdGUgdGlsZXNcIiksIGNvbnNvbGUubG9nKFwidGlsZXMgZ2VuZXJhdGVkOlwiLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHllKGUsIHQsIHIpIHtcbiAgICAgIHJldHVybiAzMiAqICgoMSA8PCBlKSAqIHIgKyB0KSArIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geGUoZSwgdCkge1xuICAgICAgdmFyIHIgPSBlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICBpZiAoIXRoaXMuX2dlb0pTT05JbmRleCkgcmV0dXJuIHQobnVsbCwgbnVsbCk7XG5cbiAgICAgIHZhciBpID0gdGhpcy5fZ2VvSlNPTkluZGV4LmdldFRpbGUoci56LCByLngsIHIueSk7XG5cbiAgICAgIGlmICghaSkgcmV0dXJuIHQobnVsbCwgbnVsbCk7XG4gICAgICB2YXIgbyA9IG5ldyBnKGkuZmVhdHVyZXMpLFxuICAgICAgICAgIG4gPSB3KG8pO1xuICAgICAgMCA9PT0gbi5ieXRlT2Zmc2V0ICYmIG4uYnl0ZUxlbmd0aCA9PT0gbi5idWZmZXIuYnl0ZUxlbmd0aCB8fCAobiA9IG5ldyBVaW50OEFycmF5KG4pKSwgdChudWxsLCB7XG4gICAgICAgIHZlY3RvclRpbGU6IG8sXG4gICAgICAgIHJhd0RhdGE6IG4uYnVmZmVyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBKLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHIgPSB0LmxvZyxcbiAgICAgICAgICBpID0gdC5taW5ab29tLFxuICAgICAgICAgIG8gPSB0Lm1heFpvb20sXG4gICAgICAgICAgbiA9IHQubm9kZVNpemU7XG4gICAgICByICYmIGNvbnNvbGUudGltZShcInRvdGFsIHRpbWVcIik7XG4gICAgICB2YXIgcyA9IFwicHJlcGFyZSBcIiArIGUubGVuZ3RoICsgXCIgcG9pbnRzXCI7XG4gICAgICByICYmIGNvbnNvbGUudGltZShzKSwgdGhpcy5wb2ludHMgPSBlO1xuXG4gICAgICBmb3IgKHZhciBhID0gW10sIGwgPSAwOyBsIDwgZS5sZW5ndGg7IGwrKykge1xuICAgICAgICBlW2xdLmdlb21ldHJ5ICYmIGEucHVzaChBKGVbbF0sIGwpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmVlc1tvICsgMV0gPSBuZXcgRihhLCBYLCBXLCBuLCBGbG9hdDMyQXJyYXkpLCByICYmIGNvbnNvbGUudGltZUVuZChzKTtcblxuICAgICAgZm9yICh2YXIgdSA9IG87IHUgPj0gaTsgdS0tKSB7XG4gICAgICAgIHZhciBoID0gK0RhdGUubm93KCk7XG4gICAgICAgIGEgPSB0aGlzLl9jbHVzdGVyKGEsIHUpLCB0aGlzLnRyZWVzW3VdID0gbmV3IEYoYSwgWCwgVywgbiwgRmxvYXQzMkFycmF5KSwgciAmJiBjb25zb2xlLmxvZyhcInolZDogJWQgY2x1c3RlcnMgaW4gJWRtc1wiLCB1LCBhLmxlbmd0aCwgK0RhdGUubm93KCkgLSBoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHIgJiYgY29uc29sZS50aW1lRW5kKFwidG90YWwgdGltZVwiKSwgdGhpcztcbiAgICB9LCBKLnByb3RvdHlwZS5nZXRDbHVzdGVycyA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICB2YXIgciA9ICgoZVswXSArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwLFxuICAgICAgICAgIGkgPSBNYXRoLm1heCgtOTAsIE1hdGgubWluKDkwLCBlWzFdKSksXG4gICAgICAgICAgbyA9IDE4MCA9PT0gZVsyXSA/IDE4MCA6ICgoZVsyXSArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwLFxuICAgICAgICAgIG4gPSBNYXRoLm1heCgtOTAsIE1hdGgubWluKDkwLCBlWzNdKSk7XG4gICAgICBpZiAoZVsyXSAtIGVbMF0gPj0gMzYwKSByID0gLTE4MCwgbyA9IDE4MDtlbHNlIGlmIChyID4gbykge1xuICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0Q2x1c3RlcnMoW3IsIGksIDE4MCwgbl0sIHQpLFxuICAgICAgICAgICAgYSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIGksIG8sIG5dLCB0KTtcbiAgICAgICAgcmV0dXJuIHMuY29uY2F0KGEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBsID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20odCldLCB1ID0gW10sIGggPSAwLCBjID0gbC5yYW5nZShZKHIpLCBqKG4pLCBZKG8pLCBqKGkpKTsgaCA8IGMubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgdmFyIHAgPSBsLnBvaW50c1tjW2hdXTtcbiAgICAgICAgdS5wdXNoKHAubnVtUG9pbnRzID8gQihwKSA6IHRoaXMucG9pbnRzW3AuaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHU7XG4gICAgfSwgSi5wcm90b3R5cGUuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHQgPSB0aGlzLl9nZXRPcmlnaW5JZChlKSxcbiAgICAgICAgICByID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShlKSxcbiAgICAgICAgICBpID0gXCJObyBjbHVzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBpZC5cIixcbiAgICAgICAgICBvID0gdGhpcy50cmVlc1tyXTtcblxuICAgICAgaWYgKCFvKSB0aHJvdyBuZXcgRXJyb3IoaSk7XG4gICAgICB2YXIgbiA9IG8ucG9pbnRzW3RdO1xuICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoaSk7XG5cbiAgICAgIGZvciAodmFyIHMgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCByIC0gMSkpLCBhID0gW10sIGwgPSAwLCB1ID0gby53aXRoaW4obi54LCBuLnksIHMpOyBsIDwgdS5sZW5ndGg7IGwgKz0gMSkge1xuICAgICAgICB2YXIgaCA9IG8ucG9pbnRzW3VbbF1dO1xuICAgICAgICBoLnBhcmVudElkID09PSBlICYmIGEucHVzaChoLm51bVBvaW50cyA/IEIoaCkgOiB0aGlzLnBvaW50c1toLmluZGV4XSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgwID09PSBhLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGkpO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfSwgSi5wcm90b3R5cGUuZ2V0TGVhdmVzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBpID0gW107XG4gICAgICByZXR1cm4gdGhpcy5fYXBwZW5kTGVhdmVzKGksIGUsIHQgPSB0IHx8IDEwLCByID0gciB8fCAwLCAwKSwgaTtcbiAgICB9LCBKLnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHZhciBpID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20oZSldLFxuICAgICAgICAgIG8gPSBNYXRoLnBvdygyLCBlKSxcbiAgICAgICAgICBuID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHMgPSBuLnJhZGl1cyAvIG4uZXh0ZW50LFxuICAgICAgICAgIGEgPSAociAtIHMpIC8gbyxcbiAgICAgICAgICBsID0gKHIgKyAxICsgcykgLyBvLFxuICAgICAgICAgIHUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhpLnJhbmdlKCh0IC0gcykgLyBvLCBhLCAodCArIDEgKyBzKSAvIG8sIGwpLCBpLnBvaW50cywgdCwgciwgbywgdSksIDAgPT09IHQgJiYgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKGkucmFuZ2UoMSAtIHMgLyBvLCBhLCAxLCBsKSwgaS5wb2ludHMsIG8sIHIsIG8sIHUpLCB0ID09PSBvIC0gMSAmJiB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoaS5yYW5nZSgwLCBhLCBzIC8gbywgbCksIGkucG9pbnRzLCAtMSwgciwgbywgdSksIHUuZmVhdHVyZXMubGVuZ3RoID8gdSA6IG51bGw7XG4gICAgfSwgSi5wcm90b3R5cGUuZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZm9yICh2YXIgdCA9IHRoaXMuX2dldE9yaWdpblpvb20oZSkgLSAxOyB0IDw9IHRoaXMub3B0aW9ucy5tYXhab29tOykge1xuICAgICAgICB2YXIgciA9IHRoaXMuZ2V0Q2hpbGRyZW4oZSk7XG4gICAgICAgIGlmICh0KyssIDEgIT09IHIubGVuZ3RoKSBicmVhaztcbiAgICAgICAgZSA9IHJbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9LCBKLnByb3RvdHlwZS5fYXBwZW5kTGVhdmVzID0gZnVuY3Rpb24gKGUsIHQsIHIsIGksIG8pIHtcbiAgICAgIGZvciAodmFyIG4gPSAwLCBzID0gdGhpcy5nZXRDaGlsZHJlbih0KTsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGEgPSBzW25dLFxuICAgICAgICAgICAgbCA9IGEucHJvcGVydGllcztcbiAgICAgICAgaWYgKGwgJiYgbC5jbHVzdGVyID8gbyArIGwucG9pbnRfY291bnQgPD0gaSA/IG8gKz0gbC5wb2ludF9jb3VudCA6IG8gPSB0aGlzLl9hcHBlbmRMZWF2ZXMoZSwgbC5jbHVzdGVyX2lkLCByLCBpLCBvKSA6IG8gPCBpID8gbysrIDogZS5wdXNoKGEpLCBlLmxlbmd0aCA9PT0gcikgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvO1xuICAgIH0sIEoucHJvdG90eXBlLl9hZGRUaWxlRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgbikge1xuICAgICAgZm9yICh2YXIgcyA9IDAsIGEgPSBlOyBzIDwgYS5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICB2YXIgbCA9IHRbYVtzXV0sXG4gICAgICAgICAgICB1ID0gbC5udW1Qb2ludHMsXG4gICAgICAgICAgICBoID0ge1xuICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgZ2VvbWV0cnk6IFtbTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50ICogKGwueCAqIG8gLSByKSksIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChsLnkgKiBvIC0gaSkpXV0sXG4gICAgICAgICAgdGFnczogdSA/IEcobCkgOiB0aGlzLnBvaW50c1tsLmluZGV4XS5wcm9wZXJ0aWVzXG4gICAgICAgIH0sXG4gICAgICAgICAgICBjID0gdm9pZCAwO1xuICAgICAgICB1ID8gYyA9IGwuaWQgOiB0aGlzLm9wdGlvbnMuZ2VuZXJhdGVJZCA/IGMgPSBsLmluZGV4IDogdGhpcy5wb2ludHNbbC5pbmRleF0uaWQgJiYgKGMgPSB0aGlzLnBvaW50c1tsLmluZGV4XS5pZCksIHZvaWQgMCAhPT0gYyAmJiAoaC5pZCA9IGMpLCBuLmZlYXR1cmVzLnB1c2goaCk7XG4gICAgICB9XG4gICAgfSwgSi5wcm90b3R5cGUuX2xpbWl0Wm9vbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKCtlLCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9LCBKLnByb3RvdHlwZS5fY2x1c3RlciA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICBmb3IgKHZhciByID0gW10sIGkgPSB0aGlzLm9wdGlvbnMsIG8gPSBpLnJlZHVjZSwgbiA9IGkubWluUG9pbnRzLCBzID0gaS5yYWRpdXMgLyAoaS5leHRlbnQgKiBNYXRoLnBvdygyLCB0KSksIGEgPSAwOyBhIDwgZS5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgbCA9IGVbYV07XG5cbiAgICAgICAgaWYgKCEobC56b29tIDw9IHQpKSB7XG4gICAgICAgICAgbC56b29tID0gdDtcblxuICAgICAgICAgIGZvciAodmFyIHUgPSB0aGlzLnRyZWVzW3QgKyAxXSwgaCA9IHUud2l0aGluKGwueCwgbC55LCBzKSwgYyA9IGwubnVtUG9pbnRzIHx8IDEsIHAgPSBjLCBmID0gMCwgZCA9IGg7IGYgPCBkLmxlbmd0aDsgZiArPSAxKSB7XG4gICAgICAgICAgICB2YXIgZyA9IHUucG9pbnRzW2RbZl1dO1xuICAgICAgICAgICAgZy56b29tID4gdCAmJiAocCArPSBnLm51bVBvaW50cyB8fCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocCA+PSBuKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB2ID0gbC54ICogYywgbSA9IGwueSAqIGMsIHkgPSBvICYmIGMgPiAxID8gdGhpcy5fbWFwKGwsICEwKSA6IG51bGwsIHggPSAoYSA8PCA1KSArICh0ICsgMSkgKyB0aGlzLnBvaW50cy5sZW5ndGgsIHcgPSAwLCBTID0gaDsgdyA8IFMubGVuZ3RoOyB3ICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIEkgPSB1LnBvaW50c1tTW3ddXTtcblxuICAgICAgICAgICAgICBpZiAoIShJLnpvb20gPD0gdCkpIHtcbiAgICAgICAgICAgICAgICBJLnpvb20gPSB0O1xuICAgICAgICAgICAgICAgIHZhciBNID0gSS5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgICAgICB2ICs9IEkueCAqIE0sIG0gKz0gSS55ICogTSwgSS5wYXJlbnRJZCA9IHgsIG8gJiYgKHkgfHwgKHkgPSB0aGlzLl9tYXAobCwgITApKSwgbyh5LCB0aGlzLl9tYXAoSSkpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsLnBhcmVudElkID0geCwgci5wdXNoKFoodiAvIHAsIG0gLyBwLCB4LCBwLCB5KSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyLnB1c2gobCksIHAgPiAxKSBmb3IgKHZhciBiID0gMCwgXyA9IGg7IGIgPCBfLmxlbmd0aDsgYiArPSAxKSB7XG4gICAgICAgICAgICB2YXIgayA9IHUucG9pbnRzW19bYl1dO1xuICAgICAgICAgICAgay56b29tIDw9IHQgfHwgKGsuem9vbSA9IHQsIHIucHVzaChrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIEoucHJvdG90eXBlLl9nZXRPcmlnaW5JZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZSAtIHRoaXMucG9pbnRzLmxlbmd0aCA+PiA1O1xuICAgIH0sIEoucHJvdG90eXBlLl9nZXRPcmlnaW5ab29tID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiAoZSAtIHRoaXMucG9pbnRzLmxlbmd0aCkgJSAzMjtcbiAgICB9LCBKLnByb3RvdHlwZS5fbWFwID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIGlmIChlLm51bVBvaW50cykgcmV0dXJuIHQgPyBWKHt9LCBlLnByb3BlcnRpZXMpIDogZS5wcm9wZXJ0aWVzO1xuICAgICAgdmFyIHIgPSB0aGlzLnBvaW50c1tlLmluZGV4XS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGkgPSB0aGlzLm9wdGlvbnMubWFwKHIpO1xuICAgICAgcmV0dXJuIHQgJiYgaSA9PT0gciA/IFYoe30sIGkpIDogaTtcbiAgICB9LCBtZS5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICAgIG1heFpvb206IDE0LFxuICAgICAgaW5kZXhNYXhab29tOiA1LFxuICAgICAgaW5kZXhNYXhQb2ludHM6IDFlNSxcbiAgICAgIHRvbGVyYW5jZTogMyxcbiAgICAgIGV4dGVudDogNDA5NixcbiAgICAgIGJ1ZmZlcjogNjQsXG4gICAgICBsaW5lTWV0cmljczogITEsXG4gICAgICBwcm9tb3RlSWQ6IG51bGwsXG4gICAgICBnZW5lcmF0ZUlkOiAhMSxcbiAgICAgIGRlYnVnOiAwXG4gICAgfSwgbWUucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByLCBpLCBvLCBuLCBzKSB7XG4gICAgICBmb3IgKHZhciBhID0gW2UsIHQsIHIsIGldLCBsID0gdGhpcy5vcHRpb25zLCB1ID0gbC5kZWJ1ZzsgYS5sZW5ndGg7KSB7XG4gICAgICAgIGkgPSBhLnBvcCgpLCByID0gYS5wb3AoKSwgdCA9IGEucG9wKCksIGUgPSBhLnBvcCgpO1xuICAgICAgICB2YXIgaCA9IDEgPDwgdCxcbiAgICAgICAgICAgIGMgPSB5ZSh0LCByLCBpKSxcbiAgICAgICAgICAgIHAgPSB0aGlzLnRpbGVzW2NdO1xuXG4gICAgICAgIGlmICghcCAmJiAodSA+IDEgJiYgY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksIHAgPSB0aGlzLnRpbGVzW2NdID0gZGUoZSwgdCwgciwgaSwgbCksIHRoaXMudGlsZUNvb3Jkcy5wdXNoKHtcbiAgICAgICAgICB6OiB0LFxuICAgICAgICAgIHg6IHIsXG4gICAgICAgICAgeTogaVxuICAgICAgICB9KSwgdSkpIHtcbiAgICAgICAgICB1ID4gMSAmJiAoY29uc29sZS5sb2coXCJ0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZClcIiwgdCwgciwgaSwgcC5udW1GZWF0dXJlcywgcC5udW1Qb2ludHMsIHAubnVtU2ltcGxpZmllZCksIGNvbnNvbGUudGltZUVuZChcImNyZWF0aW9uXCIpKTtcbiAgICAgICAgICB2YXIgZiA9IFwielwiICsgdDtcbiAgICAgICAgICB0aGlzLnN0YXRzW2ZdID0gKHRoaXMuc3RhdHNbZl0gfHwgMCkgKyAxLCB0aGlzLnRvdGFsKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocC5zb3VyY2UgPSBlLCBvKSB7XG4gICAgICAgICAgaWYgKHQgPT09IGwubWF4Wm9vbSB8fCB0ID09PSBvKSBjb250aW51ZTtcbiAgICAgICAgICB2YXIgZCA9IDEgPDwgbyAtIHQ7XG4gICAgICAgICAgaWYgKHIgIT09IE1hdGguZmxvb3IobiAvIGQpIHx8IGkgIT09IE1hdGguZmxvb3IocyAvIGQpKSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0ID09PSBsLmluZGV4TWF4Wm9vbSB8fCBwLm51bVBvaW50cyA8PSBsLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICBpZiAocC5zb3VyY2UgPSBudWxsLCAwICE9PSBlLmxlbmd0aCkge1xuICAgICAgICAgIHUgPiAxICYmIGNvbnNvbGUudGltZShcImNsaXBwaW5nXCIpO1xuICAgICAgICAgIHZhciBnLFxuICAgICAgICAgICAgICB2LFxuICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB3LFxuICAgICAgICAgICAgICBTID0gLjUgKiBsLmJ1ZmZlciAvIGwuZXh0ZW50LFxuICAgICAgICAgICAgICBJID0gLjUgLSBTLFxuICAgICAgICAgICAgICBNID0gLjUgKyBTLFxuICAgICAgICAgICAgICBiID0gMSArIFM7XG4gICAgICAgICAgZyA9IHYgPSBtID0geSA9IG51bGwsIHggPSByZShlLCBoLCByIC0gUywgciArIE0sIDAsIHAubWluWCwgcC5tYXhYLCBsKSwgdyA9IHJlKGUsIGgsIHIgKyBJLCByICsgYiwgMCwgcC5taW5YLCBwLm1heFgsIGwpLCBlID0gbnVsbCwgeCAmJiAoZyA9IHJlKHgsIGgsIGkgLSBTLCBpICsgTSwgMSwgcC5taW5ZLCBwLm1heFksIGwpLCB2ID0gcmUoeCwgaCwgaSArIEksIGkgKyBiLCAxLCBwLm1pblksIHAubWF4WSwgbCksIHggPSBudWxsKSwgdyAmJiAobSA9IHJlKHcsIGgsIGkgLSBTLCBpICsgTSwgMSwgcC5taW5ZLCBwLm1heFksIGwpLCB5ID0gcmUodywgaCwgaSArIEksIGkgKyBiLCAxLCBwLm1pblksIHAubWF4WSwgbCksIHcgPSBudWxsKSwgdSA+IDEgJiYgY29uc29sZS50aW1lRW5kKFwiY2xpcHBpbmdcIiksIGEucHVzaChnIHx8IFtdLCB0ICsgMSwgMiAqIHIsIDIgKiBpKSwgYS5wdXNoKHYgfHwgW10sIHQgKyAxLCAyICogciwgMiAqIGkgKyAxKSwgYS5wdXNoKG0gfHwgW10sIHQgKyAxLCAyICogciArIDEsIDIgKiBpKSwgYS5wdXNoKHkgfHwgW10sIHQgKyAxLCAyICogciArIDEsIDIgKiBpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBtZS5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB2YXIgaSA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBvID0gaS5leHRlbnQsXG4gICAgICAgICAgbiA9IGkuZGVidWc7XG4gICAgICBpZiAoZSA8IDAgfHwgZSA+IDI0KSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBzID0gMSA8PCBlLFxuICAgICAgICAgIGEgPSB5ZShlLCB0ID0gKHQgJSBzICsgcykgJSBzLCByKTtcbiAgICAgIGlmICh0aGlzLnRpbGVzW2FdKSByZXR1cm4gcGUodGhpcy50aWxlc1thXSwgbyk7XG4gICAgICBuID4gMSAmJiBjb25zb2xlLmxvZyhcImRyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkXCIsIGUsIHQsIHIpO1xuXG4gICAgICBmb3IgKHZhciBsLCB1ID0gZSwgaCA9IHQsIGMgPSByOyAhbCAmJiB1ID4gMDspIHtcbiAgICAgICAgdS0tLCBoID0gTWF0aC5mbG9vcihoIC8gMiksIGMgPSBNYXRoLmZsb29yKGMgLyAyKSwgbCA9IHRoaXMudGlsZXNbeWUodSwgaCwgYyldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbCAmJiBsLnNvdXJjZSA/IChuID4gMSAmJiBjb25zb2xlLmxvZyhcImZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZFwiLCB1LCBoLCBjKSwgbiA+IDEgJiYgY29uc29sZS50aW1lKFwiZHJpbGxpbmcgZG93blwiKSwgdGhpcy5zcGxpdFRpbGUobC5zb3VyY2UsIHUsIGgsIGMsIGUsIHQsIHIpLCBuID4gMSAmJiBjb25zb2xlLnRpbWVFbmQoXCJkcmlsbGluZyBkb3duXCIpLCB0aGlzLnRpbGVzW2FdID8gcGUodGhpcy50aWxlc1thXSwgbykgOiBudWxsKSA6IG51bGw7XG4gICAgfTtcblxuICAgIHZhciB3ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiByKGUsIHIsIGksIG8pIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUsIHIsIGksIHhlKSwgbyAmJiAodGhpcy5sb2FkR2VvSlNPTiA9IG8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoci5fX3Byb3RvX18gPSB0KSwgKHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSByLCByLnByb3RvdHlwZS5sb2FkRGF0YSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFjayAmJiB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIGFiYW5kb25lZDogITBcbiAgICAgICAgfSksIHRoaXMuX3BlbmRpbmdDYWxsYmFjayA9IHQsIHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcyA9IGUsIHRoaXMuX3N0YXRlICYmIFwiSWRsZVwiICE9PSB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlID0gXCJOZWVkc0xvYWREYXRhXCIgOiAodGhpcy5fc3RhdGUgPSBcIkNvYWxlc2NpbmdcIiwgdGhpcy5fbG9hZERhdGEoKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fbG9hZERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0NhbGxiYWNrICYmIHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcykge1xuICAgICAgICAgIHZhciByID0gdGhpcy5fcGVuZGluZ0NhbGxiYWNrLFxuICAgICAgICAgICAgICBpID0gdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2ssIGRlbGV0ZSB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXM7XG4gICAgICAgICAgdmFyIG8gPSAhIShpICYmIGkucmVxdWVzdCAmJiBpLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSAmJiBuZXcgZS5SZXF1ZXN0UGVyZm9ybWFuY2UoaS5yZXF1ZXN0KTtcbiAgICAgICAgICB0aGlzLmxvYWRHZW9KU09OKGksIGZ1bmN0aW9uIChuLCBzKSB7XG4gICAgICAgICAgICBpZiAobiB8fCAhcykgcmV0dXJuIHIobik7XG4gICAgICAgICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgcykgcmV0dXJuIHIobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBnaXZlbiB0byAnXCIgKyBpLnNvdXJjZSArIFwiJyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICAgICAgIWZ1bmN0aW9uIGUodCwgcikge1xuICAgICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICAgIG8gPSB0ICYmIHQudHlwZTtcbiAgICAgICAgICAgICAgaWYgKFwiRmVhdHVyZUNvbGxlY3Rpb25cIiA9PT0gbykgZm9yIChpID0gMDsgaSA8IHQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBlKHQuZmVhdHVyZXNbaV0sIHIpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiR2VvbWV0cnlDb2xsZWN0aW9uXCIgPT09IG8pIGZvciAoaSA9IDA7IGkgPCB0Lmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBlKHQuZ2VvbWV0cmllc1tpXSwgcik7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJGZWF0dXJlXCIgPT09IG8pIGUodC5nZW9tZXRyeSwgcik7ZWxzZSBpZiAoXCJQb2x5Z29uXCIgPT09IG8pIGModC5jb29yZGluYXRlcywgcik7ZWxzZSBpZiAoXCJNdWx0aVBvbHlnb25cIiA9PT0gbykgZm9yIChpID0gMDsgaSA8IHQuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjKHQuY29vcmRpbmF0ZXNbaV0sIHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfShzLCAhMCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChpLmZpbHRlcikge1xuICAgICAgICAgICAgICAgIHZhciBhID0gZS5jcmVhdGVFeHByZXNzaW9uKGkuZmlsdGVyLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgIFwicHJvcGVydHktdHlwZVwiOiBcImRhdGEtZHJpdmVuXCIsXG4gICAgICAgICAgICAgICAgICBvdmVycmlkYWJsZTogITEsXG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAhMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChcImVycm9yXCIgPT09IGEucmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoYS52YWx1ZS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBlLmtleSArIFwiOiBcIiArIGUubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHZhciBsID0gcy5mZWF0dXJlcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhLnZhbHVlLmV2YWx1YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgem9vbTogMFxuICAgICAgICAgICAgICAgICAgfSwgZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcyA9IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHQuX2dlb0pTT05JbmRleCA9IGkuY2x1c3RlciA/IG5ldyBKKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB0LnN1cGVyY2x1c3Rlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGkgPSB0LmNsdXN0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgIGlmICghaSB8fCAhcikgcmV0dXJuIHI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0ge30sIG4gPSB7fSwgcyA9IHtcbiAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgem9vbTogMFxuICAgICAgICAgICAgICAgIH0sIGEgPSB7XG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBudWxsXG4gICAgICAgICAgICAgICAgfSwgbCA9IE9iamVjdC5rZXlzKGkpLCB1ID0gMCwgaCA9IGw7IHUgPCBoLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IGhbdV0sXG4gICAgICAgICAgICAgICAgICAgICAgcCA9IGlbY10sXG4gICAgICAgICAgICAgICAgICAgICAgZiA9IHBbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgZCA9IGUuY3JlYXRlRXhwcmVzc2lvbihwWzFdKSxcbiAgICAgICAgICAgICAgICAgICAgICBnID0gZS5jcmVhdGVFeHByZXNzaW9uKFwic3RyaW5nXCIgPT0gdHlwZW9mIGYgPyBbZiwgW1wiYWNjdW11bGF0ZWRcIl0sIFtcImdldFwiLCBjXV0gOiBmKTtcbiAgICAgICAgICAgICAgICAgIG9bY10gPSBkLnZhbHVlLCBuW2NdID0gZy52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gci5tYXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgYS5wcm9wZXJ0aWVzID0gZTtcblxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHt9LCByID0gMCwgaSA9IGw7IHIgPCBpLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuID0gaVtyXTtcbiAgICAgICAgICAgICAgICAgICAgdFtuXSA9IG9bbl0uZXZhbHVhdGUocywgYSk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIH0sIHIucmVkdWNlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgICAgICAgICAgIGEucHJvcGVydGllcyA9IHQ7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBpID0gbDsgciA8IGkubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpW3JdO1xuICAgICAgICAgICAgICAgICAgICBzLmFjY3VtdWxhdGVkID0gZVtvXSwgZVtvXSA9IG5bb10uZXZhbHVhdGUocywgYSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgcjtcbiAgICAgICAgICAgICAgfShpKSkubG9hZChzLmZlYXR1cmVzKSA6IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBtZShlLCB0KTtcbiAgICAgICAgICAgICAgfShzLCBpLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgfSBjYXRjaCAobikge1xuICAgICAgICAgICAgICByZXR1cm4gcihuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdC5sb2FkZWQgPSB7fTtcbiAgICAgICAgICAgIHZhciB1ID0ge307XG5cbiAgICAgICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgICAgIHZhciBoID0gby5maW5pc2goKTtcbiAgICAgICAgICAgICAgaCAmJiAodS5yZXNvdXJjZVRpbWluZyA9IHt9LCB1LnJlc291cmNlVGltaW5nW2kuc291cmNlXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcihudWxsLCB1KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgci5wcm90b3R5cGUuY29hbGVzY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFwiQ29hbGVzY2luZ1wiID09PSB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlID0gXCJJZGxlXCIgOiBcIk5lZWRzTG9hZERhdGFcIiA9PT0gdGhpcy5fc3RhdGUgJiYgKHRoaXMuX3N0YXRlID0gXCJDb2FsZXNjaW5nXCIsIHRoaXMuX2xvYWREYXRhKCkpO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVsb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5sb2FkZWQ7XG4gICAgICAgIHJldHVybiBpICYmIGlbZS51aWRdID8gdC5wcm90b3R5cGUucmVsb2FkVGlsZS5jYWxsKHRoaXMsIGUsIHIpIDogdGhpcy5sb2FkVGlsZShlLCByKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmxvYWRHZW9KU09OID0gZnVuY3Rpb24gKHQsIHIpIHtcbiAgICAgICAgaWYgKHQucmVxdWVzdCkgZS5nZXRKU09OKHQucmVxdWVzdCwgcik7ZWxzZSB7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHQuZGF0YSkgcmV0dXJuIHIobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBnaXZlbiB0byAnXCIgKyB0LnNvdXJjZSArIFwiJyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiByKG51bGwsIEpTT04ucGFyc2UodC5kYXRhKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHIobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBnaXZlbiB0byAnXCIgKyB0LnNvdXJjZSArIFwiJyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlU291cmNlID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrICYmIHRoaXMuX3BlbmRpbmdDYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgYWJhbmRvbmVkOiAhMFxuICAgICAgICB9KSwgdCgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHQobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldENsdXN0ZXJFeHBhbnNpb25ab29tKGUuY2x1c3RlcklkKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0KGUpO1xuICAgICAgICB9XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDbHVzdGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHQobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldENoaWxkcmVuKGUuY2x1c3RlcklkKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0KGUpO1xuICAgICAgICB9XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDbHVzdGVyTGVhdmVzID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0KG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRMZWF2ZXMoZS5jbHVzdGVySWQsIGUubGltaXQsIGUub2Zmc2V0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0KGUpO1xuICAgICAgICB9XG4gICAgICB9LCByO1xuICAgIH0obCksXG4gICAgICAgIFNlID0gZnVuY3Rpb24gU2UodCkge1xuICAgICAgdmFyIHIgPSB0aGlzO1xuICAgICAgdGhpcy5zZWxmID0gdCwgdGhpcy5hY3RvciA9IG5ldyBlLkFjdG9yKHQsIHRoaXMpLCB0aGlzLmxheWVySW5kZXhlcyA9IHt9LCB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IHt9LCB0aGlzLndvcmtlclNvdXJjZVR5cGVzID0ge1xuICAgICAgICB2ZWN0b3I6IGwsXG4gICAgICAgIGdlb2pzb246IHdlXG4gICAgICB9LCB0aGlzLndvcmtlclNvdXJjZXMgPSB7fSwgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzID0ge30sIHRoaXMuc2VsZi5yZWdpc3RlcldvcmtlclNvdXJjZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGlmIChyLndvcmtlclNvdXJjZVR5cGVzW2VdKSB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtlciBzb3VyY2Ugd2l0aCBuYW1lIFwiJyArIGUgKyAnXCIgYWxyZWFkeSByZWdpc3RlcmVkLicpO1xuICAgICAgICByLndvcmtlclNvdXJjZVR5cGVzW2VdID0gdDtcbiAgICAgIH0sIHRoaXMuc2VsZi5yZWdpc3RlclJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoZS5wbHVnaW4uaXNQYXJzZWQoKSkgdGhyb3cgbmV3IEVycm9yKFwiUlRMIHRleHQgcGx1Z2luIGFscmVhZHkgcmVnaXN0ZXJlZC5cIik7XG4gICAgICAgIGUucGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyA9IHQuYXBwbHlBcmFiaWNTaGFwaW5nLCBlLnBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQgPSB0LnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCwgZS5wbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0ID0gdC5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gU2UucHJvdG90eXBlLnNldFJlZmVycmVyID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgIHRoaXMucmVmZXJyZXIgPSB0O1xuICAgIH0sIFNlLnByb3RvdHlwZS5zZXRJbWFnZXMgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmF2YWlsYWJsZUltYWdlc1tlXSA9IHQsIHRoaXMud29ya2VyU291cmNlc1tlXSkge1xuICAgICAgICB2YXIgbyA9IHRoaXMud29ya2VyU291cmNlc1tlXVtpXTtcblxuICAgICAgICBmb3IgKHZhciBuIGluIG8pIHtcbiAgICAgICAgICBvW25dLmF2YWlsYWJsZUltYWdlcyA9IHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcigpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5zZXRMYXllcnMgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdGhpcy5nZXRMYXllckluZGV4KGUpLnJlcGxhY2UodCksIHIoKTtcbiAgICB9LCBTZS5wcm90b3R5cGUudXBkYXRlTGF5ZXJzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChlKS51cGRhdGUodC5sYXllcnMsIHQucmVtb3ZlZElkcyksIHIoKTtcbiAgICB9LCBTZS5wcm90b3R5cGUubG9hZFRpbGUgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UoZSwgdC50eXBlLCB0LnNvdXJjZSkubG9hZFRpbGUodCwgcik7XG4gICAgfSwgU2UucHJvdG90eXBlLmxvYWRERU1UaWxlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0REVNV29ya2VyU291cmNlKGUsIHQuc291cmNlKS5sb2FkVGlsZSh0LCByKTtcbiAgICB9LCBTZS5wcm90b3R5cGUucmVsb2FkVGlsZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShlLCB0LnR5cGUsIHQuc291cmNlKS5yZWxvYWRUaWxlKHQsIHIpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5hYm9ydFRpbGUgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UoZSwgdC50eXBlLCB0LnNvdXJjZSkuYWJvcnRUaWxlKHQsIHIpO1xuICAgIH0sIFNlLnByb3RvdHlwZS5yZW1vdmVUaWxlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKGUsIHQudHlwZSwgdC5zb3VyY2UpLnJlbW92ZVRpbGUodCwgcik7XG4gICAgfSwgU2UucHJvdG90eXBlLnJlbW92ZURFTVRpbGUgPSBmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgdGhpcy5nZXRERU1Xb3JrZXJTb3VyY2UoZSwgdC5zb3VyY2UpLnJlbW92ZVRpbGUodCk7XG4gICAgfSwgU2UucHJvdG90eXBlLnJlbW92ZVNvdXJjZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJTb3VyY2VzW2VdICYmIHRoaXMud29ya2VyU291cmNlc1tlXVt0LnR5cGVdICYmIHRoaXMud29ya2VyU291cmNlc1tlXVt0LnR5cGVdW3Quc291cmNlXSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMud29ya2VyU291cmNlc1tlXVt0LnR5cGVdW3Quc291cmNlXTtcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1tlXVt0LnR5cGVdW3Quc291cmNlXSwgdm9pZCAwICE9PSBpLnJlbW92ZVNvdXJjZSA/IGkucmVtb3ZlU291cmNlKHQsIHIpIDogcigpO1xuICAgICAgfVxuICAgIH0sIFNlLnByb3RvdHlwZS5sb2FkV29ya2VyU291cmNlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHQudXJsKSwgcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByKGUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSwgU2UucHJvdG90eXBlLnN5bmNSVExQbHVnaW5TdGF0ZSA9IGZ1bmN0aW9uICh0LCByLCBpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlLnBsdWdpbi5zZXRTdGF0ZShyKTtcbiAgICAgICAgdmFyIG8gPSBlLnBsdWdpbi5nZXRQbHVnaW5VUkwoKTtcblxuICAgICAgICBpZiAoZS5wbHVnaW4uaXNMb2FkZWQoKSAmJiAhZS5wbHVnaW4uaXNQYXJzZWQoKSAmJiBudWxsICE9IG8pIHtcbiAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhvKTtcbiAgICAgICAgICB2YXIgbiA9IGUucGx1Z2luLmlzUGFyc2VkKCk7XG4gICAgICAgICAgaShuID8gdm9pZCAwIDogbmV3IEVycm9yKFwiUlRMIFRleHQgUGx1Z2luIGZhaWxlZCB0byBpbXBvcnQgc2NyaXB0cyBmcm9tIFwiICsgbyksIG4pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGkoZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9LCBTZS5wcm90b3R5cGUuZ2V0QXZhaWxhYmxlSW1hZ2VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5hdmFpbGFibGVJbWFnZXNbZV07XG4gICAgICByZXR1cm4gdCB8fCAodCA9IFtdKSwgdDtcbiAgICB9LCBTZS5wcm90b3R5cGUuZ2V0TGF5ZXJJbmRleCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdCA9IHRoaXMubGF5ZXJJbmRleGVzW2VdO1xuICAgICAgcmV0dXJuIHQgfHwgKHQgPSB0aGlzLmxheWVySW5kZXhlc1tlXSA9IG5ldyBpKCkpLCB0O1xuICAgIH0sIFNlLnByb3RvdHlwZS5nZXRXb3JrZXJTb3VyY2UgPSBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgICAgdmFyIGkgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMud29ya2VyU291cmNlc1tlXSB8fCAodGhpcy53b3JrZXJTb3VyY2VzW2VdID0ge30pLCB0aGlzLndvcmtlclNvdXJjZXNbZV1bdF0gfHwgKHRoaXMud29ya2VyU291cmNlc1tlXVt0XSA9IHt9KSwgdGhpcy53b3JrZXJTb3VyY2VzW2VdW3RdW3JdIHx8ICh0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bcl0gPSBuZXcgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1t0XSh7XG4gICAgICAgIHNlbmQ6IGZ1bmN0aW9uIHNlbmQodCwgciwgbykge1xuICAgICAgICAgIGkuYWN0b3Iuc2VuZCh0LCByLCBvLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5nZXRMYXllckluZGV4KGUpLCB0aGlzLmdldEF2YWlsYWJsZUltYWdlcyhlKSkpLCB0aGlzLndvcmtlclNvdXJjZXNbZV1bdF1bcl07XG4gICAgfSwgU2UucHJvdG90eXBlLmdldERFTVdvcmtlclNvdXJjZSA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdIHx8ICh0aGlzLmRlbVdvcmtlclNvdXJjZXNbZV0gPSB7fSksIHRoaXMuZGVtV29ya2VyU291cmNlc1tlXVt0XSB8fCAodGhpcy5kZW1Xb3JrZXJTb3VyY2VzW2VdW3RdID0gbmV3IGgoKSksIHRoaXMuZGVtV29ya2VyU291cmNlc1tlXVt0XTtcbiAgICB9LCBTZS5wcm90b3R5cGUuZW5mb3JjZUNhY2hlU2l6ZUxpbWl0ID0gZnVuY3Rpb24gKHQsIHIpIHtcbiAgICAgIGUuZW5mb3JjZUNhY2hlU2l6ZUxpbWl0KHIpO1xuICAgIH0sIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHNlbGYgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmIChzZWxmLndvcmtlciA9IG5ldyBTZShzZWxmKSksIFNlO1xuICB9KTtcbiAgZGVmaW5lKFtcIi4vc2hhcmVkXCJdLCBmdW5jdGlvbiAodCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIGUgPSB0LmNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKHQpIHtcbiAgICAgICAgcmV0dXJuICFpKHQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpKHQpIHtcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHdpbmRvdyB8fCBcInVuZGVmaW5lZFwiID09IHR5cGVvZiBkb2N1bWVudCA/IFwibm90IGEgYnJvd3NlclwiIDogQXJyYXkucHJvdG90eXBlICYmIEFycmF5LnByb3RvdHlwZS5ldmVyeSAmJiBBcnJheS5wcm90b3R5cGUuZmlsdGVyICYmIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICYmIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiAmJiBBcnJheS5wcm90b3R5cGUubWFwICYmIEFycmF5LnByb3RvdHlwZS5zb21lICYmIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgJiYgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ICYmIEFycmF5LmlzQXJyYXkgPyBGdW5jdGlvbi5wcm90b3R5cGUgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPyBPYmplY3Qua2V5cyAmJiBPYmplY3QuY3JlYXRlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAmJiBPYmplY3QuaXNTZWFsZWQgJiYgT2JqZWN0LmlzRnJvemVuICYmIE9iamVjdC5pc0V4dGVuc2libGUgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgJiYgT2JqZWN0LnNlYWwgJiYgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPyBcIkpTT05cIiBpbiB3aW5kb3cgJiYgXCJwYXJzZVwiIGluIEpTT04gJiYgXCJzdHJpbmdpZnlcIiBpbiBKU09OID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghKFwiV29ya2VyXCIgaW4gd2luZG93ICYmIFwiQmxvYlwiIGluIHdpbmRvdyAmJiBcIlVSTFwiIGluIHdpbmRvdykpIHJldHVybiAhMTtcbiAgICAgICAgICB2YXIgdCxcbiAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgaSA9IG5ldyBCbG9iKFtcIlwiXSwge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBvID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlID0gbmV3IFdvcmtlcihvKSwgdCA9ICEwO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHQgPSAhMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZSAmJiBlLnRlcm1pbmF0ZSgpLCBVUkwucmV2b2tlT2JqZWN0VVJMKG8pLCB0O1xuICAgICAgICB9KCkgPyBcIlVpbnQ4Q2xhbXBlZEFycmF5XCIgaW4gd2luZG93ID8gQXJyYXlCdWZmZXIuaXNWaWV3ID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICB0LndpZHRoID0gdC5oZWlnaHQgPSAxO1xuICAgICAgICAgIHZhciBlID0gdC5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgaWYgKCFlKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIGkgPSBlLmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICAgICAgICByZXR1cm4gaSAmJiBpLndpZHRoID09PSB0LndpZHRoO1xuICAgICAgICB9KCkgPyAodm9pZCAwID09PSBvW2kgPSB0ICYmIHQuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gJiYgKG9baV0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBpID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHZhciBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxcbiAgICAgICAgICAgICAgICBvID0gT2JqZWN0LmNyZWF0ZShlLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIG8uZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IHQsIGkucHJvYmFibHlTdXBwb3J0c0NvbnRleHQgPyBpLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KFwid2ViZ2xcIiwgbykgfHwgaS5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCBvKSA6IGkuc3VwcG9ydHNDb250ZXh0ID8gaS5zdXBwb3J0c0NvbnRleHQoXCJ3ZWJnbFwiLCBvKSB8fCBpLnN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCBvKSA6IGkuZ2V0Q29udGV4dChcIndlYmdsXCIsIG8pIHx8IGkuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCBvKTtcbiAgICAgICAgICB9KHQpO1xuXG4gICAgICAgICAgaWYgKCFpKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIG8gPSBpLmNyZWF0ZVNoYWRlcihpLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICAgIHJldHVybiAhKCFvIHx8IGkuaXNDb250ZXh0TG9zdCgpKSAmJiAoaS5zaGFkZXJTb3VyY2UobywgXCJ2b2lkIG1haW4oKSB7fVwiKSwgaS5jb21waWxlU2hhZGVyKG8pLCAhMCA9PT0gaS5nZXRTaGFkZXJQYXJhbWV0ZXIobywgaS5DT01QSUxFX1NUQVRVUykpO1xuICAgICAgICB9KGkpKSwgb1tpXSA/IHZvaWQgMCA6IFwiaW5zdWZmaWNpZW50IFdlYkdMIHN1cHBvcnRcIikgOiBcImluc3VmZmljaWVudCBDYW52YXMvZ2V0SW1hZ2VEYXRhIHN1cHBvcnRcIiA6IFwiaW5zdWZmaWNpZW50IEFycmF5QnVmZmVyIHN1cHBvcnRcIiA6IFwiaW5zdWZmaWNpZW50IFVpbnQ4Q2xhbXBlZEFycmF5IHN1cHBvcnRcIiA6IFwiaW5zdWZmaWNpZW50IHdvcmtlciBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCBKU09OIHN1cHBvcnRcIiA6IFwiaW5zdWZmaWNpZW50IE9iamVjdCBzdXBwb3J0XCIgOiBcImluc3VmZmljaWVudCBGdW5jdGlvbiBzdXBwb3J0XCIgOiBcImluc3VmZmljZW50IEFycmF5IHN1cHBvcnRcIjtcbiAgICAgICAgdmFyIGk7XG4gICAgICB9XG5cbiAgICAgIHQuZXhwb3J0cyA/IHQuZXhwb3J0cyA9IGUgOiB3aW5kb3cgJiYgKHdpbmRvdy5tYXBib3hnbCA9IHdpbmRvdy5tYXBib3hnbCB8fCB7fSwgd2luZG93Lm1hcGJveGdsLnN1cHBvcnRlZCA9IGUsIHdpbmRvdy5tYXBib3hnbC5ub3RTdXBwb3J0ZWRSZWFzb24gPSBpKTtcbiAgICAgIHZhciBvID0ge307XG4gICAgICBlLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGFudGlhbGlhczogITEsXG4gICAgICAgIGFscGhhOiAhMCxcbiAgICAgICAgc3RlbmNpbDogITAsXG4gICAgICAgIGRlcHRoOiAhMFxuICAgICAgfTtcbiAgICB9KSxcbiAgICAgICAgaSA9IHtcbiAgICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKGUsIGksIG8pIHtcbiAgICAgICAgdmFyIHIgPSB0LndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBpICYmIChyLmNsYXNzTmFtZSA9IGkpLCBvICYmIG8uYXBwZW5kQ2hpbGQociksIHI7XG4gICAgICB9LFxuICAgICAgY3JlYXRlTlM6IGZ1bmN0aW9uIGNyZWF0ZU5TKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHQud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhlLCBpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgICBvID0gdC53aW5kb3cuZG9jdW1lbnQgJiYgdC53aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gICAgZnVuY3Rpb24gcih0KSB7XG4gICAgICBpZiAoIW8pIHJldHVybiB0WzBdO1xuXG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgaWYgKHRbZV0gaW4gbykgcmV0dXJuIHRbZV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0WzBdO1xuICAgIH1cblxuICAgIHZhciBhLFxuICAgICAgICBuID0gcihbXCJ1c2VyU2VsZWN0XCIsIFwiTW96VXNlclNlbGVjdFwiLCBcIldlYmtpdFVzZXJTZWxlY3RcIiwgXCJtc1VzZXJTZWxlY3RcIl0pO1xuICAgIGkuZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBvICYmIG4gJiYgKGEgPSBvW25dLCBvW25dID0gXCJub25lXCIpO1xuICAgIH0sIGkuZW5hYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG8gJiYgbiAmJiAob1tuXSA9IGEpO1xuICAgIH07XG4gICAgdmFyIHMgPSByKFtcInRyYW5zZm9ybVwiLCBcIldlYmtpdFRyYW5zZm9ybVwiXSk7XG5cbiAgICBpLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0LnN0eWxlW3NdID0gZTtcbiAgICB9O1xuXG4gICAgdmFyIGwgPSAhMTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgYyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgXCJwYXNzaXZlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgbCA9ICEwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHQud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIGMsIGMpLCB0LndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLCBjLCBjKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICBsID0gITE7XG4gICAgfVxuXG4gICAgaS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdC5hZGRFdmVudExpc3RlbmVyKGUsIGksIFwicGFzc2l2ZVwiIGluIG8gJiYgbCA/IG8gOiBvLmNhcHR1cmUpO1xuICAgIH0sIGkucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBpLCBcInBhc3NpdmVcIiBpbiBvICYmIGwgPyBvIDogby5jYXB0dXJlKTtcbiAgICB9O1xuXG4gICAgdmFyIHUgPSBmdW5jdGlvbiB1KGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKSwgZS5zdG9wUHJvcGFnYXRpb24oKSwgdC53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHUsICEwKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaCh0KSB7XG4gICAgICB2YXIgZSA9IHQudXNlckltYWdlO1xuICAgICAgcmV0dXJuICEhKGUgJiYgZS5yZW5kZXIgJiYgZS5yZW5kZXIoKSkgJiYgKHQuZGF0YS5yZXBsYWNlKG5ldyBVaW50OEFycmF5KGUuZGF0YS5idWZmZXIpKSwgITApO1xuICAgIH1cblxuICAgIGkuc3VwcHJlc3NDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHQud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB1LCAhMCksIHQud2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0LndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdSwgITApO1xuICAgICAgfSwgMCk7XG4gICAgfSwgaS5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQoaS5jbGllbnRYIC0gby5sZWZ0IC0gZS5jbGllbnRMZWZ0LCBpLmNsaWVudFkgLSBvLnRvcCAtIGUuY2xpZW50VG9wKTtcbiAgICB9LCBpLnRvdWNoUG9zID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByID0gW10sIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICByLnB1c2gobmV3IHQuUG9pbnQoaVthXS5jbGllbnRYIC0gby5sZWZ0IC0gZS5jbGllbnRMZWZ0LCBpW2FdLmNsaWVudFkgLSBvLnRvcCAtIGUuY2xpZW50VG9wKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sIGkubW91c2VCdXR0b24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdC53aW5kb3cuSW5zdGFsbFRyaWdnZXIgJiYgMiA9PT0gZS5idXR0b24gJiYgZS5jdHJsS2V5ICYmIHQud2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJNQUNcIikgPj0gMCA/IDAgOiBlLmJ1dHRvbjtcbiAgICB9LCBpLnJlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0LnBhcmVudE5vZGUgJiYgdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO1xuICAgIH07XG5cbiAgICB2YXIgcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKCkge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMuaW1hZ2VzID0ge30sIHRoaXMudXBkYXRlZEltYWdlcyA9IHt9LCB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZSA9IHt9LCB0aGlzLmxvYWRlZCA9ICExLCB0aGlzLnJlcXVlc3RvcnMgPSBbXSwgdGhpcy5wYXR0ZXJucyA9IHt9LCB0aGlzLmF0bGFzSW1hZ2UgPSBuZXcgdC5SR0JBSW1hZ2Uoe1xuICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgIGhlaWdodDogMVxuICAgICAgICB9KSwgdGhpcy5kaXJ0eSA9ICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5pc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0TG9hZGVkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkICE9PSB0ICYmICh0aGlzLmxvYWRlZCA9IHQsIHQpKSB7XG4gICAgICAgICAgZm9yICh2YXIgZSA9IDAsIGkgPSB0aGlzLnJlcXVlc3RvcnM7IGUgPCBpLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbyA9IGlbZV07XG5cbiAgICAgICAgICAgIHRoaXMuX25vdGlmeShvLmlkcywgby5jYWxsYmFjayk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEltYWdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3RdO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZSh0LCBlKSAmJiAodGhpcy5pbWFnZXNbdF0gPSBlKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl92YWxpZGF0ZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gITA7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaS5zdHJldGNoWCwgaS5kYXRhICYmIGkuZGF0YS53aWR0aCkgfHwgKHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignSW1hZ2UgXCInICsgZSArICdcIiBoYXMgaW52YWxpZCBcInN0cmV0Y2hYXCIgdmFsdWUnKSkpLCBvID0gITEpLCB0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaS5zdHJldGNoWSwgaS5kYXRhICYmIGkuZGF0YS5oZWlnaHQpIHx8ICh0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ltYWdlIFwiJyArIGUgKyAnXCIgaGFzIGludmFsaWQgXCJzdHJldGNoWVwiIHZhbHVlJykpKSwgbyA9ICExKSwgdGhpcy5fdmFsaWRhdGVDb250ZW50KGkuY29udGVudCwgaSkgfHwgKHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignSW1hZ2UgXCInICsgZSArICdcIiBoYXMgaW52YWxpZCBcImNvbnRlbnRcIiB2YWx1ZScpKSksIG8gPSAhMSksIG87XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGVTdHJldGNoID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKCF0KSByZXR1cm4gITA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG8gPSAwLCByID0gdDsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IHJbb107XG4gICAgICAgICAgaWYgKGFbMF0gPCBpIHx8IGFbMV0gPCBhWzBdIHx8IGUgPCBhWzFdKSByZXR1cm4gITE7XG4gICAgICAgICAgaSA9IGFbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGVDb250ZW50ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuICEodCAmJiAoNCAhPT0gdC5sZW5ndGggfHwgdFswXSA8IDAgfHwgZS5kYXRhLndpZHRoIDwgdFswXSB8fCB0WzFdIDwgMCB8fCBlLmRhdGEuaGVpZ2h0IDwgdFsxXSB8fCB0WzJdIDwgMCB8fCBlLmRhdGEud2lkdGggPCB0WzJdIHx8IHRbM10gPCAwIHx8IGUuZGF0YS5oZWlnaHQgPCB0WzNdIHx8IHRbMl0gPCB0WzBdIHx8IHRbM10gPCB0WzFdKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVJbWFnZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGUudmVyc2lvbiA9IHRoaXMuaW1hZ2VzW3RdLnZlcnNpb24gKyAxLCB0aGlzLmltYWdlc1t0XSA9IGUsIHRoaXMudXBkYXRlZEltYWdlc1t0XSA9ICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVtb3ZlSW1hZ2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuaW1hZ2VzW3RdO1xuICAgICAgICBkZWxldGUgdGhpcy5pbWFnZXNbdF0sIGRlbGV0ZSB0aGlzLnBhdHRlcm5zW3RdLCBlLnVzZXJJbWFnZSAmJiBlLnVzZXJJbWFnZS5vblJlbW92ZSAmJiBlLnVzZXJJbWFnZS5vblJlbW92ZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubGlzdEltYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW1hZ2VzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEltYWdlcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gITA7XG4gICAgICAgIGlmICghdGhpcy5pc0xvYWRlZCgpKSBmb3IgKHZhciBvID0gMCwgciA9IHQ7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZXNbcltvXV0gfHwgKGkgPSAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0xvYWRlZCgpIHx8IGkgPyB0aGlzLl9ub3RpZnkodCwgZSkgOiB0aGlzLnJlcXVlc3RvcnMucHVzaCh7XG4gICAgICAgICAgaWRzOiB0LFxuICAgICAgICAgIGNhbGxiYWNrOiBlXG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX25vdGlmeSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIGZvciAodmFyIG8gPSB7fSwgciA9IDAsIGEgPSBlOyByIDwgYS5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgIHZhciBuID0gYVtyXTtcbiAgICAgICAgICB0aGlzLmltYWdlc1tuXSB8fCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJzdHlsZWltYWdlbWlzc2luZ1wiLCB7XG4gICAgICAgICAgICBpZDogblxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB2YXIgcyA9IHRoaXMuaW1hZ2VzW25dO1xuICAgICAgICAgIHMgPyBvW25dID0ge1xuICAgICAgICAgICAgZGF0YTogcy5kYXRhLmNsb25lKCksXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBzLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICBzZGY6IHMuc2RmLFxuICAgICAgICAgICAgdmVyc2lvbjogcy52ZXJzaW9uLFxuICAgICAgICAgICAgc3RyZXRjaFg6IHMuc3RyZXRjaFgsXG4gICAgICAgICAgICBzdHJldGNoWTogcy5zdHJldGNoWSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHMuY29udGVudCxcbiAgICAgICAgICAgIGhhc1JlbmRlckNhbGxiYWNrOiBCb29sZWFuKHMudXNlckltYWdlICYmIHMudXNlckltYWdlLnJlbmRlcilcbiAgICAgICAgICB9IDogdC53YXJuT25jZSgnSW1hZ2UgXCInICsgbiArICdcIiBjb3VsZCBub3QgYmUgbG9hZGVkLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGFkZGVkIHRoZSBpbWFnZSB3aXRoIG1hcC5hZGRJbWFnZSgpIG9yIGEgXCJzcHJpdGVcIiBwcm9wZXJ0eSBpbiB5b3VyIHN0eWxlLiBZb3UgY2FuIHByb3ZpZGUgbWlzc2luZyBpbWFnZXMgYnkgbGlzdGVuaW5nIGZvciB0aGUgXCJzdHlsZWltYWdlbWlzc2luZ1wiIG1hcCBldmVudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkobnVsbCwgbyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRQaXhlbFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5hdGxhc0ltYWdlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiB0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogdC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFBhdHRlcm4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMucGF0dGVybnNbZV0sXG4gICAgICAgICAgICBvID0gdGhpcy5nZXRJbWFnZShlKTtcbiAgICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGkgJiYgaS5wb3NpdGlvbi52ZXJzaW9uID09PSBvLnZlcnNpb24pIHJldHVybiBpLnBvc2l0aW9uO1xuICAgICAgICBpZiAoaSkgaS5wb3NpdGlvbi52ZXJzaW9uID0gby52ZXJzaW9uO2Vsc2Uge1xuICAgICAgICAgIHZhciByID0ge1xuICAgICAgICAgICAgdzogby5kYXRhLndpZHRoICsgMixcbiAgICAgICAgICAgIGg6IG8uZGF0YS5oZWlnaHQgKyAyLFxuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhID0gbmV3IHQuSW1hZ2VQb3NpdGlvbihyLCBvKTtcbiAgICAgICAgICB0aGlzLnBhdHRlcm5zW2VdID0ge1xuICAgICAgICAgICAgYmluOiByLFxuICAgICAgICAgICAgcG9zaXRpb246IGFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVQYXR0ZXJuQXRsYXMoKSwgdGhpcy5wYXR0ZXJuc1tlXS5wb3NpdGlvbjtcbiAgICAgIH0sIGkucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IGUuZ2w7XG4gICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlID8gdGhpcy5kaXJ0eSAmJiAodGhpcy5hdGxhc1RleHR1cmUudXBkYXRlKHRoaXMuYXRsYXNJbWFnZSksIHRoaXMuZGlydHkgPSAhMSkgOiB0aGlzLmF0bGFzVGV4dHVyZSA9IG5ldyB0LlRleHR1cmUoZSwgdGhpcy5hdGxhc0ltYWdlLCBpLlJHQkEpLCB0aGlzLmF0bGFzVGV4dHVyZS5iaW5kKGkuTElORUFSLCBpLkNMQU1QX1RPX0VER0UpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZVBhdHRlcm5BdGxhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMucGF0dGVybnMpIHtcbiAgICAgICAgICBlLnB1c2godGhpcy5wYXR0ZXJuc1tpXS5iaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG8gPSB0LnBvdHBhY2soZSksXG4gICAgICAgICAgICByID0gby53LFxuICAgICAgICAgICAgYSA9IG8uaCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmF0bGFzSW1hZ2U7XG5cbiAgICAgICAgZm9yICh2YXIgcyBpbiBuLnJlc2l6ZSh7XG4gICAgICAgICAgd2lkdGg6IHIgfHwgMSxcbiAgICAgICAgICBoZWlnaHQ6IGEgfHwgMVxuICAgICAgICB9KSwgdGhpcy5wYXR0ZXJucykge1xuICAgICAgICAgIHZhciBsID0gdGhpcy5wYXR0ZXJuc1tzXS5iaW4sXG4gICAgICAgICAgICAgIGMgPSBsLnggKyAxLFxuICAgICAgICAgICAgICB1ID0gbC55ICsgMSxcbiAgICAgICAgICAgICAgaCA9IHRoaXMuaW1hZ2VzW3NdLmRhdGEsXG4gICAgICAgICAgICAgIHAgPSBoLndpZHRoLFxuICAgICAgICAgICAgICBkID0gaC5oZWlnaHQ7XG4gICAgICAgICAgdC5SR0JBSW1hZ2UuY29weShoLCBuLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IGMsXG4gICAgICAgICAgICB5OiB1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2lkdGg6IHAsXG4gICAgICAgICAgICBoZWlnaHQ6IGRcbiAgICAgICAgICB9KSwgdC5SR0JBSW1hZ2UuY29weShoLCBuLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogZCAtIDFcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBjLFxuICAgICAgICAgICAgeTogdSAtIDFcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3aWR0aDogcCxcbiAgICAgICAgICAgIGhlaWdodDogMVxuICAgICAgICAgIH0pLCB0LlJHQkFJbWFnZS5jb3B5KGgsIG4sIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogYyxcbiAgICAgICAgICAgIHk6IHUgKyBkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2lkdGg6IHAsXG4gICAgICAgICAgICBoZWlnaHQ6IDFcbiAgICAgICAgICB9KSwgdC5SR0JBSW1hZ2UuY29weShoLCBuLCB7XG4gICAgICAgICAgICB4OiBwIC0gMSxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBjIC0gMSxcbiAgICAgICAgICAgIHk6IHVcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgIGhlaWdodDogZFxuICAgICAgICAgIH0pLCB0LlJHQkFJbWFnZS5jb3B5KGgsIG4sIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogYyArIHAsXG4gICAgICAgICAgICB5OiB1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBoZWlnaHQ6IGRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSAhMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmJlZ2luRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lID0ge307XG4gICAgICB9LCBpLnByb3RvdHlwZS5kaXNwYXRjaFJlbmRlckNhbGxiYWNrcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCBpID0gdDsgZSA8IGkubGVuZ3RoOyBlICs9IDEpIHtcbiAgICAgICAgICB2YXIgbyA9IGlbZV07XG5cbiAgICAgICAgICBpZiAoIXRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW29dKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZVtvXSA9ICEwO1xuICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmltYWdlc1tvXTtcbiAgICAgICAgICAgIGgocikgJiYgdGhpcy51cGRhdGVJbWFnZShvLCByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGk7XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICBkID0gbSxcbiAgICAgICAgXyA9IG0sXG4gICAgICAgIGYgPSAxZTIwO1xuXG4gICAgZnVuY3Rpb24gbSh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB0aGlzLmZvbnRTaXplID0gdCB8fCAyNCwgdGhpcy5idWZmZXIgPSB2b2lkIDAgPT09IGUgPyAzIDogZSwgdGhpcy5jdXRvZmYgPSBvIHx8IC4yNSwgdGhpcy5mb250RmFtaWx5ID0gciB8fCBcInNhbnMtc2VyaWZcIiwgdGhpcy5mb250V2VpZ2h0ID0gYSB8fCBcIm5vcm1hbFwiLCB0aGlzLnJhZGl1cyA9IGkgfHwgODtcbiAgICAgIHZhciBuID0gdGhpcy5zaXplID0gdGhpcy5mb250U2l6ZSArIDIgKiB0aGlzLmJ1ZmZlcjtcbiAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSwgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSBuLCB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSwgdGhpcy5jdHguZm9udCA9IHRoaXMuZm9udFdlaWdodCArIFwiIFwiICsgdGhpcy5mb250U2l6ZSArIFwicHggXCIgKyB0aGlzLmZvbnRGYW1pbHksIHRoaXMuY3R4LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCIsIHRoaXMuY3R4LmZpbGxTdHlsZSA9IFwiYmxhY2tcIiwgdGhpcy5ncmlkT3V0ZXIgPSBuZXcgRmxvYXQ2NEFycmF5KG4gKiBuKSwgdGhpcy5ncmlkSW5uZXIgPSBuZXcgRmxvYXQ2NEFycmF5KG4gKiBuKSwgdGhpcy5mID0gbmV3IEZsb2F0NjRBcnJheShuKSwgdGhpcy5kID0gbmV3IEZsb2F0NjRBcnJheShuKSwgdGhpcy56ID0gbmV3IEZsb2F0NjRBcnJheShuICsgMSksIHRoaXMudiA9IG5ldyBJbnQxNkFycmF5KG4pLCB0aGlzLm1pZGRsZSA9IE1hdGgucm91bmQobiAvIDIgKiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiR2Vja28vXCIpID49IDAgPyAxLjIgOiAxKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZyh0LCBlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICBmb3IgKHZhciBzID0gMDsgcyA8IGU7IHMrKykge1xuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGk7IGwrKykge1xuICAgICAgICAgIG9bbF0gPSB0W2wgKiBlICsgc107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHYobywgciwgYSwgbiwgaSksIGwgPSAwOyBsIDwgaTsgbCsrKSB7XG4gICAgICAgICAgdFtsICogZSArIHNdID0gcltsXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGwgPSAwOyBsIDwgaTsgbCsrKSB7XG4gICAgICAgIGZvciAocyA9IDA7IHMgPCBlOyBzKyspIHtcbiAgICAgICAgICBvW3NdID0gdFtsICogZSArIHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2KG8sIHIsIGEsIG4sIGUpLCBzID0gMDsgcyA8IGU7IHMrKykge1xuICAgICAgICAgIHRbbCAqIGUgKyBzXSA9IE1hdGguc3FydChyW3NdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHYodCwgZSwgaSwgbywgcikge1xuICAgICAgaVswXSA9IDAsIG9bMF0gPSAtZiwgb1sxXSA9ICtmO1xuXG4gICAgICBmb3IgKHZhciBhID0gMSwgbiA9IDA7IGEgPCByOyBhKyspIHtcbiAgICAgICAgZm9yICh2YXIgcyA9ICh0W2FdICsgYSAqIGEgLSAodFtpW25dXSArIGlbbl0gKiBpW25dKSkgLyAoMiAqIGEgLSAyICogaVtuXSk7IHMgPD0gb1tuXTspIHtcbiAgICAgICAgICBuLS0sIHMgPSAodFthXSArIGEgKiBhIC0gKHRbaVtuXV0gKyBpW25dICogaVtuXSkpIC8gKDIgKiBhIC0gMiAqIGlbbl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaVsrK25dID0gYSwgb1tuXSA9IHMsIG9bbiArIDFdID0gK2Y7XG4gICAgICB9XG5cbiAgICAgIGZvciAoYSA9IDAsIG4gPSAwOyBhIDwgcjsgYSsrKSB7XG4gICAgICAgIGZvciAoOyBvW24gKyAxXSA8IGE7KSB7XG4gICAgICAgICAgbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZVthXSA9IChhIC0gaVtuXSkgKiAoYSAtIGlbbl0pICsgdFtpW25dXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSksIHRoaXMuY3R4LmZpbGxUZXh0KHQsIHRoaXMuYnVmZmVyLCB0aGlzLm1pZGRsZSk7XG5cbiAgICAgIGZvciAodmFyIGUgPSB0aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5zaXplLCB0aGlzLnNpemUpLCBpID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZSksIG8gPSAwOyBvIDwgdGhpcy5zaXplICogdGhpcy5zaXplOyBvKyspIHtcbiAgICAgICAgdmFyIHIgPSBlLmRhdGFbNCAqIG8gKyAzXSAvIDI1NTtcbiAgICAgICAgdGhpcy5ncmlkT3V0ZXJbb10gPSAxID09PSByID8gMCA6IDAgPT09IHIgPyBmIDogTWF0aC5wb3coTWF0aC5tYXgoMCwgLjUgLSByKSwgMiksIHRoaXMuZ3JpZElubmVyW29dID0gMSA9PT0gciA/IGYgOiAwID09PSByID8gMCA6IE1hdGgucG93KE1hdGgubWF4KDAsIHIgLSAuNSksIDIpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGcodGhpcy5ncmlkT3V0ZXIsIHRoaXMuc2l6ZSwgdGhpcy5zaXplLCB0aGlzLmYsIHRoaXMuZCwgdGhpcy52LCB0aGlzLnopLCBnKHRoaXMuZ3JpZElubmVyLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSwgdGhpcy5mLCB0aGlzLmQsIHRoaXMudiwgdGhpcy56KSwgbyA9IDA7IG8gPCB0aGlzLnNpemUgKiB0aGlzLnNpemU7IG8rKykge1xuICAgICAgICBpW29dID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI1NSAtIDI1NSAqICgodGhpcy5ncmlkT3V0ZXJbb10gLSB0aGlzLmdyaWRJbm5lcltvXSkgLyB0aGlzLnJhZGl1cyArIHRoaXMuY3V0b2ZmKSkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGk7XG4gICAgfSwgZC5kZWZhdWx0ID0gXztcblxuICAgIHZhciB5ID0gZnVuY3Rpb24geSh0LCBlKSB7XG4gICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyID0gdCwgdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBlLCB0aGlzLmVudHJpZXMgPSB7fTtcbiAgICB9O1xuXG4gICAgeS5wcm90b3R5cGUuc2V0VVJMID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMudXJsID0gdDtcbiAgICB9LCB5LnByb3RvdHlwZS5nZXRHbHlwaHMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdmFyIG8gPSB0aGlzLFxuICAgICAgICAgIHIgPSBbXTtcblxuICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSAwLCBzID0gZVthXTsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAgc3RhY2s6IGEsXG4gICAgICAgICAgICBpZDogc1tuXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHQuYXN5bmNBbGwociwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIGkgPSB0LnN0YWNrLFxuICAgICAgICAgICAgciA9IHQuaWQsXG4gICAgICAgICAgICBhID0gby5lbnRyaWVzW2ldO1xuICAgICAgICBhIHx8IChhID0gby5lbnRyaWVzW2ldID0ge1xuICAgICAgICAgIGdseXBoczoge30sXG4gICAgICAgICAgcmVxdWVzdHM6IHt9LFxuICAgICAgICAgIHJhbmdlczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBuID0gYS5nbHlwaHNbcl07XG5cbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gbikge1xuICAgICAgICAgIGlmIChuID0gby5fdGlueVNERihhLCBpLCByKSkgcmV0dXJuIGEuZ2x5cGhzW3JdID0gbiwgdm9pZCBlKG51bGwsIHtcbiAgICAgICAgICAgIHN0YWNrOiBpLFxuICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICBnbHlwaDogblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBzID0gTWF0aC5mbG9vcihyIC8gMjU2KTtcbiAgICAgICAgICBpZiAoMjU2ICogcyA+IDY1NTM1KSBlKG5ldyBFcnJvcihcImdseXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWRcIikpO2Vsc2UgaWYgKGEucmFuZ2VzW3NdKSBlKG51bGwsIHtcbiAgICAgICAgICAgIHN0YWNrOiBpLFxuICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICBnbHlwaDogblxuICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIGwgPSBhLnJlcXVlc3RzW3NdO1xuICAgICAgICAgICAgbCB8fCAobCA9IGEucmVxdWVzdHNbc10gPSBbXSwgeS5sb2FkR2x5cGhSYW5nZShpLCBzLCBvLnVybCwgby5yZXF1ZXN0TWFuYWdlciwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGUpIHtcbiAgICAgICAgICAgICAgICAgIG8uX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoK2kpIHx8IChhLmdseXBoc1sraV0gPSBlWytpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYS5yYW5nZXNbc10gPSAhMDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbDsgciA8IG4ubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgICAgICAgICAoMCwgbltyXSkodCwgZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkZWxldGUgYS5yZXF1ZXN0c1tzXTtcbiAgICAgICAgICAgIH0pKSwgbC5wdXNoKGZ1bmN0aW9uICh0LCBvKSB7XG4gICAgICAgICAgICAgIHQgPyBlKHQpIDogbyAmJiBlKG51bGwsIHtcbiAgICAgICAgICAgICAgICBzdGFjazogaSxcbiAgICAgICAgICAgICAgICBpZDogcixcbiAgICAgICAgICAgICAgICBnbHlwaDogb1tyXSB8fCBudWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgZShudWxsLCB7XG4gICAgICAgICAgc3RhY2s6IGksXG4gICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgZ2x5cGg6IG5cbiAgICAgICAgfSk7XG4gICAgICB9LCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAodCkgaSh0KTtlbHNlIGlmIChlKSB7XG4gICAgICAgICAgZm9yICh2YXIgbyA9IHt9LCByID0gMCwgYSA9IGU7IHIgPCBhLmxlbmd0aDsgciArPSAxKSB7XG4gICAgICAgICAgICB2YXIgbiA9IGFbcl0sXG4gICAgICAgICAgICAgICAgcyA9IG4uc3RhY2ssXG4gICAgICAgICAgICAgICAgbCA9IG4uaWQsXG4gICAgICAgICAgICAgICAgYyA9IG4uZ2x5cGg7XG4gICAgICAgICAgICAob1tzXSB8fCAob1tzXSA9IHt9KSlbbF0gPSBjICYmIHtcbiAgICAgICAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgICAgICAgIGJpdG1hcDogYy5iaXRtYXAuY2xvbmUoKSxcbiAgICAgICAgICAgICAgbWV0cmljczogYy5tZXRyaWNzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkobnVsbCwgbyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHkucHJvdG90eXBlLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiAhIXRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ICYmICh0LmlzQ2hhcltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHNcIl0oZSkgfHwgdC5pc0NoYXJbXCJIYW5ndWwgU3lsbGFibGVzXCJdKGUpIHx8IHQuaXNDaGFyLkhpcmFnYW5hKGUpIHx8IHQuaXNDaGFyLkthdGFrYW5hKGUpKTtcbiAgICB9LCB5LnByb3RvdHlwZS5fdGlueVNERiA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICB2YXIgciA9IHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5O1xuXG4gICAgICBpZiAociAmJiB0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKG8pKSB7XG4gICAgICAgIHZhciBhID0gZS50aW55U0RGO1xuXG4gICAgICAgIGlmICghYSkge1xuICAgICAgICAgIHZhciBuID0gXCI0MDBcIjtcbiAgICAgICAgICAvYm9sZC9pLnRlc3QoaSkgPyBuID0gXCI5MDBcIiA6IC9tZWRpdW0vaS50ZXN0KGkpID8gbiA9IFwiNTAwXCIgOiAvbGlnaHQvaS50ZXN0KGkpICYmIChuID0gXCIyMDBcIiksIGEgPSBlLnRpbnlTREYgPSBuZXcgeS5UaW55U0RGKDI0LCAzLCA4LCAuMjUsIHIsIG4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbyxcbiAgICAgICAgICBiaXRtYXA6IG5ldyB0LkFscGhhSW1hZ2Uoe1xuICAgICAgICAgICAgd2lkdGg6IDMwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzMFxuICAgICAgICAgIH0sIGEuZHJhdyhTdHJpbmcuZnJvbUNoYXJDb2RlKG8pKSksXG4gICAgICAgICAgbWV0cmljczoge1xuICAgICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgICAgaGVpZ2h0OiAyNCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB0b3A6IC04LFxuICAgICAgICAgICAgYWR2YW5jZTogMjRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgeS5sb2FkR2x5cGhSYW5nZSA9IGZ1bmN0aW9uIChlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IDI1NiAqIGksXG4gICAgICAgICAgcyA9IG4gKyAyNTUsXG4gICAgICAgICAgbCA9IHIudHJhbnNmb3JtUmVxdWVzdChyLm5vcm1hbGl6ZUdseXBoc1VSTChvKS5yZXBsYWNlKFwie2ZvbnRzdGFja31cIiwgZSkucmVwbGFjZShcIntyYW5nZX1cIiwgbiArIFwiLVwiICsgcyksIHQuUmVzb3VyY2VUeXBlLkdseXBocyk7XG4gICAgICB0LmdldEFycmF5QnVmZmVyKGwsIGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIGlmIChlKSBhKGUpO2Vsc2UgaWYgKGkpIHtcbiAgICAgICAgICBmb3IgKHZhciBvID0ge30sIHIgPSAwLCBuID0gdC5wYXJzZUdseXBoUEJGKGkpOyByIDwgbi5sZW5ndGg7IHIgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHMgPSBuW3JdO1xuICAgICAgICAgICAgb1tzLmlkXSA9IHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYShudWxsLCBvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgeS5UaW55U0RGID0gZDtcblxuICAgIHZhciB4ID0gZnVuY3Rpb24geCgpIHtcbiAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHQuc3R5bGVTcGVjLmxpZ2h0LnBvc2l0aW9uO1xuICAgIH07XG5cbiAgICB4LnByb3RvdHlwZS5wb3NzaWJseUV2YWx1YXRlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHJldHVybiB0LnNwaGVyaWNhbFRvQ2FydGVzaWFuKGUuZXhwcmVzc2lvbi5ldmFsdWF0ZShpKSk7XG4gICAgfSwgeC5wcm90b3R5cGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdC5udW1iZXIoZS54LCBpLngsIG8pLFxuICAgICAgICB5OiB0Lm51bWJlcihlLnksIGkueSwgbyksXG4gICAgICAgIHo6IHQubnVtYmVyKGUueiwgaS56LCBvKVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIGIgPSBuZXcgdC5Qcm9wZXJ0aWVzKHtcbiAgICAgIGFuY2hvcjogbmV3IHQuRGF0YUNvbnN0YW50UHJvcGVydHkodC5zdHlsZVNwZWMubGlnaHQuYW5jaG9yKSxcbiAgICAgIHBvc2l0aW9uOiBuZXcgeCgpLFxuICAgICAgY29sb3I6IG5ldyB0LkRhdGFDb25zdGFudFByb3BlcnR5KHQuc3R5bGVTcGVjLmxpZ2h0LmNvbG9yKSxcbiAgICAgIGludGVuc2l0eTogbmV3IHQuRGF0YUNvbnN0YW50UHJvcGVydHkodC5zdHlsZVNwZWMubGlnaHQuaW50ZW5zaXR5KVxuICAgIH0pLFxuICAgICAgICB3ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoaSkge1xuICAgICAgICBlLmNhbGwodGhpcyksIHRoaXMuX3RyYW5zaXRpb25hYmxlID0gbmV3IHQuVHJhbnNpdGlvbmFibGUoYiksIHRoaXMuc2V0TGlnaHQoaSksIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5nZXRMaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0TGlnaHQgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBpICYmIChpID0ge30pLCAhdGhpcy5fdmFsaWRhdGUodC52YWxpZGF0ZUxpZ2h0LCBlLCBpKSkgZm9yICh2YXIgbyBpbiBlKSB7XG4gICAgICAgICAgdmFyIHIgPSBlW29dO1xuICAgICAgICAgIHQuZW5kc1dpdGgobywgXCItdHJhbnNpdGlvblwiKSA/IHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFRyYW5zaXRpb24oby5zbGljZSgwLCAtXCItdHJhbnNpdGlvblwiLmxlbmd0aCksIHIpIDogdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VmFsdWUobywgcik7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnVwZGF0ZVRyYW5zaXRpb25zID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnRyYW5zaXRpb25lZCh0LCB0aGlzLl90cmFuc2l0aW9uaW5nKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nLmhhc1RyYW5zaXRpb24oKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5fdHJhbnNpdGlvbmluZy5wb3NzaWJseUV2YWx1YXRlKHQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuICghbyB8fCAhMSAhPT0gby52YWxpZGF0ZSkgJiYgdC5lbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCBlLmNhbGwodC52YWxpZGF0ZVN0eWxlLCB0LmV4dGVuZCh7XG4gICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdseXBoczogITAsXG4gICAgICAgICAgICBzcHJpdGU6ICEwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHlsZVNwZWM6IHQuc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgVCA9IGZ1bmN0aW9uIFQodCwgZSkge1xuICAgICAgdGhpcy53aWR0aCA9IHQsIHRoaXMuaGVpZ2h0ID0gZSwgdGhpcy5uZXh0Um93ID0gMCwgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0KSwgdGhpcy5kYXNoRW50cnkgPSB7fTtcbiAgICB9O1xuXG4gICAgVC5wcm90b3R5cGUuZ2V0RGFzaCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgaSA9IHQuam9pbihcIixcIikgKyBTdHJpbmcoZSk7XG4gICAgICByZXR1cm4gdGhpcy5kYXNoRW50cnlbaV0gfHwgKHRoaXMuZGFzaEVudHJ5W2ldID0gdGhpcy5hZGREYXNoKHQsIGUpKSwgdGhpcy5kYXNoRW50cnlbaV07XG4gICAgfSwgVC5wcm90b3R5cGUuZ2V0RGFzaFJhbmdlcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IFtdLFxuICAgICAgICAgIHIgPSB0Lmxlbmd0aCAlIDIgPT0gMSA/IC10W3QubGVuZ3RoIC0gMV0gKiBpIDogMCxcbiAgICAgICAgICBhID0gdFswXSAqIGksXG4gICAgICAgICAgbiA9ICEwO1xuICAgICAgby5wdXNoKHtcbiAgICAgICAgbGVmdDogcixcbiAgICAgICAgcmlnaHQ6IGEsXG4gICAgICAgIGlzRGFzaDogbixcbiAgICAgICAgemVyb0xlbmd0aDogMCA9PT0gdFswXVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIHMgPSB0WzBdLCBsID0gMTsgbCA8IHQubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgdmFyIGMgPSB0W2xdO1xuICAgICAgICBvLnB1c2goe1xuICAgICAgICAgIGxlZnQ6IHIgPSBzICogaSxcbiAgICAgICAgICByaWdodDogYSA9IChzICs9IGMpICogaSxcbiAgICAgICAgICBpc0Rhc2g6IG4gPSAhbixcbiAgICAgICAgICB6ZXJvTGVuZ3RoOiAwID09PSBjXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbztcbiAgICB9LCBULnByb3RvdHlwZS5hZGRSb3VuZERhc2ggPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgZm9yICh2YXIgbyA9IGUgLyAyLCByID0gLWk7IHIgPD0gaTsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIGEgPSB0aGlzLndpZHRoICogKHRoaXMubmV4dFJvdyArIGkgKyByKSwgbiA9IDAsIHMgPSB0W25dLCBsID0gMDsgbCA8IHRoaXMud2lkdGg7IGwrKykge1xuICAgICAgICAgIGwgLyBzLnJpZ2h0ID4gMSAmJiAocyA9IHRbKytuXSk7XG4gICAgICAgICAgdmFyIGMgPSBNYXRoLmFicyhsIC0gcy5sZWZ0KSxcbiAgICAgICAgICAgICAgdSA9IE1hdGguYWJzKGwgLSBzLnJpZ2h0KSxcbiAgICAgICAgICAgICAgaCA9IE1hdGgubWluKGMsIHUpLFxuICAgICAgICAgICAgICBwID0gdm9pZCAwLFxuICAgICAgICAgICAgICBkID0gciAvIGkgKiAobyArIDEpO1xuXG4gICAgICAgICAgaWYgKHMuaXNEYXNoKSB7XG4gICAgICAgICAgICB2YXIgXyA9IG8gLSBNYXRoLmFicyhkKTtcblxuICAgICAgICAgICAgcCA9IE1hdGguc3FydChoICogaCArIF8gKiBfKTtcbiAgICAgICAgICB9IGVsc2UgcCA9IG8gLSBNYXRoLnNxcnQoaCAqIGggKyBkICogZCk7XG5cbiAgICAgICAgICB0aGlzLmRhdGFbYSArIGxdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBwICsgMTI4KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBULnByb3RvdHlwZS5hZGRSZWd1bGFyRGFzaCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdC5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkge1xuICAgICAgICB2YXIgaSA9IHRbZV0sXG4gICAgICAgICAgICBvID0gdFtlICsgMV07XG4gICAgICAgIGkuemVyb0xlbmd0aCA/IHQuc3BsaWNlKGUsIDEpIDogbyAmJiBvLmlzRGFzaCA9PT0gaS5pc0Rhc2ggJiYgKG8ubGVmdCA9IGkubGVmdCwgdC5zcGxpY2UoZSwgMSkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IHRbMF0sXG4gICAgICAgICAgYSA9IHRbdC5sZW5ndGggLSAxXTtcbiAgICAgIHIuaXNEYXNoID09PSBhLmlzRGFzaCAmJiAoci5sZWZ0ID0gYS5sZWZ0IC0gdGhpcy53aWR0aCwgYS5yaWdodCA9IHIucmlnaHQgKyB0aGlzLndpZHRoKTtcblxuICAgICAgZm9yICh2YXIgbiA9IHRoaXMud2lkdGggKiB0aGlzLm5leHRSb3csIHMgPSAwLCBsID0gdFtzXSwgYyA9IDA7IGMgPCB0aGlzLndpZHRoOyBjKyspIHtcbiAgICAgICAgYyAvIGwucmlnaHQgPiAxICYmIChsID0gdFsrK3NdKTtcbiAgICAgICAgdmFyIHUgPSBNYXRoLmFicyhjIC0gbC5sZWZ0KSxcbiAgICAgICAgICAgIGggPSBNYXRoLmFicyhjIC0gbC5yaWdodCksXG4gICAgICAgICAgICBwID0gTWF0aC5taW4odSwgaCk7XG4gICAgICAgIHRoaXMuZGF0YVtuICsgY10gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIChsLmlzRGFzaCA/IHAgOiAtcCkgKyAxMjgpKTtcbiAgICAgIH1cbiAgICB9LCBULnByb3RvdHlwZS5hZGREYXNoID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHZhciBvID0gaSA/IDcgOiAwLFxuICAgICAgICAgIHIgPSAyICogbyArIDE7XG4gICAgICBpZiAodGhpcy5uZXh0Um93ICsgciA+IHRoaXMuaGVpZ2h0KSByZXR1cm4gdC53YXJuT25jZShcIkxpbmVBdGxhcyBvdXQgb2Ygc3BhY2VcIiksIG51bGw7XG5cbiAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgYSArPSBlW25dO1xuICAgICAgfVxuXG4gICAgICBpZiAoMCAhPT0gYSkge1xuICAgICAgICB2YXIgcyA9IHRoaXMud2lkdGggLyBhLFxuICAgICAgICAgICAgbCA9IHRoaXMuZ2V0RGFzaFJhbmdlcyhlLCB0aGlzLndpZHRoLCBzKTtcbiAgICAgICAgaSA/IHRoaXMuYWRkUm91bmREYXNoKGwsIHMsIG8pIDogdGhpcy5hZGRSZWd1bGFyRGFzaChsKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGMgPSB7XG4gICAgICAgIHk6ICh0aGlzLm5leHRSb3cgKyBvICsgLjUpIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgIGhlaWdodDogMiAqIG8gLyB0aGlzLmhlaWdodCxcbiAgICAgICAgd2lkdGg6IGFcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5uZXh0Um93ICs9IHIsIHRoaXMuZGlydHkgPSAhMCwgYztcbiAgICB9LCBULnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdC5nbDtcbiAgICAgIHRoaXMudGV4dHVyZSA/IChlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKSwgdGhpcy5kaXJ0eSAmJiAodGhpcy5kaXJ0eSA9ICExLCBlLnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELCAwLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZS5BTFBIQSwgZS5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpKSkgOiAodGhpcy50ZXh0dXJlID0gZS5jcmVhdGVUZXh0dXJlKCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpLCBlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELCBlLlRFWFRVUkVfV1JBUF9TLCBlLlJFUEVBVCksIGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsIGUuVEVYVFVSRV9XUkFQX1QsIGUuUkVQRUFUKSwgZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCwgZS5URVhUVVJFX01JTl9GSUxURVIsIGUuTElORUFSKSwgZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCwgZS5URVhUVVJFX01BR19GSUxURVIsIGUuTElORUFSKSwgZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwgMCwgZS5BTFBIQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGUuQUxQSEEsIGUuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKSk7XG4gICAgfTtcblxuICAgIHZhciBFID0gZnVuY3Rpb24gZShpLCBvKSB7XG4gICAgICB0aGlzLndvcmtlclBvb2wgPSBpLCB0aGlzLmFjdG9ycyA9IFtdLCB0aGlzLmN1cnJlbnRBY3RvciA9IDAsIHRoaXMuaWQgPSB0LnVuaXF1ZUlkKCk7XG5cbiAgICAgIGZvciAodmFyIHIgPSB0aGlzLndvcmtlclBvb2wuYWNxdWlyZSh0aGlzLmlkKSwgYSA9IDA7IGEgPCByLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBuID0gbmV3IGUuQWN0b3IoclthXSwgbywgdGhpcy5pZCk7XG4gICAgICAgIG4ubmFtZSA9IFwiV29ya2VyIFwiICsgYSwgdGhpcy5hY3RvcnMucHVzaChuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSShlLCBpLCBvKSB7XG4gICAgICB2YXIgciA9IGZ1bmN0aW9uIHIoX3IyLCBhKSB7XG4gICAgICAgIGlmIChfcjIpIHJldHVybiBvKF9yMik7XG5cbiAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICB2YXIgbiA9IHQucGljayh0LmV4dGVuZChhLCBlKSwgW1widGlsZXNcIiwgXCJtaW56b29tXCIsIFwibWF4em9vbVwiLCBcImF0dHJpYnV0aW9uXCIsIFwibWFwYm94X2xvZ29cIiwgXCJib3VuZHNcIiwgXCJzY2hlbWVcIiwgXCJ0aWxlU2l6ZVwiLCBcImVuY29kaW5nXCJdKTtcbiAgICAgICAgICBhLnZlY3Rvcl9sYXllcnMgJiYgKG4udmVjdG9yTGF5ZXJzID0gYS52ZWN0b3JfbGF5ZXJzLCBuLnZlY3RvckxheWVySWRzID0gbi52ZWN0b3JMYXllcnMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgICAgICB9KSksIG4udGlsZXMgPSBpLmNhbm9uaWNhbGl6ZVRpbGVzZXQobiwgZS51cmwpLCBvKG51bGwsIG4pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZS51cmwgPyB0LmdldEpTT04oaS50cmFuc2Zvcm1SZXF1ZXN0KGkubm9ybWFsaXplU291cmNlVVJMKGUudXJsKSwgdC5SZXNvdXJjZVR5cGUuU291cmNlKSwgcikgOiB0LmJyb3dzZXIuZnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcihudWxsLCBlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIEUucHJvdG90eXBlLmJyb2FkY2FzdCA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICB0LmFzeW5jQWxsKHRoaXMuYWN0b3JzLCBmdW5jdGlvbiAodCwgbykge1xuICAgICAgICB0LnNlbmQoZSwgaSwgbyk7XG4gICAgICB9LCBvID0gbyB8fCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgfSwgRS5wcm90b3R5cGUuZ2V0QWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50QWN0b3IgPSAodGhpcy5jdXJyZW50QWN0b3IgKyAxKSAlIHRoaXMuYWN0b3JzLmxlbmd0aCwgdGhpcy5hY3RvcnNbdGhpcy5jdXJyZW50QWN0b3JdO1xuICAgIH0sIEUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC5yZW1vdmUoKTtcbiAgICAgIH0pLCB0aGlzLmFjdG9ycyA9IFtdLCB0aGlzLndvcmtlclBvb2wucmVsZWFzZSh0aGlzLmlkKTtcbiAgICB9LCBFLkFjdG9yID0gdC5BY3RvcjtcblxuICAgIHZhciBQID0gZnVuY3Rpb24gUChlLCBpLCBvKSB7XG4gICAgICB0aGlzLmJvdW5kcyA9IHQuTG5nTGF0Qm91bmRzLmNvbnZlcnQodGhpcy52YWxpZGF0ZUJvdW5kcyhlKSksIHRoaXMubWluem9vbSA9IGkgfHwgMCwgdGhpcy5tYXh6b29tID0gbyB8fCAyNDtcbiAgICB9O1xuXG4gICAgUC5wcm90b3R5cGUudmFsaWRhdGVCb3VuZHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgJiYgNCA9PT0gdC5sZW5ndGggPyBbTWF0aC5tYXgoLTE4MCwgdFswXSksIE1hdGgubWF4KC05MCwgdFsxXSksIE1hdGgubWluKDE4MCwgdFsyXSksIE1hdGgubWluKDkwLCB0WzNdKV0gOiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICB9LCBQLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IE1hdGgucG93KDIsIGUueiksXG4gICAgICAgICAgbyA9IE1hdGguZmxvb3IodC5tZXJjYXRvclhmcm9tTG5nKHRoaXMuYm91bmRzLmdldFdlc3QoKSkgKiBpKSxcbiAgICAgICAgICByID0gTWF0aC5mbG9vcih0Lm1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkgKiBpKSxcbiAgICAgICAgICBhID0gTWF0aC5jZWlsKHQubWVyY2F0b3JYZnJvbUxuZyh0aGlzLmJvdW5kcy5nZXRFYXN0KCkpICogaSksXG4gICAgICAgICAgbiA9IE1hdGguY2VpbCh0Lm1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0U291dGgoKSkgKiBpKTtcbiAgICAgIHJldHVybiBlLnggPj0gbyAmJiBlLnggPCBhICYmIGUueSA+PSByICYmIGUueSA8IG47XG4gICAgfTtcblxuICAgIHZhciBTID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkoaSwgbywgciwgYSkge1xuICAgICAgICBpZiAoZS5jYWxsKHRoaXMpLCB0aGlzLmlkID0gaSwgdGhpcy5kaXNwYXRjaGVyID0gciwgdGhpcy50eXBlID0gXCJ2ZWN0b3JcIiwgdGhpcy5taW56b29tID0gMCwgdGhpcy5tYXh6b29tID0gMjIsIHRoaXMuc2NoZW1lID0gXCJ4eXpcIiwgdGhpcy50aWxlU2l6ZSA9IDUxMiwgdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCA9ICEwLCB0aGlzLmlzVGlsZUNsaXBwZWQgPSAhMCwgdGhpcy5fbG9hZGVkID0gITEsIHQuZXh0ZW5kKHRoaXMsIHQucGljayhvLCBbXCJ1cmxcIiwgXCJzY2hlbWVcIiwgXCJ0aWxlU2l6ZVwiLCBcInByb21vdGVJZFwiXSkpLCB0aGlzLl9vcHRpb25zID0gdC5leHRlbmQoe1xuICAgICAgICAgIHR5cGU6IFwidmVjdG9yXCJcbiAgICAgICAgfSwgbyksIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG8uY29sbGVjdFJlc291cmNlVGltaW5nLCA1MTIgIT09IHRoaXMudGlsZVNpemUpIHRocm93IG5ldyBFcnJvcihcInZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyXCIpO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoYSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gITEsIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9KSksIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IEkodGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCBmdW5jdGlvbiAoaSwgbykge1xuICAgICAgICAgIGUuX3RpbGVKU09OUmVxdWVzdCA9IG51bGwsIGUuX2xvYWRlZCA9ICEwLCBpID8gZS5maXJlKG5ldyB0LkVycm9yRXZlbnQoaSkpIDogbyAmJiAodC5leHRlbmQoZSwgbyksIG8uYm91bmRzICYmIChlLnRpbGVCb3VuZHMgPSBuZXcgUChvLmJvdW5kcywgZS5taW56b29tLCBlLm1heHpvb20pKSwgdC5wb3N0VHVybnN0aWxlRXZlbnQoby50aWxlcywgZS5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbiksIHQucG9zdE1hcExvYWRFdmVudChvLnRpbGVzLCBlLm1hcC5fZ2V0TWFwSWQoKSwgZS5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbiwgZS5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbiksIGUuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJtZXRhZGF0YVwiXG4gICAgICAgICAgfSkpLCBlLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwiY29udGVudFwiXG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHQuY2Fub25pY2FsKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB0LCB0aGlzLmxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldFNvdXJjZVByb3BlcnR5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ICYmIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKSwgdCgpLCB0aGlzLm1hcC5zdHlsZS5zb3VyY2VDYWNoZXNbdGhpcy5pZF0uY2xlYXJUaWxlcygpLCB0aGlzLmxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldFRpbGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZS5fb3B0aW9ucy50aWxlcyA9IHQ7XG4gICAgICAgIH0pLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0VXJsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZS51cmwgPSB0LCBlLl9vcHRpb25zLnVybCA9IHQ7XG4gICAgICAgIH0pLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCAmJiAodGhpcy5fdGlsZUpTT05SZXF1ZXN0LmNhbmNlbCgpLCB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuZXh0ZW5kKHt9LCB0aGlzLl9vcHRpb25zKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTChlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSksXG4gICAgICAgICAgICByID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KG8sIHQuUmVzb3VyY2VUeXBlLlRpbGUpLFxuICAgICAgICAgIHVpZDogZS51aWQsXG4gICAgICAgICAgdGlsZUlEOiBlLnRpbGVJRCxcbiAgICAgICAgICB6b29tOiBlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSAqIGUudGlsZUlELm92ZXJzY2FsZUZhY3RvcigpLFxuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgcGl4ZWxSYXRpbzogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiB0aGlzLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgICAgcHJvbW90ZUlkOiB0aGlzLnByb21vdGVJZFxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGEobywgcikge1xuICAgICAgICAgIHJldHVybiBkZWxldGUgZS5yZXF1ZXN0LCBlLmFib3J0ZWQgPyBpKG51bGwpIDogbyAmJiA0MDQgIT09IG8uc3RhdHVzID8gaShvKSA6IChyICYmIHIucmVzb3VyY2VUaW1pbmcgJiYgKGUucmVzb3VyY2VUaW1pbmcgPSByLnJlc291cmNlVGltaW5nKSwgdGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMgJiYgciAmJiBlLnNldEV4cGlyeURhdGEociksIGUubG9hZFZlY3RvckRhdGEociwgdGhpcy5tYXAucGFpbnRlciksIHQuY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKSwgaShudWxsKSwgdm9pZCAoZS5yZWxvYWRDYWxsYmFjayAmJiAodGhpcy5sb2FkVGlsZShlLCBlLnJlbG9hZENhbGxiYWNrKSwgZS5yZWxvYWRDYWxsYmFjayA9IG51bGwpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nLCBlLmFjdG9yICYmIFwiZXhwaXJlZFwiICE9PSBlLnN0YXRlID8gXCJsb2FkaW5nXCIgPT09IGUuc3RhdGUgPyBlLnJlbG9hZENhbGxiYWNrID0gaSA6IGUucmVxdWVzdCA9IGUuYWN0b3Iuc2VuZChcInJlbG9hZFRpbGVcIiwgciwgYS5iaW5kKHRoaXMpKSA6IChlLmFjdG9yID0gdGhpcy5kaXNwYXRjaGVyLmdldEFjdG9yKCksIGUucmVxdWVzdCA9IGUuYWN0b3Iuc2VuZChcImxvYWRUaWxlXCIsIHIsIGEuYmluZCh0aGlzKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWJvcnRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC5yZXF1ZXN0ICYmICh0LnJlcXVlc3QuY2FuY2VsKCksIGRlbGV0ZSB0LnJlcXVlc3QpLCB0LmFjdG9yICYmIHQuYWN0b3Iuc2VuZChcImFib3J0VGlsZVwiLCB7XG4gICAgICAgICAgdWlkOiB0LnVpZCxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS51bmxvYWRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC51bmxvYWRWZWN0b3JEYXRhKCksIHQuYWN0b3IgJiYgdC5hY3Rvci5zZW5kKFwicmVtb3ZlVGlsZVwiLCB7XG4gICAgICAgICAgdWlkOiB0LnVpZCxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgQyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGksIG8sIHIsIGEpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLmlkID0gaSwgdGhpcy5kaXNwYXRjaGVyID0gciwgdGhpcy5zZXRFdmVudGVkUGFyZW50KGEpLCB0aGlzLnR5cGUgPSBcInJhc3RlclwiLCB0aGlzLm1pbnpvb20gPSAwLCB0aGlzLm1heHpvb20gPSAyMiwgdGhpcy5yb3VuZFpvb20gPSAhMCwgdGhpcy5zY2hlbWUgPSBcInh5elwiLCB0aGlzLnRpbGVTaXplID0gNTEyLCB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5fb3B0aW9ucyA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICB0eXBlOiBcInJhc3RlclwiXG4gICAgICAgIH0sIG8pLCB0LmV4dGVuZCh0aGlzLCB0LnBpY2sobywgW1widXJsXCIsIFwic2NoZW1lXCIsIFwidGlsZVNpemVcIl0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YWxvYWRpbmdcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiXG4gICAgICAgIH0pKSwgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gSSh0aGlzLl9vcHRpb25zLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIGZ1bmN0aW9uIChpLCBvKSB7XG4gICAgICAgICAgZS5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbCwgZS5fbG9hZGVkID0gITAsIGkgPyBlLmZpcmUobmV3IHQuRXJyb3JFdmVudChpKSkgOiBvICYmICh0LmV4dGVuZChlLCBvKSwgby5ib3VuZHMgJiYgKGUudGlsZUJvdW5kcyA9IG5ldyBQKG8uYm91bmRzLCBlLm1pbnpvb20sIGUubWF4em9vbSkpLCB0LnBvc3RUdXJuc3RpbGVFdmVudChvLnRpbGVzKSwgdC5wb3N0TWFwTG9hZEV2ZW50KG8udGlsZXMsIGUubWFwLl9nZXRNYXBJZCgpLCBlLm1hcC5fcmVxdWVzdE1hbmFnZXIuX3NrdVRva2VuKSwgZS5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcIm1ldGFkYXRhXCJcbiAgICAgICAgICB9KSksIGUuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJjb250ZW50XCJcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB0LCB0aGlzLmxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgJiYgKHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKSwgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LmV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHQuY2Fub25pY2FsKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLFxuICAgICAgICAgICAgciA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVUaWxlVVJMKGUudGlsZUlELmNhbm9uaWNhbC51cmwodGhpcy50aWxlcywgdGhpcy5zY2hlbWUpLCB0aGlzLnRpbGVTaXplKTtcblxuICAgICAgICBlLnJlcXVlc3QgPSB0LmdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHIsIHQuUmVzb3VyY2VUeXBlLlRpbGUpLCBmdW5jdGlvbiAociwgYSkge1xuICAgICAgICAgIGlmIChkZWxldGUgZS5yZXF1ZXN0LCBlLmFib3J0ZWQpIGUuc3RhdGUgPSBcInVubG9hZGVkXCIsIGkobnVsbCk7ZWxzZSBpZiAocikgZS5zdGF0ZSA9IFwiZXJyb3JlZFwiLCBpKHIpO2Vsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIG8ubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzICYmIGUuc2V0RXhwaXJ5RGF0YShhKSwgZGVsZXRlIGEuY2FjaGVDb250cm9sLCBkZWxldGUgYS5leHBpcmVzO1xuICAgICAgICAgICAgdmFyIG4gPSBvLm1hcC5wYWludGVyLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgcyA9IG4uZ2w7XG4gICAgICAgICAgICBlLnRleHR1cmUgPSBvLm1hcC5wYWludGVyLmdldFRpbGVUZXh0dXJlKGEud2lkdGgpLCBlLnRleHR1cmUgPyBlLnRleHR1cmUudXBkYXRlKGEsIHtcbiAgICAgICAgICAgICAgdXNlTWlwbWFwOiAhMFxuICAgICAgICAgICAgfSkgOiAoZS50ZXh0dXJlID0gbmV3IHQuVGV4dHVyZShuLCBhLCBzLlJHQkEsIHtcbiAgICAgICAgICAgICAgdXNlTWlwbWFwOiAhMFxuICAgICAgICAgICAgfSksIGUudGV4dHVyZS5iaW5kKHMuTElORUFSLCBzLkNMQU1QX1RPX0VER0UsIHMuTElORUFSX01JUE1BUF9ORUFSRVNUKSwgbi5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMgJiYgcy50ZXhQYXJhbWV0ZXJmKHMuVEVYVFVSRV8yRCwgbi5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIG4uZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4KSksIGUuc3RhdGUgPSBcImxvYWRlZFwiLCB0LmNhY2hlRW50cnlQb3NzaWJseUFkZGVkKG8uZGlzcGF0Y2hlciksIGkobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFib3J0VGlsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHQucmVxdWVzdCAmJiAodC5yZXF1ZXN0LmNhbmNlbCgpLCBkZWxldGUgdC5yZXF1ZXN0KSwgZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudW5sb2FkVGlsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHQudGV4dHVyZSAmJiB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0LnRleHR1cmUpLCBlKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBpO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgeiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGksIG8sIHIsIGEpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMsIGksIG8sIHIsIGEpLCB0aGlzLnR5cGUgPSBcInJhc3Rlci1kZW1cIiwgdGhpcy5tYXh6b29tID0gMjIsIHRoaXMuX29wdGlvbnMgPSB0LmV4dGVuZCh7XG4gICAgICAgICAgdHlwZTogXCJyYXN0ZXItZGVtXCJcbiAgICAgICAgfSwgbyksIHRoaXMuZW5jb2RpbmcgPSBvLmVuY29kaW5nIHx8IFwibWFwYm94XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcInJhc3Rlci1kZW1cIixcbiAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgIHRpbGVzOiB0aGlzLnRpbGVzLFxuICAgICAgICAgIGJvdW5kczogdGhpcy5ib3VuZHMsXG4gICAgICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTChlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgdGhpcy50aWxlU2l6ZSk7XG5cbiAgICAgICAgZnVuY3Rpb24gcih0LCBvKSB7XG4gICAgICAgICAgdCAmJiAoZS5zdGF0ZSA9IFwiZXJyb3JlZFwiLCBpKHQpKSwgbyAmJiAoZS5kZW0gPSBvLCBlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9ICEwLCBlLnN0YXRlID0gXCJsb2FkZWRcIiwgaShudWxsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnJlcXVlc3QgPSB0LmdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KG8sIHQuUmVzb3VyY2VUeXBlLlRpbGUpLCBmdW5jdGlvbiAobywgYSkge1xuICAgICAgICAgIGlmIChkZWxldGUgZS5yZXF1ZXN0LCBlLmFib3J0ZWQpIGUuc3RhdGUgPSBcInVubG9hZGVkXCIsIGkobnVsbCk7ZWxzZSBpZiAobykgZS5zdGF0ZSA9IFwiZXJyb3JlZFwiLCBpKG8pO2Vsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzICYmIGUuc2V0RXhwaXJ5RGF0YShhKSwgZGVsZXRlIGEuY2FjaGVDb250cm9sLCBkZWxldGUgYS5leHBpcmVzO1xuICAgICAgICAgICAgdmFyIG4gPSB0LndpbmRvdy5JbWFnZUJpdG1hcCAmJiBhIGluc3RhbmNlb2YgdC53aW5kb3cuSW1hZ2VCaXRtYXAgJiYgdC5vZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSA/IGEgOiB0LmJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGEsIDEpLFxuICAgICAgICAgICAgICAgIHMgPSB7XG4gICAgICAgICAgICAgIHVpZDogZS51aWQsXG4gICAgICAgICAgICAgIGNvb3JkOiBlLnRpbGVJRCxcbiAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgICByYXdJbWFnZURhdGE6IG4sXG4gICAgICAgICAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZS5hY3RvciAmJiBcImV4cGlyZWRcIiAhPT0gZS5zdGF0ZSB8fCAoZS5hY3RvciA9IHRoaXMuZGlzcGF0Y2hlci5nZXRBY3RvcigpLCBlLmFjdG9yLnNlbmQoXCJsb2FkREVNVGlsZVwiLCBzLCByLmJpbmQodGhpcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSksIGUubmVpZ2hib3JpbmdUaWxlcyA9IHRoaXMuX2dldE5laWdoYm9yaW5nVGlsZXMoZS50aWxlSUQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2dldE5laWdoYm9yaW5nVGlsZXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IGUuY2Fub25pY2FsLFxuICAgICAgICAgICAgbyA9IE1hdGgucG93KDIsIGkueiksXG4gICAgICAgICAgICByID0gKGkueCAtIDEgKyBvKSAlIG8sXG4gICAgICAgICAgICBhID0gMCA9PT0gaS54ID8gZS53cmFwIC0gMSA6IGUud3JhcCxcbiAgICAgICAgICAgIG4gPSAoaS54ICsgMSArIG8pICUgbyxcbiAgICAgICAgICAgIHMgPSBpLnggKyAxID09PSBvID8gZS53cmFwICsgMSA6IGUud3JhcCxcbiAgICAgICAgICAgIGwgPSB7fTtcbiAgICAgICAgcmV0dXJuIGxbbmV3IHQuT3ZlcnNjYWxlZFRpbGVJRChlLm92ZXJzY2FsZWRaLCBhLCBpLnosIHIsIGkueSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9LCBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgcywgaS56LCBuLCBpLnkpLmtleV0gPSB7XG4gICAgICAgICAgYmFja2ZpbGxlZDogITFcbiAgICAgICAgfSwgaS55ID4gMCAmJiAobFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIGEsIGkueiwgciwgaS55IC0gMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9LCBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgZS53cmFwLCBpLnosIGkueCwgaS55IC0gMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9LCBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgcywgaS56LCBuLCBpLnkgLSAxKS5rZXldID0ge1xuICAgICAgICAgIGJhY2tmaWxsZWQ6ICExXG4gICAgICAgIH0pLCBpLnkgKyAxIDwgbyAmJiAobFtuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUub3ZlcnNjYWxlZFosIGEsIGkueiwgciwgaS55ICsgMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9LCBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgZS53cmFwLCBpLnosIGkueCwgaS55ICsgMSkua2V5XSA9IHtcbiAgICAgICAgICBiYWNrZmlsbGVkOiAhMVxuICAgICAgICB9LCBsW25ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZS5vdmVyc2NhbGVkWiwgcywgaS56LCBuLCBpLnkgKyAxKS5rZXldID0ge1xuICAgICAgICAgIGJhY2tmaWxsZWQ6ICExXG4gICAgICAgIH0pLCBsO1xuICAgICAgfSwgaS5wcm90b3R5cGUudW5sb2FkVGlsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQuZGVtVGV4dHVyZSAmJiB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0LmRlbVRleHR1cmUpLCB0LmZibyAmJiAodC5mYm8uZGVzdHJveSgpLCBkZWxldGUgdC5mYm8pLCB0LmRlbSAmJiBkZWxldGUgdC5kZW0sIGRlbGV0ZSB0Lm5laWdoYm9yaW5nVGlsZXMsIHQuc3RhdGUgPSBcInVubG9hZGVkXCIsIHQuYWN0b3IgJiYgdC5hY3Rvci5zZW5kKFwicmVtb3ZlREVNVGlsZVwiLCB7XG4gICAgICAgICAgdWlkOiB0LnVpZCxcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuaWRcbiAgICAgICAgfSk7XG4gICAgICB9LCBpO1xuICAgIH0oQyksXG4gICAgICAgIEQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaShpLCBvLCByLCBhKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IGksIHRoaXMudHlwZSA9IFwiZ2VvanNvblwiLCB0aGlzLm1pbnpvb20gPSAwLCB0aGlzLm1heHpvb20gPSAxOCwgdGhpcy50aWxlU2l6ZSA9IDUxMiwgdGhpcy5pc1RpbGVDbGlwcGVkID0gITAsIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSAhMCwgdGhpcy5fcmVtb3ZlZCA9ICExLCB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5hY3RvciA9IHIuZ2V0QWN0b3IoKSwgdGhpcy5zZXRFdmVudGVkUGFyZW50KGEpLCB0aGlzLl9kYXRhID0gby5kYXRhLCB0aGlzLl9vcHRpb25zID0gdC5leHRlbmQoe30sIG8pLCB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvLmNvbGxlY3RSZXNvdXJjZVRpbWluZywgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXSwgdm9pZCAwICE9PSBvLm1heHpvb20gJiYgKHRoaXMubWF4em9vbSA9IG8ubWF4em9vbSksIG8udHlwZSAmJiAodGhpcy50eXBlID0gby50eXBlKSwgby5hdHRyaWJ1dGlvbiAmJiAodGhpcy5hdHRyaWJ1dGlvbiA9IG8uYXR0cmlidXRpb24pLCB0aGlzLnByb21vdGVJZCA9IG8ucHJvbW90ZUlkO1xuICAgICAgICB2YXIgbiA9IHQuRVhURU5UIC8gdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zID0gdC5leHRlbmQoe1xuICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICBjbHVzdGVyOiBvLmNsdXN0ZXIgfHwgITEsXG4gICAgICAgICAgZ2VvanNvblZ0T3B0aW9uczoge1xuICAgICAgICAgICAgYnVmZmVyOiAodm9pZCAwICE9PSBvLmJ1ZmZlciA/IG8uYnVmZmVyIDogMTI4KSAqIG4sXG4gICAgICAgICAgICB0b2xlcmFuY2U6ICh2b2lkIDAgIT09IG8udG9sZXJhbmNlID8gby50b2xlcmFuY2UgOiAuMzc1KSAqIG4sXG4gICAgICAgICAgICBleHRlbnQ6IHQuRVhURU5ULFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgbGluZU1ldHJpY3M6IG8ubGluZU1ldHJpY3MgfHwgITEsXG4gICAgICAgICAgICBnZW5lcmF0ZUlkOiBvLmdlbmVyYXRlSWQgfHwgITFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIG1heFpvb206IHZvaWQgMCAhPT0gby5jbHVzdGVyTWF4Wm9vbSA/IE1hdGgubWluKG8uY2x1c3Rlck1heFpvb20sIHRoaXMubWF4em9vbSAtIDEpIDogdGhpcy5tYXh6b29tIC0gMSxcbiAgICAgICAgICAgIG1pblBvaW50czogTWF0aC5tYXgoMiwgby5jbHVzdGVyTWluUG9pbnRzIHx8IDIpLFxuICAgICAgICAgICAgZXh0ZW50OiB0LkVYVEVOVCxcbiAgICAgICAgICAgIHJhZGl1czogKG8uY2x1c3RlclJhZGl1cyB8fCA1MCkgKiBuLFxuICAgICAgICAgICAgbG9nOiAhMSxcbiAgICAgICAgICAgIGdlbmVyYXRlSWQ6IG8uZ2VuZXJhdGVJZCB8fCAhMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2x1c3RlclByb3BlcnRpZXM6IG8uY2x1c3RlclByb3BlcnRpZXMsXG4gICAgICAgICAgZmlsdGVyOiBvLmZpbHRlclxuICAgICAgICB9LCBvLndvcmtlck9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9KSksIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICBpZiAoaSkgZS5maXJlKG5ldyB0LkVycm9yRXZlbnQoaSkpO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIG8gPSB7XG4gICAgICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJtZXRhZGF0YVwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZS5fY29sbGVjdFJlc291cmNlVGltaW5nICYmIGUuX3Jlc291cmNlVGltaW5nICYmIGUuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDAgJiYgKG8ucmVzb3VyY2VUaW1pbmcgPSBlLl9yZXNvdXJjZVRpbWluZywgZS5fcmVzb3VyY2VUaW1pbmcgPSBbXSksIGUuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwgbykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMubWFwID0gdCwgdGhpcy5sb2FkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXREYXRhID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YSA9IGUsIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIlxuICAgICAgICB9KSksIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoZSkgaS5maXJlKG5ldyB0LkVycm9yRXZlbnQoZSkpO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIG8gPSB7XG4gICAgICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJjb250ZW50XCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgJiYgaS5fcmVzb3VyY2VUaW1pbmcgJiYgaS5fcmVzb3VyY2VUaW1pbmcubGVuZ3RoID4gMCAmJiAoby5yZXNvdXJjZVRpbWluZyA9IGkuX3Jlc291cmNlVGltaW5nLCBpLl9yZXNvdXJjZVRpbWluZyA9IFtdKSwgaS5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCBvKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldENsdXN0ZXJFeHBhbnNpb25ab29tID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0b3Iuc2VuZChcImdlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb21cIiwge1xuICAgICAgICAgIGNsdXN0ZXJJZDogdCxcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuaWRcbiAgICAgICAgfSwgZSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRDbHVzdGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rvci5zZW5kKFwiZ2VvanNvbi5nZXRDbHVzdGVyQ2hpbGRyZW5cIiwge1xuICAgICAgICAgIGNsdXN0ZXJJZDogdCxcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuaWRcbiAgICAgICAgfSwgZSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRDbHVzdGVyTGVhdmVzID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0b3Iuc2VuZChcImdlb2pzb24uZ2V0Q2x1c3RlckxlYXZlc1wiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgIGNsdXN0ZXJJZDogdCxcbiAgICAgICAgICBsaW1pdDogZSxcbiAgICAgICAgICBvZmZzZXQ6IGlcbiAgICAgICAgfSwgbyksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdXBkYXRlV29ya2VyRGF0YSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gITE7XG4gICAgICAgIHZhciBvID0gdC5leHRlbmQoe30sIHRoaXMud29ya2VyT3B0aW9ucyksXG4gICAgICAgICAgICByID0gdGhpcy5fZGF0YTtcbiAgICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgciA/IChvLnJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh0LmJyb3dzZXIucmVzb2x2ZVVSTChyKSwgdC5SZXNvdXJjZVR5cGUuU291cmNlKSwgby5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZykgOiBvLmRhdGEgPSBKU09OLnN0cmluZ2lmeShyKSwgdGhpcy5hY3Rvci5zZW5kKHRoaXMudHlwZSArIFwiLmxvYWREYXRhXCIsIG8sIGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICAgICAgaS5fcmVtb3ZlZCB8fCByICYmIHIuYWJhbmRvbmVkIHx8IChpLl9sb2FkZWQgPSAhMCwgciAmJiByLnJlc291cmNlVGltaW5nICYmIHIucmVzb3VyY2VUaW1pbmdbaS5pZF0gJiYgKGkuX3Jlc291cmNlVGltaW5nID0gci5yZXNvdXJjZVRpbWluZ1tpLmlkXS5zbGljZSgwKSksIGkuYWN0b3Iuc2VuZChpLnR5cGUgKyBcIi5jb2FsZXNjZVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IG8uc291cmNlXG4gICAgICAgICAgfSwgbnVsbCksIGUodCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRUaWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLFxuICAgICAgICAgICAgciA9IGUuYWN0b3IgPyBcInJlbG9hZFRpbGVcIiA6IFwibG9hZFRpbGVcIjtcbiAgICAgICAgZS5hY3RvciA9IHRoaXMuYWN0b3IsIGUucmVxdWVzdCA9IHRoaXMuYWN0b3Iuc2VuZChyLCB7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHVpZDogZS51aWQsXG4gICAgICAgICAgdGlsZUlEOiBlLnRpbGVJRCxcbiAgICAgICAgICB6b29tOiBlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgIHBpeGVsUmF0aW86IHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgIHByb21vdGVJZDogdGhpcy5wcm9tb3RlSWRcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGEpIHtcbiAgICAgICAgICByZXR1cm4gZGVsZXRlIGUucmVxdWVzdCwgZS51bmxvYWRWZWN0b3JEYXRhKCksIGUuYWJvcnRlZCA/IGkobnVsbCkgOiB0ID8gaSh0KSA6IChlLmxvYWRWZWN0b3JEYXRhKGEsIG8ubWFwLnBhaW50ZXIsIFwicmVsb2FkVGlsZVwiID09PSByKSwgaShudWxsKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWJvcnRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC5yZXF1ZXN0ICYmICh0LnJlcXVlc3QuY2FuY2VsKCksIGRlbGV0ZSB0LnJlcXVlc3QpLCB0LmFib3J0ZWQgPSAhMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVubG9hZFRpbGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0LnVubG9hZFZlY3RvckRhdGEoKSwgdGhpcy5hY3Rvci5zZW5kKFwicmVtb3ZlVGlsZVwiLCB7XG4gICAgICAgICAgdWlkOiB0LnVpZCxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZWQgPSAhMCwgdGhpcy5hY3Rvci5zZW5kKFwicmVtb3ZlU291cmNlXCIsIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC5leHRlbmQoe30sIHRoaXMuX29wdGlvbnMsIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgZGF0YTogdGhpcy5fZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGk7XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICBBID0gdC5jcmVhdGVMYXlvdXQoW3tcbiAgICAgIG5hbWU6IFwiYV9wb3NcIixcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIGNvbXBvbmVudHM6IDJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcImFfdGV4dHVyZV9wb3NcIixcbiAgICAgIHR5cGU6IFwiSW50MTZcIixcbiAgICAgIGNvbXBvbmVudHM6IDJcbiAgICB9XSksXG4gICAgICAgIE0gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaSh0LCBpLCBvLCByKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5pZCA9IHQsIHRoaXMuZGlzcGF0Y2hlciA9IG8sIHRoaXMuY29vcmRpbmF0ZXMgPSBpLmNvb3JkaW5hdGVzLCB0aGlzLnR5cGUgPSBcImltYWdlXCIsIHRoaXMubWluem9vbSA9IDAsIHRoaXMubWF4em9vbSA9IDIyLCB0aGlzLnRpbGVTaXplID0gNTEyLCB0aGlzLnRpbGVzID0ge30sIHRoaXMuX2xvYWRlZCA9ICExLCB0aGlzLnNldEV2ZW50ZWRQYXJlbnQociksIHRoaXMub3B0aW9ucyA9IGk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9ICExLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCJcbiAgICAgICAgfSkpLCB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmwsIHQuZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodGhpcy51cmwsIHQuUmVzb3VyY2VUeXBlLkltYWdlKSwgZnVuY3Rpb24gKHIsIGEpIHtcbiAgICAgICAgICBvLl9sb2FkZWQgPSAhMCwgciA/IG8uZmlyZShuZXcgdC5FcnJvckV2ZW50KHIpKSA6IGEgJiYgKG8uaW1hZ2UgPSBhLCBlICYmIChvLmNvb3JkaW5hdGVzID0gZSksIGkgJiYgaSgpLCBvLl9maW5pc2hMb2FkaW5nKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVwZGF0ZUltYWdlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZSAmJiB0LnVybCA/ICh0aGlzLm9wdGlvbnMudXJsID0gdC51cmwsIHRoaXMubG9hZCh0LmNvb3JkaW5hdGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZS50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgfSksIHRoaXMpIDogdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLl9maW5pc2hMb2FkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcCAmJiAodGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgc291cmNlRGF0YVR5cGU6IFwibWV0YWRhdGFcIlxuICAgICAgICB9KSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLm1hcCA9IHQsIHRoaXMubG9hZCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBlO1xuICAgICAgICB2YXIgbyA9IGUubWFwKHQuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQpO1xuICAgICAgICB0aGlzLnRpbGVJRCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDEgLyAwLCBvID0gMSAvIDAsIHIgPSAtMSAvIDAsIGEgPSAtMSAvIDAsIG4gPSAwLCBzID0gZTsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBsID0gc1tuXTtcbiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLCBsLngpLCBvID0gTWF0aC5taW4obywgbC55KSwgciA9IE1hdGgubWF4KHIsIGwueCksIGEgPSBNYXRoLm1heChhLCBsLnkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjID0gTWF0aC5tYXgociAtIGksIGEgLSBvKSxcbiAgICAgICAgICAgICAgdSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoLU1hdGgubG9nKGMpIC8gTWF0aC5MTjIpKSxcbiAgICAgICAgICAgICAgaCA9IE1hdGgucG93KDIsIHUpO1xuICAgICAgICAgIHJldHVybiBuZXcgdC5DYW5vbmljYWxUaWxlSUQodSwgTWF0aC5mbG9vcigoaSArIHIpIC8gMiAqIGgpLCBNYXRoLmZsb29yKChvICsgYSkgLyAyICogaCkpO1xuICAgICAgICB9KG8pLCB0aGlzLm1pbnpvb20gPSB0aGlzLm1heHpvb20gPSB0aGlzLnRpbGVJRC56O1xuICAgICAgICB2YXIgciA9IG8ubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIGkudGlsZUlELmdldFRpbGVQb2ludCh0KS5fcm91bmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ib3VuZHNBcnJheSA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0NGk4KCksIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHJbMF0ueCwgclswXS55LCAwLCAwKSwgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2soclsxXS54LCByWzFdLnksIHQuRVhURU5ULCAwKSwgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2soclszXS54LCByWzNdLnksIDAsIHQuRVhURU5UKSwgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2soclsyXS54LCByWzJdLnksIHQuRVhURU5ULCB0LkVYVEVOVCksIHRoaXMuYm91bmRzQnVmZmVyICYmICh0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCksIGRlbGV0ZSB0aGlzLmJvdW5kc0J1ZmZlciksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcImNvbnRlbnRcIlxuICAgICAgICB9KSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoMCAhPT0gT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoICYmIHRoaXMuaW1hZ2UpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dCxcbiAgICAgICAgICAgICAgaSA9IGUuZ2w7XG5cbiAgICAgICAgICBmb3IgKHZhciBvIGluIHRoaXMuYm91bmRzQnVmZmVyIHx8ICh0aGlzLmJvdW5kc0J1ZmZlciA9IGUuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCBBLm1lbWJlcnMpKSwgdGhpcy5ib3VuZHNTZWdtZW50cyB8fCAodGhpcy5ib3VuZHNTZWdtZW50cyA9IHQuU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpKSwgdGhpcy50ZXh0dXJlIHx8ICh0aGlzLnRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKGUsIHRoaXMuaW1hZ2UsIGkuUkdCQSksIHRoaXMudGV4dHVyZS5iaW5kKGkuTElORUFSLCBpLkNMQU1QX1RPX0VER0UpKSwgdGhpcy50aWxlcykge1xuICAgICAgICAgICAgdmFyIHIgPSB0aGlzLnRpbGVzW29dO1xuICAgICAgICAgICAgXCJsb2FkZWRcIiAhPT0gci5zdGF0ZSAmJiAoci5zdGF0ZSA9IFwibG9hZGVkXCIsIHIudGV4dHVyZSA9IHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkVGlsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHRoaXMudGlsZUlEICYmIHRoaXMudGlsZUlELmVxdWFscyh0LnRpbGVJRC5jYW5vbmljYWwpID8gKHRoaXMudGlsZXNbU3RyaW5nKHQudGlsZUlELndyYXApXSA9IHQsIHQuYnVja2V0cyA9IHt9LCBlKG51bGwpKSA6ICh0LnN0YXRlID0gXCJlcnJvcmVkXCIsIGUobnVsbCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGk7XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICBMID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIGkodCwgaSwgbywgcikge1xuICAgICAgICBlLmNhbGwodGhpcywgdCwgaSwgbywgciksIHRoaXMucm91bmRab29tID0gITAsIHRoaXMudHlwZSA9IFwidmlkZW9cIiwgdGhpcy5vcHRpb25zID0gaTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSAhMTtcbiAgICAgICAgdmFyIGkgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHRoaXMudXJscyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIG8gPSAwLCByID0gaS51cmxzOyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgIHRoaXMudXJscy5wdXNoKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJbb10sIHQuUmVzb3VyY2VUeXBlLlNvdXJjZSkudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQuZ2V0VmlkZW8odGhpcy51cmxzLCBmdW5jdGlvbiAoaSwgbykge1xuICAgICAgICAgIGUuX2xvYWRlZCA9ICEwLCBpID8gZS5maXJlKG5ldyB0LkVycm9yRXZlbnQoaSkpIDogbyAmJiAoZS52aWRlbyA9IG8sIGUudmlkZW8ubG9vcCA9ICEwLCBlLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGUubWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgICAgfSksIGUubWFwICYmIGUudmlkZW8ucGxheSgpLCBlLl9maW5pc2hMb2FkaW5nKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZpZGVvICYmIHRoaXMudmlkZW8ucGF1c2UoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmlkZW8gJiYgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZWVrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMudmlkZW8uc2Vla2FibGU7XG4gICAgICAgICAgZSA8IGkuc3RhcnQoMCkgfHwgZSA+IGkuZW5kKDApID8gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IHQuVmFsaWRhdGlvbkVycm9yKFwic291cmNlcy5cIiArIHRoaXMuaWQsIG51bGwsIFwiUGxheWJhY2sgZm9yIHRoaXMgdmlkZW8gY2FuIGJlIHNldCBvbmx5IGJldHdlZW4gdGhlIFwiICsgaS5zdGFydCgwKSArIFwiIGFuZCBcIiArIGkuZW5kKDApICsgXCItc2Vjb25kIG1hcmsuXCIpKSkgOiB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gZTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VmlkZW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLm1hcCB8fCAodGhpcy5tYXAgPSB0LCB0aGlzLmxvYWQoKSwgdGhpcy52aWRlbyAmJiAodGhpcy52aWRlby5wbGF5KCksIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcykpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghKDAgPT09IE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCB8fCB0aGlzLnZpZGVvLnJlYWR5U3RhdGUgPCAyKSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0LFxuICAgICAgICAgICAgICBpID0gZS5nbDtcblxuICAgICAgICAgIGZvciAodmFyIG8gaW4gdGhpcy5ib3VuZHNCdWZmZXIgfHwgKHRoaXMuYm91bmRzQnVmZmVyID0gZS5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIEEubWVtYmVycykpLCB0aGlzLmJvdW5kc1NlZ21lbnRzIHx8ICh0aGlzLmJvdW5kc1NlZ21lbnRzID0gdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMikpLCB0aGlzLnRleHR1cmUgPyB0aGlzLnZpZGVvLnBhdXNlZCB8fCAodGhpcy50ZXh0dXJlLmJpbmQoaS5MSU5FQVIsIGkuQ0xBTVBfVE9fRURHRSksIGkudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGkuUkdCQSwgaS5VTlNJR05FRF9CWVRFLCB0aGlzLnZpZGVvKSkgOiAodGhpcy50ZXh0dXJlID0gbmV3IHQuVGV4dHVyZShlLCB0aGlzLnZpZGVvLCBpLlJHQkEpLCB0aGlzLnRleHR1cmUuYmluZChpLkxJTkVBUiwgaS5DTEFNUF9UT19FREdFKSksIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIHZhciByID0gdGhpcy50aWxlc1tvXTtcbiAgICAgICAgICAgIFwibG9hZGVkXCIgIT09IHIuc3RhdGUgJiYgKHIuc3RhdGUgPSBcImxvYWRlZFwiLCByLnRleHR1cmUgPSB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwidmlkZW9cIixcbiAgICAgICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhc1RyYW5zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvICYmICF0aGlzLnZpZGVvLnBhdXNlZDtcbiAgICAgIH0sIGk7XG4gICAgfShNKSxcbiAgICAgICAgUiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGksIG8sIHIsIGEpIHtcbiAgICAgICAgZS5jYWxsKHRoaXMsIGksIG8sIHIsIGEpLCBvLmNvb3JkaW5hdGVzID8gQXJyYXkuaXNBcnJheShvLmNvb3JkaW5hdGVzKSAmJiA0ID09PSBvLmNvb3JkaW5hdGVzLmxlbmd0aCAmJiAhby5jb29yZGluYXRlcy5zb21lKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHQpIHx8IDIgIT09IHQubGVuZ3RoIHx8IHQuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIFwibnVtYmVyXCIgIT0gdHlwZW9mIHQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pIHx8IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyBpLCBudWxsLCAnXCJjb29yZGluYXRlc1wiIHByb3BlcnR5IG11c3QgYmUgYW4gYXJyYXkgb2YgNCBsb25naXR1ZGUvbGF0aXR1ZGUgYXJyYXkgcGFpcnMnKSkpIDogdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IHQuVmFsaWRhdGlvbkVycm9yKFwic291cmNlcy5cIiArIGksIG51bGwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiY29vcmRpbmF0ZXNcIicpKSksIG8uYW5pbWF0ZSAmJiBcImJvb2xlYW5cIiAhPSB0eXBlb2Ygby5hbmltYXRlICYmIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyB0LlZhbGlkYXRpb25FcnJvcihcInNvdXJjZXMuXCIgKyBpLCBudWxsLCAnb3B0aW9uYWwgXCJhbmltYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnKSkpLCBvLmNhbnZhcyA/IFwic3RyaW5nXCIgPT0gdHlwZW9mIG8uY2FudmFzIHx8IG8uY2FudmFzIGluc3RhbmNlb2YgdC53aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQgfHwgdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IHQuVmFsaWRhdGlvbkVycm9yKFwic291cmNlcy5cIiArIGksIG51bGwsICdcImNhbnZhc1wiIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCwgb3IgYW4gSFRNTENhbnZhc0VsZW1lbnQgaW5zdGFuY2UnKSkpIDogdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IHQuVmFsaWRhdGlvbkVycm9yKFwic291cmNlcy5cIiArIGksIG51bGwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiY2FudmFzXCInKSkpLCB0aGlzLm9wdGlvbnMgPSBvLCB0aGlzLmFuaW1hdGUgPSB2b2lkIDAgPT09IG8uYW5pbWF0ZSB8fCBvLmFuaW1hdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9ICEwLCB0aGlzLmNhbnZhcyB8fCAodGhpcy5jYW52YXMgPSB0aGlzLm9wdGlvbnMuY2FudmFzIGluc3RhbmNlb2YgdC53aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQgPyB0aGlzLm9wdGlvbnMuY2FudmFzIDogdC53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLmNhbnZhcykpLCB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0LCB0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpID8gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiQ2FudmFzIGRpbWVuc2lvbnMgY2Fubm90IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLlwiKSkpIDogKHRoaXMucGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9wbGF5aW5nID0gITAsIHRoaXMubWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgIH0sIHRoaXMucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fcGxheWluZyAmJiAodGhpcy5wcmVwYXJlKCksIHRoaXMuX3BsYXlpbmcgPSAhMSk7XG4gICAgICAgIH0sIHRoaXMuX2ZpbmlzaExvYWRpbmcoKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcztcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB0LCB0aGlzLmxvYWQoKSwgdGhpcy5jYW52YXMgJiYgdGhpcy5hbmltYXRlICYmIHRoaXMucGxheSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gITE7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoICE9PSB0aGlzLndpZHRoICYmICh0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGgsIGUgPSAhMCksIHRoaXMuY2FudmFzLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQgJiYgKHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0LCBlID0gITApLCAhdGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSAmJiAwICE9PSBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dCxcbiAgICAgICAgICAgICAgbyA9IGkuZ2w7XG5cbiAgICAgICAgICBmb3IgKHZhciByIGluIHRoaXMuYm91bmRzQnVmZmVyIHx8ICh0aGlzLmJvdW5kc0J1ZmZlciA9IGkuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCBBLm1lbWJlcnMpKSwgdGhpcy5ib3VuZHNTZWdtZW50cyB8fCAodGhpcy5ib3VuZHNTZWdtZW50cyA9IHQuU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpKSwgdGhpcy50ZXh0dXJlID8gKGUgfHwgdGhpcy5fcGxheWluZykgJiYgdGhpcy50ZXh0dXJlLnVwZGF0ZSh0aGlzLmNhbnZhcywge1xuICAgICAgICAgICAgcHJlbXVsdGlwbHk6ICEwXG4gICAgICAgICAgfSkgOiB0aGlzLnRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKGksIHRoaXMuY2FudmFzLCBvLlJHQkEsIHtcbiAgICAgICAgICAgIHByZW11bHRpcGx5OiAhMFxuICAgICAgICAgIH0pLCB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICB2YXIgYSA9IHRoaXMudGlsZXNbcl07XG4gICAgICAgICAgICBcImxvYWRlZFwiICE9PSBhLnN0YXRlICYmIChhLnN0YXRlID0gXCJsb2FkZWRcIiwgYS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImNhbnZhc1wiLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxheWluZztcbiAgICAgIH0sIGkucHJvdG90eXBlLl9oYXNJbnZhbGlkRGltZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgdCA9IDAsIGUgPSBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF07IHQgPCBlLmxlbmd0aDsgdCArPSAxKSB7XG4gICAgICAgICAgdmFyIGkgPSBlW3RdO1xuICAgICAgICAgIGlmIChpc05hTihpKSB8fCBpIDw9IDApIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGk7XG4gICAgfShNKSxcbiAgICAgICAgayA9IHtcbiAgICAgIHZlY3RvcjogUyxcbiAgICAgIHJhc3RlcjogQyxcbiAgICAgIFwicmFzdGVyLWRlbVwiOiB6LFxuICAgICAgZ2VvanNvbjogRCxcbiAgICAgIHZpZGVvOiBMLFxuICAgICAgaW1hZ2U6IE0sXG4gICAgICBjYW52YXM6IFJcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQihlLCBpKSB7XG4gICAgICB2YXIgbyA9IHQuaWRlbnRpdHkoW10pO1xuICAgICAgcmV0dXJuIHQudHJhbnNsYXRlKG8sIG8sIFsxLCAxLCAwXSksIHQuc2NhbGUobywgbywgWy41ICogZS53aWR0aCwgLjUgKiBlLmhlaWdodCwgMV0pLCB0Lm11bHRpcGx5KG8sIG8sIGUuY2FsY3VsYXRlUG9zTWF0cml4KGkudG9VbndyYXBwZWQoKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE8odCwgZSwgaSwgbywgciwgYSkge1xuICAgICAgdmFyIG4gPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICBpZiAodCkgZm9yICh2YXIgbyA9IDAsIHIgPSB0OyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICAgIHZhciBhID0gZVtyW29dXTtcbiAgICAgICAgICBpZiAoYSAmJiBhLnNvdXJjZSA9PT0gaSAmJiBcImZpbGwtZXh0cnVzaW9uXCIgPT09IGEudHlwZSkgcmV0dXJuICEwO1xuICAgICAgICB9IGVsc2UgZm9yICh2YXIgbiBpbiBlKSB7XG4gICAgICAgICAgdmFyIHMgPSBlW25dO1xuICAgICAgICAgIGlmIChzLnNvdXJjZSA9PT0gaSAmJiBcImZpbGwtZXh0cnVzaW9uXCIgPT09IHMudHlwZSkgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0ociAmJiByLmxheWVycywgZSwgdC5pZCksXG4gICAgICAgICAgcyA9IGEubWF4UGl0Y2hTY2FsZUZhY3RvcigpLFxuICAgICAgICAgIGwgPSB0LnRpbGVzSW4obywgcywgbik7XG5cbiAgICAgIGwuc29ydChGKTtcblxuICAgICAgZm9yICh2YXIgYyA9IFtdLCB1ID0gMCwgaCA9IGw7IHUgPCBoLmxlbmd0aDsgdSArPSAxKSB7XG4gICAgICAgIHZhciBwID0gaFt1XTtcbiAgICAgICAgYy5wdXNoKHtcbiAgICAgICAgICB3cmFwcGVkVGlsZUlEOiBwLnRpbGVJRC53cmFwcGVkKCkua2V5LFxuICAgICAgICAgIHF1ZXJ5UmVzdWx0czogcC50aWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLCBpLCB0Ll9zdGF0ZSwgcC5xdWVyeUdlb21ldHJ5LCBwLmNhbWVyYVF1ZXJ5R2VvbWV0cnksIHAuc2NhbGUsIHIsIGEsIHMsIEIodC50cmFuc2Zvcm0sIHAudGlsZUlEKSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHt9LCBpID0ge30sIG8gPSAwLCByID0gdDsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IHJbb10sXG4gICAgICAgICAgICAgIG4gPSBhLnF1ZXJ5UmVzdWx0cyxcbiAgICAgICAgICAgICAgcyA9IGEud3JhcHBlZFRpbGVJRCxcbiAgICAgICAgICAgICAgbCA9IGlbc10gPSBpW3NdIHx8IHt9O1xuXG4gICAgICAgICAgZm9yICh2YXIgYyBpbiBuKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB1ID0gbltjXSwgaCA9IGxbY10gPSBsW2NdIHx8IHt9LCBwID0gZVtjXSA9IGVbY10gfHwgW10sIGQgPSAwLCBfID0gdTsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGYgPSBfW2RdO1xuICAgICAgICAgICAgICBoW2YuZmVhdHVyZUluZGV4XSB8fCAoaFtmLmZlYXR1cmVJbmRleF0gPSAhMCwgcC5wdXNoKGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0oYyk7XG5cbiAgICAgIGZvciAodmFyIF8gaW4gZCkge1xuICAgICAgICBkW19dLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgaSA9IGUuZmVhdHVyZSxcbiAgICAgICAgICAgICAgbyA9IHQuZ2V0RmVhdHVyZVN0YXRlKGkubGF5ZXJbXCJzb3VyY2UtbGF5ZXJcIl0sIGkuaWQpO1xuICAgICAgICAgIGkuc291cmNlID0gaS5sYXllci5zb3VyY2UsIGkubGF5ZXJbXCJzb3VyY2UtbGF5ZXJcIl0gJiYgKGkuc291cmNlTGF5ZXIgPSBpLmxheWVyW1wic291cmNlLWxheWVyXCJdKSwgaS5zdGF0ZSA9IG87XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdC50aWxlSUQsXG4gICAgICAgICAgbyA9IGUudGlsZUlEO1xuICAgICAgcmV0dXJuIGkub3ZlcnNjYWxlZFogLSBvLm92ZXJzY2FsZWRaIHx8IGkuY2Fub25pY2FsLnkgLSBvLmNhbm9uaWNhbC55IHx8IGkud3JhcCAtIG8ud3JhcCB8fCBpLmNhbm9uaWNhbC54IC0gby5jYW5vbmljYWwueDtcbiAgICB9XG5cbiAgICB2YXIgVSA9IGZ1bmN0aW9uIFUodCwgZSkge1xuICAgICAgdGhpcy5tYXggPSB0LCB0aGlzLm9uUmVtb3ZlID0gZSwgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBVLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCBpID0gdGhpcy5kYXRhW3RdOyBlIDwgaS5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgIHZhciBvID0gaVtlXTtcbiAgICAgICAgICBvLnRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KG8udGltZW91dCksIHRoaXMub25SZW1vdmUoby52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZGF0YSA9IHt9LCB0aGlzLm9yZGVyID0gW10sIHRoaXM7XG4gICAgfSwgVS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcyxcbiAgICAgICAgICByID0gdC53cmFwcGVkKCkua2V5O1xuICAgICAgdm9pZCAwID09PSB0aGlzLmRhdGFbcl0gJiYgKHRoaXMuZGF0YVtyXSA9IFtdKTtcbiAgICAgIHZhciBhID0ge1xuICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgdGltZW91dDogdm9pZCAwXG4gICAgICB9O1xuXG4gICAgICBpZiAodm9pZCAwICE9PSBpICYmIChhLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgby5yZW1vdmUodCwgYSk7XG4gICAgICB9LCBpKSksIHRoaXMuZGF0YVtyXS5wdXNoKGEpLCB0aGlzLm9yZGVyLnB1c2gociksIHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtcblxuICAgICAgICBuICYmIHRoaXMub25SZW1vdmUobik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIFUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC53cmFwcGVkKCkua2V5IGluIHRoaXMuZGF0YTtcbiAgICB9LCBVLnByb3RvdHlwZS5nZXRBbmRSZW1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHQpID8gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodC53cmFwcGVkKCkua2V5KSA6IG51bGw7XG4gICAgfSwgVS5wcm90b3R5cGUuX2dldEFuZFJlbW92ZUJ5S2V5ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5kYXRhW3RdLnNoaWZ0KCk7XG4gICAgICByZXR1cm4gZS50aW1lb3V0ICYmIGNsZWFyVGltZW91dChlLnRpbWVvdXQpLCAwID09PSB0aGlzLmRhdGFbdF0ubGVuZ3RoICYmIGRlbGV0ZSB0aGlzLmRhdGFbdF0sIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZih0KSwgMSksIGUudmFsdWU7XG4gICAgfSwgVS5wcm90b3R5cGUuZ2V0QnlLZXkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmRhdGFbdF07XG4gICAgICByZXR1cm4gZSA/IGVbMF0udmFsdWUgOiBudWxsO1xuICAgIH0sIFUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXModCkgPyB0aGlzLmRhdGFbdC53cmFwcGVkKCkua2V5XVswXS52YWx1ZSA6IG51bGw7XG4gICAgfSwgVS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICghdGhpcy5oYXModCkpIHJldHVybiB0aGlzO1xuICAgICAgdmFyIGkgPSB0LndyYXBwZWQoKS5rZXksXG4gICAgICAgICAgbyA9IHZvaWQgMCA9PT0gZSA/IDAgOiB0aGlzLmRhdGFbaV0uaW5kZXhPZihlKSxcbiAgICAgICAgICByID0gdGhpcy5kYXRhW2ldW29dO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtpXS5zcGxpY2UobywgMSksIHIudGltZW91dCAmJiBjbGVhclRpbWVvdXQoci50aW1lb3V0KSwgMCA9PT0gdGhpcy5kYXRhW2ldLmxlbmd0aCAmJiBkZWxldGUgdGhpcy5kYXRhW2ldLCB0aGlzLm9uUmVtb3ZlKHIudmFsdWUpLCB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YoaSksIDEpLCB0aGlzO1xuICAgIH0sIFUucHJvdG90eXBlLnNldE1heFNpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh0aGlzLm1heCA9IHQ7IHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXg7KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG5cbiAgICAgICAgZSAmJiB0aGlzLm9uUmVtb3ZlKGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBVLnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgZm9yICh2YXIgbyA9IDAsIHIgPSB0aGlzLmRhdGFbaV07IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgICAgdmFyIGEgPSByW29dO1xuICAgICAgICAgIHQoYS52YWx1ZSkgfHwgZS5wdXNoKGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG4gPSAwLCBzID0gZTsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGwgPSBzW25dO1xuICAgICAgICB0aGlzLnJlbW92ZShsLnZhbHVlLnRpbGVJRCwgbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBOID0gZnVuY3Rpb24gTih0LCBlLCBpKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB0O1xuICAgICAgdmFyIG8gPSB0LmdsO1xuICAgICAgdGhpcy5idWZmZXIgPSBvLmNyZWF0ZUJ1ZmZlcigpLCB0aGlzLmR5bmFtaWNEcmF3ID0gQm9vbGVhbihpKSwgdGhpcy5jb250ZXh0LnVuYmluZFZBTygpLCB0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlciksIG8uYnVmZmVyRGF0YShvLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlLmFycmF5QnVmZmVyLCB0aGlzLmR5bmFtaWNEcmF3ID8gby5EWU5BTUlDX0RSQVcgOiBvLlNUQVRJQ19EUkFXKSwgdGhpcy5keW5hbWljRHJhdyB8fCBkZWxldGUgZS5hcnJheUJ1ZmZlcjtcbiAgICB9O1xuXG4gICAgTi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH0sIE4ucHJvdG90eXBlLnVwZGF0ZURhdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCksIHRoaXMuYmluZCgpLCBlLmJ1ZmZlclN1YkRhdGEoZS5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgdC5hcnJheUJ1ZmZlcik7XG4gICAgfSwgTi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYnVmZmVyICYmICh0aGlzLmNvbnRleHQuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKSwgZGVsZXRlIHRoaXMuYnVmZmVyKTtcbiAgICB9O1xuXG4gICAgdmFyIFogPSB7XG4gICAgICBJbnQ4OiBcIkJZVEVcIixcbiAgICAgIFVpbnQ4OiBcIlVOU0lHTkVEX0JZVEVcIixcbiAgICAgIEludDE2OiBcIlNIT1JUXCIsXG4gICAgICBVaW50MTY6IFwiVU5TSUdORURfU0hPUlRcIixcbiAgICAgIEludDMyOiBcIklOVFwiLFxuICAgICAgVWludDMyOiBcIlVOU0lHTkVEX0lOVFwiLFxuICAgICAgRmxvYXQzMjogXCJGTE9BVFwiXG4gICAgfSxcbiAgICAgICAgcSA9IGZ1bmN0aW9uIHEodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5sZW5ndGggPSBlLmxlbmd0aCwgdGhpcy5hdHRyaWJ1dGVzID0gaSwgdGhpcy5pdGVtU2l6ZSA9IGUuYnl0ZXNQZXJFbGVtZW50LCB0aGlzLmR5bmFtaWNEcmF3ID0gbywgdGhpcy5jb250ZXh0ID0gdDtcbiAgICAgIHZhciByID0gdC5nbDtcbiAgICAgIHRoaXMuYnVmZmVyID0gci5jcmVhdGVCdWZmZXIoKSwgdC5iaW5kVmVydGV4QnVmZmVyLnNldCh0aGlzLmJ1ZmZlciksIHIuYnVmZmVyRGF0YShyLkFSUkFZX0JVRkZFUiwgZS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IHIuRFlOQU1JQ19EUkFXIDogci5TVEFUSUNfRFJBVyksIHRoaXMuZHluYW1pY0RyYXcgfHwgZGVsZXRlIGUuYXJyYXlCdWZmZXI7XG4gICAgfTtcblxuICAgIHEucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH0sIHEucHJvdG90eXBlLnVwZGF0ZURhdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICB0aGlzLmJpbmQoKSwgZS5idWZmZXJTdWJEYXRhKGUuQVJSQVlfQlVGRkVSLCAwLCB0LmFycmF5QnVmZmVyKTtcbiAgICB9LCBxLnByb3RvdHlwZS5lbmFibGVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBvID0gZS5hdHRyaWJ1dGVzW3RoaXMuYXR0cmlidXRlc1tpXS5uYW1lXTtcbiAgICAgICAgdm9pZCAwICE9PSBvICYmIHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobyk7XG4gICAgICB9XG4gICAgfSwgcS5wcm90b3R5cGUuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmF0dHJpYnV0ZXNbb10sXG4gICAgICAgICAgICBhID0gZS5hdHRyaWJ1dGVzW3IubmFtZV07XG4gICAgICAgIHZvaWQgMCAhPT0gYSAmJiB0LnZlcnRleEF0dHJpYlBvaW50ZXIoYSwgci5jb21wb25lbnRzLCB0W1pbci50eXBlXV0sICExLCB0aGlzLml0ZW1TaXplLCByLm9mZnNldCArIHRoaXMuaXRlbVNpemUgKiAoaSB8fCAwKSk7XG4gICAgICB9XG4gICAgfSwgcS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYnVmZmVyICYmICh0aGlzLmNvbnRleHQuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKSwgZGVsZXRlIHRoaXMuYnVmZmVyKTtcbiAgICB9O1xuXG4gICAgdmFyIGogPSBmdW5jdGlvbiBqKHQpIHtcbiAgICAgIHRoaXMuZ2wgPSB0LmdsLCB0aGlzLmRlZmF1bHQgPSB0aGlzLmdldERlZmF1bHQoKSwgdGhpcy5jdXJyZW50ID0gdGhpcy5kZWZhdWx0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgfTtcblxuICAgIGoucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gICAgfSwgai5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHt9LCBqLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdDtcbiAgICB9LCBqLnByb3RvdHlwZS5zZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zZXQodGhpcy5kZWZhdWx0KTtcbiAgICB9O1xuXG4gICAgdmFyIFYgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoaS5fX3Byb3RvX18gPSBlKSwgKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBpLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC5Db2xvci50cmFuc3BhcmVudDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAodC5yICE9PSBlLnIgfHwgdC5nICE9PSBlLmcgfHwgdC5iICE9PSBlLmIgfHwgdC5hICE9PSBlLmEgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuY2xlYXJDb2xvcih0LnIsIHQuZywgdC5iLCB0LmEpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgaTtcbiAgICB9KGopLFxuICAgICAgICBHID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmNsZWFyRGVwdGgodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIFcgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuY2xlYXJTdGVuY2lsKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBYID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFshMCwgITAsICEwLCAhMF07XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgKHRbMF0gIT09IGVbMF0gfHwgdFsxXSAhPT0gZVsxXSB8fCB0WzJdICE9PSBlWzJdIHx8IHRbM10gIT09IGVbM10gfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuY29sb3JNYXNrKHRbMF0sIHRbMV0sIHRbMl0sIHRbM10pLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBIID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5kZXB0aE1hc2sodCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIEsgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMjU1O1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5zdGVuY2lsTWFzayh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgWSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnVuYzogdGhpcy5nbC5BTFdBWVMsXG4gICAgICAgICAgcmVmOiAwLFxuICAgICAgICAgIG1hc2s6IDI1NVxuICAgICAgICB9O1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0LmZ1bmMgIT09IGUuZnVuYyB8fCB0LnJlZiAhPT0gZS5yZWYgfHwgdC5tYXNrICE9PSBlLm1hc2sgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuc3RlbmNpbEZ1bmModC5mdW5jLCB0LnJlZiwgdC5tYXNrKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgSiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFt0LktFRVAsIHQuS0VFUCwgdC5LRUVQXTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAodFswXSAhPT0gZVswXSB8fCB0WzFdICE9PSBlWzFdIHx8IHRbMl0gIT09IGVbMl0gfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuc3RlbmNpbE9wKHRbMF0sIHRbMV0sIHRbMl0pLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBRID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIHQgPyBlLmVuYWJsZShlLlNURU5DSUxfVEVTVCkgOiBlLmRpc2FibGUoZS5TVEVOQ0lMX1RFU1QpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgJCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbMCwgMV07XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgKHRbMF0gIT09IGVbMF0gfHwgdFsxXSAhPT0gZVsxXSB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5kZXB0aFJhbmdlKHRbMF0sIHRbMV0pLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICB0dCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICB0ID8gZS5lbmFibGUoZS5ERVBUSF9URVNUKSA6IGUuZGlzYWJsZShlLkRFUFRIX1RFU1QpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5MRVNTO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5kZXB0aEZ1bmModCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGl0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIHQgPyBlLmVuYWJsZShlLkJMRU5EKSA6IGUuZGlzYWJsZShlLkJMRU5EKSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIG90ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gW3QuT05FLCB0LlpFUk9dO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0WzBdICE9PSBlWzBdIHx8IHRbMV0gIT09IGVbMV0gfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuYmxlbmRGdW5jKHRbMF0sIHRbMV0pLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKCkge1xuICAgICAgICBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LkNvbG9yLnRyYW5zcGFyZW50O1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICh0LnIgIT09IGUuciB8fCB0LmcgIT09IGUuZyB8fCB0LmIgIT09IGUuYiB8fCB0LmEgIT09IGUuYSB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5ibGVuZENvbG9yKHQuciwgdC5nLCB0LmIsIHQuYSksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBpO1xuICAgIH0oaiksXG4gICAgICAgIGF0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuRlVOQ19BREQ7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmJsZW5kRXF1YXRpb24odCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIG50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIHQgPyBlLmVuYWJsZShlLkNVTExfRkFDRSkgOiBlLmRpc2FibGUoZS5DVUxMX0ZBQ0UpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgc3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5CQUNLO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy5nbC5jdWxsRmFjZSh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgbHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5DQ1c7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpICYmICh0aGlzLmdsLmZyb250RmFjZSh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgY3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wudXNlUHJvZ3JhbSh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgdXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5URVhUVVJFMDtcbiAgICAgIH0sIGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICh0ICE9PSB0aGlzLmN1cnJlbnQgfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExKTtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgaHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbMCwgMCwgdC5kcmF3aW5nQnVmZmVyV2lkdGgsIHQuZHJhd2luZ0J1ZmZlckhlaWdodF07XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgKHRbMF0gIT09IGVbMF0gfHwgdFsxXSAhPT0gZVsxXSB8fCB0WzJdICE9PSBlWzJdIHx8IHRbM10gIT09IGVbM10gfHwgdGhpcy5kaXJ0eSkgJiYgKHRoaXMuZ2wudmlld3BvcnQodFswXSwgdFsxXSwgdFsyXSwgdFszXSksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMSk7XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHB0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgICAgZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUiwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBkdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUuYmluZFJlbmRlcmJ1ZmZlcihlLlJFTkRFUkJVRkZFUiwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBfdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIGZ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgICAgZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIG10ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgIGUuYmluZEJ1ZmZlcihlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICBndCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKGUpIHtcbiAgICAgICAgdC5jYWxsKHRoaXMsIGUpLCB0aGlzLnZhbyA9IGUuZXh0VmVydGV4QXJyYXlPYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy52YW8gJiYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSAmJiAodGhpcy52YW8uYmluZFZlcnRleEFycmF5T0VTKHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITEpO1xuICAgICAgfSwgZTtcbiAgICB9KGopLFxuICAgICAgICB2dCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLmdldERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfQUxJR05NRU5ULCB0KSwgdGhpcy5jdXJyZW50ID0gdCwgdGhpcy5kaXJ0eSA9ICExO1xuICAgICAgICB9XG4gICAgICB9LCBlO1xuICAgIH0oaiksXG4gICAgICAgIHl0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuZ2V0RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgeHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2w7XG4gICAgICAgICAgZS5waXhlbFN0b3JlaShlLlVOUEFDS19GTElQX1lfV0VCR0wsIHQpLCB0aGlzLmN1cnJlbnQgPSB0LCB0aGlzLmRpcnR5ID0gITE7XG4gICAgICAgIH1cbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgYnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZShlLCBpKSB7XG4gICAgICAgIHQuY2FsbCh0aGlzLCBlKSwgdGhpcy5jb250ZXh0ID0gZSwgdGhpcy5wYXJlbnQgPSBpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5nZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sIGU7XG4gICAgfShqKSxcbiAgICAgICAgd3QgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXREaXJ0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9ICEwO1xuICAgICAgfSwgZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMuY3VycmVudCB8fCB0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAgIHZhciBlID0gdGhpcy5nbDtcbiAgICAgICAgICBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsIGUuQ09MT1JfQVRUQUNITUVOVDAsIGUuVEVYVFVSRV8yRCwgdCwgMCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGJ0KSxcbiAgICAgICAgVHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5jdXJyZW50IHx8IHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7XG4gICAgICAgICAgdmFyIGUgPSB0aGlzLmdsO1xuICAgICAgICAgIGUuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUiwgZS5ERVBUSF9BVFRBQ0hNRU5ULCBlLlJFTkRFUkJVRkZFUiwgdCksIHRoaXMuY3VycmVudCA9IHQsIHRoaXMuZGlydHkgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KGJ0KSxcbiAgICAgICAgRXQgPSBmdW5jdGlvbiBFdCh0LCBlLCBpLCBvKSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB0LCB0aGlzLndpZHRoID0gZSwgdGhpcy5oZWlnaHQgPSBpO1xuICAgICAgdmFyIHIgPSB0aGlzLmZyYW1lYnVmZmVyID0gdC5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgdGhpcy5jb2xvckF0dGFjaG1lbnQgPSBuZXcgd3QodCwgciksIG8gJiYgKHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbmV3IFR0KHQsIHIpKTtcbiAgICB9O1xuXG4gICAgRXQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXMuY29udGV4dC5nbCxcbiAgICAgICAgICBlID0gdGhpcy5jb2xvckF0dGFjaG1lbnQuZ2V0KCk7XG5cbiAgICAgIGlmIChlICYmIHQuZGVsZXRlVGV4dHVyZShlKSwgdGhpcy5kZXB0aEF0dGFjaG1lbnQpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLmRlcHRoQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgaSAmJiB0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihpKTtcbiAgICAgIH1cblxuICAgICAgdC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICB9O1xuXG4gICAgdmFyIEl0ID0gZnVuY3Rpb24gSXQodCwgZSwgaSkge1xuICAgICAgdGhpcy5mdW5jID0gdCwgdGhpcy5tYXNrID0gZSwgdGhpcy5yYW5nZSA9IGk7XG4gICAgfTtcblxuICAgIEl0LlJlYWRPbmx5ID0gITEsIEl0LlJlYWRXcml0ZSA9ICEwLCBJdC5kaXNhYmxlZCA9IG5ldyBJdCg1MTksIEl0LlJlYWRPbmx5LCBbMCwgMV0pO1xuXG4gICAgdmFyIFB0ID0gZnVuY3Rpb24gUHQodCwgZSwgaSwgbywgciwgYSkge1xuICAgICAgdGhpcy50ZXN0ID0gdCwgdGhpcy5yZWYgPSBlLCB0aGlzLm1hc2sgPSBpLCB0aGlzLmZhaWwgPSBvLCB0aGlzLmRlcHRoRmFpbCA9IHIsIHRoaXMucGFzcyA9IGE7XG4gICAgfTtcblxuICAgIFB0LmRpc2FibGVkID0gbmV3IFB0KHtcbiAgICAgIGZ1bmM6IDUxOSxcbiAgICAgIG1hc2s6IDBcbiAgICB9LCAwLCAwLCA3NjgwLCA3NjgwLCA3NjgwKTtcblxuICAgIHZhciBTdCA9IGZ1bmN0aW9uIFN0KHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuYmxlbmRGdW5jdGlvbiA9IHQsIHRoaXMuYmxlbmRDb2xvciA9IGUsIHRoaXMubWFzayA9IGk7XG4gICAgfTtcblxuICAgIFN0LmRpc2FibGVkID0gbmV3IFN0KFN0LlJlcGxhY2UgPSBbMSwgMF0sIHQuQ29sb3IudHJhbnNwYXJlbnQsIFshMSwgITEsICExLCAhMV0pLCBTdC51bmJsZW5kZWQgPSBuZXcgU3QoU3QuUmVwbGFjZSwgdC5Db2xvci50cmFuc3BhcmVudCwgWyEwLCAhMCwgITAsICEwXSksIFN0LmFscGhhQmxlbmRlZCA9IG5ldyBTdChbMSwgNzcxXSwgdC5Db2xvci50cmFuc3BhcmVudCwgWyEwLCAhMCwgITAsICEwXSk7XG5cbiAgICB2YXIgQ3QgPSBmdW5jdGlvbiBDdCh0LCBlLCBpKSB7XG4gICAgICB0aGlzLmVuYWJsZSA9IHQsIHRoaXMubW9kZSA9IGUsIHRoaXMuZnJvbnRGYWNlID0gaTtcbiAgICB9O1xuXG4gICAgQ3QuZGlzYWJsZWQgPSBuZXcgQ3QoITEsIDEwMjksIDIzMDUpLCBDdC5iYWNrQ0NXID0gbmV3IEN0KCEwLCAxMDI5LCAyMzA1KTtcblxuICAgIHZhciB6dCA9IGZ1bmN0aW9uIHp0KHQpIHtcbiAgICAgIHRoaXMuZ2wgPSB0LCB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfdmVydGV4X2FycmF5X29iamVjdFwiKSwgdGhpcy5jbGVhckNvbG9yID0gbmV3IFYodGhpcyksIHRoaXMuY2xlYXJEZXB0aCA9IG5ldyBHKHRoaXMpLCB0aGlzLmNsZWFyU3RlbmNpbCA9IG5ldyBXKHRoaXMpLCB0aGlzLmNvbG9yTWFzayA9IG5ldyBYKHRoaXMpLCB0aGlzLmRlcHRoTWFzayA9IG5ldyBIKHRoaXMpLCB0aGlzLnN0ZW5jaWxNYXNrID0gbmV3IEsodGhpcyksIHRoaXMuc3RlbmNpbEZ1bmMgPSBuZXcgWSh0aGlzKSwgdGhpcy5zdGVuY2lsT3AgPSBuZXcgSih0aGlzKSwgdGhpcy5zdGVuY2lsVGVzdCA9IG5ldyBRKHRoaXMpLCB0aGlzLmRlcHRoUmFuZ2UgPSBuZXcgJCh0aGlzKSwgdGhpcy5kZXB0aFRlc3QgPSBuZXcgdHQodGhpcyksIHRoaXMuZGVwdGhGdW5jID0gbmV3IGV0KHRoaXMpLCB0aGlzLmJsZW5kID0gbmV3IGl0KHRoaXMpLCB0aGlzLmJsZW5kRnVuYyA9IG5ldyBvdCh0aGlzKSwgdGhpcy5ibGVuZENvbG9yID0gbmV3IHJ0KHRoaXMpLCB0aGlzLmJsZW5kRXF1YXRpb24gPSBuZXcgYXQodGhpcyksIHRoaXMuY3VsbEZhY2UgPSBuZXcgbnQodGhpcyksIHRoaXMuY3VsbEZhY2VTaWRlID0gbmV3IHN0KHRoaXMpLCB0aGlzLmZyb250RmFjZSA9IG5ldyBsdCh0aGlzKSwgdGhpcy5wcm9ncmFtID0gbmV3IGN0KHRoaXMpLCB0aGlzLmFjdGl2ZVRleHR1cmUgPSBuZXcgdXQodGhpcyksIHRoaXMudmlld3BvcnQgPSBuZXcgaHQodGhpcyksIHRoaXMuYmluZEZyYW1lYnVmZmVyID0gbmV3IHB0KHRoaXMpLCB0aGlzLmJpbmRSZW5kZXJidWZmZXIgPSBuZXcgZHQodGhpcyksIHRoaXMuYmluZFRleHR1cmUgPSBuZXcgX3QodGhpcyksIHRoaXMuYmluZFZlcnRleEJ1ZmZlciA9IG5ldyBmdCh0aGlzKSwgdGhpcy5iaW5kRWxlbWVudEJ1ZmZlciA9IG5ldyBtdCh0aGlzKSwgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMgPSB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIG5ldyBndCh0aGlzKSwgdGhpcy5waXhlbFN0b3JlVW5wYWNrID0gbmV3IHZ0KHRoaXMpLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhID0gbmV3IHl0KHRoaXMpLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWSA9IG5ldyB4dCh0aGlzKSwgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMgPSB0LmdldEV4dGVuc2lvbihcIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpY1wiKSB8fCB0LmdldEV4dGVuc2lvbihcIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcIikgfHwgdC5nZXRFeHRlbnNpb24oXCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljXCIpLCB0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYyAmJiAodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSB0LmdldFBhcmFtZXRlcih0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpKSwgdGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0ID0gdC5nZXRFeHRlbnNpb24oXCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XCIpLCB0aGlzLmV4dFRleHR1cmVIYWxmRmxvYXQgJiYgKHQuZ2V0RXh0ZW5zaW9uKFwiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXJcIiksIHRoaXMuZXh0UmVuZGVyVG9UZXh0dXJlSGFsZkZsb2F0ID0gdC5nZXRFeHRlbnNpb24oXCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXRcIikpLCB0aGlzLmV4dFRpbWVyUXVlcnkgPSB0LmdldEV4dGVuc2lvbihcIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeVwiKSwgdGhpcy5tYXhUZXh0dXJlU2l6ZSA9IHQuZ2V0UGFyYW1ldGVyKHQuTUFYX1RFWFRVUkVfU0laRSk7XG4gICAgfTtcblxuICAgIHp0LnByb3RvdHlwZS5zZXREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy51bmJpbmRWQU8oKSwgdGhpcy5jbGVhckNvbG9yLnNldERlZmF1bHQoKSwgdGhpcy5jbGVhckRlcHRoLnNldERlZmF1bHQoKSwgdGhpcy5jbGVhclN0ZW5jaWwuc2V0RGVmYXVsdCgpLCB0aGlzLmNvbG9yTWFzay5zZXREZWZhdWx0KCksIHRoaXMuZGVwdGhNYXNrLnNldERlZmF1bHQoKSwgdGhpcy5zdGVuY2lsTWFzay5zZXREZWZhdWx0KCksIHRoaXMuc3RlbmNpbEZ1bmMuc2V0RGVmYXVsdCgpLCB0aGlzLnN0ZW5jaWxPcC5zZXREZWZhdWx0KCksIHRoaXMuc3RlbmNpbFRlc3Quc2V0RGVmYXVsdCgpLCB0aGlzLmRlcHRoUmFuZ2Uuc2V0RGVmYXVsdCgpLCB0aGlzLmRlcHRoVGVzdC5zZXREZWZhdWx0KCksIHRoaXMuZGVwdGhGdW5jLnNldERlZmF1bHQoKSwgdGhpcy5ibGVuZC5zZXREZWZhdWx0KCksIHRoaXMuYmxlbmRGdW5jLnNldERlZmF1bHQoKSwgdGhpcy5ibGVuZENvbG9yLnNldERlZmF1bHQoKSwgdGhpcy5ibGVuZEVxdWF0aW9uLnNldERlZmF1bHQoKSwgdGhpcy5jdWxsRmFjZS5zZXREZWZhdWx0KCksIHRoaXMuY3VsbEZhY2VTaWRlLnNldERlZmF1bHQoKSwgdGhpcy5mcm9udEZhY2Uuc2V0RGVmYXVsdCgpLCB0aGlzLnByb2dyYW0uc2V0RGVmYXVsdCgpLCB0aGlzLmFjdGl2ZVRleHR1cmUuc2V0RGVmYXVsdCgpLCB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5zZXREZWZhdWx0KCksIHRoaXMucGl4ZWxTdG9yZVVucGFjay5zZXREZWZhdWx0KCksIHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0RGVmYXVsdCgpLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfSwgenQucHJvdG90eXBlLnNldERpcnR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5jbGVhckNvbG9yLmRpcnR5ID0gITAsIHRoaXMuY2xlYXJEZXB0aC5kaXJ0eSA9ICEwLCB0aGlzLmNsZWFyU3RlbmNpbC5kaXJ0eSA9ICEwLCB0aGlzLmNvbG9yTWFzay5kaXJ0eSA9ICEwLCB0aGlzLmRlcHRoTWFzay5kaXJ0eSA9ICEwLCB0aGlzLnN0ZW5jaWxNYXNrLmRpcnR5ID0gITAsIHRoaXMuc3RlbmNpbEZ1bmMuZGlydHkgPSAhMCwgdGhpcy5zdGVuY2lsT3AuZGlydHkgPSAhMCwgdGhpcy5zdGVuY2lsVGVzdC5kaXJ0eSA9ICEwLCB0aGlzLmRlcHRoUmFuZ2UuZGlydHkgPSAhMCwgdGhpcy5kZXB0aFRlc3QuZGlydHkgPSAhMCwgdGhpcy5kZXB0aEZ1bmMuZGlydHkgPSAhMCwgdGhpcy5ibGVuZC5kaXJ0eSA9ICEwLCB0aGlzLmJsZW5kRnVuYy5kaXJ0eSA9ICEwLCB0aGlzLmJsZW5kQ29sb3IuZGlydHkgPSAhMCwgdGhpcy5ibGVuZEVxdWF0aW9uLmRpcnR5ID0gITAsIHRoaXMuY3VsbEZhY2UuZGlydHkgPSAhMCwgdGhpcy5jdWxsRmFjZVNpZGUuZGlydHkgPSAhMCwgdGhpcy5mcm9udEZhY2UuZGlydHkgPSAhMCwgdGhpcy5wcm9ncmFtLmRpcnR5ID0gITAsIHRoaXMuYWN0aXZlVGV4dHVyZS5kaXJ0eSA9ICEwLCB0aGlzLnZpZXdwb3J0LmRpcnR5ID0gITAsIHRoaXMuYmluZEZyYW1lYnVmZmVyLmRpcnR5ID0gITAsIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5kaXJ0eSA9ICEwLCB0aGlzLmJpbmRUZXh0dXJlLmRpcnR5ID0gITAsIHRoaXMuYmluZFZlcnRleEJ1ZmZlci5kaXJ0eSA9ICEwLCB0aGlzLmJpbmRFbGVtZW50QnVmZmVyLmRpcnR5ID0gITAsIHRoaXMuZXh0VmVydGV4QXJyYXlPYmplY3QgJiYgKHRoaXMuYmluZFZlcnRleEFycmF5T0VTLmRpcnR5ID0gITApLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2suZGlydHkgPSAhMCwgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5kaXJ0eSA9ICEwLCB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5kaXJ0eSA9ICEwO1xuICAgIH0sIHp0LnByb3RvdHlwZS5jcmVhdGVJbmRleEJ1ZmZlciA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gbmV3IE4odGhpcywgdCwgZSk7XG4gICAgfSwgenQucHJvdG90eXBlLmNyZWF0ZVZlcnRleEJ1ZmZlciA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICByZXR1cm4gbmV3IHEodGhpcywgdCwgZSwgaSk7XG4gICAgfSwgenQucHJvdG90eXBlLmNyZWF0ZVJlbmRlcmJ1ZmZlciA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuZ2wsXG4gICAgICAgICAgciA9IG8uY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChyKSwgby5yZW5kZXJidWZmZXJTdG9yYWdlKG8uUkVOREVSQlVGRkVSLCB0LCBlLCBpKSwgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChudWxsKSwgcjtcbiAgICB9LCB6dC5wcm90b3R5cGUuY3JlYXRlRnJhbWVidWZmZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIG5ldyBFdCh0aGlzLCB0LCBlLCBpKTtcbiAgICB9LCB6dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0LmNvbG9yLFxuICAgICAgICAgIGkgPSB0LmRlcHRoLFxuICAgICAgICAgIG8gPSB0aGlzLmdsLFxuICAgICAgICAgIHIgPSAwO1xuICAgICAgZSAmJiAociB8PSBvLkNPTE9SX0JVRkZFUl9CSVQsIHRoaXMuY2xlYXJDb2xvci5zZXQoZSksIHRoaXMuY29sb3JNYXNrLnNldChbITAsICEwLCAhMCwgITBdKSksIHZvaWQgMCAhPT0gaSAmJiAociB8PSBvLkRFUFRIX0JVRkZFUl9CSVQsIHRoaXMuZGVwdGhSYW5nZS5zZXQoWzAsIDFdKSwgdGhpcy5jbGVhckRlcHRoLnNldChpKSwgdGhpcy5kZXB0aE1hc2suc2V0KCEwKSksIG8uY2xlYXIocik7XG4gICAgfSwgenQucHJvdG90eXBlLnNldEN1bGxGYWNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICExID09PSB0LmVuYWJsZSA/IHRoaXMuY3VsbEZhY2Uuc2V0KCExKSA6ICh0aGlzLmN1bGxGYWNlLnNldCghMCksIHRoaXMuY3VsbEZhY2VTaWRlLnNldCh0Lm1vZGUpLCB0aGlzLmZyb250RmFjZS5zZXQodC5mcm9udEZhY2UpKTtcbiAgICB9LCB6dC5wcm90b3R5cGUuc2V0RGVwdGhNb2RlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQuZnVuYyAhPT0gdGhpcy5nbC5BTFdBWVMgfHwgdC5tYXNrID8gKHRoaXMuZGVwdGhUZXN0LnNldCghMCksIHRoaXMuZGVwdGhGdW5jLnNldCh0LmZ1bmMpLCB0aGlzLmRlcHRoTWFzay5zZXQodC5tYXNrKSwgdGhpcy5kZXB0aFJhbmdlLnNldCh0LnJhbmdlKSkgOiB0aGlzLmRlcHRoVGVzdC5zZXQoITEpO1xuICAgIH0sIHp0LnByb3RvdHlwZS5zZXRTdGVuY2lsTW9kZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0LnRlc3QuZnVuYyAhPT0gdGhpcy5nbC5BTFdBWVMgfHwgdC5tYXNrID8gKHRoaXMuc3RlbmNpbFRlc3Quc2V0KCEwKSwgdGhpcy5zdGVuY2lsTWFzay5zZXQodC5tYXNrKSwgdGhpcy5zdGVuY2lsT3Auc2V0KFt0LmZhaWwsIHQuZGVwdGhGYWlsLCB0LnBhc3NdKSwgdGhpcy5zdGVuY2lsRnVuYy5zZXQoe1xuICAgICAgICBmdW5jOiB0LnRlc3QuZnVuYyxcbiAgICAgICAgcmVmOiB0LnJlZixcbiAgICAgICAgbWFzazogdC50ZXN0Lm1hc2tcbiAgICAgIH0pKSA6IHRoaXMuc3RlbmNpbFRlc3Quc2V0KCExKTtcbiAgICB9LCB6dC5wcm90b3R5cGUuc2V0Q29sb3JNb2RlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHQuZGVlcEVxdWFsKGUuYmxlbmRGdW5jdGlvbiwgU3QuUmVwbGFjZSkgPyB0aGlzLmJsZW5kLnNldCghMSkgOiAodGhpcy5ibGVuZC5zZXQoITApLCB0aGlzLmJsZW5kRnVuYy5zZXQoZS5ibGVuZEZ1bmN0aW9uKSwgdGhpcy5ibGVuZENvbG9yLnNldChlLmJsZW5kQ29sb3IpKSwgdGhpcy5jb2xvck1hc2suc2V0KGUubWFzayk7XG4gICAgfSwgenQucHJvdG90eXBlLnVuYmluZFZBTyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZXh0VmVydGV4QXJyYXlPYmplY3QgJiYgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KG51bGwpO1xuICAgIH07XG5cbiAgICB2YXIgRHQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gaShpLCBvLCByKSB7XG4gICAgICAgIHZhciBhID0gdGhpcztcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLmlkID0gaSwgdGhpcy5kaXNwYXRjaGVyID0gciwgdGhpcy5vbihcImRhdGFcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBcInNvdXJjZVwiID09PSB0LmRhdGFUeXBlICYmIFwibWV0YWRhdGFcIiA9PT0gdC5zb3VyY2VEYXRhVHlwZSAmJiAoYS5fc291cmNlTG9hZGVkID0gITApLCBhLl9zb3VyY2VMb2FkZWQgJiYgIWEuX3BhdXNlZCAmJiBcInNvdXJjZVwiID09PSB0LmRhdGFUeXBlICYmIFwiY29udGVudFwiID09PSB0LnNvdXJjZURhdGFUeXBlICYmIChhLnJlbG9hZCgpLCBhLnRyYW5zZm9ybSAmJiBhLnVwZGF0ZShhLnRyYW5zZm9ybSkpO1xuICAgICAgICB9KSwgdGhpcy5vbihcImVycm9yXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhLl9zb3VyY2VFcnJvcmVkID0gITA7XG4gICAgICAgIH0pLCB0aGlzLl9zb3VyY2UgPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgICAgIHZhciBhID0gbmV3IGtbaS50eXBlXShlLCBpLCBvLCByKTtcbiAgICAgICAgICBpZiAoYS5pZCAhPT0gZSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgU291cmNlIGlkIHRvIGJlIFwiICsgZSArIFwiIGluc3RlYWQgb2YgXCIgKyBhLmlkKTtcbiAgICAgICAgICByZXR1cm4gdC5iaW5kQWxsKFtcImxvYWRcIiwgXCJhYm9ydFwiLCBcInVubG9hZFwiLCBcInNlcmlhbGl6ZVwiLCBcInByZXBhcmVcIl0sIGEpLCBhO1xuICAgICAgICB9KGksIG8sIHIsIHRoaXMpLCB0aGlzLl90aWxlcyA9IHt9LCB0aGlzLl9jYWNoZSA9IG5ldyBVKDAsIHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSksIHRoaXMuX3RpbWVycyA9IHt9LCB0aGlzLl9jYWNoZVRpbWVycyA9IHt9LCB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gbnVsbCwgdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMgPSB7fSwgdGhpcy5fY292ZXJlZFRpbGVzID0ge30sIHRoaXMuX3N0YXRlID0gbmV3IHQuU291cmNlRmVhdHVyZVN0YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChpLl9fcHJvdG9fXyA9IGUpLCAoaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB0LCB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gdCA/IHQuX21heFRpbGVDYWNoZVNpemUgOiBudWxsLCB0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uQWRkICYmIHRoaXMuX3NvdXJjZS5vbkFkZCh0KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5vblJlbW92ZSAmJiB0aGlzLl9zb3VyY2Uub25SZW1vdmUodCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VFcnJvcmVkKSByZXR1cm4gITA7XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlLmxvYWRlZCgpKSByZXR1cm4gITE7XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgIHZhciBlID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgICAgaWYgKFwibG9hZGVkXCIgIT09IGUuc3RhdGUgJiYgXCJlcnJvcmVkXCIgIT09IGUuc3RhdGUpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFNvdXJjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSAhMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWU7XG4gICAgICAgICAgdGhpcy5fcGF1c2VkID0gITEsIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gITEsIHQgJiYgdGhpcy5yZWxvYWQoKSwgdGhpcy50cmFuc2Zvcm0gJiYgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5fbG9hZFRpbGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmxvYWRUaWxlKHQsIGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3VubG9hZFRpbGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLnVubG9hZFRpbGUpIHJldHVybiB0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSh0LCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fYWJvcnRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUpIHJldHVybiB0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKHQsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5zZXJpYWxpemUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnByZXBhcmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBmb3IgKHZhciBlIGluIHRoaXMuX3NvdXJjZS5wcmVwYXJlICYmIHRoaXMuX3NvdXJjZS5wcmVwYXJlKCksIHRoaXMuX3N0YXRlLmNvYWxlc2NlQ2hhbmdlcyh0aGlzLl90aWxlcywgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCksIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLl90aWxlc1tlXTtcbiAgICAgICAgICBpLnVwbG9hZCh0KSwgaS5wcmVwYXJlKHRoaXMubWFwLnN0eWxlLmltYWdlTWFuYWdlcik7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldElkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWVzKHRoaXMuX3RpbGVzKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC50aWxlSUQ7XG4gICAgICAgIH0pLnNvcnQoQXQpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRSZW5kZXJhYmxlSWRzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLFxuICAgICAgICAgICAgbyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB0aGlzLl9pc0lkUmVuZGVyYWJsZShyLCBlKSAmJiBvLnB1c2godGhpcy5fdGlsZXNbcl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGUgPyBvLnNvcnQoZnVuY3Rpb24gKGUsIG8pIHtcbiAgICAgICAgICB2YXIgciA9IGUudGlsZUlELFxuICAgICAgICAgICAgICBhID0gby50aWxlSUQsXG4gICAgICAgICAgICAgIG4gPSBuZXcgdC5Qb2ludChyLmNhbm9uaWNhbC54LCByLmNhbm9uaWNhbC55KS5fcm90YXRlKGkudHJhbnNmb3JtLmFuZ2xlKSxcbiAgICAgICAgICAgICAgcyA9IG5ldyB0LlBvaW50KGEuY2Fub25pY2FsLngsIGEuY2Fub25pY2FsLnkpLl9yb3RhdGUoaS50cmFuc2Zvcm0uYW5nbGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHIub3ZlcnNjYWxlZFogLSBhLm92ZXJzY2FsZWRaIHx8IHMueSAtIG4ueSB8fCBzLnggLSBuLng7XG4gICAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnRpbGVJRC5rZXk7XG4gICAgICAgIH0pIDogby5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC50aWxlSUQ7XG4gICAgICAgIH0pLnNvcnQoQXQpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5oYXNSZW5kZXJhYmxlUGFyZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodCwgMCk7XG4gICAgICAgIHJldHVybiAhIWUgJiYgdGhpcy5faXNJZFJlbmRlcmFibGUoZS50aWxlSUQua2V5KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9pc0lkUmVuZGVyYWJsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1t0XSAmJiB0aGlzLl90aWxlc1t0XS5oYXNEYXRhKCkgJiYgIXRoaXMuX2NvdmVyZWRUaWxlc1t0XSAmJiAoZSB8fCAhdGhpcy5fdGlsZXNbdF0uaG9sZGluZ0ZvckZhZGUoKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gITA7ZWxzZSBmb3IgKHZhciB0IGluIHRoaXMuX2NhY2hlLnJlc2V0KCksIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgXCJlcnJvcmVkXCIgIT09IHRoaXMuX3RpbGVzW3RdLnN0YXRlICYmIHRoaXMuX3JlbG9hZFRpbGUodCwgXCJyZWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl9yZWxvYWRUaWxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl90aWxlc1t0XTtcbiAgICAgICAgaSAmJiAoXCJsb2FkaW5nXCIgIT09IGkuc3RhdGUgJiYgKGkuc3RhdGUgPSBlKSwgdGhpcy5fbG9hZFRpbGUoaSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIGksIHQsIGUpKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdGlsZUxvYWRlZCA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgIGlmIChyKSByZXR1cm4gZS5zdGF0ZSA9IFwiZXJyb3JlZFwiLCB2b2lkICg0MDQgIT09IHIuc3RhdHVzID8gdGhpcy5fc291cmNlLmZpcmUobmV3IHQuRXJyb3JFdmVudChyLCB7XG4gICAgICAgICAgdGlsZTogZVxuICAgICAgICB9KSkgOiB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSkpO1xuICAgICAgICBlLnRpbWVBZGRlZCA9IHQuYnJvd3Nlci5ub3coKSwgXCJleHBpcmVkXCIgPT09IG8gJiYgKGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSAhMCksIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihpLCBlKSwgXCJyYXN0ZXItZGVtXCIgPT09IHRoaXMuZ2V0U291cmNlKCkudHlwZSAmJiBlLmRlbSAmJiB0aGlzLl9iYWNrZmlsbERFTShlKSwgdGhpcy5fc3RhdGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZShlLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKSwgdGhpcy5fc291cmNlLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICB0aWxlOiBlLFxuICAgICAgICAgIGNvb3JkOiBlLnRpbGVJRFxuICAgICAgICB9KSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fYmFja2ZpbGxERU0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBmb3IgKHZhciBlID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKCksIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBvID0gZVtpXTtcblxuICAgICAgICAgIGlmICh0Lm5laWdoYm9yaW5nVGlsZXMgJiYgdC5uZWlnaGJvcmluZ1RpbGVzW29dKSB7XG4gICAgICAgICAgICB2YXIgciA9IHRoaXMuZ2V0VGlsZUJ5SUQobyk7XG4gICAgICAgICAgICBhKHQsIHIpLCBhKHIsIHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGEodCwgZSkge1xuICAgICAgICAgIHQubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gITA7XG4gICAgICAgICAgdmFyIGkgPSBlLnRpbGVJRC5jYW5vbmljYWwueCAtIHQudGlsZUlELmNhbm9uaWNhbC54LFxuICAgICAgICAgICAgICBvID0gZS50aWxlSUQuY2Fub25pY2FsLnkgLSB0LnRpbGVJRC5jYW5vbmljYWwueSxcbiAgICAgICAgICAgICAgciA9IE1hdGgucG93KDIsIHQudGlsZUlELmNhbm9uaWNhbC56KSxcbiAgICAgICAgICAgICAgYSA9IGUudGlsZUlELmtleTtcbiAgICAgICAgICAwID09PSBpICYmIDAgPT09IG8gfHwgTWF0aC5hYnMobykgPiAxIHx8IChNYXRoLmFicyhpKSA+IDEgJiYgKDEgPT09IE1hdGguYWJzKGkgKyByKSA/IGkgKz0gciA6IDEgPT09IE1hdGguYWJzKGkgLSByKSAmJiAoaSAtPSByKSksIGUuZGVtICYmIHQuZGVtICYmICh0LmRlbS5iYWNrZmlsbEJvcmRlcihlLmRlbSwgaSwgbyksIHQubmVpZ2hib3JpbmdUaWxlcyAmJiB0Lm5laWdoYm9yaW5nVGlsZXNbYV0gJiYgKHQubmVpZ2hib3JpbmdUaWxlc1thXS5iYWNrZmlsbGVkID0gITApKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWxlQnlJRCh0LmtleSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRUaWxlQnlJRCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1t0XTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9yZXRhaW5Mb2FkZWRDaGlsZHJlbiA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXMuX3RpbGVzW3JdO1xuXG4gICAgICAgICAgaWYgKCEob1tyXSB8fCAhYS5oYXNEYXRhKCkgfHwgYS50aWxlSUQub3ZlcnNjYWxlZFogPD0gZSB8fCBhLnRpbGVJRC5vdmVyc2NhbGVkWiA+IGkpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gYS50aWxlSUQ7IGEgJiYgYS50aWxlSUQub3ZlcnNjYWxlZFogPiBlICsgMTspIHtcbiAgICAgICAgICAgICAgdmFyIHMgPSBhLnRpbGVJRC5zY2FsZWRUbyhhLnRpbGVJRC5vdmVyc2NhbGVkWiAtIDEpO1xuICAgICAgICAgICAgICAoYSA9IHRoaXMuX3RpbGVzW3Mua2V5XSkgJiYgYS5oYXNEYXRhKCkgJiYgKG4gPSBzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IG47IGwub3ZlcnNjYWxlZFogPiBlOykge1xuICAgICAgICAgICAgICBpZiAodFsobCA9IGwuc2NhbGVkVG8obC5vdmVyc2NhbGVkWiAtIDEpKS5rZXldKSB7XG4gICAgICAgICAgICAgICAgb1tuLmtleV0gPSBuO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5maW5kTG9hZGVkUGFyZW50ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKHQua2V5IGluIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlc1t0LmtleV07XG4gICAgICAgICAgcmV0dXJuIGkgJiYgaS50aWxlSUQub3ZlcnNjYWxlZFogPj0gZSA/IGkgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgbyA9IHQub3ZlcnNjYWxlZFogLSAxOyBvID49IGU7IG8tLSkge1xuICAgICAgICAgIHZhciByID0gdC5zY2FsZWRUbyhvKSxcbiAgICAgICAgICAgICAgYSA9IHRoaXMuX2dldExvYWRlZFRpbGUocik7XG5cbiAgICAgICAgICBpZiAoYSkgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl9nZXRMb2FkZWRUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl90aWxlc1t0LmtleV07XG4gICAgICAgIHJldHVybiBlICYmIGUuaGFzRGF0YSgpID8gZSA6IHRoaXMuX2NhY2hlLmdldEJ5S2V5KHQud3JhcHBlZCgpLmtleSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVDYWNoZVNpemUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IE1hdGguY2VpbCh0LndpZHRoIC8gdGhpcy5fc291cmNlLnRpbGVTaXplKSArIDEsXG4gICAgICAgICAgICBpID0gTWF0aC5jZWlsKHQuaGVpZ2h0IC8gdGhpcy5fc291cmNlLnRpbGVTaXplKSArIDEsXG4gICAgICAgICAgICBvID0gTWF0aC5mbG9vcihlICogaSAqIDUpLFxuICAgICAgICAgICAgciA9IFwibnVtYmVyXCIgPT0gdHlwZW9mIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPyBNYXRoLm1pbih0aGlzLl9tYXhUaWxlQ2FjaGVTaXplLCBvKSA6IG87XG5cbiAgICAgICAgdGhpcy5fY2FjaGUuc2V0TWF4U2l6ZShyKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmhhbmRsZVdyYXBKdW1wID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSBNYXRoLnJvdW5kKCh0IC0gKHZvaWQgMCA9PT0gdGhpcy5fcHJldkxuZyA/IHQgOiB0aGlzLl9wcmV2TG5nKSkgLyAzNjApO1xuXG4gICAgICAgIGlmICh0aGlzLl9wcmV2TG5nID0gdCwgZSkge1xuICAgICAgICAgIHZhciBpID0ge307XG5cbiAgICAgICAgICBmb3IgKHZhciBvIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICB2YXIgciA9IHRoaXMuX3RpbGVzW29dO1xuICAgICAgICAgICAgci50aWxlSUQgPSByLnRpbGVJRC51bndyYXBUbyhyLnRpbGVJRC53cmFwICsgZSksIGlbci50aWxlSUQua2V5XSA9IHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLl90aWxlcyA9IGksIHRoaXMuX3RpbWVycykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1thXSksIGRlbGV0ZSB0aGlzLl90aW1lcnNbYV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgbiBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKG4sIHRoaXMuX3RpbGVzW25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBvID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0gPSBlLCB0aGlzLl9zb3VyY2VMb2FkZWQgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgIHZhciByO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGVTaXplKGUpLCB0aGlzLmhhbmRsZVdyYXBKdW1wKHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcpLCB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fSwgdGhpcy51c2VkID8gdGhpcy5fc291cmNlLnRpbGVJRCA/IHIgPSBlLmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aGlzLl9zb3VyY2UudGlsZUlEKS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdC5PdmVyc2NhbGVkVGlsZUlEKGUuY2Fub25pY2FsLnosIGUud3JhcCwgZS5jYW5vbmljYWwueiwgZS5jYW5vbmljYWwueCwgZS5jYW5vbmljYWwueSk7XG4gICAgICAgICAgfSkgOiAociA9IGUuY292ZXJpbmdUaWxlcyh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy5fc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgbWluem9vbTogdGhpcy5fc291cmNlLm1pbnpvb20sXG4gICAgICAgICAgICBtYXh6b29tOiB0aGlzLl9zb3VyY2UubWF4em9vbSxcbiAgICAgICAgICAgIHJvdW5kWm9vbTogdGhpcy5fc291cmNlLnJvdW5kWm9vbSxcbiAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWRcbiAgICAgICAgICB9KSwgdGhpcy5fc291cmNlLmhhc1RpbGUgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIG8uX3NvdXJjZS5oYXNUaWxlKHQpO1xuICAgICAgICAgIH0pKSkgOiByID0gW107XG5cbiAgICAgICAgICB2YXIgYSA9IGUuY292ZXJpbmdab29tTGV2ZWwodGhpcy5fc291cmNlKSxcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KGEgLSBpLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSksXG4gICAgICAgICAgICAgIHMgPSBNYXRoLm1heChhICsgaS5tYXhVbmRlcnpvb21pbmcsIHRoaXMuX3NvdXJjZS5taW56b29tKSxcbiAgICAgICAgICAgICAgbCA9IHRoaXMuX3VwZGF0ZVJldGFpbmVkVGlsZXMociwgYSk7XG5cbiAgICAgICAgICBpZiAoTXQodGhpcy5fc291cmNlLnR5cGUpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBjID0ge30sIHUgPSB7fSwgaCA9IDAsIHAgPSBPYmplY3Qua2V5cyhsKTsgaCA8IHAubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGQgPSBwW2hdLFxuICAgICAgICAgICAgICAgICAgXyA9IGxbZF0sXG4gICAgICAgICAgICAgICAgICBmID0gdGhpcy5fdGlsZXNbZF07XG5cbiAgICAgICAgICAgICAgaWYgKGYgJiYgIShmLmZhZGVFbmRUaW1lICYmIGYuZmFkZUVuZFRpbWUgPD0gdC5icm93c2VyLm5vdygpKSkge1xuICAgICAgICAgICAgICAgIHZhciBtID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KF8sIG4pO1xuICAgICAgICAgICAgICAgIG0gJiYgKHRoaXMuX2FkZFRpbGUobS50aWxlSUQpLCBjW20udGlsZUlELmtleV0gPSBtLnRpbGVJRCksIHVbZF0gPSBfO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGcgaW4gdGhpcy5fcmV0YWluTG9hZGVkQ2hpbGRyZW4odSwgYSwgcywgbCksIGMpIHtcbiAgICAgICAgICAgICAgbFtnXSB8fCAodGhpcy5fY292ZXJlZFRpbGVzW2ddID0gITAsIGxbZ10gPSBjW2ddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciB2IGluIGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVzW3ZdLmNsZWFyRmFkZUhvbGQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciB5ID0gMCwgeCA9IHQua2V5c0RpZmZlcmVuY2UodGhpcy5fdGlsZXMsIGwpOyB5IDwgeC5sZW5ndGg7IHkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGIgPSB4W3ldLFxuICAgICAgICAgICAgICAgIHcgPSB0aGlzLl90aWxlc1tiXTtcbiAgICAgICAgICAgIHcuaGFzU3ltYm9sQnVja2V0cyAmJiAhdy5ob2xkaW5nRm9yRmFkZSgpID8gdy5zZXRIb2xkRHVyYXRpb24odGhpcy5tYXAuX2ZhZGVEdXJhdGlvbikgOiB3Lmhhc1N5bWJvbEJ1Y2tldHMgJiYgIXcuc3ltYm9sRmFkZUZpbmlzaGVkKCkgfHwgdGhpcy5fcmVtb3ZlVGlsZShiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl91cGRhdGVMb2FkZWRQYXJlbnRUaWxlQ2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUucmVsZWFzZVN5bWJvbEZhZGVUaWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgIHRoaXMuX3RpbGVzW3RdLmhvbGRpbmdGb3JGYWRlKCkgJiYgdGhpcy5fcmVtb3ZlVGlsZSh0KTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZVJldGFpbmVkVGlsZXMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBmb3IgKHZhciBvID0ge30sIHIgPSB7fSwgYSA9IE1hdGgubWF4KGUgLSBpLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSksIG4gPSBNYXRoLm1heChlICsgaS5tYXhVbmRlcnpvb21pbmcsIHRoaXMuX3NvdXJjZS5taW56b29tKSwgcyA9IHt9LCBsID0gMCwgYyA9IHQ7IGwgPCBjLmxlbmd0aDsgbCArPSAxKSB7XG4gICAgICAgICAgdmFyIHUgPSBjW2xdLFxuICAgICAgICAgICAgICBoID0gdGhpcy5fYWRkVGlsZSh1KTtcblxuICAgICAgICAgIG9bdS5rZXldID0gdSwgaC5oYXNEYXRhKCkgfHwgZSA8IHRoaXMuX3NvdXJjZS5tYXh6b29tICYmIChzW3Uua2V5XSA9IHUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmV0YWluTG9hZGVkQ2hpbGRyZW4ocywgZSwgbiwgbyk7XG5cbiAgICAgICAgZm9yICh2YXIgcCA9IDAsIGQgPSB0OyBwIDwgZC5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgICAgIHZhciBfID0gZFtwXSxcbiAgICAgICAgICAgICAgZiA9IHRoaXMuX3RpbGVzW18ua2V5XTtcblxuICAgICAgICAgIGlmICghZi5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgIGlmIChlICsgMSA+IHRoaXMuX3NvdXJjZS5tYXh6b29tKSB7XG4gICAgICAgICAgICAgIHZhciBtID0gXy5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSlbMF0sXG4gICAgICAgICAgICAgICAgICBnID0gdGhpcy5nZXRUaWxlKG0pO1xuXG4gICAgICAgICAgICAgIGlmIChnICYmIGcuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgb1ttLmtleV0gPSBtO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgdiA9IF8uY2hpbGRyZW4odGhpcy5fc291cmNlLm1heHpvb20pO1xuXG4gICAgICAgICAgICAgIGlmIChvW3ZbMF0ua2V5XSAmJiBvW3ZbMV0ua2V5XSAmJiBvW3ZbMl0ua2V5XSAmJiBvW3ZbM10ua2V5XSkgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIHkgPSBmLndhc1JlcXVlc3RlZCgpLCB4ID0gXy5vdmVyc2NhbGVkWiAtIDE7IHggPj0gYTsgLS14KSB7XG4gICAgICAgICAgICAgIHZhciBiID0gXy5zY2FsZWRUbyh4KTtcblxuICAgICAgICAgICAgICBpZiAocltiLmtleV0pIGJyZWFrO1xuICAgICAgICAgICAgICBpZiAocltiLmtleV0gPSAhMCwgIShmID0gdGhpcy5nZXRUaWxlKGIpKSAmJiB5ICYmIChmID0gdGhpcy5fYWRkVGlsZShiKSksIGYgJiYgKG9bYi5rZXldID0gYiwgeSA9IGYud2FzUmVxdWVzdGVkKCksIGYuaGFzRGF0YSgpKSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdXBkYXRlTG9hZGVkUGFyZW50VGlsZUNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzID0ge30sIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBpID0gdm9pZCAwLCBvID0gdGhpcy5fdGlsZXNbdF0udGlsZUlEOyBvLm92ZXJzY2FsZWRaID4gMDspIHtcbiAgICAgICAgICAgIGlmIChvLmtleSBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcykge1xuICAgICAgICAgICAgICBpID0gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbby5rZXldO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZS5wdXNoKG8ua2V5KTtcbiAgICAgICAgICAgIHZhciByID0gby5zY2FsZWRUbyhvLm92ZXJzY2FsZWRaIC0gMSk7XG4gICAgICAgICAgICBpZiAoaSA9IHRoaXMuX2dldExvYWRlZFRpbGUocikpIGJyZWFrO1xuICAgICAgICAgICAgbyA9IHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgYSA9IDAsIG4gPSBlOyBhIDwgbi5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbblthXV0gPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX2FkZFRpbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuX3RpbGVzW2Uua2V5XTtcbiAgICAgICAgaWYgKGkpIHJldHVybiBpO1xuICAgICAgICAoaSA9IHRoaXMuX2NhY2hlLmdldEFuZFJlbW92ZShlKSkgJiYgKHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihlLmtleSwgaSksIGkudGlsZUlEID0gZSwgdGhpcy5fc3RhdGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZShpLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKSwgdGhpcy5fY2FjaGVUaW1lcnNbZS5rZXldICYmIChjbGVhclRpbWVvdXQodGhpcy5fY2FjaGVUaW1lcnNbZS5rZXldKSwgZGVsZXRlIHRoaXMuX2NhY2hlVGltZXJzW2Uua2V5XSwgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKGUua2V5LCBpKSkpO1xuICAgICAgICB2YXIgbyA9IEJvb2xlYW4oaSk7XG4gICAgICAgIHJldHVybiBvIHx8IChpID0gbmV3IHQuVGlsZShlLCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiBlLm92ZXJzY2FsZUZhY3RvcigpKSwgdGhpcy5fbG9hZFRpbGUoaSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIGksIGUua2V5LCBpLnN0YXRlKSkpLCBpID8gKGkudXNlcysrLCB0aGlzLl90aWxlc1tlLmtleV0gPSBpLCBvIHx8IHRoaXMuX3NvdXJjZS5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YWxvYWRpbmdcIiwge1xuICAgICAgICAgIHRpbGU6IGksXG4gICAgICAgICAgY29vcmQ6IGkudGlsZUlELFxuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiXG4gICAgICAgIH0pKSwgaSkgOiBudWxsO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3NldFRpbGVSZWxvYWRUaW1lciA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgdCBpbiB0aGlzLl90aW1lcnMgJiYgKGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbdF0pLCBkZWxldGUgdGhpcy5fdGltZXJzW3RdKTtcbiAgICAgICAgdmFyIG8gPSBlLmdldEV4cGlyeVRpbWVvdXQoKTtcbiAgICAgICAgbyAmJiAodGhpcy5fdGltZXJzW3RdID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaS5fcmVsb2FkVGlsZSh0LCBcImV4cGlyZWRcIiksIGRlbGV0ZSBpLl90aW1lcnNbdF07XG4gICAgICAgIH0sIG8pKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl90aWxlc1t0XTtcbiAgICAgICAgZSAmJiAoZS51c2VzLS0sIGRlbGV0ZSB0aGlzLl90aWxlc1t0XSwgdGhpcy5fdGltZXJzW3RdICYmIChjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW3RdKSwgZGVsZXRlIHRoaXMuX3RpbWVyc1t0XSksIGUudXNlcyA+IDAgfHwgKGUuaGFzRGF0YSgpICYmIFwicmVsb2FkaW5nXCIgIT09IGUuc3RhdGUgPyB0aGlzLl9jYWNoZS5hZGQoZS50aWxlSUQsIGUsIGUuZ2V0RXhwaXJ5VGltZW91dCgpKSA6IChlLmFib3J0ZWQgPSAhMCwgdGhpcy5fYWJvcnRUaWxlKGUpLCB0aGlzLl91bmxvYWRUaWxlKGUpKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuY2xlYXJUaWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9ICExLCB0aGlzLl9wYXVzZWQgPSAhMSwgdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRpbGVzSW4gPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2YXIgciA9IHRoaXMsXG4gICAgICAgICAgICBhID0gW10sXG4gICAgICAgICAgICBuID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGlmICghbikgcmV0dXJuIGE7XG5cbiAgICAgICAgZm9yICh2YXIgcyA9IG8gPyBuLmdldENhbWVyYVF1ZXJ5R2VvbWV0cnkoZSkgOiBlLCBsID0gZS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gbi5wb2ludENvb3JkaW5hdGUodCk7XG4gICAgICAgIH0pLCBjID0gcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gbi5wb2ludENvb3JkaW5hdGUodCk7XG4gICAgICAgIH0pLCB1ID0gdGhpcy5nZXRJZHMoKSwgaCA9IDEgLyAwLCBwID0gMSAvIDAsIGQgPSAtMSAvIDAsIF8gPSAtMSAvIDAsIGYgPSAwLCBtID0gYzsgZiA8IG0ubGVuZ3RoOyBmICs9IDEpIHtcbiAgICAgICAgICB2YXIgZyA9IG1bZl07XG4gICAgICAgICAgaCA9IE1hdGgubWluKGgsIGcueCksIHAgPSBNYXRoLm1pbihwLCBnLnkpLCBkID0gTWF0aC5tYXgoZCwgZy54KSwgXyA9IE1hdGgubWF4KF8sIGcueSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciB2ID0gZnVuY3Rpb24gdihlKSB7XG4gICAgICAgICAgdmFyIG8gPSByLl90aWxlc1t1W2VdXTtcblxuICAgICAgICAgIGlmICghby5ob2xkaW5nRm9yRmFkZSgpKSB7XG4gICAgICAgICAgICB2YXIgcyA9IG8udGlsZUlELFxuICAgICAgICAgICAgICAgIGYgPSBNYXRoLnBvdygyLCBuLnpvb20gLSBvLnRpbGVJRC5vdmVyc2NhbGVkWiksXG4gICAgICAgICAgICAgICAgbSA9IGkgKiBvLnF1ZXJ5UGFkZGluZyAqIHQuRVhURU5UIC8gby50aWxlU2l6ZSAvIGYsXG4gICAgICAgICAgICAgICAgZyA9IFtzLmdldFRpbGVQb2ludChuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoaCwgcCkpLCBzLmdldFRpbGVQb2ludChuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoZCwgXykpXTtcblxuICAgICAgICAgICAgaWYgKGdbMF0ueCAtIG0gPCB0LkVYVEVOVCAmJiBnWzBdLnkgLSBtIDwgdC5FWFRFTlQgJiYgZ1sxXS54ICsgbSA+PSAwICYmIGdbMV0ueSArIG0gPj0gMCkge1xuICAgICAgICAgICAgICB2YXIgdiA9IGwubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0VGlsZVBvaW50KHQpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHkgPSBjLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzLmdldFRpbGVQb2ludCh0KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGEucHVzaCh7XG4gICAgICAgICAgICAgICAgdGlsZTogbyxcbiAgICAgICAgICAgICAgICB0aWxlSUQ6IHMsXG4gICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogdixcbiAgICAgICAgICAgICAgICBjYW1lcmFRdWVyeUdlb21ldHJ5OiB5LFxuICAgICAgICAgICAgICAgIHNjYWxlOiBmXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgeSA9IDA7IHkgPCB1Lmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgdih5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMsIGkgPSB0aGlzLmdldFJlbmRlcmFibGVJZHModCkubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIGUuX3RpbGVzW3RdLnRpbGVJRDtcbiAgICAgICAgfSksIG8gPSAwLCByID0gaTsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IHJbb107XG4gICAgICAgICAgYS5wb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoYS50b1Vud3JhcHBlZCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUcmFuc2l0aW9uKCkpIHJldHVybiAhMDtcbiAgICAgICAgaWYgKE10KHRoaXMuX3NvdXJjZS50eXBlKSkgZm9yICh2YXIgZSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgIHZhciBpID0gdGhpcy5fdGlsZXNbZV07XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaS5mYWRlRW5kVGltZSAmJiBpLmZhZGVFbmRUaW1lID49IHQuYnJvd3Nlci5ub3coKSkgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldEZlYXR1cmVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlLnVwZGF0ZVN0YXRlKHQgPSB0IHx8IFwiX2dlb2pzb25UaWxlTGF5ZXJcIiwgZSwgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZW1vdmVGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICB0aGlzLl9zdGF0ZS5yZW1vdmVGZWF0dXJlU3RhdGUodCA9IHQgfHwgXCJfZ2VvanNvblRpbGVMYXllclwiLCBlLCBpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEZlYXR1cmVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXRTdGF0ZSh0ID0gdCB8fCBcIl9nZW9qc29uVGlsZUxheWVyXCIsIGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLl90aWxlc1t0XTtcbiAgICAgICAgbyAmJiBvLnNldERlcGVuZGVuY2llcyhlLCBpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbG9hZFRpbGVzRm9yRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgIHRoaXMuX3RpbGVzW2ldLmhhc0RlcGVuZGVuY3kodCwgZSkgJiYgdGhpcy5fcmVsb2FkVGlsZShpLCBcInJlbG9hZGluZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhY2hlLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiAhaS5oYXNEZXBlbmRlbmN5KHQsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGk7XG4gICAgfSh0LkV2ZW50ZWQpO1xuXG4gICAgZnVuY3Rpb24gQXQodCwgZSkge1xuICAgICAgdmFyIGkgPSBNYXRoLmFicygyICogdC53cmFwKSAtICsodC53cmFwIDwgMCksXG4gICAgICAgICAgbyA9IE1hdGguYWJzKDIgKiBlLndyYXApIC0gKyhlLndyYXAgPCAwKTtcbiAgICAgIHJldHVybiB0Lm92ZXJzY2FsZWRaIC0gZS5vdmVyc2NhbGVkWiB8fCBvIC0gaSB8fCBlLmNhbm9uaWNhbC55IC0gdC5jYW5vbmljYWwueSB8fCBlLmNhbm9uaWNhbC54IC0gdC5jYW5vbmljYWwueDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBNdCh0KSB7XG4gICAgICByZXR1cm4gXCJyYXN0ZXJcIiA9PT0gdCB8fCBcImltYWdlXCIgPT09IHQgfHwgXCJ2aWRlb1wiID09PSB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEx0KCkge1xuICAgICAgcmV0dXJuIG5ldyB0LndpbmRvdy5Xb3JrZXIoS3Iud29ya2VyVXJsKTtcbiAgICB9XG5cbiAgICBEdC5tYXhPdmVyem9vbWluZyA9IDEwLCBEdC5tYXhVbmRlcnpvb21pbmcgPSAzO1xuXG4gICAgdmFyIFJ0ID0gXCJtYXBib3hnbF9wcmVsb2FkZWRfd29ya2VyX3Bvb2xcIixcbiAgICAgICAga3QgPSBmdW5jdGlvbiBrdCgpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfTtcblxuICAgIGt0LnByb3RvdHlwZS5hY3F1aXJlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICghdGhpcy53b3JrZXJzKSBmb3IgKHRoaXMud29ya2VycyA9IFtdOyB0aGlzLndvcmtlcnMubGVuZ3RoIDwga3Qud29ya2VyQ291bnQ7KSB7XG4gICAgICAgIHRoaXMud29ya2Vycy5wdXNoKG5ldyBMdCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVt0XSA9ICEwLCB0aGlzLndvcmtlcnMuc2xpY2UoKTtcbiAgICB9LCBrdC5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBkZWxldGUgdGhpcy5hY3RpdmVbdF0sIDAgPT09IHRoaXMubnVtQWN0aXZlKCkgJiYgKHRoaXMud29ya2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQudGVybWluYXRlKCk7XG4gICAgICB9KSwgdGhpcy53b3JrZXJzID0gbnVsbCk7XG4gICAgfSwga3QucHJvdG90eXBlLmlzUHJlbG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5hY3RpdmVbUnRdO1xuICAgIH0sIGt0LnByb3RvdHlwZS5udW1BY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hY3RpdmUpLmxlbmd0aDtcbiAgICB9O1xuICAgIHZhciBCdCxcbiAgICAgICAgT3QgPSBNYXRoLmZsb29yKHQuYnJvd3Nlci5oYXJkd2FyZUNvbmN1cnJlbmN5IC8gMik7XG5cbiAgICBmdW5jdGlvbiBGdCgpIHtcbiAgICAgIHJldHVybiBCdCB8fCAoQnQgPSBuZXcga3QoKSksIEJ0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0KGUsIGkpIHtcbiAgICAgIHZhciBvID0ge307XG5cbiAgICAgIGZvciAodmFyIHIgaW4gZSkge1xuICAgICAgICBcInJlZlwiICE9PSByICYmIChvW3JdID0gZVtyXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0LnJlZlByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB0IGluIGkgJiYgKG9bdF0gPSBpW3RdKTtcbiAgICAgIH0pLCBvO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE50KHQpIHtcbiAgICAgIHQgPSB0LnNsaWNlKCk7XG5cbiAgICAgIGZvciAodmFyIGUgPSBPYmplY3QuY3JlYXRlKG51bGwpLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZVt0W2ldLmlkXSA9IHRbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdC5sZW5ndGg7IG8rKykge1xuICAgICAgICBcInJlZlwiIGluIHRbb10gJiYgKHRbb10gPSBVdCh0W29dLCBlW3Rbb10ucmVmXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBrdC53b3JrZXJDb3VudCA9IE1hdGgubWF4KE1hdGgubWluKE90LCA2KSwgMSk7XG4gICAgdmFyIFp0ID0ge1xuICAgICAgc2V0U3R5bGU6IFwic2V0U3R5bGVcIixcbiAgICAgIGFkZExheWVyOiBcImFkZExheWVyXCIsXG4gICAgICByZW1vdmVMYXllcjogXCJyZW1vdmVMYXllclwiLFxuICAgICAgc2V0UGFpbnRQcm9wZXJ0eTogXCJzZXRQYWludFByb3BlcnR5XCIsXG4gICAgICBzZXRMYXlvdXRQcm9wZXJ0eTogXCJzZXRMYXlvdXRQcm9wZXJ0eVwiLFxuICAgICAgc2V0RmlsdGVyOiBcInNldEZpbHRlclwiLFxuICAgICAgYWRkU291cmNlOiBcImFkZFNvdXJjZVwiLFxuICAgICAgcmVtb3ZlU291cmNlOiBcInJlbW92ZVNvdXJjZVwiLFxuICAgICAgc2V0R2VvSlNPTlNvdXJjZURhdGE6IFwic2V0R2VvSlNPTlNvdXJjZURhdGFcIixcbiAgICAgIHNldExheWVyWm9vbVJhbmdlOiBcInNldExheWVyWm9vbVJhbmdlXCIsXG4gICAgICBzZXRMYXllclByb3BlcnR5OiBcInNldExheWVyUHJvcGVydHlcIixcbiAgICAgIHNldENlbnRlcjogXCJzZXRDZW50ZXJcIixcbiAgICAgIHNldFpvb206IFwic2V0Wm9vbVwiLFxuICAgICAgc2V0QmVhcmluZzogXCJzZXRCZWFyaW5nXCIsXG4gICAgICBzZXRQaXRjaDogXCJzZXRQaXRjaFwiLFxuICAgICAgc2V0U3ByaXRlOiBcInNldFNwcml0ZVwiLFxuICAgICAgc2V0R2x5cGhzOiBcInNldEdseXBoc1wiLFxuICAgICAgc2V0VHJhbnNpdGlvbjogXCJzZXRUcmFuc2l0aW9uXCIsXG4gICAgICBzZXRMaWdodDogXCJzZXRMaWdodFwiXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHF0KHQsIGUsIGkpIHtcbiAgICAgIGkucHVzaCh7XG4gICAgICAgIGNvbW1hbmQ6IFp0LmFkZFNvdXJjZSxcbiAgICAgICAgYXJnczogW3QsIGVbdF1dXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqdCh0LCBlLCBpKSB7XG4gICAgICBlLnB1c2goe1xuICAgICAgICBjb21tYW5kOiBadC5yZW1vdmVTb3VyY2UsXG4gICAgICAgIGFyZ3M6IFt0XVxuICAgICAgfSksIGlbdF0gPSAhMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBWdCh0LCBlLCBpLCBvKSB7XG4gICAgICBqdCh0LCBpLCBvKSwgcXQodCwgZSwgaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR3QoZSwgaSwgbykge1xuICAgICAgdmFyIHI7XG5cbiAgICAgIGZvciAociBpbiBlW29dKSB7XG4gICAgICAgIGlmIChlW29dLmhhc093blByb3BlcnR5KHIpICYmIFwiZGF0YVwiICE9PSByICYmICF0LmRlZXBFcXVhbChlW29dW3JdLCBpW29dW3JdKSkgcmV0dXJuICExO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHIgaW4gaVtvXSkge1xuICAgICAgICBpZiAoaVtvXS5oYXNPd25Qcm9wZXJ0eShyKSAmJiBcImRhdGFcIiAhPT0gciAmJiAhdC5kZWVwRXF1YWwoZVtvXVtyXSwgaVtvXVtyXSkpIHJldHVybiAhMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFd0KGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzO1xuXG4gICAgICBmb3IgKHMgaW4gaSA9IGkgfHwge30sIGUgPSBlIHx8IHt9KSB7XG4gICAgICAgIGUuaGFzT3duUHJvcGVydHkocykgJiYgKHQuZGVlcEVxdWFsKGVbc10sIGlbc10pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgY29tbWFuZDogbixcbiAgICAgICAgICBhcmdzOiBbciwgcywgaVtzXSwgYV1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHMgaW4gaSkge1xuICAgICAgICBpLmhhc093blByb3BlcnR5KHMpICYmICFlLmhhc093blByb3BlcnR5KHMpICYmICh0LmRlZXBFcXVhbChlW3NdLCBpW3NdKSB8fCBvLnB1c2goe1xuICAgICAgICAgIGNvbW1hbmQ6IG4sXG4gICAgICAgICAgYXJnczogW3IsIHMsIGlbc10sIGFdXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBYdCh0KSB7XG4gICAgICByZXR1cm4gdC5pZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBIdCh0LCBlKSB7XG4gICAgICByZXR1cm4gdFtlLmlkXSA9IGUsIHQ7XG4gICAgfVxuXG4gICAgdmFyIEt0ID0gZnVuY3Rpb24gS3QodCwgZSkge1xuICAgICAgdGhpcy5yZXNldCh0LCBlKTtcbiAgICB9O1xuXG4gICAgS3QucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMucG9pbnRzID0gdCB8fCBbXSwgdGhpcy5fZGlzdGFuY2VzID0gWzBdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlc1tpXSA9IHRoaXMuX2Rpc3RhbmNlc1tpIC0gMV0gKyB0aGlzLnBvaW50c1tpXS5kaXN0KHRoaXMucG9pbnRzW2kgLSAxXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZGlzdGFuY2VzW3RoaXMuX2Rpc3RhbmNlcy5sZW5ndGggLSAxXSwgdGhpcy5wYWRkaW5nID0gTWF0aC5taW4oZSB8fCAwLCAuNSAqIHRoaXMubGVuZ3RoKSwgdGhpcy5wYWRkZWRMZW5ndGggPSB0aGlzLmxlbmd0aCAtIDIgKiB0aGlzLnBhZGRpbmc7XG4gICAgfSwgS3QucHJvdG90eXBlLmxlcnAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKDEgPT09IHRoaXMucG9pbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMucG9pbnRzWzBdO1xuICAgICAgZSA9IHQuY2xhbXAoZSwgMCwgMSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAxLCBvID0gdGhpcy5fZGlzdGFuY2VzW2ldLCByID0gZSAqIHRoaXMucGFkZGVkTGVuZ3RoICsgdGhpcy5wYWRkaW5nOyBvIDwgciAmJiBpIDwgdGhpcy5fZGlzdGFuY2VzLmxlbmd0aDspIHtcbiAgICAgICAgbyA9IHRoaXMuX2Rpc3RhbmNlc1srK2ldO1xuICAgICAgfVxuXG4gICAgICB2YXIgYSA9IGkgLSAxLFxuICAgICAgICAgIG4gPSB0aGlzLl9kaXN0YW5jZXNbYV0sXG4gICAgICAgICAgcyA9IG8gLSBuLFxuICAgICAgICAgIGwgPSBzID4gMCA/IChyIC0gbikgLyBzIDogMDtcbiAgICAgIHJldHVybiB0aGlzLnBvaW50c1thXS5tdWx0KDEgLSBsKS5hZGQodGhpcy5wb2ludHNbaV0ubXVsdChsKSk7XG4gICAgfTtcblxuICAgIHZhciBZdCA9IGZ1bmN0aW9uIFl0KHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcy5ib3hDZWxscyA9IFtdLFxuICAgICAgICAgIHIgPSB0aGlzLmNpcmNsZUNlbGxzID0gW107XG4gICAgICB0aGlzLnhDZWxsQ291bnQgPSBNYXRoLmNlaWwodCAvIGkpLCB0aGlzLnlDZWxsQ291bnQgPSBNYXRoLmNlaWwoZSAvIGkpO1xuXG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHRoaXMueENlbGxDb3VudCAqIHRoaXMueUNlbGxDb3VudDsgYSsrKSB7XG4gICAgICAgIG8ucHVzaChbXSksIHIucHVzaChbXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2lyY2xlS2V5cyA9IFtdLCB0aGlzLmJveEtleXMgPSBbXSwgdGhpcy5iYm94ZXMgPSBbXSwgdGhpcy5jaXJjbGVzID0gW10sIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGUsIHRoaXMueFNjYWxlID0gdGhpcy54Q2VsbENvdW50IC8gdCwgdGhpcy55U2NhbGUgPSB0aGlzLnlDZWxsQ291bnQgLyBlLCB0aGlzLmJveFVpZCA9IDAsIHRoaXMuY2lyY2xlVWlkID0gMDtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gSnQoZSwgaSwgbywgciwgYSkge1xuICAgICAgdmFyIG4gPSB0LmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGkgPyAodC5zY2FsZShuLCBuLCBbMSAvIGEsIDEgLyBhLCAxXSksIG8gfHwgdC5yb3RhdGVaKG4sIG4sIHIuYW5nbGUpKSA6IHQubXVsdGlwbHkobiwgci5sYWJlbFBsYW5lTWF0cml4LCBlKSwgbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBRdChlLCBpLCBvLCByLCBhKSB7XG4gICAgICBpZiAoaSkge1xuICAgICAgICB2YXIgbiA9IHQuY2xvbmUoZSk7XG4gICAgICAgIHJldHVybiB0LnNjYWxlKG4sIG4sIFthLCBhLCAxXSksIG8gfHwgdC5yb3RhdGVaKG4sIG4sIC1yLmFuZ2xlKSwgbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHIuZ2xDb29yZE1hdHJpeDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkdChlLCBpKSB7XG4gICAgICB2YXIgbyA9IFtlLngsIGUueSwgMCwgMV07XG4gICAgICB1ZShvLCBvLCBpKTtcbiAgICAgIHZhciByID0gb1szXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBuZXcgdC5Qb2ludChvWzBdIC8gciwgb1sxXSAvIHIpLFxuICAgICAgICBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IHJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGUodCwgZSkge1xuICAgICAgcmV0dXJuIC41ICsgdCAvIGUgKiAuNTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlZSh0LCBlKSB7XG4gICAgICB2YXIgaSA9IHRbMF0gLyB0WzNdLFxuICAgICAgICAgIG8gPSB0WzFdIC8gdFszXTtcbiAgICAgIHJldHVybiBpID49IC1lWzBdICYmIGkgPD0gZVswXSAmJiBvID49IC1lWzFdICYmIG8gPD0gZVsxXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpZShlLCBpLCBvLCByLCBhLCBuLCBzLCBsKSB7XG4gICAgICB2YXIgYyA9IHIgPyBlLnRleHRTaXplRGF0YSA6IGUuaWNvblNpemVEYXRhLFxuICAgICAgICAgIHUgPSB0LmV2YWx1YXRlU2l6ZUZvclpvb20oYywgby50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgaCA9IFsyNTYgLyBvLndpZHRoICogMiArIDEsIDI1NiAvIG8uaGVpZ2h0ICogMiArIDFdLFxuICAgICAgICAgIHAgPSByID8gZS50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA6IGUuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICBwLmNsZWFyKCk7XG5cbiAgICAgIGZvciAodmFyIGQgPSBlLmxpbmVWZXJ0ZXhBcnJheSwgXyA9IHIgPyBlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkgOiBlLmljb24ucGxhY2VkU3ltYm9sQXJyYXksIGYgPSBvLnRyYW5zZm9ybS53aWR0aCAvIG8udHJhbnNmb3JtLmhlaWdodCwgbSA9ICExLCBnID0gMDsgZyA8IF8ubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgdmFyIHYgPSBfLmdldChnKTtcblxuICAgICAgICBpZiAodi5oaWRkZW4gfHwgdi53cml0aW5nTW9kZSA9PT0gdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCAmJiAhbSkgY2Uodi5udW1HbHlwaHMsIHApO2Vsc2Uge1xuICAgICAgICAgIG0gPSAhMTtcbiAgICAgICAgICB2YXIgeSA9IFt2LmFuY2hvclgsIHYuYW5jaG9yWSwgMCwgMV07XG5cbiAgICAgICAgICBpZiAodC50cmFuc2Zvcm1NYXQ0KHksIHksIGkpLCBlZSh5LCBoKSkge1xuICAgICAgICAgICAgdmFyIHggPSB0ZShvLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLCB5WzNdKSxcbiAgICAgICAgICAgICAgICBiID0gdC5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKGMsIHUsIHYpLFxuICAgICAgICAgICAgICAgIHcgPSBzID8gYiAvIHggOiBiICogeCxcbiAgICAgICAgICAgICAgICBUID0gbmV3IHQuUG9pbnQodi5hbmNob3JYLCB2LmFuY2hvclkpLFxuICAgICAgICAgICAgICAgIEUgPSAkdChULCBhKS5wb2ludCxcbiAgICAgICAgICAgICAgICBJID0ge30sXG4gICAgICAgICAgICAgICAgUCA9IGFlKHYsIHcsICExLCBsLCBpLCBhLCBuLCBlLmdseXBoT2Zmc2V0QXJyYXksIGQsIHAsIEUsIFQsIEksIGYpO1xuICAgICAgICAgICAgbSA9IFAudXNlVmVydGljYWwsIChQLm5vdEVub3VnaFJvb20gfHwgbSB8fCBQLm5lZWRzRmxpcHBpbmcgJiYgYWUodiwgdywgITAsIGwsIGksIGEsIG4sIGUuZ2x5cGhPZmZzZXRBcnJheSwgZCwgcCwgRSwgVCwgSSwgZikubm90RW5vdWdoUm9vbSkgJiYgY2Uodi5udW1HbHlwaHMsIHApO1xuICAgICAgICAgIH0gZWxzZSBjZSh2Lm51bUdseXBocywgcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgciA/IGUudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEocCkgOiBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9lKHQsIGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUpIHtcbiAgICAgIHZhciBoID0gcy5nbHlwaFN0YXJ0SW5kZXggKyBzLm51bUdseXBocyxcbiAgICAgICAgICBwID0gcy5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgICBkID0gcy5saW5lU3RhcnRJbmRleCArIHMubGluZUxlbmd0aCxcbiAgICAgICAgICBfID0gZS5nZXRvZmZzZXRYKHMuZ2x5cGhTdGFydEluZGV4KSxcbiAgICAgICAgICBmID0gZS5nZXRvZmZzZXRYKGggLSAxKSxcbiAgICAgICAgICBtID0gc2UodCAqIF8sIGksIG8sIHIsIGEsIG4sIHMuc2VnbWVudCwgcCwgZCwgbCwgYywgdSk7XG5cbiAgICAgIGlmICghbSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZyA9IHNlKHQgKiBmLCBpLCBvLCByLCBhLCBuLCBzLnNlZ21lbnQsIHAsIGQsIGwsIGMsIHUpO1xuICAgICAgcmV0dXJuIGcgPyB7XG4gICAgICAgIGZpcnN0OiBtLFxuICAgICAgICBsYXN0OiBnXG4gICAgICB9IDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZShlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4gZSA9PT0gdC5Xcml0aW5nTW9kZS5ob3Jpem9udGFsICYmIE1hdGguYWJzKG8ueSAtIGkueSkgPiBNYXRoLmFicyhvLnggLSBpLngpICogciA/IHtcbiAgICAgICAgdXNlVmVydGljYWw6ICEwXG4gICAgICB9IDogKGUgPT09IHQuV3JpdGluZ01vZGUudmVydGljYWwgPyBpLnkgPCBvLnkgOiBpLnggPiBvLngpID8ge1xuICAgICAgICBuZWVkc0ZsaXBwaW5nOiAhMFxuICAgICAgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWUoZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYywgdSwgaCwgcCwgZCwgXykge1xuICAgICAgdmFyIGYsXG4gICAgICAgICAgbSA9IGkgLyAyNCxcbiAgICAgICAgICBnID0gZS5saW5lT2Zmc2V0WCAqIG0sXG4gICAgICAgICAgdiA9IGUubGluZU9mZnNldFkgKiBtO1xuXG4gICAgICBpZiAoZS5udW1HbHlwaHMgPiAxKSB7XG4gICAgICAgIHZhciB5ID0gZS5nbHlwaFN0YXJ0SW5kZXggKyBlLm51bUdseXBocyxcbiAgICAgICAgICAgIHggPSBlLmxpbmVTdGFydEluZGV4LFxuICAgICAgICAgICAgYiA9IGUubGluZVN0YXJ0SW5kZXggKyBlLmxpbmVMZW5ndGgsXG4gICAgICAgICAgICB3ID0gb2UobSwgbCwgZywgdiwgbywgaCwgcCwgZSwgYywgbiwgZCk7XG4gICAgICAgIGlmICghdykgcmV0dXJuIHtcbiAgICAgICAgICBub3RFbm91Z2hSb29tOiAhMFxuICAgICAgICB9O1xuICAgICAgICB2YXIgVCA9ICR0KHcuZmlyc3QucG9pbnQsIHMpLnBvaW50LFxuICAgICAgICAgICAgRSA9ICR0KHcubGFzdC5wb2ludCwgcykucG9pbnQ7XG5cbiAgICAgICAgaWYgKHIgJiYgIW8pIHtcbiAgICAgICAgICB2YXIgSSA9IHJlKGUud3JpdGluZ01vZGUsIFQsIEUsIF8pO1xuICAgICAgICAgIGlmIChJKSByZXR1cm4gSTtcbiAgICAgICAgfVxuXG4gICAgICAgIGYgPSBbdy5maXJzdF07XG5cbiAgICAgICAgZm9yICh2YXIgUCA9IGUuZ2x5cGhTdGFydEluZGV4ICsgMTsgUCA8IHkgLSAxOyBQKyspIHtcbiAgICAgICAgICBmLnB1c2goc2UobSAqIGwuZ2V0b2Zmc2V0WChQKSwgZywgdiwgbywgaCwgcCwgZS5zZWdtZW50LCB4LCBiLCBjLCBuLCBkKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmLnB1c2gody5sYXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyICYmICFvKSB7XG4gICAgICAgICAgdmFyIFMgPSAkdChwLCBhKS5wb2ludCxcbiAgICAgICAgICAgICAgQyA9IGUubGluZVN0YXJ0SW5kZXggKyBlLnNlZ21lbnQgKyAxLFxuICAgICAgICAgICAgICB6ID0gbmV3IHQuUG9pbnQoYy5nZXR4KEMpLCBjLmdldHkoQykpLFxuICAgICAgICAgICAgICBEID0gJHQoeiwgYSksXG4gICAgICAgICAgICAgIEEgPSBELnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDAgPyBELnBvaW50IDogbmUocCwgeiwgUywgMSwgYSksXG4gICAgICAgICAgICAgIE0gPSByZShlLndyaXRpbmdNb2RlLCBTLCBBLCBfKTtcbiAgICAgICAgICBpZiAoTSkgcmV0dXJuIE07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgTCA9IHNlKG0gKiBsLmdldG9mZnNldFgoZS5nbHlwaFN0YXJ0SW5kZXgpLCBnLCB2LCBvLCBoLCBwLCBlLnNlZ21lbnQsIGUubGluZVN0YXJ0SW5kZXgsIGUubGluZVN0YXJ0SW5kZXggKyBlLmxpbmVMZW5ndGgsIGMsIG4sIGQpO1xuICAgICAgICBpZiAoIUwpIHJldHVybiB7XG4gICAgICAgICAgbm90RW5vdWdoUm9vbTogITBcbiAgICAgICAgfTtcbiAgICAgICAgZiA9IFtMXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgUiA9IDAsIGsgPSBmOyBSIDwgay5sZW5ndGg7IFIgKz0gMSkge1xuICAgICAgICB2YXIgQiA9IGtbUl07XG4gICAgICAgIHQuYWRkRHluYW1pY0F0dHJpYnV0ZXModSwgQi5wb2ludCwgQi5hbmdsZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZSh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSA9ICR0KHQuYWRkKHQuc3ViKGUpLl91bml0KCkpLCByKS5wb2ludCxcbiAgICAgICAgICBuID0gaS5zdWIoYSk7XG4gICAgICByZXR1cm4gaS5hZGQobi5fbXVsdChvIC8gbi5tYWcoKSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgsIHApIHtcbiAgICAgIHZhciBkID0gciA/IGUgLSBpIDogZSArIGksXG4gICAgICAgICAgXyA9IGQgPiAwID8gMSA6IC0xLFxuICAgICAgICAgIGYgPSAwO1xuXG4gICAgICByICYmIChfICo9IC0xLCBmID0gTWF0aC5QSSksIF8gPCAwICYmIChmICs9IE1hdGguUEkpO1xuXG4gICAgICBmb3IgKHZhciBtID0gXyA+IDAgPyBsICsgcyA6IGwgKyBzICsgMSwgZyA9IGEsIHYgPSBhLCB5ID0gMCwgeCA9IDAsIGIgPSBNYXRoLmFicyhkKSwgdyA9IFtdOyB5ICsgeCA8PSBiOykge1xuICAgICAgICBpZiAoKG0gKz0gXykgPCBsIHx8IG0gPj0gYykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKHYgPSBnLCB3LnB1c2goZyksIHZvaWQgMCA9PT0gKGcgPSBwW21dKSkge1xuICAgICAgICAgIHZhciBUID0gbmV3IHQuUG9pbnQodS5nZXR4KG0pLCB1LmdldHkobSkpLFxuICAgICAgICAgICAgICBFID0gJHQoVCwgaCk7XG4gICAgICAgICAgaWYgKEUuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhID4gMCkgZyA9IHBbbV0gPSBFLnBvaW50O2Vsc2Uge1xuICAgICAgICAgICAgdmFyIEkgPSBtIC0gXztcbiAgICAgICAgICAgIGcgPSBuZSgwID09PSB5ID8gbiA6IG5ldyB0LlBvaW50KHUuZ2V0eChJKSwgdS5nZXR5KEkpKSwgVCwgdiwgYiAtIHkgKyAxLCBoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB5ICs9IHgsIHggPSB2LmRpc3QoZyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBQID0gKGIgLSB5KSAvIHgsXG4gICAgICAgICAgUyA9IGcuc3ViKHYpLFxuICAgICAgICAgIEMgPSBTLm11bHQoUCkuX2FkZCh2KTtcblxuICAgICAgQy5fYWRkKFMuX3VuaXQoKS5fcGVycCgpLl9tdWx0KG8gKiBfKSk7XG5cbiAgICAgIHZhciB6ID0gZiArIE1hdGguYXRhbjIoZy55IC0gdi55LCBnLnggLSB2LngpO1xuICAgICAgcmV0dXJuIHcucHVzaChDKSwge1xuICAgICAgICBwb2ludDogQyxcbiAgICAgICAgYW5nbGU6IHosXG4gICAgICAgIHBhdGg6IHdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgWXQucHJvdG90eXBlLmtleXNMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib3hLZXlzLmxlbmd0aCArIHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7XG4gICAgfSwgWXQucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB0aGlzLl9mb3JFYWNoQ2VsbChlLCBpLCBvLCByLCB0aGlzLl9pbnNlcnRCb3hDZWxsLCB0aGlzLmJveFVpZCsrKSwgdGhpcy5ib3hLZXlzLnB1c2godCksIHRoaXMuYmJveGVzLnB1c2goZSksIHRoaXMuYmJveGVzLnB1c2goaSksIHRoaXMuYmJveGVzLnB1c2gobyksIHRoaXMuYmJveGVzLnB1c2gocik7XG4gICAgfSwgWXQucHJvdG90eXBlLmluc2VydENpcmNsZSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICB0aGlzLl9mb3JFYWNoQ2VsbChlIC0gbywgaSAtIG8sIGUgKyBvLCBpICsgbywgdGhpcy5faW5zZXJ0Q2lyY2xlQ2VsbCwgdGhpcy5jaXJjbGVVaWQrKyksIHRoaXMuY2lyY2xlS2V5cy5wdXNoKHQpLCB0aGlzLmNpcmNsZXMucHVzaChlKSwgdGhpcy5jaXJjbGVzLnB1c2goaSksIHRoaXMuY2lyY2xlcy5wdXNoKG8pO1xuICAgIH0sIFl0LnByb3RvdHlwZS5faW5zZXJ0Qm94Q2VsbCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB0aGlzLmJveENlbGxzW3JdLnB1c2goYSk7XG4gICAgfSwgWXQucHJvdG90eXBlLl9pbnNlcnRDaXJjbGVDZWxsID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHRoaXMuY2lyY2xlQ2VsbHNbcl0ucHVzaChhKTtcbiAgICB9LCBZdC5wcm90b3R5cGUuX3F1ZXJ5ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIGlmIChpIDwgMCB8fCB0ID4gdGhpcy53aWR0aCB8fCBvIDwgMCB8fCBlID4gdGhpcy5oZWlnaHQpIHJldHVybiAhciAmJiBbXTtcbiAgICAgIHZhciBuID0gW107XG5cbiAgICAgIGlmICh0IDw9IDAgJiYgZSA8PSAwICYmIHRoaXMud2lkdGggPD0gaSAmJiB0aGlzLmhlaWdodCA8PSBvKSB7XG4gICAgICAgIGlmIChyKSByZXR1cm4gITA7XG5cbiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0aGlzLmJveEtleXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICBuLnB1c2goe1xuICAgICAgICAgICAga2V5OiB0aGlzLmJveEtleXNbc10sXG4gICAgICAgICAgICB4MTogdGhpcy5iYm94ZXNbNCAqIHNdLFxuICAgICAgICAgICAgeTE6IHRoaXMuYmJveGVzWzQgKiBzICsgMV0sXG4gICAgICAgICAgICB4MjogdGhpcy5iYm94ZXNbNCAqIHMgKyAyXSxcbiAgICAgICAgICAgIHkyOiB0aGlzLmJib3hlc1s0ICogcyArIDNdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgIHZhciBjID0gdGhpcy5jaXJjbGVzWzMgKiBsXSxcbiAgICAgICAgICAgICAgdSA9IHRoaXMuY2lyY2xlc1szICogbCArIDFdLFxuICAgICAgICAgICAgICBoID0gdGhpcy5jaXJjbGVzWzMgKiBsICsgMl07XG4gICAgICAgICAgbi5wdXNoKHtcbiAgICAgICAgICAgIGtleTogdGhpcy5jaXJjbGVLZXlzW2xdLFxuICAgICAgICAgICAgeDE6IGMgLSBoLFxuICAgICAgICAgICAgeTE6IHUgLSBoLFxuICAgICAgICAgICAgeDI6IGMgKyBoLFxuICAgICAgICAgICAgeTI6IHUgKyBoXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYSA/IG4uZmlsdGVyKGEpIDogbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2ZvckVhY2hDZWxsKHQsIGUsIGksIG8sIHRoaXMuX3F1ZXJ5Q2VsbCwgbiwge1xuICAgICAgICBoaXRUZXN0OiByLFxuICAgICAgICBzZWVuVWlkczoge1xuICAgICAgICAgIGJveDoge30sXG4gICAgICAgICAgY2lyY2xlOiB7fVxuICAgICAgICB9XG4gICAgICB9LCBhKSwgciA/IG4ubGVuZ3RoID4gMCA6IG47XG4gICAgfSwgWXQucHJvdG90eXBlLl9xdWVyeUNpcmNsZSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSA9IHQgLSBpLFxuICAgICAgICAgIG4gPSB0ICsgaSxcbiAgICAgICAgICBzID0gZSAtIGksXG4gICAgICAgICAgbCA9IGUgKyBpO1xuICAgICAgaWYgKG4gPCAwIHx8IGEgPiB0aGlzLndpZHRoIHx8IGwgPCAwIHx8IHMgPiB0aGlzLmhlaWdodCkgcmV0dXJuICFvICYmIFtdO1xuICAgICAgdmFyIGMgPSBbXTtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JFYWNoQ2VsbChhLCBzLCBuLCBsLCB0aGlzLl9xdWVyeUNlbGxDaXJjbGUsIGMsIHtcbiAgICAgICAgaGl0VGVzdDogbyxcbiAgICAgICAgY2lyY2xlOiB7XG4gICAgICAgICAgeDogdCxcbiAgICAgICAgICB5OiBlLFxuICAgICAgICAgIHJhZGl1czogaVxuICAgICAgICB9LFxuICAgICAgICBzZWVuVWlkczoge1xuICAgICAgICAgIGJveDoge30sXG4gICAgICAgICAgY2lyY2xlOiB7fVxuICAgICAgICB9XG4gICAgICB9LCByKSwgbyA/IGMubGVuZ3RoID4gMCA6IGM7XG4gICAgfSwgWXQucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9xdWVyeSh0LCBlLCBpLCBvLCAhMSwgcik7XG4gICAgfSwgWXQucHJvdG90eXBlLmhpdFRlc3QgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5KHQsIGUsIGksIG8sICEwLCByKTtcbiAgICB9LCBZdC5wcm90b3R5cGUuaGl0VGVzdENpcmNsZSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcXVlcnlDaXJjbGUodCwgZSwgaSwgITAsIG8pO1xuICAgIH0sIFl0LnByb3RvdHlwZS5fcXVlcnlDZWxsID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIHZhciBsID0gbi5zZWVuVWlkcyxcbiAgICAgICAgICBjID0gdGhpcy5ib3hDZWxsc1tyXTtcbiAgICAgIGlmIChudWxsICE9PSBjKSBmb3IgKHZhciB1ID0gdGhpcy5iYm94ZXMsIGggPSAwLCBwID0gYzsgaCA8IHAubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgdmFyIGQgPSBwW2hdO1xuXG4gICAgICAgIGlmICghbC5ib3hbZF0pIHtcbiAgICAgICAgICBsLmJveFtkXSA9ICEwO1xuXG4gICAgICAgICAgdmFyIF8gPSA0ICogZDtcblxuICAgICAgICAgIGlmICh0IDw9IHVbXyArIDJdICYmIGUgPD0gdVtfICsgM10gJiYgaSA+PSB1W18gKyAwXSAmJiBvID49IHVbXyArIDFdICYmICghcyB8fCBzKHRoaXMuYm94S2V5c1tkXSkpKSB7XG4gICAgICAgICAgICBpZiAobi5oaXRUZXN0KSByZXR1cm4gYS5wdXNoKCEwKSwgITA7XG4gICAgICAgICAgICBhLnB1c2goe1xuICAgICAgICAgICAgICBrZXk6IHRoaXMuYm94S2V5c1tkXSxcbiAgICAgICAgICAgICAgeDE6IHVbX10sXG4gICAgICAgICAgICAgIHkxOiB1W18gKyAxXSxcbiAgICAgICAgICAgICAgeDI6IHVbXyArIDJdLFxuICAgICAgICAgICAgICB5MjogdVtfICsgM11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGYgPSB0aGlzLmNpcmNsZUNlbGxzW3JdO1xuICAgICAgaWYgKG51bGwgIT09IGYpIGZvciAodmFyIG0gPSB0aGlzLmNpcmNsZXMsIGcgPSAwLCB2ID0gZjsgZyA8IHYubGVuZ3RoOyBnICs9IDEpIHtcbiAgICAgICAgdmFyIHkgPSB2W2ddO1xuXG4gICAgICAgIGlmICghbC5jaXJjbGVbeV0pIHtcbiAgICAgICAgICBsLmNpcmNsZVt5XSA9ICEwO1xuICAgICAgICAgIHZhciB4ID0gMyAqIHk7XG5cbiAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUobVt4XSwgbVt4ICsgMV0sIG1beCArIDJdLCB0LCBlLCBpLCBvKSAmJiAoIXMgfHwgcyh0aGlzLmNpcmNsZUtleXNbeV0pKSkge1xuICAgICAgICAgICAgaWYgKG4uaGl0VGVzdCkgcmV0dXJuIGEucHVzaCghMCksICEwO1xuICAgICAgICAgICAgdmFyIGIgPSBtW3hdLFxuICAgICAgICAgICAgICAgIHcgPSBtW3ggKyAxXSxcbiAgICAgICAgICAgICAgICBUID0gbVt4ICsgMl07XG4gICAgICAgICAgICBhLnB1c2goe1xuICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1t5XSxcbiAgICAgICAgICAgICAgeDE6IGIgLSBULFxuICAgICAgICAgICAgICB5MTogdyAtIFQsXG4gICAgICAgICAgICAgIHgyOiBiICsgVCxcbiAgICAgICAgICAgICAgeTI6IHcgKyBUXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBZdC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbENpcmNsZSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuLCBzKSB7XG4gICAgICB2YXIgbCA9IG4uY2lyY2xlLFxuICAgICAgICAgIGMgPSBuLnNlZW5VaWRzLFxuICAgICAgICAgIHUgPSB0aGlzLmJveENlbGxzW3JdO1xuICAgICAgaWYgKG51bGwgIT09IHUpIGZvciAodmFyIGggPSB0aGlzLmJib3hlcywgcCA9IDAsIGQgPSB1OyBwIDwgZC5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgICB2YXIgXyA9IGRbcF07XG5cbiAgICAgICAgaWYgKCFjLmJveFtfXSkge1xuICAgICAgICAgIGMuYm94W19dID0gITA7XG4gICAgICAgICAgdmFyIGYgPSA0ICogXztcbiAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUobC54LCBsLnksIGwucmFkaXVzLCBoW2YgKyAwXSwgaFtmICsgMV0sIGhbZiArIDJdLCBoW2YgKyAzXSkgJiYgKCFzIHx8IHModGhpcy5ib3hLZXlzW19dKSkpIHJldHVybiBhLnB1c2goITApLCAhMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG0gPSB0aGlzLmNpcmNsZUNlbGxzW3JdO1xuICAgICAgaWYgKG51bGwgIT09IG0pIGZvciAodmFyIGcgPSB0aGlzLmNpcmNsZXMsIHYgPSAwLCB5ID0gbTsgdiA8IHkubGVuZ3RoOyB2ICs9IDEpIHtcbiAgICAgICAgdmFyIHggPSB5W3ZdO1xuXG4gICAgICAgIGlmICghYy5jaXJjbGVbeF0pIHtcbiAgICAgICAgICBjLmNpcmNsZVt4XSA9ICEwO1xuICAgICAgICAgIHZhciBiID0gMyAqIHg7XG4gICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZXNDb2xsaWRlKGdbYl0sIGdbYiArIDFdLCBnW2IgKyAyXSwgbC54LCBsLnksIGwucmFkaXVzKSAmJiAoIXMgfHwgcyh0aGlzLmNpcmNsZUtleXNbeF0pKSkgcmV0dXJuIGEucHVzaCghMCksICEwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgWXQucHJvdG90eXBlLl9mb3JFYWNoQ2VsbCA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuLCBzKSB7XG4gICAgICBmb3IgKHZhciBsID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh0KSwgYyA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoZSksIHUgPSB0aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKGkpLCBoID0gdGhpcy5fY29udmVydFRvWUNlbGxDb29yZChvKSwgcCA9IGw7IHAgPD0gdTsgcCsrKSB7XG4gICAgICAgIGZvciAodmFyIGQgPSBjOyBkIDw9IGg7IGQrKykge1xuICAgICAgICAgIGlmIChyLmNhbGwodGhpcywgdCwgZSwgaSwgbywgdGhpcy54Q2VsbENvdW50ICogZCArIHAsIGEsIG4sIHMpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBZdC5wcm90b3R5cGUuX2NvbnZlcnRUb1hDZWxsQ29vcmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMueENlbGxDb3VudCAtIDEsIE1hdGguZmxvb3IodCAqIHRoaXMueFNjYWxlKSkpO1xuICAgIH0sIFl0LnByb3RvdHlwZS5fY29udmVydFRvWUNlbGxDb29yZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy55Q2VsbENvdW50IC0gMSwgTWF0aC5mbG9vcih0ICogdGhpcy55U2NhbGUpKSk7XG4gICAgfSwgWXQucHJvdG90eXBlLl9jaXJjbGVzQ29sbGlkZSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IG8gLSB0LFxuICAgICAgICAgIHMgPSByIC0gZSxcbiAgICAgICAgICBsID0gaSArIGE7XG4gICAgICByZXR1cm4gbCAqIGwgPiBuICogbiArIHMgKiBzO1xuICAgIH0sIFl0LnByb3RvdHlwZS5fY2lyY2xlQW5kUmVjdENvbGxpZGUgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdmFyIHMgPSAoYSAtIG8pIC8gMixcbiAgICAgICAgICBsID0gTWF0aC5hYnModCAtIChvICsgcykpO1xuICAgICAgaWYgKGwgPiBzICsgaSkgcmV0dXJuICExO1xuICAgICAgdmFyIGMgPSAobiAtIHIpIC8gMixcbiAgICAgICAgICB1ID0gTWF0aC5hYnMoZSAtIChyICsgYykpO1xuICAgICAgaWYgKHUgPiBjICsgaSkgcmV0dXJuICExO1xuICAgICAgaWYgKGwgPD0gcyB8fCB1IDw9IGMpIHJldHVybiAhMDtcbiAgICAgIHZhciBoID0gbCAtIHMsXG4gICAgICAgICAgcCA9IHUgLSBjO1xuICAgICAgcmV0dXJuIGggKiBoICsgcCAqIHAgPD0gaSAqIGk7XG4gICAgfTtcbiAgICB2YXIgbGUgPSBuZXcgRmxvYXQzMkFycmF5KFstMSAvIDAsIC0xIC8gMCwgMCwgLTEgLyAwLCAtMSAvIDAsIDAsIC0xIC8gMCwgLTEgLyAwLCAwLCAtMSAvIDAsIC0xIC8gMCwgMF0pO1xuXG4gICAgZnVuY3Rpb24gY2UodCwgZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0OyBpKyspIHtcbiAgICAgICAgdmFyIG8gPSBlLmxlbmd0aDtcbiAgICAgICAgZS5yZXNpemUobyArIDQpLCBlLmZsb2F0MzIuc2V0KGxlLCAzICogbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWUodCwgZSwgaSkge1xuICAgICAgdmFyIG8gPSBlWzBdLFxuICAgICAgICAgIHIgPSBlWzFdO1xuICAgICAgcmV0dXJuIHRbMF0gPSBpWzBdICogbyArIGlbNF0gKiByICsgaVsxMl0sIHRbMV0gPSBpWzFdICogbyArIGlbNV0gKiByICsgaVsxM10sIHRbM10gPSBpWzNdICogbyArIGlbN10gKiByICsgaVsxNV0sIHQ7XG4gICAgfVxuXG4gICAgdmFyIGhlID0gZnVuY3Rpb24gaGUodCwgZSwgaSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0gbmV3IFl0KHQud2lkdGggKyAyMDAsIHQuaGVpZ2h0ICsgMjAwLCAyNSkpLCB2b2lkIDAgPT09IGkgJiYgKGkgPSBuZXcgWXQodC53aWR0aCArIDIwMCwgdC5oZWlnaHQgKyAyMDAsIDI1KSksIHRoaXMudHJhbnNmb3JtID0gdCwgdGhpcy5ncmlkID0gZSwgdGhpcy5pZ25vcmVkR3JpZCA9IGksIHRoaXMucGl0Y2hmYWN0b3IgPSBNYXRoLmNvcyh0Ll9waXRjaCkgKiB0LmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsIHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSA9IHQud2lkdGggKyAxMDAsIHRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnkgPSB0LmhlaWdodCArIDEwMCwgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSA9IHQud2lkdGggKyAyMDAsIHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5ID0gdC5oZWlnaHQgKyAyMDA7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBlKGUsIGksIG8pIHtcbiAgICAgIHJldHVybiBpICogKHQuRVhURU5UIC8gKGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCBvIC0gZS50aWxlSUQub3ZlcnNjYWxlZFopKSk7XG4gICAgfVxuXG4gICAgaGUucHJvdG90eXBlLnBsYWNlQ29sbGlzaW9uQm94ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIHZhciBhID0gdGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhvLCB0LmFuY2hvclBvaW50WCwgdC5hbmNob3JQb2ludFkpLFxuICAgICAgICAgIG4gPSBpICogYS5wZXJzcGVjdGl2ZVJhdGlvLFxuICAgICAgICAgIHMgPSB0LngxICogbiArIGEucG9pbnQueCxcbiAgICAgICAgICBsID0gdC55MSAqIG4gKyBhLnBvaW50LnksXG4gICAgICAgICAgYyA9IHQueDIgKiBuICsgYS5wb2ludC54LFxuICAgICAgICAgIHUgPSB0LnkyICogbiArIGEucG9pbnQueTtcbiAgICAgIHJldHVybiAhdGhpcy5pc0luc2lkZUdyaWQocywgbCwgYywgdSkgfHwgIWUgJiYgdGhpcy5ncmlkLmhpdFRlc3QocywgbCwgYywgdSwgcikgPyB7XG4gICAgICAgIGJveDogW10sXG4gICAgICAgIG9mZnNjcmVlbjogITFcbiAgICAgIH0gOiB7XG4gICAgICAgIGJveDogW3MsIGwsIGMsIHVdLFxuICAgICAgICBvZmZzY3JlZW46IHRoaXMuaXNPZmZzY3JlZW4ocywgbCwgYywgdSlcbiAgICAgIH07XG4gICAgfSwgaGUucHJvdG90eXBlLnBsYWNlQ29sbGlzaW9uQ2lyY2xlcyA9IGZ1bmN0aW9uIChlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoLCBwLCBkKSB7XG4gICAgICB2YXIgXyA9IFtdLFxuICAgICAgICAgIGYgPSBuZXcgdC5Qb2ludChpLmFuY2hvclgsIGkuYW5jaG9yWSksXG4gICAgICAgICAgbSA9ICR0KGYsIG4pLFxuICAgICAgICAgIGcgPSB0ZSh0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLCBtLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSksXG4gICAgICAgICAgdiA9ICh1ID8gYSAvIGcgOiBhICogZykgLyB0Lk9ORV9FTSxcbiAgICAgICAgICB5ID0gJHQoZiwgcykucG9pbnQsXG4gICAgICAgICAgeCA9IG9lKHYsIHIsIGkubGluZU9mZnNldFggKiB2LCBpLmxpbmVPZmZzZXRZICogdiwgITEsIHksIGYsIGksIG8sIHMsIHt9KSxcbiAgICAgICAgICBiID0gITEsXG4gICAgICAgICAgdyA9ICExLFxuICAgICAgICAgIFQgPSAhMDtcblxuICAgICAgaWYgKHgpIHtcbiAgICAgICAgZm9yICh2YXIgRSA9IC41ICogcCAqIGcgKyBkLCBJID0gbmV3IHQuUG9pbnQoLTEwMCwgLTEwMCksIFAgPSBuZXcgdC5Qb2ludCh0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnksIHRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnkpLCBTID0gbmV3IEt0KCksIEMgPSB4LmZpcnN0LCB6ID0geC5sYXN0LCBEID0gW10sIEEgPSBDLnBhdGgubGVuZ3RoIC0gMTsgQSA+PSAxOyBBLS0pIHtcbiAgICAgICAgICBELnB1c2goQy5wYXRoW0FdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIE0gPSAxOyBNIDwgei5wYXRoLmxlbmd0aDsgTSsrKSB7XG4gICAgICAgICAgRC5wdXNoKHoucGF0aFtNXSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgTCA9IDIuNSAqIEU7XG5cbiAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICB2YXIgUiA9IEQubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gJHQodCwgbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRCA9IFIuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhIDw9IDA7XG4gICAgICAgICAgfSkgPyBbXSA6IFIubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5wb2ludDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBrID0gW107XG5cbiAgICAgICAgaWYgKEQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAodmFyIEIgPSBEWzBdLmNsb25lKCksIE8gPSBEWzBdLmNsb25lKCksIEYgPSAxOyBGIDwgRC5sZW5ndGg7IEYrKykge1xuICAgICAgICAgICAgQi54ID0gTWF0aC5taW4oQi54LCBEW0ZdLngpLCBCLnkgPSBNYXRoLm1pbihCLnksIERbRl0ueSksIE8ueCA9IE1hdGgubWF4KE8ueCwgRFtGXS54KSwgTy55ID0gTWF0aC5tYXgoTy55LCBEW0ZdLnkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGsgPSBCLnggPj0gSS54ICYmIE8ueCA8PSBQLnggJiYgQi55ID49IEkueSAmJiBPLnkgPD0gUC55ID8gW0RdIDogTy54IDwgSS54IHx8IEIueCA+IFAueCB8fCBPLnkgPCBJLnkgfHwgQi55ID4gUC55ID8gW10gOiB0LmNsaXBMaW5lKFtEXSwgSS54LCBJLnksIFAueCwgUC55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIFUgPSAwLCBOID0gazsgVSA8IE4ubGVuZ3RoOyBVICs9IDEpIHtcbiAgICAgICAgICB2YXIgWjtcbiAgICAgICAgICBTLnJlc2V0KE5bVV0sIC4yNSAqIEUpLCBaID0gUy5sZW5ndGggPD0gLjUgKiBFID8gMSA6IE1hdGguY2VpbChTLnBhZGRlZExlbmd0aCAvIEwpICsgMTtcblxuICAgICAgICAgIGZvciAodmFyIHEgPSAwOyBxIDwgWjsgcSsrKSB7XG4gICAgICAgICAgICB2YXIgaiA9IHEgLyBNYXRoLm1heChaIC0gMSwgMSksXG4gICAgICAgICAgICAgICAgViA9IFMubGVycChqKSxcbiAgICAgICAgICAgICAgICBHID0gVi54ICsgMTAwLFxuICAgICAgICAgICAgICAgIFcgPSBWLnkgKyAxMDA7XG5cbiAgICAgICAgICAgIF8ucHVzaChHLCBXLCBFLCAwKTtcblxuICAgICAgICAgICAgdmFyIFggPSBHIC0gRSxcbiAgICAgICAgICAgICAgICBIID0gVyAtIEUsXG4gICAgICAgICAgICAgICAgSyA9IEcgKyBFLFxuICAgICAgICAgICAgICAgIFkgPSBXICsgRTtcbiAgICAgICAgICAgIGlmIChUID0gVCAmJiB0aGlzLmlzT2Zmc2NyZWVuKFgsIEgsIEssIFkpLCB3ID0gdyB8fCB0aGlzLmlzSW5zaWRlR3JpZChYLCBILCBLLCBZKSwgIWUgJiYgdGhpcy5ncmlkLmhpdFRlc3RDaXJjbGUoRywgVywgRSwgaCkgJiYgKGIgPSAhMCwgIWMpKSByZXR1cm4ge1xuICAgICAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgICAgICAgb2Zmc2NyZWVuOiAhMSxcbiAgICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWQ6IGJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNpcmNsZXM6ICFjICYmIGIgfHwgIXcgPyBbXSA6IF8sXG4gICAgICAgIG9mZnNjcmVlbjogVCxcbiAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWQ6IGJcbiAgICAgIH07XG4gICAgfSwgaGUucHJvdG90eXBlLnF1ZXJ5UmVuZGVyZWRTeW1ib2xzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICgwID09PSBlLmxlbmd0aCB8fCAwID09PSB0aGlzLmdyaWQua2V5c0xlbmd0aCgpICYmIDAgPT09IHRoaXMuaWdub3JlZEdyaWQua2V5c0xlbmd0aCgpKSByZXR1cm4ge307XG5cbiAgICAgIGZvciAodmFyIGkgPSBbXSwgbyA9IDEgLyAwLCByID0gMSAvIDAsIGEgPSAtMSAvIDAsIG4gPSAtMSAvIDAsIHMgPSAwLCBsID0gZTsgcyA8IGwubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSBsW3NdLFxuICAgICAgICAgICAgdSA9IG5ldyB0LlBvaW50KGMueCArIDEwMCwgYy55ICsgMTAwKTtcbiAgICAgICAgbyA9IE1hdGgubWluKG8sIHUueCksIHIgPSBNYXRoLm1pbihyLCB1LnkpLCBhID0gTWF0aC5tYXgoYSwgdS54KSwgbiA9IE1hdGgubWF4KG4sIHUueSksIGkucHVzaCh1KTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaCA9IHt9LCBwID0ge30sIGQgPSAwLCBfID0gdGhpcy5ncmlkLnF1ZXJ5KG8sIHIsIGEsIG4pLmNvbmNhdCh0aGlzLmlnbm9yZWRHcmlkLnF1ZXJ5KG8sIHIsIGEsIG4pKTsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgdmFyIGYgPSBfW2RdLFxuICAgICAgICAgICAgbSA9IGYua2V5O1xuXG4gICAgICAgIGlmICh2b2lkIDAgPT09IGhbbS5idWNrZXRJbnN0YW5jZUlkXSAmJiAoaFttLmJ1Y2tldEluc3RhbmNlSWRdID0ge30pLCAhaFttLmJ1Y2tldEluc3RhbmNlSWRdW20uZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgIHZhciBnID0gW25ldyB0LlBvaW50KGYueDEsIGYueTEpLCBuZXcgdC5Qb2ludChmLngyLCBmLnkxKSwgbmV3IHQuUG9pbnQoZi54MiwgZi55MiksIG5ldyB0LlBvaW50KGYueDEsIGYueTIpXTtcbiAgICAgICAgICB0LnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihpLCBnKSAmJiAoaFttLmJ1Y2tldEluc3RhbmNlSWRdW20uZmVhdHVyZUluZGV4XSA9ICEwLCB2b2lkIDAgPT09IHBbbS5idWNrZXRJbnN0YW5jZUlkXSAmJiAocFttLmJ1Y2tldEluc3RhbmNlSWRdID0gW10pLCBwW20uYnVja2V0SW5zdGFuY2VJZF0ucHVzaChtLmZlYXR1cmVJbmRleCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwO1xuICAgIH0sIGhlLnByb3RvdHlwZS5pbnNlcnRDb2xsaXNpb25Cb3ggPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgKGUgPyB0aGlzLmlnbm9yZWRHcmlkIDogdGhpcy5ncmlkKS5pbnNlcnQoe1xuICAgICAgICBidWNrZXRJbnN0YW5jZUlkOiBpLFxuICAgICAgICBmZWF0dXJlSW5kZXg6IG8sXG4gICAgICAgIGNvbGxpc2lvbkdyb3VwSUQ6IHJcbiAgICAgIH0sIHRbMF0sIHRbMV0sIHRbMl0sIHRbM10pO1xuICAgIH0sIGhlLnByb3RvdHlwZS5pbnNlcnRDb2xsaXNpb25DaXJjbGVzID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIpIHtcbiAgICAgIGZvciAodmFyIGEgPSBlID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZCwgbiA9IHtcbiAgICAgICAgYnVja2V0SW5zdGFuY2VJZDogaSxcbiAgICAgICAgZmVhdHVyZUluZGV4OiBvLFxuICAgICAgICBjb2xsaXNpb25Hcm91cElEOiByXG4gICAgICB9LCBzID0gMDsgcyA8IHQubGVuZ3RoOyBzICs9IDQpIHtcbiAgICAgICAgYS5pbnNlcnRDaXJjbGUobiwgdFtzXSwgdFtzICsgMV0sIHRbcyArIDJdKTtcbiAgICAgIH1cbiAgICB9LCBoZS5wcm90b3R5cGUucHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8gPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBbaSwgbywgMCwgMV07XG4gICAgICByZXR1cm4gdWUociwgciwgZSksIHtcbiAgICAgICAgcG9pbnQ6IG5ldyB0LlBvaW50KChyWzBdIC8gclszXSArIDEpIC8gMiAqIHRoaXMudHJhbnNmb3JtLndpZHRoICsgMTAwLCAoLXJbMV0gLyByWzNdICsgMSkgLyAyICogdGhpcy50cmFuc2Zvcm0uaGVpZ2h0ICsgMTAwKSxcbiAgICAgICAgcGVyc3BlY3RpdmVSYXRpbzogLjUgKyB0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gclszXSAqIC41XG4gICAgICB9O1xuICAgIH0sIGhlLnByb3RvdHlwZS5pc09mZnNjcmVlbiA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICByZXR1cm4gaSA8IDEwMCB8fCB0ID49IHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSB8fCBvIDwgMTAwIHx8IGUgPiB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5O1xuICAgIH0sIGhlLnByb3RvdHlwZS5pc0luc2lkZUdyaWQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgcmV0dXJuIGkgPj0gMCAmJiB0IDwgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSAmJiBvID49IDAgJiYgZSA8IHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5O1xuICAgIH0sIGhlLnByb3RvdHlwZS5nZXRWaWV3cG9ydE1hdHJpeCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gdC5pZGVudGl0eShbXSk7XG4gICAgICByZXR1cm4gdC50cmFuc2xhdGUoZSwgZSwgWy0xMDAsIC0xMDAsIDBdKSwgZTtcbiAgICB9O1xuXG4gICAgdmFyIGRlID0gZnVuY3Rpb24gZGUodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5vcGFjaXR5ID0gdCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQub3BhY2l0eSArICh0LnBsYWNlZCA/IGUgOiAtZSkpKSA6IG8gJiYgaSA/IDEgOiAwLCB0aGlzLnBsYWNlZCA9IGk7XG4gICAgfTtcblxuICAgIGRlLnByb3RvdHlwZS5pc0hpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwID09PSB0aGlzLm9wYWNpdHkgJiYgIXRoaXMucGxhY2VkO1xuICAgIH07XG5cbiAgICB2YXIgX2UgPSBmdW5jdGlvbiBfZSh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB0aGlzLnRleHQgPSBuZXcgZGUodCA/IHQudGV4dCA6IG51bGwsIGUsIGksIHIpLCB0aGlzLmljb24gPSBuZXcgZGUodCA/IHQuaWNvbiA6IG51bGwsIGUsIG8sIHIpO1xuICAgIH07XG5cbiAgICBfZS5wcm90b3R5cGUuaXNIaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0LmlzSGlkZGVuKCkgJiYgdGhpcy5pY29uLmlzSGlkZGVuKCk7XG4gICAgfTtcblxuICAgIHZhciBmZSA9IGZ1bmN0aW9uIGZlKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMudGV4dCA9IHQsIHRoaXMuaWNvbiA9IGUsIHRoaXMuc2tpcEZhZGUgPSBpO1xuICAgIH0sXG4gICAgICAgIG1lID0gZnVuY3Rpb24gbWUoKSB7XG4gICAgICB0aGlzLmludlByb2pNYXRyaXggPSB0LmNyZWF0ZSgpLCB0aGlzLnZpZXdwb3J0TWF0cml4ID0gdC5jcmVhdGUoKSwgdGhpcy5jaXJjbGVzID0gW107XG4gICAgfSxcbiAgICAgICAgZ2UgPSBmdW5jdGlvbiBnZSh0LCBlLCBpLCBvLCByKSB7XG4gICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSB0LCB0aGlzLmZlYXR1cmVJbmRleCA9IGUsIHRoaXMuc291cmNlTGF5ZXJJbmRleCA9IGksIHRoaXMuYnVja2V0SW5kZXggPSBvLCB0aGlzLnRpbGVJRCA9IHI7XG4gICAgfSxcbiAgICAgICAgdmUgPSBmdW5jdGlvbiB2ZSh0KSB7XG4gICAgICB0aGlzLmNyb3NzU291cmNlQ29sbGlzaW9ucyA9IHQsIHRoaXMubWF4R3JvdXBJRCA9IDAsIHRoaXMuY29sbGlzaW9uR3JvdXBzID0ge307XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHllKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gdC5nZXRBbmNob3JBbGlnbm1lbnQoZSksXG4gICAgICAgICAgcyA9IC0obi5ob3Jpem9udGFsQWxpZ24gLSAuNSkgKiBpLFxuICAgICAgICAgIGwgPSAtKG4udmVydGljYWxBbGlnbiAtIC41KSAqIG8sXG4gICAgICAgICAgYyA9IHQuZXZhbHVhdGVWYXJpYWJsZU9mZnNldChlLCByKTtcbiAgICAgIHJldHVybiBuZXcgdC5Qb2ludChzICsgY1swXSAqIGEsIGwgKyBjWzFdICogYSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24geGUoZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdmFyIHMgPSBlLngxLFxuICAgICAgICAgIGwgPSBlLngyLFxuICAgICAgICAgIGMgPSBlLnkxLFxuICAgICAgICAgIHUgPSBlLnkyLFxuICAgICAgICAgIGggPSBlLmFuY2hvclBvaW50WCxcbiAgICAgICAgICBwID0gZS5hbmNob3JQb2ludFksXG4gICAgICAgICAgZCA9IG5ldyB0LlBvaW50KGksIG8pO1xuICAgICAgcmV0dXJuIHIgJiYgZC5fcm90YXRlKGEgPyBuIDogLW4pLCB7XG4gICAgICAgIHgxOiBzICsgZC54LFxuICAgICAgICB5MTogYyArIGQueSxcbiAgICAgICAgeDI6IGwgKyBkLngsXG4gICAgICAgIHkyOiB1ICsgZC55LFxuICAgICAgICBhbmNob3JQb2ludFg6IGgsXG4gICAgICAgIGFuY2hvclBvaW50WTogcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2ZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLmNyb3NzU291cmNlQ29sbGlzaW9ucykgcmV0dXJuIHtcbiAgICAgICAgSUQ6IDAsXG4gICAgICAgIHByZWRpY2F0ZTogbnVsbFxuICAgICAgfTtcblxuICAgICAgaWYgKCF0aGlzLmNvbGxpc2lvbkdyb3Vwc1t0XSkge1xuICAgICAgICB2YXIgZSA9ICsrdGhpcy5tYXhHcm91cElEO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3Vwc1t0XSA9IHtcbiAgICAgICAgICBJRDogZSxcbiAgICAgICAgICBwcmVkaWNhdGU6IGZ1bmN0aW9uIHByZWRpY2F0ZSh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5jb2xsaXNpb25Hcm91cElEID09PSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29sbGlzaW9uR3JvdXBzW3RdO1xuICAgIH07XG5cbiAgICB2YXIgYmUgPSBmdW5jdGlvbiBiZSh0LCBlLCBpLCBvKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSA9IHQuY2xvbmUoKSwgdGhpcy5jb2xsaXNpb25JbmRleCA9IG5ldyBoZSh0aGlzLnRyYW5zZm9ybSksIHRoaXMucGxhY2VtZW50cyA9IHt9LCB0aGlzLm9wYWNpdGllcyA9IHt9LCB0aGlzLnZhcmlhYmxlT2Zmc2V0cyA9IHt9LCB0aGlzLnN0YWxlID0gITEsIHRoaXMuY29tbWl0VGltZSA9IDAsIHRoaXMuZmFkZUR1cmF0aW9uID0gZSwgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YSA9IHt9LCB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IG5ldyB2ZShpKSwgdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXMgPSB7fSwgdGhpcy5wcmV2UGxhY2VtZW50ID0gbywgbyAmJiAoby5wcmV2UGxhY2VtZW50ID0gdm9pZCAwKSwgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnMgPSB7fTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gd2UodCwgZSwgaSwgbywgcikge1xuICAgICAgdC5lbXBsYWNlQmFjayhlID8gMSA6IDAsIGkgPyAxIDogMCwgbyB8fCAwLCByIHx8IDApLCB0LmVtcGxhY2VCYWNrKGUgPyAxIDogMCwgaSA/IDEgOiAwLCBvIHx8IDAsIHIgfHwgMCksIHQuZW1wbGFjZUJhY2soZSA/IDEgOiAwLCBpID8gMSA6IDAsIG8gfHwgMCwgciB8fCAwKSwgdC5lbXBsYWNlQmFjayhlID8gMSA6IDAsIGkgPyAxIDogMCwgbyB8fCAwLCByIHx8IDApO1xuICAgIH1cblxuICAgIGJlLnByb3RvdHlwZS5nZXRCdWNrZXRQYXJ0cyA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSA9IG8uZ2V0QnVja2V0KGkpLFxuICAgICAgICAgIG4gPSBvLmxhdGVzdEZlYXR1cmVJbmRleDtcblxuICAgICAgaWYgKGEgJiYgbiAmJiBpLmlkID09PSBhLmxheWVySWRzWzBdKSB7XG4gICAgICAgIHZhciBzID0gby5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgIGwgPSBhLmxheWVyc1swXS5sYXlvdXQsXG4gICAgICAgICAgICBjID0gTWF0aC5wb3coMiwgdGhpcy50cmFuc2Zvcm0uem9vbSAtIG8udGlsZUlELm92ZXJzY2FsZWRaKSxcbiAgICAgICAgICAgIHUgPSBvLnRpbGVTaXplIC8gdC5FWFRFTlQsXG4gICAgICAgICAgICBoID0gdGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KG8udGlsZUlELnRvVW53cmFwcGVkKCkpLFxuICAgICAgICAgICAgcCA9IFwibWFwXCIgPT09IGwuZ2V0KFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIiksXG4gICAgICAgICAgICBkID0gXCJtYXBcIiA9PT0gbC5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSxcbiAgICAgICAgICAgIF8gPSBwZShvLCAxLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIGYgPSBKdChoLCBwLCBkLCB0aGlzLnRyYW5zZm9ybSwgXyksXG4gICAgICAgICAgICBtID0gbnVsbDtcblxuICAgICAgICBpZiAocCkge1xuICAgICAgICAgIHZhciBnID0gUXQoaCwgcCwgZCwgdGhpcy50cmFuc2Zvcm0sIF8pO1xuICAgICAgICAgIG0gPSB0Lm11bHRpcGx5KFtdLCB0aGlzLnRyYW5zZm9ybS5sYWJlbFBsYW5lTWF0cml4LCBnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmV0YWluZWRRdWVyeURhdGFbYS5idWNrZXRJbnN0YW5jZUlkXSA9IG5ldyBnZShhLmJ1Y2tldEluc3RhbmNlSWQsIG4sIGEuc291cmNlTGF5ZXJJbmRleCwgYS5pbmRleCwgby50aWxlSUQpO1xuICAgICAgICB2YXIgdiA9IHtcbiAgICAgICAgICBidWNrZXQ6IGEsXG4gICAgICAgICAgbGF5b3V0OiBsLFxuICAgICAgICAgIHBvc01hdHJpeDogaCxcbiAgICAgICAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeDogZixcbiAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4OiBtLFxuICAgICAgICAgIHNjYWxlOiBjLFxuICAgICAgICAgIHRleHRQaXhlbFJhdGlvOiB1LFxuICAgICAgICAgIGhvbGRpbmdGb3JGYWRlOiBvLmhvbGRpbmdGb3JGYWRlKCksXG4gICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHMsXG4gICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemU6IHQuZXZhbHVhdGVTaXplRm9yWm9vbShhLnRleHRTaXplRGF0YSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgY29sbGlzaW9uR3JvdXA6IHRoaXMuY29sbGlzaW9uR3JvdXBzLmdldChhLnNvdXJjZUlEKVxuICAgICAgICB9O1xuICAgICAgICBpZiAocikgZm9yICh2YXIgeSA9IDAsIHggPSBhLnNvcnRLZXlSYW5nZXM7IHkgPCB4Lmxlbmd0aDsgeSArPSAxKSB7XG4gICAgICAgICAgdmFyIGIgPSB4W3ldO1xuICAgICAgICAgIGUucHVzaCh7XG4gICAgICAgICAgICBzb3J0S2V5OiBiLnNvcnRLZXksXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiBiLnN5bWJvbEluc3RhbmNlU3RhcnQsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZUVuZDogYi5zeW1ib2xJbnN0YW5jZUVuZCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHZcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGUucHVzaCh7XG4gICAgICAgICAgc3ltYm9sSW5zdGFuY2VTdGFydDogMCxcbiAgICAgICAgICBzeW1ib2xJbnN0YW5jZUVuZDogYS5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHZcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgYmUucHJvdG90eXBlLmF0dGVtcHRBbmNob3JQbGFjZW1lbnQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYywgdSwgaCwgcCwgZCwgXykge1xuICAgICAgdmFyIGYsXG4gICAgICAgICAgbSA9IFtoLnRleHRPZmZzZXQwLCBoLnRleHRPZmZzZXQxXSxcbiAgICAgICAgICBnID0geWUodCwgaSwgbywgbSwgciksXG4gICAgICAgICAgdiA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goeGUoZSwgZy54LCBnLnksIGEsIG4sIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSwgdSwgcywgbCwgYy5wcmVkaWNhdGUpO1xuICAgICAgaWYgKCFfIHx8IDAgIT09IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goeGUoXywgZy54LCBnLnksIGEsIG4sIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSwgdSwgcywgbCwgYy5wcmVkaWNhdGUpLmJveC5sZW5ndGgpIHJldHVybiB2LmJveC5sZW5ndGggPiAwID8gKHRoaXMucHJldlBsYWNlbWVudCAmJiB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW2guY3Jvc3NUaWxlSURdICYmIHRoaXMucHJldlBsYWNlbWVudC5wbGFjZW1lbnRzW2guY3Jvc3NUaWxlSURdICYmIHRoaXMucHJldlBsYWNlbWVudC5wbGFjZW1lbnRzW2guY3Jvc3NUaWxlSURdLnRleHQgJiYgKGYgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW2guY3Jvc3NUaWxlSURdLmFuY2hvciksIHRoaXMudmFyaWFibGVPZmZzZXRzW2guY3Jvc3NUaWxlSURdID0ge1xuICAgICAgICB0ZXh0T2Zmc2V0OiBtLFxuICAgICAgICB3aWR0aDogaSxcbiAgICAgICAgaGVpZ2h0OiBvLFxuICAgICAgICBhbmNob3I6IHQsXG4gICAgICAgIHRleHRCb3hTY2FsZTogcixcbiAgICAgICAgcHJldkFuY2hvcjogZlxuICAgICAgfSwgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24ocCwgdCwgaCwgZCksIHAuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAodGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKHAsIGQsIGgpLCB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1toLmNyb3NzVGlsZUlEXSA9IGQpLCB7XG4gICAgICAgIHNoaWZ0OiBnLFxuICAgICAgICBwbGFjZWRHbHlwaEJveGVzOiB2XG4gICAgICB9KSA6IHZvaWQgMDtcbiAgICB9LCBiZS5wcm90b3R5cGUucGxhY2VMYXllckJ1Y2tldFBhcnQgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSB0aGlzLFxuICAgICAgICAgIGEgPSBlLnBhcmFtZXRlcnMsXG4gICAgICAgICAgbiA9IGEuYnVja2V0LFxuICAgICAgICAgIHMgPSBhLmxheW91dCxcbiAgICAgICAgICBsID0gYS5wb3NNYXRyaXgsXG4gICAgICAgICAgYyA9IGEudGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgdSA9IGEubGFiZWxUb1NjcmVlbk1hdHJpeCxcbiAgICAgICAgICBoID0gYS50ZXh0UGl4ZWxSYXRpbyxcbiAgICAgICAgICBwID0gYS5ob2xkaW5nRm9yRmFkZSxcbiAgICAgICAgICBkID0gYS5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICBfID0gYS5wYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSxcbiAgICAgICAgICBmID0gYS5jb2xsaXNpb25Hcm91cCxcbiAgICAgICAgICBtID0gcy5nZXQoXCJ0ZXh0LW9wdGlvbmFsXCIpLFxuICAgICAgICAgIGcgPSBzLmdldChcImljb24tb3B0aW9uYWxcIiksXG4gICAgICAgICAgdiA9IHMuZ2V0KFwidGV4dC1hbGxvdy1vdmVybGFwXCIpLFxuICAgICAgICAgIHkgPSBzLmdldChcImljb24tYWxsb3ctb3ZlcmxhcFwiKSxcbiAgICAgICAgICB4ID0gXCJtYXBcIiA9PT0gcy5nZXQoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiKSxcbiAgICAgICAgICBiID0gXCJtYXBcIiA9PT0gcy5nZXQoXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiKSxcbiAgICAgICAgICB3ID0gXCJub25lXCIgIT09IHMuZ2V0KFwiaWNvbi10ZXh0LWZpdFwiKSxcbiAgICAgICAgICBUID0gXCJ2aWV3cG9ydC15XCIgPT09IHMuZ2V0KFwic3ltYm9sLXotb3JkZXJcIiksXG4gICAgICAgICAgRSA9IHYgJiYgKHkgfHwgIW4uaGFzSWNvbkRhdGEoKSB8fCBnKSxcbiAgICAgICAgICBJID0geSAmJiAodiB8fCAhbi5oYXNUZXh0RGF0YSgpIHx8IG0pO1xuICAgICAgIW4uY29sbGlzaW9uQXJyYXlzICYmIGQgJiYgbi5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGQpO1xuXG4gICAgICB2YXIgUCA9IGZ1bmN0aW9uIFAoZSwgYSkge1xuICAgICAgICBpZiAoIWlbZS5jcm9zc1RpbGVJRF0pIGlmIChwKSByLnBsYWNlbWVudHNbZS5jcm9zc1RpbGVJRF0gPSBuZXcgZmUoITEsICExLCAhMSk7ZWxzZSB7XG4gICAgICAgICAgdmFyIGQsXG4gICAgICAgICAgICAgIFQgPSAhMSxcbiAgICAgICAgICAgICAgUCA9ICExLFxuICAgICAgICAgICAgICBTID0gITAsXG4gICAgICAgICAgICAgIEMgPSBudWxsLFxuICAgICAgICAgICAgICB6ID0ge1xuICAgICAgICAgICAgYm94OiBudWxsLFxuICAgICAgICAgICAgb2Zmc2NyZWVuOiBudWxsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAgICAgRCA9IHtcbiAgICAgICAgICAgIGJveDogbnVsbCxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEEgPSBudWxsLFxuICAgICAgICAgICAgICBNID0gbnVsbCxcbiAgICAgICAgICAgICAgTCA9IDAsXG4gICAgICAgICAgICAgIFIgPSAwLFxuICAgICAgICAgICAgICBrID0gMDtcbiAgICAgICAgICBhLnRleHRGZWF0dXJlSW5kZXggPyBMID0gYS50ZXh0RmVhdHVyZUluZGV4IDogZS51c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcyAmJiAoTCA9IGUuZmVhdHVyZUluZGV4KSwgYS52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggJiYgKFIgPSBhLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgdmFyIEIgPSBhLnRleHRCb3g7XG5cbiAgICAgICAgICBpZiAoQikge1xuICAgICAgICAgICAgdmFyIE8gPSBmdW5jdGlvbiBPKGkpIHtcbiAgICAgICAgICAgICAgdmFyIG8gPSB0LldyaXRpbmdNb2RlLmhvcml6b250YWw7XG5cbiAgICAgICAgICAgICAgaWYgKG4uYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhaSAmJiByLnByZXZQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IHIucHJldlBsYWNlbWVudC5wbGFjZWRPcmllbnRhdGlvbnNbZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgYSAmJiAoci5wbGFjZWRPcmllbnRhdGlvbnNbZS5jcm9zc1RpbGVJRF0gPSBhLCByLm1hcmtVc2VkT3JpZW50YXRpb24obiwgbyA9IGEsIGUpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBGID0gZnVuY3Rpb24gRihpLCBvKSB7XG4gICAgICAgICAgICAgIGlmIChuLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwICYmIGEudmVydGljYWxUZXh0Qm94KSBmb3IgKHZhciByID0gMCwgcyA9IG4ud3JpdGluZ01vZGVzOyByIDwgcy5sZW5ndGggJiYgKHNbcl0gPT09IHQuV3JpdGluZ01vZGUudmVydGljYWwgPyAoeiA9IG8oKSwgRCA9IHopIDogeiA9IGkoKSwgISh6ICYmIHouYm94ICYmIHouYm94Lmxlbmd0aCkpOyByICs9IDEpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgIH0gZWxzZSB6ID0gaSgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHMuZ2V0KFwidGV4dC12YXJpYWJsZS1hbmNob3JcIikpIHtcbiAgICAgICAgICAgICAgdmFyIFUgPSBzLmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpO1xuXG4gICAgICAgICAgICAgIGlmIChyLnByZXZQbGFjZW1lbnQgJiYgci5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgIHZhciBOID0gci5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBVLmluZGV4T2YoTi5hbmNob3IpID4gMCAmJiAoVSA9IFUuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdCAhPT0gTi5hbmNob3I7XG4gICAgICAgICAgICAgICAgfSkpLnVuc2hpZnQoTi5hbmNob3IpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIFogPSBmdW5jdGlvbiBaKHQsIGksIG8pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gdC54MiAtIHQueDEsIHMgPSB0LnkyIC0gdC55MSwgYyA9IGUudGV4dEJveFNjYWxlLCB1ID0gdyAmJiAheSA/IGkgOiBudWxsLCBwID0ge1xuICAgICAgICAgICAgICAgICAgYm94OiBbXSxcbiAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogITFcbiAgICAgICAgICAgICAgICB9LCBkID0gdiA/IDIgKiBVLmxlbmd0aCA6IFUubGVuZ3RoLCBfID0gMDsgXyA8IGQ7ICsrXykge1xuICAgICAgICAgICAgICAgICAgdmFyIG0gPSByLmF0dGVtcHRBbmNob3JQbGFjZW1lbnQoVVtfICUgVS5sZW5ndGhdLCB0LCBhLCBzLCBjLCB4LCBiLCBoLCBsLCBmLCBfID49IFUubGVuZ3RoLCBlLCBuLCBvLCB1KTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgKHAgPSBtLnBsYWNlZEdseXBoQm94ZXMpICYmIHAuYm94ICYmIHAuYm94Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBUID0gITAsIEMgPSBtLnNoaWZ0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBGKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWihCLCBhLmljb25Cb3gsIHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGEudmVydGljYWxUZXh0Qm94O1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgISh6ICYmIHouYm94ICYmIHouYm94Lmxlbmd0aCkgJiYgZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwICYmIGkgPyBaKGksIGEudmVydGljYWxJY29uQm94LCB0LldyaXRpbmdNb2RlLnZlcnRpY2FsKSA6IHtcbiAgICAgICAgICAgICAgICAgIGJveDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLCB6ICYmIChUID0gei5ib3gsIFMgPSB6Lm9mZnNjcmVlbik7XG4gICAgICAgICAgICAgIHZhciBxID0gTyh6ICYmIHouYm94KTtcblxuICAgICAgICAgICAgICBpZiAoIVQgJiYgci5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSByLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgICAgIGogJiYgKHIudmFyaWFibGVPZmZzZXRzW2UuY3Jvc3NUaWxlSURdID0gaiwgci5tYXJrVXNlZEp1c3RpZmljYXRpb24obiwgai5hbmNob3IsIGUsIHEpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIFYgPSBmdW5jdGlvbiBWKHQsIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbyA9IHIuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3godCwgdiwgaCwgbCwgZi5wcmVkaWNhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvICYmIG8uYm94ICYmIG8uYm94Lmxlbmd0aCAmJiAoci5tYXJrVXNlZE9yaWVudGF0aW9uKG4sIGksIGUpLCByLnBsYWNlZE9yaWVudGF0aW9uc1tlLmNyb3NzVGlsZUlEXSA9IGkpLCBvO1xuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIEYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBWKEIsIHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGEudmVydGljYWxUZXh0Qm94O1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwICYmIGkgPyBWKGksIHQuV3JpdGluZ01vZGUudmVydGljYWwpIDoge1xuICAgICAgICAgICAgICAgICAgYm94OiBudWxsLFxuICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBudWxsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksIE8oeiAmJiB6LmJveCAmJiB6LmJveC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChUID0gKGQgPSB6KSAmJiBkLmJveCAmJiBkLmJveC5sZW5ndGggPiAwLCBTID0gZCAmJiBkLm9mZnNjcmVlbiwgZS51c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcykge1xuICAgICAgICAgICAgdmFyIEcgPSBuLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGUuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KSxcbiAgICAgICAgICAgICAgICBXID0gdC5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKG4udGV4dFNpemVEYXRhLCBfLCBHKSxcbiAgICAgICAgICAgICAgICBYID0gcy5nZXQoXCJ0ZXh0LXBhZGRpbmdcIik7XG4gICAgICAgICAgICBBID0gci5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkNpcmNsZXModiwgRywgbi5saW5lVmVydGV4QXJyYXksIG4uZ2x5cGhPZmZzZXRBcnJheSwgVywgbCwgYywgdSwgbywgYiwgZi5wcmVkaWNhdGUsIGUuY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIsIFgpLCBUID0gdiB8fCBBLmNpcmNsZXMubGVuZ3RoID4gMCAmJiAhQS5jb2xsaXNpb25EZXRlY3RlZCwgUyA9IFMgJiYgQS5vZmZzY3JlZW47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGEuaWNvbkZlYXR1cmVJbmRleCAmJiAoayA9IGEuaWNvbkZlYXR1cmVJbmRleCksIGEuaWNvbkJveCkge1xuICAgICAgICAgICAgdmFyIEggPSBmdW5jdGlvbiBIKHQpIHtcbiAgICAgICAgICAgICAgdmFyIGUgPSB3ICYmIEMgPyB4ZSh0LCBDLngsIEMueSwgeCwgYiwgci50cmFuc2Zvcm0uYW5nbGUpIDogdDtcbiAgICAgICAgICAgICAgcmV0dXJuIHIuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goZSwgeSwgaCwgbCwgZi5wcmVkaWNhdGUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgUCA9IEQgJiYgRC5ib3ggJiYgRC5ib3gubGVuZ3RoICYmIGEudmVydGljYWxJY29uQm94ID8gKE0gPSBIKGEudmVydGljYWxJY29uQm94KSkuYm94Lmxlbmd0aCA+IDAgOiAoTSA9IEgoYS5pY29uQm94KSkuYm94Lmxlbmd0aCA+IDAsIFMgPSBTICYmIE0ub2Zmc2NyZWVuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBLID0gbSB8fCAwID09PSBlLm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzICYmIDAgPT09IGUubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICAgICAgICBZID0gZyB8fCAwID09PSBlLm51bUljb25WZXJ0aWNlcztcblxuICAgICAgICAgIGlmIChLIHx8IFkgPyBZID8gSyB8fCAoUCA9IFAgJiYgVCkgOiBUID0gUCAmJiBUIDogUCA9IFQgPSBQICYmIFQsIFQgJiYgZCAmJiBkLmJveCAmJiByLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChkLmJveCwgcy5nZXQoXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIiksIG4uYnVja2V0SW5zdGFuY2VJZCwgRCAmJiBELmJveCAmJiBSID8gUiA6IEwsIGYuSUQpLCBQICYmIE0gJiYgci5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3goTS5ib3gsIHMuZ2V0KFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCIpLCBuLmJ1Y2tldEluc3RhbmNlSWQsIGssIGYuSUQpLCBBICYmIChUICYmIHIuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyhBLmNpcmNsZXMsIHMuZ2V0KFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCIpLCBuLmJ1Y2tldEluc3RhbmNlSWQsIEwsIGYuSUQpLCBvKSkge1xuICAgICAgICAgICAgdmFyIEogPSBuLmJ1Y2tldEluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgUSA9IHIuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW0pdO1xuICAgICAgICAgICAgdm9pZCAwID09PSBRICYmIChRID0gci5jb2xsaXNpb25DaXJjbGVBcnJheXNbSl0gPSBuZXcgbWUoKSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyICQgPSAwOyAkIDwgQS5jaXJjbGVzLmxlbmd0aDsgJCArPSA0KSB7XG4gICAgICAgICAgICAgIFEuY2lyY2xlcy5wdXNoKEEuY2lyY2xlc1skICsgMF0pLCBRLmNpcmNsZXMucHVzaChBLmNpcmNsZXNbJCArIDFdKSwgUS5jaXJjbGVzLnB1c2goQS5jaXJjbGVzWyQgKyAyXSksIFEuY2lyY2xlcy5wdXNoKEEuY29sbGlzaW9uRGV0ZWN0ZWQgPyAxIDogMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5wbGFjZW1lbnRzW2UuY3Jvc3NUaWxlSURdID0gbmV3IGZlKFQgfHwgRSwgUCB8fCBJLCBTIHx8IG4uanVzdFJlbG9hZGVkKSwgaVtlLmNyb3NzVGlsZUlEXSA9ICEwO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoVCkgZm9yICh2YXIgUyA9IG4uZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSksIEMgPSBTLmxlbmd0aCAtIDE7IEMgPj0gMDsgLS1DKSB7XG4gICAgICAgIHZhciB6ID0gU1tDXTtcbiAgICAgICAgUChuLnN5bWJvbEluc3RhbmNlcy5nZXQoeiksIG4uY29sbGlzaW9uQXJyYXlzW3pdKTtcbiAgICAgIH0gZWxzZSBmb3IgKHZhciBEID0gZS5zeW1ib2xJbnN0YW5jZVN0YXJ0OyBEIDwgZS5zeW1ib2xJbnN0YW5jZUVuZDsgRCsrKSB7XG4gICAgICAgIFAobi5zeW1ib2xJbnN0YW5jZXMuZ2V0KEQpLCBuLmNvbGxpc2lvbkFycmF5c1tEXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvICYmIG4uYnVja2V0SW5zdGFuY2VJZCBpbiB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cykge1xuICAgICAgICB2YXIgQSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW24uYnVja2V0SW5zdGFuY2VJZF07XG4gICAgICAgIHQuaW52ZXJ0KEEuaW52UHJvak1hdHJpeCwgbCksIEEudmlld3BvcnRNYXRyaXggPSB0aGlzLmNvbGxpc2lvbkluZGV4LmdldFZpZXdwb3J0TWF0cml4KCk7XG4gICAgICB9XG5cbiAgICAgIG4uanVzdFJlbG9hZGVkID0gITE7XG4gICAgfSwgYmUucHJvdG90eXBlLm1hcmtVc2VkSnVzdGlmaWNhdGlvbiA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYTtcbiAgICAgIGEgPSByID09PSB0LldyaXRpbmdNb2RlLnZlcnRpY2FsID8gby52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA6IHtcbiAgICAgICAgbGVmdDogby5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICBjZW50ZXI6IG8uY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICByaWdodDogby5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgfVt0LmdldEFuY2hvckp1c3RpZmljYXRpb24oaSldO1xuXG4gICAgICBmb3IgKHZhciBuID0gMCwgcyA9IFtvLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIG8uY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBvLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBvLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4XTsgbiA8IHMubGVuZ3RoOyBuICs9IDEpIHtcbiAgICAgICAgdmFyIGwgPSBzW25dO1xuICAgICAgICBsID49IDAgJiYgKGUudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQobCkuY3Jvc3NUaWxlSUQgPSBhID49IDAgJiYgbCAhPT0gYSA/IDAgOiBvLmNyb3NzVGlsZUlEKTtcbiAgICAgIH1cbiAgICB9LCBiZS5wcm90b3R5cGUubWFya1VzZWRPcmllbnRhdGlvbiA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICBmb3IgKHZhciByID0gaSA9PT0gdC5Xcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8IGkgPT09IHQuV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHkgPyBpIDogMCwgYSA9IGkgPT09IHQuV3JpdGluZ01vZGUudmVydGljYWwgPyBpIDogMCwgbiA9IDAsIHMgPSBbby5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LCBvLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgby5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleF07IG4gPCBzLmxlbmd0aDsgbiArPSAxKSB7XG4gICAgICAgIGUudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc1tuXSkucGxhY2VkT3JpZW50YXRpb24gPSByO1xuICAgICAgfVxuXG4gICAgICBvLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4ICYmIChlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KG8udmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLnBsYWNlZE9yaWVudGF0aW9uID0gYSk7XG4gICAgfSwgYmUucHJvdG90eXBlLmNvbW1pdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmNvbW1pdFRpbWUgPSB0LCB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuICAgICAgdmFyIGUgPSB0aGlzLnByZXZQbGFjZW1lbnQsXG4gICAgICAgICAgaSA9ICExO1xuICAgICAgdGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQgPSBlID8gZS56b29tQWRqdXN0bWVudCh0aGlzLnRyYW5zZm9ybS56b29tKSA6IDA7XG4gICAgICB2YXIgbyA9IGUgPyBlLnN5bWJvbEZhZGVDaGFuZ2UodCkgOiAxLFxuICAgICAgICAgIHIgPSBlID8gZS5vcGFjaXRpZXMgOiB7fSxcbiAgICAgICAgICBhID0gZSA/IGUudmFyaWFibGVPZmZzZXRzIDoge30sXG4gICAgICAgICAgbiA9IGUgPyBlLnBsYWNlZE9yaWVudGF0aW9ucyA6IHt9O1xuXG4gICAgICBmb3IgKHZhciBzIGluIHRoaXMucGxhY2VtZW50cykge1xuICAgICAgICB2YXIgbCA9IHRoaXMucGxhY2VtZW50c1tzXSxcbiAgICAgICAgICAgIGMgPSByW3NdO1xuICAgICAgICBjID8gKHRoaXMub3BhY2l0aWVzW3NdID0gbmV3IF9lKGMsIG8sIGwudGV4dCwgbC5pY29uKSwgaSA9IGkgfHwgbC50ZXh0ICE9PSBjLnRleHQucGxhY2VkIHx8IGwuaWNvbiAhPT0gYy5pY29uLnBsYWNlZCkgOiAodGhpcy5vcGFjaXRpZXNbc10gPSBuZXcgX2UobnVsbCwgbywgbC50ZXh0LCBsLmljb24sIGwuc2tpcEZhZGUpLCBpID0gaSB8fCBsLnRleHQgfHwgbC5pY29uKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgdSBpbiByKSB7XG4gICAgICAgIHZhciBoID0gclt1XTtcblxuICAgICAgICBpZiAoIXRoaXMub3BhY2l0aWVzW3VdKSB7XG4gICAgICAgICAgdmFyIHAgPSBuZXcgX2UoaCwgbywgITEsICExKTtcbiAgICAgICAgICBwLmlzSGlkZGVuKCkgfHwgKHRoaXMub3BhY2l0aWVzW3VdID0gcCwgaSA9IGkgfHwgaC50ZXh0LnBsYWNlZCB8fCBoLmljb24ucGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBkIGluIGEpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbZF0gfHwgIXRoaXMub3BhY2l0aWVzW2RdIHx8IHRoaXMub3BhY2l0aWVzW2RdLmlzSGlkZGVuKCkgfHwgKHRoaXMudmFyaWFibGVPZmZzZXRzW2RdID0gYVtkXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF8gaW4gbikge1xuICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tfXSB8fCAhdGhpcy5vcGFjaXRpZXNbX10gfHwgdGhpcy5vcGFjaXRpZXNbX10uaXNIaWRkZW4oKSB8fCAodGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbX10gPSBuW19dKTtcbiAgICAgIH1cblxuICAgICAgaSA/IHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPSB0IDogXCJudW1iZXJcIiAhPSB0eXBlb2YgdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSAmJiAodGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA9IGUgPyBlLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDogdCk7XG4gICAgfSwgYmUucHJvdG90eXBlLnVwZGF0ZUxheWVyT3BhY2l0aWVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSB7fSwgbyA9IDAsIHIgPSBlOyBvIDwgci5sZW5ndGg7IG8gKz0gMSkge1xuICAgICAgICB2YXIgYSA9IHJbb10sXG4gICAgICAgICAgICBuID0gYS5nZXRCdWNrZXQodCk7XG4gICAgICAgIG4gJiYgYS5sYXRlc3RGZWF0dXJlSW5kZXggJiYgdC5pZCA9PT0gbi5sYXllcklkc1swXSAmJiB0aGlzLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyhuLCBpLCBhLmNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgIH1cbiAgICB9LCBiZS5wcm90b3R5cGUudXBkYXRlQnVja2V0T3BhY2l0aWVzID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIGUuaGFzVGV4dERhdGEoKSAmJiBlLnRleHQub3BhY2l0eVZlcnRleEFycmF5LmNsZWFyKCksIGUuaGFzSWNvbkRhdGEoKSAmJiBlLmljb24ub3BhY2l0eVZlcnRleEFycmF5LmNsZWFyKCksIGUuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSAmJiBlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKSwgZS5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpICYmIGUudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgdmFyIGEgPSBlLmxheWVyc1swXS5sYXlvdXQsXG4gICAgICAgICAgbiA9IG5ldyBfZShudWxsLCAwLCAhMSwgITEsICEwKSxcbiAgICAgICAgICBzID0gYS5nZXQoXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIiksXG4gICAgICAgICAgbCA9IGEuZ2V0KFwiaWNvbi1hbGxvdy1vdmVybGFwXCIpLFxuICAgICAgICAgIGMgPSBhLmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpLFxuICAgICAgICAgIHUgPSBcIm1hcFwiID09PSBhLmdldChcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCIpLFxuICAgICAgICAgIGggPSBcIm1hcFwiID09PSBhLmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpLFxuICAgICAgICAgIHAgPSBcIm5vbmVcIiAhPT0gYS5nZXQoXCJpY29uLXRleHQtZml0XCIpLFxuICAgICAgICAgIGQgPSBuZXcgX2UobnVsbCwgMCwgcyAmJiAobCB8fCAhZS5oYXNJY29uRGF0YSgpIHx8IGEuZ2V0KFwiaWNvbi1vcHRpb25hbFwiKSksIGwgJiYgKHMgfHwgIWUuaGFzVGV4dERhdGEoKSB8fCBhLmdldChcInRleHQtb3B0aW9uYWxcIikpLCAhMCk7XG4gICAgICAhZS5jb2xsaXNpb25BcnJheXMgJiYgbyAmJiAoZS5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpIHx8IGUuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkgJiYgZS5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKG8pO1xuXG4gICAgICBmb3IgKHZhciBfID0gZnVuY3Rpb24gXyh0LCBlLCBpKSB7XG4gICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgZSAvIDQ7IG8rKykge1xuICAgICAgICAgIHQub3BhY2l0eVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKGkpO1xuICAgICAgICB9XG4gICAgICB9LCBmID0gZnVuY3Rpb24gZihvKSB7XG4gICAgICAgIHZhciBhID0gZS5zeW1ib2xJbnN0YW5jZXMuZ2V0KG8pLFxuICAgICAgICAgICAgcyA9IGEubnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICBsID0gYS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICBmID0gYS5jcm9zc1RpbGVJRCxcbiAgICAgICAgICAgIG0gPSByLm9wYWNpdGllc1tmXTtcbiAgICAgICAgaVtmXSA/IG0gPSBuIDogbSB8fCAoci5vcGFjaXRpZXNbZl0gPSBtID0gZCksIGlbZl0gPSAhMDtcbiAgICAgICAgdmFyIGcgPSBhLm51bUljb25WZXJ0aWNlcyA+IDAsXG4gICAgICAgICAgICB2ID0gci5wbGFjZWRPcmllbnRhdGlvbnNbYS5jcm9zc1RpbGVJRF0sXG4gICAgICAgICAgICB5ID0gdiA9PT0gdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCxcbiAgICAgICAgICAgIHggPSB2ID09PSB0LldyaXRpbmdNb2RlLmhvcml6b250YWwgfHwgdiA9PT0gdC5Xcml0aW5nTW9kZS5ob3Jpem9udGFsT25seTtcblxuICAgICAgICBpZiAocyA+IDAgfHwgbCA+IDApIHtcbiAgICAgICAgICB2YXIgYiA9IERlKG0udGV4dCk7XG4gICAgICAgICAgXyhlLnRleHQsIHMsIHkgPyBBZSA6IGIpLCBfKGUudGV4dCwgbCwgeCA/IEFlIDogYik7XG4gICAgICAgICAgdmFyIHcgPSBtLnRleHQuaXNIaWRkZW4oKTtcbiAgICAgICAgICBbYS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCwgYS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsIGEubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleF0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdCA+PSAwICYmIChlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHQpLmhpZGRlbiA9IHcgfHwgeSA/IDEgOiAwKTtcbiAgICAgICAgICB9KSwgYS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA+PSAwICYmIChlLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGEudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLmhpZGRlbiA9IHcgfHwgeCA/IDEgOiAwKTtcbiAgICAgICAgICB2YXIgVCA9IHIudmFyaWFibGVPZmZzZXRzW2EuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgIFQgJiYgci5tYXJrVXNlZEp1c3RpZmljYXRpb24oZSwgVC5hbmNob3IsIGEsIHYpO1xuICAgICAgICAgIHZhciBFID0gci5wbGFjZWRPcmllbnRhdGlvbnNbYS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgRSAmJiAoci5tYXJrVXNlZEp1c3RpZmljYXRpb24oZSwgXCJsZWZ0XCIsIGEsIEUpLCByLm1hcmtVc2VkT3JpZW50YXRpb24oZSwgRSwgYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGcpIHtcbiAgICAgICAgICB2YXIgSSA9IERlKG0uaWNvbiksXG4gICAgICAgICAgICAgIFAgPSAhKHAgJiYgYS52ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCAmJiB5KTtcbiAgICAgICAgICBhLnBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwICYmIChfKGUuaWNvbiwgYS5udW1JY29uVmVydGljZXMsIFAgPyBJIDogQWUpLCBlLmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGEucGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW4gPSBtLmljb24uaXNIaWRkZW4oKSksIGEudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCAmJiAoXyhlLmljb24sIGEubnVtVmVydGljYWxJY29uVmVydGljZXMsIFAgPyBBZSA6IEkpLCBlLmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGEudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgpLmhpZGRlbiA9IG0uaWNvbi5pc0hpZGRlbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlLmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgfHwgZS5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpKSB7XG4gICAgICAgICAgdmFyIFMgPSBlLmNvbGxpc2lvbkFycmF5c1tvXTtcblxuICAgICAgICAgIGlmIChTKSB7XG4gICAgICAgICAgICB2YXIgQyA9IG5ldyB0LlBvaW50KDAsIDApO1xuXG4gICAgICAgICAgICBpZiAoUy50ZXh0Qm94IHx8IFMudmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgIHZhciB6ID0gITA7XG5cbiAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB2YXIgRCA9IHIudmFyaWFibGVPZmZzZXRzW2ZdO1xuICAgICAgICAgICAgICAgIEQgPyAoQyA9IHllKEQuYW5jaG9yLCBELndpZHRoLCBELmhlaWdodCwgRC50ZXh0T2Zmc2V0LCBELnRleHRCb3hTY2FsZSksIHUgJiYgQy5fcm90YXRlKGggPyByLnRyYW5zZm9ybS5hbmdsZSA6IC1yLnRyYW5zZm9ybS5hbmdsZSkpIDogeiA9ICExO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgUy50ZXh0Qm94ICYmIHdlKGUudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgbS50ZXh0LnBsYWNlZCwgIXogfHwgeSwgQy54LCBDLnkpLCBTLnZlcnRpY2FsVGV4dEJveCAmJiB3ZShlLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG0udGV4dC5wbGFjZWQsICF6IHx8IHgsIEMueCwgQy55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIEEgPSBCb29sZWFuKCF4ICYmIFMudmVydGljYWxJY29uQm94KTtcbiAgICAgICAgICAgIFMuaWNvbkJveCAmJiB3ZShlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG0uaWNvbi5wbGFjZWQsIEEsIHAgPyBDLnggOiAwLCBwID8gQy55IDogMCksIFMudmVydGljYWxJY29uQm94ICYmIHdlKGUuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgbS5pY29uLnBsYWNlZCwgIUEsIHAgPyBDLnggOiAwLCBwID8gQy55IDogMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBtID0gMDsgbSA8IGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIGYobSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlLnNvcnRGZWF0dXJlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSksIHRoaXMucmV0YWluZWRRdWVyeURhdGFbZS5idWNrZXRJbnN0YW5jZUlkXSAmJiAodGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtlLmJ1Y2tldEluc3RhbmNlSWRdLmZlYXR1cmVTb3J0T3JkZXIgPSBlLmZlYXR1cmVTb3J0T3JkZXIpLCBlLmhhc1RleHREYXRhKCkgJiYgZS50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIgJiYgZS50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShlLnRleHQub3BhY2l0eVZlcnRleEFycmF5KSwgZS5oYXNJY29uRGF0YSgpICYmIGUuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyICYmIGUuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZS5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheSksIGUuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSAmJiBlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyICYmIGUuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShlLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkpLCBlLmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkgJiYgZS50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlciAmJiBlLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZS50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KSwgZS5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXNbZS5idWNrZXRJbnN0YW5jZUlkXTtcbiAgICAgICAgZS5wbGFjZW1lbnRJbnZQcm9qTWF0cml4ID0gZy5pbnZQcm9qTWF0cml4LCBlLnBsYWNlbWVudFZpZXdwb3J0TWF0cml4ID0gZy52aWV3cG9ydE1hdHJpeCwgZS5jb2xsaXNpb25DaXJjbGVBcnJheSA9IGcuY2lyY2xlcywgZGVsZXRlIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2UuYnVja2V0SW5zdGFuY2VJZF07XG4gICAgICB9XG4gICAgfSwgYmUucHJvdG90eXBlLnN5bWJvbEZhZGVDaGFuZ2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIDAgPT09IHRoaXMuZmFkZUR1cmF0aW9uID8gMSA6ICh0IC0gdGhpcy5jb21taXRUaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uICsgdGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQ7XG4gICAgfSwgYmUucHJvdG90eXBlLnpvb21BZGp1c3RtZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy50cmFuc2Zvcm0uem9vbSAtIHQpIC8gMS41KTtcbiAgICB9LCBiZS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhbGUgfHwgdCAtIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPCB0aGlzLmZhZGVEdXJhdGlvbjtcbiAgICB9LCBiZS5wcm90b3R5cGUuc3RpbGxSZWNlbnQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIGkgPSB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPT09IGUgPyAxIC0gdGhpcy56b29tQWRqdXN0bWVudChlKSA6IDE7XG4gICAgICByZXR1cm4gdGhpcy56b29tQXRMYXN0UmVjZW5jeUNoZWNrID0gZSwgdGhpcy5jb21taXRUaW1lICsgdGhpcy5mYWRlRHVyYXRpb24gKiBpID4gdDtcbiAgICB9LCBiZS5wcm90b3R5cGUuc2V0U3RhbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnN0YWxlID0gITA7XG4gICAgfTtcbiAgICB2YXIgVGUgPSBNYXRoLnBvdygyLCAyNSksXG4gICAgICAgIEVlID0gTWF0aC5wb3coMiwgMjQpLFxuICAgICAgICBJZSA9IE1hdGgucG93KDIsIDE3KSxcbiAgICAgICAgUGUgPSBNYXRoLnBvdygyLCAxNiksXG4gICAgICAgIFNlID0gTWF0aC5wb3coMiwgOSksXG4gICAgICAgIENlID0gTWF0aC5wb3coMiwgOCksXG4gICAgICAgIHplID0gTWF0aC5wb3coMiwgMSk7XG5cbiAgICBmdW5jdGlvbiBEZSh0KSB7XG4gICAgICBpZiAoMCA9PT0gdC5vcGFjaXR5ICYmICF0LnBsYWNlZCkgcmV0dXJuIDA7XG4gICAgICBpZiAoMSA9PT0gdC5vcGFjaXR5ICYmIHQucGxhY2VkKSByZXR1cm4gNDI5NDk2NzI5NTtcbiAgICAgIHZhciBlID0gdC5wbGFjZWQgPyAxIDogMCxcbiAgICAgICAgICBpID0gTWF0aC5mbG9vcigxMjcgKiB0Lm9wYWNpdHkpO1xuICAgICAgcmV0dXJuIGkgKiBUZSArIGUgKiBFZSArIGkgKiBJZSArIGUgKiBQZSArIGkgKiBTZSArIGUgKiBDZSArIGkgKiB6ZSArIGU7XG4gICAgfVxuXG4gICAgdmFyIEFlID0gMCxcbiAgICAgICAgTWUgPSBmdW5jdGlvbiBNZSh0KSB7XG4gICAgICB0aGlzLl9zb3J0QWNyb3NzVGlsZXMgPSBcInZpZXdwb3J0LXlcIiAhPT0gdC5sYXlvdXQuZ2V0KFwic3ltYm9sLXotb3JkZXJcIikgJiYgIXQubGF5b3V0LmdldChcInN5bWJvbC1zb3J0LWtleVwiKS5pc0NvbnN0YW50KCksIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPSAwLCB0aGlzLl9jdXJyZW50UGFydEluZGV4ID0gMCwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9LCB0aGlzLl9idWNrZXRQYXJ0cyA9IFtdO1xuICAgIH07XG5cbiAgICBNZS5wcm90b3R5cGUuY29udGludWVQbGFjZW1lbnQgPSBmdW5jdGlvbiAodCwgZSwgaSwgbywgcikge1xuICAgICAgZm9yICh2YXIgYSA9IHRoaXMuX2J1Y2tldFBhcnRzOyB0aGlzLl9jdXJyZW50VGlsZUluZGV4IDwgdC5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChlLmdldEJ1Y2tldFBhcnRzKGEsIG8sIHRbdGhpcy5fY3VycmVudFRpbGVJbmRleF0sIHRoaXMuX3NvcnRBY3Jvc3NUaWxlcyksIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXgrKywgcigpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodGhpcy5fc29ydEFjcm9zc1RpbGVzICYmICh0aGlzLl9zb3J0QWNyb3NzVGlsZXMgPSAhMSwgYS5zb3J0KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LnNvcnRLZXkgLSBlLnNvcnRLZXk7XG4gICAgICB9KSk7IHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXggPCBhLmxlbmd0aDspIHtcbiAgICAgICAgaWYgKGUucGxhY2VMYXllckJ1Y2tldFBhcnQoYVt0aGlzLl9jdXJyZW50UGFydEluZGV4XSwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcywgaSksIHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXgrKywgcigpKSByZXR1cm4gITA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhMTtcbiAgICB9O1xuXG4gICAgdmFyIExlID0gZnVuY3Rpb24gTGUodCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdGhpcy5wbGFjZW1lbnQgPSBuZXcgYmUodCwgciwgYSwgbiksIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IGUubGVuZ3RoIC0gMSwgdGhpcy5fZm9yY2VGdWxsUGxhY2VtZW50ID0gaSwgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gbywgdGhpcy5fZG9uZSA9ICExO1xuICAgIH07XG5cbiAgICBMZS5wcm90b3R5cGUuaXNEb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RvbmU7XG4gICAgfSwgTGUucHJvdG90eXBlLmNvbnRpbnVlUGxhY2VtZW50ID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIGZvciAodmFyIHIgPSB0aGlzLCBhID0gdC5icm93c2VyLm5vdygpLCBuID0gZnVuY3Rpb24gbigpIHtcbiAgICAgICAgdmFyIGUgPSB0LmJyb3dzZXIubm93KCkgLSBhO1xuICAgICAgICByZXR1cm4gIXIuX2ZvcmNlRnVsbFBsYWNlbWVudCAmJiBlID4gMjtcbiAgICAgIH07IHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA+PSAwOykge1xuICAgICAgICB2YXIgcyA9IGlbZVt0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXhdXSxcbiAgICAgICAgICAgIGwgPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcblxuICAgICAgICBpZiAoXCJzeW1ib2xcIiA9PT0gcy50eXBlICYmICghcy5taW56b29tIHx8IHMubWluem9vbSA8PSBsKSAmJiAoIXMubWF4em9vbSB8fCBzLm1heHpvb20gPiBsKSkge1xuICAgICAgICAgIGlmICh0aGlzLl9pblByb2dyZXNzTGF5ZXIgfHwgKHRoaXMuX2luUHJvZ3Jlc3NMYXllciA9IG5ldyBNZShzKSksIHRoaXMuX2luUHJvZ3Jlc3NMYXllci5jb250aW51ZVBsYWNlbWVudChvW3Muc291cmNlXSwgdGhpcy5wbGFjZW1lbnQsIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcywgcywgbikpIHJldHVybjtcbiAgICAgICAgICBkZWxldGUgdGhpcy5faW5Qcm9ncmVzc0xheWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICB9LCBMZS5wcm90b3R5cGUuY29tbWl0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnBsYWNlbWVudC5jb21taXQodCksIHRoaXMucGxhY2VtZW50O1xuICAgIH07XG5cbiAgICB2YXIgUmUgPSA1MTIgLyB0LkVYVEVOVCAvIDIsXG4gICAgICAgIGtlID0gZnVuY3Rpb24ga2UodCwgZSwgaSkge1xuICAgICAgdGhpcy50aWxlSUQgPSB0LCB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMgPSB7fSwgdGhpcy5idWNrZXRJbnN0YW5jZUlkID0gaTtcblxuICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBlLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIHZhciByID0gZS5nZXQobyksXG4gICAgICAgICAgICBhID0gci5rZXk7XG4gICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1thXSB8fCAodGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2FdID0gW10pLCB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNbYV0ucHVzaCh7XG4gICAgICAgICAgY3Jvc3NUaWxlSUQ6IHIuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgY29vcmQ6IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMociwgdClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGtlLnByb3RvdHlwZS5nZXRTY2FsZWRDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IFJlIC8gTWF0aC5wb3coMiwgaS5jYW5vbmljYWwueiAtIHRoaXMudGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGguZmxvb3IoKGkuY2Fub25pY2FsLnggKiB0LkVYVEVOVCArIGUuYW5jaG9yWCkgKiBvKSxcbiAgICAgICAgeTogTWF0aC5mbG9vcigoaS5jYW5vbmljYWwueSAqIHQuRVhURU5UICsgZS5hbmNob3JZKSAqIG8pXG4gICAgICB9O1xuICAgIH0sIGtlLnByb3RvdHlwZS5maW5kTWF0Y2hlcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gdGhpcy50aWxlSUQuY2Fub25pY2FsLnogPCBlLmNhbm9uaWNhbC56ID8gMSA6IE1hdGgucG93KDIsIHRoaXMudGlsZUlELmNhbm9uaWNhbC56IC0gZS5jYW5vbmljYWwueiksIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgICB2YXIgYSA9IHQuZ2V0KHIpO1xuXG4gICAgICAgIGlmICghYS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2Eua2V5XTtcbiAgICAgICAgICBpZiAobikgZm9yICh2YXIgcyA9IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoYSwgZSksIGwgPSAwLCBjID0gbjsgbCA8IGMubGVuZ3RoOyBsICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB1ID0gY1tsXTtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHUuY29vcmQueCAtIHMueCkgPD0gbyAmJiBNYXRoLmFicyh1LmNvb3JkLnkgLSBzLnkpIDw9IG8gJiYgIWlbdS5jcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgaVt1LmNyb3NzVGlsZUlEXSA9ICEwLCBhLmNyb3NzVGlsZUlEID0gdS5jcm9zc1RpbGVJRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBCZSA9IGZ1bmN0aW9uIEJlKCkge1xuICAgICAgdGhpcy5tYXhDcm9zc1RpbGVJRCA9IDA7XG4gICAgfTtcblxuICAgIEJlLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiArK3RoaXMubWF4Q3Jvc3NUaWxlSUQ7XG4gICAgfTtcblxuICAgIHZhciBPZSA9IGZ1bmN0aW9uIE9lKCkge1xuICAgICAgdGhpcy5pbmRleGVzID0ge30sIHRoaXMudXNlZENyb3NzVGlsZUlEcyA9IHt9LCB0aGlzLmxuZyA9IDA7XG4gICAgfTtcblxuICAgIE9lLnByb3RvdHlwZS5oYW5kbGVXcmFwSnVtcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IE1hdGgucm91bmQoKHQgLSB0aGlzLmxuZykgLyAzNjApO1xuICAgICAgaWYgKDAgIT09IGUpIGZvciAodmFyIGkgaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5pbmRleGVzW2ldLFxuICAgICAgICAgICAgciA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGEgaW4gbykge1xuICAgICAgICAgIHZhciBuID0gb1thXTtcbiAgICAgICAgICBuLnRpbGVJRCA9IG4udGlsZUlELnVud3JhcFRvKG4udGlsZUlELndyYXAgKyBlKSwgcltuLnRpbGVJRC5rZXldID0gbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kZXhlc1tpXSA9IHI7XG4gICAgICB9XG4gICAgICB0aGlzLmxuZyA9IHQ7XG4gICAgfSwgT2UucHJvdG90eXBlLmFkZEJ1Y2tldCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAodGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdICYmIHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0uYnVja2V0SW5zdGFuY2VJZCA9PT0gZS5idWNrZXRJbnN0YW5jZUlkKSByZXR1cm4gITE7XG4gICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHQub3ZlcnNjYWxlZFosIHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXVt0LmtleV0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGUuc3ltYm9sSW5zdGFuY2VzLmdldChvKS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXNlZENyb3NzVGlsZUlEc1t0Lm92ZXJzY2FsZWRaXSB8fCAodGhpcy51c2VkQ3Jvc3NUaWxlSURzW3Qub3ZlcnNjYWxlZFpdID0ge30pO1xuICAgICAgdmFyIHIgPSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdC5vdmVyc2NhbGVkWl07XG5cbiAgICAgIGZvciAodmFyIGEgaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIHZhciBuID0gdGhpcy5pbmRleGVzW2FdO1xuICAgICAgICBpZiAoTnVtYmVyKGEpID4gdC5vdmVyc2NhbGVkWikgZm9yICh2YXIgcyBpbiBuKSB7XG4gICAgICAgICAgdmFyIGwgPSBuW3NdO1xuICAgICAgICAgIGwudGlsZUlELmlzQ2hpbGRPZih0KSAmJiBsLmZpbmRNYXRjaGVzKGUuc3ltYm9sSW5zdGFuY2VzLCB0LCByKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYyA9IG5bdC5zY2FsZWRUbyhOdW1iZXIoYSkpLmtleV07XG4gICAgICAgICAgYyAmJiBjLmZpbmRNYXRjaGVzKGUuc3ltYm9sSW5zdGFuY2VzLCB0LCByKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGUuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgIHZhciBoID0gZS5zeW1ib2xJbnN0YW5jZXMuZ2V0KHUpO1xuICAgICAgICBoLmNyb3NzVGlsZUlEIHx8IChoLmNyb3NzVGlsZUlEID0gaS5nZW5lcmF0ZSgpLCByW2guY3Jvc3NUaWxlSURdID0gITApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdm9pZCAwID09PSB0aGlzLmluZGV4ZXNbdC5vdmVyc2NhbGVkWl0gJiYgKHRoaXMuaW5kZXhlc1t0Lm92ZXJzY2FsZWRaXSA9IHt9KSwgdGhpcy5pbmRleGVzW3Qub3ZlcnNjYWxlZFpdW3Qua2V5XSA9IG5ldyBrZSh0LCBlLnN5bWJvbEluc3RhbmNlcywgZS5idWNrZXRJbnN0YW5jZUlkKSwgITA7XG4gICAgfSwgT2UucHJvdG90eXBlLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciBpIGluIGUuaW5kZXhlZFN5bWJvbEluc3RhbmNlcykge1xuICAgICAgICBmb3IgKHZhciBvID0gMCwgciA9IGUuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1tpXTsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RdW3Jbb10uY3Jvc3NUaWxlSURdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgT2UucHJvdG90eXBlLnJlbW92ZVN0YWxlQnVja2V0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9ICExO1xuXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICB2YXIgbyA9IHRoaXMuaW5kZXhlc1tpXTtcblxuICAgICAgICBmb3IgKHZhciByIGluIG8pIHtcbiAgICAgICAgICB0W29bcl0uYnVja2V0SW5zdGFuY2VJZF0gfHwgKHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKGksIG9bcl0pLCBkZWxldGUgb1tyXSwgZSA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9O1xuXG4gICAgdmFyIEZlID0gZnVuY3Rpb24gRmUoKSB7XG4gICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9LCB0aGlzLmNyb3NzVGlsZUlEcyA9IG5ldyBCZSgpLCB0aGlzLm1heEJ1Y2tldEluc3RhbmNlSWQgPSAwLCB0aGlzLmJ1Y2tldHNJbkN1cnJlbnRQbGFjZW1lbnQgPSB7fTtcbiAgICB9O1xuXG4gICAgRmUucHJvdG90eXBlLmFkZExheWVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcy5sYXllckluZGV4ZXNbdC5pZF07XG4gICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB0aGlzLmxheWVySW5kZXhlc1t0LmlkXSA9IG5ldyBPZSgpKTtcbiAgICAgIHZhciByID0gITEsXG4gICAgICAgICAgYSA9IHt9O1xuICAgICAgby5oYW5kbGVXcmFwSnVtcChpKTtcblxuICAgICAgZm9yICh2YXIgbiA9IDAsIHMgPSBlOyBuIDwgcy5sZW5ndGg7IG4gKz0gMSkge1xuICAgICAgICB2YXIgbCA9IHNbbl0sXG4gICAgICAgICAgICBjID0gbC5nZXRCdWNrZXQodCk7XG4gICAgICAgIGMgJiYgdC5pZCA9PT0gYy5sYXllcklkc1swXSAmJiAoYy5idWNrZXRJbnN0YW5jZUlkIHx8IChjLmJ1Y2tldEluc3RhbmNlSWQgPSArK3RoaXMubWF4QnVja2V0SW5zdGFuY2VJZCksIG8uYWRkQnVja2V0KGwudGlsZUlELCBjLCB0aGlzLmNyb3NzVGlsZUlEcykgJiYgKHIgPSAhMCksIGFbYy5idWNrZXRJbnN0YW5jZUlkXSA9ICEwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG8ucmVtb3ZlU3RhbGVCdWNrZXRzKGEpICYmIChyID0gITApLCByO1xuICAgIH0sIEZlLnByb3RvdHlwZS5wcnVuZVVudXNlZExheWVycyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBpIGluIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICBlW3RdID0gITA7XG4gICAgICB9KSwgdGhpcy5sYXllckluZGV4ZXMpIHtcbiAgICAgICAgZVtpXSB8fCBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbaV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBVZSA9IGZ1bmN0aW9uIFVlKGUsIGkpIHtcbiAgICAgIHJldHVybiB0LmVtaXRWYWxpZGF0aW9uRXJyb3JzKGUsIGkgJiYgaS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwic291cmNlLmNhbnZhc1wiICE9PSB0LmlkZW50aWZpZXI7XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICAgICAgTmUgPSB0LnBpY2soWnQsIFtcImFkZExheWVyXCIsIFwicmVtb3ZlTGF5ZXJcIiwgXCJzZXRQYWludFByb3BlcnR5XCIsIFwic2V0TGF5b3V0UHJvcGVydHlcIiwgXCJzZXRGaWx0ZXJcIiwgXCJhZGRTb3VyY2VcIiwgXCJyZW1vdmVTb3VyY2VcIiwgXCJzZXRMYXllclpvb21SYW5nZVwiLCBcInNldExpZ2h0XCIsIFwic2V0VHJhbnNpdGlvblwiLCBcInNldEdlb0pTT05Tb3VyY2VEYXRhXCJdKSxcbiAgICAgICAgWmUgPSB0LnBpY2soWnQsIFtcInNldENlbnRlclwiLCBcInNldFpvb21cIiwgXCJzZXRCZWFyaW5nXCIsIFwic2V0UGl0Y2hcIl0pLFxuICAgICAgICBxZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0ge30sXG4gICAgICAgICAgaSA9IHQuc3R5bGVTcGVjLiR2ZXJzaW9uO1xuXG4gICAgICBmb3IgKHZhciBvIGluIHQuc3R5bGVTcGVjLiRyb290KSB7XG4gICAgICAgIHZhciByLFxuICAgICAgICAgICAgYSA9IHQuc3R5bGVTcGVjLiRyb290W29dO1xuICAgICAgICBpZiAoYS5yZXF1aXJlZCkgbnVsbCAhPSAociA9IFwidmVyc2lvblwiID09PSBvID8gaSA6IFwiYXJyYXlcIiA9PT0gYS50eXBlID8gW10gOiB7fSkgJiYgKGVbb10gPSByKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGU7XG4gICAgfSgpLFxuICAgICAgICBqZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKG8sIHIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzO1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIGUuY2FsbCh0aGlzKSwgdGhpcy5tYXAgPSBvLCB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRShGdCgpLCB0aGlzKSwgdGhpcy5pbWFnZU1hbmFnZXIgPSBuZXcgcCgpLCB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KHRoaXMpLCB0aGlzLmdseXBoTWFuYWdlciA9IG5ldyB5KG8uX3JlcXVlc3RNYW5hZ2VyLCByLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSksIHRoaXMubGluZUF0bGFzID0gbmV3IFQoMjU2LCA1MTIpLCB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IEZlKCksIHRoaXMuX2xheWVycyA9IHt9LCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzID0ge30sIHRoaXMuX29yZGVyID0gW10sIHRoaXMuc291cmNlQ2FjaGVzID0ge30sIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgdC5ab29tSGlzdG9yeSgpLCB0aGlzLl9sb2FkZWQgPSAhMSwgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gW10sIHRoaXMuX3Jlc2V0VXBkYXRlcygpLCB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0UmVmZXJyZXJcIiwgdC5nZXRSZWZlcnJlcigpKTtcbiAgICAgICAgdmFyIG4gPSB0aGlzO1xuICAgICAgICB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2sgPSBpLnJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2UoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBuLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic3luY1JUTFBsdWdpblN0YXRlXCIsIHtcbiAgICAgICAgICAgIHBsdWdpblN0YXR1czogZS5wbHVnaW5TdGF0dXMsXG4gICAgICAgICAgICBwbHVnaW5VUkw6IGUucGx1Z2luVVJMXG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICAgIGlmICh0LnRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQoZSksIGkgJiYgaS5ldmVyeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0pKSBmb3IgKHZhciBvIGluIG4uc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgIG4uc291cmNlQ2FjaGVzW29dLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSwgdGhpcy5vbihcImRhdGFcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoXCJzb3VyY2VcIiA9PT0gdC5kYXRhVHlwZSAmJiBcIm1ldGFkYXRhXCIgPT09IHQuc291cmNlRGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHZhciBlID0gYS5zb3VyY2VDYWNoZXNbdC5zb3VyY2VJZF07XG5cbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIHZhciBpID0gZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgaWYgKGkgJiYgaS52ZWN0b3JMYXllcklkcykgZm9yICh2YXIgbyBpbiBhLl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IGEuX2xheWVyc1tvXTtcbiAgICAgICAgICAgICAgICByLnNvdXJjZSA9PT0gaS5pZCAmJiBhLl92YWxpZGF0ZUxheWVyKHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUubG9hZFVSTCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZhciBvID0gdGhpcztcbiAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0ge30pLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7XG4gICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICB9KSk7XG4gICAgICAgIHZhciByID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIGkudmFsaWRhdGUgPyBpLnZhbGlkYXRlIDogIXQuaXNNYXBib3hVUkwoZSk7XG4gICAgICAgIGUgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplU3R5bGVVUkwoZSwgaS5hY2Nlc3NUb2tlbik7XG5cbiAgICAgICAgdmFyIGEgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChlLCB0LlJlc291cmNlVHlwZS5TdHlsZSk7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IHQuZ2V0SlNPTihhLCBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIG8uX3JlcXVlc3QgPSBudWxsLCBlID8gby5maXJlKG5ldyB0LkVycm9yRXZlbnQoZSkpIDogaSAmJiBvLl9sb2FkKGksIHIpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRKU09OID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuICAgICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSB7fSksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFsb2FkaW5nXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzdHlsZVwiXG4gICAgICAgIH0pKSwgdGhpcy5fcmVxdWVzdCA9IHQuYnJvd3Nlci5mcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgby5fcmVxdWVzdCA9IG51bGwsIG8uX2xvYWQoZSwgITEgIT09IGkudmFsaWRhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxvYWRFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YWxvYWRpbmdcIiwge1xuICAgICAgICAgIGRhdGFUeXBlOiBcInN0eWxlXCJcbiAgICAgICAgfSkpLCB0aGlzLl9sb2FkKHFlLCAhMSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fbG9hZCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIGlmICghaSB8fCAhVWUodGhpcywgdC52YWxpZGF0ZVN0eWxlKGUpKSkge1xuICAgICAgICAgIGZvciAodmFyIG8gaW4gdGhpcy5fbG9hZGVkID0gITAsIHRoaXMuc3R5bGVzaGVldCA9IGUsIGUuc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UobywgZS5zb3VyY2VzW29dLCB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZS5zcHJpdGUgPyB0aGlzLl9sb2FkU3ByaXRlKGUuc3ByaXRlKSA6IHRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCghMCksIHRoaXMuZ2x5cGhNYW5hZ2VyLnNldFVSTChlLmdseXBocyk7XG4gICAgICAgICAgdmFyIHIgPSBOdCh0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTtcbiAgICAgICAgICB0aGlzLl9vcmRlciA9IHIubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5pZDtcbiAgICAgICAgICB9KSwgdGhpcy5fbGF5ZXJzID0ge30sIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMgPSB7fTtcblxuICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gcjsgYSA8IG4ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBzID0gblthXTtcbiAgICAgICAgICAgIChzID0gdC5jcmVhdGVTdHlsZUxheWVyKHMpKS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgbGF5ZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogcy5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgdGhpcy5fbGF5ZXJzW3MuaWRdID0gcywgdGhpcy5fc2VyaWFsaXplZExheWVyc1tzLmlkXSA9IHMuc2VyaWFsaXplKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcInNldExheWVyc1wiLCB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpKSwgdGhpcy5saWdodCA9IG5ldyB3KHRoaXMuc3R5bGVzaGVldC5saWdodCksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwic3R5bGUubG9hZFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl9sb2FkU3ByaXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICAgIHZhciByLFxuICAgICAgICAgICAgICBhLFxuICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICBzID0gdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxID8gXCJAMnhcIiA6IFwiXCIsXG4gICAgICAgICAgICAgIGwgPSB0LmdldEpTT04oaS50cmFuc2Zvcm1SZXF1ZXN0KGkubm9ybWFsaXplU3ByaXRlVVJMKGUsIHMsIFwiLmpzb25cIiksIHQuUmVzb3VyY2VUeXBlLlNwcml0ZUpTT04pLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgbCA9IG51bGwsIG4gfHwgKG4gPSB0LCByID0gZSwgdSgpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgYyA9IHQuZ2V0SW1hZ2UoaS50cmFuc2Zvcm1SZXF1ZXN0KGkubm9ybWFsaXplU3ByaXRlVVJMKGUsIHMsIFwiLnBuZ1wiKSwgdC5SZXNvdXJjZVR5cGUuU3ByaXRlSW1hZ2UpLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgYyA9IG51bGwsIG4gfHwgKG4gPSB0LCBhID0gZSwgdSgpKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG4gICAgICAgICAgICBpZiAobikgbyhuKTtlbHNlIGlmIChyICYmIGEpIHtcbiAgICAgICAgICAgICAgdmFyIGUgPSB0LmJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGEpLFxuICAgICAgICAgICAgICAgICAgaSA9IHt9O1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gcikge1xuICAgICAgICAgICAgICAgIHZhciBsID0gcltzXSxcbiAgICAgICAgICAgICAgICAgICAgYyA9IGwud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHUgPSBsLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgaCA9IGwueCxcbiAgICAgICAgICAgICAgICAgICAgcCA9IGwueSxcbiAgICAgICAgICAgICAgICAgICAgZCA9IGwuc2RmLFxuICAgICAgICAgICAgICAgICAgICBfID0gbC5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBmID0gbC5zdHJldGNoWCxcbiAgICAgICAgICAgICAgICAgICAgbSA9IGwuc3RyZXRjaFksXG4gICAgICAgICAgICAgICAgICAgIGcgPSBsLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgdC5SR0JBSW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IGMsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IHVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0LlJHQkFJbWFnZS5jb3B5KGUsIHYsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGgsXG4gICAgICAgICAgICAgICAgICB5OiBwXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogYyxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogdVxuICAgICAgICAgICAgICAgIH0pLCBpW3NdID0ge1xuICAgICAgICAgICAgICAgICAgZGF0YTogdixcbiAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IF8sXG4gICAgICAgICAgICAgICAgICBzZGY6IGQsXG4gICAgICAgICAgICAgICAgICBzdHJldGNoWDogZixcbiAgICAgICAgICAgICAgICAgIHN0cmV0Y2hZOiBtLFxuICAgICAgICAgICAgICAgICAgY29udGVudDogZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBvKG51bGwsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgbCAmJiAobC5jYW5jZWwoKSwgbCA9IG51bGwpLCBjICYmIChjLmNhbmNlbCgpLCBjID0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfShlLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIGZ1bmN0aW9uIChlLCBvKSB7XG4gICAgICAgICAgaWYgKGkuX3Nwcml0ZVJlcXVlc3QgPSBudWxsLCBlKSBpLmZpcmUobmV3IHQuRXJyb3JFdmVudChlKSk7ZWxzZSBpZiAobykgZm9yICh2YXIgciBpbiBvKSB7XG4gICAgICAgICAgICBpLmltYWdlTWFuYWdlci5hZGRJbWFnZShyLCBvW3JdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKCEwKSwgaS5fYXZhaWxhYmxlSW1hZ2VzID0gaS5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpLCBpLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0SW1hZ2VzXCIsIGkuX2F2YWlsYWJsZUltYWdlcyksIGkuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGVMYXllciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdO1xuXG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgdmFyIG8gPSBlLnNvdXJjZUxheWVyO1xuXG4gICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgIHZhciByID0gaS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIChcImdlb2pzb25cIiA9PT0gci50eXBlIHx8IHIudmVjdG9yTGF5ZXJJZHMgJiYgLTEgPT09IHIudmVjdG9yTGF5ZXJJZHMuaW5kZXhPZihvKSkgJiYgdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKCdTb3VyY2UgbGF5ZXIgXCInICsgbyArICdcIiBkb2VzIG5vdCBleGlzdCBvbiBzb3VyY2UgXCInICsgci5pZCArICdcIiBhcyBzcGVjaWZpZWQgYnkgc3R5bGUgbGF5ZXIgXCInICsgZS5pZCArICdcIicpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKSByZXR1cm4gITE7XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VDYWNoZXNbdF0ubG9hZGVkKCkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMuaW1hZ2VNYW5hZ2VyLmlzTG9hZGVkKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fc2VyaWFsaXplTGF5ZXJzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBpID0gMCwgbyA9IHQ7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9sYXllcnNbb1tpXV07XG4gICAgICAgICAgXCJjdXN0b21cIiAhPT0gci50eXBlICYmIGUucHVzaChyLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpZ2h0ICYmIHRoaXMubGlnaHQuaGFzVHJhbnNpdGlvbigpKSByZXR1cm4gITA7XG5cbiAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1t0XS5oYXNUcmFuc2l0aW9uKCkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tlXS5oYXNUcmFuc2l0aW9uKCkpIHJldHVybiAhMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9jaGVja0xvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHRocm93IG5ldyBFcnJvcihcIlN0eWxlIGlzIG5vdCBkb25lIGxvYWRpbmdcIik7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLl9jaGFuZ2VkO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWQpIHtcbiAgICAgICAgICAgIHZhciBvID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyksXG4gICAgICAgICAgICAgICAgciA9IE9iamVjdC5rZXlzKHRoaXMuX3JlbW92ZWRMYXllcnMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhIGluIChvLmxlbmd0aCB8fCByLmxlbmd0aCkgJiYgdGhpcy5fdXBkYXRlV29ya2VyTGF5ZXJzKG8sIHIpLCB0aGlzLl91cGRhdGVkU291cmNlcykge1xuICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2FdO1xuICAgICAgICAgICAgICBcInJlbG9hZFwiID09PSBuID8gdGhpcy5fcmVsb2FkU291cmNlKGEpIDogXCJjbGVhclwiID09PSBuICYmIHRoaXMuX2NsZWFyU291cmNlKGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIHRoaXMuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpLCB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcykge1xuICAgICAgICAgICAgICB0aGlzLl9sYXllcnNbc10udXBkYXRlVHJhbnNpdGlvbnMoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGlnaHQudXBkYXRlVHJhbnNpdGlvbnMoZSksIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsID0ge307XG5cbiAgICAgICAgICBmb3IgKHZhciBjIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdSA9IHRoaXMuc291cmNlQ2FjaGVzW2NdO1xuICAgICAgICAgICAgbFtjXSA9IHUudXNlZCwgdS51c2VkID0gITE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgaCA9IDAsIHAgPSB0aGlzLl9vcmRlcjsgaCA8IHAubGVuZ3RoOyBoICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBkID0gdGhpcy5fbGF5ZXJzW3BbaF1dO1xuICAgICAgICAgICAgZC5yZWNhbGN1bGF0ZShlLCB0aGlzLl9hdmFpbGFibGVJbWFnZXMpLCAhZC5pc0hpZGRlbihlLnpvb20pICYmIGQuc291cmNlICYmICh0aGlzLnNvdXJjZUNhY2hlc1tkLnNvdXJjZV0udXNlZCA9ICEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBfIGluIGwpIHtcbiAgICAgICAgICAgIHZhciBmID0gdGhpcy5zb3VyY2VDYWNoZXNbX107XG4gICAgICAgICAgICBsW19dICE9PSBmLnVzZWQgJiYgZi5maXJlKG5ldyB0LkV2ZW50KFwiZGF0YVwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcInZpc2liaWxpdHlcIixcbiAgICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIHNvdXJjZUlkOiBfXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZShlKSwgdGhpcy56ID0gZS56b29tLCBpICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRhdGFcIiwge1xuICAgICAgICAgICAgZGF0YVR5cGU6IFwic3R5bGVcIlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSBPYmplY3Qua2V5cyh0aGlzLl9jaGFuZ2VkSW1hZ2VzKTtcblxuICAgICAgICBpZiAodC5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBlIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tlXS5yZWxvYWRUaWxlc0ZvckRlcGVuZGVuY2llcyhbXCJpY29uc1wiLCBcInBhdHRlcm5zXCJdLCB0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jaGFuZ2VkSW1hZ2VzID0ge307XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVXb3JrZXJMYXllcnMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwidXBkYXRlTGF5ZXJzXCIsIHtcbiAgICAgICAgICBsYXllcnM6IHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0KSxcbiAgICAgICAgICByZW1vdmVkSWRzOiBlXG4gICAgICAgIH0pO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3Jlc2V0VXBkYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9ICExLCB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge30sIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fSwgdGhpcy5fdXBkYXRlZFNvdXJjZXMgPSB7fSwgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMgPSB7fSwgdGhpcy5fY2hhbmdlZEltYWdlcyA9IHt9O1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0xvYWRlZCgpLCBVZSh0aGlzLCB0LnZhbGlkYXRlU3R5bGUoZSkpKSByZXR1cm4gITE7XG4gICAgICAgIChlID0gdC5jbG9uZSQxKGUpKS5sYXllcnMgPSBOdChlLmxheWVycyk7XG5cbiAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIFt7XG4gICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgIGFyZ3M6IFtpXVxuICAgICAgICAgIH1dO1xuICAgICAgICAgIHZhciBvID0gW107XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChlLnZlcnNpb24sIGkudmVyc2lvbikpIHJldHVybiBbe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgICAgYXJnczogW2ldXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIHQuZGVlcEVxdWFsKGUuY2VudGVyLCBpLmNlbnRlcikgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0Q2VudGVyLFxuICAgICAgICAgICAgICBhcmdzOiBbaS5jZW50ZXJdXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS56b29tLCBpLnpvb20pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldFpvb20sXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLnpvb21dXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5iZWFyaW5nLCBpLmJlYXJpbmcpIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldEJlYXJpbmcsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLmJlYXJpbmddXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5waXRjaCwgaS5waXRjaCkgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0UGl0Y2gsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLnBpdGNoXVxuICAgICAgICAgICAgfSksIHQuZGVlcEVxdWFsKGUuc3ByaXRlLCBpLnNwcml0ZSkgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0U3ByaXRlLFxuICAgICAgICAgICAgICBhcmdzOiBbaS5zcHJpdGVdXG4gICAgICAgICAgICB9KSwgdC5kZWVwRXF1YWwoZS5nbHlwaHMsIGkuZ2x5cGhzKSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRHbHlwaHMsXG4gICAgICAgICAgICAgIGFyZ3M6IFtpLmdseXBoc11cbiAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChlLnRyYW5zaXRpb24sIGkudHJhbnNpdGlvbikgfHwgby5wdXNoKHtcbiAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0VHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgYXJnczogW2kudHJhbnNpdGlvbl1cbiAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChlLmxpZ2h0LCBpLmxpZ2h0KSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRMaWdodCxcbiAgICAgICAgICAgICAgYXJnczogW2kubGlnaHRdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciByID0ge30sXG4gICAgICAgICAgICAgICAgYSA9IFtdO1xuICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgICAgICAgIHZhciBhO1xuXG4gICAgICAgICAgICAgIGZvciAoYSBpbiBpID0gaSB8fCB7fSwgZSA9IGUgfHwge30pIHtcbiAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KGEpICYmIChpLmhhc093blByb3BlcnR5KGEpIHx8IGp0KGEsIG8sIHIpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoYSBpbiBpKSB7XG4gICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShhKSAmJiAoZS5oYXNPd25Qcm9wZXJ0eShhKSA/IHQuZGVlcEVxdWFsKGVbYV0sIGlbYV0pIHx8IChcImdlb2pzb25cIiA9PT0gZVthXS50eXBlICYmIFwiZ2VvanNvblwiID09PSBpW2FdLnR5cGUgJiYgR3QoZSwgaSwgYSkgPyBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0R2VvSlNPTlNvdXJjZURhdGEsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbYSwgaVthXS5kYXRhXVxuICAgICAgICAgICAgICAgIH0pIDogVnQoYSwgaSwgbywgcikpIDogcXQoYSwgaSwgbykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KGUuc291cmNlcywgaS5zb3VyY2VzLCBhLCByKTtcbiAgICAgICAgICAgIHZhciBuID0gW107XG4gICAgICAgICAgICBlLmxheWVycyAmJiBlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHJbdC5zb3VyY2VdID8gby5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5yZW1vdmVMYXllcixcbiAgICAgICAgICAgICAgICBhcmdzOiBbdC5pZF1cbiAgICAgICAgICAgICAgfSkgOiBuLnB1c2godCk7XG4gICAgICAgICAgICB9KSwgbyA9IG8uY29uY2F0KGEpLCBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICAgICAgICBpID0gaSB8fCBbXTtcblxuICAgICAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgICBuLFxuICAgICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICAgIGwsXG4gICAgICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgICAgICAgdSxcbiAgICAgICAgICAgICAgICAgIGggPSAoZSA9IGUgfHwgW10pLm1hcChYdCksXG4gICAgICAgICAgICAgICAgICBwID0gaS5tYXAoWHQpLFxuICAgICAgICAgICAgICAgICAgZCA9IGUucmVkdWNlKEh0LCB7fSksXG4gICAgICAgICAgICAgICAgICBfID0gaS5yZWR1Y2UoSHQsIHt9KSxcbiAgICAgICAgICAgICAgICAgIGYgPSBoLnNsaWNlKCksXG4gICAgICAgICAgICAgICAgICBtID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwLCBhID0gMDsgciA8IGgubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBfLmhhc093blByb3BlcnR5KG4gPSBoW3JdKSA/IGErKyA6IChvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQucmVtb3ZlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbl1cbiAgICAgICAgICAgICAgICB9KSwgZi5zcGxpY2UoZi5pbmRleE9mKG4sIGEpLCAxKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwLCBhID0gMDsgciA8IHAubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBmW2YubGVuZ3RoIC0gMSAtIHJdICE9PSAobiA9IHBbcC5sZW5ndGggLSAxIC0gcl0pICYmIChkLmhhc093blByb3BlcnR5KG4pID8gKG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5yZW1vdmVMYXllcixcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtuXVxuICAgICAgICAgICAgICAgIH0pLCBmLnNwbGljZShmLmxhc3RJbmRleE9mKG4sIGYubGVuZ3RoIC0gYSksIDEpKSA6IGErKywgby5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LmFkZExheWVyLFxuICAgICAgICAgICAgICAgICAgYXJnczogW19bbl0sIGMgPSBmW2YubGVuZ3RoIC0gcl1dXG4gICAgICAgICAgICAgICAgfSksIGYuc3BsaWNlKGYubGVuZ3RoIC0gciwgMCwgbiksIG1bbl0gPSAhMCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKHIgPSAwOyByIDwgcC5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGlmIChzID0gZFtuID0gcFtyXV0sIGwgPSBfW25dLCAhbVtuXSAmJiAhdC5kZWVwRXF1YWwocywgbCkpIGlmICh0LmRlZXBFcXVhbChzLnNvdXJjZSwgbC5zb3VyY2UpICYmIHQuZGVlcEVxdWFsKHNbXCJzb3VyY2UtbGF5ZXJcIl0sIGxbXCJzb3VyY2UtbGF5ZXJcIl0pICYmIHQuZGVlcEVxdWFsKHMudHlwZSwgbC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgZm9yICh1IGluIFd0KHMubGF5b3V0LCBsLmxheW91dCwgbywgbiwgbnVsbCwgWnQuc2V0TGF5b3V0UHJvcGVydHkpLCBXdChzLnBhaW50LCBsLnBhaW50LCBvLCBuLCBudWxsLCBadC5zZXRQYWludFByb3BlcnR5KSwgdC5kZWVwRXF1YWwocy5maWx0ZXIsIGwuZmlsdGVyKSB8fCBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtuLCBsLmZpbHRlcl1cbiAgICAgICAgICAgICAgICAgIH0pLCB0LmRlZXBFcXVhbChzLm1pbnpvb20sIGwubWluem9vbSkgJiYgdC5kZWVwRXF1YWwocy5tYXh6b29tLCBsLm1heHpvb20pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFp0LnNldExheWVyWm9vbVJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgbC5taW56b29tLCBsLm1heHpvb21dXG4gICAgICAgICAgICAgICAgICB9KSwgcykge1xuICAgICAgICAgICAgICAgICAgICBzLmhhc093blByb3BlcnR5KHUpICYmIFwibGF5b3V0XCIgIT09IHUgJiYgXCJwYWludFwiICE9PSB1ICYmIFwiZmlsdGVyXCIgIT09IHUgJiYgXCJtZXRhZGF0YVwiICE9PSB1ICYmIFwibWluem9vbVwiICE9PSB1ICYmIFwibWF4em9vbVwiICE9PSB1ICYmICgwID09PSB1LmluZGV4T2YoXCJwYWludC5cIikgPyBXdChzW3VdLCBsW3VdLCBvLCBuLCB1LnNsaWNlKDYpLCBadC5zZXRQYWludFByb3BlcnR5KSA6IHQuZGVlcEVxdWFsKHNbdV0sIGxbdV0pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0TGF5ZXJQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgdSwgbFt1XV1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBmb3IgKHUgaW4gbCkge1xuICAgICAgICAgICAgICAgICAgICBsLmhhc093blByb3BlcnR5KHUpICYmICFzLmhhc093blByb3BlcnR5KHUpICYmIFwibGF5b3V0XCIgIT09IHUgJiYgXCJwYWludFwiICE9PSB1ICYmIFwiZmlsdGVyXCIgIT09IHUgJiYgXCJtZXRhZGF0YVwiICE9PSB1ICYmIFwibWluem9vbVwiICE9PSB1ICYmIFwibWF4em9vbVwiICE9PSB1ICYmICgwID09PSB1LmluZGV4T2YoXCJwYWludC5cIikgPyBXdChzW3VdLCBsW3VdLCBvLCBuLCB1LnNsaWNlKDYpLCBadC5zZXRQYWludFByb3BlcnR5KSA6IHQuZGVlcEVxdWFsKHNbdV0sIGxbdV0pIHx8IG8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuc2V0TGF5ZXJQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbbiwgdSwgbFt1XV1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQucmVtb3ZlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbl1cbiAgICAgICAgICAgICAgICB9KSwgYyA9IGZbZi5sYXN0SW5kZXhPZihuKSArIDFdLCBvLnB1c2goe1xuICAgICAgICAgICAgICAgICAgY29tbWFuZDogWnQuYWRkTGF5ZXIsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbbCwgY11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfShuLCBpLmxheWVycywgbyk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIGNvbXB1dGUgc3R5bGUgZGlmZjpcIiwgdCksIG8gPSBbe1xuICAgICAgICAgICAgICBjb21tYW5kOiBadC5zZXRTdHlsZSxcbiAgICAgICAgICAgICAgYXJnczogW2ldXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfSh0aGlzLnNlcmlhbGl6ZSgpLCBlKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gISh0LmNvbW1hbmQgaW4gWmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoMCA9PT0gby5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgdmFyIHIgPSBvLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiAhKHQuY29tbWFuZCBpbiBOZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoci5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkOiBcIiArIHIubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQuY29tbWFuZDtcbiAgICAgICAgfSkuam9pbihcIiwgXCIpICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgXCJzZXRUcmFuc2l0aW9uXCIgIT09IHQuY29tbWFuZCAmJiBpW3QuY29tbWFuZF0uYXBwbHkoaSwgdC5hcmdzKTtcbiAgICAgICAgfSksIHRoaXMuc3R5bGVzaGVldCA9IGUsICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAodGhpcy5nZXRJbWFnZShlKSkgcmV0dXJuIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkFuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLlwiKSkpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShlLCBpKSwgdGhpcy5fYWZ0ZXJJbWFnZVVwZGF0ZWQoZSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS51cGRhdGVJbWFnZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnVwZGF0ZUltYWdlKHQsIGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0SW1hZ2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2UodCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXRJbWFnZShlKSkgcmV0dXJuIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIk5vIGltYWdlIHdpdGggdGhpcyBuYW1lIGV4aXN0cy5cIikpKTtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UoZSksIHRoaXMuX2FmdGVySW1hZ2VVcGRhdGVkKGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2FmdGVySW1hZ2VVcGRhdGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gdGhpcy5pbWFnZU1hbmFnZXIubGlzdEltYWdlcygpLCB0aGlzLl9jaGFuZ2VkSW1hZ2VzW2VdID0gITAsIHRoaXMuX2NoYW5nZWQgPSAhMCwgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcInNldEltYWdlc1wiLCB0aGlzLl9hdmFpbGFibGVJbWFnZXMpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBkYXRhVHlwZTogXCJzdHlsZVwiXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmxpc3RJbWFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja0xvYWRlZCgpLCB0aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hZGRTb3VyY2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2YXIgciA9IHRoaXM7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHRoaXMuX2NoZWNrTG9hZGVkKCksIHZvaWQgMCAhPT0gdGhpcy5zb3VyY2VDYWNoZXNbZV0pIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIGFscmVhZHkgYSBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO1xuICAgICAgICBpZiAoIWkudHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogXCIgKyBPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikgKyBcIi5cIik7XG5cbiAgICAgICAgaWYgKCEoW1widmVjdG9yXCIsIFwicmFzdGVyXCIsIFwiZ2VvanNvblwiLCBcInZpZGVvXCIsIFwiaW1hZ2VcIl0uaW5kZXhPZihpLnR5cGUpID49IDAgJiYgdGhpcy5fdmFsaWRhdGUodC52YWxpZGF0ZVN0eWxlLnNvdXJjZSwgXCJzb3VyY2VzLlwiICsgZSwgaSwgbnVsbCwgbykpKSB7XG4gICAgICAgICAgdGhpcy5tYXAgJiYgdGhpcy5tYXAuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiAoaS5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSAhMCk7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzLnNvdXJjZUNhY2hlc1tlXSA9IG5ldyBEdChlLCBpLCB0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgIGEuc3R5bGUgPSB0aGlzLCBhLnNldEV2ZW50ZWRQYXJlbnQodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaXNTb3VyY2VMb2FkZWQ6IHIubG9hZGVkKCksXG4gICAgICAgICAgICAgIHNvdXJjZTogYS5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgICAgc291cmNlSWQ6IGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksIGEub25BZGQodGhpcy5tYXApLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZVNvdXJjZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0xvYWRlZCgpLCB2b2lkIDAgPT09IHRoaXMuc291cmNlQ2FjaGVzW2VdKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEXCIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tpXS5zb3VyY2UgPT09IGUpIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoJ1NvdXJjZSBcIicgKyBlICsgJ1wiIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGxheWVyIFwiJyArIGkgKyAnXCIgaXMgdXNpbmcgaXQuJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvID0gdGhpcy5zb3VyY2VDYWNoZXNbZV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZUNhY2hlc1tlXSwgZGVsZXRlIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2VdLCBvLmZpcmUobmV3IHQuRXZlbnQoXCJkYXRhXCIsIHtcbiAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJtZXRhZGF0YVwiLFxuICAgICAgICAgIGRhdGFUeXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgIHNvdXJjZUlkOiBlXG4gICAgICAgIH0pKSwgby5zZXRFdmVudGVkUGFyZW50KG51bGwpLCBvLmNsZWFyVGlsZXMoKSwgby5vblJlbW92ZSAmJiBvLm9uUmVtb3ZlKHRoaXMubWFwKSwgdGhpcy5fY2hhbmdlZCA9ICEwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0R2VvSlNPTlNvdXJjZURhdGEgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpLCB0aGlzLnNvdXJjZUNhY2hlc1t0XS5nZXRTb3VyY2UoKS5zZXREYXRhKGUpLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VDYWNoZXNbdF0gJiYgdGhpcy5zb3VyY2VDYWNoZXNbdF0uZ2V0U291cmNlKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hZGRMYXllciA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIHIgPSBlLmlkO1xuICAgICAgICBpZiAodGhpcy5nZXRMYXllcihyKSkgdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKCdMYXllciB3aXRoIGlkIFwiJyArIHIgKyAnXCIgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBtYXAnKSkpO2Vsc2Uge1xuICAgICAgICAgIHZhciBhO1xuXG4gICAgICAgICAgaWYgKFwiY3VzdG9tXCIgPT09IGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKFVlKHRoaXMsIHQudmFsaWRhdGVDdXN0b21TdHlsZUxheWVyKGUpKSkgcmV0dXJuO1xuICAgICAgICAgICAgYSA9IHQuY3JlYXRlU3R5bGVMYXllcihlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIGUuc291cmNlICYmICh0aGlzLmFkZFNvdXJjZShyLCBlLnNvdXJjZSksIGUgPSB0LmNsb25lJDEoZSksIGUgPSB0LmV4dGVuZChlLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogclxuICAgICAgICAgICAgfSkpLCB0aGlzLl92YWxpZGF0ZSh0LnZhbGlkYXRlU3R5bGUubGF5ZXIsIFwibGF5ZXJzLlwiICsgciwgZSwge1xuICAgICAgICAgICAgICBhcnJheUluZGV4OiAtMVxuICAgICAgICAgICAgfSwgbykpIHJldHVybjtcbiAgICAgICAgICAgIGEgPSB0LmNyZWF0ZVN0eWxlTGF5ZXIoZSksIHRoaXMuX3ZhbGlkYXRlTGF5ZXIoYSksIGEuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7XG4gICAgICAgICAgICAgIGxheWVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbYS5pZF0gPSBhLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuID0gaSA/IHRoaXMuX29yZGVyLmluZGV4T2YoaSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgICAgaWYgKGkgJiYgLTEgPT09IG4pIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignTGF5ZXIgd2l0aCBpZCBcIicgKyBpICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLicpKSk7ZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3JkZXIuc3BsaWNlKG4sIDAsIHIpLCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9ICEwLCB0aGlzLl9sYXllcnNbcl0gPSBhLCB0aGlzLl9yZW1vdmVkTGF5ZXJzW3JdICYmIGEuc291cmNlICYmIFwiY3VzdG9tXCIgIT09IGEudHlwZSkge1xuICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3JlbW92ZWRMYXllcnNbcl07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdmVkTGF5ZXJzW3JdLCBzLnR5cGUgIT09IGEudHlwZSA/IHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2Euc291cmNlXSA9IFwiY2xlYXJcIiA6ICh0aGlzLl91cGRhdGVkU291cmNlc1thLnNvdXJjZV0gPSBcInJlbG9hZFwiLCB0aGlzLnNvdXJjZUNhY2hlc1thLnNvdXJjZV0ucGF1c2UoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGEpLCBhLm9uQWRkICYmIGEub25BZGQodGhpcy5tYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUubW92ZUxheWVyID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrTG9hZGVkKCksIHRoaXMuX2NoYW5nZWQgPSAhMCwgdGhpcy5fbGF5ZXJzW2VdKSB7XG4gICAgICAgICAgaWYgKGUgIT09IGkpIHtcbiAgICAgICAgICAgIHZhciBvID0gdGhpcy5fb3JkZXIuaW5kZXhPZihlKTtcblxuICAgICAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKG8sIDEpO1xuXG4gICAgICAgICAgICB2YXIgciA9IGkgPyB0aGlzLl9vcmRlci5pbmRleE9mKGkpIDogdGhpcy5fb3JkZXIubGVuZ3RoO1xuICAgICAgICAgICAgaSAmJiAtMSA9PT0gciA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcignTGF5ZXIgd2l0aCBpZCBcIicgKyBpICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLicpKSkgOiAodGhpcy5fb3JkZXIuc3BsaWNlKHIsIDAsIGUpLCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgZSArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBtb3ZlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZUxheWVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgaSA9IHRoaXMuX2xheWVyc1tlXTtcblxuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgIGkuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcblxuICAgICAgICAgIHZhciBvID0gdGhpcy5fb3JkZXIuaW5kZXhPZihlKTtcblxuICAgICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShvLCAxKSwgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSAhMCwgdGhpcy5fY2hhbmdlZCA9ICEwLCB0aGlzLl9yZW1vdmVkTGF5ZXJzW2VdID0gaSwgZGVsZXRlIHRoaXMuX2xheWVyc1tlXSwgZGVsZXRlIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbZV0sIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2VdLCBkZWxldGUgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbZV0sIGkub25SZW1vdmUgJiYgaS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgZSArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0TGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW3RdO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaGFzTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCBpbiB0aGlzLl9sYXllcnM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMYXllclpvb21SYW5nZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICByID8gci5taW56b29tID09PSBpICYmIHIubWF4em9vbSA9PT0gbyB8fCAobnVsbCAhPSBpICYmIChyLm1pbnpvb20gPSBpKSwgbnVsbCAhPSBvICYmIChyLm1heHpvb20gPSBvKSwgdGhpcy5fdXBkYXRlTGF5ZXIocikpIDogdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiVGhlIGxheWVyICdcIiArIGUgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgaGF2ZSB6b29tIGV4dGVudC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldEZpbHRlciA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmdldExheWVyKGUpO1xuXG4gICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChyLmZpbHRlciwgaSkpIHJldHVybiBudWxsID09IGkgPyAoci5maWx0ZXIgPSB2b2lkIDAsIHZvaWQgdGhpcy5fdXBkYXRlTGF5ZXIocikpIDogdm9pZCAodGhpcy5fdmFsaWRhdGUodC52YWxpZGF0ZVN0eWxlLmZpbHRlciwgXCJsYXllcnMuXCIgKyByLmlkICsgXCIuZmlsdGVyXCIsIGksIG51bGwsIG8pIHx8IChyLmZpbHRlciA9IHQuY2xvbmUkMShpKSwgdGhpcy5fdXBkYXRlTGF5ZXIocikpKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0RmlsdGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHQuY2xvbmUkMSh0aGlzLmdldExheWVyKGUpLmZpbHRlcik7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICBhID8gdC5kZWVwRXF1YWwoYS5nZXRMYXlvdXRQcm9wZXJ0eShpKSwgbykgfHwgKGEuc2V0TGF5b3V0UHJvcGVydHkoaSwgbywgciksIHRoaXMuX3VwZGF0ZUxheWVyKGEpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldExheW91dFByb3BlcnR5ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmdldExheWVyKGUpO1xuICAgICAgICBpZiAobykgcmV0dXJuIG8uZ2V0TGF5b3V0UHJvcGVydHkoaSk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAoZSwgaSwgbywgcikge1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSB7fSksIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIHZhciBhID0gdGhpcy5nZXRMYXllcihlKTtcbiAgICAgICAgYSA/IHQuZGVlcEVxdWFsKGEuZ2V0UGFpbnRQcm9wZXJ0eShpKSwgbykgfHwgKGEuc2V0UGFpbnRQcm9wZXJ0eShpLCBvLCByKSAmJiB0aGlzLl91cGRhdGVMYXllcihhKSwgdGhpcy5fY2hhbmdlZCA9ICEwLCB0aGlzLl91cGRhdGVkUGFpbnRQcm9wc1tlXSA9ICEwKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIgKyBlICsgXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5cIikpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHkgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcih0KS5nZXRQYWludFByb3BlcnR5KGUpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0RmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgbyA9IGUuc291cmNlLFxuICAgICAgICAgICAgciA9IGUuc291cmNlTGF5ZXIsXG4gICAgICAgICAgICBhID0gdGhpcy5zb3VyY2VDYWNoZXNbb107XG5cbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gYSkge1xuICAgICAgICAgIHZhciBuID0gYS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICAgIFwiZ2VvanNvblwiID09PSBuICYmIHIgPyB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJHZW9KU09OIHNvdXJjZXMgY2Fubm90IGhhdmUgYSBzb3VyY2VMYXllciBwYXJhbWV0ZXIuXCIpKSkgOiBcInZlY3RvclwiICE9PSBuIHx8IHIgPyAodm9pZCAwID09PSBlLmlkICYmIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiKSkpLCBhLnNldEZlYXR1cmVTdGF0ZShyLCBlLmlkLCBpKSkgOiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuXCIpKSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlICdcIiArIG8gKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVtb3ZlRmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICB2YXIgbyA9IGUuc291cmNlLFxuICAgICAgICAgICAgciA9IHRoaXMuc291cmNlQ2FjaGVzW29dO1xuXG4gICAgICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgICAgICB2YXIgYSA9IHIuZ2V0U291cmNlKCkudHlwZSxcbiAgICAgICAgICAgICAgbiA9IFwidmVjdG9yXCIgPT09IGEgPyBlLnNvdXJjZUxheWVyIDogdm9pZCAwO1xuICAgICAgICAgIFwidmVjdG9yXCIgIT09IGEgfHwgbiA/IGkgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgZS5pZCAmJiBcIm51bWJlclwiICE9IHR5cGVvZiBlLmlkID8gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiQSBmZWF0dXJlIGlkIGlzIHJlcXVpcmVkIHRvIHJlbW92ZSBpdHMgc3BlY2lmaWMgc3RhdGUgcHJvcGVydHkuXCIpKSkgOiByLnJlbW92ZUZlYXR1cmVTdGF0ZShuLCBlLmlkLCBpKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5cIikpKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBzb3VyY2UgJ1wiICsgbyArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXCIpKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIHZhciBpID0gZS5zb3VyY2UsXG4gICAgICAgICAgICBvID0gZS5zb3VyY2VMYXllcixcbiAgICAgICAgICAgIHIgPSB0aGlzLnNvdXJjZUNhY2hlc1tpXTtcblxuICAgICAgICBpZiAodm9pZCAwICE9PSByKSB7XG4gICAgICAgICAgaWYgKFwidmVjdG9yXCIgIT09IHIuZ2V0U291cmNlKCkudHlwZSB8fCBvKSByZXR1cm4gdm9pZCAwID09PSBlLmlkICYmIHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIlRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLlwiKSkpLCByLmdldEZlYXR1cmVTdGF0ZShvLCBlLmlkKTtcbiAgICAgICAgICB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuXCIpKSk7XG4gICAgICAgIH0gZWxzZSB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgc291cmNlICdcIiArIGkgKyBcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLlwiKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuZXh0ZW5kKHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgIGRlbGF5OiAwXG4gICAgICAgIH0sIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0LmZpbHRlck9iamVjdCh7XG4gICAgICAgICAgdmVyc2lvbjogdGhpcy5zdHlsZXNoZWV0LnZlcnNpb24sXG4gICAgICAgICAgbmFtZTogdGhpcy5zdHlsZXNoZWV0Lm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHRoaXMuc3R5bGVzaGVldC5tZXRhZGF0YSxcbiAgICAgICAgICBsaWdodDogdGhpcy5zdHlsZXNoZWV0LmxpZ2h0LFxuICAgICAgICAgIGNlbnRlcjogdGhpcy5zdHlsZXNoZWV0LmNlbnRlcixcbiAgICAgICAgICB6b29tOiB0aGlzLnN0eWxlc2hlZXQuem9vbSxcbiAgICAgICAgICBiZWFyaW5nOiB0aGlzLnN0eWxlc2hlZXQuYmVhcmluZyxcbiAgICAgICAgICBwaXRjaDogdGhpcy5zdHlsZXNoZWV0LnBpdGNoLFxuICAgICAgICAgIHNwcml0ZTogdGhpcy5zdHlsZXNoZWV0LnNwcml0ZSxcbiAgICAgICAgICBnbHlwaHM6IHRoaXMuc3R5bGVzaGVldC5nbHlwaHMsXG4gICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24sXG4gICAgICAgICAgc291cmNlczogdC5tYXBPYmplY3QodGhpcy5zb3VyY2VDYWNoZXMsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdC5zZXJpYWxpemUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBsYXllcnM6IHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0aGlzLl9vcmRlcilcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0O1xuICAgICAgICB9KTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVMYXllciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRMYXllcnNbdC5pZF0gPSAhMCwgdC5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW3Quc291cmNlXSAmJiBcInJhc3RlclwiICE9PSB0aGlzLnNvdXJjZUNhY2hlc1t0LnNvdXJjZV0uZ2V0U291cmNlKCkudHlwZSAmJiAodGhpcy5fdXBkYXRlZFNvdXJjZXNbdC5zb3VyY2VdID0gXCJyZWxvYWRcIiwgdGhpcy5zb3VyY2VDYWNoZXNbdC5zb3VyY2VdLnBhdXNlKCkpLCB0aGlzLl9jaGFuZ2VkID0gITA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZmxhdHRlbkFuZFNvcnRSZW5kZXJlZEZlYXR1cmVzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMsIGkgPSBmdW5jdGlvbiBpKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJmaWxsLWV4dHJ1c2lvblwiID09PSBlLl9sYXllcnNbdF0udHlwZTtcbiAgICAgICAgfSwgbyA9IHt9LCByID0gW10sIGEgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBhID49IDA7IGEtLSkge1xuICAgICAgICAgIHZhciBuID0gdGhpcy5fb3JkZXJbYV07XG5cbiAgICAgICAgICBpZiAoaShuKSkge1xuICAgICAgICAgICAgb1tuXSA9IGE7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHMgPSAwLCBsID0gdDsgcyA8IGwubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICAgICAgdmFyIGMgPSBsW3NdW25dO1xuICAgICAgICAgICAgICBpZiAoYykgZm9yICh2YXIgdSA9IDAsIGggPSBjOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgICAgIHIucHVzaChoW3VdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgIHJldHVybiBlLmludGVyc2VjdGlvblogLSB0LmludGVyc2VjdGlvblo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIHAgPSBbXSwgZCA9IHRoaXMuX29yZGVyLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgdmFyIF8gPSB0aGlzLl9vcmRlcltkXTtcbiAgICAgICAgICBpZiAoaShfKSkgZm9yICh2YXIgZiA9IHIubGVuZ3RoIC0gMTsgZiA+PSAwOyBmLS0pIHtcbiAgICAgICAgICAgIHZhciBtID0gcltmXS5mZWF0dXJlO1xuICAgICAgICAgICAgaWYgKG9bbS5sYXllci5pZF0gPCBkKSBicmVhaztcbiAgICAgICAgICAgIHAucHVzaChtKSwgci5wb3AoKTtcbiAgICAgICAgICB9IGVsc2UgZm9yICh2YXIgZyA9IDAsIHYgPSB0OyBnIDwgdi5sZW5ndGg7IGcgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHkgPSB2W2ddW19dO1xuICAgICAgICAgICAgaWYgKHkpIGZvciAodmFyIHggPSAwLCBiID0geTsgeCA8IGIubGVuZ3RoOyB4ICs9IDEpIHtcbiAgICAgICAgICAgICAgcC5wdXNoKGJbeF0uZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICBpICYmIGkuZmlsdGVyICYmIHRoaXMuX3ZhbGlkYXRlKHQudmFsaWRhdGVTdHlsZS5maWx0ZXIsIFwicXVlcnlSZW5kZXJlZEZlYXR1cmVzLmZpbHRlclwiLCBpLmZpbHRlciwgbnVsbCwgaSk7XG4gICAgICAgIHZhciByID0ge307XG5cbiAgICAgICAgaWYgKGkgJiYgaS5sYXllcnMpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaS5sYXllcnMpKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwicGFyYW1ldGVycy5sYXllcnMgbXVzdCBiZSBhbiBBcnJheS5cIikpKSwgW107XG5cbiAgICAgICAgICBmb3IgKHZhciBhID0gMCwgbiA9IGkubGF5ZXJzOyBhIDwgbi5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHMgPSBuW2FdLFxuICAgICAgICAgICAgICAgIGwgPSB0aGlzLl9sYXllcnNbc107XG4gICAgICAgICAgICBpZiAoIWwpIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiICsgcyArIFwiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5cIikpKSwgW107XG4gICAgICAgICAgICByW2wuc291cmNlXSA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgdSBpbiBpLmF2YWlsYWJsZUltYWdlcyA9IHRoaXMuX2F2YWlsYWJsZUltYWdlcywgdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICBpLmxheWVycyAmJiAhclt1XSB8fCBjLnB1c2goTyh0aGlzLnNvdXJjZUNhY2hlc1t1XSwgdGhpcy5fbGF5ZXJzLCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLCBlLCBpLCBvKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnQgJiYgYy5wdXNoKGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICAgICAgZm9yICh2YXIgcyA9IHt9LCBsID0gYS5xdWVyeVJlbmRlcmVkU3ltYm9scyhvKSwgYyA9IFtdLCB1ID0gMCwgaCA9IE9iamVjdC5rZXlzKGwpLm1hcChOdW1iZXIpOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgYy5wdXNoKG5baFt1XV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGMuc29ydChGKTtcblxuICAgICAgICAgIGZvciAodmFyIHAgPSBmdW5jdGlvbiBwKCkge1xuICAgICAgICAgICAgdmFyIGkgPSBfW2RdLFxuICAgICAgICAgICAgICAgIG8gPSBpLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhsW2kuYnVja2V0SW5zdGFuY2VJZF0sIGUsIGkuYnVja2V0SW5kZXgsIGkuc291cmNlTGF5ZXJJbmRleCwgci5maWx0ZXIsIHIubGF5ZXJzLCByLmF2YWlsYWJsZUltYWdlcywgdCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGEgaW4gbykge1xuICAgICAgICAgICAgICB2YXIgbiA9IHNbYV0gPSBzW2FdIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgYyA9IG9bYV07XG4gICAgICAgICAgICAgIGMuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHZhciBvID0gaS5mZWF0dXJlU29ydE9yZGVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgICAgICAgIHZhciByID0gby5pbmRleE9mKHQuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvLmluZGV4T2YoZS5mZWF0dXJlSW5kZXgpIC0gcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZS5mZWF0dXJlSW5kZXggLSB0LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IDAsIGggPSBjOyB1IDwgaC5sZW5ndGg7IHUgKz0gMSkge1xuICAgICAgICAgICAgICAgIG4ucHVzaChoW3VdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGQgPSAwLCBfID0gYzsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgICAgIHAoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIGYoZSkge1xuICAgICAgICAgICAgc1tlXS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAgIHZhciByID0gby5mZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgYSA9IGlbdFtlXS5zb3VyY2VdLmdldEZlYXR1cmVTdGF0ZShyLmxheWVyW1wic291cmNlLWxheWVyXCJdLCByLmlkKTtcbiAgICAgICAgICAgICAgci5zb3VyY2UgPSByLmxheWVyLnNvdXJjZSwgci5sYXllcltcInNvdXJjZS1sYXllclwiXSAmJiAoci5zb3VyY2VMYXllciA9IHIubGF5ZXJbXCJzb3VyY2UtbGF5ZXJcIl0pLCByLnN0YXRlID0gYTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBtIGluIHMpIHtcbiAgICAgICAgICAgIGYobSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0odGhpcy5fbGF5ZXJzLCB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLCB0aGlzLnNvdXJjZUNhY2hlcywgZSwgaSwgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKSksIHRoaXMuX2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyhjKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnF1ZXJ5U291cmNlRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpICYmIGkuZmlsdGVyICYmIHRoaXMuX3ZhbGlkYXRlKHQudmFsaWRhdGVTdHlsZS5maWx0ZXIsIFwicXVlcnlTb3VyY2VGZWF0dXJlcy5maWx0ZXJcIiwgaS5maWx0ZXIsIG51bGwsIGkpO1xuICAgICAgICB2YXIgbyA9IHRoaXMuc291cmNlQ2FjaGVzW2VdO1xuICAgICAgICByZXR1cm4gbyA/IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IHQuZ2V0UmVuZGVyYWJsZUlkcygpLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VGlsZUJ5SUQoZSk7XG4gICAgICAgICAgfSksIG8gPSBbXSwgciA9IHt9LCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIHZhciBuID0gaVthXSxcbiAgICAgICAgICAgICAgICBzID0gbi50aWxlSUQuY2Fub25pY2FsLmtleTtcbiAgICAgICAgICAgIHJbc10gfHwgKHJbc10gPSAhMCwgbi5xdWVyeVNvdXJjZUZlYXR1cmVzKG8sIGUpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfShvLCBpKSA6IFtdO1xuICAgICAgfSwgaS5wcm90b3R5cGUuYWRkU291cmNlVHlwZSA9IGZ1bmN0aW9uICh0LCBlLCBvKSB7XG4gICAgICAgIHJldHVybiBpLmdldFNvdXJjZVR5cGUodCkgPyBvKG5ldyBFcnJvcignQSBzb3VyY2UgdHlwZSBjYWxsZWQgXCInICsgdCArICdcIiBhbHJlYWR5IGV4aXN0cy4nKSkgOiAoaS5zZXRTb3VyY2VUeXBlKHQsIGUpLCBlLndvcmtlclNvdXJjZVVSTCA/IHZvaWQgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcImxvYWRXb3JrZXJTb3VyY2VcIiwge1xuICAgICAgICAgIG5hbWU6IHQsXG4gICAgICAgICAgdXJsOiBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBvKSA6IG8obnVsbCwgbnVsbCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0TGlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRMaWdodCA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmxpZ2h0LmdldExpZ2h0KCksXG4gICAgICAgICAgICByID0gITE7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiBlKSB7XG4gICAgICAgICAgaWYgKCF0LmRlZXBFcXVhbChlW2FdLCBvW2FdKSkge1xuICAgICAgICAgICAgciA9ICEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICB2YXIgbiA9IHtcbiAgICAgICAgICAgIG5vdzogdC5icm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdC5leHRlbmQoe1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmxpZ2h0LnNldExpZ2h0KGUsIGkpLCB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKG4pO1xuICAgICAgICB9XG4gICAgICB9LCBpLnByb3RvdHlwZS5fdmFsaWRhdGUgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBhICYmIChhID0ge30pLCAoIWEgfHwgITEgIT09IGEudmFsaWRhdGUpICYmIFVlKHRoaXMsIGUuY2FsbCh0LnZhbGlkYXRlU3R5bGUsIHQuZXh0ZW5kKHtcbiAgICAgICAgICBrZXk6IGksXG4gICAgICAgICAgc3R5bGU6IHRoaXMuc2VyaWFsaXplKCksXG4gICAgICAgICAgdmFsdWU6IG8sXG4gICAgICAgICAgc3R5bGVTcGVjOiB0LnN0eWxlU3BlY1xuICAgICAgICB9LCByKSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLl9yZXF1ZXN0ICYmICh0aGlzLl9yZXF1ZXN0LmNhbmNlbCgpLCB0aGlzLl9yZXF1ZXN0ID0gbnVsbCksIHRoaXMuX3Nwcml0ZVJlcXVlc3QgJiYgKHRoaXMuX3Nwcml0ZVJlcXVlc3QuY2FuY2VsKCksIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBudWxsKSwgdC5ldmVudGVkLm9mZihcInBsdWdpblN0YXRlQ2hhbmdlXCIsIHRoaXMuX3J0bFRleHRQbHVnaW5DYWxsYmFjayksIHRoaXMuX2xheWVycykge1xuICAgICAgICAgIHRoaXMuX2xheWVyc1tlXS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2ldLmNsZWFyVGlsZXMoKSwgdGhpcy5zb3VyY2VDYWNoZXNbaV0uc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCksIHRoaXMuc2V0RXZlbnRlZFBhcmVudChudWxsKSwgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2NsZWFyU291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbdF0uY2xlYXJUaWxlcygpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbG9hZFNvdXJjZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW3RdLnJlc3VtZSgpLCB0aGlzLnNvdXJjZUNhY2hlc1t0XS5yZWxvYWQoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVTb3VyY2VzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2VdLnVwZGF0ZSh0KTtcbiAgICAgICAgfVxuICAgICAgfSwgaS5wcm90b3R5cGUuX2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UodCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLl91cGRhdGVQbGFjZW1lbnQgPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgICB2b2lkIDAgPT09IGEgJiYgKGEgPSAhMSk7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9ICExLCBzID0gITEsIGwgPSB7fSwgYyA9IDAsIHUgPSB0aGlzLl9vcmRlcjsgYyA8IHUubGVuZ3RoOyBjICs9IDEpIHtcbiAgICAgICAgICB2YXIgaCA9IHRoaXMuX2xheWVyc1t1W2NdXTtcblxuICAgICAgICAgIGlmIChcInN5bWJvbFwiID09PSBoLnR5cGUpIHtcbiAgICAgICAgICAgIGlmICghbFtoLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnNvdXJjZUNhY2hlc1toLnNvdXJjZV07XG4gICAgICAgICAgICAgIGxbaC5zb3VyY2VdID0gcC5nZXRSZW5kZXJhYmxlSWRzKCEwKS5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5nZXRUaWxlQnlJRCh0KTtcbiAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIHQudGlsZUlELm92ZXJzY2FsZWRaIHx8ICh0LnRpbGVJRC5pc0xlc3NUaGFuKGUudGlsZUlEKSA/IC0xIDogMSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZCA9IHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXguYWRkTGF5ZXIoaCwgbFtoLnNvdXJjZV0sIGUuY2VudGVyLmxuZyk7XG4gICAgICAgICAgICBuID0gbiB8fCBkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LnBydW5lVW51c2VkTGF5ZXJzKHRoaXMuX29yZGVyKSwgKChhID0gYSB8fCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCB8fCAwID09PSBvKSB8fCAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgfHwgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkgJiYgIXRoaXMucGxhY2VtZW50LnN0aWxsUmVjZW50KHQuYnJvd3Nlci5ub3coKSwgZS56b29tKSkgJiYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50ID0gbmV3IExlKGUsIHRoaXMuX29yZGVyLCBhLCBpLCBvLCByLCB0aGlzLnBsYWNlbWVudCksIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gITEpLCB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSA/IHRoaXMucGxhY2VtZW50LnNldFN0YWxlKCkgOiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29udGludWVQbGFjZW1lbnQodGhpcy5fb3JkZXIsIHRoaXMuX2xheWVycywgbCksIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpICYmICh0aGlzLnBsYWNlbWVudCA9IHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbW1pdCh0LmJyb3dzZXIubm93KCkpLCBzID0gITApLCBuICYmIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LnBsYWNlbWVudC5zZXRTdGFsZSgpKSwgcyB8fCBuKSBmb3IgKHZhciBfID0gMCwgZiA9IHRoaXMuX29yZGVyOyBfIDwgZi5sZW5ndGg7IF8gKz0gMSkge1xuICAgICAgICAgIHZhciBtID0gdGhpcy5fbGF5ZXJzW2ZbX11dO1xuICAgICAgICAgIFwic3ltYm9sXCIgPT09IG0udHlwZSAmJiB0aGlzLnBsYWNlbWVudC51cGRhdGVMYXllck9wYWNpdGllcyhtLCBsW20uc291cmNlXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSB8fCB0aGlzLnBsYWNlbWVudC5oYXNUcmFuc2l0aW9ucyh0LmJyb3dzZXIubm93KCkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1t0XS5yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEltYWdlcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmdldEltYWdlcyhlLmljb25zLCBpKSwgdGhpcy5fdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCk7XG4gICAgICAgIHZhciBvID0gdGhpcy5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdO1xuICAgICAgICBvICYmIG8uc2V0RGVwZW5kZW5jaWVzKGUudGlsZUlELmtleSwgZS50eXBlLCBlLmljb25zKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEdseXBocyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyLmdldEdseXBocyhlLnN0YWNrcywgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRSZXNvdXJjZSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB0Lm1ha2VSZXF1ZXN0KGksIG8pO1xuICAgICAgfSwgaTtcbiAgICB9KHQuRXZlbnRlZCk7XG5cbiAgICBqZS5nZXRTb3VyY2VUeXBlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBrW3RdO1xuICAgIH0sIGplLnNldFNvdXJjZVR5cGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAga1t0XSA9IGU7XG4gICAgfSwgamUucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSA9IHQucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZTtcblxuICAgIHZhciBWZSA9IHQuY3JlYXRlTGF5b3V0KFt7XG4gICAgICBuYW1lOiBcImFfcG9zXCIsXG4gICAgICB0eXBlOiBcIkludDE2XCIsXG4gICAgICBjb21wb25lbnRzOiAyXG4gICAgfV0pLFxuICAgICAgICBHZSA9IGdpKFwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2Vsc2VcXG4jaWYgIWRlZmluZWQobG93cClcXG4jZGVmaW5lIGxvd3BcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQobWVkaXVtcClcXG4jZGVmaW5lIG1lZGl1bXBcXG4jZW5kaWZcXG4jaWYgIWRlZmluZWQoaGlnaHApXFxuI2RlZmluZSBoaWdocFxcbiNlbmRpZlxcbiNlbmRpZlwiLCBcIiNpZmRlZiBHTF9FU1xcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZWxzZVxcbiNpZiAhZGVmaW5lZChsb3dwKVxcbiNkZWZpbmUgbG93cFxcbiNlbmRpZlxcbiNpZiAhZGVmaW5lZChtZWRpdW1wKVxcbiNkZWZpbmUgbWVkaXVtcFxcbiNlbmRpZlxcbiNpZiAhZGVmaW5lZChoaWdocClcXG4jZGVmaW5lIGhpZ2hwXFxuI2VuZGlmXFxuI2VuZGlmXFxudmVjMiB1bnBhY2tfZmxvYXQoY29uc3QgZmxvYXQgcGFja2VkVmFsdWUpIHtpbnQgcGFja2VkSW50VmFsdWU9aW50KHBhY2tlZFZhbHVlKTtpbnQgdjA9cGFja2VkSW50VmFsdWUvMjU2O3JldHVybiB2ZWMyKHYwLHBhY2tlZEludFZhbHVlLXYwKjI1Nik7fXZlYzIgdW5wYWNrX29wYWNpdHkoY29uc3QgZmxvYXQgcGFja2VkT3BhY2l0eSkge2ludCBpbnRPcGFjaXR5PWludChwYWNrZWRPcGFjaXR5KS8yO3JldHVybiB2ZWMyKGZsb2F0KGludE9wYWNpdHkpLzEyNy4wLG1vZChwYWNrZWRPcGFjaXR5LDIuMCkpO312ZWM0IGRlY29kZV9jb2xvcihjb25zdCB2ZWMyIGVuY29kZWRDb2xvcikge3JldHVybiB2ZWM0KHVucGFja19mbG9hdChlbmNvZGVkQ29sb3JbMF0pLzI1NS4wLHVucGFja19mbG9hdChlbmNvZGVkQ29sb3JbMV0pLzI1NS4wXFxuKTt9ZmxvYXQgdW5wYWNrX21peF92ZWMyKGNvbnN0IHZlYzIgcGFja2VkVmFsdWUsY29uc3QgZmxvYXQgdCkge3JldHVybiBtaXgocGFja2VkVmFsdWVbMF0scGFja2VkVmFsdWVbMV0sdCk7fXZlYzQgdW5wYWNrX21peF9jb2xvcihjb25zdCB2ZWM0IHBhY2tlZENvbG9ycyxjb25zdCBmbG9hdCB0KSB7dmVjNCBtaW5Db2xvcj1kZWNvZGVfY29sb3IodmVjMihwYWNrZWRDb2xvcnNbMF0scGFja2VkQ29sb3JzWzFdKSk7dmVjNCBtYXhDb2xvcj1kZWNvZGVfY29sb3IodmVjMihwYWNrZWRDb2xvcnNbMl0scGFja2VkQ29sb3JzWzNdKSk7cmV0dXJuIG1peChtaW5Db2xvcixtYXhDb2xvcix0KTt9dmVjMiBnZXRfcGF0dGVybl9wb3MoY29uc3QgdmVjMiBwaXhlbF9jb29yZF91cHBlcixjb25zdCB2ZWMyIHBpeGVsX2Nvb3JkX2xvd2VyLGNvbnN0IHZlYzIgcGF0dGVybl9zaXplLGNvbnN0IGZsb2F0IHRpbGVfdW5pdHNfdG9fcGl4ZWxzLGNvbnN0IHZlYzIgcG9zKSB7dmVjMiBvZmZzZXQ9bW9kKG1vZChtb2QocGl4ZWxfY29vcmRfdXBwZXIscGF0dGVybl9zaXplKSoyNTYuMCxwYXR0ZXJuX3NpemUpKjI1Ni4wK3BpeGVsX2Nvb3JkX2xvd2VyLHBhdHRlcm5fc2l6ZSk7cmV0dXJuICh0aWxlX3VuaXRzX3RvX3BpeGVscypwb3Mrb2Zmc2V0KS9wYXR0ZXJuX3NpemU7fVwiKSxcbiAgICAgICAgV2UgPSBnaShcInVuaWZvcm0gdmVjNCB1X2NvbG9yO3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O3ZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9dV9jb2xvcip1X29wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO31cIiksXG4gICAgICAgIFhlID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9hO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYjt1bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2I7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfbWl4O3VuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dm9pZCBtYWluKCkge3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peCh1X3BhdHRlcm5fdGxfYS91X3RleHNpemUsdV9wYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHVfcGF0dGVybl90bF9iL3VfdGV4c2l6ZSx1X3BhdHRlcm5fYnJfYi91X3RleHNpemUsaW1hZ2Vjb29yZF9iKTt2ZWM0IGNvbG9yMj10ZXh0dXJlMkQodV9pbWFnZSxwb3MyKTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9taXgpKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9hO3VuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9iO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO3VuaWZvcm0gZmxvYXQgdV9zY2FsZV9hO3VuaWZvcm0gZmxvYXQgdV9zY2FsZV9iO3VuaWZvcm0gZmxvYXQgdV90aWxlX3VuaXRzX3RvX3BpeGVsczthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zX2E9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix1X3NjYWxlX2EqdV9wYXR0ZXJuX3NpemVfYSx1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLGFfcG9zKTt2X3Bvc19iPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsdV9zY2FsZV9iKnVfcGF0dGVybl9zaXplX2IsdV90aWxlX3VuaXRzX3RvX3BpeGVscyxhX3Bvcyk7fVwiKSxcbiAgICAgICAgSGUgPSBnaShcInZhcnlpbmcgdmVjMyB2X2RhdGE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHN0cm9rZV93aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBzdHJva2Vfb3BhY2l0eVxcbnZlYzIgZXh0cnVkZT12X2RhdGEueHk7ZmxvYXQgZXh0cnVkZV9sZW5ndGg9bGVuZ3RoKGV4dHJ1ZGUpO2xvd3AgZmxvYXQgYW50aWFsaWFzYmx1cj12X2RhdGEuejtmbG9hdCBhbnRpYWxpYXNlZF9ibHVyPS1tYXgoYmx1cixhbnRpYWxpYXNibHVyKTtmbG9hdCBvcGFjaXR5X3Q9c21vb3Roc3RlcCgwLjAsYW50aWFsaWFzZWRfYmx1cixleHRydWRlX2xlbmd0aC0xLjApO2Zsb2F0IGNvbG9yX3Q9c3Ryb2tlX3dpZHRoIDwgMC4wMSA/IDAuMCA6IHNtb290aHN0ZXAoYW50aWFsaWFzZWRfYmx1ciwwLjAsZXh0cnVkZV9sZW5ndGgtcmFkaXVzLyhyYWRpdXMrc3Ryb2tlX3dpZHRoKSk7Z2xfRnJhZ0NvbG9yPW9wYWNpdHlfdCptaXgoY29sb3Iqb3BhY2l0eSxzdHJva2VfY29sb3Iqc3Ryb2tlX29wYWNpdHksY29sb3JfdCk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGJvb2wgdV9zY2FsZV93aXRoX21hcDt1bmlmb3JtIGJvb2wgdV9waXRjaF93aXRoX21hcDt1bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO3VuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzMgdl9kYXRhO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBzdHJva2Vfd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgc3Ryb2tlX29wYWNpdHlcXG52b2lkIG1haW4odm9pZCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBzdHJva2Vfd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxudmVjMiBleHRydWRlPXZlYzIobW9kKGFfcG9zLDIuMCkqMi4wLTEuMCk7dmVjMiBjaXJjbGVfY2VudGVyPWZsb29yKGFfcG9zKjAuNSk7aWYgKHVfcGl0Y2hfd2l0aF9tYXApIHt2ZWMyIGNvcm5lcl9wb3NpdGlvbj1jaXJjbGVfY2VudGVyO2lmICh1X3NjYWxlX3dpdGhfbWFwKSB7Y29ybmVyX3Bvc2l0aW9uKz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGU7fSBlbHNlIHt2ZWM0IHByb2plY3RlZF9jZW50ZXI9dV9tYXRyaXgqdmVjNChjaXJjbGVfY2VudGVyLDAsMSk7Y29ybmVyX3Bvc2l0aW9uKz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGUqKHByb2plY3RlZF9jZW50ZXIudy91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpO31nbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGNvcm5lcl9wb3NpdGlvbiwwLDEpO30gZWxzZSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChjaXJjbGVfY2VudGVyLDAsMSk7aWYgKHVfc2NhbGVfd2l0aF9tYXApIHtnbF9Qb3NpdGlvbi54eSs9ZXh0cnVkZSoocmFkaXVzK3N0cm9rZV93aWR0aCkqdV9leHRydWRlX3NjYWxlKnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt9IGVsc2Uge2dsX1Bvc2l0aW9uLnh5Kz1leHRydWRlKihyYWRpdXMrc3Ryb2tlX3dpZHRoKSp1X2V4dHJ1ZGVfc2NhbGUqZ2xfUG9zaXRpb24udzt9fWxvd3AgZmxvYXQgYW50aWFsaWFzYmx1cj0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vKHJhZGl1cytzdHJva2Vfd2lkdGgpO3ZfZGF0YT12ZWMzKGV4dHJ1ZGUueCxleHRydWRlLnksYW50aWFsaWFzYmx1cik7fVwiKSxcbiAgICAgICAgS2UgPSBnaShcInZvaWQgbWFpbigpIHtnbF9GcmFnQ29sb3I9dmVjNCgxLjApO31cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt9XCIpLFxuICAgICAgICBZZSA9IGdpKFwidW5pZm9ybSBoaWdocCBmbG9hdCB1X2ludGVuc2l0eTt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI2RlZmluZSBHQVVTU19DT0VGIDAuMzk4OTQyMjgwNDAxNDMyN1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCBmbG9hdCB3ZWlnaHRcXG5mbG9hdCBkPS0wLjUqMy4wKjMuMCpkb3Qodl9leHRydWRlLHZfZXh0cnVkZSk7ZmxvYXQgdmFsPXdlaWdodCp1X2ludGVuc2l0eSpHQVVTU19DT0VGKmV4cChkKTtnbF9GcmFnQ29sb3I9dmVjNCh2YWwsMS4wLDEuMCwxLjApO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBmbG9hdCB1X2V4dHJ1ZGVfc2NhbGU7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dW5pZm9ybSBmbG9hdCB1X2ludGVuc2l0eTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbmNvbnN0IGhpZ2hwIGZsb2F0IFpFUk89MS4wLzI1NS4wLzE2LjA7XFxuI2RlZmluZSBHQVVTU19DT0VGIDAuMzk4OTQyMjgwNDAxNDMyN1xcbnZvaWQgbWFpbih2b2lkKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgd2VpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG52ZWMyIHVuc2NhbGVkX2V4dHJ1ZGU9dmVjMihtb2QoYV9wb3MsMi4wKSoyLjAtMS4wKTtmbG9hdCBTPXNxcnQoLTIuMCpsb2coWkVSTy93ZWlnaHQvdV9pbnRlbnNpdHkvR0FVU1NfQ09FRikpLzMuMDt2X2V4dHJ1ZGU9Uyp1bnNjYWxlZF9leHRydWRlO3ZlYzIgZXh0cnVkZT12X2V4dHJ1ZGUqcmFkaXVzKnVfZXh0cnVkZV9zY2FsZTt2ZWM0IHBvcz12ZWM0KGZsb29yKGFfcG9zKjAuNSkrZXh0cnVkZSwwLDEpO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnBvczt9XCIpLFxuICAgICAgICBKZSA9IGdpKFwidW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2NvbG9yX3JhbXA7dW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7dmFyeWluZyB2ZWMyIHZfcG9zO3ZvaWQgbWFpbigpIHtmbG9hdCB0PXRleHR1cmUyRCh1X2ltYWdlLHZfcG9zKS5yO3ZlYzQgY29sb3I9dGV4dHVyZTJEKHVfY29sb3JfcmFtcCx2ZWMyKHQsMC41KSk7Z2xfRnJhZ0NvbG9yPWNvbG9yKnVfb3BhY2l0eTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMC4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3dvcmxkO2F0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3Bvcyp1X3dvcmxkLDAsMSk7dl9wb3MueD1hX3Bvcy54O3ZfcG9zLnk9MS4wLWFfcG9zLnk7fVwiKSxcbiAgICAgICAgUWUgPSBnaShcInZhcnlpbmcgZmxvYXQgdl9wbGFjZWQ7dmFyeWluZyBmbG9hdCB2X25vdFVzZWQ7dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNTtnbF9GcmFnQ29sb3I9dmVjNCgxLjAsMC4wLDAuMCwxLjApKmFscGhhO2lmICh2X3BsYWNlZCA+IDAuNSkge2dsX0ZyYWdDb2xvcj12ZWM0KDAuMCwwLjAsMS4wLDAuNSkqYWxwaGE7fWlmICh2X25vdFVzZWQgPiAwLjUpIHtnbF9GcmFnQ29sb3IqPS4xO319XCIsIFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzIgYV9hbmNob3JfcG9zO2F0dHJpYnV0ZSB2ZWMyIGFfZXh0cnVkZTthdHRyaWJ1dGUgdmVjMiBhX3BsYWNlZDthdHRyaWJ1dGUgdmVjMiBhX3NoaWZ0O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO3VuaWZvcm0gZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3ZhcnlpbmcgZmxvYXQgdl9wbGFjZWQ7dmFyeWluZyBmbG9hdCB2X25vdFVzZWQ7dm9pZCBtYWluKCkge3ZlYzQgcHJvamVjdGVkUG9pbnQ9dV9tYXRyaXgqdmVjNChhX2FuY2hvcl9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgY29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqKHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlKSwwLjAsNC4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLDAuMCwxLjApO2dsX1Bvc2l0aW9uLnh5Kz0oYV9leHRydWRlK2Ffc2hpZnQpKnVfZXh0cnVkZV9zY2FsZSpnbF9Qb3NpdGlvbi53KmNvbGxpc2lvbl9wZXJzcGVjdGl2ZV9yYXRpbzt2X3BsYWNlZD1hX3BsYWNlZC54O3Zfbm90VXNlZD1hX3BsYWNlZC55O31cIiksXG4gICAgICAgICRlID0gZ2koXCJ2YXJ5aW5nIGZsb2F0IHZfcmFkaXVzO3ZhcnlpbmcgdmVjMiB2X2V4dHJ1ZGU7dmFyeWluZyBmbG9hdCB2X3BlcnNwZWN0aXZlX3JhdGlvO3ZhcnlpbmcgZmxvYXQgdl9jb2xsaXNpb247dm9pZCBtYWluKCkge2Zsb2F0IGFscGhhPTAuNSptaW4odl9wZXJzcGVjdGl2ZV9yYXRpbywxLjApO2Zsb2F0IHN0cm9rZV9yYWRpdXM9MC45Km1heCh2X3BlcnNwZWN0aXZlX3JhdGlvLDEuMCk7ZmxvYXQgZGlzdGFuY2VfdG9fY2VudGVyPWxlbmd0aCh2X2V4dHJ1ZGUpO2Zsb2F0IGRpc3RhbmNlX3RvX2VkZ2U9YWJzKGRpc3RhbmNlX3RvX2NlbnRlci12X3JhZGl1cyk7ZmxvYXQgb3BhY2l0eV90PXNtb290aHN0ZXAoLXN0cm9rZV9yYWRpdXMsMC4wLC1kaXN0YW5jZV90b19lZGdlKTt2ZWM0IGNvbG9yPW1peCh2ZWM0KDAuMCwwLjAsMS4wLDAuNSksdmVjNCgxLjAsMC4wLDAuMCwxLjApLHZfY29sbGlzaW9uKTtnbF9GcmFnQ29sb3I9Y29sb3IqYWxwaGEqb3BhY2l0eV90O31cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9yYWRpdXM7YXR0cmlidXRlIHZlYzIgYV9mbGFnczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfaW52X21hdHJpeDt1bmlmb3JtIHZlYzIgdV92aWV3cG9ydF9zaXplO3VuaWZvcm0gZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3ZhcnlpbmcgZmxvYXQgdl9yYWRpdXM7dmFyeWluZyB2ZWMyIHZfZXh0cnVkZTt2YXJ5aW5nIGZsb2F0IHZfcGVyc3BlY3RpdmVfcmF0aW87dmFyeWluZyBmbG9hdCB2X2NvbGxpc2lvbjt2ZWMzIHRvVGlsZVBvc2l0aW9uKHZlYzIgc2NyZWVuUG9zKSB7dmVjNCByYXlTdGFydD11X2ludl9tYXRyaXgqdmVjNChzY3JlZW5Qb3MsLTEuMCwxLjApO3ZlYzQgcmF5RW5kICA9dV9pbnZfbWF0cml4KnZlYzQoc2NyZWVuUG9zLCAxLjAsMS4wKTtyYXlTdGFydC54eXovPXJheVN0YXJ0Lnc7cmF5RW5kLnh5eiAgLz1yYXlFbmQudztoaWdocCBmbG9hdCB0PSgwLjAtcmF5U3RhcnQueikvKHJheUVuZC56LXJheVN0YXJ0LnopO3JldHVybiBtaXgocmF5U3RhcnQueHl6LHJheUVuZC54eXosdCk7fXZvaWQgbWFpbigpIHt2ZWMyIHF1YWRDZW50ZXJQb3M9YV9wb3M7ZmxvYXQgcmFkaXVzPWFfcmFkaXVzO2Zsb2F0IGNvbGxpc2lvbj1hX2ZsYWdzLng7ZmxvYXQgdmVydGV4SWR4PWFfZmxhZ3MueTt2ZWMyIHF1YWRWZXJ0ZXhPZmZzZXQ9dmVjMihtaXgoLTEuMCwxLjAsZmxvYXQodmVydGV4SWR4ID49Mi4wKSksbWl4KC0xLjAsMS4wLGZsb2F0KHZlcnRleElkeCA+PTEuMCAmJiB2ZXJ0ZXhJZHggPD0yLjApKSk7dmVjMiBxdWFkVmVydGV4RXh0ZW50PXF1YWRWZXJ0ZXhPZmZzZXQqcmFkaXVzO3ZlYzMgdGlsZVBvcz10b1RpbGVQb3NpdGlvbihxdWFkQ2VudGVyUG9zKTt2ZWM0IGNsaXBQb3M9dV9tYXRyaXgqdmVjNCh0aWxlUG9zLDEuMCk7aGlnaHAgZmxvYXQgY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZT1jbGlwUG9zLnc7aGlnaHAgZmxvYXQgY29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqKHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlKSwwLjAsNC4wKTtmbG9hdCBwYWRkaW5nX2ZhY3Rvcj0xLjI7dl9yYWRpdXM9cmFkaXVzO3ZfZXh0cnVkZT1xdWFkVmVydGV4RXh0ZW50KnBhZGRpbmdfZmFjdG9yO3ZfcGVyc3BlY3RpdmVfcmF0aW89Y29sbGlzaW9uX3BlcnNwZWN0aXZlX3JhdGlvO3ZfY29sbGlzaW9uPWNvbGxpc2lvbjtnbF9Qb3NpdGlvbj12ZWM0KGNsaXBQb3MueHl6L2NsaXBQb3MudywxLjApK3ZlYzQocXVhZFZlcnRleEV4dGVudCpwYWRkaW5nX2ZhY3Rvci91X3ZpZXdwb3J0X3NpemUqMi4wLDAuMCwwLjApO31cIiksXG4gICAgICAgIHRpID0gZ2koXCJ1bmlmb3JtIGhpZ2hwIHZlYzQgdV9jb2xvcjt1bmlmb3JtIHNhbXBsZXIyRCB1X292ZXJsYXk7dmFyeWluZyB2ZWMyIHZfdXY7dm9pZCBtYWluKCkge3ZlYzQgb3ZlcmxheV9jb2xvcj10ZXh0dXJlMkQodV9vdmVybGF5LHZfdXYpO2dsX0ZyYWdDb2xvcj1taXgodV9jb2xvcixvdmVybGF5X2NvbG9yLG92ZXJsYXlfY29sb3IuYSk7fVwiLCBcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO3ZhcnlpbmcgdmVjMiB2X3V2O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIGZsb2F0IHVfb3ZlcmxheV9zY2FsZTt2b2lkIG1haW4oKSB7dl91dj1hX3Bvcy84MTkyLjA7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3Bvcyp1X292ZXJsYXlfc2NhbGUsMCwxKTt9XCIpLFxuICAgICAgICBlaSA9IGdpKFwiI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX0ZyYWdDb2xvcj1jb2xvcipvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJhdHRyaWJ1dGUgdmVjMiBhX3Bvczt1bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt9XCIpLFxuICAgICAgICBpaSA9IGdpKFwidmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZmxvYXQgZGlzdD1sZW5ndGgodl9wb3MtZ2xfRnJhZ0Nvb3JkLnh5KTtmbG9hdCBhbHBoYT0xLjAtc21vb3Roc3RlcCgwLjAsMS4wLGRpc3QpO2dsX0ZyYWdDb2xvcj1vdXRsaW5lX2NvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3dvcmxkO3ZhcnlpbmcgdmVjMiB2X3BvcztcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgb3V0bGluZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgb3V0bGluZV9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbmdsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3Bvcz0oZ2xfUG9zaXRpb24ueHkvZ2xfUG9zaXRpb24udysxLjApLzIuMCp1X3dvcmxkO31cIiksXG4gICAgICAgIG9pID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dW5pZm9ybSBmbG9hdCB1X2ZhZGU7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2Zsb2F0IGRpc3Q9bGVuZ3RoKHZfcG9zLWdsX0ZyYWdDb29yZC54eSk7ZmxvYXQgYWxwaGE9MS4wLXNtb290aHN0ZXAoMC4wLDEuMCxkaXN0KTtnbF9GcmFnQ29sb3I9bWl4KGNvbG9yMSxjb2xvcjIsdV9mYWRlKSphbHBoYSpvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7dW5pZm9ybSB2ZWMyIHVfd29ybGQ7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfdXBwZXI7dW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfbG93ZXI7dW5pZm9ybSB2ZWMzIHVfc2NhbGU7YXR0cmlidXRlIHZlYzIgYV9wb3M7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWMyIHZfcG9zO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dztmbG9hdCB0aWxlUmF0aW89dV9zY2FsZS54O2Zsb2F0IGZyb21TY2FsZT11X3NjYWxlLnk7ZmxvYXQgdG9TY2FsZT11X3NjYWxlLno7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZlYzIgZGlzcGxheV9zaXplX2E9KHBhdHRlcm5fYnJfYS1wYXR0ZXJuX3RsX2EpL3BpeGVsX3JhdGlvX2Zyb207dmVjMiBkaXNwbGF5X3NpemVfYj0ocGF0dGVybl9icl9iLXBhdHRlcm5fdGxfYikvcGl4ZWxfcmF0aW9fdG87dl9wb3NfYT1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLGZyb21TY2FsZSpkaXNwbGF5X3NpemVfYSx0aWxlUmF0aW8sYV9wb3MpO3ZfcG9zX2I9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix0b1NjYWxlKmRpc3BsYXlfc2l6ZV9iLHRpbGVSYXRpbyxhX3Bvcyk7dl9wb3M9KGdsX1Bvc2l0aW9uLnh5L2dsX1Bvc2l0aW9uLncrMS4wKS8yLjAqdV93b3JsZDt9XCIpLFxuICAgICAgICByaSA9IGdpKFwidW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfZmFkZTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiB2X3Bvc19hO3ZhcnlpbmcgdmVjMiB2X3Bvc19iO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG52ZWMyIHBhdHRlcm5fdGxfYT1wYXR0ZXJuX2Zyb20ueHk7dmVjMiBwYXR0ZXJuX2JyX2E9cGF0dGVybl9mcm9tLnp3O3ZlYzIgcGF0dGVybl90bF9iPXBhdHRlcm5fdG8ueHk7dmVjMiBwYXR0ZXJuX2JyX2I9cGF0dGVybl90by56dzt2ZWMyIGltYWdlY29vcmQ9bW9kKHZfcG9zX2EsMS4wKTt2ZWMyIHBvcz1taXgocGF0dGVybl90bF9hL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2EvdV90ZXhzaXplLGltYWdlY29vcmQpO3ZlYzQgY29sb3IxPXRleHR1cmUyRCh1X2ltYWdlLHBvcyk7dmVjMiBpbWFnZWNvb3JkX2I9bW9kKHZfcG9zX2IsMS4wKTt2ZWMyIHBvczI9bWl4KHBhdHRlcm5fdGxfYi91X3RleHNpemUscGF0dGVybl9icl9iL3VfdGV4c2l6ZSxpbWFnZWNvb3JkX2IpO3ZlYzQgY29sb3IyPXRleHR1cmUyRCh1X2ltYWdlLHBvczIpO2dsX0ZyYWdDb2xvcj1taXgoY29sb3IxLGNvbG9yMix1X2ZhZGUpKm9wYWNpdHk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF91cHBlcjt1bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF9sb3dlcjt1bmlmb3JtIHZlYzMgdV9zY2FsZTthdHRyaWJ1dGUgdmVjMiBhX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVpvb21SYXRpbz11X3NjYWxlLng7ZmxvYXQgZnJvbVNjYWxlPXVfc2NhbGUueTtmbG9hdCB0b1NjYWxlPXVfc2NhbGUuejt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3Bvc19hPWdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLHVfcGl4ZWxfY29vcmRfbG93ZXIsZnJvbVNjYWxlKmRpc3BsYXlfc2l6ZV9hLHRpbGVab29tUmF0aW8sYV9wb3MpO3ZfcG9zX2I9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcix0b1NjYWxlKmRpc3BsYXlfc2l6ZV9iLHRpbGVab29tUmF0aW8sYV9wb3MpO31cIiksXG4gICAgICAgIGFpID0gZ2koXCJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjt2b2lkIG1haW4oKSB7Z2xfRnJhZ0NvbG9yPXZfY29sb3I7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIHZlYzMgdV9saWdodGNvbG9yO3VuaWZvcm0gbG93cCB2ZWMzIHVfbGlnaHRwb3M7dW5pZm9ybSBsb3dwIGZsb2F0IHVfbGlnaHRpbnRlbnNpdHk7dW5pZm9ybSBmbG9hdCB1X3ZlcnRpY2FsX2dyYWRpZW50O3VuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzQgYV9ub3JtYWxfZWQ7dmFyeWluZyB2ZWM0IHZfY29sb3I7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIGZsb2F0IGhlaWdodFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG52ZWMzIG5vcm1hbD1hX25vcm1hbF9lZC54eXo7YmFzZT1tYXgoMC4wLGJhc2UpO2hlaWdodD1tYXgoMC4wLGhlaWdodCk7ZmxvYXQgdD1tb2Qobm9ybWFsLngsMi4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHQgPiAwLjAgPyBoZWlnaHQgOiBiYXNlLDEpO2Zsb2F0IGNvbG9ydmFsdWU9Y29sb3IuciowLjIxMjYrY29sb3IuZyowLjcxNTIrY29sb3IuYiowLjA3MjI7dl9jb2xvcj12ZWM0KDAuMCwwLjAsMC4wLDEuMCk7dmVjNCBhbWJpZW50bGlnaHQ9dmVjNCgwLjAzLDAuMDMsMC4wMywxLjApO2NvbG9yKz1hbWJpZW50bGlnaHQ7ZmxvYXQgZGlyZWN0aW9uYWw9Y2xhbXAoZG90KG5vcm1hbC8xNjM4NC4wLHVfbGlnaHRwb3MpLDAuMCwxLjApO2RpcmVjdGlvbmFsPW1peCgoMS4wLXVfbGlnaHRpbnRlbnNpdHkpLG1heCgoMS4wLWNvbG9ydmFsdWUrdV9saWdodGludGVuc2l0eSksMS4wKSxkaXJlY3Rpb25hbCk7aWYgKG5vcm1hbC55ICE9MC4wKSB7ZGlyZWN0aW9uYWwqPSgoMS4wLXVfdmVydGljYWxfZ3JhZGllbnQpKyh1X3ZlcnRpY2FsX2dyYWRpZW50KmNsYW1wKCh0K2Jhc2UpKnBvdyhoZWlnaHQvMTUwLjAsMC41KSxtaXgoMC43LDAuOTgsMS4wLXVfbGlnaHRpbnRlbnNpdHkpLDEuMCkpKTt9dl9jb2xvci5yKz1jbGFtcChjb2xvci5yKmRpcmVjdGlvbmFsKnVfbGlnaHRjb2xvci5yLG1peCgwLjAsMC4zLDEuMC11X2xpZ2h0Y29sb3IuciksMS4wKTt2X2NvbG9yLmcrPWNsYW1wKGNvbG9yLmcqZGlyZWN0aW9uYWwqdV9saWdodGNvbG9yLmcsbWl4KDAuMCwwLjMsMS4wLXVfbGlnaHRjb2xvci5nKSwxLjApO3ZfY29sb3IuYis9Y2xhbXAoY29sb3IuYipkaXJlY3Rpb25hbCp1X2xpZ2h0Y29sb3IuYixtaXgoMC4wLDAuMywxLjAtdV9saWdodGNvbG9yLmIpLDEuMCk7dl9jb2xvcio9dV9vcGFjaXR5O31cIiksXG4gICAgICAgIG5pID0gZ2koXCJ1bmlmb3JtIHZlYzIgdV90ZXhzaXplO3VuaWZvcm0gZmxvYXQgdV9mYWRlO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfcG9zX2E7dmFyeWluZyB2ZWMyIHZfcG9zX2I7dmFyeWluZyB2ZWM0IHZfbGlnaHRpbmc7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGVpZ2h0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZlYzIgcGF0dGVybl90bF9hPXBhdHRlcm5fZnJvbS54eTt2ZWMyIHBhdHRlcm5fYnJfYT1wYXR0ZXJuX2Zyb20uenc7dmVjMiBwYXR0ZXJuX3RsX2I9cGF0dGVybl90by54eTt2ZWMyIHBhdHRlcm5fYnJfYj1wYXR0ZXJuX3RvLnp3O3ZlYzIgaW1hZ2Vjb29yZD1tb2Qodl9wb3NfYSwxLjApO3ZlYzIgcG9zPW1peChwYXR0ZXJuX3RsX2EvdV90ZXhzaXplLHBhdHRlcm5fYnJfYS91X3RleHNpemUsaW1hZ2Vjb29yZCk7dmVjNCBjb2xvcjE9dGV4dHVyZTJEKHVfaW1hZ2UscG9zKTt2ZWMyIGltYWdlY29vcmRfYj1tb2Qodl9wb3NfYiwxLjApO3ZlYzIgcG9zMj1taXgocGF0dGVybl90bF9iL3VfdGV4c2l6ZSxwYXR0ZXJuX2JyX2IvdV90ZXhzaXplLGltYWdlY29vcmRfYik7dmVjNCBjb2xvcjI9dGV4dHVyZTJEKHVfaW1hZ2UscG9zMik7dmVjNCBtaXhlZENvbG9yPW1peChjb2xvcjEsY29sb3IyLHVfZmFkZSk7Z2xfRnJhZ0NvbG9yPW1peGVkQ29sb3Iqdl9saWdodGluZztcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO3VuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO3VuaWZvcm0gZmxvYXQgdV9oZWlnaHRfZmFjdG9yO3VuaWZvcm0gdmVjMyB1X3NjYWxlO3VuaWZvcm0gZmxvYXQgdV92ZXJ0aWNhbF9ncmFkaWVudDt1bmlmb3JtIGxvd3AgZmxvYXQgdV9vcGFjaXR5O3VuaWZvcm0gdmVjMyB1X2xpZ2h0Y29sb3I7dW5pZm9ybSBsb3dwIHZlYzMgdV9saWdodHBvczt1bmlmb3JtIGxvd3AgZmxvYXQgdV9saWdodGludGVuc2l0eTthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjNCBhX25vcm1hbF9lZDt2YXJ5aW5nIHZlYzIgdl9wb3NfYTt2YXJ5aW5nIHZlYzIgdl9wb3NfYjt2YXJ5aW5nIHZlYzQgdl9saWdodGluZztcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fdG9cXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVJhdGlvPXVfc2NhbGUueDtmbG9hdCBmcm9tU2NhbGU9dV9zY2FsZS55O2Zsb2F0IHRvU2NhbGU9dV9zY2FsZS56O3ZlYzMgbm9ybWFsPWFfbm9ybWFsX2VkLnh5ejtmbG9hdCBlZGdlZGlzdGFuY2U9YV9ub3JtYWxfZWQudzt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO2Jhc2U9bWF4KDAuMCxiYXNlKTtoZWlnaHQ9bWF4KDAuMCxoZWlnaHQpO2Zsb2F0IHQ9bW9kKG5vcm1hbC54LDIuMCk7ZmxvYXQgej10ID4gMC4wID8gaGVpZ2h0IDogYmFzZTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KGFfcG9zLHosMSk7dmVjMiBwb3M9bm9ybWFsLng9PTEuMCAmJiBub3JtYWwueT09MC4wICYmIG5vcm1hbC56PT0xNjM4NC4wXFxuPyBhX3Bvc1xcbjogdmVjMihlZGdlZGlzdGFuY2Useip1X2hlaWdodF9mYWN0b3IpO3ZfcG9zX2E9Z2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsdV9waXhlbF9jb29yZF9sb3dlcixmcm9tU2NhbGUqZGlzcGxheV9zaXplX2EsdGlsZVJhdGlvLHBvcyk7dl9wb3NfYj1nZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlcix1X3BpeGVsX2Nvb3JkX2xvd2VyLHRvU2NhbGUqZGlzcGxheV9zaXplX2IsdGlsZVJhdGlvLHBvcyk7dl9saWdodGluZz12ZWM0KDAuMCwwLjAsMC4wLDEuMCk7ZmxvYXQgZGlyZWN0aW9uYWw9Y2xhbXAoZG90KG5vcm1hbC8xNjM4My4wLHVfbGlnaHRwb3MpLDAuMCwxLjApO2RpcmVjdGlvbmFsPW1peCgoMS4wLXVfbGlnaHRpbnRlbnNpdHkpLG1heCgoMC41K3VfbGlnaHRpbnRlbnNpdHkpLDEuMCksZGlyZWN0aW9uYWwpO2lmIChub3JtYWwueSAhPTAuMCkge2RpcmVjdGlvbmFsKj0oKDEuMC11X3ZlcnRpY2FsX2dyYWRpZW50KSsodV92ZXJ0aWNhbF9ncmFkaWVudCpjbGFtcCgodCtiYXNlKSpwb3coaGVpZ2h0LzE1MC4wLDAuNSksbWl4KDAuNywwLjk4LDEuMC11X2xpZ2h0aW50ZW5zaXR5KSwxLjApKSk7fXZfbGlnaHRpbmcucmdiKz1jbGFtcChkaXJlY3Rpb25hbCp1X2xpZ2h0Y29sb3IsbWl4KHZlYzMoMC4wKSx2ZWMzKDAuMyksMS4wLXVfbGlnaHRjb2xvciksdmVjMygxLjApKTt2X2xpZ2h0aW5nKj11X29wYWNpdHk7fVwiKSxcbiAgICAgICAgc2kgPSBnaShcIiNpZmRlZiBHTF9FU1xcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZW5kaWZcXG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3ZhcnlpbmcgdmVjMiB2X3Bvczt1bmlmb3JtIHZlYzIgdV9kaW1lbnNpb247dW5pZm9ybSBmbG9hdCB1X3pvb207dW5pZm9ybSB2ZWM0IHVfdW5wYWNrO2Zsb2F0IGdldEVsZXZhdGlvbih2ZWMyIGNvb3JkLGZsb2F0IGJpYXMpIHt2ZWM0IGRhdGE9dGV4dHVyZTJEKHVfaW1hZ2UsY29vcmQpKjI1NS4wO2RhdGEuYT0tMS4wO3JldHVybiBkb3QoZGF0YSx1X3VucGFjaykvNC4wO312b2lkIG1haW4oKSB7dmVjMiBlcHNpbG9uPTEuMC91X2RpbWVuc2lvbjtmbG9hdCBhPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKC1lcHNpbG9uLngsLWVwc2lsb24ueSksMC4wKTtmbG9hdCBiPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKDAsLWVwc2lsb24ueSksMC4wKTtmbG9hdCBjPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKGVwc2lsb24ueCwtZXBzaWxvbi55KSwwLjApO2Zsb2F0IGQ9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoLWVwc2lsb24ueCwwKSwwLjApO2Zsb2F0IGU9Z2V0RWxldmF0aW9uKHZfcG9zLDAuMCk7ZmxvYXQgZj1nZXRFbGV2YXRpb24odl9wb3MrdmVjMihlcHNpbG9uLngsMCksMC4wKTtmbG9hdCBnPWdldEVsZXZhdGlvbih2X3Bvcyt2ZWMyKC1lcHNpbG9uLngsZXBzaWxvbi55KSwwLjApO2Zsb2F0IGg9Z2V0RWxldmF0aW9uKHZfcG9zK3ZlYzIoMCxlcHNpbG9uLnkpLDAuMCk7ZmxvYXQgaT1nZXRFbGV2YXRpb24odl9wb3MrdmVjMihlcHNpbG9uLngsZXBzaWxvbi55KSwwLjApO2Zsb2F0IGV4YWdnZXJhdGlvbkZhY3Rvcj11X3pvb20gPCAyLjAgPyAwLjQgOiB1X3pvb20gPCA0LjUgPyAwLjM1IDogMC4zO2Zsb2F0IGV4YWdnZXJhdGlvbj11X3pvb20gPCAxNS4wID8gKHVfem9vbS0xNS4wKSpleGFnZ2VyYXRpb25GYWN0b3IgOiAwLjA7dmVjMiBkZXJpdj12ZWMyKChjK2YrZitpKS0oYStkK2QrZyksKGcraCtoK2kpLShhK2IrYitjKSkvcG93KDIuMCxleGFnZ2VyYXRpb24rKDE5LjI1NjItdV96b29tKSk7Z2xfRnJhZ0NvbG9yPWNsYW1wKHZlYzQoZGVyaXYueC8yLjArMC41LGRlcml2LnkvMi4wKzAuNSwxLjAsMS4wKSwwLjAsMS4wKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X2RpbWVuc2lvbjthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO2hpZ2hwIHZlYzIgZXBzaWxvbj0xLjAvdV9kaW1lbnNpb247ZmxvYXQgc2NhbGU9KHVfZGltZW5zaW9uLngtMi4wKS91X2RpbWVuc2lvbi54O3ZfcG9zPShhX3RleHR1cmVfcG9zLzgxOTIuMCkqc2NhbGUrZXBzaWxvbjt9XCIpLFxuICAgICAgICBsaSA9IGdpKFwidW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTt2YXJ5aW5nIHZlYzIgdl9wb3M7dW5pZm9ybSB2ZWMyIHVfbGF0cmFuZ2U7dW5pZm9ybSB2ZWMyIHVfbGlnaHQ7dW5pZm9ybSB2ZWM0IHVfc2hhZG93O3VuaWZvcm0gdmVjNCB1X2hpZ2hsaWdodDt1bmlmb3JtIHZlYzQgdV9hY2NlbnQ7XFxuI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5M1xcbnZvaWQgbWFpbigpIHt2ZWM0IHBpeGVsPXRleHR1cmUyRCh1X2ltYWdlLHZfcG9zKTt2ZWMyIGRlcml2PSgocGl4ZWwucmcqMi4wKS0xLjApO2Zsb2F0IHNjYWxlRmFjdG9yPWNvcyhyYWRpYW5zKCh1X2xhdHJhbmdlWzBdLXVfbGF0cmFuZ2VbMV0pKigxLjAtdl9wb3MueSkrdV9sYXRyYW5nZVsxXSkpO2Zsb2F0IHNsb3BlPWF0YW4oMS4yNSpsZW5ndGgoZGVyaXYpL3NjYWxlRmFjdG9yKTtmbG9hdCBhc3BlY3Q9ZGVyaXYueCAhPTAuMCA/IGF0YW4oZGVyaXYueSwtZGVyaXYueCkgOiBQSS8yLjAqKGRlcml2LnkgPiAwLjAgPyAxLjAgOi0xLjApO2Zsb2F0IGludGVuc2l0eT11X2xpZ2h0Lng7ZmxvYXQgYXppbXV0aD11X2xpZ2h0LnkrUEk7ZmxvYXQgYmFzZT0xLjg3NS1pbnRlbnNpdHkqMS43NTtmbG9hdCBtYXhWYWx1ZT0wLjUqUEk7ZmxvYXQgc2NhbGVkU2xvcGU9aW50ZW5zaXR5ICE9MC41ID8gKChwb3coYmFzZSxzbG9wZSktMS4wKS8ocG93KGJhc2UsbWF4VmFsdWUpLTEuMCkpKm1heFZhbHVlIDogc2xvcGU7ZmxvYXQgYWNjZW50PWNvcyhzY2FsZWRTbG9wZSk7dmVjNCBhY2NlbnRfY29sb3I9KDEuMC1hY2NlbnQpKnVfYWNjZW50KmNsYW1wKGludGVuc2l0eSoyLjAsMC4wLDEuMCk7ZmxvYXQgc2hhZGU9YWJzKG1vZCgoYXNwZWN0K2F6aW11dGgpL1BJKzAuNSwyLjApLTEuMCk7dmVjNCBzaGFkZV9jb2xvcj1taXgodV9zaGFkb3csdV9oaWdobGlnaHQsc2hhZGUpKnNpbihzY2FsZWRTbG9wZSkqY2xhbXAoaW50ZW5zaXR5KjIuMCwwLjAsMS4wKTtnbF9GcmFnQ29sb3I9YWNjZW50X2NvbG9yKigxLjAtc2hhZGVfY29sb3IuYSkrc2hhZGVfY29sb3I7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcInVuaWZvcm0gbWF0NCB1X21hdHJpeDthdHRyaWJ1dGUgdmVjMiBhX3BvczthdHRyaWJ1dGUgdmVjMiBhX3RleHR1cmVfcG9zO3ZhcnlpbmcgdmVjMiB2X3Bvczt2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChhX3BvcywwLDEpO3ZfcG9zPWFfdGV4dHVyZV9wb3MvODE5Mi4wO31cIiksXG4gICAgICAgIGNpID0gZ2koXCJ1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuZmxvYXQgZGlzdD1sZW5ndGgodl9ub3JtYWwpKnZfd2lkdGgyLnM7ZmxvYXQgYmx1cjI9KGJsdXIrMS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvKSp2X2dhbW1hX3NjYWxlO2Zsb2F0IGFscGhhPWNsYW1wKG1pbihkaXN0LSh2X3dpZHRoMi50LWJsdXIyKSx2X3dpZHRoMi5zLWRpc3QpL2JsdXIyLDAuMCwxLjApO2dsX0ZyYWdDb2xvcj1jb2xvciooYWxwaGEqb3BhY2l0eSk7XFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbmdsX0ZyYWdDb2xvcj12ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVwiLCBcIlxcbiNkZWZpbmUgc2NhbGUgMC4wMTU4NzMwMTZcXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc19ub3JtYWw7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIHZlYzIgdV91bml0c190b19waXhlbHM7dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO3ZhcnlpbmcgaGlnaHAgZmxvYXQgdl9saW5lc29mYXI7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO3ZfbGluZXNvZmFyPShmbG9vcihhX2RhdGEuei80LjApK2FfZGF0YS53KjY0LjApKjIuMDt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt9XCIpLFxuICAgICAgICB1aSA9IGdpKFwidW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfd2lkdGgyO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7dmFyeWluZyBoaWdocCB2ZWMyIHZfdXY7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5mbG9hdCBkaXN0PWxlbmd0aCh2X25vcm1hbCkqdl93aWR0aDIucztmbG9hdCBibHVyMj0oYmx1cisxLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8pKnZfZ2FtbWFfc2NhbGU7ZmxvYXQgYWxwaGE9Y2xhbXAobWluKGRpc3QtKHZfd2lkdGgyLnQtYmx1cjIpLHZfd2lkdGgyLnMtZGlzdCkvYmx1cjIsMC4wLDEuMCk7dmVjNCBjb2xvcj10ZXh0dXJlMkQodV9pbWFnZSx2X3V2KTtnbF9GcmFnQ29sb3I9Y29sb3IqKGFscGhhKm9wYWNpdHkpO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuYXR0cmlidXRlIHZlYzIgYV9wb3Nfbm9ybWFsO2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgZmxvYXQgYV91dl94O2F0dHJpYnV0ZSBmbG9hdCBhX3NwbGl0X2luZGV4O3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfdW5pdHNfdG9fcGl4ZWxzO3VuaWZvcm0gZmxvYXQgdV9pbWFnZV9oZWlnaHQ7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7dmFyeWluZyBoaWdocCB2ZWMyIHZfdXY7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbmZsb2F0IEFOVElBTElBU0lORz0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vMi4wO3ZlYzIgYV9leHRydWRlPWFfZGF0YS54eS0xMjguMDtmbG9hdCBhX2RpcmVjdGlvbj1tb2QoYV9kYXRhLnosNC4wKS0xLjA7aGlnaHAgZmxvYXQgdGV4ZWxfaGVpZ2h0PTEuMC91X2ltYWdlX2hlaWdodDtoaWdocCBmbG9hdCBoYWxmX3RleGVsX2hlaWdodD0wLjUqdGV4ZWxfaGVpZ2h0O3ZfdXY9dmVjMihhX3V2X3gsYV9zcGxpdF9pbmRleCp0ZXhlbF9oZWlnaHQtaGFsZl90ZXhlbF9oZWlnaHQpO3ZlYzIgcG9zPWZsb29yKGFfcG9zX25vcm1hbCowLjUpO21lZGl1bXAgdmVjMiBub3JtYWw9YV9wb3Nfbm9ybWFsLTIuMCpwb3M7bm9ybWFsLnk9bm9ybWFsLnkqMi4wLTEuMDt2X25vcm1hbD1ub3JtYWw7Z2Fwd2lkdGg9Z2Fwd2lkdGgvMi4wO2Zsb2F0IGhhbGZ3aWR0aD13aWR0aC8yLjA7b2Zmc2V0PS0xLjAqb2Zmc2V0O2Zsb2F0IGluc2V0PWdhcHdpZHRoKyhnYXB3aWR0aCA+IDAuMCA/IEFOVElBTElBU0lORyA6IDAuMCk7ZmxvYXQgb3V0c2V0PWdhcHdpZHRoK2hhbGZ3aWR0aCooZ2Fwd2lkdGggPiAwLjAgPyAyLjAgOiAxLjApKyhoYWxmd2lkdGg9PTAuMCA/IDAuMCA6IEFOVElBTElBU0lORyk7bWVkaXVtcCB2ZWMyIGRpc3Q9b3V0c2V0KmFfZXh0cnVkZSpzY2FsZTttZWRpdW1wIGZsb2F0IHU9MC41KmFfZGlyZWN0aW9uO21lZGl1bXAgZmxvYXQgdD0xLjAtYWJzKHUpO21lZGl1bXAgdmVjMiBvZmZzZXQyPW9mZnNldCphX2V4dHJ1ZGUqc2NhbGUqbm9ybWFsLnkqbWF0Mih0LC11LHUsdCk7dmVjNCBwcm9qZWN0ZWRfZXh0cnVkZT11X21hdHJpeCp2ZWM0KGRpc3QvdV9yYXRpbywwLjAsMC4wKTtnbF9Qb3NpdGlvbj11X21hdHJpeCp2ZWM0KHBvcytvZmZzZXQyL3VfcmF0aW8sMC4wLDEuMCkrcHJvamVjdGVkX2V4dHJ1ZGU7ZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZT1sZW5ndGgoZGlzdCk7ZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZT1sZW5ndGgocHJvamVjdGVkX2V4dHJ1ZGUueHkvZ2xfUG9zaXRpb24udyp1X3VuaXRzX3RvX3BpeGVscyk7dl9nYW1tYV9zY2FsZT1leHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlL2V4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU7dl93aWR0aDI9dmVjMihvdXRzZXQsaW5zZXQpO31cIiksXG4gICAgICAgIGhpID0gZ2koXCJ1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIGZsb2F0IHVfZmFkZTt1bmlmb3JtIG1lZGl1bXAgdmVjMyB1X3NjYWxlO3VuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGZsb2F0IHZfd2lkdGg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgcGF0dGVybl90b1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIHZlYzQgcGF0dGVybl9mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX2Zyb21cXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHBpeGVsX3JhdGlvX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxudmVjMiBwYXR0ZXJuX3RsX2E9cGF0dGVybl9mcm9tLnh5O3ZlYzIgcGF0dGVybl9icl9hPXBhdHRlcm5fZnJvbS56dzt2ZWMyIHBhdHRlcm5fdGxfYj1wYXR0ZXJuX3RvLnh5O3ZlYzIgcGF0dGVybl9icl9iPXBhdHRlcm5fdG8uenc7ZmxvYXQgdGlsZVpvb21SYXRpbz11X3NjYWxlLng7ZmxvYXQgZnJvbVNjYWxlPXVfc2NhbGUueTtmbG9hdCB0b1NjYWxlPXVfc2NhbGUuejt2ZWMyIGRpc3BsYXlfc2l6ZV9hPShwYXR0ZXJuX2JyX2EtcGF0dGVybl90bF9hKS9waXhlbF9yYXRpb19mcm9tO3ZlYzIgZGlzcGxheV9zaXplX2I9KHBhdHRlcm5fYnJfYi1wYXR0ZXJuX3RsX2IpL3BpeGVsX3JhdGlvX3RvO3ZlYzIgcGF0dGVybl9zaXplX2E9dmVjMihkaXNwbGF5X3NpemVfYS54KmZyb21TY2FsZS90aWxlWm9vbVJhdGlvLGRpc3BsYXlfc2l6ZV9hLnkpO3ZlYzIgcGF0dGVybl9zaXplX2I9dmVjMihkaXNwbGF5X3NpemVfYi54KnRvU2NhbGUvdGlsZVpvb21SYXRpbyxkaXNwbGF5X3NpemVfYi55KTtmbG9hdCBhc3BlY3RfYT1kaXNwbGF5X3NpemVfYS55L3Zfd2lkdGg7ZmxvYXQgYXNwZWN0X2I9ZGlzcGxheV9zaXplX2IueS92X3dpZHRoO2Zsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTtmbG9hdCB4X2E9bW9kKHZfbGluZXNvZmFyL3BhdHRlcm5fc2l6ZV9hLngqYXNwZWN0X2EsMS4wKTtmbG9hdCB4X2I9bW9kKHZfbGluZXNvZmFyL3BhdHRlcm5fc2l6ZV9iLngqYXNwZWN0X2IsMS4wKTtmbG9hdCB5PTAuNSp2X25vcm1hbC55KzAuNTt2ZWMyIHRleGVsX3NpemU9MS4wL3VfdGV4c2l6ZTt2ZWMyIHBvc19hPW1peChwYXR0ZXJuX3RsX2EqdGV4ZWxfc2l6ZS10ZXhlbF9zaXplLHBhdHRlcm5fYnJfYSp0ZXhlbF9zaXplK3RleGVsX3NpemUsdmVjMih4X2EseSkpO3ZlYzIgcG9zX2I9bWl4KHBhdHRlcm5fdGxfYip0ZXhlbF9zaXplLXRleGVsX3NpemUscGF0dGVybl9icl9iKnRleGVsX3NpemUrdGV4ZWxfc2l6ZSx2ZWMyKHhfYix5KSk7dmVjNCBjb2xvcj1taXgodGV4dHVyZTJEKHVfaW1hZ2UscG9zX2EpLHRleHR1cmUyRCh1X2ltYWdlLHBvc19iKSx1X2ZhZGUpO2dsX0ZyYWdDb2xvcj1jb2xvciphbHBoYSpvcGFjaXR5O1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJcXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XFxuI2RlZmluZSBMSU5FX0RJU1RBTkNFX1NDQUxFIDIuMFxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zX25vcm1hbDthdHRyaWJ1dGUgdmVjNCBhX2RhdGE7dW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3VuaXRzX3RvX3BpeGVsczt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWMyIHZfbm9ybWFsO3ZhcnlpbmcgdmVjMiB2X3dpZHRoMjt2YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO3ZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTt2YXJ5aW5nIGZsb2F0IHZfd2lkdGg7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvZmZzZXRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IHBhdHRlcm5fdG9cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgcGl4ZWxfcmF0aW9fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBmbG9vcndpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCB2ZWM0IHBhdHRlcm5fZnJvbVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgdmVjNCBwYXR0ZXJuX3RvXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb19mcm9tXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBwaXhlbF9yYXRpb190b1xcbmZsb2F0IEFOVElBTElBU0lORz0xLjAvdV9kZXZpY2VfcGl4ZWxfcmF0aW8vMi4wO3ZlYzIgYV9leHRydWRlPWFfZGF0YS54eS0xMjguMDtmbG9hdCBhX2RpcmVjdGlvbj1tb2QoYV9kYXRhLnosNC4wKS0xLjA7ZmxvYXQgYV9saW5lc29mYXI9KGZsb29yKGFfZGF0YS56LzQuMCkrYV9kYXRhLncqNjQuMCkqTElORV9ESVNUQU5DRV9TQ0FMRTt2ZWMyIHBvcz1mbG9vcihhX3Bvc19ub3JtYWwqMC41KTttZWRpdW1wIHZlYzIgbm9ybWFsPWFfcG9zX25vcm1hbC0yLjAqcG9zO25vcm1hbC55PW5vcm1hbC55KjIuMC0xLjA7dl9ub3JtYWw9bm9ybWFsO2dhcHdpZHRoPWdhcHdpZHRoLzIuMDtmbG9hdCBoYWxmd2lkdGg9d2lkdGgvMi4wO29mZnNldD0tMS4wKm9mZnNldDtmbG9hdCBpbnNldD1nYXB3aWR0aCsoZ2Fwd2lkdGggPiAwLjAgPyBBTlRJQUxJQVNJTkcgOiAwLjApO2Zsb2F0IG91dHNldD1nYXB3aWR0aCtoYWxmd2lkdGgqKGdhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSsoaGFsZndpZHRoPT0wLjAgPyAwLjAgOiBBTlRJQUxJQVNJTkcpO21lZGl1bXAgdmVjMiBkaXN0PW91dHNldCphX2V4dHJ1ZGUqc2NhbGU7bWVkaXVtcCBmbG9hdCB1PTAuNSphX2RpcmVjdGlvbjttZWRpdW1wIGZsb2F0IHQ9MS4wLWFicyh1KTttZWRpdW1wIHZlYzIgb2Zmc2V0Mj1vZmZzZXQqYV9leHRydWRlKnNjYWxlKm5vcm1hbC55Km1hdDIodCwtdSx1LHQpO3ZlYzQgcHJvamVjdGVkX2V4dHJ1ZGU9dV9tYXRyaXgqdmVjNChkaXN0L3VfcmF0aW8sMC4wLDAuMCk7Z2xfUG9zaXRpb249dV9tYXRyaXgqdmVjNChwb3Mrb2Zmc2V0Mi91X3JhdGlvLDAuMCwxLjApK3Byb2plY3RlZF9leHRydWRlO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmU9bGVuZ3RoKGRpc3QpO2Zsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU9bGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5L2dsX1Bvc2l0aW9uLncqdV91bml0c190b19waXhlbHMpO3ZfZ2FtbWFfc2NhbGU9ZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZS9leHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO3ZfbGluZXNvZmFyPWFfbGluZXNvZmFyO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt2X3dpZHRoPWZsb29yd2lkdGg7fVwiKSxcbiAgICAgICAgcGkgPSBnaShcInVuaWZvcm0gbG93cCBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbzt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO3VuaWZvcm0gZmxvYXQgdV9zZGZnYW1tYTt1bmlmb3JtIGZsb2F0IHVfbWl4O3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfdGV4X2E7dmFyeWluZyB2ZWMyIHZfdGV4X2I7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCB3aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgZmxvb3J3aWR0aFxcbmZsb2F0IGRpc3Q9bGVuZ3RoKHZfbm9ybWFsKSp2X3dpZHRoMi5zO2Zsb2F0IGJsdXIyPShibHVyKzEuMC91X2RldmljZV9waXhlbF9yYXRpbykqdl9nYW1tYV9zY2FsZTtmbG9hdCBhbHBoYT1jbGFtcChtaW4oZGlzdC0odl93aWR0aDIudC1ibHVyMiksdl93aWR0aDIucy1kaXN0KS9ibHVyMiwwLjAsMS4wKTtmbG9hdCBzZGZkaXN0X2E9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYSkuYTtmbG9hdCBzZGZkaXN0X2I9dGV4dHVyZTJEKHVfaW1hZ2Usdl90ZXhfYikuYTtmbG9hdCBzZGZkaXN0PW1peChzZGZkaXN0X2Esc2RmZGlzdF9iLHVfbWl4KTthbHBoYSo9c21vb3Roc3RlcCgwLjUtdV9zZGZnYW1tYS9mbG9vcndpZHRoLDAuNSt1X3NkZmdhbW1hL2Zsb29yd2lkdGgsc2RmZGlzdCk7Z2xfRnJhZ0NvbG9yPWNvbG9yKihhbHBoYSpvcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcXG5hdHRyaWJ1dGUgdmVjMiBhX3Bvc19ub3JtYWw7YXR0cmlidXRlIHZlYzQgYV9kYXRhO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbzt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2E7dW5pZm9ybSBmbG9hdCB1X3RleF95X2E7dW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2I7dW5pZm9ybSBmbG9hdCB1X3RleF95X2I7dW5pZm9ybSB2ZWMyIHVfdW5pdHNfdG9fcGl4ZWxzO3ZhcnlpbmcgdmVjMiB2X25vcm1hbDt2YXJ5aW5nIHZlYzIgdl93aWR0aDI7dmFyeWluZyB2ZWMyIHZfdGV4X2E7dmFyeWluZyB2ZWMyIHZfdGV4X2I7dmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGZsb29yd2lkdGhcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGZsb29yd2lkdGhcXG5mbG9hdCBBTlRJQUxJQVNJTkc9MS4wL3VfZGV2aWNlX3BpeGVsX3JhdGlvLzIuMDt2ZWMyIGFfZXh0cnVkZT1hX2RhdGEueHktMTI4LjA7ZmxvYXQgYV9kaXJlY3Rpb249bW9kKGFfZGF0YS56LDQuMCktMS4wO2Zsb2F0IGFfbGluZXNvZmFyPShmbG9vcihhX2RhdGEuei80LjApK2FfZGF0YS53KjY0LjApKkxJTkVfRElTVEFOQ0VfU0NBTEU7dmVjMiBwb3M9Zmxvb3IoYV9wb3Nfbm9ybWFsKjAuNSk7bWVkaXVtcCB2ZWMyIG5vcm1hbD1hX3Bvc19ub3JtYWwtMi4wKnBvcztub3JtYWwueT1ub3JtYWwueSoyLjAtMS4wO3Zfbm9ybWFsPW5vcm1hbDtnYXB3aWR0aD1nYXB3aWR0aC8yLjA7ZmxvYXQgaGFsZndpZHRoPXdpZHRoLzIuMDtvZmZzZXQ9LTEuMCpvZmZzZXQ7ZmxvYXQgaW5zZXQ9Z2Fwd2lkdGgrKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtmbG9hdCBvdXRzZXQ9Z2Fwd2lkdGgraGFsZndpZHRoKihnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkrKGhhbGZ3aWR0aD09MC4wID8gMC4wIDogQU5USUFMSUFTSU5HKTttZWRpdW1wIHZlYzIgZGlzdD1vdXRzZXQqYV9leHRydWRlKnNjYWxlO21lZGl1bXAgZmxvYXQgdT0wLjUqYV9kaXJlY3Rpb247bWVkaXVtcCBmbG9hdCB0PTEuMC1hYnModSk7bWVkaXVtcCB2ZWMyIG9mZnNldDI9b2Zmc2V0KmFfZXh0cnVkZSpzY2FsZSpub3JtYWwueSptYXQyKHQsLXUsdSx0KTt2ZWM0IHByb2plY3RlZF9leHRydWRlPXVfbWF0cml4KnZlYzQoZGlzdC91X3JhdGlvLDAuMCwwLjApO2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQocG9zK29mZnNldDIvdV9yYXRpbywwLjAsMS4wKStwcm9qZWN0ZWRfZXh0cnVkZTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlPWxlbmd0aChkaXN0KTtmbG9hdCBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlPWxlbmd0aChwcm9qZWN0ZWRfZXh0cnVkZS54eS9nbF9Qb3NpdGlvbi53KnVfdW5pdHNfdG9fcGl4ZWxzKTt2X2dhbW1hX3NjYWxlPWV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUvZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZTt2X3RleF9hPXZlYzIoYV9saW5lc29mYXIqdV9wYXR0ZXJuc2NhbGVfYS54L2Zsb29yd2lkdGgsbm9ybWFsLnkqdV9wYXR0ZXJuc2NhbGVfYS55K3VfdGV4X3lfYSk7dl90ZXhfYj12ZWMyKGFfbGluZXNvZmFyKnVfcGF0dGVybnNjYWxlX2IueC9mbG9vcndpZHRoLG5vcm1hbC55KnVfcGF0dGVybnNjYWxlX2IueSt1X3RleF95X2IpO3Zfd2lkdGgyPXZlYzIob3V0c2V0LGluc2V0KTt9XCIpLFxuICAgICAgICBkaSA9IGdpKFwidW5pZm9ybSBmbG9hdCB1X2ZhZGVfdDt1bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMDt1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlMTt2YXJ5aW5nIHZlYzIgdl9wb3MwO3ZhcnlpbmcgdmVjMiB2X3BvczE7dW5pZm9ybSBmbG9hdCB1X2JyaWdodG5lc3NfbG93O3VuaWZvcm0gZmxvYXQgdV9icmlnaHRuZXNzX2hpZ2g7dW5pZm9ybSBmbG9hdCB1X3NhdHVyYXRpb25fZmFjdG9yO3VuaWZvcm0gZmxvYXQgdV9jb250cmFzdF9mYWN0b3I7dW5pZm9ybSB2ZWMzIHVfc3Bpbl93ZWlnaHRzO3ZvaWQgbWFpbigpIHt2ZWM0IGNvbG9yMD10ZXh0dXJlMkQodV9pbWFnZTAsdl9wb3MwKTt2ZWM0IGNvbG9yMT10ZXh0dXJlMkQodV9pbWFnZTEsdl9wb3MxKTtpZiAoY29sb3IwLmEgPiAwLjApIHtjb2xvcjAucmdiPWNvbG9yMC5yZ2IvY29sb3IwLmE7fWlmIChjb2xvcjEuYSA+IDAuMCkge2NvbG9yMS5yZ2I9Y29sb3IxLnJnYi9jb2xvcjEuYTt9dmVjNCBjb2xvcj1taXgoY29sb3IwLGNvbG9yMSx1X2ZhZGVfdCk7Y29sb3IuYSo9dV9vcGFjaXR5O3ZlYzMgcmdiPWNvbG9yLnJnYjtyZ2I9dmVjMyhkb3QocmdiLHVfc3Bpbl93ZWlnaHRzLnh5eiksZG90KHJnYix1X3NwaW5fd2VpZ2h0cy56eHkpLGRvdChyZ2IsdV9zcGluX3dlaWdodHMueXp4KSk7ZmxvYXQgYXZlcmFnZT0oY29sb3Iucitjb2xvci5nK2NvbG9yLmIpLzMuMDtyZ2IrPShhdmVyYWdlLXJnYikqdV9zYXR1cmF0aW9uX2ZhY3RvcjtyZ2I9KHJnYi0wLjUpKnVfY29udHJhc3RfZmFjdG9yKzAuNTt2ZWMzIHVfaGlnaF92ZWM9dmVjMyh1X2JyaWdodG5lc3NfbG93LHVfYnJpZ2h0bmVzc19sb3csdV9icmlnaHRuZXNzX2xvdyk7dmVjMyB1X2xvd192ZWM9dmVjMyh1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCx1X2JyaWdodG5lc3NfaGlnaCk7Z2xfRnJhZ0NvbG9yPXZlYzQobWl4KHVfaGlnaF92ZWMsdV9sb3dfdmVjLHJnYikqY29sb3IuYSxjb2xvci5hKTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O3VuaWZvcm0gdmVjMiB1X3RsX3BhcmVudDt1bmlmb3JtIGZsb2F0IHVfc2NhbGVfcGFyZW50O3VuaWZvcm0gZmxvYXQgdV9idWZmZXJfc2NhbGU7YXR0cmlidXRlIHZlYzIgYV9wb3M7YXR0cmlidXRlIHZlYzIgYV90ZXh0dXJlX3Bvczt2YXJ5aW5nIHZlYzIgdl9wb3MwO3ZhcnlpbmcgdmVjMiB2X3BvczE7dm9pZCBtYWluKCkge2dsX1Bvc2l0aW9uPXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTt2X3BvczA9KCgoYV90ZXh0dXJlX3Bvcy84MTkyLjApLTAuNSkvdV9idWZmZXJfc2NhbGUgKSswLjU7dl9wb3MxPSh2X3BvczAqdV9zY2FsZV9wYXJlbnQpK3VfdGxfcGFyZW50O31cIiksXG4gICAgICAgIF9pID0gZ2koXCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7dmFyeWluZyB2ZWMyIHZfdGV4O3ZhcnlpbmcgZmxvYXQgdl9mYWRlX29wYWNpdHk7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxubG93cCBmbG9hdCBhbHBoYT1vcGFjaXR5KnZfZmFkZV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQodV90ZXh0dXJlLHZfdGV4KSphbHBoYTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiY29uc3QgZmxvYXQgUEk9My4xNDE1OTI2NTM1ODk3OTM7YXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9waXRjaDt1bmlmb3JtIGJvb2wgdV9yb3RhdGVfc3ltYm9sO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9hc3BlY3RfcmF0aW87dW5pZm9ybSBmbG9hdCB1X2ZhZGVfY2hhbmdlO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgdl90ZXg7dmFyeWluZyBmbG9hdCB2X2ZhZGVfb3BhY2l0eTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbnZvaWQgbWFpbigpIHtcXG4jcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG52ZWMyIGFfcG9zPWFfcG9zX29mZnNldC54eTt2ZWMyIGFfb2Zmc2V0PWFfcG9zX29mZnNldC56dzt2ZWMyIGFfdGV4PWFfZGF0YS54eTt2ZWMyIGFfc2l6ZT1hX2RhdGEuenc7ZmxvYXQgYV9zaXplX21pbj1mbG9vcihhX3NpemVbMF0qMC41KTt2ZWMyIGFfcHhvZmZzZXQ9YV9waXhlbG9mZnNldC54eTt2ZWMyIGFfbWluRm9udFNjYWxlPWFfcGl4ZWxvZmZzZXQuencvMjU2LjA7aGlnaHAgZmxvYXQgc2VnbWVudF9hbmdsZT0tYV9wcm9qZWN0ZWRfcG9zWzJdO2Zsb2F0IHNpemU7aWYgKCF1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPW1peChhX3NpemVfbWluLGFfc2l6ZVsxXSx1X3NpemVfdCkvMTI4LjA7fSBlbHNlIGlmICh1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtzaXplPWFfc2l6ZV9taW4vMTI4LjA7fSBlbHNlIHtzaXplPXVfc2l6ZTt9dmVjNCBwcm9qZWN0ZWRQb2ludD11X21hdHJpeCp2ZWM0KGFfcG9zLDAsMSk7aGlnaHAgZmxvYXQgY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZT1wcm9qZWN0ZWRQb2ludC53O2hpZ2hwIGZsb2F0IGRpc3RhbmNlX3JhdGlvPXVfcGl0Y2hfd2l0aF9tYXAgP1xcbmNhbWVyYV90b19hbmNob3JfZGlzdGFuY2UvdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlIDpcXG51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UvY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZTtoaWdocCBmbG9hdCBwZXJzcGVjdGl2ZV9yYXRpbz1jbGFtcCgwLjUrMC41KmRpc3RhbmNlX3JhdGlvLDAuMCw0LjApO3NpemUqPXBlcnNwZWN0aXZlX3JhdGlvO2Zsb2F0IGZvbnRTY2FsZT11X2lzX3RleHQgPyBzaXplLzI0LjAgOiBzaXplO2hpZ2hwIGZsb2F0IHN5bWJvbF9yb3RhdGlvbj0wLjA7aWYgKHVfcm90YXRlX3N5bWJvbCkge3ZlYzQgb2Zmc2V0UHJvamVjdGVkUG9pbnQ9dV9tYXRyaXgqdmVjNChhX3Bvcyt2ZWMyKDEsMCksMCwxKTt2ZWMyIGE9cHJvamVjdGVkUG9pbnQueHkvcHJvamVjdGVkUG9pbnQudzt2ZWMyIGI9b2Zmc2V0UHJvamVjdGVkUG9pbnQueHkvb2Zmc2V0UHJvamVjdGVkUG9pbnQudztzeW1ib2xfcm90YXRpb249YXRhbigoYi55LWEueSkvdV9hc3BlY3RfcmF0aW8sYi54LWEueCk7fWhpZ2hwIGZsb2F0IGFuZ2xlX3Npbj1zaW4oc2VnbWVudF9hbmdsZStzeW1ib2xfcm90YXRpb24pO2hpZ2hwIGZsb2F0IGFuZ2xlX2Nvcz1jb3Moc2VnbWVudF9hbmdsZStzeW1ib2xfcm90YXRpb24pO21hdDIgcm90YXRpb25fbWF0cml4PW1hdDIoYW5nbGVfY29zLC0xLjAqYW5nbGVfc2luLGFuZ2xlX3NpbixhbmdsZV9jb3MpO3ZlYzQgcHJvamVjdGVkX3Bvcz11X2xhYmVsX3BsYW5lX21hdHJpeCp2ZWM0KGFfcHJvamVjdGVkX3Bvcy54eSwwLjAsMS4wKTtnbF9Qb3NpdGlvbj11X2Nvb3JkX21hdHJpeCp2ZWM0KHByb2plY3RlZF9wb3MueHkvcHJvamVjdGVkX3Bvcy53K3JvdGF0aW9uX21hdHJpeCooYV9vZmZzZXQvMzIuMCptYXgoYV9taW5Gb250U2NhbGUsZm9udFNjYWxlKSthX3B4b2Zmc2V0LzE2LjApLDAuMCwxLjApO3ZfdGV4PWFfdGV4L3VfdGV4c2l6ZTt2ZWMyIGZhZGVfb3BhY2l0eT11bnBhY2tfb3BhY2l0eShhX2ZhZGVfb3BhY2l0eSk7ZmxvYXQgZmFkZV9jaGFuZ2U9ZmFkZV9vcGFjaXR5WzFdID4gMC41ID8gdV9mYWRlX2NoYW5nZSA6LXVfZmFkZV9jaGFuZ2U7dl9mYWRlX29wYWNpdHk9bWF4KDAuMCxtaW4oMS4wLGZhZGVfb3BhY2l0eVswXStmYWRlX2NoYW5nZSkpO31cIiksXG4gICAgICAgIGZpID0gZ2koXCIjZGVmaW5lIFNERl9QWCA4LjBcXG51bmlmb3JtIGJvb2wgdV9pc19oYWxvO3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfZ2FtbWFfc2NhbGU7dW5pZm9ybSBsb3dwIGZsb2F0IHVfZGV2aWNlX3BpeGVsX3JhdGlvO3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dmFyeWluZyB2ZWMyIHZfZGF0YTA7dmFyeWluZyB2ZWMzIHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuZmxvYXQgRURHRV9HQU1NQT0wLjEwNS91X2RldmljZV9waXhlbF9yYXRpbzt2ZWMyIHRleD12X2RhdGEwLnh5O2Zsb2F0IGdhbW1hX3NjYWxlPXZfZGF0YTEueDtmbG9hdCBzaXplPXZfZGF0YTEueTtmbG9hdCBmYWRlX29wYWNpdHk9dl9kYXRhMVsyXTtmbG9hdCBmb250U2NhbGU9dV9pc190ZXh0ID8gc2l6ZS8yNC4wIDogc2l6ZTtsb3dwIHZlYzQgY29sb3I9ZmlsbF9jb2xvcjtoaWdocCBmbG9hdCBnYW1tYT1FREdFX0dBTU1BLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7bG93cCBmbG9hdCBidWZmPSgyNTYuMC02NC4wKS8yNTYuMDtpZiAodV9pc19oYWxvKSB7Y29sb3I9aGFsb19jb2xvcjtnYW1tYT0oaGFsb19ibHVyKjEuMTkvU0RGX1BYK0VER0VfR0FNTUEpLyhmb250U2NhbGUqdV9nYW1tYV9zY2FsZSk7YnVmZj0oNi4wLWhhbG9fd2lkdGgvZm9udFNjYWxlKS9TREZfUFg7fWxvd3AgZmxvYXQgZGlzdD10ZXh0dXJlMkQodV90ZXh0dXJlLHRleCkuYTtoaWdocCBmbG9hdCBnYW1tYV9zY2FsZWQ9Z2FtbWEqZ2FtbWFfc2NhbGU7aGlnaHAgZmxvYXQgYWxwaGE9c21vb3Roc3RlcChidWZmLWdhbW1hX3NjYWxlZCxidWZmK2dhbW1hX3NjYWxlZCxkaXN0KTtnbF9GcmFnQ29sb3I9Y29sb3IqKGFscGhhKm9wYWNpdHkqZmFkZV9vcGFjaXR5KTtcXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuZ2xfRnJhZ0NvbG9yPXZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XCIsIFwiY29uc3QgZmxvYXQgUEk9My4xNDE1OTI2NTM1ODk3OTM7YXR0cmlidXRlIHZlYzQgYV9wb3Nfb2Zmc2V0O2F0dHJpYnV0ZSB2ZWM0IGFfZGF0YTthdHRyaWJ1dGUgdmVjNCBhX3BpeGVsb2Zmc2V0O2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3BpdGNoO3VuaWZvcm0gYm9vbCB1X3JvdGF0ZV9zeW1ib2w7dW5pZm9ybSBoaWdocCBmbG9hdCB1X2FzcGVjdF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt1bmlmb3JtIGZsb2F0IHVfZmFkZV9jaGFuZ2U7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt2YXJ5aW5nIHZlYzIgdl9kYXRhMDt2YXJ5aW5nIHZlYzMgdl9kYXRhMTtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG52b2lkIG1haW4oKSB7XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG52ZWMyIGFfcG9zPWFfcG9zX29mZnNldC54eTt2ZWMyIGFfb2Zmc2V0PWFfcG9zX29mZnNldC56dzt2ZWMyIGFfdGV4PWFfZGF0YS54eTt2ZWMyIGFfc2l6ZT1hX2RhdGEuenc7ZmxvYXQgYV9zaXplX21pbj1mbG9vcihhX3NpemVbMF0qMC41KTt2ZWMyIGFfcHhvZmZzZXQ9YV9waXhlbG9mZnNldC54eTtoaWdocCBmbG9hdCBzZWdtZW50X2FuZ2xlPS1hX3Byb2plY3RlZF9wb3NbMl07ZmxvYXQgc2l6ZTtpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9bWl4KGFfc2l6ZV9taW4sYV9zaXplWzFdLHVfc2l6ZV90KS8xMjguMDt9IGVsc2UgaWYgKHVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9YV9zaXplX21pbi8xMjguMDt9IGVsc2Uge3NpemU9dV9zaXplO312ZWM0IHByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgZGlzdGFuY2VfcmF0aW89dV9waXRjaF93aXRoX21hcCA/XFxuY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZS91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UgOlxcbnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlO2hpZ2hwIGZsb2F0IHBlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqZGlzdGFuY2VfcmF0aW8sMC4wLDQuMCk7c2l6ZSo9cGVyc3BlY3RpdmVfcmF0aW87ZmxvYXQgZm9udFNjYWxlPXVfaXNfdGV4dCA/IHNpemUvMjQuMCA6IHNpemU7aGlnaHAgZmxvYXQgc3ltYm9sX3JvdGF0aW9uPTAuMDtpZiAodV9yb3RhdGVfc3ltYm9sKSB7dmVjNCBvZmZzZXRQcm9qZWN0ZWRQb2ludD11X21hdHJpeCp2ZWM0KGFfcG9zK3ZlYzIoMSwwKSwwLDEpO3ZlYzIgYT1wcm9qZWN0ZWRQb2ludC54eS9wcm9qZWN0ZWRQb2ludC53O3ZlYzIgYj1vZmZzZXRQcm9qZWN0ZWRQb2ludC54eS9vZmZzZXRQcm9qZWN0ZWRQb2ludC53O3N5bWJvbF9yb3RhdGlvbj1hdGFuKChiLnktYS55KS91X2FzcGVjdF9yYXRpbyxiLngtYS54KTt9aGlnaHAgZmxvYXQgYW5nbGVfc2luPXNpbihzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7aGlnaHAgZmxvYXQgYW5nbGVfY29zPWNvcyhzZWdtZW50X2FuZ2xlK3N5bWJvbF9yb3RhdGlvbik7bWF0MiByb3RhdGlvbl9tYXRyaXg9bWF0MihhbmdsZV9jb3MsLTEuMCphbmdsZV9zaW4sYW5nbGVfc2luLGFuZ2xlX2Nvcyk7dmVjNCBwcm9qZWN0ZWRfcG9zPXVfbGFiZWxfcGxhbmVfbWF0cml4KnZlYzQoYV9wcm9qZWN0ZWRfcG9zLnh5LDAuMCwxLjApO2dsX1Bvc2l0aW9uPXVfY29vcmRfbWF0cml4KnZlYzQocHJvamVjdGVkX3Bvcy54eS9wcm9qZWN0ZWRfcG9zLncrcm90YXRpb25fbWF0cml4KihhX29mZnNldC8zMi4wKmZvbnRTY2FsZSthX3B4b2Zmc2V0KSwwLjAsMS4wKTtmbG9hdCBnYW1tYV9zY2FsZT1nbF9Qb3NpdGlvbi53O3ZlYzIgZmFkZV9vcGFjaXR5PXVucGFja19vcGFjaXR5KGFfZmFkZV9vcGFjaXR5KTtmbG9hdCBmYWRlX2NoYW5nZT1mYWRlX29wYWNpdHlbMV0gPiAwLjUgPyB1X2ZhZGVfY2hhbmdlIDotdV9mYWRlX2NoYW5nZTtmbG9hdCBpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5PW1heCgwLjAsbWluKDEuMCxmYWRlX29wYWNpdHlbMF0rZmFkZV9jaGFuZ2UpKTt2X2RhdGEwPWFfdGV4L3VfdGV4c2l6ZTt2X2RhdGExPXZlYzMoZ2FtbWFfc2NhbGUsc2l6ZSxpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5KTt9XCIpLFxuICAgICAgICBtaSA9IGdpKFwiI2RlZmluZSBTREZfUFggOC4wXFxuI2RlZmluZSBTREYgMS4wXFxuI2RlZmluZSBJQ09OIDAuMFxcbnVuaWZvcm0gYm9vbCB1X2lzX2hhbG87dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO3VuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZV9pY29uO3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9nYW1tYV9zY2FsZTt1bmlmb3JtIGxvd3AgZmxvYXQgdV9kZXZpY2VfcGl4ZWxfcmF0aW87dmFyeWluZyB2ZWM0IHZfZGF0YTA7dmFyeWluZyB2ZWM0IHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuZmxvYXQgZmFkZV9vcGFjaXR5PXZfZGF0YTFbMl07aWYgKHZfZGF0YTEudz09SUNPTikge3ZlYzIgdGV4X2ljb249dl9kYXRhMC56dztsb3dwIGZsb2F0IGFscGhhPW9wYWNpdHkqZmFkZV9vcGFjaXR5O2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQodV90ZXh0dXJlX2ljb24sdGV4X2ljb24pKmFscGhhO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbnJldHVybjt9dmVjMiB0ZXg9dl9kYXRhMC54eTtmbG9hdCBFREdFX0dBTU1BPTAuMTA1L3VfZGV2aWNlX3BpeGVsX3JhdGlvO2Zsb2F0IGdhbW1hX3NjYWxlPXZfZGF0YTEueDtmbG9hdCBzaXplPXZfZGF0YTEueTtmbG9hdCBmb250U2NhbGU9c2l6ZS8yNC4wO2xvd3AgdmVjNCBjb2xvcj1maWxsX2NvbG9yO2hpZ2hwIGZsb2F0IGdhbW1hPUVER0VfR0FNTUEvKGZvbnRTY2FsZSp1X2dhbW1hX3NjYWxlKTtsb3dwIGZsb2F0IGJ1ZmY9KDI1Ni4wLTY0LjApLzI1Ni4wO2lmICh1X2lzX2hhbG8pIHtjb2xvcj1oYWxvX2NvbG9yO2dhbW1hPShoYWxvX2JsdXIqMS4xOS9TREZfUFgrRURHRV9HQU1NQSkvKGZvbnRTY2FsZSp1X2dhbW1hX3NjYWxlKTtidWZmPSg2LjAtaGFsb193aWR0aC9mb250U2NhbGUpL1NERl9QWDt9bG93cCBmbG9hdCBkaXN0PXRleHR1cmUyRCh1X3RleHR1cmUsdGV4KS5hO2hpZ2hwIGZsb2F0IGdhbW1hX3NjYWxlZD1nYW1tYSpnYW1tYV9zY2FsZTtoaWdocCBmbG9hdCBhbHBoYT1zbW9vdGhzdGVwKGJ1ZmYtZ2FtbWFfc2NhbGVkLGJ1ZmYrZ2FtbWFfc2NhbGVkLGRpc3QpO2dsX0ZyYWdDb2xvcj1jb2xvciooYWxwaGEqb3BhY2l0eSpmYWRlX29wYWNpdHkpO1xcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG5nbF9GcmFnQ29sb3I9dmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cIiwgXCJjb25zdCBmbG9hdCBQST0zLjE0MTU5MjY1MzU4OTc5MzthdHRyaWJ1dGUgdmVjNCBhX3Bvc19vZmZzZXQ7YXR0cmlidXRlIHZlYzQgYV9kYXRhO2F0dHJpYnV0ZSB2ZWMzIGFfcHJvamVjdGVkX3BvczthdHRyaWJ1dGUgZmxvYXQgYV9mYWRlX29wYWNpdHk7dW5pZm9ybSBib29sIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50O3VuaWZvcm0gYm9vbCB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfc2l6ZV90O3VuaWZvcm0gaGlnaHAgZmxvYXQgdV9zaXplO3VuaWZvcm0gbWF0NCB1X21hdHJpeDt1bmlmb3JtIG1hdDQgdV9sYWJlbF9wbGFuZV9tYXRyaXg7dW5pZm9ybSBtYXQ0IHVfY29vcmRfbWF0cml4O3VuaWZvcm0gYm9vbCB1X2lzX3RleHQ7dW5pZm9ybSBib29sIHVfcGl0Y2hfd2l0aF9tYXA7dW5pZm9ybSBoaWdocCBmbG9hdCB1X3BpdGNoO3VuaWZvcm0gYm9vbCB1X3JvdGF0ZV9zeW1ib2w7dW5pZm9ybSBoaWdocCBmbG9hdCB1X2FzcGVjdF9yYXRpbzt1bmlmb3JtIGhpZ2hwIGZsb2F0IHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTt1bmlmb3JtIGZsb2F0IHVfZmFkZV9jaGFuZ2U7dW5pZm9ybSB2ZWMyIHVfdGV4c2l6ZTt1bmlmb3JtIHZlYzIgdV90ZXhzaXplX2ljb247dmFyeWluZyB2ZWM0IHZfZGF0YTA7dmFyeWluZyB2ZWM0IHZfZGF0YTE7XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGZpbGxfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudm9pZCBtYWluKCkge1xcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxudmVjMiBhX3Bvcz1hX3Bvc19vZmZzZXQueHk7dmVjMiBhX29mZnNldD1hX3Bvc19vZmZzZXQuenc7dmVjMiBhX3RleD1hX2RhdGEueHk7dmVjMiBhX3NpemU9YV9kYXRhLnp3O2Zsb2F0IGFfc2l6ZV9taW49Zmxvb3IoYV9zaXplWzBdKjAuNSk7ZmxvYXQgaXNfc2RmPWFfc2l6ZVswXS0yLjAqYV9zaXplX21pbjtoaWdocCBmbG9hdCBzZWdtZW50X2FuZ2xlPS1hX3Byb2plY3RlZF9wb3NbMl07ZmxvYXQgc2l6ZTtpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9bWl4KGFfc2l6ZV9taW4sYV9zaXplWzFdLHVfc2l6ZV90KS8xMjguMDt9IGVsc2UgaWYgKHVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge3NpemU9YV9zaXplX21pbi8xMjguMDt9IGVsc2Uge3NpemU9dV9zaXplO312ZWM0IHByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MsMCwxKTtoaWdocCBmbG9hdCBjYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlPXByb2plY3RlZFBvaW50Lnc7aGlnaHAgZmxvYXQgZGlzdGFuY2VfcmF0aW89dV9waXRjaF93aXRoX21hcCA/XFxuY2FtZXJhX3RvX2FuY2hvcl9kaXN0YW5jZS91X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UgOlxcbnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZS9jYW1lcmFfdG9fYW5jaG9yX2Rpc3RhbmNlO2hpZ2hwIGZsb2F0IHBlcnNwZWN0aXZlX3JhdGlvPWNsYW1wKDAuNSswLjUqZGlzdGFuY2VfcmF0aW8sMC4wLDQuMCk7c2l6ZSo9cGVyc3BlY3RpdmVfcmF0aW87ZmxvYXQgZm9udFNjYWxlPXNpemUvMjQuMDtoaWdocCBmbG9hdCBzeW1ib2xfcm90YXRpb249MC4wO2lmICh1X3JvdGF0ZV9zeW1ib2wpIHt2ZWM0IG9mZnNldFByb2plY3RlZFBvaW50PXVfbWF0cml4KnZlYzQoYV9wb3MrdmVjMigxLDApLDAsMSk7dmVjMiBhPXByb2plY3RlZFBvaW50Lnh5L3Byb2plY3RlZFBvaW50Lnc7dmVjMiBiPW9mZnNldFByb2plY3RlZFBvaW50Lnh5L29mZnNldFByb2plY3RlZFBvaW50Lnc7c3ltYm9sX3JvdGF0aW9uPWF0YW4oKGIueS1hLnkpL3VfYXNwZWN0X3JhdGlvLGIueC1hLngpO31oaWdocCBmbG9hdCBhbmdsZV9zaW49c2luKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTtoaWdocCBmbG9hdCBhbmdsZV9jb3M9Y29zKHNlZ21lbnRfYW5nbGUrc3ltYm9sX3JvdGF0aW9uKTttYXQyIHJvdGF0aW9uX21hdHJpeD1tYXQyKGFuZ2xlX2NvcywtMS4wKmFuZ2xlX3NpbixhbmdsZV9zaW4sYW5nbGVfY29zKTt2ZWM0IHByb2plY3RlZF9wb3M9dV9sYWJlbF9wbGFuZV9tYXRyaXgqdmVjNChhX3Byb2plY3RlZF9wb3MueHksMC4wLDEuMCk7Z2xfUG9zaXRpb249dV9jb29yZF9tYXRyaXgqdmVjNChwcm9qZWN0ZWRfcG9zLnh5L3Byb2plY3RlZF9wb3Mudytyb3RhdGlvbl9tYXRyaXgqKGFfb2Zmc2V0LzMyLjAqZm9udFNjYWxlKSwwLjAsMS4wKTtmbG9hdCBnYW1tYV9zY2FsZT1nbF9Qb3NpdGlvbi53O3ZlYzIgZmFkZV9vcGFjaXR5PXVucGFja19vcGFjaXR5KGFfZmFkZV9vcGFjaXR5KTtmbG9hdCBmYWRlX2NoYW5nZT1mYWRlX29wYWNpdHlbMV0gPiAwLjUgPyB1X2ZhZGVfY2hhbmdlIDotdV9mYWRlX2NoYW5nZTtmbG9hdCBpbnRlcnBvbGF0ZWRfZmFkZV9vcGFjaXR5PW1heCgwLjAsbWluKDEuMCxmYWRlX29wYWNpdHlbMF0rZmFkZV9jaGFuZ2UpKTt2X2RhdGEwLnh5PWFfdGV4L3VfdGV4c2l6ZTt2X2RhdGEwLnp3PWFfdGV4L3VfdGV4c2l6ZV9pY29uO3ZfZGF0YTE9dmVjNChnYW1tYV9zY2FsZSxzaXplLGludGVycG9sYXRlZF9mYWRlX29wYWNpdHksaXNfc2RmKTt9XCIpO1xuXG4gICAgZnVuY3Rpb24gZ2kodCwgZSkge1xuICAgICAgdmFyIGkgPSAvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2csXG4gICAgICAgICAgbyA9IGUubWF0Y2goL2F0dHJpYnV0ZSAoW1xcd10rKSAoW1xcd10rKS9nKSxcbiAgICAgICAgICByID0gdC5tYXRjaCgvdW5pZm9ybSAoW1xcd10rKSAoW1xcd10rKShbXFxzXSopKFtcXHddKikvZyksXG4gICAgICAgICAgYSA9IGUubWF0Y2goL3VuaWZvcm0gKFtcXHddKykgKFtcXHddKykoW1xcc10qKShbXFx3XSopL2cpLFxuICAgICAgICAgIG4gPSBhID8gYS5jb25jYXQocikgOiByLFxuICAgICAgICAgIHMgPSB7fTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiB0ID0gdC5yZXBsYWNlKGksIGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICAgICAgcmV0dXJuIHNbcl0gPSAhMCwgXCJkZWZpbmVcIiA9PT0gZSA/IFwiXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91X1wiICsgciArIFwiXFxudmFyeWluZyBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIjtcXG4jZWxzZVxcbnVuaWZvcm0gXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgdV9cIiArIHIgKyBcIjtcXG4jZW5kaWZcXG5cIiA6IFwiXFxuI2lmZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiO1xuICAgICAgICB9KSxcbiAgICAgICAgdmVydGV4U291cmNlOiBlID0gZS5yZXBsYWNlKGksIGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByKSB7XG4gICAgICAgICAgdmFyIGEgPSBcImZsb2F0XCIgPT09IG8gPyBcInZlYzJcIiA6IFwidmVjNFwiLFxuICAgICAgICAgICAgICBuID0gci5tYXRjaCgvY29sb3IvKSA/IFwiY29sb3JcIiA6IGE7XG4gICAgICAgICAgcmV0dXJuIHNbcl0gPyBcImRlZmluZVwiID09PSBlID8gXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG51bmlmb3JtIGxvd3AgZmxvYXQgdV9cIiArIHIgKyBcIl90O1xcbmF0dHJpYnV0ZSBcIiArIGkgKyBcIiBcIiArIGEgKyBcIiBhX1wiICsgciArIFwiO1xcbnZhcnlpbmcgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCI7XFxuI2Vsc2VcXG51bmlmb3JtIFwiICsgaSArIFwiIFwiICsgbyArIFwiIHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcInZlYzRcIiA9PT0gbiA/IFwiXFxuI2lmbmRlZiBIQVNfVU5JRk9STV91X1wiICsgciArIFwiXFxuICAgIFwiICsgciArIFwiID0gYV9cIiArIHIgKyBcIjtcXG4jZWxzZVxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcIlxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV9cIiArIHIgKyBcIlxcbiAgICBcIiArIHIgKyBcIiA9IHVucGFja19taXhfXCIgKyBuICsgXCIoYV9cIiArIHIgKyBcIiwgdV9cIiArIHIgKyBcIl90KTtcXG4jZWxzZVxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IHVfXCIgKyByICsgXCI7XFxuI2VuZGlmXFxuXCIgOiBcImRlZmluZVwiID09PSBlID8gXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG51bmlmb3JtIGxvd3AgZmxvYXQgdV9cIiArIHIgKyBcIl90O1xcbmF0dHJpYnV0ZSBcIiArIGkgKyBcIiBcIiArIGEgKyBcIiBhX1wiICsgciArIFwiO1xcbiNlbHNlXFxudW5pZm9ybSBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiIDogXCJ2ZWM0XCIgPT09IG4gPyBcIlxcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV9cIiArIHIgKyBcIlxcbiAgICBcIiArIGkgKyBcIiBcIiArIG8gKyBcIiBcIiArIHIgKyBcIiA9IGFfXCIgKyByICsgXCI7XFxuI2Vsc2VcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiIDogXCJcXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfXCIgKyByICsgXCJcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1bnBhY2tfbWl4X1wiICsgbiArIFwiKGFfXCIgKyByICsgXCIsIHVfXCIgKyByICsgXCJfdCk7XFxuI2Vsc2VcXG4gICAgXCIgKyBpICsgXCIgXCIgKyBvICsgXCIgXCIgKyByICsgXCIgPSB1X1wiICsgciArIFwiO1xcbiNlbmRpZlxcblwiO1xuICAgICAgICB9KSxcbiAgICAgICAgc3RhdGljQXR0cmlidXRlczogbyxcbiAgICAgICAgc3RhdGljVW5pZm9ybXM6IG5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHZpID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICBwcmVsdWRlOiBHZSxcbiAgICAgIGJhY2tncm91bmQ6IFdlLFxuICAgICAgYmFja2dyb3VuZFBhdHRlcm46IFhlLFxuICAgICAgY2lyY2xlOiBIZSxcbiAgICAgIGNsaXBwaW5nTWFzazogS2UsXG4gICAgICBoZWF0bWFwOiBZZSxcbiAgICAgIGhlYXRtYXBUZXh0dXJlOiBKZSxcbiAgICAgIGNvbGxpc2lvbkJveDogUWUsXG4gICAgICBjb2xsaXNpb25DaXJjbGU6ICRlLFxuICAgICAgZGVidWc6IHRpLFxuICAgICAgZmlsbDogZWksXG4gICAgICBmaWxsT3V0bGluZTogaWksXG4gICAgICBmaWxsT3V0bGluZVBhdHRlcm46IG9pLFxuICAgICAgZmlsbFBhdHRlcm46IHJpLFxuICAgICAgZmlsbEV4dHJ1c2lvbjogYWksXG4gICAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogbmksXG4gICAgICBoaWxsc2hhZGVQcmVwYXJlOiBzaSxcbiAgICAgIGhpbGxzaGFkZTogbGksXG4gICAgICBsaW5lOiBjaSxcbiAgICAgIGxpbmVHcmFkaWVudDogdWksXG4gICAgICBsaW5lUGF0dGVybjogaGksXG4gICAgICBsaW5lU0RGOiBwaSxcbiAgICAgIHJhc3RlcjogZGksXG4gICAgICBzeW1ib2xJY29uOiBfaSxcbiAgICAgIHN5bWJvbFNERjogZmksXG4gICAgICBzeW1ib2xUZXh0QW5kSWNvbjogbWlcbiAgICB9KSxcbiAgICAgICAgeWkgPSBmdW5jdGlvbiB5aSgpIHtcbiAgICAgIHRoaXMuYm91bmRQcm9ncmFtID0gbnVsbCwgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IG51bGwsIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBbXSwgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gbnVsbCwgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IG51bGwsIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gbnVsbCwgdGhpcy52YW8gPSBudWxsO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB4aSh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobnVsbCAhPT0gdFtpXSkge1xuICAgICAgICAgIHZhciBvID0gdFtpXS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgZS5wdXNoKG8ucG9wKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIHlpLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHQ7XG5cbiAgICAgIGZvciAodmFyIGwgPSB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aCAhPT0gby5sZW5ndGgsIGMgPSAwOyAhbCAmJiBjIDwgby5sZW5ndGg7IGMrKykge1xuICAgICAgICB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW2NdICE9PSBvW2NdICYmIChsID0gITApO1xuICAgICAgfVxuXG4gICAgICB0LmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIHRoaXMudmFvICYmIHRoaXMuYm91bmRQcm9ncmFtID09PSBlICYmIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPT09IGkgJiYgIWwgJiYgdGhpcy5ib3VuZEluZGV4QnVmZmVyID09PSByICYmIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPT09IGEgJiYgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPT09IG4gJiYgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyID09PSBzID8gKHQuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyksIG4gJiYgbi5iaW5kKCksIHIgJiYgci5keW5hbWljRHJhdyAmJiByLmJpbmQoKSwgcyAmJiBzLmJpbmQoKSkgOiB0aGlzLmZyZXNoQmluZChlLCBpLCBvLCByLCBhLCBuLCBzKTtcbiAgICB9LCB5aS5wcm90b3R5cGUuZnJlc2hCaW5kID0gZnVuY3Rpb24gKHQsIGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIHZhciBzLFxuICAgICAgICAgIGwgPSB0Lm51bUF0dHJpYnV0ZXMsXG4gICAgICAgICAgYyA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICB1ID0gYy5nbDtcbiAgICAgIGlmIChjLmV4dFZlcnRleEFycmF5T2JqZWN0KSB0aGlzLnZhbyAmJiB0aGlzLmRlc3Ryb3koKSwgdGhpcy52YW8gPSBjLmV4dFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCksIGMuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyksIHMgPSAwLCB0aGlzLmJvdW5kUHJvZ3JhbSA9IHQsIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBlLCB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzID0gaSwgdGhpcy5ib3VuZEluZGV4QnVmZmVyID0gbywgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IHIsIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gYSwgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyID0gbjtlbHNlIHtcbiAgICAgICAgcyA9IGMuY3VycmVudE51bUF0dHJpYnV0ZXMgfHwgMDtcblxuICAgICAgICBmb3IgKHZhciBoID0gbDsgaCA8IHM7IGgrKykge1xuICAgICAgICAgIHUuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLmVuYWJsZUF0dHJpYnV0ZXModSwgdCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwLCBkID0gaTsgcCA8IGQubGVuZ3RoOyBwICs9IDEpIHtcbiAgICAgICAgZFtwXS5lbmFibGVBdHRyaWJ1dGVzKHUsIHQpO1xuICAgICAgfVxuXG4gICAgICBhICYmIGEuZW5hYmxlQXR0cmlidXRlcyh1LCB0KSwgbiAmJiBuLmVuYWJsZUF0dHJpYnV0ZXModSwgdCksIGUuYmluZCgpLCBlLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKHUsIHQsIHIpO1xuXG4gICAgICBmb3IgKHZhciBfID0gMCwgZiA9IGk7IF8gPCBmLmxlbmd0aDsgXyArPSAxKSB7XG4gICAgICAgIHZhciBtID0gZltfXTtcbiAgICAgICAgbS5iaW5kKCksIG0uc2V0VmVydGV4QXR0cmliUG9pbnRlcnModSwgdCwgcik7XG4gICAgICB9XG5cbiAgICAgIGEgJiYgKGEuYmluZCgpLCBhLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKHUsIHQsIHIpKSwgbyAmJiBvLmJpbmQoKSwgbiAmJiAobi5iaW5kKCksIG4uc2V0VmVydGV4QXR0cmliUG9pbnRlcnModSwgdCwgcikpLCBjLmN1cnJlbnROdW1BdHRyaWJ1dGVzID0gbDtcbiAgICB9LCB5aS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudmFvICYmICh0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pLCB0aGlzLnZhbyA9IG51bGwpO1xuICAgIH07XG5cbiAgICB2YXIgYmkgPSBmdW5jdGlvbiBiaSh0LCBlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IHQuZ2w7XG4gICAgICB0aGlzLnByb2dyYW0gPSBuLmNyZWF0ZVByb2dyYW0oKTtcblxuICAgICAgZm9yICh2YXIgcyA9IHhpKGkuc3RhdGljQXR0cmlidXRlcyksIGwgPSBvID8gby5nZXRCaW5kZXJBdHRyaWJ1dGVzKCkgOiBbXSwgYyA9IHMuY29uY2F0KGwpLCB1ID0gaS5zdGF0aWNVbmlmb3JtcyA/IHhpKGkuc3RhdGljVW5pZm9ybXMpIDogW10sIGggPSBvID8gby5nZXRCaW5kZXJVbmlmb3JtcygpIDogW10sIHAgPSBbXSwgZCA9IDAsIF8gPSB1LmNvbmNhdChoKTsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgdmFyIGYgPSBfW2RdO1xuICAgICAgICBwLmluZGV4T2YoZikgPCAwICYmIHAucHVzaChmKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG0gPSBvID8gby5kZWZpbmVzKCkgOiBbXTtcbiAgICAgIGEgJiYgbS5wdXNoKFwiI2RlZmluZSBPVkVSRFJBV19JTlNQRUNUT1I7XCIpO1xuICAgICAgdmFyIGcgPSBtLmNvbmNhdChHZS5mcmFnbWVudFNvdXJjZSwgaS5mcmFnbWVudFNvdXJjZSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB2ID0gbS5jb25jYXQoR2UudmVydGV4U291cmNlLCBpLnZlcnRleFNvdXJjZSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICB5ID0gbi5jcmVhdGVTaGFkZXIobi5GUkFHTUVOVF9TSEFERVIpO1xuICAgICAgaWYgKG4uaXNDb250ZXh0TG9zdCgpKSB0aGlzLmZhaWxlZFRvQ3JlYXRlID0gITA7ZWxzZSB7XG4gICAgICAgIG4uc2hhZGVyU291cmNlKHksIGcpLCBuLmNvbXBpbGVTaGFkZXIoeSksIG4uYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgeSk7XG4gICAgICAgIHZhciB4ID0gbi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgaWYgKG4uaXNDb250ZXh0TG9zdCgpKSB0aGlzLmZhaWxlZFRvQ3JlYXRlID0gITA7ZWxzZSB7XG4gICAgICAgICAgbi5zaGFkZXJTb3VyY2UoeCwgdiksIG4uY29tcGlsZVNoYWRlcih4KSwgbi5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB4KSwgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgdmFyIGIgPSB7fTtcbiAgICAgICAgICB0aGlzLm51bUF0dHJpYnV0ZXMgPSBjLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAodmFyIHcgPSAwOyB3IDwgdGhpcy5udW1BdHRyaWJ1dGVzOyB3KyspIHtcbiAgICAgICAgICAgIGNbd10gJiYgKG4uYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdywgY1t3XSksIHRoaXMuYXR0cmlidXRlc1tjW3ddXSA9IHcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG4ubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKSwgbi5kZWxldGVTaGFkZXIoeCksIG4uZGVsZXRlU2hhZGVyKHkpO1xuXG4gICAgICAgICAgZm9yICh2YXIgVCA9IDA7IFQgPCBwLmxlbmd0aDsgVCsrKSB7XG4gICAgICAgICAgICB2YXIgRSA9IHBbVF07XG5cbiAgICAgICAgICAgIGlmIChFICYmICFiW0VdKSB7XG4gICAgICAgICAgICAgIHZhciBJID0gbi5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBFKTtcbiAgICAgICAgICAgICAgSSAmJiAoYltFXSA9IEkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3JtcyA9IHIodCwgYiksIHRoaXMuYmluZGVyVW5pZm9ybXMgPSBvID8gby5nZXRVbmlmb3Jtcyh0LCBiKSA6IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHdpKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gMSAvIHBlKGksIDEsIGUudHJhbnNmb3JtLnRpbGVab29tKSxcbiAgICAgICAgICByID0gTWF0aC5wb3coMiwgaS50aWxlSUQub3ZlcnNjYWxlZFopLFxuICAgICAgICAgIGEgPSBpLnRpbGVTaXplICogTWF0aC5wb3coMiwgZS50cmFuc2Zvcm0udGlsZVpvb20pIC8gcixcbiAgICAgICAgICBuID0gYSAqIChpLnRpbGVJRC5jYW5vbmljYWwueCArIGkudGlsZUlELndyYXAgKiByKSxcbiAgICAgICAgICBzID0gYSAqIGkudGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgdV90ZXhzaXplOiBpLmltYWdlQXRsYXNUZXh0dXJlLnNpemUsXG4gICAgICAgIHVfc2NhbGU6IFtvLCB0LmZyb21TY2FsZSwgdC50b1NjYWxlXSxcbiAgICAgICAgdV9mYWRlOiB0LnQsXG4gICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IFtuID4+IDE2LCBzID4+IDE2XSxcbiAgICAgICAgdV9waXhlbF9jb29yZF9sb3dlcjogWzY1NTM1ICYgbiwgNjU1MzUgJiBzXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiaS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoLCBwLCBkLCBfLCBmKSB7XG4gICAgICB2YXIgbSxcbiAgICAgICAgICBnID0gdC5nbDtcblxuICAgICAgaWYgKCF0aGlzLmZhaWxlZFRvQ3JlYXRlKSB7XG4gICAgICAgIGZvciAodmFyIHYgaW4gdC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pLCB0LnNldERlcHRoTW9kZShpKSwgdC5zZXRTdGVuY2lsTW9kZShvKSwgdC5zZXRDb2xvck1vZGUociksIHQuc2V0Q3VsbEZhY2UoYSksIHRoaXMuZml4ZWRVbmlmb3Jtcykge1xuICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3Jtc1t2XS5zZXQoblt2XSk7XG4gICAgICAgIH1cblxuICAgICAgICBkICYmIGQuc2V0VW5pZm9ybXModCwgdGhpcy5iaW5kZXJVbmlmb3JtcywgaCwge1xuICAgICAgICAgIHpvb206IHBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgeSA9IChtID0ge30sIG1bZy5MSU5FU10gPSAyLCBtW2cuVFJJQU5HTEVTXSA9IDMsIG1bZy5MSU5FX1NUUklQXSA9IDEsIG0pW2VdLCB4ID0gMCwgYiA9IHUuZ2V0KCk7IHggPCBiLmxlbmd0aDsgeCArPSAxKSB7XG4gICAgICAgICAgdmFyIHcgPSBiW3hdLFxuICAgICAgICAgICAgICBUID0gdy52YW9zIHx8ICh3LnZhb3MgPSB7fSk7XG4gICAgICAgICAgKFRbc10gfHwgKFRbc10gPSBuZXcgeWkoKSkpLmJpbmQodCwgdGhpcywgbCwgZCA/IGQuZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCkgOiBbXSwgYywgdy52ZXJ0ZXhPZmZzZXQsIF8sIGYpLCBnLmRyYXdFbGVtZW50cyhlLCB3LnByaW1pdGl2ZUxlbmd0aCAqIHksIGcuVU5TSUdORURfU0hPUlQsIHcucHJpbWl0aXZlT2Zmc2V0ICogeSAqIDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBUaSA9IGZ1bmN0aW9uIFRpKGUsIGksIG8sIHIpIHtcbiAgICAgIHZhciBhID0gaS5zdHlsZS5saWdodCxcbiAgICAgICAgICBuID0gYS5wcm9wZXJ0aWVzLmdldChcInBvc2l0aW9uXCIpLFxuICAgICAgICAgIHMgPSBbbi54LCBuLnksIG4uel0sXG4gICAgICAgICAgbCA9IHQuY3JlYXRlJDEoKTtcbiAgICAgIFwidmlld3BvcnRcIiA9PT0gYS5wcm9wZXJ0aWVzLmdldChcImFuY2hvclwiKSAmJiB0LmZyb21Sb3RhdGlvbihsLCAtaS50cmFuc2Zvcm0uYW5nbGUpLCB0LnRyYW5zZm9ybU1hdDMocywgcywgbCk7XG4gICAgICB2YXIgYyA9IGEucHJvcGVydGllcy5nZXQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiBlLFxuICAgICAgICB1X2xpZ2h0cG9zOiBzLFxuICAgICAgICB1X2xpZ2h0aW50ZW5zaXR5OiBhLnByb3BlcnRpZXMuZ2V0KFwiaW50ZW5zaXR5XCIpLFxuICAgICAgICB1X2xpZ2h0Y29sb3I6IFtjLnIsIGMuZywgYy5iXSxcbiAgICAgICAgdV92ZXJ0aWNhbF9ncmFkaWVudDogK28sXG4gICAgICAgIHVfb3BhY2l0eTogclxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBFaSA9IGZ1bmN0aW9uIEVpKGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIHJldHVybiB0LmV4dGVuZChUaShlLCBpLCBvLCByKSwgd2kobiwgaSwgcyksIHtcbiAgICAgICAgdV9oZWlnaHRfZmFjdG9yOiAtTWF0aC5wb3coMiwgYS5vdmVyc2NhbGVkWikgLyBzLnRpbGVTaXplIC8gOFxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgSWkgPSBmdW5jdGlvbiBJaSh0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdFxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBQaSA9IGZ1bmN0aW9uIFBpKGUsIGksIG8sIHIpIHtcbiAgICAgIHJldHVybiB0LmV4dGVuZChJaShlKSwgd2kobywgaSwgcikpO1xuICAgIH0sXG4gICAgICAgIFNpID0gZnVuY3Rpb24gU2kodCwgZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9tYXRyaXg6IHQsXG4gICAgICAgIHVfd29ybGQ6IGVcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQ2kgPSBmdW5jdGlvbiBDaShlLCBpLCBvLCByLCBhKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoUGkoZSwgaSwgbywgciksIHtcbiAgICAgICAgdV93b3JsZDogYVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgemkgPSBmdW5jdGlvbiB6aShlLCBpLCBvLCByKSB7XG4gICAgICB2YXIgYSxcbiAgICAgICAgICBuLFxuICAgICAgICAgIHMgPSBlLnRyYW5zZm9ybTtcblxuICAgICAgaWYgKFwibWFwXCIgPT09IHIucGFpbnQuZ2V0KFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiKSkge1xuICAgICAgICB2YXIgbCA9IHBlKG8sIDEsIHMuem9vbSk7XG4gICAgICAgIGEgPSAhMCwgbiA9IFtsLCBsXTtcbiAgICAgIH0gZWxzZSBhID0gITEsIG4gPSBzLnBpeGVsc1RvR0xVbml0cztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOiBzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgIHVfc2NhbGVfd2l0aF9tYXA6ICsoXCJtYXBcIiA9PT0gci5wYWludC5nZXQoXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIikpLFxuICAgICAgICB1X21hdHJpeDogZS50cmFuc2xhdGVQb3NNYXRyaXgoaS5wb3NNYXRyaXgsIG8sIHIucGFpbnQuZ2V0KFwiY2lyY2xlLXRyYW5zbGF0ZVwiKSwgci5wYWludC5nZXQoXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiKSksXG4gICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6ICthLFxuICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIHVfZXh0cnVkZV9zY2FsZTogblxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBEaSA9IGZ1bmN0aW9uIERpKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gcGUoaSwgMSwgZS56b29tKSxcbiAgICAgICAgICByID0gTWF0aC5wb3coMiwgZS56b29tIC0gaS50aWxlSUQub3ZlcnNjYWxlZFopLFxuICAgICAgICAgIGEgPSBpLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IGUuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgdV9waXhlbHNfdG9fdGlsZV91bml0czogbyxcbiAgICAgICAgdV9leHRydWRlX3NjYWxlOiBbZS5waXhlbHNUb0dMVW5pdHNbMF0gLyAobyAqIHIpLCBlLnBpeGVsc1RvR0xVbml0c1sxXSAvIChvICogcildLFxuICAgICAgICB1X292ZXJzY2FsZV9mYWN0b3I6IGFcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQWkgPSBmdW5jdGlvbiBBaSh0LCBlLCBpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdCxcbiAgICAgICAgdV9pbnZfbWF0cml4OiBlLFxuICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IGkuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgdV92aWV3cG9ydF9zaXplOiBbaS53aWR0aCwgaS5oZWlnaHRdXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIE1pID0gZnVuY3Rpb24gTWkodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDEpLCB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X2NvbG9yOiBlLFxuICAgICAgICB1X292ZXJsYXk6IDAsXG4gICAgICAgIHVfb3ZlcmxheV9zY2FsZTogaVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBMaSA9IGZ1bmN0aW9uIExpKHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIFJpID0gZnVuY3Rpb24gUmkodCwgZSwgaSwgbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdV9tYXRyaXg6IHQsXG4gICAgICAgIHVfZXh0cnVkZV9zY2FsZTogcGUoZSwgMSwgaSksXG4gICAgICAgIHVfaW50ZW5zaXR5OiBvXG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIGtpID0gZnVuY3Rpb24ga2koZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBlLnRyYW5zZm9ybTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiBOaShlLCBpLCBvKSxcbiAgICAgICAgdV9yYXRpbzogMSAvIHBlKGksIDEsIHIuem9vbSksXG4gICAgICAgIHVfZGV2aWNlX3BpeGVsX3JhdGlvOiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgdV91bml0c190b19waXhlbHM6IFsxIC8gci5waXhlbHNUb0dMVW5pdHNbMF0sIDEgLyByLnBpeGVsc1RvR0xVbml0c1sxXV1cbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgQmkgPSBmdW5jdGlvbiBCaShlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoa2koZSwgaSwgbyksIHtcbiAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgdV9pbWFnZV9oZWlnaHQ6IHJcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgICAgIE9pID0gZnVuY3Rpb24gT2koZSwgaSwgbywgcikge1xuICAgICAgdmFyIGEgPSBlLnRyYW5zZm9ybSxcbiAgICAgICAgICBuID0gVWkoaSwgYSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogTmkoZSwgaSwgbyksXG4gICAgICAgIHVfdGV4c2l6ZTogaS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICB1X3JhdGlvOiAxIC8gcGUoaSwgMSwgYS56b29tKSxcbiAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICB1X2ltYWdlOiAwLFxuICAgICAgICB1X3NjYWxlOiBbbiwgci5mcm9tU2NhbGUsIHIudG9TY2FsZV0sXG4gICAgICAgIHVfZmFkZTogci50LFxuICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogWzEgLyBhLnBpeGVsc1RvR0xVbml0c1swXSwgMSAvIGEucGl4ZWxzVG9HTFVuaXRzWzFdXVxuICAgICAgfTtcbiAgICB9LFxuICAgICAgICBGaSA9IGZ1bmN0aW9uIEZpKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHZhciBuID0gZS5saW5lQXRsYXMsXG4gICAgICAgICAgcyA9IFVpKGksIGUudHJhbnNmb3JtKSxcbiAgICAgICAgICBsID0gXCJyb3VuZFwiID09PSBvLmxheW91dC5nZXQoXCJsaW5lLWNhcFwiKSxcbiAgICAgICAgICBjID0gbi5nZXREYXNoKHIuZnJvbSwgbCksXG4gICAgICAgICAgdSA9IG4uZ2V0RGFzaChyLnRvLCBsKSxcbiAgICAgICAgICBoID0gYy53aWR0aCAqIGEuZnJvbVNjYWxlLFxuICAgICAgICAgIHAgPSB1LndpZHRoICogYS50b1NjYWxlO1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKGtpKGUsIGksIG8pLCB7XG4gICAgICAgIHVfcGF0dGVybnNjYWxlX2E6IFtzIC8gaCwgLWMuaGVpZ2h0IC8gMl0sXG4gICAgICAgIHVfcGF0dGVybnNjYWxlX2I6IFtzIC8gcCwgLXUuaGVpZ2h0IC8gMl0sXG4gICAgICAgIHVfc2RmZ2FtbWE6IG4ud2lkdGggLyAoMjU2ICogTWF0aC5taW4oaCwgcCkgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyLFxuICAgICAgICB1X2ltYWdlOiAwLFxuICAgICAgICB1X3RleF95X2E6IGMueSxcbiAgICAgICAgdV90ZXhfeV9iOiB1LnksXG4gICAgICAgIHVfbWl4OiBhLnRcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBVaSh0LCBlKSB7XG4gICAgICByZXR1cm4gMSAvIHBlKHQsIDEsIGUudGlsZVpvb20pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE5pKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiB0LnRyYW5zbGF0ZVBvc01hdHJpeChlLnRpbGVJRC5wb3NNYXRyaXgsIGUsIGkucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGVcIiksIGkucGFpbnQuZ2V0KFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgWmkgPSBmdW5jdGlvbiBaaSh0LCBlLCBpLCBvLCByKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1X21hdHJpeDogdCxcbiAgICAgICAgdV90bF9wYXJlbnQ6IGUsXG4gICAgICAgIHVfc2NhbGVfcGFyZW50OiBpLFxuICAgICAgICB1X2J1ZmZlcl9zY2FsZTogMSxcbiAgICAgICAgdV9mYWRlX3Q6IG8ubWl4LFxuICAgICAgICB1X29wYWNpdHk6IG8ub3BhY2l0eSAqIHIucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIiksXG4gICAgICAgIHVfaW1hZ2UwOiAwLFxuICAgICAgICB1X2ltYWdlMTogMSxcbiAgICAgICAgdV9icmlnaHRuZXNzX2xvdzogci5wYWludC5nZXQoXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIiksXG4gICAgICAgIHVfYnJpZ2h0bmVzc19oaWdoOiByLnBhaW50LmdldChcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiKSxcbiAgICAgICAgdV9zYXR1cmF0aW9uX2ZhY3RvcjogKG4gPSByLnBhaW50LmdldChcInJhc3Rlci1zYXR1cmF0aW9uXCIpLCBuID4gMCA/IDEgLSAxIC8gKDEuMDAxIC0gbikgOiAtbiksXG4gICAgICAgIHVfY29udHJhc3RfZmFjdG9yOiAoYSA9IHIucGFpbnQuZ2V0KFwicmFzdGVyLWNvbnRyYXN0XCIpLCBhID4gMCA/IDEgLyAoMSAtIGEpIDogMSArIGEpLFxuICAgICAgICB1X3NwaW5fd2VpZ2h0czogcWkoci5wYWludC5nZXQoXCJyYXN0ZXItaHVlLXJvdGF0ZVwiKSlcbiAgICAgIH07XG4gICAgICB2YXIgYSwgbjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcWkodCkge1xuICAgICAgdCAqPSBNYXRoLlBJIC8gMTgwO1xuICAgICAgdmFyIGUgPSBNYXRoLnNpbih0KSxcbiAgICAgICAgICBpID0gTWF0aC5jb3ModCk7XG4gICAgICByZXR1cm4gWygyICogaSArIDEpIC8gMywgKC1NYXRoLnNxcnQoMykgKiBlIC0gaSArIDEpIC8gMywgKE1hdGguc3FydCgzKSAqIGUgLSBpICsgMSkgLyAzXTtcbiAgICB9XG5cbiAgICB2YXIgamksXG4gICAgICAgIFZpID0gZnVuY3Rpb24gVmkodCwgZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYykge1xuICAgICAgdmFyIHUgPSByLnRyYW5zZm9ybTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50OiArKFwiY29uc3RhbnRcIiA9PT0gdCB8fCBcInNvdXJjZVwiID09PSB0KSxcbiAgICAgICAgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6ICsoXCJjb25zdGFudFwiID09PSB0IHx8IFwiY2FtZXJhXCIgPT09IHQpLFxuICAgICAgICB1X3NpemVfdDogZSA/IGUudVNpemVUIDogMCxcbiAgICAgICAgdV9zaXplOiBlID8gZS51U2l6ZSA6IDAsXG4gICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogdS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICB1X3BpdGNoOiB1LnBpdGNoIC8gMzYwICogMiAqIE1hdGguUEksXG4gICAgICAgIHVfcm90YXRlX3N5bWJvbDogK2ksXG4gICAgICAgIHVfYXNwZWN0X3JhdGlvOiB1LndpZHRoIC8gdS5oZWlnaHQsXG4gICAgICAgIHVfZmFkZV9jaGFuZ2U6IHIub3B0aW9ucy5mYWRlRHVyYXRpb24gPyByLnN5bWJvbEZhZGVDaGFuZ2UgOiAxLFxuICAgICAgICB1X21hdHJpeDogYSxcbiAgICAgICAgdV9sYWJlbF9wbGFuZV9tYXRyaXg6IG4sXG4gICAgICAgIHVfY29vcmRfbWF0cml4OiBzLFxuICAgICAgICB1X2lzX3RleHQ6ICtsLFxuICAgICAgICB1X3BpdGNoX3dpdGhfbWFwOiArbyxcbiAgICAgICAgdV90ZXhzaXplOiBjLFxuICAgICAgICB1X3RleHR1cmU6IDBcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgR2kgPSBmdW5jdGlvbiBHaShlLCBpLCBvLCByLCBhLCBuLCBzLCBsLCBjLCB1LCBoKSB7XG4gICAgICB2YXIgcCA9IGEudHJhbnNmb3JtO1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKFZpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUpLCB7XG4gICAgICAgIHVfZ2FtbWFfc2NhbGU6IHIgPyBNYXRoLmNvcyhwLl9waXRjaCkgKiBwLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgOiAxLFxuICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIHVfaXNfaGFsbzogK2hcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgICAgIFdpID0gZnVuY3Rpb24gV2koZSwgaSwgbywgciwgYSwgbiwgcywgbCwgYywgdSkge1xuICAgICAgcmV0dXJuIHQuZXh0ZW5kKEdpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsICEwLCBjLCAhMCksIHtcbiAgICAgICAgdV90ZXhzaXplX2ljb246IHUsXG4gICAgICAgIHVfdGV4dHVyZV9pY29uOiAxXG4gICAgICB9KTtcbiAgICB9LFxuICAgICAgICBYaSA9IGZ1bmN0aW9uIFhpKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVfbWF0cml4OiB0LFxuICAgICAgICB1X29wYWNpdHk6IGUsXG4gICAgICAgIHVfY29sb3I6IGlcbiAgICAgIH07XG4gICAgfSxcbiAgICAgICAgSGkgPSBmdW5jdGlvbiBIaShlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICByZXR1cm4gdC5leHRlbmQoZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgdmFyIHIgPSBpLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQuZnJvbS50b1N0cmluZygpKSxcbiAgICAgICAgICAgIGEgPSBpLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKHQudG8udG9TdHJpbmcoKSksXG4gICAgICAgICAgICBuID0gaS5pbWFnZU1hbmFnZXIuZ2V0UGl4ZWxTaXplKCksXG4gICAgICAgICAgICBzID0gbi53aWR0aCxcbiAgICAgICAgICAgIGwgPSBuLmhlaWdodCxcbiAgICAgICAgICAgIGMgPSBNYXRoLnBvdygyLCBvLnRpbGVJRC5vdmVyc2NhbGVkWiksXG4gICAgICAgICAgICB1ID0gby50aWxlU2l6ZSAqIE1hdGgucG93KDIsIGkudHJhbnNmb3JtLnRpbGVab29tKSAvIGMsXG4gICAgICAgICAgICBoID0gdSAqIChvLnRpbGVJRC5jYW5vbmljYWwueCArIG8udGlsZUlELndyYXAgKiBjKSxcbiAgICAgICAgICAgIHAgPSB1ICogby50aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pbWFnZTogMCxcbiAgICAgICAgICB1X3BhdHRlcm5fdGxfYTogci50bCxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYTogci5icixcbiAgICAgICAgICB1X3BhdHRlcm5fdGxfYjogYS50bCxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYjogYS5icixcbiAgICAgICAgICB1X3RleHNpemU6IFtzLCBsXSxcbiAgICAgICAgICB1X21peDogZS50LFxuICAgICAgICAgIHVfcGF0dGVybl9zaXplX2E6IHIuZGlzcGxheVNpemUsXG4gICAgICAgICAgdV9wYXR0ZXJuX3NpemVfYjogYS5kaXNwbGF5U2l6ZSxcbiAgICAgICAgICB1X3NjYWxlX2E6IGUuZnJvbVNjYWxlLFxuICAgICAgICAgIHVfc2NhbGVfYjogZS50b1NjYWxlLFxuICAgICAgICAgIHVfdGlsZV91bml0c190b19waXhlbHM6IDEgLyBwZShvLCAxLCBpLnRyYW5zZm9ybS50aWxlWm9vbSksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF91cHBlcjogW2ggPj4gMTYsIHAgPj4gMTZdLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IFs2NTUzNSAmIGgsIDY1NTM1ICYgcF1cbiAgICAgICAgfTtcbiAgICAgIH0ociwgbiwgbywgYSksIHtcbiAgICAgICAgdV9tYXRyaXg6IGUsXG4gICAgICAgIHVfb3BhY2l0eTogaVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAgICAgS2kgPSB7XG4gICAgICBmaWxsRXh0cnVzaW9uOiBmdW5jdGlvbiBmaWxsRXh0cnVzaW9uKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGlnaHRwb3M6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfbGlnaHRwb3MpLFxuICAgICAgICAgIHVfbGlnaHRpbnRlbnNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbGlnaHRpbnRlbnNpdHkpLFxuICAgICAgICAgIHVfbGlnaHRjb2xvcjogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9saWdodGNvbG9yKSxcbiAgICAgICAgICB1X3ZlcnRpY2FsX2dyYWRpZW50OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3ZlcnRpY2FsX2dyYWRpZW50KSxcbiAgICAgICAgICB1X29wYWNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3BhY2l0eSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogZnVuY3Rpb24gZmlsbEV4dHJ1c2lvblBhdHRlcm4oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9saWdodHBvczogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9saWdodHBvcyksXG4gICAgICAgICAgdV9saWdodGludGVuc2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9saWdodGludGVuc2l0eSksXG4gICAgICAgICAgdV9saWdodGNvbG9yOiBuZXcgdC5Vbmlmb3JtM2YoZSwgaS51X2xpZ2h0Y29sb3IpLFxuICAgICAgICAgIHVfdmVydGljYWxfZ3JhZGllbnQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICAgICAgIHVfaGVpZ2h0X2ZhY3RvcjogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9oZWlnaHRfZmFjdG9yKSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF91cHBlcjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgICAgICAgdV9waXhlbF9jb29yZF9sb3dlcjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgICAgICAgdV9zY2FsZTogbmV3IHQuVW5pZm9ybTNmKGUsIGkudV9zY2FsZSksXG4gICAgICAgICAgdV9mYWRlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGUpLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBmaWxsUGF0dGVybjogZnVuY3Rpb24gZmlsbFBhdHRlcm4oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICAgICAgIHVfc2NhbGU6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGxPdXRsaW5lOiBmdW5jdGlvbiBmaWxsT3V0bGluZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3dvcmxkOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3dvcmxkKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZnVuY3Rpb24gZmlsbE91dGxpbmVQYXR0ZXJuKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfd29ybGQ6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfd29ybGQpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfdGV4c2l6ZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV90ZXhzaXplKSxcbiAgICAgICAgICB1X3BpeGVsX2Nvb3JkX3VwcGVyOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BpeGVsX2Nvb3JkX3VwcGVyKSxcbiAgICAgICAgICB1X3BpeGVsX2Nvb3JkX2xvd2VyOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAgICAgICB1X3NjYWxlOiBuZXcgdC5Vbmlmb3JtM2YoZSwgaS51X3NjYWxlKSxcbiAgICAgICAgICB1X2ZhZGU6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZmFkZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjaXJjbGU6IGZ1bmN0aW9uIGNpcmNsZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICAgICAgIHVfc2NhbGVfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfc2NhbGVfd2l0aF9tYXApLFxuICAgICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICAgICAgIHVfZXh0cnVkZV9zY2FsZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9leHRydWRlX3NjYWxlKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjb2xsaXNpb25Cb3g6IGZ1bmN0aW9uIGNvbGxpc2lvbkJveChlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV9waXhlbHNfdG9fdGlsZV91bml0czogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9waXhlbHNfdG9fdGlsZV91bml0cyksXG4gICAgICAgICAgdV9leHRydWRlX3NjYWxlOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICAgICAgIHVfb3ZlcnNjYWxlX2ZhY3RvcjogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vdmVyc2NhbGVfZmFjdG9yKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGNvbGxpc2lvbkNpcmNsZTogZnVuY3Rpb24gY29sbGlzaW9uQ2lyY2xlKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfaW52X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9pbnZfbWF0cml4KSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV92aWV3cG9ydF9zaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3ZpZXdwb3J0X3NpemUpXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVidWc6IGZ1bmN0aW9uIGRlYnVnKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X2NvbG9yOiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X2NvbG9yKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfb3ZlcmxheTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9vdmVybGF5KSxcbiAgICAgICAgICB1X292ZXJsYXlfc2NhbGU6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3ZlcmxheV9zY2FsZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBjbGlwcGluZ01hc2s6IGZ1bmN0aW9uIGNsaXBwaW5nTWFzayhlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGhlYXRtYXA6IGZ1bmN0aW9uIGhlYXRtYXAoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfZXh0cnVkZV9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9leHRydWRlX3NjYWxlKSxcbiAgICAgICAgICB1X2ludGVuc2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9pbnRlbnNpdHkpLFxuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeClcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBoZWF0bWFwVGV4dHVyZTogZnVuY3Rpb24gaGVhdG1hcFRleHR1cmUoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV93b3JsZDogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV93b3JsZCksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9jb2xvcl9yYW1wOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2NvbG9yX3JhbXApLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGhpbGxzaGFkZTogZnVuY3Rpb24gaGlsbHNoYWRlKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfbGF0cmFuZ2U6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfbGF0cmFuZ2UpLFxuICAgICAgICAgIHVfbGlnaHQ6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfbGlnaHQpLFxuICAgICAgICAgIHVfc2hhZG93OiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X3NoYWRvdyksXG4gICAgICAgICAgdV9oaWdobGlnaHQ6IG5ldyB0LlVuaWZvcm1Db2xvcihlLCBpLnVfaGlnaGxpZ2h0KSxcbiAgICAgICAgICB1X2FjY2VudDogbmV3IHQuVW5pZm9ybUNvbG9yKGUsIGkudV9hY2NlbnQpXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgaGlsbHNoYWRlUHJlcGFyZTogZnVuY3Rpb24gaGlsbHNoYWRlUHJlcGFyZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X2RpbWVuc2lvbjogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9kaW1lbnNpb24pLFxuICAgICAgICAgIHVfem9vbTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV96b29tKSxcbiAgICAgICAgICB1X3VucGFjazogbmV3IHQuVW5pZm9ybTRmKGUsIGkudV91bnBhY2spXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgbGluZTogZnVuY3Rpb24gbGluZShlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3JhdGlvKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfdW5pdHNfdG9fcGl4ZWxzOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3VuaXRzX3RvX3BpeGVscylcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBsaW5lR3JhZGllbnQ6IGZ1bmN0aW9uIGxpbmVHcmFkaWVudChlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3JhdGlvKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfdW5pdHNfdG9fcGl4ZWxzOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3VuaXRzX3RvX3BpeGVscyksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9pbWFnZV9oZWlnaHQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfaW1hZ2VfaGVpZ2h0KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGxpbmVQYXR0ZXJuOiBmdW5jdGlvbiBsaW5lUGF0dGVybihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9yYXRpbyksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X2ltYWdlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlKSxcbiAgICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV91bml0c190b19waXhlbHMpLFxuICAgICAgICAgIHVfc2NhbGU6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGxpbmVTREY6IGZ1bmN0aW9uIGxpbmVTREYoZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X21hdHJpeCksXG4gICAgICAgICAgdV9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9yYXRpbyksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X3VuaXRzX3RvX3BpeGVsczogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV91bml0c190b19waXhlbHMpLFxuICAgICAgICAgIHVfcGF0dGVybnNjYWxlX2E6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybnNjYWxlX2EpLFxuICAgICAgICAgIHVfcGF0dGVybnNjYWxlX2I6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybnNjYWxlX2IpLFxuICAgICAgICAgIHVfc2RmZ2FtbWE6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2RmZ2FtbWEpLFxuICAgICAgICAgIHVfaW1hZ2U6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UpLFxuICAgICAgICAgIHVfdGV4X3lfYTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV90ZXhfeV9hKSxcbiAgICAgICAgICB1X3RleF95X2I6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdGV4X3lfYiksXG4gICAgICAgICAgdV9taXg6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbWl4KVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJhc3RlcjogZnVuY3Rpb24gcmFzdGVyKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfdGxfcGFyZW50OiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RsX3BhcmVudCksXG4gICAgICAgICAgdV9zY2FsZV9wYXJlbnQ6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2NhbGVfcGFyZW50KSxcbiAgICAgICAgICB1X2J1ZmZlcl9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9idWZmZXJfc2NhbGUpLFxuICAgICAgICAgIHVfZmFkZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfdCksXG4gICAgICAgICAgdV9vcGFjaXR5OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X29wYWNpdHkpLFxuICAgICAgICAgIHVfaW1hZ2UwOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2ltYWdlMCksXG4gICAgICAgICAgdV9pbWFnZTE6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaW1hZ2UxKSxcbiAgICAgICAgICB1X2JyaWdodG5lc3NfbG93OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2JyaWdodG5lc3NfbG93KSxcbiAgICAgICAgICB1X2JyaWdodG5lc3NfaGlnaDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9icmlnaHRuZXNzX2hpZ2gpLFxuICAgICAgICAgIHVfc2F0dXJhdGlvbl9mYWN0b3I6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2F0dXJhdGlvbl9mYWN0b3IpLFxuICAgICAgICAgIHVfY29udHJhc3RfZmFjdG9yOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2NvbnRyYXN0X2ZhY3RvciksXG4gICAgICAgICAgdV9zcGluX3dlaWdodHM6IG5ldyB0LlVuaWZvcm0zZihlLCBpLnVfc3Bpbl93ZWlnaHRzKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN5bWJvbEljb246IGZ1bmN0aW9uIHN5bWJvbEljb24oZSwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVfaXNfc2l6ZV96b29tX2NvbnN0YW50OiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2lzX3NpemVfem9vbV9jb25zdGFudCksXG4gICAgICAgICAgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAgICAgICB1X3NpemVfdDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9zaXplX3QpLFxuICAgICAgICAgIHVfc2l6ZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9zaXplKSxcbiAgICAgICAgICB1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2U6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgICAgICAgdV9waXRjaDogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9waXRjaCksXG4gICAgICAgICAgdV9yb3RhdGVfc3ltYm9sOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICAgICAgIHVfYXNwZWN0X3JhdGlvOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2FzcGVjdF9yYXRpbyksXG4gICAgICAgICAgdV9mYWRlX2NoYW5nZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9mYWRlX2NoYW5nZSksXG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X2xhYmVsX3BsYW5lX21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICAgICAgIHVfY29vcmRfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2Nvb3JkX21hdHJpeCksXG4gICAgICAgICAgdV9pc190ZXh0OiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X2lzX3RleHQpLFxuICAgICAgICAgIHVfcGl0Y2hfd2l0aF9tYXA6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICAgICAgIHVfdGV4c2l6ZTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV90ZXhzaXplKSxcbiAgICAgICAgICB1X3RleHR1cmU6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfdGV4dHVyZSlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzeW1ib2xTREY6IGZ1bmN0aW9uIHN5bWJvbFNERihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pc19zaXplX3pvb21fY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAgICAgICB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICAgICAgIHVfc2l6ZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemVfdCksXG4gICAgICAgICAgdV9zaXplOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemUpLFxuICAgICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAgICAgICB1X3BpdGNoOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3BpdGNoKSxcbiAgICAgICAgICB1X3JvdGF0ZV9zeW1ib2w6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcm90YXRlX3N5bWJvbCksXG4gICAgICAgICAgdV9hc3BlY3RfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAgICAgICB1X2ZhZGVfY2hhbmdlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfY2hhbmdlKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGFiZWxfcGxhbmVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgICAgICAgdV9jb29yZF9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfY29vcmRfbWF0cml4KSxcbiAgICAgICAgICB1X2lzX3RleHQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfdGV4dCksXG4gICAgICAgICAgdV9waXRjaF93aXRoX21hcDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9waXRjaF93aXRoX21hcCksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfdGV4dHVyZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV90ZXh0dXJlKSxcbiAgICAgICAgICB1X2dhbW1hX3NjYWxlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2dhbW1hX3NjYWxlKSxcbiAgICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgIHVfaXNfaGFsbzogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19oYWxvKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN5bWJvbFRleHRBbmRJY29uOiBmdW5jdGlvbiBzeW1ib2xUZXh0QW5kSWNvbihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9pc19zaXplX3pvb21fY29uc3RhbnQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAgICAgICB1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICAgICAgIHVfc2l6ZV90OiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemVfdCksXG4gICAgICAgICAgdV9zaXplOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NpemUpLFxuICAgICAgICAgIHVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAgICAgICB1X3BpdGNoOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3BpdGNoKSxcbiAgICAgICAgICB1X3JvdGF0ZV9zeW1ib2w6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfcm90YXRlX3N5bWJvbCksXG4gICAgICAgICAgdV9hc3BlY3RfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAgICAgICB1X2ZhZGVfY2hhbmdlOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X2ZhZGVfY2hhbmdlKSxcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfbGFiZWxfcGxhbmVfbWF0cml4OiBuZXcgdC5Vbmlmb3JtTWF0cml4NGYoZSwgaS51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgICAgICAgdV9jb29yZF9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfY29vcmRfbWF0cml4KSxcbiAgICAgICAgICB1X2lzX3RleHQ6IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfdGV4dCksXG4gICAgICAgICAgdV9waXRjaF93aXRoX21hcDogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9waXRjaF93aXRoX21hcCksXG4gICAgICAgICAgdV90ZXhzaXplOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemUpLFxuICAgICAgICAgIHVfdGV4c2l6ZV9pY29uOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3RleHNpemVfaWNvbiksXG4gICAgICAgICAgdV90ZXh0dXJlOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3RleHR1cmUpLFxuICAgICAgICAgIHVfdGV4dHVyZV9pY29uOiBuZXcgdC5Vbmlmb3JtMWkoZSwgaS51X3RleHR1cmVfaWNvbiksXG4gICAgICAgICAgdV9nYW1tYV9zY2FsZTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9nYW1tYV9zY2FsZSksXG4gICAgICAgICAgdV9kZXZpY2VfcGl4ZWxfcmF0aW86IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICB1X2lzX2hhbG86IG5ldyB0LlVuaWZvcm0xaShlLCBpLnVfaXNfaGFsbylcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBiYWNrZ3JvdW5kOiBmdW5jdGlvbiBiYWNrZ3JvdW5kKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1X21hdHJpeDogbmV3IHQuVW5pZm9ybU1hdHJpeDRmKGUsIGkudV9tYXRyaXgpLFxuICAgICAgICAgIHVfb3BhY2l0eTogbmV3IHQuVW5pZm9ybTFmKGUsIGkudV9vcGFjaXR5KSxcbiAgICAgICAgICB1X2NvbG9yOiBuZXcgdC5Vbmlmb3JtQ29sb3IoZSwgaS51X2NvbG9yKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGJhY2tncm91bmRQYXR0ZXJuOiBmdW5jdGlvbiBiYWNrZ3JvdW5kUGF0dGVybihlLCBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdV9tYXRyaXg6IG5ldyB0LlVuaWZvcm1NYXRyaXg0ZihlLCBpLnVfbWF0cml4KSxcbiAgICAgICAgICB1X29wYWNpdHk6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfb3BhY2l0eSksXG4gICAgICAgICAgdV9pbWFnZTogbmV3IHQuVW5pZm9ybTFpKGUsIGkudV9pbWFnZSksXG4gICAgICAgICAgdV9wYXR0ZXJuX3RsX2E6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybl90bF9hKSxcbiAgICAgICAgICB1X3BhdHRlcm5fYnJfYTogbmV3IHQuVW5pZm9ybTJmKGUsIGkudV9wYXR0ZXJuX2JyX2EpLFxuICAgICAgICAgIHVfcGF0dGVybl90bF9iOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fdGxfYiksXG4gICAgICAgICAgdV9wYXR0ZXJuX2JyX2I6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGF0dGVybl9icl9iKSxcbiAgICAgICAgICB1X3RleHNpemU6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfdGV4c2l6ZSksXG4gICAgICAgICAgdV9taXg6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfbWl4KSxcbiAgICAgICAgICB1X3BhdHRlcm5fc2l6ZV9hOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fc2l6ZV9hKSxcbiAgICAgICAgICB1X3BhdHRlcm5fc2l6ZV9iOiBuZXcgdC5Vbmlmb3JtMmYoZSwgaS51X3BhdHRlcm5fc2l6ZV9iKSxcbiAgICAgICAgICB1X3NjYWxlX2E6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfc2NhbGVfYSksXG4gICAgICAgICAgdV9zY2FsZV9iOiBuZXcgdC5Vbmlmb3JtMWYoZSwgaS51X3NjYWxlX2IpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfdXBwZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICAgICAgIHVfcGl4ZWxfY29vcmRfbG93ZXI6IG5ldyB0LlVuaWZvcm0yZihlLCBpLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICAgICAgIHVfdGlsZV91bml0c190b19waXhlbHM6IG5ldyB0LlVuaWZvcm0xZihlLCBpLnVfdGlsZV91bml0c190b19waXhlbHMpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFlpKGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgIGZvciAodmFyIGwgPSBlLmNvbnRleHQsIGMgPSBsLmdsLCB1ID0gZS51c2VQcm9ncmFtKFwiY29sbGlzaW9uQm94XCIpLCBoID0gW10sIHAgPSAwLCBkID0gMCwgXyA9IDA7IF8gPCByLmxlbmd0aDsgXysrKSB7XG4gICAgICAgIHZhciBmID0gcltfXSxcbiAgICAgICAgICAgIG0gPSBpLmdldFRpbGUoZiksXG4gICAgICAgICAgICBnID0gbS5nZXRCdWNrZXQobyk7XG5cbiAgICAgICAgaWYgKGcpIHtcbiAgICAgICAgICB2YXIgdiA9IGYucG9zTWF0cml4O1xuICAgICAgICAgIDAgPT09IGFbMF0gJiYgMCA9PT0gYVsxXSB8fCAodiA9IGUudHJhbnNsYXRlUG9zTWF0cml4KGYucG9zTWF0cml4LCBtLCBhLCBuKSk7XG4gICAgICAgICAgdmFyIHkgPSBzID8gZy50ZXh0Q29sbGlzaW9uQm94IDogZy5pY29uQ29sbGlzaW9uQm94LFxuICAgICAgICAgICAgICB4ID0gZy5jb2xsaXNpb25DaXJjbGVBcnJheTtcblxuICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBiID0gdC5jcmVhdGUoKSxcbiAgICAgICAgICAgICAgICB3ID0gdjtcbiAgICAgICAgICAgIHQubXVsKGIsIGcucGxhY2VtZW50SW52UHJvak1hdHJpeCwgZS50cmFuc2Zvcm0uZ2xDb29yZE1hdHJpeCksIHQubXVsKGIsIGIsIGcucGxhY2VtZW50Vmlld3BvcnRNYXRyaXgpLCBoLnB1c2goe1xuICAgICAgICAgICAgICBjaXJjbGVBcnJheTogeCxcbiAgICAgICAgICAgICAgY2lyY2xlT2Zmc2V0OiBkLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm06IHcsXG4gICAgICAgICAgICAgIGludlRyYW5zZm9ybTogYlxuICAgICAgICAgICAgfSksIGQgPSBwICs9IHgubGVuZ3RoIC8gNDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB5ICYmIHUuZHJhdyhsLCBjLkxJTkVTLCBJdC5kaXNhYmxlZCwgUHQuZGlzYWJsZWQsIGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdC5kaXNhYmxlZCwgRGkodiwgZS50cmFuc2Zvcm0sIG0pLCBvLmlkLCB5LmxheW91dFZlcnRleEJ1ZmZlciwgeS5pbmRleEJ1ZmZlciwgeS5zZWdtZW50cywgbnVsbCwgZS50cmFuc2Zvcm0uem9vbSwgbnVsbCwgbnVsbCwgeS5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzICYmIGgubGVuZ3RoKSB7XG4gICAgICAgIHZhciBUID0gZS51c2VQcm9ncmFtKFwiY29sbGlzaW9uQ2lyY2xlXCIpLFxuICAgICAgICAgICAgRSA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYoKTtcbiAgICAgICAgRS5yZXNpemUoNCAqIHApLCBFLl90cmltKCk7XG5cbiAgICAgICAgZm9yICh2YXIgSSA9IDAsIFAgPSAwLCBTID0gaDsgUCA8IFMubGVuZ3RoOyBQICs9IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciBDID0gU1tQXSwgeiA9IDA7IHogPCBDLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDQ7IHorKykge1xuICAgICAgICAgICAgdmFyIEQgPSA0ICogeixcbiAgICAgICAgICAgICAgICBBID0gQy5jaXJjbGVBcnJheVtEICsgMF0sXG4gICAgICAgICAgICAgICAgTSA9IEMuY2lyY2xlQXJyYXlbRCArIDFdLFxuICAgICAgICAgICAgICAgIEwgPSBDLmNpcmNsZUFycmF5W0QgKyAyXSxcbiAgICAgICAgICAgICAgICBSID0gQy5jaXJjbGVBcnJheVtEICsgM107XG4gICAgICAgICAgICBFLmVtcGxhY2UoSSsrLCBBLCBNLCBMLCBSLCAwKSwgRS5lbXBsYWNlKEkrKywgQSwgTSwgTCwgUiwgMSksIEUuZW1wbGFjZShJKyssIEEsIE0sIEwsIFIsIDIpLCBFLmVtcGxhY2UoSSsrLCBBLCBNLCBMLCBSLCAzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAoIWppIHx8IGppLmxlbmd0aCA8IDIgKiBwKSAmJiAoamkgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBpID0gMiAqIGUsXG4gICAgICAgICAgICAgIG8gPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDN1aTYoKTtcbiAgICAgICAgICBvLnJlc2l6ZShpKSwgby5fdHJpbSgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBpOyByKyspIHtcbiAgICAgICAgICAgIHZhciBhID0gNiAqIHI7XG4gICAgICAgICAgICBvLnVpbnQxNlthICsgMF0gPSA0ICogciArIDAsIG8udWludDE2W2EgKyAxXSA9IDQgKiByICsgMSwgby51aW50MTZbYSArIDJdID0gNCAqIHIgKyAyLCBvLnVpbnQxNlthICsgM10gPSA0ICogciArIDIsIG8udWludDE2W2EgKyA0XSA9IDQgKiByICsgMywgby51aW50MTZbYSArIDVdID0gNCAqIHIgKyAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9KHApKTtcblxuICAgICAgICBmb3IgKHZhciBrID0gbC5jcmVhdGVJbmRleEJ1ZmZlcihqaSwgITApLCBCID0gbC5jcmVhdGVWZXJ0ZXhCdWZmZXIoRSwgdC5jb2xsaXNpb25DaXJjbGVMYXlvdXQubWVtYmVycywgITApLCBPID0gMCwgRiA9IGg7IE8gPCBGLmxlbmd0aDsgTyArPSAxKSB7XG4gICAgICAgICAgdmFyIFUgPSBGW09dLFxuICAgICAgICAgICAgICBOID0gQWkoVS50cmFuc2Zvcm0sIFUuaW52VHJhbnNmb3JtLCBlLnRyYW5zZm9ybSk7XG4gICAgICAgICAgVC5kcmF3KGwsIGMuVFJJQU5HTEVTLCBJdC5kaXNhYmxlZCwgUHQuZGlzYWJsZWQsIGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdC5kaXNhYmxlZCwgTiwgby5pZCwgQiwgaywgdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMiAqIFUuY2lyY2xlT2Zmc2V0LCBVLmNpcmNsZUFycmF5Lmxlbmd0aCwgVS5jaXJjbGVBcnJheS5sZW5ndGggLyAyKSwgbnVsbCwgZS50cmFuc2Zvcm0uem9vbSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBCLmRlc3Ryb3koKSwgay5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIEppID0gdC5pZGVudGl0eShuZXcgRmxvYXQzMkFycmF5KDE2KSk7XG5cbiAgICBmdW5jdGlvbiBRaShlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyA9IHQuZ2V0QW5jaG9yQWxpZ25tZW50KGUpLFxuICAgICAgICAgIGwgPSAtKHMuaG9yaXpvbnRhbEFsaWduIC0gLjUpICogaSxcbiAgICAgICAgICBjID0gLShzLnZlcnRpY2FsQWxpZ24gLSAuNSkgKiBvLFxuICAgICAgICAgIHUgPSB0LmV2YWx1YXRlVmFyaWFibGVPZmZzZXQoZSwgcik7XG4gICAgICByZXR1cm4gbmV3IHQuUG9pbnQoKGwgLyBhICsgdVswXSkgKiBuLCAoYyAvIGEgKyB1WzFdKSAqIG4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICRpKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgpIHtcbiAgICAgIHZhciBwID0gZS50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LFxuICAgICAgICAgIGQgPSBlLnRleHQuZHluYW1pY0xheW91dFZlcnRleEFycmF5LFxuICAgICAgICAgIF8gPSBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEFycmF5LFxuICAgICAgICAgIGYgPSB7fTtcbiAgICAgIGQuY2xlYXIoKTtcblxuICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBwLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIHZhciBnID0gcC5nZXQobSksXG4gICAgICAgICAgICB2ID0gZy5oaWRkZW4gfHwgIWcuY3Jvc3NUaWxlSUQgfHwgZS5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICFnLnBsYWNlZE9yaWVudGF0aW9uID8gbnVsbCA6IHJbZy5jcm9zc1RpbGVJRF07XG5cbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICB2YXIgeSA9IG5ldyB0LlBvaW50KGcuYW5jaG9yWCwgZy5hbmNob3JZKSxcbiAgICAgICAgICAgICAgeCA9ICR0KHksIG8gPyBsIDogcyksXG4gICAgICAgICAgICAgIGIgPSB0ZShuLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsIHguc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhKSxcbiAgICAgICAgICAgICAgdyA9IGEuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShlLnRleHRTaXplRGF0YSwgdSwgZykgKiBiIC8gdC5PTkVfRU07XG4gICAgICAgICAgbyAmJiAodyAqPSBlLnRpbGVQaXhlbFJhdGlvIC8gYyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBUID0gUWkodi5hbmNob3IsIHYud2lkdGgsIHYuaGVpZ2h0LCB2LnRleHRPZmZzZXQsIHYudGV4dEJveFNjYWxlLCB3KSwgRSA9IG8gPyAkdCh5LmFkZChUKSwgcykucG9pbnQgOiB4LnBvaW50LmFkZChpID8gVC5yb3RhdGUoLW4uYW5nbGUpIDogVCksIEkgPSBlLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgZy5wbGFjZWRPcmllbnRhdGlvbiA9PT0gdC5Xcml0aW5nTW9kZS52ZXJ0aWNhbCA/IE1hdGguUEkgLyAyIDogMCwgUCA9IDA7IFAgPCBnLm51bUdseXBoczsgUCsrKSB7XG4gICAgICAgICAgICB0LmFkZER5bmFtaWNBdHRyaWJ1dGVzKGQsIEUsIEkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGggJiYgZy5hc3NvY2lhdGVkSWNvbkluZGV4ID49IDAgJiYgKGZbZy5hc3NvY2lhdGVkSWNvbkluZGV4XSA9IHtcbiAgICAgICAgICAgIHNoaWZ0ZWRBbmNob3I6IEUsXG4gICAgICAgICAgICBhbmdsZTogSVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgY2UoZy5udW1HbHlwaHMsIGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaCkge1xuICAgICAgICBfLmNsZWFyKCk7XG5cbiAgICAgICAgZm9yICh2YXIgUyA9IGUuaWNvbi5wbGFjZWRTeW1ib2xBcnJheSwgQyA9IDA7IEMgPCBTLmxlbmd0aDsgQysrKSB7XG4gICAgICAgICAgdmFyIHogPSBTLmdldChDKTtcbiAgICAgICAgICBpZiAoei5oaWRkZW4pIGNlKHoubnVtR2x5cGhzLCBfKTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBEID0gZltDXTtcbiAgICAgICAgICAgIGlmIChEKSBmb3IgKHZhciBBID0gMDsgQSA8IHoubnVtR2x5cGhzOyBBKyspIHtcbiAgICAgICAgICAgICAgdC5hZGREeW5hbWljQXR0cmlidXRlcyhfLCBELnNoaWZ0ZWRBbmNob3IsIEQuYW5nbGUpO1xuICAgICAgICAgICAgfSBlbHNlIGNlKHoubnVtR2x5cGhzLCBfKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLmljb24uZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKF8pO1xuICAgICAgfVxuXG4gICAgICBlLnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHQsIGUsIGkpIHtcbiAgICAgIHJldHVybiBpLmljb25zSW5UZXh0ICYmIGUgPyBcInN5bWJvbFRleHRBbmRJY29uXCIgOiB0ID8gXCJzeW1ib2xTREZcIiA6IFwic3ltYm9sSWNvblwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVvKGUsIGksIG8sIHIsIGEsIG4sIHMsIGwsIGMsIHUsIGgsIHApIHtcbiAgICAgIGZvciAodmFyIGQgPSBlLmNvbnRleHQsIF8gPSBkLmdsLCBmID0gZS50cmFuc2Zvcm0sIG0gPSBcIm1hcFwiID09PSBsLCBnID0gXCJtYXBcIiA9PT0gYywgdiA9IG0gJiYgXCJwb2ludFwiICE9PSBvLmxheW91dC5nZXQoXCJzeW1ib2wtcGxhY2VtZW50XCIpLCB5ID0gbSAmJiAhZyAmJiAhdiwgeCA9ICFvLmxheW91dC5nZXQoXCJzeW1ib2wtc29ydC1rZXlcIikuaXNDb25zdGFudCgpLCBiID0gITEsIHcgPSBlLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIEl0LlJlYWRPbmx5KSwgVCA9IG8ubGF5b3V0LmdldChcInRleHQtdmFyaWFibGUtYW5jaG9yXCIpLCBFID0gW10sIEkgPSAwLCBQID0gcjsgSSA8IFAubGVuZ3RoOyBJICs9IDEpIHtcbiAgICAgICAgdmFyIFMgPSBQW0ldLFxuICAgICAgICAgICAgQyA9IGkuZ2V0VGlsZShTKSxcbiAgICAgICAgICAgIHogPSBDLmdldEJ1Y2tldChvKTtcblxuICAgICAgICBpZiAoeikge1xuICAgICAgICAgIHZhciBEID0gYSA/IHoudGV4dCA6IHouaWNvbjtcblxuICAgICAgICAgIGlmIChEICYmIEQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgQSA9IEQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChvLmlkKSxcbiAgICAgICAgICAgICAgICBNID0gYSB8fCB6LnNkZkljb25zLFxuICAgICAgICAgICAgICAgIEwgPSBhID8gei50ZXh0U2l6ZURhdGEgOiB6Lmljb25TaXplRGF0YSxcbiAgICAgICAgICAgICAgICBSID0gZyB8fCAwICE9PSBmLnBpdGNoLFxuICAgICAgICAgICAgICAgIGsgPSBlLnVzZVByb2dyYW0odG8oTSwgYSwgeiksIEEpLFxuICAgICAgICAgICAgICAgIEIgPSB0LmV2YWx1YXRlU2l6ZUZvclpvb20oTCwgZi56b29tKSxcbiAgICAgICAgICAgICAgICBPID0gdm9pZCAwLFxuICAgICAgICAgICAgICAgIEYgPSBbMCwgMF0sXG4gICAgICAgICAgICAgICAgVSA9IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBOID0gdm9pZCAwLFxuICAgICAgICAgICAgICAgIFogPSBudWxsLFxuICAgICAgICAgICAgICAgIHEgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoYSkgVSA9IEMuZ2x5cGhBdGxhc1RleHR1cmUsIE4gPSBfLkxJTkVBUiwgTyA9IEMuZ2x5cGhBdGxhc1RleHR1cmUuc2l6ZSwgei5pY29uc0luVGV4dCAmJiAoRiA9IEMuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZSwgWiA9IEMuaW1hZ2VBdGxhc1RleHR1cmUsIHEgPSBSIHx8IGUub3B0aW9ucy5yb3RhdGluZyB8fCBlLm9wdGlvbnMuem9vbWluZyB8fCBcImNvbXBvc2l0ZVwiID09PSBMLmtpbmQgfHwgXCJjYW1lcmFcIiA9PT0gTC5raW5kID8gXy5MSU5FQVIgOiBfLk5FQVJFU1QpO2Vsc2Uge1xuICAgICAgICAgICAgICB2YXIgaiA9IDEgIT09IG8ubGF5b3V0LmdldChcImljb24tc2l6ZVwiKS5jb25zdGFudE9yKDApIHx8IHouaWNvbnNOZWVkTGluZWFyO1xuICAgICAgICAgICAgICBVID0gQy5pbWFnZUF0bGFzVGV4dHVyZSwgTiA9IE0gfHwgZS5vcHRpb25zLnJvdGF0aW5nIHx8IGUub3B0aW9ucy56b29taW5nIHx8IGogfHwgUiA/IF8uTElORUFSIDogXy5ORUFSRVNULCBPID0gQy5pbWFnZUF0bGFzVGV4dHVyZS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIFYgPSBwZShDLCAxLCBlLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgICAgICBHID0gSnQoUy5wb3NNYXRyaXgsIGcsIG0sIGUudHJhbnNmb3JtLCBWKSxcbiAgICAgICAgICAgICAgICBXID0gUXQoUy5wb3NNYXRyaXgsIGcsIG0sIGUudHJhbnNmb3JtLCBWKSxcbiAgICAgICAgICAgICAgICBYID0gVCAmJiB6Lmhhc1RleHREYXRhKCksXG4gICAgICAgICAgICAgICAgSCA9IFwibm9uZVwiICE9PSBvLmxheW91dC5nZXQoXCJpY29uLXRleHQtZml0XCIpICYmIFggJiYgei5oYXNJY29uRGF0YSgpO1xuICAgICAgICAgICAgdiAmJiBpZSh6LCBTLnBvc01hdHJpeCwgZSwgYSwgRywgVywgZywgdSk7XG4gICAgICAgICAgICB2YXIgSyA9IGUudHJhbnNsYXRlUG9zTWF0cml4KFMucG9zTWF0cml4LCBDLCBuLCBzKSxcbiAgICAgICAgICAgICAgICBZID0gdiB8fCBhICYmIFQgfHwgSCA/IEppIDogRyxcbiAgICAgICAgICAgICAgICBKID0gZS50cmFuc2xhdGVQb3NNYXRyaXgoVywgQywgbiwgcywgITApLFxuICAgICAgICAgICAgICAgIFEgPSBNICYmIDAgIT09IG8ucGFpbnQuZ2V0KGEgPyBcInRleHQtaGFsby13aWR0aFwiIDogXCJpY29uLWhhbG8td2lkdGhcIikuY29uc3RhbnRPcigxKSxcbiAgICAgICAgICAgICAgICAkID0ge1xuICAgICAgICAgICAgICBwcm9ncmFtOiBrLFxuICAgICAgICAgICAgICBidWZmZXJzOiBELFxuICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzOiBNID8gei5pY29uc0luVGV4dCA/IFdpKEwua2luZCwgQiwgeSwgZywgZSwgSywgWSwgSiwgTywgRikgOiBHaShMLmtpbmQsIEIsIHksIGcsIGUsIEssIFksIEosIGEsIE8sICEwKSA6IFZpKEwua2luZCwgQiwgeSwgZywgZSwgSywgWSwgSiwgYSwgTyksXG4gICAgICAgICAgICAgIGF0bGFzVGV4dHVyZTogVSxcbiAgICAgICAgICAgICAgYXRsYXNUZXh0dXJlSWNvbjogWixcbiAgICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uOiBOLFxuICAgICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb25JY29uOiBxLFxuICAgICAgICAgICAgICBpc1NERjogTSxcbiAgICAgICAgICAgICAgaGFzSGFsbzogUVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHggJiYgei5jYW5PdmVybGFwKSB7XG4gICAgICAgICAgICAgIGIgPSAhMDtcblxuICAgICAgICAgICAgICBmb3IgKHZhciB0dCA9IDAsIGV0ID0gRC5zZWdtZW50cy5nZXQoKTsgdHQgPCBldC5sZW5ndGg7IHR0ICs9IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXQgPSBldFt0dF07XG4gICAgICAgICAgICAgICAgRS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBuZXcgdC5TZWdtZW50VmVjdG9yKFtpdF0pLFxuICAgICAgICAgICAgICAgICAgc29ydEtleTogaXQuc29ydEtleSxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBFLnB1c2goe1xuICAgICAgICAgICAgICBzZWdtZW50czogRC5zZWdtZW50cyxcbiAgICAgICAgICAgICAgc29ydEtleTogMCxcbiAgICAgICAgICAgICAgc3RhdGU6ICRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBiICYmIEUuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zb3J0S2V5IC0gZS5zb3J0S2V5O1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIG90ID0gMCwgcnQgPSBFOyBvdCA8IHJ0Lmxlbmd0aDsgb3QgKz0gMSkge1xuICAgICAgICB2YXIgYXQgPSBydFtvdF0sXG4gICAgICAgICAgICBudCA9IGF0LnN0YXRlO1xuXG4gICAgICAgIGlmIChkLmFjdGl2ZVRleHR1cmUuc2V0KF8uVEVYVFVSRTApLCBudC5hdGxhc1RleHR1cmUuYmluZChudC5hdGxhc0ludGVycG9sYXRpb24sIF8uQ0xBTVBfVE9fRURHRSksIG50LmF0bGFzVGV4dHVyZUljb24gJiYgKGQuYWN0aXZlVGV4dHVyZS5zZXQoXy5URVhUVVJFMSksIG50LmF0bGFzVGV4dHVyZUljb24gJiYgbnQuYXRsYXNUZXh0dXJlSWNvbi5iaW5kKG50LmF0bGFzSW50ZXJwb2xhdGlvbkljb24sIF8uQ0xBTVBfVE9fRURHRSkpLCBudC5pc1NERikge1xuICAgICAgICAgIHZhciBzdCA9IG50LnVuaWZvcm1WYWx1ZXM7XG4gICAgICAgICAgbnQuaGFzSGFsbyAmJiAoc3QudV9pc19oYWxvID0gMSwgaW8obnQuYnVmZmVycywgYXQuc2VnbWVudHMsIG8sIGUsIG50LnByb2dyYW0sIHcsIGgsIHAsIHN0KSksIHN0LnVfaXNfaGFsbyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpbyhudC5idWZmZXJzLCBhdC5zZWdtZW50cywgbywgZSwgbnQucHJvZ3JhbSwgdywgaCwgcCwgbnQudW5pZm9ybVZhbHVlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW8odCwgZSwgaSwgbywgciwgYSwgbiwgcywgbCkge1xuICAgICAgdmFyIGMgPSBvLmNvbnRleHQ7XG4gICAgICByLmRyYXcoYywgYy5nbC5UUklBTkdMRVMsIGEsIG4sIHMsIEN0LmRpc2FibGVkLCBsLCBpLmlkLCB0LmxheW91dFZlcnRleEJ1ZmZlciwgdC5pbmRleEJ1ZmZlciwgZSwgaS5wYWludCwgby50cmFuc2Zvcm0uem9vbSwgdC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGkuaWQpLCB0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIsIHQub3BhY2l0eVZlcnRleEJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb28odCwgZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdmFyIHMsXG4gICAgICAgICAgbCxcbiAgICAgICAgICBjLFxuICAgICAgICAgIHUsXG4gICAgICAgICAgaCxcbiAgICAgICAgICBwID0gdC5jb250ZXh0LmdsLFxuICAgICAgICAgIGQgPSBpLnBhaW50LmdldChcImZpbGwtcGF0dGVyblwiKSxcbiAgICAgICAgICBfID0gZCAmJiBkLmNvbnN0YW50T3IoMSksXG4gICAgICAgICAgZiA9IGkuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuXG4gICAgICBuID8gKGwgPSBfICYmICFpLmdldFBhaW50UHJvcGVydHkoXCJmaWxsLW91dGxpbmUtY29sb3JcIikgPyBcImZpbGxPdXRsaW5lUGF0dGVyblwiIDogXCJmaWxsT3V0bGluZVwiLCBzID0gcC5MSU5FUykgOiAobCA9IF8gPyBcImZpbGxQYXR0ZXJuXCIgOiBcImZpbGxcIiwgcyA9IHAuVFJJQU5HTEVTKTtcblxuICAgICAgZm9yICh2YXIgbSA9IDAsIGcgPSBvOyBtIDwgZy5sZW5ndGg7IG0gKz0gMSkge1xuICAgICAgICB2YXIgdiA9IGdbbV0sXG4gICAgICAgICAgICB5ID0gZS5nZXRUaWxlKHYpO1xuXG4gICAgICAgIGlmICghXyB8fCB5LnBhdHRlcm5zTG9hZGVkKCkpIHtcbiAgICAgICAgICB2YXIgeCA9IHkuZ2V0QnVja2V0KGkpO1xuXG4gICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIHZhciBiID0geC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGkuaWQpLFxuICAgICAgICAgICAgICAgIHcgPSB0LnVzZVByb2dyYW0obCwgYik7XG4gICAgICAgICAgICBfICYmICh0LmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQocC5URVhUVVJFMCksIHkuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChwLkxJTkVBUiwgcC5DTEFNUF9UT19FREdFKSwgYi51cGRhdGVQYWludEJ1ZmZlcnMoZikpO1xuICAgICAgICAgICAgdmFyIFQgPSBkLmNvbnN0YW50T3IobnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChUICYmIHkuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgICB2YXIgRSA9IHkuaW1hZ2VBdGxhcyxcbiAgICAgICAgICAgICAgICAgIEkgPSBFLnBhdHRlcm5Qb3NpdGlvbnNbVC50by50b1N0cmluZygpXSxcbiAgICAgICAgICAgICAgICAgIFAgPSBFLnBhdHRlcm5Qb3NpdGlvbnNbVC5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgICBJICYmIFAgJiYgYi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMoSSwgUCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBTID0gdC50cmFuc2xhdGVQb3NNYXRyaXgodi5wb3NNYXRyaXgsIHksIGkucGFpbnQuZ2V0KFwiZmlsbC10cmFuc2xhdGVcIiksIGkucGFpbnQuZ2V0KFwiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCIpKTtcblxuICAgICAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgICAgdSA9IHguaW5kZXhCdWZmZXIyLCBoID0geC5zZWdtZW50czI7XG4gICAgICAgICAgICAgIHZhciBDID0gW3AuZHJhd2luZ0J1ZmZlcldpZHRoLCBwLmRyYXdpbmdCdWZmZXJIZWlnaHRdO1xuICAgICAgICAgICAgICBjID0gXCJmaWxsT3V0bGluZVBhdHRlcm5cIiA9PT0gbCAmJiBfID8gQ2koUywgdCwgZiwgeSwgQykgOiBTaShTLCBDKTtcbiAgICAgICAgICAgIH0gZWxzZSB1ID0geC5pbmRleEJ1ZmZlciwgaCA9IHguc2VnbWVudHMsIGMgPSBfID8gUGkoUywgdCwgZiwgeSkgOiBJaShTKTtcblxuICAgICAgICAgICAgdy5kcmF3KHQuY29udGV4dCwgcywgciwgdC5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKHYpLCBhLCBDdC5kaXNhYmxlZCwgYywgaS5pZCwgeC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIHUsIGgsIGkucGFpbnQsIHQudHJhbnNmb3JtLnpvb20sIGIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJvKHQsIGUsIGksIG8sIHIsIGEsIG4pIHtcbiAgICAgIGZvciAodmFyIHMgPSB0LmNvbnRleHQsIGwgPSBzLmdsLCBjID0gaS5wYWludC5nZXQoXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCIpLCB1ID0gYy5jb25zdGFudE9yKDEpLCBoID0gaS5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCksIHAgPSBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIiksIGQgPSAwLCBfID0gbzsgZCA8IF8ubGVuZ3RoOyBkICs9IDEpIHtcbiAgICAgICAgdmFyIGYgPSBfW2RdLFxuICAgICAgICAgICAgbSA9IGUuZ2V0VGlsZShmKSxcbiAgICAgICAgICAgIGcgPSBtLmdldEJ1Y2tldChpKTtcblxuICAgICAgICBpZiAoZykge1xuICAgICAgICAgIHZhciB2ID0gZy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGkuaWQpLFxuICAgICAgICAgICAgICB5ID0gdC51c2VQcm9ncmFtKHUgPyBcImZpbGxFeHRydXNpb25QYXR0ZXJuXCIgOiBcImZpbGxFeHRydXNpb25cIiwgdik7XG4gICAgICAgICAgdSAmJiAodC5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGwuVEVYVFVSRTApLCBtLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQobC5MSU5FQVIsIGwuQ0xBTVBfVE9fRURHRSksIHYudXBkYXRlUGFpbnRCdWZmZXJzKGgpKTtcbiAgICAgICAgICB2YXIgeCA9IGMuY29uc3RhbnRPcihudWxsKTtcblxuICAgICAgICAgIGlmICh4ICYmIG0uaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgdmFyIGIgPSBtLmltYWdlQXRsYXMsXG4gICAgICAgICAgICAgICAgdyA9IGIucGF0dGVyblBvc2l0aW9uc1t4LnRvLnRvU3RyaW5nKCldLFxuICAgICAgICAgICAgICAgIFQgPSBiLnBhdHRlcm5Qb3NpdGlvbnNbeC5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgdyAmJiBUICYmIHYuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHcsIFQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBFID0gdC50cmFuc2xhdGVQb3NNYXRyaXgoZi5wb3NNYXRyaXgsIG0sIGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCIpLCBpLnBhaW50LmdldChcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIikpLFxuICAgICAgICAgICAgICBJID0gaS5wYWludC5nZXQoXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiKSxcbiAgICAgICAgICAgICAgUCA9IHUgPyBFaShFLCB0LCBJLCBwLCBmLCBoLCBtKSA6IFRpKEUsIHQsIEksIHApO1xuICAgICAgICAgIHkuZHJhdyhzLCBzLmdsLlRSSUFOR0xFUywgciwgYSwgbiwgQ3QuYmFja0NDVywgUCwgaS5pZCwgZy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGcuaW5kZXhCdWZmZXIsIGcuc2VnbWVudHMsIGkucGFpbnQsIHQudHJhbnNmb3JtLnpvb20sIHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYW8oZSwgaSwgbywgciwgYSwgbikge1xuICAgICAgdmFyIHMgPSBlLmNvbnRleHQsXG4gICAgICAgICAgbCA9IHMuZ2wsXG4gICAgICAgICAgYyA9IGkuZmJvO1xuXG4gICAgICBpZiAoYykge1xuICAgICAgICB2YXIgdSA9IGUudXNlUHJvZ3JhbShcImhpbGxzaGFkZVwiKTtcbiAgICAgICAgcy5hY3RpdmVUZXh0dXJlLnNldChsLlRFWFRVUkUwKSwgbC5iaW5kVGV4dHVyZShsLlRFWFRVUkVfMkQsIGMuY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgICAgICB2YXIgaCA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgICAgdmFyIHIgPSBvLnBhaW50LmdldChcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIiksXG4gICAgICAgICAgICAgIGEgPSBvLnBhaW50LmdldChcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIiksXG4gICAgICAgICAgICAgIG4gPSBvLnBhaW50LmdldChcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIiksXG4gICAgICAgICAgICAgIHMgPSBvLnBhaW50LmdldChcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCIpICogKE1hdGguUEkgLyAxODApO1xuICAgICAgICAgIFwidmlld3BvcnRcIiA9PT0gby5wYWludC5nZXQoXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiKSAmJiAocyAtPSBlLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgdmFyIGwsXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHUsXG4gICAgICAgICAgICAgIGggPSAhZS5vcHRpb25zLm1vdmluZztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdV9tYXRyaXg6IGUudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChpLnRpbGVJRC50b1Vud3JhcHBlZCgpLCBoKSxcbiAgICAgICAgICAgIHVfaW1hZ2U6IDAsXG4gICAgICAgICAgICB1X2xhdHJhbmdlOiAobCA9IGkudGlsZUlELCBjID0gTWF0aC5wb3coMiwgbC5jYW5vbmljYWwueiksIHUgPSBsLmNhbm9uaWNhbC55LCBbbmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKDAsIHUgLyBjKS50b0xuZ0xhdCgpLmxhdCwgbmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKDAsICh1ICsgMSkgLyBjKS50b0xuZ0xhdCgpLmxhdF0pLFxuICAgICAgICAgICAgdV9saWdodDogW28ucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiKSwgc10sXG4gICAgICAgICAgICB1X3NoYWRvdzogcixcbiAgICAgICAgICAgIHVfaGlnaGxpZ2h0OiBhLFxuICAgICAgICAgICAgdV9hY2NlbnQ6IG5cbiAgICAgICAgICB9O1xuICAgICAgICB9KGUsIGksIG8pO1xuXG4gICAgICAgIHUuZHJhdyhzLCBsLlRSSUFOR0xFUywgciwgYSwgbiwgQ3QuZGlzYWJsZWQsIGgsIG8uaWQsIGUucmFzdGVyQm91bmRzQnVmZmVyLCBlLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBlLnJhc3RlckJvdW5kc1NlZ21lbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBubyhlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyA9IGUuY29udGV4dCxcbiAgICAgICAgICBsID0gcy5nbCxcbiAgICAgICAgICBjID0gaS5kZW07XG5cbiAgICAgIGlmIChjICYmIGMuZGF0YSkge1xuICAgICAgICB2YXIgdSA9IGMuZGltLFxuICAgICAgICAgICAgaCA9IGMuc3RyaWRlLFxuICAgICAgICAgICAgcCA9IGMuZ2V0UGl4ZWxzKCk7XG5cbiAgICAgICAgaWYgKHMuYWN0aXZlVGV4dHVyZS5zZXQobC5URVhUVVJFMSksIHMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KCExKSwgaS5kZW1UZXh0dXJlID0gaS5kZW1UZXh0dXJlIHx8IGUuZ2V0VGlsZVRleHR1cmUoaCksIGkuZGVtVGV4dHVyZSkge1xuICAgICAgICAgIHZhciBkID0gaS5kZW1UZXh0dXJlO1xuICAgICAgICAgIGQudXBkYXRlKHAsIHtcbiAgICAgICAgICAgIHByZW11bHRpcGx5OiAhMVxuICAgICAgICAgIH0pLCBkLmJpbmQobC5ORUFSRVNULCBsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9IGVsc2UgaS5kZW1UZXh0dXJlID0gbmV3IHQuVGV4dHVyZShzLCBwLCBsLlJHQkEsIHtcbiAgICAgICAgICBwcmVtdWx0aXBseTogITFcbiAgICAgICAgfSksIGkuZGVtVGV4dHVyZS5iaW5kKGwuTkVBUkVTVCwgbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICBzLmFjdGl2ZVRleHR1cmUuc2V0KGwuVEVYVFVSRTApO1xuICAgICAgICB2YXIgXyA9IGkuZmJvO1xuXG4gICAgICAgIGlmICghXykge1xuICAgICAgICAgIHZhciBmID0gbmV3IHQuVGV4dHVyZShzLCB7XG4gICAgICAgICAgICB3aWR0aDogdSxcbiAgICAgICAgICAgIGhlaWdodDogdSxcbiAgICAgICAgICAgIGRhdGE6IG51bGxcbiAgICAgICAgICB9LCBsLlJHQkEpO1xuICAgICAgICAgIGYuYmluZChsLkxJTkVBUiwgbC5DTEFNUF9UT19FREdFKSwgKF8gPSBpLmZibyA9IHMuY3JlYXRlRnJhbWVidWZmZXIodSwgdSwgITApKS5jb2xvckF0dGFjaG1lbnQuc2V0KGYudGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzLmJpbmRGcmFtZWJ1ZmZlci5zZXQoXy5mcmFtZWJ1ZmZlciksIHMudmlld3BvcnQuc2V0KFswLCAwLCB1LCB1XSksIGUudXNlUHJvZ3JhbShcImhpbGxzaGFkZVByZXBhcmVcIikuZHJhdyhzLCBsLlRSSUFOR0xFUywgciwgYSwgbiwgQ3QuZGlzYWJsZWQsIGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgICAgdmFyIG8gPSBpLnN0cmlkZSxcbiAgICAgICAgICAgICAgciA9IHQuY3JlYXRlKCk7XG4gICAgICAgICAgcmV0dXJuIHQub3J0aG8ociwgMCwgdC5FWFRFTlQsIC10LkVYVEVOVCwgMCwgMCwgMSksIHQudHJhbnNsYXRlKHIsIHIsIFswLCAtdC5FWFRFTlQsIDBdKSwge1xuICAgICAgICAgICAgdV9tYXRyaXg6IHIsXG4gICAgICAgICAgICB1X2ltYWdlOiAxLFxuICAgICAgICAgICAgdV9kaW1lbnNpb246IFtvLCBvXSxcbiAgICAgICAgICAgIHVfem9vbTogZS5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgIHVfdW5wYWNrOiBpLmdldFVucGFja1ZlY3RvcigpXG4gICAgICAgICAgfTtcbiAgICAgICAgfShpLnRpbGVJRCwgYyksIG8uaWQsIGUucmFzdGVyQm91bmRzQnVmZmVyLCBlLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBlLnJhc3RlckJvdW5kc1NlZ21lbnRzKSwgaS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSAhMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbyhlLCBpLCBvLCByLCBhKSB7XG4gICAgICB2YXIgbiA9IHIucGFpbnQuZ2V0KFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIik7XG5cbiAgICAgIGlmIChuID4gMCkge1xuICAgICAgICB2YXIgcyA9IHQuYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGwgPSAocyAtIGUudGltZUFkZGVkKSAvIG4sXG4gICAgICAgICAgICBjID0gaSA/IChzIC0gaS50aW1lQWRkZWQpIC8gbiA6IC0xLFxuICAgICAgICAgICAgdSA9IG8uZ2V0U291cmNlKCksXG4gICAgICAgICAgICBoID0gYS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgdGlsZVNpemU6IHUudGlsZVNpemUsXG4gICAgICAgICAgcm91bmRab29tOiB1LnJvdW5kWm9vbVxuICAgICAgICB9KSxcbiAgICAgICAgICAgIHAgPSAhaSB8fCBNYXRoLmFicyhpLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGgpID4gTWF0aC5hYnMoZS50aWxlSUQub3ZlcnNjYWxlZFogLSBoKSxcbiAgICAgICAgICAgIGQgPSBwICYmIGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPyAxIDogdC5jbGFtcChwID8gbCA6IDEgLSBjLCAwLCAxKTtcbiAgICAgICAgcmV0dXJuIGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gJiYgbCA+PSAxICYmIChlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gITEpLCBpID8ge1xuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgbWl4OiAxIC0gZFxuICAgICAgICB9IDoge1xuICAgICAgICAgIG9wYWNpdHk6IGQsXG4gICAgICAgICAgbWl4OiAwXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIG1peDogMFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbG8gPSBuZXcgdC5Db2xvcigxLCAwLCAwLCAxKSxcbiAgICAgICAgY28gPSBuZXcgdC5Db2xvcigwLCAxLCAwLCAxKSxcbiAgICAgICAgdW8gPSBuZXcgdC5Db2xvcigwLCAwLCAxLCAxKSxcbiAgICAgICAgaG8gPSBuZXcgdC5Db2xvcigxLCAwLCAxLCAxKSxcbiAgICAgICAgcG8gPSBuZXcgdC5Db2xvcigwLCAxLCAxLCAxKTtcblxuICAgIGZ1bmN0aW9uIF9vKHQsIGUsIGksIG8pIHtcbiAgICAgIG1vKHQsIDAsIGUgKyBpIC8gMiwgdC50cmFuc2Zvcm0ud2lkdGgsIGksIG8pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvKHQsIGUsIGksIG8pIHtcbiAgICAgIG1vKHQsIGUgLSBpIC8gMiwgMCwgaSwgdC50cmFuc2Zvcm0uaGVpZ2h0LCBvKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtbyhlLCBpLCBvLCByLCBhLCBuKSB7XG4gICAgICB2YXIgcyA9IGUuY29udGV4dCxcbiAgICAgICAgICBsID0gcy5nbDtcbiAgICAgIGwuZW5hYmxlKGwuU0NJU1NPUl9URVNUKSwgbC5zY2lzc29yKGkgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgbyAqIHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLCByICogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sIGEgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyksIHMuY2xlYXIoe1xuICAgICAgICBjb2xvcjogblxuICAgICAgfSksIGwuZGlzYWJsZShsLlNDSVNTT1JfVEVTVCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ28oZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBlLmNvbnRleHQsXG4gICAgICAgICAgYSA9IHIuZ2wsXG4gICAgICAgICAgbiA9IG8ucG9zTWF0cml4LFxuICAgICAgICAgIHMgPSBlLnVzZVByb2dyYW0oXCJkZWJ1Z1wiKSxcbiAgICAgICAgICBsID0gSXQuZGlzYWJsZWQsXG4gICAgICAgICAgYyA9IFB0LmRpc2FibGVkLFxuICAgICAgICAgIHUgPSBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgIHIuYWN0aXZlVGV4dHVyZS5zZXQoYS5URVhUVVJFMCksIGUuZW1wdHlUZXh0dXJlLmJpbmQoYS5MSU5FQVIsIGEuQ0xBTVBfVE9fRURHRSksIHMuZHJhdyhyLCBhLkxJTkVfU1RSSVAsIGwsIGMsIHUsIEN0LmRpc2FibGVkLCBNaShuLCB0LkNvbG9yLnJlZCksIFwiJGRlYnVnXCIsIGUuZGVidWdCdWZmZXIsIGUudGlsZUJvcmRlckluZGV4QnVmZmVyLCBlLmRlYnVnU2VnbWVudHMpO1xuXG4gICAgICB2YXIgaCA9IGkuZ2V0VGlsZUJ5SUQoby5rZXkpLmxhdGVzdFJhd1RpbGVEYXRhLFxuICAgICAgICAgIHAgPSBNYXRoLmZsb29yKChoICYmIGguYnl0ZUxlbmd0aCB8fCAwKSAvIDEwMjQpLFxuICAgICAgICAgIGQgPSBpLmdldFRpbGUobykudGlsZVNpemUsXG4gICAgICAgICAgXyA9IDUxMiAvIE1hdGgubWluKGQsIDUxMikgKiAoby5vdmVyc2NhbGVkWiAvIGUudHJhbnNmb3JtLnpvb20pICogLjUsXG4gICAgICAgICAgZiA9IG8uY2Fub25pY2FsLnRvU3RyaW5nKCk7XG5cbiAgICAgIG8ub3ZlcnNjYWxlZFogIT09IG8uY2Fub25pY2FsLnogJiYgKGYgKz0gXCIgPT4gXCIgKyBvLm92ZXJzY2FsZWRaKSwgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdC5pbml0RGVidWdPdmVybGF5Q2FudmFzKCk7XG4gICAgICAgIHZhciBpID0gdC5kZWJ1Z092ZXJsYXlDYW52YXMsXG4gICAgICAgICAgICBvID0gdC5jb250ZXh0LmdsLFxuICAgICAgICAgICAgciA9IHQuZGVidWdPdmVybGF5Q2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgci5jbGVhclJlY3QoMCwgMCwgaS53aWR0aCwgaS5oZWlnaHQpLCByLnNoYWRvd0NvbG9yID0gXCJ3aGl0ZVwiLCByLnNoYWRvd0JsdXIgPSAyLCByLmxpbmVXaWR0aCA9IDEuNSwgci5zdHJva2VTdHlsZSA9IFwid2hpdGVcIiwgci50ZXh0QmFzZWxpbmUgPSBcInRvcFwiLCByLmZvbnQgPSBcImJvbGQgMzZweCBPcGVuIFNhbnMsIHNhbnMtc2VyaWZcIiwgci5maWxsVGV4dChlLCA1LCA1KSwgci5zdHJva2VUZXh0KGUsIDUsIDUpLCB0LmRlYnVnT3ZlcmxheVRleHR1cmUudXBkYXRlKGkpLCB0LmRlYnVnT3ZlcmxheVRleHR1cmUuYmluZChvLkxJTkVBUiwgby5DTEFNUF9UT19FREdFKTtcbiAgICAgIH0oZSwgZiArIFwiIFwiICsgcCArIFwia2JcIiksIHMuZHJhdyhyLCBhLlRSSUFOR0xFUywgbCwgYywgU3QuYWxwaGFCbGVuZGVkLCBDdC5kaXNhYmxlZCwgTWkobiwgdC5Db2xvci50cmFuc3BhcmVudCwgXyksIFwiJGRlYnVnXCIsIGUuZGVidWdCdWZmZXIsIGUucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIGUuZGVidWdTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgdmFyIHZvID0ge1xuICAgICAgc3ltYm9sOiBmdW5jdGlvbiBzeW1ib2woZSwgaSwgbywgciwgYSkge1xuICAgICAgICBpZiAoXCJ0cmFuc2x1Y2VudFwiID09PSBlLnJlbmRlclBhc3MpIHtcbiAgICAgICAgICB2YXIgbiA9IFB0LmRpc2FibGVkLFxuICAgICAgICAgICAgICBzID0gZS5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgICAgICAgby5sYXlvdXQuZ2V0KFwidGV4dC12YXJpYWJsZS1hbmNob3JcIikgJiYgZnVuY3Rpb24gKGUsIGksIG8sIHIsIGEsIG4sIHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGwgPSBpLnRyYW5zZm9ybSwgYyA9IFwibWFwXCIgPT09IGEsIHUgPSBcIm1hcFwiID09PSBuLCBoID0gMCwgcCA9IGU7IGggPCBwLmxlbmd0aDsgaCArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBkID0gcFtoXSxcbiAgICAgICAgICAgICAgICAgIF8gPSByLmdldFRpbGUoZCksXG4gICAgICAgICAgICAgICAgICBmID0gXy5nZXRCdWNrZXQobyk7XG5cbiAgICAgICAgICAgICAgaWYgKGYgJiYgZi50ZXh0ICYmIGYudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IHQuZXZhbHVhdGVTaXplRm9yWm9vbShmLnRleHRTaXplRGF0YSwgbC56b29tKSxcbiAgICAgICAgICAgICAgICAgICAgZyA9IHBlKF8sIDEsIGkudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgICAgICAgICB2ID0gSnQoZC5wb3NNYXRyaXgsIHUsIGMsIGkudHJhbnNmb3JtLCBnKSxcbiAgICAgICAgICAgICAgICAgICAgeSA9IFwibm9uZVwiICE9PSBvLmxheW91dC5nZXQoXCJpY29uLXRleHQtZml0XCIpICYmIGYuaGFzSWNvbkRhdGEoKTtcblxuICAgICAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgeCA9IE1hdGgucG93KDIsIGwuem9vbSAtIF8udGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgICAgICAgICRpKGYsIGMsIHUsIHMsIHQuc3ltYm9sU2l6ZSwgbCwgdiwgZC5wb3NNYXRyaXgsIHgsIG0sIHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0ociwgZSwgbywgaSwgby5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksIG8ubGF5b3V0LmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpLCBhKSwgMCAhPT0gby5wYWludC5nZXQoXCJpY29uLW9wYWNpdHlcIikuY29uc3RhbnRPcigxKSAmJiBlbyhlLCBpLCBvLCByLCAhMSwgby5wYWludC5nZXQoXCJpY29uLXRyYW5zbGF0ZVwiKSwgby5wYWludC5nZXQoXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIiksIG8ubGF5b3V0LmdldChcImljb24tcm90YXRpb24tYWxpZ25tZW50XCIpLCBvLmxheW91dC5nZXQoXCJpY29uLXBpdGNoLWFsaWdubWVudFwiKSwgby5sYXlvdXQuZ2V0KFwiaWNvbi1rZWVwLXVwcmlnaHRcIiksIG4sIHMpLCAwICE9PSBvLnBhaW50LmdldChcInRleHQtb3BhY2l0eVwiKS5jb25zdGFudE9yKDEpICYmIGVvKGUsIGksIG8sIHIsICEwLCBvLnBhaW50LmdldChcInRleHQtdHJhbnNsYXRlXCIpLCBvLnBhaW50LmdldChcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiKSwgby5sYXlvdXQuZ2V0KFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIiksIG8ubGF5b3V0LmdldChcInRleHQtcGl0Y2gtYWxpZ25tZW50XCIpLCBvLmxheW91dC5nZXQoXCJ0ZXh0LWtlZXAtdXByaWdodFwiKSwgbiwgcyksIGkubWFwLnNob3dDb2xsaXNpb25Cb3hlcyAmJiAoWWkoZSwgaSwgbywgciwgby5wYWludC5nZXQoXCJ0ZXh0LXRyYW5zbGF0ZVwiKSwgby5wYWludC5nZXQoXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIiksICEwKSwgWWkoZSwgaSwgbywgciwgby5wYWludC5nZXQoXCJpY29uLXRyYW5zbGF0ZVwiKSwgby5wYWludC5nZXQoXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIiksICExKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjaXJjbGU6IGZ1bmN0aW9uIGNpcmNsZShlLCBpLCBvLCByKSB7XG4gICAgICAgIGlmIChcInRyYW5zbHVjZW50XCIgPT09IGUucmVuZGVyUGFzcykge1xuICAgICAgICAgIHZhciBhID0gby5wYWludC5nZXQoXCJjaXJjbGUtb3BhY2l0eVwiKSxcbiAgICAgICAgICAgICAgbiA9IG8ucGFpbnQuZ2V0KFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiKSxcbiAgICAgICAgICAgICAgcyA9IG8ucGFpbnQuZ2V0KFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCIpLFxuICAgICAgICAgICAgICBsID0gIW8ubGF5b3V0LmdldChcImNpcmNsZS1zb3J0LWtleVwiKS5pc0NvbnN0YW50KCk7XG5cbiAgICAgICAgICBpZiAoMCAhPT0gYS5jb25zdGFudE9yKDEpIHx8IDAgIT09IG4uY29uc3RhbnRPcigxKSAmJiAwICE9PSBzLmNvbnN0YW50T3IoMSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSBlLmNvbnRleHQsIHUgPSBjLmdsLCBoID0gZS5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBJdC5SZWFkT25seSksIHAgPSBQdC5kaXNhYmxlZCwgZCA9IGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBfID0gW10sIGYgPSAwOyBmIDwgci5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICB2YXIgbSA9IHJbZl0sXG4gICAgICAgICAgICAgICAgICBnID0gaS5nZXRUaWxlKG0pLFxuICAgICAgICAgICAgICAgICAgdiA9IGcuZ2V0QnVja2V0KG8pO1xuXG4gICAgICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAgICAgdmFyIHkgPSB2LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQoby5pZCksXG4gICAgICAgICAgICAgICAgICAgIHggPSB7XG4gICAgICAgICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbjogeSxcbiAgICAgICAgICAgICAgICAgIHByb2dyYW06IGUudXNlUHJvZ3JhbShcImNpcmNsZVwiLCB5KSxcbiAgICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogdi5sYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlcjogdi5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXM6IHppKGUsIG0sIGcsIG8pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAobCkgZm9yICh2YXIgYiA9IDAsIHcgPSB2LnNlZ21lbnRzLmdldCgpOyBiIDwgdy5sZW5ndGg7IGIgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIFQgPSB3W2JdO1xuXG4gICAgICAgICAgICAgICAgICBfLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50czogbmV3IHQuU2VnbWVudFZlY3RvcihbVF0pLFxuICAgICAgICAgICAgICAgICAgICBzb3J0S2V5OiBULnNvcnRLZXksXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB4XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgXy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNlZ21lbnRzOiB2LnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgICAgc29ydEtleTogMCxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiB4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbCAmJiBfLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQuc29ydEtleSAtIGUuc29ydEtleTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBFID0gMCwgSSA9IF87IEUgPCBJLmxlbmd0aDsgRSArPSAxKSB7XG4gICAgICAgICAgICAgIHZhciBQID0gSVtFXSxcbiAgICAgICAgICAgICAgICAgIFMgPSBQLnN0YXRlO1xuICAgICAgICAgICAgICBTLnByb2dyYW0uZHJhdyhjLCB1LlRSSUFOR0xFUywgaCwgcCwgZCwgQ3QuZGlzYWJsZWQsIFMudW5pZm9ybVZhbHVlcywgby5pZCwgUy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIFMuaW5kZXhCdWZmZXIsIFAuc2VnbWVudHMsIG8ucGFpbnQsIGUudHJhbnNmb3JtLnpvb20sIFMucHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhlYXRtYXA6IGZ1bmN0aW9uIGhlYXRtYXAoZSwgaSwgbywgcikge1xuICAgICAgICBpZiAoMCAhPT0gby5wYWludC5nZXQoXCJoZWF0bWFwLW9wYWNpdHlcIikpIGlmIChcIm9mZnNjcmVlblwiID09PSBlLnJlbmRlclBhc3MpIHtcbiAgICAgICAgICB2YXIgYSA9IGUuY29udGV4dCxcbiAgICAgICAgICAgICAgbiA9IGEuZ2wsXG4gICAgICAgICAgICAgIHMgPSBQdC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgbCA9IG5ldyBTdChbbi5PTkUsIG4uT05FXSwgdC5Db2xvci50cmFuc3BhcmVudCwgWyEwLCAhMCwgITAsICEwXSk7XG4gICAgICAgICAgIWZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHQuZ2w7XG4gICAgICAgICAgICB0LmFjdGl2ZVRleHR1cmUuc2V0KG8uVEVYVFVSRTEpLCB0LnZpZXdwb3J0LnNldChbMCwgMCwgZS53aWR0aCAvIDQsIGUuaGVpZ2h0IC8gNF0pO1xuICAgICAgICAgICAgdmFyIHIgPSBpLmhlYXRtYXBGYm87XG4gICAgICAgICAgICBpZiAocikgby5iaW5kVGV4dHVyZShvLlRFWFRVUkVfMkQsIHIuY29sb3JBdHRhY2htZW50LmdldCgpKSwgdC5iaW5kRnJhbWVidWZmZXIuc2V0KHIuZnJhbWVidWZmZXIpO2Vsc2Uge1xuICAgICAgICAgICAgICB2YXIgYSA9IG8uY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgICBvLmJpbmRUZXh0dXJlKG8uVEVYVFVSRV8yRCwgYSksIG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsIG8uVEVYVFVSRV9XUkFQX1MsIG8uQ0xBTVBfVE9fRURHRSksIG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsIG8uVEVYVFVSRV9XUkFQX1QsIG8uQ0xBTVBfVE9fRURHRSksIG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsIG8uVEVYVFVSRV9NSU5fRklMVEVSLCBvLkxJTkVBUiksIG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsIG8uVEVYVFVSRV9NQUdfRklMVEVSLCBvLkxJTkVBUiksIHIgPSBpLmhlYXRtYXBGYm8gPSB0LmNyZWF0ZUZyYW1lYnVmZmVyKGUud2lkdGggLyA0LCBlLmhlaWdodCAvIDQsICExKSwgZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHQuZ2w7XG4gICAgICAgICAgICAgICAgci50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwgMCwgci5SR0JBLCBlLndpZHRoIC8gNCwgZS5oZWlnaHQgLyA0LCAwLCByLlJHQkEsIHQuZXh0UmVuZGVyVG9UZXh0dXJlSGFsZkZsb2F0ID8gdC5leHRUZXh0dXJlSGFsZkZsb2F0LkhBTEZfRkxPQVRfT0VTIDogci5VTlNJR05FRF9CWVRFLCBudWxsKSwgby5jb2xvckF0dGFjaG1lbnQuc2V0KGkpO1xuICAgICAgICAgICAgICB9KHQsIGUsIGEsIHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0oYSwgZSwgbyksIGEuY2xlYXIoe1xuICAgICAgICAgICAgY29sb3I6IHQuQ29sb3IudHJhbnNwYXJlbnRcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgci5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdmFyIHUgPSByW2NdO1xuXG4gICAgICAgICAgICBpZiAoIWkuaGFzUmVuZGVyYWJsZVBhcmVudCh1KSkge1xuICAgICAgICAgICAgICB2YXIgaCA9IGkuZ2V0VGlsZSh1KSxcbiAgICAgICAgICAgICAgICAgIHAgPSBoLmdldEJ1Y2tldChvKTtcblxuICAgICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgIHZhciBkID0gcC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KG8uaWQpO1xuICAgICAgICAgICAgICAgIGUudXNlUHJvZ3JhbShcImhlYXRtYXBcIiwgZCkuZHJhdyhhLCBuLlRSSUFOR0xFUywgSXQuZGlzYWJsZWQsIHMsIGwsIEN0LmRpc2FibGVkLCBSaSh1LnBvc01hdHJpeCwgaCwgZS50cmFuc2Zvcm0uem9vbSwgby5wYWludC5nZXQoXCJoZWF0bWFwLWludGVuc2l0eVwiKSksIG8uaWQsIHAubGF5b3V0VmVydGV4QnVmZmVyLCBwLmluZGV4QnVmZmVyLCBwLnNlZ21lbnRzLCBvLnBhaW50LCBlLnRyYW5zZm9ybS56b29tLCBkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGEudmlld3BvcnQuc2V0KFswLCAwLCBlLndpZHRoLCBlLmhlaWdodF0pO1xuICAgICAgICB9IGVsc2UgXCJ0cmFuc2x1Y2VudFwiID09PSBlLnJlbmRlclBhc3MgJiYgKGUuY29udGV4dC5zZXRDb2xvck1vZGUoZS5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpLCBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIHZhciBvID0gZS5jb250ZXh0LFxuICAgICAgICAgICAgICByID0gby5nbCxcbiAgICAgICAgICAgICAgYSA9IGkuaGVhdG1hcEZibztcblxuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBvLmFjdGl2ZVRleHR1cmUuc2V0KHIuVEVYVFVSRTApLCByLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCwgYS5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpLCBvLmFjdGl2ZVRleHR1cmUuc2V0KHIuVEVYVFVSRTEpO1xuICAgICAgICAgICAgdmFyIG4gPSBpLmNvbG9yUmFtcFRleHR1cmU7XG4gICAgICAgICAgICBuIHx8IChuID0gaS5jb2xvclJhbXBUZXh0dXJlID0gbmV3IHQuVGV4dHVyZShvLCBpLmNvbG9yUmFtcCwgci5SR0JBKSksIG4uYmluZChyLkxJTkVBUiwgci5DTEFNUF9UT19FREdFKSwgZS51c2VQcm9ncmFtKFwiaGVhdG1hcFRleHR1cmVcIikuZHJhdyhvLCByLlRSSUFOR0xFUywgSXQuZGlzYWJsZWQsIFB0LmRpc2FibGVkLCBlLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgQ3QuZGlzYWJsZWQsIGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgICAgICAgIHZhciBhID0gdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgdC5vcnRobyhhLCAwLCBlLndpZHRoLCBlLmhlaWdodCwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgIHZhciBuID0gZS5jb250ZXh0LmdsO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVfbWF0cml4OiBhLFxuICAgICAgICAgICAgICAgIHVfd29ybGQ6IFtuLmRyYXdpbmdCdWZmZXJXaWR0aCwgbi5kcmF3aW5nQnVmZmVySGVpZ2h0XSxcbiAgICAgICAgICAgICAgICB1X2ltYWdlOiAwLFxuICAgICAgICAgICAgICAgIHVfY29sb3JfcmFtcDogMSxcbiAgICAgICAgICAgICAgICB1X29wYWNpdHk6IGkucGFpbnQuZ2V0KFwiaGVhdG1hcC1vcGFjaXR5XCIpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KGUsIGkpLCBpLmlkLCBlLnZpZXdwb3J0QnVmZmVyLCBlLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBlLnZpZXdwb3J0U2VnbWVudHMsIGkucGFpbnQsIGUudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICAgIH1cbiAgICAgICAgfShlLCBvKSk7XG4gICAgICB9LFxuICAgICAgbGluZTogZnVuY3Rpb24gbGluZShlLCBpLCBvLCByKSB7XG4gICAgICAgIGlmIChcInRyYW5zbHVjZW50XCIgPT09IGUucmVuZGVyUGFzcykge1xuICAgICAgICAgIHZhciBhID0gby5wYWludC5nZXQoXCJsaW5lLW9wYWNpdHlcIiksXG4gICAgICAgICAgICAgIG4gPSBvLnBhaW50LmdldChcImxpbmUtd2lkdGhcIik7XG4gICAgICAgICAgaWYgKDAgIT09IGEuY29uc3RhbnRPcigxKSAmJiAwICE9PSBuLmNvbnN0YW50T3IoMSkpIGZvciAodmFyIHMgPSBlLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIEl0LlJlYWRPbmx5KSwgbCA9IGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBjID0gby5wYWludC5nZXQoXCJsaW5lLWRhc2hhcnJheVwiKSwgdSA9IG8ucGFpbnQuZ2V0KFwibGluZS1wYXR0ZXJuXCIpLCBoID0gdS5jb25zdGFudE9yKDEpLCBwID0gby5wYWludC5nZXQoXCJsaW5lLWdyYWRpZW50XCIpLCBkID0gby5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCksIF8gPSBoID8gXCJsaW5lUGF0dGVyblwiIDogYyA/IFwibGluZVNERlwiIDogcCA/IFwibGluZUdyYWRpZW50XCIgOiBcImxpbmVcIiwgZiA9IGUuY29udGV4dCwgbSA9IGYuZ2wsIGcgPSAhMCwgdiA9IDAsIHkgPSByOyB2IDwgeS5sZW5ndGg7IHYgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHggPSB5W3ZdLFxuICAgICAgICAgICAgICAgIGIgPSBpLmdldFRpbGUoeCk7XG5cbiAgICAgICAgICAgIGlmICghaCB8fCBiLnBhdHRlcm5zTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgdmFyIHcgPSBiLmdldEJ1Y2tldChvKTtcblxuICAgICAgICAgICAgICBpZiAodykge1xuICAgICAgICAgICAgICAgIHZhciBUID0gdy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KG8uaWQpLFxuICAgICAgICAgICAgICAgICAgICBFID0gZS5jb250ZXh0LnByb2dyYW0uZ2V0KCksXG4gICAgICAgICAgICAgICAgICAgIEkgPSBlLnVzZVByb2dyYW0oXywgVCksXG4gICAgICAgICAgICAgICAgICAgIFAgPSBnIHx8IEkucHJvZ3JhbSAhPT0gRSxcbiAgICAgICAgICAgICAgICAgICAgUyA9IHUuY29uc3RhbnRPcihudWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChTICYmIGIuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgICAgICAgdmFyIEMgPSBiLmltYWdlQXRsYXMsXG4gICAgICAgICAgICAgICAgICAgICAgeiA9IEMucGF0dGVyblBvc2l0aW9uc1tTLnRvLnRvU3RyaW5nKCldLFxuICAgICAgICAgICAgICAgICAgICAgIEQgPSBDLnBhdHRlcm5Qb3NpdGlvbnNbUy5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgICAgICAgeiAmJiBEICYmIFQuc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHosIEQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBBID0gaCA/IE9pKGUsIGIsIG8sIGQpIDogYyA/IEZpKGUsIGIsIG8sIGMsIGQpIDogcCA/IEJpKGUsIGIsIG8sIHcubGluZUNsaXBzQXJyYXkubGVuZ3RoKSA6IGtpKGUsIGIsIG8pO1xuICAgICAgICAgICAgICAgIGlmIChoKSBmLmFjdGl2ZVRleHR1cmUuc2V0KG0uVEVYVFVSRTApLCBiLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQobS5MSU5FQVIsIG0uQ0xBTVBfVE9fRURHRSksIFQudXBkYXRlUGFpbnRCdWZmZXJzKGQpO2Vsc2UgaWYgKGMgJiYgKFAgfHwgZS5saW5lQXRsYXMuZGlydHkpKSBmLmFjdGl2ZVRleHR1cmUuc2V0KG0uVEVYVFVSRTApLCBlLmxpbmVBdGxhcy5iaW5kKGYpO2Vsc2UgaWYgKHApIHtcbiAgICAgICAgICAgICAgICAgIHZhciBNID0gdy5ncmFkaWVudHNbby5pZF0sXG4gICAgICAgICAgICAgICAgICAgICAgTCA9IE0udGV4dHVyZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG8uZ3JhZGllbnRWZXJzaW9uICE9PSBNLnZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIFIgPSAyNTY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG8uc3RlcEludGVycG9sYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBpLmdldFNvdXJjZSgpLm1heHpvb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEIgPSB4LmNhbm9uaWNhbC56ID09PSBrID8gTWF0aC5jZWlsKDEgPDwgZS50cmFuc2Zvcm0ubWF4Wm9vbSAtIHguY2Fub25pY2FsLnopIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICBSID0gdC5jbGFtcCh0Lm5leHRQb3dlck9mVHdvKHcubWF4TGluZUxlbmd0aCAvIHQuRVhURU5UICogMTAyNCAqIEIpLCAyNTYsIGYubWF4VGV4dHVyZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgTS5ncmFkaWVudCA9IHQucmVuZGVyQ29sb3JSYW1wKHtcbiAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBvLmdyYWRpZW50RXhwcmVzc2lvbigpLFxuICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb25LZXk6IFwibGluZVByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogUixcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogTS5ncmFkaWVudCB8fCB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgICAgY2xpcHM6IHcubGluZUNsaXBzQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgfSksIE0udGV4dHVyZSA/IE0udGV4dHVyZS51cGRhdGUoTS5ncmFkaWVudCkgOiBNLnRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKGYsIE0uZ3JhZGllbnQsIG0uUkdCQSksIE0udmVyc2lvbiA9IG8uZ3JhZGllbnRWZXJzaW9uLCBMID0gTS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBmLmFjdGl2ZVRleHR1cmUuc2V0KG0uVEVYVFVSRTApLCBMLmJpbmQoby5zdGVwSW50ZXJwb2xhbnQgPyBtLk5FQVJFU1QgOiBtLkxJTkVBUiwgbS5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSS5kcmF3KGYsIG0uVFJJQU5HTEVTLCBzLCBlLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoeCksIGwsIEN0LmRpc2FibGVkLCBBLCBvLmlkLCB3LmxheW91dFZlcnRleEJ1ZmZlciwgdy5pbmRleEJ1ZmZlciwgdy5zZWdtZW50cywgby5wYWludCwgZS50cmFuc2Zvcm0uem9vbSwgVCwgdy5sYXlvdXRWZXJ0ZXhCdWZmZXIyKSwgZyA9ICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsbDogZnVuY3Rpb24gZmlsbChlLCBpLCBvLCByKSB7XG4gICAgICAgIHZhciBhID0gby5wYWludC5nZXQoXCJmaWxsLWNvbG9yXCIpLFxuICAgICAgICAgICAgbiA9IG8ucGFpbnQuZ2V0KFwiZmlsbC1vcGFjaXR5XCIpO1xuXG4gICAgICAgIGlmICgwICE9PSBuLmNvbnN0YW50T3IoMSkpIHtcbiAgICAgICAgICB2YXIgcyA9IGUuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLFxuICAgICAgICAgICAgICBsID0gby5wYWludC5nZXQoXCJmaWxsLXBhdHRlcm5cIiksXG4gICAgICAgICAgICAgIGMgPSBlLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSAmJiAhbC5jb25zdGFudE9yKDEpICYmIDEgPT09IGEuY29uc3RhbnRPcih0LkNvbG9yLnRyYW5zcGFyZW50KS5hICYmIDEgPT09IG4uY29uc3RhbnRPcigwKSA/IFwib3BhcXVlXCIgOiBcInRyYW5zbHVjZW50XCI7XG5cbiAgICAgICAgICBpZiAoZS5yZW5kZXJQYXNzID09PSBjKSB7XG4gICAgICAgICAgICB2YXIgdSA9IGUuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMSwgXCJvcGFxdWVcIiA9PT0gZS5yZW5kZXJQYXNzID8gSXQuUmVhZFdyaXRlIDogSXQuUmVhZE9ubHkpO1xuICAgICAgICAgICAgb28oZSwgaSwgbywgciwgdSwgcywgITEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcInRyYW5zbHVjZW50XCIgPT09IGUucmVuZGVyUGFzcyAmJiBvLnBhaW50LmdldChcImZpbGwtYW50aWFsaWFzXCIpKSB7XG4gICAgICAgICAgICB2YXIgaCA9IGUuZGVwdGhNb2RlRm9yU3VibGF5ZXIoby5nZXRQYWludFByb3BlcnR5KFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIpID8gMiA6IDAsIEl0LlJlYWRPbmx5KTtcbiAgICAgICAgICAgIG9vKGUsIGksIG8sIHIsIGgsIHMsICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImZpbGwtZXh0cnVzaW9uXCI6IGZ1bmN0aW9uIGZpbGxFeHRydXNpb24odCwgZSwgaSwgbykge1xuICAgICAgICB2YXIgciA9IGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiKTtcblxuICAgICAgICBpZiAoMCAhPT0gciAmJiBcInRyYW5zbHVjZW50XCIgPT09IHQucmVuZGVyUGFzcykge1xuICAgICAgICAgIHZhciBhID0gbmV3IEl0KHQuY29udGV4dC5nbC5MRVFVQUwsIEl0LlJlYWRXcml0ZSwgdC5kZXB0aFJhbmdlRm9yM0QpO1xuICAgICAgICAgIGlmICgxICE9PSByIHx8IGkucGFpbnQuZ2V0KFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiKS5jb25zdGFudE9yKDEpKSBybyh0LCBlLCBpLCBvLCBhLCBQdC5kaXNhYmxlZCwgU3QuZGlzYWJsZWQpLCBybyh0LCBlLCBpLCBvLCBhLCB0LnN0ZW5jaWxNb2RlRm9yM0QoKSwgdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO2Vsc2Uge1xuICAgICAgICAgICAgdmFyIG4gPSB0LmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgICAgICAgIHJvKHQsIGUsIGksIG8sIGEsIFB0LmRpc2FibGVkLCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoaWxsc2hhZGU6IGZ1bmN0aW9uIGhpbGxzaGFkZSh0LCBlLCBpLCBvKSB7XG4gICAgICAgIGlmIChcIm9mZnNjcmVlblwiID09PSB0LnJlbmRlclBhc3MgfHwgXCJ0cmFuc2x1Y2VudFwiID09PSB0LnJlbmRlclBhc3MpIHtcbiAgICAgICAgICBmb3IgKHZhciByID0gdC5jb250ZXh0LCBhID0gdC5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBJdC5SZWFkT25seSksIG4gPSB0LmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgcyA9IFwidHJhbnNsdWNlbnRcIiA9PT0gdC5yZW5kZXJQYXNzID8gdC5zdGVuY2lsQ29uZmlnRm9yT3ZlcmxhcChvKSA6IFt7fSwgb10sIGwgPSBzWzBdLCBjID0gMCwgdSA9IHNbMV07IGMgPCB1Lmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgICB2YXIgaCA9IHVbY10sXG4gICAgICAgICAgICAgICAgcCA9IGUuZ2V0VGlsZShoKTtcbiAgICAgICAgICAgIHAubmVlZHNIaWxsc2hhZGVQcmVwYXJlICYmIFwib2Zmc2NyZWVuXCIgPT09IHQucmVuZGVyUGFzcyA/IG5vKHQsIHAsIGksIGEsIFB0LmRpc2FibGVkLCBuKSA6IFwidHJhbnNsdWNlbnRcIiA9PT0gdC5yZW5kZXJQYXNzICYmIGFvKHQsIHAsIGksIGEsIGxbaC5vdmVyc2NhbGVkWl0sIG4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIudmlld3BvcnQuc2V0KFswLCAwLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmFzdGVyOiBmdW5jdGlvbiByYXN0ZXIodCwgZSwgaSwgbykge1xuICAgICAgICBpZiAoXCJ0cmFuc2x1Y2VudFwiID09PSB0LnJlbmRlclBhc3MgJiYgMCAhPT0gaS5wYWludC5nZXQoXCJyYXN0ZXItb3BhY2l0eVwiKSAmJiBvLmxlbmd0aCkgZm9yICh2YXIgciA9IHQuY29udGV4dCwgYSA9IHIuZ2wsIG4gPSBlLmdldFNvdXJjZSgpLCBzID0gdC51c2VQcm9ncmFtKFwicmFzdGVyXCIpLCBsID0gdC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIGMgPSBuIGluc3RhbmNlb2YgTSA/IFt7fSwgb10gOiB0LnN0ZW5jaWxDb25maWdGb3JPdmVybGFwKG8pLCB1ID0gY1swXSwgaCA9IGNbMV0sIHAgPSBoW2gubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFosIGQgPSAhdC5vcHRpb25zLm1vdmluZywgXyA9IDAsIGYgPSBoOyBfIDwgZi5sZW5ndGg7IF8gKz0gMSkge1xuICAgICAgICAgIHZhciBtID0gZltfXSxcbiAgICAgICAgICAgICAgZyA9IHQuZGVwdGhNb2RlRm9yU3VibGF5ZXIobS5vdmVyc2NhbGVkWiAtIHAsIDEgPT09IGkucGFpbnQuZ2V0KFwicmFzdGVyLW9wYWNpdHlcIikgPyBJdC5SZWFkV3JpdGUgOiBJdC5SZWFkT25seSwgYS5MRVNTKSxcbiAgICAgICAgICAgICAgdiA9IGUuZ2V0VGlsZShtKSxcbiAgICAgICAgICAgICAgeSA9IHQudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChtLnRvVW53cmFwcGVkKCksIGQpO1xuICAgICAgICAgIHYucmVnaXN0ZXJGYWRlRHVyYXRpb24oaS5wYWludC5nZXQoXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiKSk7XG4gICAgICAgICAgdmFyIHggPSBlLmZpbmRMb2FkZWRQYXJlbnQobSwgMCksXG4gICAgICAgICAgICAgIGIgPSBzbyh2LCB4LCBlLCBpLCB0LnRyYW5zZm9ybSksXG4gICAgICAgICAgICAgIHcgPSB2b2lkIDAsXG4gICAgICAgICAgICAgIFQgPSB2b2lkIDAsXG4gICAgICAgICAgICAgIEUgPSBcIm5lYXJlc3RcIiA9PT0gaS5wYWludC5nZXQoXCJyYXN0ZXItcmVzYW1wbGluZ1wiKSA/IGEuTkVBUkVTVCA6IGEuTElORUFSO1xuICAgICAgICAgIHIuYWN0aXZlVGV4dHVyZS5zZXQoYS5URVhUVVJFMCksIHYudGV4dHVyZS5iaW5kKEUsIGEuQ0xBTVBfVE9fRURHRSwgYS5MSU5FQVJfTUlQTUFQX05FQVJFU1QpLCByLmFjdGl2ZVRleHR1cmUuc2V0KGEuVEVYVFVSRTEpLCB4ID8gKHgudGV4dHVyZS5iaW5kKEUsIGEuQ0xBTVBfVE9fRURHRSwgYS5MSU5FQVJfTUlQTUFQX05FQVJFU1QpLCB3ID0gTWF0aC5wb3coMiwgeC50aWxlSUQub3ZlcnNjYWxlZFogLSB2LnRpbGVJRC5vdmVyc2NhbGVkWiksIFQgPSBbdi50aWxlSUQuY2Fub25pY2FsLnggKiB3ICUgMSwgdi50aWxlSUQuY2Fub25pY2FsLnkgKiB3ICUgMV0pIDogdi50ZXh0dXJlLmJpbmQoRSwgYS5DTEFNUF9UT19FREdFLCBhLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgICAgICAgdmFyIEkgPSBaaSh5LCBUIHx8IFswLCAwXSwgdyB8fCAxLCBiLCBpKTtcbiAgICAgICAgICBuIGluc3RhbmNlb2YgTSA/IHMuZHJhdyhyLCBhLlRSSUFOR0xFUywgZywgUHQuZGlzYWJsZWQsIGwsIEN0LmRpc2FibGVkLCBJLCBpLmlkLCBuLmJvdW5kc0J1ZmZlciwgdC5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgbi5ib3VuZHNTZWdtZW50cykgOiBzLmRyYXcociwgYS5UUklBTkdMRVMsIGcsIHVbbS5vdmVyc2NhbGVkWl0sIGwsIEN0LmRpc2FibGVkLCBJLCBpLmlkLCB0LnJhc3RlckJvdW5kc0J1ZmZlciwgdC5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgdC5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBiYWNrZ3JvdW5kOiBmdW5jdGlvbiBiYWNrZ3JvdW5kKHQsIGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSBpLnBhaW50LmdldChcImJhY2tncm91bmQtY29sb3JcIiksXG4gICAgICAgICAgICByID0gaS5wYWludC5nZXQoXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIik7XG5cbiAgICAgICAgaWYgKDAgIT09IHIpIHtcbiAgICAgICAgICB2YXIgYSA9IHQuY29udGV4dCxcbiAgICAgICAgICAgICAgbiA9IGEuZ2wsXG4gICAgICAgICAgICAgIHMgPSB0LnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgbCA9IHMudGlsZVNpemUsXG4gICAgICAgICAgICAgIGMgPSBpLnBhaW50LmdldChcImJhY2tncm91bmQtcGF0dGVyblwiKTtcblxuICAgICAgICAgIGlmICghdC5pc1BhdHRlcm5NaXNzaW5nKGMpKSB7XG4gICAgICAgICAgICB2YXIgdSA9ICFjICYmIDEgPT09IG8uYSAmJiAxID09PSByICYmIHQub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpID8gXCJvcGFxdWVcIiA6IFwidHJhbnNsdWNlbnRcIjtcblxuICAgICAgICAgICAgaWYgKHQucmVuZGVyUGFzcyA9PT0gdSkge1xuICAgICAgICAgICAgICB2YXIgaCA9IFB0LmRpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgcCA9IHQuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgXCJvcGFxdWVcIiA9PT0gdSA/IEl0LlJlYWRXcml0ZSA6IEl0LlJlYWRPbmx5KSxcbiAgICAgICAgICAgICAgICAgIGQgPSB0LmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgICAgICAgIF8gPSB0LnVzZVByb2dyYW0oYyA/IFwiYmFja2dyb3VuZFBhdHRlcm5cIiA6IFwiYmFja2dyb3VuZFwiKSxcbiAgICAgICAgICAgICAgICAgIGYgPSBzLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgICAgIHRpbGVTaXplOiBsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGMgJiYgKGEuYWN0aXZlVGV4dHVyZS5zZXQobi5URVhUVVJFMCksIHQuaW1hZ2VNYW5hZ2VyLmJpbmQodC5jb250ZXh0KSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IGkuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpLCBnID0gMCwgdiA9IGY7IGcgPCB2Lmxlbmd0aDsgZyArPSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHkgPSB2W2ddLFxuICAgICAgICAgICAgICAgICAgICB4ID0gdC50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KHkudG9VbndyYXBwZWQoKSksXG4gICAgICAgICAgICAgICAgICAgIGIgPSBjID8gSGkoeCwgciwgdCwgYywge1xuICAgICAgICAgICAgICAgICAgdGlsZUlEOiB5LFxuICAgICAgICAgICAgICAgICAgdGlsZVNpemU6IGxcbiAgICAgICAgICAgICAgICB9LCBtKSA6IFhpKHgsIHIsIG8pO1xuXG4gICAgICAgICAgICAgICAgXy5kcmF3KGEsIG4uVFJJQU5HTEVTLCBwLCBoLCBkLCBDdC5kaXNhYmxlZCwgYiwgaS5pZCwgdC50aWxlRXh0ZW50QnVmZmVyLCB0LnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCB0LnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWJ1ZzogZnVuY3Rpb24gZGVidWcodCwgZSwgaSkge1xuICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgICBnbyh0LCBlLCBpW29dKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogZnVuY3Rpb24gY3VzdG9tKHQsIGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0LmNvbnRleHQsXG4gICAgICAgICAgICByID0gaS5pbXBsZW1lbnRhdGlvbjtcblxuICAgICAgICBpZiAoXCJvZmZzY3JlZW5cIiA9PT0gdC5yZW5kZXJQYXNzKSB7XG4gICAgICAgICAgdmFyIGEgPSByLnByZXJlbmRlcjtcbiAgICAgICAgICBhICYmICh0LnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKSwgby5zZXRDb2xvck1vZGUodC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpLCBhLmNhbGwociwgby5nbCwgdC50cmFuc2Zvcm0uY3VzdG9tTGF5ZXJNYXRyaXgoKSksIG8uc2V0RGlydHkoKSwgdC5zZXRCYXNlU3RhdGUoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJ0cmFuc2x1Y2VudFwiID09PSB0LnJlbmRlclBhc3MpIHtcbiAgICAgICAgICB0LnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKSwgby5zZXRDb2xvck1vZGUodC5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpLCBvLnNldFN0ZW5jaWxNb2RlKFB0LmRpc2FibGVkKTtcbiAgICAgICAgICB2YXIgbiA9IFwiM2RcIiA9PT0gci5yZW5kZXJpbmdNb2RlID8gbmV3IEl0KHQuY29udGV4dC5nbC5MRVFVQUwsIEl0LlJlYWRXcml0ZSwgdC5kZXB0aFJhbmdlRm9yM0QpIDogdC5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBJdC5SZWFkT25seSk7XG4gICAgICAgICAgby5zZXREZXB0aE1vZGUobiksIHIucmVuZGVyKG8uZ2wsIHQudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpLCBvLnNldERpcnR5KCksIHQuc2V0QmFzZVN0YXRlKCksIG8uYmluZEZyYW1lYnVmZmVyLnNldChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgICAgIHlvID0gZnVuY3Rpb24geW8odCwgZSkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IHp0KHQpLCB0aGlzLnRyYW5zZm9ybSA9IGUsIHRoaXMuX3RpbGVUZXh0dXJlcyA9IHt9LCB0aGlzLnNldHVwKCksIHRoaXMubnVtU3VibGF5ZXJzID0gRHQubWF4VW5kZXJ6b29taW5nICsgRHQubWF4T3Zlcnpvb21pbmcgKyAxLCB0aGlzLmRlcHRoRXBzaWxvbiA9IDEgLyBNYXRoLnBvdygyLCAxNiksIHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXggPSBuZXcgRmUoKSwgdGhpcy5ncHVUaW1lcnMgPSB7fTtcbiAgICB9O1xuXG4gICAgeW8ucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICBpZiAodGhpcy53aWR0aCA9IGUgKiB0LmJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgdGhpcy5oZWlnaHQgPSBpICogdC5icm93c2VyLmRldmljZVBpeGVsUmF0aW8sIHRoaXMuY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XSksIHRoaXMuc3R5bGUpIGZvciAodmFyIG8gPSAwLCByID0gdGhpcy5zdHlsZS5fb3JkZXI7IG8gPCByLmxlbmd0aDsgbyArPSAxKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuX2xheWVyc1tyW29dXS5yZXNpemUoKTtcbiAgICAgIH1cbiAgICB9LCB5by5wcm90b3R5cGUuc2V0dXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICBpID0gbmV3IHQuU3RydWN0QXJyYXlMYXlvdXQyaTQoKTtcbiAgICAgIGkuZW1wbGFjZUJhY2soMCwgMCksIGkuZW1wbGFjZUJhY2sodC5FWFRFTlQsIDApLCBpLmVtcGxhY2VCYWNrKDAsIHQuRVhURU5UKSwgaS5lbXBsYWNlQmFjayh0LkVYVEVOVCwgdC5FWFRFTlQpLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIgPSBlLmNyZWF0ZVZlcnRleEJ1ZmZlcihpLCBWZS5tZW1iZXJzKSwgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMgPSB0LlNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICAgIHZhciBvID0gbmV3IHQuU3RydWN0QXJyYXlMYXlvdXQyaTQoKTtcbiAgICAgIG8uZW1wbGFjZUJhY2soMCwgMCksIG8uZW1wbGFjZUJhY2sodC5FWFRFTlQsIDApLCBvLmVtcGxhY2VCYWNrKDAsIHQuRVhURU5UKSwgby5lbXBsYWNlQmFjayh0LkVYVEVOVCwgdC5FWFRFTlQpLCB0aGlzLmRlYnVnQnVmZmVyID0gZS5jcmVhdGVWZXJ0ZXhCdWZmZXIobywgVmUubWVtYmVycyksIHRoaXMuZGVidWdTZWdtZW50cyA9IHQuU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDUpO1xuICAgICAgdmFyIHIgPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDRpOCgpO1xuICAgICAgci5lbXBsYWNlQmFjaygwLCAwLCAwLCAwKSwgci5lbXBsYWNlQmFjayh0LkVYVEVOVCwgMCwgdC5FWFRFTlQsIDApLCByLmVtcGxhY2VCYWNrKDAsIHQuRVhURU5ULCAwLCB0LkVYVEVOVCksIHIuZW1wbGFjZUJhY2sodC5FWFRFTlQsIHQuRVhURU5ULCB0LkVYVEVOVCwgdC5FWFRFTlQpLCB0aGlzLnJhc3RlckJvdW5kc0J1ZmZlciA9IGUuY3JlYXRlVmVydGV4QnVmZmVyKHIsIEEubWVtYmVycyksIHRoaXMucmFzdGVyQm91bmRzU2VnbWVudHMgPSB0LlNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICAgIHZhciBhID0gbmV3IHQuU3RydWN0QXJyYXlMYXlvdXQyaTQoKTtcbiAgICAgIGEuZW1wbGFjZUJhY2soMCwgMCksIGEuZW1wbGFjZUJhY2soMSwgMCksIGEuZW1wbGFjZUJhY2soMCwgMSksIGEuZW1wbGFjZUJhY2soMSwgMSksIHRoaXMudmlld3BvcnRCdWZmZXIgPSBlLmNyZWF0ZVZlcnRleEJ1ZmZlcihhLCBWZS5tZW1iZXJzKSwgdGhpcy52aWV3cG9ydFNlZ21lbnRzID0gdC5TZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICB2YXIgbiA9IG5ldyB0LlN0cnVjdEFycmF5TGF5b3V0MXVpMigpO1xuICAgICAgbi5lbXBsYWNlQmFjaygwKSwgbi5lbXBsYWNlQmFjaygxKSwgbi5lbXBsYWNlQmFjaygzKSwgbi5lbXBsYWNlQmFjaygyKSwgbi5lbXBsYWNlQmFjaygwKSwgdGhpcy50aWxlQm9yZGVySW5kZXhCdWZmZXIgPSBlLmNyZWF0ZUluZGV4QnVmZmVyKG4pO1xuICAgICAgdmFyIHMgPSBuZXcgdC5TdHJ1Y3RBcnJheUxheW91dDN1aTYoKTtcbiAgICAgIHMuZW1wbGFjZUJhY2soMCwgMSwgMiksIHMuZW1wbGFjZUJhY2soMiwgMSwgMyksIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIgPSBlLmNyZWF0ZUluZGV4QnVmZmVyKHMpLCB0aGlzLmVtcHR5VGV4dHVyZSA9IG5ldyB0LlRleHR1cmUoZSwge1xuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBkYXRhOiBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMF0pXG4gICAgICB9LCBlLmdsLlJHQkEpO1xuICAgICAgdmFyIGwgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICB0aGlzLnN0ZW5jaWxDbGVhck1vZGUgPSBuZXcgUHQoe1xuICAgICAgICBmdW5jOiBsLkFMV0FZUyxcbiAgICAgICAgbWFzazogMFxuICAgICAgfSwgMCwgMjU1LCBsLlpFUk8sIGwuWkVSTywgbC5aRVJPKTtcbiAgICB9LCB5by5wcm90b3R5cGUuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgaSA9IGUuZ2w7XG4gICAgICB0aGlzLm5leHRTdGVuY2lsSUQgPSAxLCB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdm9pZCAwO1xuICAgICAgdmFyIG8gPSB0LmNyZWF0ZSgpO1xuICAgICAgdC5vcnRobyhvLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgMCwgMSksIHQuc2NhbGUobywgbywgW2kuZHJhd2luZ0J1ZmZlcldpZHRoLCBpLmRyYXdpbmdCdWZmZXJIZWlnaHQsIDBdKSwgdGhpcy51c2VQcm9ncmFtKFwiY2xpcHBpbmdNYXNrXCIpLmRyYXcoZSwgaS5UUklBTkdMRVMsIEl0LmRpc2FibGVkLCB0aGlzLnN0ZW5jaWxDbGVhck1vZGUsIFN0LmRpc2FibGVkLCBDdC5kaXNhYmxlZCwgTGkobyksIFwiJGNsaXBwaW5nXCIsIHRoaXMudmlld3BvcnRCdWZmZXIsIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHRoaXMudmlld3BvcnRTZWdtZW50cyk7XG4gICAgfSwgeW8ucHJvdG90eXBlLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSAhPT0gdC5zb3VyY2UgJiYgdC5pc1RpbGVDbGlwcGVkKCkgJiYgZSAmJiBlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdC5zb3VyY2U7XG4gICAgICAgIHZhciBpID0gdGhpcy5jb250ZXh0LFxuICAgICAgICAgICAgbyA9IGkuZ2w7XG4gICAgICAgIHRoaXMubmV4dFN0ZW5jaWxJRCArIGUubGVuZ3RoID4gMjU2ICYmIHRoaXMuY2xlYXJTdGVuY2lsKCksIGkuc2V0Q29sb3JNb2RlKFN0LmRpc2FibGVkKSwgaS5zZXREZXB0aE1vZGUoSXQuZGlzYWJsZWQpO1xuICAgICAgICB2YXIgciA9IHRoaXMudXNlUHJvZ3JhbShcImNsaXBwaW5nTWFza1wiKTtcbiAgICAgICAgdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEcyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gZTsgYSA8IG4ubGVuZ3RoOyBhICs9IDEpIHtcbiAgICAgICAgICB2YXIgcyA9IG5bYV0sXG4gICAgICAgICAgICAgIGwgPSB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW3Mua2V5XSA9IHRoaXMubmV4dFN0ZW5jaWxJRCsrO1xuICAgICAgICAgIHIuZHJhdyhpLCBvLlRSSUFOR0xFUywgSXQuZGlzYWJsZWQsIG5ldyBQdCh7XG4gICAgICAgICAgICBmdW5jOiBvLkFMV0FZUyxcbiAgICAgICAgICAgIG1hc2s6IDBcbiAgICAgICAgICB9LCBsLCAyNTUsIG8uS0VFUCwgby5LRUVQLCBvLlJFUExBQ0UpLCBTdC5kaXNhYmxlZCwgQ3QuZGlzYWJsZWQsIExpKHMucG9zTWF0cml4KSwgXCIkY2xpcHBpbmdcIiwgdGhpcy50aWxlRXh0ZW50QnVmZmVyLCB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCB0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB5by5wcm90b3R5cGUuc3RlbmNpbE1vZGVGb3IzRCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSB2b2lkIDAsIHRoaXMubmV4dFN0ZW5jaWxJRCArIDEgPiAyNTYgJiYgdGhpcy5jbGVhclN0ZW5jaWwoKTtcbiAgICAgIHZhciB0ID0gdGhpcy5uZXh0U3RlbmNpbElEKyssXG4gICAgICAgICAgZSA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgIHJldHVybiBuZXcgUHQoe1xuICAgICAgICBmdW5jOiBlLk5PVEVRVUFMLFxuICAgICAgICBtYXNrOiAyNTVcbiAgICAgIH0sIHQsIDI1NSwgZS5LRUVQLCBlLktFRVAsIGUuUkVQTEFDRSk7XG4gICAgfSwgeW8ucHJvdG90eXBlLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICByZXR1cm4gbmV3IFB0KHtcbiAgICAgICAgZnVuYzogZS5FUVVBTCxcbiAgICAgICAgbWFzazogMjU1XG4gICAgICB9LCB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW3Qua2V5XSwgMCwgZS5LRUVQLCBlLktFRVAsIGUuUkVQTEFDRSk7XG4gICAgfSwgeW8ucHJvdG90eXBlLnN0ZW5jaWxDb25maWdGb3JPdmVybGFwID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlLFxuICAgICAgICAgIGkgPSB0aGlzLmNvbnRleHQuZ2wsXG4gICAgICAgICAgbyA9IHQuc29ydChmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gZS5vdmVyc2NhbGVkWiAtIHQub3ZlcnNjYWxlZFo7XG4gICAgICB9KSxcbiAgICAgICAgICByID0gb1tvLmxlbmd0aCAtIDFdLm92ZXJzY2FsZWRaLFxuICAgICAgICAgIGEgPSBvWzBdLm92ZXJzY2FsZWRaIC0gciArIDE7XG5cbiAgICAgIGlmIChhID4gMSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdm9pZCAwLCB0aGlzLm5leHRTdGVuY2lsSUQgKyBhID4gMjU2ICYmIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9IHt9LCBzID0gMDsgcyA8IGE7IHMrKykge1xuICAgICAgICAgIG5bcyArIHJdID0gbmV3IFB0KHtcbiAgICAgICAgICAgIGZ1bmM6IGkuR0VRVUFMLFxuICAgICAgICAgICAgbWFzazogMjU1XG4gICAgICAgICAgfSwgcyArIHRoaXMubmV4dFN0ZW5jaWxJRCwgMjU1LCBpLktFRVAsIGkuS0VFUCwgaS5SRVBMQUNFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm5leHRTdGVuY2lsSUQgKz0gYSwgW24sIG9dO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWyhlID0ge30sIGVbcl0gPSBQdC5kaXNhYmxlZCwgZSksIG9dO1xuICAgIH0sIHlvLnByb3RvdHlwZS5jb2xvck1vZGVGb3JSZW5kZXJQYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICByZXR1cm4gdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gbmV3IFN0KFtlLkNPTlNUQU5UX0NPTE9SLCBlLk9ORV0sIG5ldyB0LkNvbG9yKDEgLyA4LCAxIC8gOCwgMSAvIDgsIDApLCBbITAsICEwLCAhMCwgITBdKSA6IFwib3BhcXVlXCIgPT09IHRoaXMucmVuZGVyUGFzcyA/IFN0LnVuYmxlbmRlZCA6IFN0LmFscGhhQmxlbmRlZDtcbiAgICB9LCB5by5wcm90b3R5cGUuZGVwdGhNb2RlRm9yU3VibGF5ZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgaWYgKCF0aGlzLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgcmV0dXJuIEl0LmRpc2FibGVkO1xuICAgICAgdmFyIG8gPSAxIC0gKCgxICsgdGhpcy5jdXJyZW50TGF5ZXIpICogdGhpcy5udW1TdWJsYXllcnMgKyB0KSAqIHRoaXMuZGVwdGhFcHNpbG9uO1xuICAgICAgcmV0dXJuIG5ldyBJdChpIHx8IHRoaXMuY29udGV4dC5nbC5MRVFVQUwsIGUsIFtvLCBvXSk7XG4gICAgfSwgeW8ucHJvdG90eXBlLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5ZXIgPCB0aGlzLm9wYXF1ZVBhc3NDdXRvZmY7XG4gICAgfSwgeW8ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IHRoaXM7XG4gICAgICB0aGlzLnN0eWxlID0gZSwgdGhpcy5vcHRpb25zID0gaSwgdGhpcy5saW5lQXRsYXMgPSBlLmxpbmVBdGxhcywgdGhpcy5pbWFnZU1hbmFnZXIgPSBlLmltYWdlTWFuYWdlciwgdGhpcy5nbHlwaE1hbmFnZXIgPSBlLmdseXBoTWFuYWdlciwgdGhpcy5zeW1ib2xGYWRlQ2hhbmdlID0gZS5wbGFjZW1lbnQuc3ltYm9sRmFkZUNoYW5nZSh0LmJyb3dzZXIubm93KCkpLCB0aGlzLmltYWdlTWFuYWdlci5iZWdpbkZyYW1lKCk7XG4gICAgICB2YXIgciA9IHRoaXMuc3R5bGUuX29yZGVyLFxuICAgICAgICAgIGEgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztcblxuICAgICAgZm9yICh2YXIgbiBpbiBhKSB7XG4gICAgICAgIHZhciBzID0gYVtuXTtcbiAgICAgICAgcy51c2VkICYmIHMucHJlcGFyZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbCxcbiAgICAgICAgICBjLFxuICAgICAgICAgIHUgPSB7fSxcbiAgICAgICAgICBoID0ge30sXG4gICAgICAgICAgcCA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBkIGluIGEpIHtcbiAgICAgICAgdmFyIF8gPSBhW2RdO1xuICAgICAgICB1W2RdID0gXy5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSwgaFtkXSA9IHVbZF0uc2xpY2UoKS5yZXZlcnNlKCksIHBbZF0gPSBfLmdldFZpc2libGVDb29yZGluYXRlcyghMCkucmV2ZXJzZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSAxIC8gMDtcblxuICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCByLmxlbmd0aDsgZisrKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlLl9sYXllcnNbcltmXV0uaXMzRCgpKSB7XG4gICAgICAgICAgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmID0gZjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlbmRlclBhc3MgPSBcIm9mZnNjcmVlblwiO1xuXG4gICAgICBmb3IgKHZhciBtID0gMCwgZyA9IHI7IG0gPCBnLmxlbmd0aDsgbSArPSAxKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2dbbV1dO1xuXG4gICAgICAgIGlmICh2Lmhhc09mZnNjcmVlblBhc3MoKSAmJiAhdi5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkge1xuICAgICAgICAgIHZhciB5ID0gaFt2LnNvdXJjZV07XG4gICAgICAgICAgKFwiY3VzdG9tXCIgPT09IHYudHlwZSB8fCB5Lmxlbmd0aCkgJiYgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBhW3Yuc291cmNlXSwgdiwgeSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKSwgdGhpcy5jb250ZXh0LmNsZWFyKHtcbiAgICAgICAgY29sb3I6IGkuc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gdC5Db2xvci5ibGFjayA6IHQuQ29sb3IudHJhbnNwYXJlbnQsXG4gICAgICAgIGRlcHRoOiAxXG4gICAgICB9KSwgdGhpcy5jbGVhclN0ZW5jaWwoKSwgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gaS5zaG93T3ZlcmRyYXdJbnNwZWN0b3IsIHRoaXMuZGVwdGhSYW5nZUZvcjNEID0gWzAsIDEgLSAoZS5fb3JkZXIubGVuZ3RoICsgMikgKiB0aGlzLm51bVN1YmxheWVycyAqIHRoaXMuZGVwdGhFcHNpbG9uXSwgdGhpcy5yZW5kZXJQYXNzID0gXCJvcGFxdWVcIiwgdGhpcy5jdXJyZW50TGF5ZXIgPSByLmxlbmd0aCAtIDE7IHRoaXMuY3VycmVudExheWVyID49IDA7IHRoaXMuY3VycmVudExheWVyLS0pIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLnN0eWxlLl9sYXllcnNbclt0aGlzLmN1cnJlbnRMYXllcl1dLFxuICAgICAgICAgICAgYiA9IGFbeC5zb3VyY2VdLFxuICAgICAgICAgICAgdyA9IHVbeC5zb3VyY2VdO1xuICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyh4LCB3KSwgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBiLCB4LCB3KTtcbiAgICAgIH1cblxuICAgICAgZm9yICh0aGlzLnJlbmRlclBhc3MgPSBcInRyYW5zbHVjZW50XCIsIHRoaXMuY3VycmVudExheWVyID0gMDsgdGhpcy5jdXJyZW50TGF5ZXIgPCByLmxlbmd0aDsgdGhpcy5jdXJyZW50TGF5ZXIrKykge1xuICAgICAgICB2YXIgVCA9IHRoaXMuc3R5bGUuX2xheWVyc1tyW3RoaXMuY3VycmVudExheWVyXV0sXG4gICAgICAgICAgICBFID0gYVtULnNvdXJjZV0sXG4gICAgICAgICAgICBJID0gKFwic3ltYm9sXCIgPT09IFQudHlwZSA/IHAgOiBoKVtULnNvdXJjZV07XG4gICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKFQsIHVbVC5zb3VyY2VdKSwgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBFLCBULCBJKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRpb25zLnNob3dUaWxlQm91bmRhcmllcyAmJiAodC52YWx1ZXModGhpcy5zdHlsZS5fbGF5ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQuc291cmNlICYmICF0LmlzSGlkZGVuKG8udHJhbnNmb3JtLnpvb20pICYmICh0LnNvdXJjZSAhPT0gKGMgJiYgYy5pZCkgJiYgKGMgPSBvLnN0eWxlLnNvdXJjZUNhY2hlc1t0LnNvdXJjZV0pLCAoIWwgfHwgbC5nZXRTb3VyY2UoKS5tYXh6b29tIDwgYy5nZXRTb3VyY2UoKS5tYXh6b29tKSAmJiAobCA9IGMpKTtcbiAgICAgIH0pLCBsICYmIHZvLmRlYnVnKHRoaXMsIGwsIGwuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpKSwgdGhpcy5vcHRpb25zLnNob3dQYWRkaW5nICYmIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gdC50cmFuc2Zvcm0ucGFkZGluZztcbiAgICAgICAgX28odCwgdC50cmFuc2Zvcm0uaGVpZ2h0IC0gKGUudG9wIHx8IDApLCAzLCBsbyksIF9vKHQsIGUuYm90dG9tIHx8IDAsIDMsIGNvKSwgZm8odCwgZS5sZWZ0IHx8IDAsIDMsIHVvKSwgZm8odCwgdC50cmFuc2Zvcm0ud2lkdGggLSAoZS5yaWdodCB8fCAwKSwgMywgaG8pO1xuICAgICAgICB2YXIgaSA9IHQudHJhbnNmb3JtLmNlbnRlclBvaW50O1xuICAgICAgICAhZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgICBtbyh0LCBlIC0gMSwgaSAtIDEwLCAyLCAyMCwgbyksIG1vKHQsIGUgLSAxMCwgaSAtIDEsIDIwLCAyLCBvKTtcbiAgICAgICAgfSh0LCBpLngsIHQudHJhbnNmb3JtLmhlaWdodCAtIGkueSwgcG8pO1xuICAgICAgfSh0aGlzKSwgdGhpcy5jb250ZXh0LnNldERlZmF1bHQoKTtcbiAgICB9LCB5by5wcm90b3R5cGUucmVuZGVyTGF5ZXIgPSBmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgaS5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSB8fCAoXCJiYWNrZ3JvdW5kXCIgPT09IGkudHlwZSB8fCBcImN1c3RvbVwiID09PSBpLnR5cGUgfHwgby5sZW5ndGgpICYmICh0aGlzLmlkID0gaS5pZCwgdGhpcy5ncHVUaW1pbmdTdGFydChpKSwgdm9baS50eXBlXSh0LCBlLCBpLCBvLCB0aGlzLnN0eWxlLnBsYWNlbWVudC52YXJpYWJsZU9mZnNldHMpLCB0aGlzLmdwdVRpbWluZ0VuZCgpKTtcbiAgICB9LCB5by5wcm90b3R5cGUuZ3B1VGltaW5nU3RhcnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLmNvbnRleHQuZXh0VGltZXJRdWVyeSxcbiAgICAgICAgICAgIGkgPSB0aGlzLmdwdVRpbWVyc1t0LmlkXTtcbiAgICAgICAgaSB8fCAoaSA9IHRoaXMuZ3B1VGltZXJzW3QuaWRdID0ge1xuICAgICAgICAgIGNhbGxzOiAwLFxuICAgICAgICAgIGNwdVRpbWU6IDAsXG4gICAgICAgICAgcXVlcnk6IGUuY3JlYXRlUXVlcnlFWFQoKVxuICAgICAgICB9KSwgaS5jYWxscysrLCBlLmJlZ2luUXVlcnlFWFQoZS5USU1FX0VMQVBTRURfRVhULCBpLnF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9LCB5by5wcm90b3R5cGUuZ3B1VGltaW5nRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmNvbnRleHQuZXh0VGltZXJRdWVyeTtcbiAgICAgICAgdC5lbmRRdWVyeUVYVCh0LlRJTUVfRUxBUFNFRF9FWFQpO1xuICAgICAgfVxuICAgIH0sIHlvLnByb3RvdHlwZS5jb2xsZWN0R3B1VGltZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLmdwdVRpbWVycztcbiAgICAgIHJldHVybiB0aGlzLmdwdVRpbWVycyA9IHt9LCB0O1xuICAgIH0sIHlvLnByb3RvdHlwZS5xdWVyeUdwdVRpbWVycyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBpIGluIHQpIHtcbiAgICAgICAgdmFyIG8gPSB0W2ldLFxuICAgICAgICAgICAgciA9IHRoaXMuY29udGV4dC5leHRUaW1lclF1ZXJ5LFxuICAgICAgICAgICAgYSA9IHIuZ2V0UXVlcnlPYmplY3RFWFQoby5xdWVyeSwgci5RVUVSWV9SRVNVTFRfRVhUKSAvIDFlNjtcbiAgICAgICAgci5kZWxldGVRdWVyeUVYVChvLnF1ZXJ5KSwgZVtpXSA9IGE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlO1xuICAgIH0sIHlvLnByb3RvdHlwZS50cmFuc2xhdGVQb3NNYXRyaXggPSBmdW5jdGlvbiAoZSwgaSwgbywgciwgYSkge1xuICAgICAgaWYgKCFvWzBdICYmICFvWzFdKSByZXR1cm4gZTtcbiAgICAgIHZhciBuID0gYSA/IFwibWFwXCIgPT09IHIgPyB0aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDAgOiBcInZpZXdwb3J0XCIgPT09IHIgPyAtdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAwO1xuXG4gICAgICBpZiAobikge1xuICAgICAgICB2YXIgcyA9IE1hdGguc2luKG4pLFxuICAgICAgICAgICAgbCA9IE1hdGguY29zKG4pO1xuICAgICAgICBvID0gW29bMF0gKiBsIC0gb1sxXSAqIHMsIG9bMF0gKiBzICsgb1sxXSAqIGxdO1xuICAgICAgfVxuXG4gICAgICB2YXIgYyA9IFthID8gb1swXSA6IHBlKGksIG9bMF0sIHRoaXMudHJhbnNmb3JtLnpvb20pLCBhID8gb1sxXSA6IHBlKGksIG9bMV0sIHRoaXMudHJhbnNmb3JtLnpvb20pLCAwXSxcbiAgICAgICAgICB1ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICByZXR1cm4gdC50cmFuc2xhdGUodSwgZSwgYyksIHU7XG4gICAgfSwgeW8ucHJvdG90eXBlLnNhdmVUaWxlVGV4dHVyZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX3RpbGVUZXh0dXJlc1t0LnNpemVbMF1dO1xuICAgICAgZSA/IGUucHVzaCh0KSA6IHRoaXMuX3RpbGVUZXh0dXJlc1t0LnNpemVbMF1dID0gW3RdO1xuICAgIH0sIHlvLnByb3RvdHlwZS5nZXRUaWxlVGV4dHVyZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX3RpbGVUZXh0dXJlc1t0XTtcbiAgICAgIHJldHVybiBlICYmIGUubGVuZ3RoID4gMCA/IGUucG9wKCkgOiBudWxsO1xuICAgIH0sIHlvLnByb3RvdHlwZS5pc1BhdHRlcm5NaXNzaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgaWYgKCF0LmZyb20gfHwgIXQudG8pIHJldHVybiAhMDtcbiAgICAgIHZhciBlID0gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybih0LmZyb20udG9TdHJpbmcoKSksXG4gICAgICAgICAgaSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4odC50by50b1N0cmluZygpKTtcbiAgICAgIHJldHVybiAhZSB8fCAhaTtcbiAgICB9LCB5by5wcm90b3R5cGUudXNlUHJvZ3JhbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICAgIHZhciBpID0gXCJcIiArIHQgKyAoZSA/IGUuY2FjaGVLZXkgOiBcIlwiKSArICh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPyBcIi9vdmVyZHJhd1wiIDogXCJcIik7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVtpXSB8fCAodGhpcy5jYWNoZVtpXSA9IG5ldyBiaSh0aGlzLmNvbnRleHQsIHQsIHZpW3RdLCBlLCBLaVt0XSwgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yKSksIHRoaXMuY2FjaGVbaV07XG4gICAgfSwgeW8ucHJvdG90eXBlLnNldEN1c3RvbUxheWVyRGVmYXVsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCksIHRoaXMuY29udGV4dC5jdWxsRmFjZS5zZXREZWZhdWx0KCksIHRoaXMuY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldERlZmF1bHQoKSwgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2suc2V0RGVmYXVsdCgpLCB0aGlzLmNvbnRleHQucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0RGVmYXVsdCgpLCB0aGlzLmNvbnRleHQucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldERlZmF1bHQoKTtcbiAgICB9LCB5by5wcm90b3R5cGUuc2V0QmFzZVN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0KCExKSwgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKSwgdGhpcy5jb250ZXh0LmJsZW5kRXF1YXRpb24uc2V0KHQuRlVOQ19BREQpO1xuICAgIH0sIHlvLnByb3RvdHlwZS5pbml0RGVidWdPdmVybGF5Q2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgbnVsbCA9PSB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcyAmJiAodGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgPSB0LndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLCB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcy53aWR0aCA9IDUxMiwgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMuaGVpZ2h0ID0gNTEyLCB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUgPSBuZXcgdC5UZXh0dXJlKHRoaXMuY29udGV4dCwgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMsIHRoaXMuY29udGV4dC5nbC5SR0JBKSk7XG4gICAgfSwgeW8ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVtcHR5VGV4dHVyZS5kZXN0cm95KCksIHRoaXMuZGVidWdPdmVybGF5VGV4dHVyZSAmJiB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUuZGVzdHJveSgpO1xuICAgIH07XG5cbiAgICB2YXIgeG8gPSBmdW5jdGlvbiB4byh0LCBlKSB7XG4gICAgICB0aGlzLnBvaW50cyA9IHQsIHRoaXMucGxhbmVzID0gZTtcbiAgICB9O1xuXG4gICAgeG8uZnJvbUludlByb2plY3Rpb25NYXRyaXggPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBNYXRoLnBvdygyLCBvKSxcbiAgICAgICAgICBhID0gW1stMSwgMSwgLTEsIDFdLCBbMSwgMSwgLTEsIDFdLCBbMSwgLTEsIC0xLCAxXSwgWy0xLCAtMSwgLTEsIDFdLCBbLTEsIDEsIDEsIDFdLCBbMSwgMSwgMSwgMV0sIFsxLCAtMSwgMSwgMV0sIFstMSwgLTEsIDEsIDFdXS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgcmV0dXJuIHQudHJhbnNmb3JtTWF0NChbXSwgaSwgZSk7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHQuc2NhbGUkMShbXSwgZSwgMSAvIGVbM10gLyBpICogcik7XG4gICAgICB9KSxcbiAgICAgICAgICBuID0gW1swLCAxLCAyXSwgWzYsIDUsIDRdLCBbMCwgMywgN10sIFsyLCAxLCA1XSwgWzMsIDIsIDZdLCBbMCwgNCwgNV1dLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHQuc3ViKFtdLCBhW2VbMF1dLCBhW2VbMV1dKSxcbiAgICAgICAgICAgIG8gPSB0LnN1YihbXSwgYVtlWzJdXSwgYVtlWzFdXSksXG4gICAgICAgICAgICByID0gdC5ub3JtYWxpemUoW10sIHQuY3Jvc3MoW10sIGksIG8pKSxcbiAgICAgICAgICAgIG4gPSAtdC5kb3QociwgYVtlWzFdXSk7XG4gICAgICAgIHJldHVybiByLmNvbmNhdChuKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyB4byhhLCBuKTtcbiAgICB9O1xuXG4gICAgdmFyIGJvID0gZnVuY3Rpb24gYm8oZSwgaSkge1xuICAgICAgdGhpcy5taW4gPSBlLCB0aGlzLm1heCA9IGksIHRoaXMuY2VudGVyID0gdC5zY2FsZSQyKFtdLCB0LmFkZChbXSwgdGhpcy5taW4sIHRoaXMubWF4KSwgLjUpO1xuICAgIH07XG5cbiAgICBiby5wcm90b3R5cGUucXVhZHJhbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IFtlICUgMiA9PSAwLCBlIDwgMl0sIG8gPSB0LmNsb25lJDIodGhpcy5taW4pLCByID0gdC5jbG9uZSQyKHRoaXMubWF4KSwgYSA9IDA7IGEgPCBpLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIG9bYV0gPSBpW2FdID8gdGhpcy5taW5bYV0gOiB0aGlzLmNlbnRlclthXSwgclthXSA9IGlbYV0gPyB0aGlzLmNlbnRlclthXSA6IHRoaXMubWF4W2FdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gclsyXSA9IHRoaXMubWF4WzJdLCBuZXcgYm8obywgcik7XG4gICAgfSwgYm8ucHJvdG90eXBlLmRpc3RhbmNlWCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5tYXhbMF0sIHRbMF0pLCB0aGlzLm1pblswXSkgLSB0WzBdO1xuICAgIH0sIGJvLnByb3RvdHlwZS5kaXN0YW5jZVkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzFdLCB0WzFdKSwgdGhpcy5taW5bMV0pIC0gdFsxXTtcbiAgICB9LCBiby5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmb3IgKHZhciBpID0gW1t0aGlzLm1pblswXSwgdGhpcy5taW5bMV0sIDAsIDFdLCBbdGhpcy5tYXhbMF0sIHRoaXMubWluWzFdLCAwLCAxXSwgW3RoaXMubWF4WzBdLCB0aGlzLm1heFsxXSwgMCwgMV0sIFt0aGlzLm1pblswXSwgdGhpcy5tYXhbMV0sIDAsIDFdXSwgbyA9ICEwLCByID0gMDsgciA8IGUucGxhbmVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIGEgPSBlLnBsYW5lc1tyXSwgbiA9IDAsIHMgPSAwOyBzIDwgaS5sZW5ndGg7IHMrKykge1xuICAgICAgICAgIG4gKz0gdC5kb3QkMShhLCBpW3NdKSA+PSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKDAgPT09IG4pIHJldHVybiAwO1xuICAgICAgICBuICE9PSBpLmxlbmd0aCAmJiAobyA9ICExKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG8pIHJldHVybiAyO1xuXG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IDM7IGwrKykge1xuICAgICAgICBmb3IgKHZhciBjID0gTnVtYmVyLk1BWF9WQUxVRSwgdSA9IC1OdW1iZXIuTUFYX1ZBTFVFLCBoID0gMDsgaCA8IGUucG9pbnRzLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgdmFyIHAgPSBlLnBvaW50c1toXVtsXSAtIHRoaXMubWluW2xdO1xuICAgICAgICAgIGMgPSBNYXRoLm1pbihjLCBwKSwgdSA9IE1hdGgubWF4KHUsIHApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHUgPCAwIHx8IGMgPiB0aGlzLm1heFtsXSAtIHRoaXMubWluW2xdKSByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDE7XG4gICAgfTtcblxuICAgIHZhciB3byA9IGZ1bmN0aW9uIHdvKHQsIGUsIGksIG8pIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHQgJiYgKHQgPSAwKSwgdm9pZCAwID09PSBlICYmIChlID0gMCksIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDApLCB2b2lkIDAgPT09IG8gJiYgKG8gPSAwKSwgaXNOYU4odCkgfHwgdCA8IDAgfHwgaXNOYU4oZSkgfHwgZSA8IDAgfHwgaXNOYU4oaSkgfHwgaSA8IDAgfHwgaXNOYU4obykgfHwgbyA8IDApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIGVkZ2UtaW5zZXRzLCB0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHQgbXVzdCBhbGwgYmUgbnVtYmVyc1wiKTtcbiAgICAgIHRoaXMudG9wID0gdCwgdGhpcy5ib3R0b20gPSBlLCB0aGlzLmxlZnQgPSBpLCB0aGlzLnJpZ2h0ID0gbztcbiAgICB9O1xuXG4gICAgd28ucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIHJldHVybiBudWxsICE9IGkudG9wICYmIG51bGwgIT0gZS50b3AgJiYgKHRoaXMudG9wID0gdC5udW1iZXIoZS50b3AsIGkudG9wLCBvKSksIG51bGwgIT0gaS5ib3R0b20gJiYgbnVsbCAhPSBlLmJvdHRvbSAmJiAodGhpcy5ib3R0b20gPSB0Lm51bWJlcihlLmJvdHRvbSwgaS5ib3R0b20sIG8pKSwgbnVsbCAhPSBpLmxlZnQgJiYgbnVsbCAhPSBlLmxlZnQgJiYgKHRoaXMubGVmdCA9IHQubnVtYmVyKGUubGVmdCwgaS5sZWZ0LCBvKSksIG51bGwgIT0gaS5yaWdodCAmJiBudWxsICE9IGUucmlnaHQgJiYgKHRoaXMucmlnaHQgPSB0Lm51bWJlcihlLnJpZ2h0LCBpLnJpZ2h0LCBvKSksIHRoaXM7XG4gICAgfSwgd28ucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICB2YXIgbyA9IHQuY2xhbXAoKHRoaXMubGVmdCArIGUgLSB0aGlzLnJpZ2h0KSAvIDIsIDAsIGUpLFxuICAgICAgICAgIHIgPSB0LmNsYW1wKCh0aGlzLnRvcCArIGkgLSB0aGlzLmJvdHRvbSkgLyAyLCAwLCBpKTtcbiAgICAgIHJldHVybiBuZXcgdC5Qb2ludChvLCByKTtcbiAgICB9LCB3by5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvcCA9PT0gdC50b3AgJiYgdGhpcy5ib3R0b20gPT09IHQuYm90dG9tICYmIHRoaXMubGVmdCA9PT0gdC5sZWZ0ICYmIHRoaXMucmlnaHQgPT09IHQucmlnaHQ7XG4gICAgfSwgd28ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyB3byh0aGlzLnRvcCwgdGhpcy5ib3R0b20sIHRoaXMubGVmdCwgdGhpcy5yaWdodCk7XG4gICAgfSwgd28ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogdGhpcy50b3AsXG4gICAgICAgIGJvdHRvbTogdGhpcy5ib3R0b20sXG4gICAgICAgIGxlZnQ6IHRoaXMubGVmdCxcbiAgICAgICAgcmlnaHQ6IHRoaXMucmlnaHRcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBUbyA9IGZ1bmN0aW9uIFRvKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIHRoaXMudGlsZVNpemUgPSA1MTIsIHRoaXMubWF4VmFsaWRMYXRpdHVkZSA9IDg1LjA1MTEyOSwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMgPSB2b2lkIDAgPT09IGEgfHwgYSwgdGhpcy5fbWluWm9vbSA9IGUgfHwgMCwgdGhpcy5fbWF4Wm9vbSA9IGkgfHwgMjIsIHRoaXMuX21pblBpdGNoID0gbnVsbCA9PSBvID8gMCA6IG8sIHRoaXMuX21heFBpdGNoID0gbnVsbCA9PSByID8gNjAgOiByLCB0aGlzLnNldE1heEJvdW5kcygpLCB0aGlzLndpZHRoID0gMCwgdGhpcy5oZWlnaHQgPSAwLCB0aGlzLl9jZW50ZXIgPSBuZXcgdC5MbmdMYXQoMCwgMCksIHRoaXMuem9vbSA9IDAsIHRoaXMuYW5nbGUgPSAwLCB0aGlzLl9mb3YgPSAuNjQzNTAxMTA4NzkzMjg0NCwgdGhpcy5fcGl0Y2ggPSAwLCB0aGlzLl91bm1vZGlmaWVkID0gITAsIHRoaXMuX2VkZ2VJbnNldHMgPSBuZXcgd28oKSwgdGhpcy5fcG9zTWF0cml4Q2FjaGUgPSB7fSwgdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlID0ge307XG4gICAgfSxcbiAgICAgICAgRW8gPSB7XG4gICAgICBtaW5ab29tOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBtYXhab29tOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBtaW5QaXRjaDoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgbWF4UGl0Y2g6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIHJlbmRlcldvcmxkQ29waWVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICB3b3JsZFNpemU6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIGNlbnRlck9mZnNldDoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgYmVhcmluZzoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgcGl0Y2g6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSxcbiAgICAgIGZvdjoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgem9vbToge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgY2VudGVyOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBwYWRkaW5nOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgIH0sXG4gICAgICBjZW50ZXJQb2ludDoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgdW5tb2RpZmllZDoge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9LFxuICAgICAgcG9pbnQ6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfVxuICAgIH07XG5cbiAgICBUby5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IG5ldyBUbyh0aGlzLl9taW5ab29tLCB0aGlzLl9tYXhab29tLCB0aGlzLl9taW5QaXRjaCwgdGhpcy5tYXhQaXRjaCwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpO1xuICAgICAgcmV0dXJuIHQudGlsZVNpemUgPSB0aGlzLnRpbGVTaXplLCB0LmxhdFJhbmdlID0gdGhpcy5sYXRSYW5nZSwgdC53aWR0aCA9IHRoaXMud2lkdGgsIHQuaGVpZ2h0ID0gdGhpcy5oZWlnaHQsIHQuX2NlbnRlciA9IHRoaXMuX2NlbnRlciwgdC56b29tID0gdGhpcy56b29tLCB0LmFuZ2xlID0gdGhpcy5hbmdsZSwgdC5fZm92ID0gdGhpcy5fZm92LCB0Ll9waXRjaCA9IHRoaXMuX3BpdGNoLCB0Ll91bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZCwgdC5fZWRnZUluc2V0cyA9IHRoaXMuX2VkZ2VJbnNldHMuY2xvbmUoKSwgdC5fY2FsY01hdHJpY2VzKCksIHQ7XG4gICAgfSwgRW8ubWluWm9vbS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWluWm9vbTtcbiAgICB9LCBFby5taW5ab29tLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9taW5ab29tICE9PSB0ICYmICh0aGlzLl9taW5ab29tID0gdCwgdGhpcy56b29tID0gTWF0aC5tYXgodGhpcy56b29tLCB0KSk7XG4gICAgfSwgRW8ubWF4Wm9vbS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWF4Wm9vbTtcbiAgICB9LCBFby5tYXhab29tLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXhab29tICE9PSB0ICYmICh0aGlzLl9tYXhab29tID0gdCwgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy56b29tLCB0KSk7XG4gICAgfSwgRW8ubWluUGl0Y2guZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21pblBpdGNoO1xuICAgIH0sIEVvLm1pblBpdGNoLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9taW5QaXRjaCAhPT0gdCAmJiAodGhpcy5fbWluUGl0Y2ggPSB0LCB0aGlzLnBpdGNoID0gTWF0aC5tYXgodGhpcy5waXRjaCwgdCkpO1xuICAgIH0sIEVvLm1heFBpdGNoLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXhQaXRjaDtcbiAgICB9LCBFby5tYXhQaXRjaC5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWF4UGl0Y2ggIT09IHQgJiYgKHRoaXMuX21heFBpdGNoID0gdCwgdGhpcy5waXRjaCA9IE1hdGgubWluKHRoaXMucGl0Y2gsIHQpKTtcbiAgICB9LCBFby5yZW5kZXJXb3JsZENvcGllcy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgfSwgRW8ucmVuZGVyV29ybGRDb3BpZXMuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZvaWQgMCA9PT0gdCA/IHQgPSAhMCA6IG51bGwgPT09IHQgJiYgKHQgPSAhMSksIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gdDtcbiAgICB9LCBFby53b3JsZFNpemUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGlsZVNpemUgKiB0aGlzLnNjYWxlO1xuICAgIH0sIEVvLmNlbnRlck9mZnNldC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZW50ZXJQb2ludC5fc3ViKHRoaXMuc2l6ZS5fZGl2KDIpKTtcbiAgICB9LCBFby5zaXplLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgdC5Qb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfSwgRW8uYmVhcmluZy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLXRoaXMuYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuICAgIH0sIEVvLmJlYXJpbmcuc2V0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpID0gLXQud3JhcChlLCAtMTgwLCAxODApICogTWF0aC5QSSAvIDE4MDtcbiAgICAgIHRoaXMuYW5nbGUgIT09IGkgJiYgKHRoaXMuX3VubW9kaWZpZWQgPSAhMSwgdGhpcy5hbmdsZSA9IGksIHRoaXMuX2NhbGNNYXRyaWNlcygpLCB0aGlzLnJvdGF0aW9uTWF0cml4ID0gdC5jcmVhdGUkMigpLCB0LnJvdGF0ZSh0aGlzLnJvdGF0aW9uTWF0cml4LCB0aGlzLnJvdGF0aW9uTWF0cml4LCB0aGlzLmFuZ2xlKSk7XG4gICAgfSwgRW8ucGl0Y2guZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BpdGNoIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LCBFby5waXRjaC5zZXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSB0LmNsYW1wKGUsIHRoaXMubWluUGl0Y2gsIHRoaXMubWF4UGl0Y2gpIC8gMTgwICogTWF0aC5QSTtcbiAgICAgIHRoaXMuX3BpdGNoICE9PSBpICYmICh0aGlzLl91bm1vZGlmaWVkID0gITEsIHRoaXMuX3BpdGNoID0gaSwgdGhpcy5fY2FsY01hdHJpY2VzKCkpO1xuICAgIH0sIEVvLmZvdi5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm92IC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9LCBFby5mb3Yuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQgPSBNYXRoLm1heCguMDEsIE1hdGgubWluKDYwLCB0KSksIHRoaXMuX2ZvdiAhPT0gdCAmJiAodGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl9mb3YgPSB0IC8gMTgwICogTWF0aC5QSSwgdGhpcy5fY2FsY01hdHJpY2VzKCkpO1xuICAgIH0sIEVvLnpvb20uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3pvb207XG4gICAgfSwgRW8uem9vbS5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBNYXRoLm1pbihNYXRoLm1heCh0LCB0aGlzLm1pblpvb20pLCB0aGlzLm1heFpvb20pO1xuICAgICAgdGhpcy5fem9vbSAhPT0gZSAmJiAodGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl96b29tID0gZSwgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKGUpLCB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcihlKSwgdGhpcy56b29tRnJhY3Rpb24gPSBlIC0gdGhpcy50aWxlWm9vbSwgdGhpcy5fY29uc3RyYWluKCksIHRoaXMuX2NhbGNNYXRyaWNlcygpKTtcbiAgICB9LCBFby5jZW50ZXIuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NlbnRlcjtcbiAgICB9LCBFby5jZW50ZXIuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHQubGF0ID09PSB0aGlzLl9jZW50ZXIubGF0ICYmIHQubG5nID09PSB0aGlzLl9jZW50ZXIubG5nIHx8ICh0aGlzLl91bm1vZGlmaWVkID0gITEsIHRoaXMuX2NlbnRlciA9IHQsIHRoaXMuX2NvbnN0cmFpbigpLCB0aGlzLl9jYWxjTWF0cmljZXMoKSk7XG4gICAgfSwgRW8ucGFkZGluZy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWRnZUluc2V0cy50b0pTT04oKTtcbiAgICB9LCBFby5wYWRkaW5nLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9lZGdlSW5zZXRzLmVxdWFscyh0KSB8fCAodGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl9lZGdlSW5zZXRzLmludGVycG9sYXRlKHRoaXMuX2VkZ2VJbnNldHMsIHQsIDEpLCB0aGlzLl9jYWxjTWF0cmljZXMoKSk7XG4gICAgfSwgRW8uY2VudGVyUG9pbnQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZ2V0Q2VudGVyKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9LCBUby5wcm90b3R5cGUuaXNQYWRkaW5nRXF1YWwgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZXF1YWxzKHQpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVBhZGRpbmcgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5fdW5tb2RpZmllZCA9ICExLCB0aGlzLl9lZGdlSW5zZXRzLmludGVycG9sYXRlKHQsIGUsIGkpLCB0aGlzLl9jb25zdHJhaW4oKSwgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmNvdmVyaW5nWm9vbUxldmVsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gKHQucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKHRoaXMuem9vbSArIHRoaXMuc2NhbGVab29tKHRoaXMudGlsZVNpemUgLyB0LnRpbGVTaXplKSk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IFtuZXcgdC5VbndyYXBwZWRUaWxlSUQoMCwgZSldO1xuICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSBmb3IgKHZhciBvID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IHQuUG9pbnQoMCwgMCkpLCByID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IHQuUG9pbnQodGhpcy53aWR0aCwgMCkpLCBhID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IHQuUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKSwgbiA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyB0LlBvaW50KDAsIHRoaXMuaGVpZ2h0KSksIHMgPSBNYXRoLmZsb29yKE1hdGgubWluKG8ueCwgci54LCBhLngsIG4ueCkpLCBsID0gTWF0aC5mbG9vcihNYXRoLm1heChvLngsIHIueCwgYS54LCBuLngpKSwgYyA9IHMgLSAxOyBjIDw9IGwgKyAxOyBjKyspIHtcbiAgICAgICAgMCAhPT0gYyAmJiBpLnB1c2gobmV3IHQuVW53cmFwcGVkVGlsZUlEKGMsIGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5jb3ZlcmluZ1RpbGVzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5jb3ZlcmluZ1pvb21MZXZlbChlKSxcbiAgICAgICAgICBvID0gaTtcbiAgICAgIGlmICh2b2lkIDAgIT09IGUubWluem9vbSAmJiBpIDwgZS5taW56b29tKSByZXR1cm4gW107XG4gICAgICB2b2lkIDAgIT09IGUubWF4em9vbSAmJiBpID4gZS5tYXh6b29tICYmIChpID0gZS5tYXh6b29tKTtcbiAgICAgIHZhciByID0gdC5NZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh0aGlzLmNlbnRlciksXG4gICAgICAgICAgYSA9IE1hdGgucG93KDIsIGkpLFxuICAgICAgICAgIG4gPSBbYSAqIHIueCwgYSAqIHIueSwgMF0sXG4gICAgICAgICAgcyA9IHhvLmZyb21JbnZQcm9qZWN0aW9uTWF0cml4KHRoaXMuaW52UHJvak1hdHJpeCwgdGhpcy53b3JsZFNpemUsIGkpLFxuICAgICAgICAgIGwgPSBlLm1pbnpvb20gfHwgMDtcbiAgICAgIHRoaXMucGl0Y2ggPD0gNjAgJiYgdGhpcy5fZWRnZUluc2V0cy50b3AgPCAuMSAmJiAobCA9IGkpO1xuXG4gICAgICB2YXIgYyA9IGZ1bmN0aW9uIGModCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFhYmI6IG5ldyBibyhbdCAqIGEsIDAsIDBdLCBbKHQgKyAxKSAqIGEsIGEsIDBdKSxcbiAgICAgICAgICB6b29tOiAwLFxuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB3cmFwOiB0LFxuICAgICAgICAgIGZ1bGx5VmlzaWJsZTogITFcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAgICAgdSA9IFtdLFxuICAgICAgICAgIGggPSBbXSxcbiAgICAgICAgICBwID0gaSxcbiAgICAgICAgICBkID0gZS5yZXBhcnNlT3ZlcnNjYWxlZCA/IG8gOiBpO1xuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpIGZvciAodmFyIF8gPSAxOyBfIDw9IDM7IF8rKykge1xuICAgICAgICB1LnB1c2goYygtXykpLCB1LnB1c2goYyhfKSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodS5wdXNoKGMoMCkpOyB1Lmxlbmd0aCA+IDA7KSB7XG4gICAgICAgIHZhciBmID0gdS5wb3AoKSxcbiAgICAgICAgICAgIG0gPSBmLngsXG4gICAgICAgICAgICBnID0gZi55LFxuICAgICAgICAgICAgdiA9IGYuZnVsbHlWaXNpYmxlO1xuXG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgIHZhciB5ID0gZi5hYWJiLmludGVyc2VjdHMocyk7XG4gICAgICAgICAgaWYgKDAgPT09IHkpIGNvbnRpbnVlO1xuICAgICAgICAgIHYgPSAyID09PSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHggPSBmLmFhYmIuZGlzdGFuY2VYKG4pLFxuICAgICAgICAgICAgYiA9IGYuYWFiYi5kaXN0YW5jZVkobiksXG4gICAgICAgICAgICB3ID0gTWF0aC5tYXgoTWF0aC5hYnMoeCksIE1hdGguYWJzKGIpKTtcbiAgICAgICAgaWYgKGYuem9vbSA9PT0gcCB8fCB3ID4gMyArICgxIDw8IHAgLSBmLnpvb20pIC0gMiAmJiBmLnpvb20gPj0gbCkgaC5wdXNoKHtcbiAgICAgICAgICB0aWxlSUQ6IG5ldyB0Lk92ZXJzY2FsZWRUaWxlSUQoZi56b29tID09PSBwID8gZCA6IGYuem9vbSwgZi53cmFwLCBmLnpvb20sIG0sIGcpLFxuICAgICAgICAgIGRpc3RhbmNlU3E6IHQuc3FyTGVuKFtuWzBdIC0gLjUgLSBtLCBuWzFdIC0gLjUgLSBnXSlcbiAgICAgICAgfSk7ZWxzZSBmb3IgKHZhciBUID0gMDsgVCA8IDQ7IFQrKykge1xuICAgICAgICAgIHZhciBFID0gKG0gPDwgMSkgKyBUICUgMixcbiAgICAgICAgICAgICAgSSA9IChnIDw8IDEpICsgKFQgPj4gMSk7XG4gICAgICAgICAgdS5wdXNoKHtcbiAgICAgICAgICAgIGFhYmI6IGYuYWFiYi5xdWFkcmFudChUKSxcbiAgICAgICAgICAgIHpvb206IGYuem9vbSArIDEsXG4gICAgICAgICAgICB4OiBFLFxuICAgICAgICAgICAgeTogSSxcbiAgICAgICAgICAgIHdyYXA6IGYud3JhcCxcbiAgICAgICAgICAgIGZ1bGx5VmlzaWJsZTogdlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoLnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQuZGlzdGFuY2VTcSAtIGUuZGlzdGFuY2VTcTtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC50aWxlSUQ7XG4gICAgICB9KTtcbiAgICB9LCBUby5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGUsIHRoaXMucGl4ZWxzVG9HTFVuaXRzID0gWzIgLyB0LCAtMiAvIGVdLCB0aGlzLl9jb25zdHJhaW4oKSwgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfSwgRW8udW5tb2RpZmllZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdW5tb2RpZmllZDtcbiAgICB9LCBUby5wcm90b3R5cGUuem9vbVNjYWxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCB0KTtcbiAgICB9LCBUby5wcm90b3R5cGUuc2NhbGVab29tID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLmxvZyh0KSAvIE1hdGguTE4yO1xuICAgIH0sIFRvLnByb3RvdHlwZS5wcm9qZWN0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpID0gdC5jbGFtcChlLmxhdCwgLXRoaXMubWF4VmFsaWRMYXRpdHVkZSwgdGhpcy5tYXhWYWxpZExhdGl0dWRlKTtcbiAgICAgIHJldHVybiBuZXcgdC5Qb2ludCh0Lm1lcmNhdG9yWGZyb21MbmcoZS5sbmcpICogdGhpcy53b3JsZFNpemUsIHQubWVyY2F0b3JZZnJvbUxhdChpKSAqIHRoaXMud29ybGRTaXplKTtcbiAgICB9LCBUby5wcm90b3R5cGUudW5wcm9qZWN0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoZS54IC8gdGhpcy53b3JsZFNpemUsIGUueSAvIHRoaXMud29ybGRTaXplKS50b0xuZ0xhdCgpO1xuICAgIH0sIEVvLnBvaW50LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3QodGhpcy5jZW50ZXIpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5zZXRMb2NhdGlvbkF0UG9pbnQgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgdmFyIG8gPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShpKSxcbiAgICAgICAgICByID0gdGhpcy5wb2ludENvb3JkaW5hdGUodGhpcy5jZW50ZXJQb2ludCksXG4gICAgICAgICAgYSA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKGUpLFxuICAgICAgICAgIG4gPSBuZXcgdC5NZXJjYXRvckNvb3JkaW5hdGUoYS54IC0gKG8ueCAtIHIueCksIGEueSAtIChvLnkgLSByLnkpKTtcbiAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24obiksIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzICYmICh0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyLndyYXAoKSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmxvY2F0aW9uUG9pbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKHQpKTtcbiAgICB9LCBUby5wcm90b3R5cGUucG9pbnRMb2NhdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5wb2ludENvb3JkaW5hdGUodCkpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5sb2NhdGlvbkNvb3JkaW5hdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHQuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQoZSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmNvb3JkaW5hdGVMb2NhdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC50b0xuZ0xhdCgpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5wb2ludENvb3JkaW5hdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGkgPSBbZS54LCBlLnksIDAsIDFdLFxuICAgICAgICAgIG8gPSBbZS54LCBlLnksIDEsIDFdO1xuICAgICAgdC50cmFuc2Zvcm1NYXQ0KGksIGksIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKSwgdC50cmFuc2Zvcm1NYXQ0KG8sIG8sIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcbiAgICAgIHZhciByID0gaVszXSxcbiAgICAgICAgICBhID0gb1szXSxcbiAgICAgICAgICBuID0gaVsxXSAvIHIsXG4gICAgICAgICAgcyA9IG9bMV0gLyBhLFxuICAgICAgICAgIGwgPSBpWzJdIC8gcixcbiAgICAgICAgICBjID0gb1syXSAvIGEsXG4gICAgICAgICAgdSA9IGwgPT09IGMgPyAwIDogKDAgLSBsKSAvIChjIC0gbCk7XG4gICAgICByZXR1cm4gbmV3IHQuTWVyY2F0b3JDb29yZGluYXRlKHQubnVtYmVyKGlbMF0gLyByLCBvWzBdIC8gYSwgdSkgLyB0aGlzLndvcmxkU2l6ZSwgdC5udW1iZXIobiwgcywgdSkgLyB0aGlzLndvcmxkU2l6ZSk7XG4gICAgfSwgVG8ucHJvdG90eXBlLmNvb3JkaW5hdGVQb2ludCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IFtlLnggKiB0aGlzLndvcmxkU2l6ZSwgZS55ICogdGhpcy53b3JsZFNpemUsIDAsIDFdO1xuICAgICAgcmV0dXJuIHQudHJhbnNmb3JtTWF0NChpLCBpLCB0aGlzLnBpeGVsTWF0cml4KSwgbmV3IHQuUG9pbnQoaVswXSAvIGlbM10sIGlbMV0gLyBpWzNdKTtcbiAgICB9LCBUby5wcm90b3R5cGUuZ2V0Qm91bmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyB0LkxuZ0xhdEJvdW5kcygpLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IHQuUG9pbnQoMCwgMCkpKS5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyB0LlBvaW50KHRoaXMud2lkdGgsIDApKSkuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgdC5Qb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkpKS5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyB0LlBvaW50KDAsIHRoaXMuaGVpZ2h0KSkpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5nZXRNYXhCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXRSYW5nZSAmJiAyID09PSB0aGlzLmxhdFJhbmdlLmxlbmd0aCAmJiB0aGlzLmxuZ1JhbmdlICYmIDIgPT09IHRoaXMubG5nUmFuZ2UubGVuZ3RoID8gbmV3IHQuTG5nTGF0Qm91bmRzKFt0aGlzLmxuZ1JhbmdlWzBdLCB0aGlzLmxhdFJhbmdlWzBdXSwgW3RoaXMubG5nUmFuZ2VbMV0sIHRoaXMubGF0UmFuZ2VbMV1dKSA6IG51bGw7XG4gICAgfSwgVG8ucHJvdG90eXBlLnNldE1heEJvdW5kcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0ID8gKHRoaXMubG5nUmFuZ2UgPSBbdC5nZXRXZXN0KCksIHQuZ2V0RWFzdCgpXSwgdGhpcy5sYXRSYW5nZSA9IFt0LmdldFNvdXRoKCksIHQuZ2V0Tm9ydGgoKV0sIHRoaXMuX2NvbnN0cmFpbigpKSA6ICh0aGlzLmxuZ1JhbmdlID0gbnVsbCwgdGhpcy5sYXRSYW5nZSA9IFstdGhpcy5tYXhWYWxpZExhdGl0dWRlLCB0aGlzLm1heFZhbGlkTGF0aXR1ZGVdKTtcbiAgICB9LCBUby5wcm90b3R5cGUuY2FsY3VsYXRlUG9zTWF0cml4ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9ICExKTtcbiAgICAgIHZhciBvID0gZS5rZXksXG4gICAgICAgICAgciA9IGkgPyB0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGUgOiB0aGlzLl9wb3NNYXRyaXhDYWNoZTtcbiAgICAgIGlmIChyW29dKSByZXR1cm4gcltvXTtcbiAgICAgIHZhciBhID0gZS5jYW5vbmljYWwsXG4gICAgICAgICAgbiA9IHRoaXMud29ybGRTaXplIC8gdGhpcy56b29tU2NhbGUoYS56KSxcbiAgICAgICAgICBzID0gYS54ICsgTWF0aC5wb3coMiwgYS56KSAqIGUud3JhcCxcbiAgICAgICAgICBsID0gdC5pZGVudGl0eShuZXcgRmxvYXQ2NEFycmF5KDE2KSk7XG4gICAgICByZXR1cm4gdC50cmFuc2xhdGUobCwgbCwgW3MgKiBuLCBhLnkgKiBuLCAwXSksIHQuc2NhbGUobCwgbCwgW24gLyB0LkVYVEVOVCwgbiAvIHQuRVhURU5ULCAxXSksIHQubXVsdGlwbHkobCwgaSA/IHRoaXMuYWxpZ25lZFByb2pNYXRyaXggOiB0aGlzLnByb2pNYXRyaXgsIGwpLCByW29dID0gbmV3IEZsb2F0MzJBcnJheShsKSwgcltvXTtcbiAgICB9LCBUby5wcm90b3R5cGUuY3VzdG9tTGF5ZXJNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXJjYXRvck1hdHJpeC5zbGljZSgpO1xuICAgIH0sIFRvLnByb3RvdHlwZS5fY29uc3RyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuY2VudGVyICYmIHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQgJiYgIXRoaXMuX2NvbnN0cmFpbmluZykge1xuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSAhMDtcbiAgICAgICAgdmFyIGUsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIHIsXG4gICAgICAgICAgICBhID0gLTkwLFxuICAgICAgICAgICAgbiA9IDkwLFxuICAgICAgICAgICAgcyA9IC0xODAsXG4gICAgICAgICAgICBsID0gMTgwLFxuICAgICAgICAgICAgYyA9IHRoaXMuc2l6ZSxcbiAgICAgICAgICAgIHUgPSB0aGlzLl91bm1vZGlmaWVkO1xuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgdmFyIGggPSB0aGlzLmxhdFJhbmdlO1xuICAgICAgICAgIGEgPSB0Lm1lcmNhdG9yWWZyb21MYXQoaFsxXSkgKiB0aGlzLndvcmxkU2l6ZSwgZSA9IChuID0gdC5tZXJjYXRvcllmcm9tTGF0KGhbMF0pICogdGhpcy53b3JsZFNpemUpIC0gYSA8IGMueSA/IGMueSAvIChuIC0gYSkgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG5nUmFuZ2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHRoaXMubG5nUmFuZ2U7XG4gICAgICAgICAgcyA9IHQubWVyY2F0b3JYZnJvbUxuZyhwWzBdKSAqIHRoaXMud29ybGRTaXplLCBpID0gKGwgPSB0Lm1lcmNhdG9yWGZyb21MbmcocFsxXSkgKiB0aGlzLndvcmxkU2l6ZSkgLSBzIDwgYy54ID8gYy54IC8gKGwgLSBzKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZCA9IHRoaXMucG9pbnQsXG4gICAgICAgICAgICBfID0gTWF0aC5tYXgoaSB8fCAwLCBlIHx8IDApO1xuXG4gICAgICAgIGlmIChfKSByZXR1cm4gdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgdC5Qb2ludChpID8gKGwgKyBzKSAvIDIgOiBkLngsIGUgPyAobiArIGEpIC8gMiA6IGQueSkpLCB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20oXyksIHRoaXMuX3VubW9kaWZpZWQgPSB1LCB2b2lkICh0aGlzLl9jb25zdHJhaW5pbmcgPSAhMSk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF0UmFuZ2UpIHtcbiAgICAgICAgICB2YXIgZiA9IGQueSxcbiAgICAgICAgICAgICAgbSA9IGMueSAvIDI7XG4gICAgICAgICAgZiAtIG0gPCBhICYmIChyID0gYSArIG0pLCBmICsgbSA+IG4gJiYgKHIgPSBuIC0gbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgIHZhciBnID0gZC54LFxuICAgICAgICAgICAgICB2ID0gYy54IC8gMjtcbiAgICAgICAgICBnIC0gdiA8IHMgJiYgKG8gPSBzICsgdiksIGcgKyB2ID4gbCAmJiAobyA9IGwgLSB2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZvaWQgMCA9PT0gbyAmJiB2b2lkIDAgPT09IHIgfHwgKHRoaXMuY2VudGVyID0gdGhpcy51bnByb2plY3QobmV3IHQuUG9pbnQodm9pZCAwICE9PSBvID8gbyA6IGQueCwgdm9pZCAwICE9PSByID8gciA6IGQueSkpKSwgdGhpcy5fdW5tb2RpZmllZCA9IHUsIHRoaXMuX2NvbnN0cmFpbmluZyA9ICExO1xuICAgICAgfVxuICAgIH0sIFRvLnByb3RvdHlwZS5fY2FsY01hdHJpY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5jZW50ZXJPZmZzZXQ7XG4gICAgICAgIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA9IC41IC8gTWF0aC50YW4odGhpcy5fZm92IC8gMikgKiB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIGkgPSBNYXRoLlBJIC8gMiArIHRoaXMuX3BpdGNoLFxuICAgICAgICAgICAgbyA9IHRoaXMuX2ZvdiAqICguNSArIGUueSAvIHRoaXMuaGVpZ2h0KSxcbiAgICAgICAgICAgIHIgPSBNYXRoLnNpbihvKSAqIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIE1hdGguc2luKHQuY2xhbXAoTWF0aC5QSSAtIGkgLSBvLCAuMDEsIE1hdGguUEkgLSAuMDEpKSxcbiAgICAgICAgICAgIGEgPSB0aGlzLnBvaW50LFxuICAgICAgICAgICAgbiA9IGEueCxcbiAgICAgICAgICAgIHMgPSBhLnksXG4gICAgICAgICAgICBsID0gMS4wMSAqIChNYXRoLmNvcyhNYXRoLlBJIC8gMiAtIHRoaXMuX3BpdGNoKSAqIHIgKyB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpLFxuICAgICAgICAgICAgYyA9IHRoaXMuaGVpZ2h0IC8gNTAsXG4gICAgICAgICAgICB1ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHQucGVyc3BlY3RpdmUodSwgdGhpcy5fZm92LCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIGMsIGwpLCB1WzhdID0gMiAqIC1lLnggLyB0aGlzLndpZHRoLCB1WzldID0gMiAqIGUueSAvIHRoaXMuaGVpZ2h0LCB0LnNjYWxlKHUsIHUsIFsxLCAtMSwgMV0pLCB0LnRyYW5zbGF0ZSh1LCB1LCBbMCwgMCwgLXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZV0pLCB0LnJvdGF0ZVgodSwgdSwgdGhpcy5fcGl0Y2gpLCB0LnJvdGF0ZVoodSwgdSwgdGhpcy5hbmdsZSksIHQudHJhbnNsYXRlKHUsIHUsIFstbiwgLXMsIDBdKSwgdGhpcy5tZXJjYXRvck1hdHJpeCA9IHQuc2NhbGUoW10sIHUsIFt0aGlzLndvcmxkU2l6ZSwgdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplXSksIHQuc2NhbGUodSwgdSwgWzEsIDEsIHQubWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRoaXMuY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZSwgMV0pLCB0aGlzLnByb2pNYXRyaXggPSB1LCB0aGlzLmludlByb2pNYXRyaXggPSB0LmludmVydChbXSwgdGhpcy5wcm9qTWF0cml4KTtcblxuICAgICAgICB2YXIgaCA9IHRoaXMud2lkdGggJSAyIC8gMixcbiAgICAgICAgICAgIHAgPSB0aGlzLmhlaWdodCAlIDIgLyAyLFxuICAgICAgICAgICAgZCA9IE1hdGguY29zKHRoaXMuYW5nbGUpLFxuICAgICAgICAgICAgXyA9IE1hdGguc2luKHRoaXMuYW5nbGUpLFxuICAgICAgICAgICAgZiA9IG4gLSBNYXRoLnJvdW5kKG4pICsgZCAqIGggKyBfICogcCxcbiAgICAgICAgICAgIG0gPSBzIC0gTWF0aC5yb3VuZChzKSArIGQgKiBwICsgXyAqIGgsXG4gICAgICAgICAgICBnID0gbmV3IEZsb2F0NjRBcnJheSh1KTtcblxuICAgICAgICBpZiAodC50cmFuc2xhdGUoZywgZywgW2YgPiAuNSA/IGYgLSAxIDogZiwgbSA+IC41ID8gbSAtIDEgOiBtLCAwXSksIHRoaXMuYWxpZ25lZFByb2pNYXRyaXggPSBnLCB1ID0gdC5jcmVhdGUoKSwgdC5zY2FsZSh1LCB1LCBbdGhpcy53aWR0aCAvIDIsIC10aGlzLmhlaWdodCAvIDIsIDFdKSwgdC50cmFuc2xhdGUodSwgdSwgWzEsIC0xLCAwXSksIHRoaXMubGFiZWxQbGFuZU1hdHJpeCA9IHUsIHUgPSB0LmNyZWF0ZSgpLCB0LnNjYWxlKHUsIHUsIFsxLCAtMSwgMV0pLCB0LnRyYW5zbGF0ZSh1LCB1LCBbLTEsIC0xLCAwXSksIHQuc2NhbGUodSwgdSwgWzIgLyB0aGlzLndpZHRoLCAyIC8gdGhpcy5oZWlnaHQsIDFdKSwgdGhpcy5nbENvb3JkTWF0cml4ID0gdSwgdGhpcy5waXhlbE1hdHJpeCA9IHQubXVsdGlwbHkobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMubGFiZWxQbGFuZU1hdHJpeCwgdGhpcy5wcm9qTWF0cml4KSwgISh1ID0gdC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMucGl4ZWxNYXRyaXgpKSkgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIGludmVydCBtYXRyaXhcIik7XG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlID0gdSwgdGhpcy5fcG9zTWF0cml4Q2FjaGUgPSB7fSwgdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlID0ge307XG4gICAgICB9XG4gICAgfSwgVG8ucHJvdG90eXBlLm1heFBpdGNoU2NhbGVGYWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKSByZXR1cm4gMTtcbiAgICAgIHZhciBlID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IHQuUG9pbnQoMCwgMCkpLFxuICAgICAgICAgIGkgPSBbZS54ICogdGhpcy53b3JsZFNpemUsIGUueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcbiAgICAgIHJldHVybiB0LnRyYW5zZm9ybU1hdDQoaSwgaSwgdGhpcy5waXhlbE1hdHJpeClbM10gLyB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG4gICAgfSwgVG8ucHJvdG90eXBlLmdldENhbWVyYVBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUgPSBNYXRoLnRhbih0aGlzLl9waXRjaCkgKiAodGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIHx8IDEpO1xuICAgICAgcmV0dXJuIHRoaXMuY2VudGVyUG9pbnQuYWRkKG5ldyB0LlBvaW50KDAsIGUpKTtcbiAgICB9LCBUby5wcm90b3R5cGUuZ2V0Q2FtZXJhUXVlcnlHZW9tZXRyeSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuZ2V0Q2FtZXJhUG9pbnQoKTtcbiAgICAgIGlmICgxID09PSBlLmxlbmd0aCkgcmV0dXJuIFtlWzBdLCBpXTtcblxuICAgICAgZm9yICh2YXIgbyA9IGkueCwgciA9IGkueSwgYSA9IGkueCwgbiA9IGkueSwgcyA9IDAsIGwgPSBlOyBzIDwgbC5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICB2YXIgYyA9IGxbc107XG4gICAgICAgIG8gPSBNYXRoLm1pbihvLCBjLngpLCByID0gTWF0aC5taW4ociwgYy55KSwgYSA9IE1hdGgubWF4KGEsIGMueCksIG4gPSBNYXRoLm1heChuLCBjLnkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW25ldyB0LlBvaW50KG8sIHIpLCBuZXcgdC5Qb2ludChhLCByKSwgbmV3IHQuUG9pbnQoYSwgbiksIG5ldyB0LlBvaW50KG8sIG4pLCBuZXcgdC5Qb2ludChvLCByKV07XG4gICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVG8ucHJvdG90eXBlLCBFbyk7XG5cbiAgICB2YXIgSW8gPSBmdW5jdGlvbiBJbyhlKSB7XG4gICAgICB2YXIgaSwgbywgciwgX2EzO1xuXG4gICAgICB0aGlzLl9oYXNoTmFtZSA9IGUgJiYgZW5jb2RlVVJJQ29tcG9uZW50KGUpLCB0LmJpbmRBbGwoW1wiX2dldEN1cnJlbnRIYXNoXCIsIFwiX29uSGFzaENoYW5nZVwiLCBcIl91cGRhdGVIYXNoXCJdLCB0aGlzKSwgdGhpcy5fdXBkYXRlSGFzaCA9IChpID0gdGhpcy5fdXBkYXRlSGFzaFVudGhyb3R0bGVkLmJpbmQodGhpcyksIG8gPSAhMSwgciA9IG51bGwsIF9hMyA9IGZ1bmN0aW9uIGEoKSB7XG4gICAgICAgIHIgPSBudWxsLCBvICYmIChpKCksIHIgPSBzZXRUaW1lb3V0KF9hMywgMzAwKSwgbyA9ICExKTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG8gPSAhMCwgciB8fCBfYTMoKSwgcjtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBJby5wcm90b3R5cGUuYWRkVG8gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IGUsIHQud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJoYXNoY2hhbmdlXCIsIHRoaXMuX29uSGFzaENoYW5nZSwgITEpLCB0aGlzLl9tYXAub24oXCJtb3ZlZW5kXCIsIHRoaXMuX3VwZGF0ZUhhc2gpLCB0aGlzO1xuICAgIH0sIElvLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdC53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIiwgdGhpcy5fb25IYXNoQ2hhbmdlLCAhMSksIHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsIHRoaXMuX3VwZGF0ZUhhc2gpLCBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlSGFzaCgpKSwgZGVsZXRlIHRoaXMuX21hcCwgdGhpcztcbiAgICB9LCBJby5wcm90b3R5cGUuZ2V0SGFzaFN0cmluZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICBvID0gTWF0aC5yb3VuZCgxMDAgKiB0aGlzLl9tYXAuZ2V0Wm9vbSgpKSAvIDEwMCxcbiAgICAgICAgICByID0gTWF0aC5jZWlsKChvICogTWF0aC5MTjIgKyBNYXRoLmxvZyg1MTIgLyAzNjAgLyAuNSkpIC8gTWF0aC5MTjEwKSxcbiAgICAgICAgICBhID0gTWF0aC5wb3coMTAsIHIpLFxuICAgICAgICAgIG4gPSBNYXRoLnJvdW5kKGkubG5nICogYSkgLyBhLFxuICAgICAgICAgIHMgPSBNYXRoLnJvdW5kKGkubGF0ICogYSkgLyBhLFxuICAgICAgICAgIGwgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgIGMgPSB0aGlzLl9tYXAuZ2V0UGl0Y2goKSxcbiAgICAgICAgICB1ID0gXCJcIjtcblxuICAgICAgaWYgKHUgKz0gZSA/IFwiL1wiICsgbiArIFwiL1wiICsgcyArIFwiL1wiICsgbyA6IG8gKyBcIi9cIiArIHMgKyBcIi9cIiArIG4sIChsIHx8IGMpICYmICh1ICs9IFwiL1wiICsgTWF0aC5yb3VuZCgxMCAqIGwpIC8gMTApLCBjICYmICh1ICs9IFwiL1wiICsgTWF0aC5yb3VuZChjKSksIHRoaXMuX2hhc2hOYW1lKSB7XG4gICAgICAgIHZhciBoID0gdGhpcy5faGFzaE5hbWUsXG4gICAgICAgICAgICBwID0gITEsXG4gICAgICAgICAgICBkID0gdC53aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKS5zcGxpdChcIiZcIikubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIGUgPSB0LnNwbGl0KFwiPVwiKVswXTtcbiAgICAgICAgICByZXR1cm4gZSA9PT0gaCA/IChwID0gITAsIGUgKyBcIj1cIiArIHUpIDogdDtcbiAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcCB8fCBkLnB1c2goaCArIFwiPVwiICsgdSksIFwiI1wiICsgZC5qb2luKFwiJlwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiI1wiICsgdTtcbiAgICB9LCBJby5wcm90b3R5cGUuX2dldEN1cnJlbnRIYXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGUsXG4gICAgICAgICAgaSA9IHRoaXMsXG4gICAgICAgICAgbyA9IHQud2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZShcIiNcIiwgXCJcIik7XG4gICAgICByZXR1cm4gdGhpcy5faGFzaE5hbWUgPyAoby5zcGxpdChcIiZcIikubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LnNwbGl0KFwiPVwiKTtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdFswXSA9PT0gaS5faGFzaE5hbWUgJiYgKGUgPSB0KTtcbiAgICAgIH0pLCAoZSAmJiBlWzFdIHx8IFwiXCIpLnNwbGl0KFwiL1wiKSkgOiBvLnNwbGl0KFwiL1wiKTtcbiAgICB9LCBJby5wcm90b3R5cGUuX29uSGFzaENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5fZ2V0Q3VycmVudEhhc2goKTtcblxuICAgICAgaWYgKHQubGVuZ3RoID49IDMgJiYgIXQuc29tZShmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gaXNOYU4odCk7XG4gICAgICB9KSkge1xuICAgICAgICB2YXIgZSA9IHRoaXMuX21hcC5kcmFnUm90YXRlLmlzRW5hYmxlZCgpICYmIHRoaXMuX21hcC50b3VjaFpvb21Sb3RhdGUuaXNFbmFibGVkKCkgPyArKHRbM10gfHwgMCkgOiB0aGlzLl9tYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgY2VudGVyOiBbK3RbMl0sICt0WzFdXSxcbiAgICAgICAgICB6b29tOiArdFswXSxcbiAgICAgICAgICBiZWFyaW5nOiBlLFxuICAgICAgICAgIHBpdGNoOiArKHRbNF0gfHwgMClcbiAgICAgICAgfSksICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgSW8ucHJvdG90eXBlLl91cGRhdGVIYXNoVW50aHJvdHRsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHQud2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKCMuKyk/JC8sIHRoaXMuZ2V0SGFzaFN0cmluZygpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdC53aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUodC53aW5kb3cuaGlzdG9yeS5zdGF0ZSwgbnVsbCwgZSk7XG4gICAgICB9IGNhdGNoICh0KSB7fVxuICAgIH07XG5cbiAgICB2YXIgUG8gPSB7XG4gICAgICBsaW5lYXJpdHk6IC4zLFxuICAgICAgZWFzaW5nOiB0LmJlemllcigwLCAwLCAuMywgMSlcbiAgICB9LFxuICAgICAgICBTbyA9IHQuZXh0ZW5kKHtcbiAgICAgIGRlY2VsZXJhdGlvbjogMjUwMCxcbiAgICAgIG1heFNwZWVkOiAxNDAwXG4gICAgfSwgUG8pLFxuICAgICAgICBDbyA9IHQuZXh0ZW5kKHtcbiAgICAgIGRlY2VsZXJhdGlvbjogMjAsXG4gICAgICBtYXhTcGVlZDogMTQwMFxuICAgIH0sIFBvKSxcbiAgICAgICAgem8gPSB0LmV4dGVuZCh7XG4gICAgICBkZWNlbGVyYXRpb246IDFlMyxcbiAgICAgIG1heFNwZWVkOiAzNjBcbiAgICB9LCBQbyksXG4gICAgICAgIERvID0gdC5leHRlbmQoe1xuICAgICAgZGVjZWxlcmF0aW9uOiAxZTMsXG4gICAgICBtYXhTcGVlZDogOTBcbiAgICB9LCBQbyksXG4gICAgICAgIEFvID0gZnVuY3Rpb24gQW8odCkge1xuICAgICAgdGhpcy5fbWFwID0gdCwgdGhpcy5jbGVhcigpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBNbyh0LCBlKSB7XG4gICAgICAoIXQuZHVyYXRpb24gfHwgdC5kdXJhdGlvbiA8IGUuZHVyYXRpb24pICYmICh0LmR1cmF0aW9uID0gZS5kdXJhdGlvbiwgdC5lYXNpbmcgPSBlLmVhc2luZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG8oZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSBvLm1heFNwZWVkLFxuICAgICAgICAgIGEgPSBvLmxpbmVhcml0eSxcbiAgICAgICAgICBuID0gby5kZWNlbGVyYXRpb24sXG4gICAgICAgICAgcyA9IHQuY2xhbXAoZSAqIGEgLyAoaSAvIDFlMyksIC1yLCByKSxcbiAgICAgICAgICBsID0gTWF0aC5hYnMocykgLyAobiAqIGEpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWFzaW5nOiBvLmVhc2luZyxcbiAgICAgICAgZHVyYXRpb246IDFlMyAqIGwsXG4gICAgICAgIGFtb3VudDogcyAqIChsIC8gMilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgQW8ucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5faW5lcnRpYUJ1ZmZlciA9IFtdO1xuICAgIH0sIEFvLnByb3RvdHlwZS5yZWNvcmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCksIHRoaXMuX2luZXJ0aWFCdWZmZXIucHVzaCh7XG4gICAgICAgIHRpbWU6IHQuYnJvd3Nlci5ub3coKSxcbiAgICAgICAgc2V0dGluZ3M6IGVcbiAgICAgIH0pO1xuICAgIH0sIEFvLnByb3RvdHlwZS5fZHJhaW5JbmVydGlhQnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgZSA9IHRoaXMuX2luZXJ0aWFCdWZmZXIsIGkgPSB0LmJyb3dzZXIubm93KCk7IGUubGVuZ3RoID4gMCAmJiBpIC0gZVswXS50aW1lID4gMTYwOykge1xuICAgICAgICBlLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfSwgQW8ucHJvdG90eXBlLl9vbk1vdmVFbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpLCAhKHRoaXMuX2luZXJ0aWFCdWZmZXIubGVuZ3RoIDwgMikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHtcbiAgICAgICAgICB6b29tOiAwLFxuICAgICAgICAgIGJlYXJpbmc6IDAsXG4gICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgcGFuOiBuZXcgdC5Qb2ludCgwLCAwKSxcbiAgICAgICAgICBwaW5jaEFyb3VuZDogdm9pZCAwLFxuICAgICAgICAgIGFyb3VuZDogdm9pZCAwXG4gICAgICAgIH0sIG8gPSAwLCByID0gdGhpcy5faW5lcnRpYUJ1ZmZlcjsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICB2YXIgYSA9IHJbb10uc2V0dGluZ3M7XG4gICAgICAgICAgaS56b29tICs9IGEuem9vbURlbHRhIHx8IDAsIGkuYmVhcmluZyArPSBhLmJlYXJpbmdEZWx0YSB8fCAwLCBpLnBpdGNoICs9IGEucGl0Y2hEZWx0YSB8fCAwLCBhLnBhbkRlbHRhICYmIGkucGFuLl9hZGQoYS5wYW5EZWx0YSksIGEuYXJvdW5kICYmIChpLmFyb3VuZCA9IGEuYXJvdW5kKSwgYS5waW5jaEFyb3VuZCAmJiAoaS5waW5jaEFyb3VuZCA9IGEucGluY2hBcm91bmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG4gPSB0aGlzLl9pbmVydGlhQnVmZmVyW3RoaXMuX2luZXJ0aWFCdWZmZXIubGVuZ3RoIC0gMV0udGltZSAtIHRoaXMuX2luZXJ0aWFCdWZmZXJbMF0udGltZSxcbiAgICAgICAgICAgIHMgPSB7fTtcblxuICAgICAgICBpZiAoaS5wYW4ubWFnKCkpIHtcbiAgICAgICAgICB2YXIgbCA9IExvKGkucGFuLm1hZygpLCBuLCB0LmV4dGVuZCh7fSwgU28sIGUgfHwge30pKTtcbiAgICAgICAgICBzLm9mZnNldCA9IGkucGFuLm11bHQobC5hbW91bnQgLyBpLnBhbi5tYWcoKSksIHMuY2VudGVyID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXIsIE1vKHMsIGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkuem9vbSkge1xuICAgICAgICAgIHZhciBjID0gTG8oaS56b29tLCBuLCBDbyk7XG4gICAgICAgICAgcy56b29tID0gdGhpcy5fbWFwLnRyYW5zZm9ybS56b29tICsgYy5hbW91bnQsIE1vKHMsIGMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkuYmVhcmluZykge1xuICAgICAgICAgIHZhciB1ID0gTG8oaS5iZWFyaW5nLCBuLCB6byk7XG4gICAgICAgICAgcy5iZWFyaW5nID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5iZWFyaW5nICsgdC5jbGFtcCh1LmFtb3VudCwgLTE3OSwgMTc5KSwgTW8ocywgdSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaS5waXRjaCkge1xuICAgICAgICAgIHZhciBoID0gTG8oaS5waXRjaCwgbiwgRG8pO1xuICAgICAgICAgIHMucGl0Y2ggPSB0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNoICsgaC5hbW91bnQsIE1vKHMsIGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHMuem9vbSB8fCBzLmJlYXJpbmcpIHtcbiAgICAgICAgICB2YXIgcCA9IHZvaWQgMCA9PT0gaS5waW5jaEFyb3VuZCA/IGkuYXJvdW5kIDogaS5waW5jaEFyb3VuZDtcbiAgICAgICAgICBzLmFyb3VuZCA9IHAgPyB0aGlzLl9tYXAudW5wcm9qZWN0KHApIDogdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKSwgdC5leHRlbmQocywge1xuICAgICAgICAgIG5vTW92ZVN0YXJ0OiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIFJvID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGZ1bmN0aW9uIG8obywgciwgYSwgbikge1xuICAgICAgICB2b2lkIDAgPT09IG4gJiYgKG4gPSB7fSk7XG4gICAgICAgIHZhciBzID0gaS5tb3VzZVBvcyhyLmdldENhbnZhc0NvbnRhaW5lcigpLCBhKSxcbiAgICAgICAgICAgIGwgPSByLnVucHJvamVjdChzKTtcbiAgICAgICAgZS5jYWxsKHRoaXMsIG8sIHQuZXh0ZW5kKHtcbiAgICAgICAgICBwb2ludDogcyxcbiAgICAgICAgICBsbmdMYXQ6IGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogYVxuICAgICAgICB9LCBuKSksIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMSwgdGhpcy50YXJnZXQgPSByO1xuICAgICAgfVxuXG4gICAgICBlICYmIChvLl9fcHJvdG9fXyA9IGUpLCAoby5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IG87XG4gICAgICB2YXIgciA9IHtcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBvLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9ICEwO1xuICAgICAgfSwgci5kZWZhdWx0UHJldmVudGVkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvLnByb3RvdHlwZSwgciksIG87XG4gICAgfSh0LkV2ZW50KSxcbiAgICAgICAga28gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gbyhvLCByLCBhKSB7XG4gICAgICAgIHZhciBuID0gXCJ0b3VjaGVuZFwiID09PSBvID8gYS5jaGFuZ2VkVG91Y2hlcyA6IGEudG91Y2hlcyxcbiAgICAgICAgICAgIHMgPSBpLnRvdWNoUG9zKHIuZ2V0Q2FudmFzQ29udGFpbmVyKCksIG4pLFxuICAgICAgICAgICAgbCA9IHMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHIudW5wcm9qZWN0KHQpO1xuICAgICAgICB9KSxcbiAgICAgICAgICAgIGMgPSBzLnJlZHVjZShmdW5jdGlvbiAodCwgZSwgaSwgbykge1xuICAgICAgICAgIHJldHVybiB0LmFkZChlLmRpdihvLmxlbmd0aCkpO1xuICAgICAgICB9LCBuZXcgdC5Qb2ludCgwLCAwKSksXG4gICAgICAgICAgICB1ID0gci51bnByb2plY3QoYyk7XG4gICAgICAgIGUuY2FsbCh0aGlzLCBvLCB7XG4gICAgICAgICAgcG9pbnRzOiBzLFxuICAgICAgICAgIHBvaW50OiBjLFxuICAgICAgICAgIGxuZ0xhdHM6IGwsXG4gICAgICAgICAgbG5nTGF0OiB1LFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGFcbiAgICAgICAgfSksIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMTtcbiAgICAgIH1cblxuICAgICAgZSAmJiAoby5fX3Byb3RvX18gPSBlKSwgKG8ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBvO1xuICAgICAgdmFyIHIgPSB7XG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gby5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMDtcbiAgICAgIH0sIHIuZGVmYXVsdFByZXZlbnRlZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoby5wcm90b3R5cGUsIHIpLCBvO1xuICAgIH0odC5FdmVudCksXG4gICAgICAgIEJvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoZSwgaSwgbykge1xuICAgICAgICB0LmNhbGwodGhpcywgZSwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9cbiAgICAgICAgfSksIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMTtcbiAgICAgIH1cblxuICAgICAgdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlO1xuICAgICAgdmFyIGkgPSB7XG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gZS5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSAhMDtcbiAgICAgIH0sIGkuZGVmYXVsdFByZXZlbnRlZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIGkpLCBlO1xuICAgIH0odC5FdmVudCksXG4gICAgICAgIE9vID0gZnVuY3Rpb24gT28odCwgZSkge1xuICAgICAgdGhpcy5fbWFwID0gdCwgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBlLmNsaWNrVG9sZXJhbmNlO1xuICAgIH07XG5cbiAgICBPby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWxldGUgdGhpcy5fbW91c2Vkb3duUG9zO1xuICAgIH0sIE9vLnByb3RvdHlwZS53aGVlbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBCbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS5tb3VzZWRvd24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vdXNlZG93blBvcyA9IGUsIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUubW91c2V1cCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXAuZmlyZShuZXcgUm8odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUuY2xpY2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5fbW91c2Vkb3duUG9zICYmIHRoaXMuX21vdXNlZG93blBvcy5kaXN0KGUpID49IHRoaXMuX2NsaWNrVG9sZXJhbmNlIHx8IHRoaXMuX21hcC5maXJlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS5kYmxjbGljayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS5tb3VzZW92ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IFJvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLm1vdXNlb3V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IGtvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9tYXAuZmlyZShuZXcga28odC50eXBlLCB0aGlzLl9tYXAsIHQpKTtcbiAgICB9LCBPby5wcm90b3R5cGUudG91Y2hlbmQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IGtvKHQudHlwZSwgdGhpcy5fbWFwLCB0KSk7XG4gICAgfSwgT28ucHJvdG90eXBlLnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBrbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIE9vLnByb3RvdHlwZS5fZmlyZVByZXZlbnRhYmxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0aGlzLl9tYXAuZmlyZSh0KSwgdC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm4ge307XG4gICAgfSwgT28ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9LCBPby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgT28ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHt9LCBPby5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgdmFyIEZvID0gZnVuY3Rpb24gRm8odCkge1xuICAgICAgdGhpcy5fbWFwID0gdDtcbiAgICB9O1xuXG4gICAgRm8ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9ICExLCBkZWxldGUgdGhpcy5fY29udGV4dE1lbnVFdmVudDtcbiAgICB9LCBGby5wcm90b3R5cGUubW91c2Vtb3ZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpO1xuICAgIH0sIEZvLnByb3RvdHlwZS5tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9kZWxheUNvbnRleHRNZW51ID0gITA7XG4gICAgfSwgRm8ucHJvdG90eXBlLm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9kZWxheUNvbnRleHRNZW51ID0gITEsIHRoaXMuX2NvbnRleHRNZW51RXZlbnQgJiYgKHRoaXMuX21hcC5maXJlKG5ldyBSbyhcImNvbnRleHRtZW51XCIsIHRoaXMuX21hcCwgdGhpcy5fY29udGV4dE1lbnVFdmVudCkpLCBkZWxldGUgdGhpcy5fY29udGV4dE1lbnVFdmVudCk7XG4gICAgfSwgRm8ucHJvdG90eXBlLmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX2RlbGF5Q29udGV4dE1lbnUgPyB0aGlzLl9jb250ZXh0TWVudUV2ZW50ID0gdCA6IHRoaXMuX21hcC5maXJlKG5ldyBSbyh0LnR5cGUsIHRoaXMuX21hcCwgdCkpLCB0aGlzLl9tYXAubGlzdGVucyhcImNvbnRleHRtZW51XCIpICYmIHQucHJldmVudERlZmF1bHQoKTtcbiAgICB9LCBGby5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEwO1xuICAgIH0sIEZvLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9LCBGby5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge30sIEZvLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge307XG5cbiAgICB2YXIgVW8gPSBmdW5jdGlvbiBVbyh0LCBlKSB7XG4gICAgICB0aGlzLl9tYXAgPSB0LCB0aGlzLl9lbCA9IHQuZ2V0Q2FudmFzQ29udGFpbmVyKCksIHRoaXMuX2NvbnRhaW5lciA9IHQuZ2V0Q29udGFpbmVyKCksIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gZS5jbGlja1RvbGVyYW5jZSB8fCAxO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBObyh0LCBlKSB7XG4gICAgICBmb3IgKHZhciBpID0ge30sIG8gPSAwOyBvIDwgdC5sZW5ndGg7IG8rKykge1xuICAgICAgICBpW3Rbb10uaWRlbnRpZmllcl0gPSBlW29dO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBVby5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBVby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfSwgVW8ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaXNFbmFibGVkKCkgfHwgKHRoaXMuX2VuYWJsZWQgPSAhMCk7XG4gICAgfSwgVW8ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlzRW5hYmxlZCgpICYmICh0aGlzLl9lbmFibGVkID0gITEpO1xuICAgIH0sIFVvLnByb3RvdHlwZS5tb3VzZWRvd24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5pc0VuYWJsZWQoKSAmJiB0LnNoaWZ0S2V5ICYmIDAgPT09IHQuYnV0dG9uICYmIChpLmRpc2FibGVEcmFnKCksIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbGFzdFBvcyA9IGUsIHRoaXMuX2FjdGl2ZSA9ICEwKTtcbiAgICB9LCBVby5wcm90b3R5cGUubW91c2Vtb3ZlV2luZG93ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgdmFyIG8gPSBlO1xuXG4gICAgICAgIGlmICghKHRoaXMuX2xhc3RQb3MuZXF1YWxzKG8pIHx8ICF0aGlzLl9ib3ggJiYgby5kaXN0KHRoaXMuX3N0YXJ0UG9zKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSkge1xuICAgICAgICAgIHZhciByID0gdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgICAgdGhpcy5fbGFzdFBvcyA9IG8sIHRoaXMuX2JveCB8fCAodGhpcy5fYm94ID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLWJveHpvb21cIiwgdGhpcy5fY29udGFpbmVyKSwgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWNyb3NzaGFpclwiKSwgdGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbXN0YXJ0XCIsIHQpKTtcbiAgICAgICAgICB2YXIgYSA9IE1hdGgubWluKHIueCwgby54KSxcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KHIueCwgby54KSxcbiAgICAgICAgICAgICAgcyA9IE1hdGgubWluKHIueSwgby55KSxcbiAgICAgICAgICAgICAgbCA9IE1hdGgubWF4KHIueSwgby55KTtcbiAgICAgICAgICBpLnNldFRyYW5zZm9ybSh0aGlzLl9ib3gsIFwidHJhbnNsYXRlKFwiICsgYSArIFwicHgsXCIgKyBzICsgXCJweClcIiksIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IG4gLSBhICsgXCJweFwiLCB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gbCAtIHMgKyBcInB4XCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBVby5wcm90b3R5cGUubW91c2V1cFdpbmRvdyA9IGZ1bmN0aW9uIChlLCBvKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgMCA9PT0gZS5idXR0b24pIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIG4gPSBvO1xuICAgICAgICBpZiAodGhpcy5yZXNldCgpLCBpLnN1cHByZXNzQ2xpY2soKSwgYS54ICE9PSBuLnggfHwgYS55ICE9PSBuLnkpIHJldHVybiB0aGlzLl9tYXAuZmlyZShuZXcgdC5FdmVudChcImJveHpvb21lbmRcIiwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiBmdW5jdGlvbiBjYW1lcmFBbmltYXRpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIHQuZml0U2NyZWVuQ29vcmRpbmF0ZXMoYSwgbiwgci5fbWFwLmdldEJlYXJpbmcoKSwge1xuICAgICAgICAgICAgICBsaW5lYXI6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KFwiYm94em9vbWNhbmNlbFwiLCBlKTtcbiAgICAgIH1cbiAgICB9LCBVby5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9hY3RpdmUgJiYgMjcgPT09IHQua2V5Q29kZSAmJiAodGhpcy5yZXNldCgpLCB0aGlzLl9maXJlRXZlbnQoXCJib3h6b29tY2FuY2VsXCIsIHQpKTtcbiAgICB9LCBVby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMSwgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWNyb3NzaGFpclwiKSwgdGhpcy5fYm94ICYmIChpLnJlbW92ZSh0aGlzLl9ib3gpLCB0aGlzLl9ib3ggPSBudWxsKSwgaS5lbmFibGVEcmFnKCksIGRlbGV0ZSB0aGlzLl9zdGFydFBvcywgZGVsZXRlIHRoaXMuX2xhc3RQb3M7XG4gICAgfSwgVW8ucHJvdG90eXBlLl9maXJlRXZlbnQgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKG5ldyB0LkV2ZW50KGUsIHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogaVxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICB2YXIgWm8gPSBmdW5jdGlvbiBabyh0KSB7XG4gICAgICB0aGlzLnJlc2V0KCksIHRoaXMubnVtVG91Y2hlcyA9IHQubnVtVG91Y2hlcztcbiAgICB9O1xuXG4gICAgWm8ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZGVsZXRlIHRoaXMuY2VudHJvaWQsIGRlbGV0ZSB0aGlzLnN0YXJ0VGltZSwgZGVsZXRlIHRoaXMudG91Y2hlcywgdGhpcy5hYm9ydGVkID0gITE7XG4gICAgfSwgWm8ucHJvdG90eXBlLnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgKHRoaXMuY2VudHJvaWQgfHwgby5sZW5ndGggPiB0aGlzLm51bVRvdWNoZXMpICYmICh0aGlzLmFib3J0ZWQgPSAhMCksIHRoaXMuYWJvcnRlZCB8fCAodm9pZCAwID09PSB0aGlzLnN0YXJ0VGltZSAmJiAodGhpcy5zdGFydFRpbWUgPSBlLnRpbWVTdGFtcCksIG8ubGVuZ3RoID09PSB0aGlzLm51bVRvdWNoZXMgJiYgKHRoaXMuY2VudHJvaWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gbmV3IHQuUG9pbnQoMCwgMCksIG8gPSAwLCByID0gZTsgbyA8IHIubGVuZ3RoOyBvICs9IDEpIHtcbiAgICAgICAgICBpLl9hZGQocltvXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaS5kaXYoZS5sZW5ndGgpO1xuICAgICAgfShpKSwgdGhpcy50b3VjaGVzID0gTm8obywgaSkpKTtcbiAgICB9LCBaby5wcm90b3R5cGUudG91Y2htb3ZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGlmICghdGhpcy5hYm9ydGVkICYmIHRoaXMuY2VudHJvaWQpIHtcbiAgICAgICAgdmFyIG8gPSBObyhpLCBlKTtcblxuICAgICAgICBmb3IgKHZhciByIGluIHRoaXMudG91Y2hlcykge1xuICAgICAgICAgIHZhciBhID0gb1tyXTtcbiAgICAgICAgICAoIWEgfHwgYS5kaXN0KHRoaXMudG91Y2hlc1tyXSkgPiAzMCkgJiYgKHRoaXMuYWJvcnRlZCA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFpvLnByb3RvdHlwZS50b3VjaGVuZCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAoKCF0aGlzLmNlbnRyb2lkIHx8IHQudGltZVN0YW1wIC0gdGhpcy5zdGFydFRpbWUgPiA1MDApICYmICh0aGlzLmFib3J0ZWQgPSAhMCksIDAgPT09IGkubGVuZ3RoKSB7XG4gICAgICAgIHZhciBvID0gIXRoaXMuYWJvcnRlZCAmJiB0aGlzLmNlbnRyb2lkO1xuICAgICAgICBpZiAodGhpcy5yZXNldCgpLCBvKSByZXR1cm4gbztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHFvID0gZnVuY3Rpb24gcW8odCkge1xuICAgICAgdGhpcy5zaW5nbGVUYXAgPSBuZXcgWm8odCksIHRoaXMubnVtVGFwcyA9IHQubnVtVGFwcywgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBxby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmxhc3RUaW1lID0gMSAvIDAsIGRlbGV0ZSB0aGlzLmxhc3RUYXAsIHRoaXMuY291bnQgPSAwLCB0aGlzLnNpbmdsZVRhcC5yZXNldCgpO1xuICAgIH0sIHFvLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuc2luZ2xlVGFwLnRvdWNoc3RhcnQodCwgZSwgaSk7XG4gICAgfSwgcW8ucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLnNpbmdsZVRhcC50b3VjaG1vdmUodCwgZSwgaSk7XG4gICAgfSwgcW8ucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcy5zaW5nbGVUYXAudG91Y2hlbmQodCwgZSwgaSk7XG5cbiAgICAgIGlmIChvKSB7XG4gICAgICAgIHZhciByID0gdC50aW1lU3RhbXAgLSB0aGlzLmxhc3RUaW1lIDwgNTAwLFxuICAgICAgICAgICAgYSA9ICF0aGlzLmxhc3RUYXAgfHwgdGhpcy5sYXN0VGFwLmRpc3QobykgPCAzMDtcbiAgICAgICAgaWYgKHIgJiYgYSB8fCB0aGlzLnJlc2V0KCksIHRoaXMuY291bnQrKywgdGhpcy5sYXN0VGltZSA9IHQudGltZVN0YW1wLCB0aGlzLmxhc3RUYXAgPSBvLCB0aGlzLmNvdW50ID09PSB0aGlzLm51bVRhcHMpIHJldHVybiB0aGlzLnJlc2V0KCksIG87XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBqbyA9IGZ1bmN0aW9uIGpvKCkge1xuICAgICAgdGhpcy5fem9vbUluID0gbmV3IHFvKHtcbiAgICAgICAgbnVtVG91Y2hlczogMSxcbiAgICAgICAgbnVtVGFwczogMlxuICAgICAgfSksIHRoaXMuX3pvb21PdXQgPSBuZXcgcW8oe1xuICAgICAgICBudW1Ub3VjaGVzOiAyLFxuICAgICAgICBudW1UYXBzOiAxXG4gICAgICB9KSwgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBqby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMSwgdGhpcy5fem9vbUluLnJlc2V0KCksIHRoaXMuX3pvb21PdXQucmVzZXQoKTtcbiAgICB9LCBqby5wcm90b3R5cGUudG91Y2hzdGFydCA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICB0aGlzLl96b29tSW4udG91Y2hzdGFydCh0LCBlLCBpKSwgdGhpcy5fem9vbU91dC50b3VjaHN0YXJ0KHQsIGUsIGkpO1xuICAgIH0sIGpvLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5fem9vbUluLnRvdWNobW92ZSh0LCBlLCBpKSwgdGhpcy5fem9vbU91dC50b3VjaG1vdmUodCwgZSwgaSk7XG4gICAgfSwgam8ucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHZhciBvID0gdGhpcyxcbiAgICAgICAgICByID0gdGhpcy5fem9vbUluLnRvdWNoZW5kKHQsIGUsIGkpLFxuICAgICAgICAgIGEgPSB0aGlzLl96b29tT3V0LnRvdWNoZW5kKHQsIGUsIGkpO1xuXG4gICAgICByZXR1cm4gciA/ICh0aGlzLl9hY3RpdmUgPSAhMCwgdC5wcmV2ZW50RGVmYXVsdCgpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG8ucmVzZXQoKTtcbiAgICAgIH0sIDApLCB7XG4gICAgICAgIGNhbWVyYUFuaW1hdGlvbjogZnVuY3Rpb24gY2FtZXJhQW5pbWF0aW9uKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5lYXNlVG8oe1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIHpvb206IGUuZ2V0Wm9vbSgpICsgMSxcbiAgICAgICAgICAgIGFyb3VuZDogZS51bnByb2plY3QocilcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pIDogYSA/ICh0aGlzLl9hY3RpdmUgPSAhMCwgdC5wcmV2ZW50RGVmYXVsdCgpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG8ucmVzZXQoKTtcbiAgICAgIH0sIDApLCB7XG4gICAgICAgIGNhbWVyYUFuaW1hdGlvbjogZnVuY3Rpb24gY2FtZXJhQW5pbWF0aW9uKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5lYXNlVG8oe1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIHpvb206IGUuZ2V0Wm9vbSgpIC0gMSxcbiAgICAgICAgICAgIGFyb3VuZDogZS51bnByb2plY3QoYSlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pIDogdm9pZCAwO1xuICAgIH0sIGpvLnByb3RvdHlwZS50b3VjaGNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LCBqby5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwO1xuICAgIH0sIGpvLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICExLCB0aGlzLnJlc2V0KCk7XG4gICAgfSwgam8ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH0sIGpvLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfTtcblxuICAgIHZhciBWbyA9IHtcbiAgICAgIDA6IDEsXG4gICAgICAyOiAyXG4gICAgfSxcbiAgICAgICAgR28gPSBmdW5jdGlvbiBHbyh0KSB7XG4gICAgICB0aGlzLnJlc2V0KCksIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gdC5jbGlja1RvbGVyYW5jZSB8fCAxO1xuICAgIH07XG5cbiAgICBHby5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMSwgdGhpcy5fbW92ZWQgPSAhMSwgZGVsZXRlIHRoaXMuX2xhc3RQb2ludCwgZGVsZXRlIHRoaXMuX2V2ZW50QnV0dG9uO1xuICAgIH0sIEdvLnByb3RvdHlwZS5fY29ycmVjdEJ1dHRvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgR28ucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9LCBHby5wcm90b3R5cGUubW91c2Vkb3duID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIGlmICghdGhpcy5fbGFzdFBvaW50KSB7XG4gICAgICAgIHZhciBvID0gaS5tb3VzZUJ1dHRvbih0KTtcbiAgICAgICAgdGhpcy5fY29ycmVjdEJ1dHRvbih0LCBvKSAmJiAodGhpcy5fbGFzdFBvaW50ID0gZSwgdGhpcy5fZXZlbnRCdXR0b24gPSBvKTtcbiAgICAgIH1cbiAgICB9LCBHby5wcm90b3R5cGUubW91c2Vtb3ZlV2luZG93ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5fbGFzdFBvaW50O1xuICAgICAgaWYgKGkpIGlmICh0LnByZXZlbnREZWZhdWx0KCksIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gVm9bZV07XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQuYnV0dG9ucyB8fCAodC5idXR0b25zICYgaSkgIT09IGk7XG4gICAgICB9KHQsIHRoaXMuX2V2ZW50QnV0dG9uKSkgdGhpcy5yZXNldCgpO2Vsc2UgaWYgKHRoaXMuX21vdmVkIHx8ICEoZS5kaXN0KGkpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpKSByZXR1cm4gdGhpcy5fbW92ZWQgPSAhMCwgdGhpcy5fbGFzdFBvaW50ID0gZSwgdGhpcy5fbW92ZShpLCBlKTtcbiAgICB9LCBHby5wcm90b3R5cGUubW91c2V1cFdpbmRvdyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9sYXN0UG9pbnQgJiYgaS5tb3VzZUJ1dHRvbih0KSA9PT0gdGhpcy5fZXZlbnRCdXR0b24gJiYgKHRoaXMuX21vdmVkICYmIGkuc3VwcHJlc3NDbGljaygpLCB0aGlzLnJlc2V0KCkpO1xuICAgIH0sIEdvLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITA7XG4gICAgfSwgR28ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITEsIHRoaXMucmVzZXQoKTtcbiAgICB9LCBHby5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfSwgR28ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9O1xuXG4gICAgdmFyIFdvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUubW91c2Vkb3duID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdC5wcm90b3R5cGUubW91c2Vkb3duLmNhbGwodGhpcywgZSwgaSksIHRoaXMuX2xhc3RQb2ludCAmJiAodGhpcy5fYWN0aXZlID0gITApO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX2NvcnJlY3RCdXR0b24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gMCA9PT0gZSAmJiAhdC5jdHJsS2V5O1xuICAgICAgfSwgZS5wcm90b3R5cGUuX21vdmUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFyb3VuZDogZSxcbiAgICAgICAgICBwYW5EZWx0YTogZS5zdWIodClcbiAgICAgICAgfTtcbiAgICAgIH0sIGU7XG4gICAgfShHbyksXG4gICAgICAgIFhvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX2NvcnJlY3RCdXR0b24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gMCA9PT0gZSAmJiB0LmN0cmxLZXkgfHwgMiA9PT0gZTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIGkgPSAuOCAqIChlLnggLSB0LngpO1xuICAgICAgICBpZiAoaSkgcmV0dXJuIHRoaXMuX2FjdGl2ZSA9ICEwLCB7XG4gICAgICAgICAgYmVhcmluZ0RlbHRhOiBpXG4gICAgICAgIH07XG4gICAgICB9LCBlLnByb3RvdHlwZS5jb250ZXh0bWVudSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sIGU7XG4gICAgfShHbyksXG4gICAgICAgIEhvID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUuX2NvcnJlY3RCdXR0b24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gMCA9PT0gZSAmJiB0LmN0cmxLZXkgfHwgMiA9PT0gZTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIGkgPSAtLjUgKiAoZS55IC0gdC55KTtcbiAgICAgICAgaWYgKGkpIHJldHVybiB0aGlzLl9hY3RpdmUgPSAhMCwge1xuICAgICAgICAgIHBpdGNoRGVsdGE6IGlcbiAgICAgICAgfTtcbiAgICAgIH0sIGUucHJvdG90eXBlLmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSwgZTtcbiAgICB9KEdvKSxcbiAgICAgICAgS28gPSBmdW5jdGlvbiBLbyh0KSB7XG4gICAgICB0aGlzLl9taW5Ub3VjaGVzID0gMSwgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSB0LmNsaWNrVG9sZXJhbmNlIHx8IDEsIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgS28ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITEsIHRoaXMuX3RvdWNoZXMgPSB7fSwgdGhpcy5fc3VtID0gbmV3IHQuUG9pbnQoMCwgMCk7XG4gICAgfSwgS28ucHJvdG90eXBlLnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybSh0LCBlLCBpKTtcbiAgICB9LCBLby5wcm90b3R5cGUudG91Y2htb3ZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgIShpLmxlbmd0aCA8IHRoaXMuX21pblRvdWNoZXMpKSByZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLl9jYWxjdWxhdGVUcmFuc2Zvcm0odCwgZSwgaSk7XG4gICAgfSwgS28ucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybSh0LCBlLCBpKSwgdGhpcy5fYWN0aXZlICYmIGkubGVuZ3RoIDwgdGhpcy5fbWluVG91Y2hlcyAmJiB0aGlzLnJlc2V0KCk7XG4gICAgfSwgS28ucHJvdG90eXBlLnRvdWNoY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sIEtvLnByb3RvdHlwZS5fY2FsY3VsYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgIG8ubGVuZ3RoID4gMCAmJiAodGhpcy5fYWN0aXZlID0gITApO1xuICAgICAgdmFyIHIgPSBObyhvLCBpKSxcbiAgICAgICAgICBhID0gbmV3IHQuUG9pbnQoMCwgMCksXG4gICAgICAgICAgbiA9IG5ldyB0LlBvaW50KDAsIDApLFxuICAgICAgICAgIHMgPSAwO1xuXG4gICAgICBmb3IgKHZhciBsIGluIHIpIHtcbiAgICAgICAgdmFyIGMgPSByW2xdLFxuICAgICAgICAgICAgdSA9IHRoaXMuX3RvdWNoZXNbbF07XG4gICAgICAgIHUgJiYgKGEuX2FkZChjKSwgbi5fYWRkKGMuc3ViKHUpKSwgcysrLCByW2xdID0gYyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl90b3VjaGVzID0gciwgIShzIDwgdGhpcy5fbWluVG91Y2hlcykgJiYgbi5tYWcoKSkge1xuICAgICAgICB2YXIgaCA9IG4uZGl2KHMpO1xuICAgICAgICBpZiAodGhpcy5fc3VtLl9hZGQoaCksICEodGhpcy5fc3VtLm1hZygpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpKSByZXR1cm4ge1xuICAgICAgICAgIGFyb3VuZDogYS5kaXYocyksXG4gICAgICAgICAgcGFuRGVsdGE6IGhcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBLby5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwO1xuICAgIH0sIEtvLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICExLCB0aGlzLnJlc2V0KCk7XG4gICAgfSwgS28ucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH0sIEtvLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfTtcblxuICAgIHZhciBZbyA9IGZ1bmN0aW9uIFlvKCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBKbyh0LCBlLCBpKSB7XG4gICAgICBmb3IgKHZhciBvID0gMDsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgaWYgKHRbb10uaWRlbnRpZmllciA9PT0gaSkgcmV0dXJuIGVbb107XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUW8odCwgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubG9nKHQgLyBlKSAvIE1hdGguTE4yO1xuICAgIH1cblxuICAgIFlvLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9ICExLCBkZWxldGUgdGhpcy5fZmlyc3RUd29Ub3VjaGVzO1xuICAgIH0sIFlvLnByb3RvdHlwZS5fc3RhcnQgPSBmdW5jdGlvbiAodCkge30sIFlvLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfSwgWW8ucHJvdG90eXBlLnRvdWNoc3RhcnQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5fZmlyc3RUd29Ub3VjaGVzIHx8IGkubGVuZ3RoIDwgMiB8fCAodGhpcy5fZmlyc3RUd29Ub3VjaGVzID0gW2lbMF0uaWRlbnRpZmllciwgaVsxXS5pZGVudGlmaWVyXSwgdGhpcy5fc3RhcnQoW2VbMF0sIGVbMV1dKSk7XG4gICAgfSwgWW8ucHJvdG90eXBlLnRvdWNobW92ZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICBpZiAodGhpcy5fZmlyc3RUd29Ub3VjaGVzKSB7XG4gICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIG8gPSB0aGlzLl9maXJzdFR3b1RvdWNoZXMsXG4gICAgICAgICAgICByID0gb1sxXSxcbiAgICAgICAgICAgIGEgPSBKbyhpLCBlLCBvWzBdKSxcbiAgICAgICAgICAgIG4gPSBKbyhpLCBlLCByKTtcblxuICAgICAgICBpZiAoYSAmJiBuKSB7XG4gICAgICAgICAgdmFyIHMgPSB0aGlzLl9hcm91bmRDZW50ZXIgPyBudWxsIDogYS5hZGQobikuZGl2KDIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9tb3ZlKFthLCBuXSwgcywgdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBZby5wcm90b3R5cGUudG91Y2hlbmQgPSBmdW5jdGlvbiAodCwgZSwgbykge1xuICAgICAgaWYgKHRoaXMuX2ZpcnN0VHdvVG91Y2hlcykge1xuICAgICAgICB2YXIgciA9IHRoaXMuX2ZpcnN0VHdvVG91Y2hlcyxcbiAgICAgICAgICAgIGEgPSByWzFdLFxuICAgICAgICAgICAgbiA9IEpvKG8sIGUsIHJbMF0pLFxuICAgICAgICAgICAgcyA9IEpvKG8sIGUsIGEpO1xuICAgICAgICBuICYmIHMgfHwgKHRoaXMuX2FjdGl2ZSAmJiBpLnN1cHByZXNzQ2xpY2soKSwgdGhpcy5yZXNldCgpKTtcbiAgICAgIH1cbiAgICB9LCBZby5wcm90b3R5cGUudG91Y2hjYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSwgWW8ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl9lbmFibGVkID0gITAsIHRoaXMuX2Fyb3VuZENlbnRlciA9ICEhdCAmJiBcImNlbnRlclwiID09PSB0LmFyb3VuZDtcbiAgICB9LCBZby5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIFlvLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBZby5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH07XG5cbiAgICB2YXIgJG8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKSwgZGVsZXRlIHRoaXMuX2Rpc3RhbmNlLCBkZWxldGUgdGhpcy5fc3RhcnREaXN0YW5jZTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0RGlzdGFuY2UgPSB0aGlzLl9kaXN0YW5jZSA9IHRbMF0uZGlzdCh0WzFdKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9kaXN0YW5jZTtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3RhbmNlID0gdFswXS5kaXN0KHRbMV0pLCB0aGlzLl9hY3RpdmUgfHwgIShNYXRoLmFicyhRbyh0aGlzLl9kaXN0YW5jZSwgdGhpcy5fc3RhcnREaXN0YW5jZSkpIDwgLjEpKSByZXR1cm4gdGhpcy5fYWN0aXZlID0gITAsIHtcbiAgICAgICAgICB6b29tRGVsdGE6IFFvKHRoaXMuX2Rpc3RhbmNlLCBpKSxcbiAgICAgICAgICBwaW5jaEFyb3VuZDogZVxuICAgICAgICB9O1xuICAgICAgfSwgZTtcbiAgICB9KFlvKTtcblxuICAgIGZ1bmN0aW9uIHRyKHQsIGUpIHtcbiAgICAgIHJldHVybiAxODAgKiB0LmFuZ2xlV2l0aChlKSAvIE1hdGguUEk7XG4gICAgfVxuXG4gICAgdmFyIGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgICAgIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQgJiYgKGUuX19wcm90b19fID0gdCksIChlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gZSwgZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHQucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyksIGRlbGV0ZSB0aGlzLl9taW5EaWFtZXRlciwgZGVsZXRlIHRoaXMuX3N0YXJ0VmVjdG9yLCBkZWxldGUgdGhpcy5fdmVjdG9yO1xuICAgICAgfSwgZS5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc3RhcnRWZWN0b3IgPSB0aGlzLl92ZWN0b3IgPSB0WzBdLnN1Yih0WzFdKSwgdGhpcy5fbWluRGlhbWV0ZXIgPSB0WzBdLmRpc3QodFsxXSk7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fdmVjdG9yO1xuICAgICAgICBpZiAodGhpcy5fdmVjdG9yID0gdFswXS5zdWIodFsxXSksIHRoaXMuX2FjdGl2ZSB8fCAhdGhpcy5faXNCZWxvd1RocmVzaG9sZCh0aGlzLl92ZWN0b3IpKSByZXR1cm4gdGhpcy5fYWN0aXZlID0gITAsIHtcbiAgICAgICAgICBiZWFyaW5nRGVsdGE6IHRyKHRoaXMuX3ZlY3RvciwgaSksXG4gICAgICAgICAgcGluY2hBcm91bmQ6IGVcbiAgICAgICAgfTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9pc0JlbG93VGhyZXNob2xkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fbWluRGlhbWV0ZXIgPSBNYXRoLm1pbih0aGlzLl9taW5EaWFtZXRlciwgdC5tYWcoKSk7XG4gICAgICAgIHZhciBlID0gMjUgLyAoTWF0aC5QSSAqIHRoaXMuX21pbkRpYW1ldGVyKSAqIDM2MCxcbiAgICAgICAgICAgIGkgPSB0cih0LCB0aGlzLl9zdGFydFZlY3Rvcik7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhpKSA8IGU7XG4gICAgICB9LCBlO1xuICAgIH0oWW8pO1xuXG4gICAgZnVuY3Rpb24gaXIodCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHQueSkgPiBNYXRoLmFicyh0LngpO1xuICAgIH1cblxuICAgIHZhciBvciA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgICB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ICYmIChlLl9fcHJvdG9fXyA9IHQpLCAoZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQgJiYgdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGUsIGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0LnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpLCB0aGlzLl92YWxpZCA9IHZvaWQgMCwgZGVsZXRlIHRoaXMuX2ZpcnN0TW92ZSwgZGVsZXRlIHRoaXMuX2xhc3RQb2ludHM7XG4gICAgICB9LCBlLnByb3RvdHlwZS5fc3RhcnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9sYXN0UG9pbnRzID0gdCwgaXIodFswXS5zdWIodFsxXSkpICYmICh0aGlzLl92YWxpZCA9ICExKTtcbiAgICAgIH0sIGUucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0WzBdLnN1Yih0aGlzLl9sYXN0UG9pbnRzWzBdKSxcbiAgICAgICAgICAgIHIgPSB0WzFdLnN1Yih0aGlzLl9sYXN0UG9pbnRzWzFdKTtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkID0gdGhpcy5nZXN0dXJlQmVnaW5zVmVydGljYWxseShvLCByLCBpLnRpbWVTdGFtcCksIHRoaXMuX3ZhbGlkKSByZXR1cm4gdGhpcy5fbGFzdFBvaW50cyA9IHQsIHRoaXMuX2FjdGl2ZSA9ICEwLCB7XG4gICAgICAgICAgcGl0Y2hEZWx0YTogKG8ueSArIHIueSkgLyAyICogLS41XG4gICAgICAgIH07XG4gICAgICB9LCBlLnByb3RvdHlwZS5nZXN0dXJlQmVnaW5zVmVydGljYWxseSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMuX3ZhbGlkKSByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gICAgICAgIHZhciBvID0gdC5tYWcoKSA+PSAyLFxuICAgICAgICAgICAgciA9IGUubWFnKCkgPj0gMjtcblxuICAgICAgICBpZiAobyB8fCByKSB7XG4gICAgICAgICAgaWYgKCFvIHx8ICFyKSByZXR1cm4gdm9pZCAwID09PSB0aGlzLl9maXJzdE1vdmUgJiYgKHRoaXMuX2ZpcnN0TW92ZSA9IGkpLCBpIC0gdGhpcy5fZmlyc3RNb3ZlIDwgMTAwICYmIHZvaWQgMDtcbiAgICAgICAgICB2YXIgYSA9IHQueSA+IDAgPT0gZS55ID4gMDtcbiAgICAgICAgICByZXR1cm4gaXIodCkgJiYgaXIoZSkgJiYgYTtcbiAgICAgICAgfVxuICAgICAgfSwgZTtcbiAgICB9KFlvKSxcbiAgICAgICAgcnIgPSB7XG4gICAgICBwYW5TdGVwOiAxMDAsXG4gICAgICBiZWFyaW5nU3RlcDogMTUsXG4gICAgICBwaXRjaFN0ZXA6IDEwXG4gICAgfSxcbiAgICAgICAgYXIgPSBmdW5jdGlvbiBhcigpIHtcbiAgICAgIHZhciB0ID0gcnI7XG4gICAgICB0aGlzLl9wYW5TdGVwID0gdC5wYW5TdGVwLCB0aGlzLl9iZWFyaW5nU3RlcCA9IHQuYmVhcmluZ1N0ZXAsIHRoaXMuX3BpdGNoU3RlcCA9IHQucGl0Y2hTdGVwLCB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gITE7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG5yKHQpIHtcbiAgICAgIHJldHVybiB0ICogKDIgLSB0KTtcbiAgICB9XG5cbiAgICBhci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMTtcbiAgICB9LCBhci5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHRoaXM7XG5cbiAgICAgIGlmICghKHQuYWx0S2V5IHx8IHQuY3RybEtleSB8fCB0Lm1ldGFLZXkpKSB7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgIG8gPSAwLFxuICAgICAgICAgICAgciA9IDAsXG4gICAgICAgICAgICBhID0gMCxcbiAgICAgICAgICAgIG4gPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodC5rZXlDb2RlKSB7XG4gICAgICAgICAgY2FzZSA2MTpcbiAgICAgICAgICBjYXNlIDEwNzpcbiAgICAgICAgICBjYXNlIDE3MTpcbiAgICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgIGkgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDE4OTpcbiAgICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgICBjYXNlIDE3MzpcbiAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHQuc2hpZnRLZXkgPyBvID0gLTEgOiAodC5wcmV2ZW50RGVmYXVsdCgpLCBhID0gLTEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgdC5zaGlmdEtleSA/IG8gPSAxIDogKHQucHJldmVudERlZmF1bHQoKSwgYSA9IDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgdC5zaGlmdEtleSA/IHIgPSAxIDogKHQucHJldmVudERlZmF1bHQoKSwgbiA9IC0xKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIHQuc2hpZnRLZXkgPyByID0gLTEgOiAodC5wcmV2ZW50RGVmYXVsdCgpLCBuID0gMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb25EaXNhYmxlZCAmJiAobyA9IDAsIHIgPSAwKSwge1xuICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogZnVuY3Rpb24gY2FtZXJhQW5pbWF0aW9uKHMpIHtcbiAgICAgICAgICAgIHZhciBsID0gcy5nZXRab29tKCk7XG4gICAgICAgICAgICBzLmVhc2VUbyh7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgIGVhc2VJZDogXCJrZXlib2FyZEhhbmRsZXJcIixcbiAgICAgICAgICAgICAgZWFzaW5nOiBucixcbiAgICAgICAgICAgICAgem9vbTogaSA/IE1hdGgucm91bmQobCkgKyBpICogKHQuc2hpZnRLZXkgPyAyIDogMSkgOiBsLFxuICAgICAgICAgICAgICBiZWFyaW5nOiBzLmdldEJlYXJpbmcoKSArIG8gKiBlLl9iZWFyaW5nU3RlcCxcbiAgICAgICAgICAgICAgcGl0Y2g6IHMuZ2V0UGl0Y2goKSArIHIgKiBlLl9waXRjaFN0ZXAsXG4gICAgICAgICAgICAgIG9mZnNldDogWy1hICogZS5fcGFuU3RlcCwgLW4gKiBlLl9wYW5TdGVwXSxcbiAgICAgICAgICAgICAgY2VudGVyOiBzLmdldENlbnRlcigpXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBhci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwO1xuICAgIH0sIGFyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICExLCB0aGlzLnJlc2V0KCk7XG4gICAgfSwgYXIucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH0sIGFyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfSwgYXIucHJvdG90eXBlLmRpc2FibGVSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSAhMDtcbiAgICB9LCBhci5wcm90b3R5cGUuZW5hYmxlUm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gITE7XG4gICAgfTtcblxuICAgIHZhciBzciA9IGZ1bmN0aW9uIHNyKGUsIGkpIHtcbiAgICAgIHRoaXMuX21hcCA9IGUsIHRoaXMuX2VsID0gZS5nZXRDYW52YXNDb250YWluZXIoKSwgdGhpcy5faGFuZGxlciA9IGksIHRoaXMuX2RlbHRhID0gMCwgdGhpcy5fZGVmYXVsdFpvb21SYXRlID0gLjAxLCB0aGlzLl93aGVlbFpvb21SYXRlID0gMSAvIDQ1MCwgdC5iaW5kQWxsKFtcIl9vblRpbWVvdXRcIl0sIHRoaXMpO1xuICAgIH07XG5cbiAgICBzci5wcm90b3R5cGUuc2V0Wm9vbVJhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fZGVmYXVsdFpvb21SYXRlID0gdDtcbiAgICB9LCBzci5wcm90b3R5cGUuc2V0V2hlZWxab29tUmF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLl93aGVlbFpvb21SYXRlID0gdDtcbiAgICB9LCBzci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9LCBzci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmUgfHwgdm9pZCAwICE9PSB0aGlzLl9maW5pc2hUaW1lb3V0O1xuICAgIH0sIHNyLnByb3RvdHlwZS5pc1pvb21pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLl96b29taW5nO1xuICAgIH0sIHNyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5pc0VuYWJsZWQoKSB8fCAodGhpcy5fZW5hYmxlZCA9ICEwLCB0aGlzLl9hcm91bmRDZW50ZXIgPSB0ICYmIFwiY2VudGVyXCIgPT09IHQuYXJvdW5kKTtcbiAgICB9LCBzci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaXNFbmFibGVkKCkgJiYgKHRoaXMuX2VuYWJsZWQgPSAhMSk7XG4gICAgfSwgc3IucHJvdG90eXBlLndoZWVsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBpID0gZS5kZWx0YU1vZGUgPT09IHQud2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUgPyA0MCAqIGUuZGVsdGFZIDogZS5kZWx0YVksXG4gICAgICAgICAgICBvID0gdC5icm93c2VyLm5vdygpLFxuICAgICAgICAgICAgciA9IG8gLSAodGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lIHx8IDApO1xuICAgICAgICB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgPSBvLCAwICE9PSBpICYmIGkgJSA0LjAwMDI0NDE0MDYyNSA9PSAwID8gdGhpcy5fdHlwZSA9IFwid2hlZWxcIiA6IDAgIT09IGkgJiYgTWF0aC5hYnMoaSkgPCA0ID8gdGhpcy5fdHlwZSA9IFwidHJhY2twYWRcIiA6IHIgPiA0MDAgPyAodGhpcy5fdHlwZSA9IG51bGwsIHRoaXMuX2xhc3RWYWx1ZSA9IGksIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwgNDAsIGUpKSA6IHRoaXMuX3R5cGUgfHwgKHRoaXMuX3R5cGUgPSBNYXRoLmFicyhyICogaSkgPCAyMDAgPyBcInRyYWNrcGFkXCIgOiBcIndoZWVsXCIsIHRoaXMuX3RpbWVvdXQgJiYgKGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSwgdGhpcy5fdGltZW91dCA9IG51bGwsIGkgKz0gdGhpcy5fbGFzdFZhbHVlKSksIGUuc2hpZnRLZXkgJiYgaSAmJiAoaSAvPSA0KSwgdGhpcy5fdHlwZSAmJiAodGhpcy5fbGFzdFdoZWVsRXZlbnQgPSBlLCB0aGlzLl9kZWx0YSAtPSBpLCB0aGlzLl9hY3RpdmUgfHwgdGhpcy5fc3RhcnQoZSkpLCBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSwgc3IucHJvdG90eXBlLl9vblRpbWVvdXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fdHlwZSA9IFwid2hlZWxcIiwgdGhpcy5fZGVsdGEgLT0gdGhpcy5fbGFzdFZhbHVlLCB0aGlzLl9hY3RpdmUgfHwgdGhpcy5fc3RhcnQodCk7XG4gICAgfSwgc3IucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVJZCAmJiAodGhpcy5fZnJhbWVJZCA9IG51bGwpLCB0aGlzLl9hY3RpdmUgPSAhMCwgdGhpcy5pc1pvb21pbmcoKSB8fCAodGhpcy5fem9vbWluZyA9ICEwKSwgdGhpcy5fZmluaXNoVGltZW91dCAmJiAoY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmlzaFRpbWVvdXQpLCBkZWxldGUgdGhpcy5fZmluaXNoVGltZW91dCk7XG4gICAgICAgIHZhciBvID0gaS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIHRoaXMuX2Fyb3VuZCA9IHQuTG5nTGF0LmNvbnZlcnQodGhpcy5fYXJvdW5kQ2VudGVyID8gdGhpcy5fbWFwLmdldENlbnRlcigpIDogdGhpcy5fbWFwLnVucHJvamVjdChvKSksIHRoaXMuX2Fyb3VuZFBvaW50ID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHRoaXMuX2Fyb3VuZCksIHRoaXMuX2ZyYW1lSWQgfHwgKHRoaXMuX2ZyYW1lSWQgPSAhMCwgdGhpcy5faGFuZGxlci5fdHJpZ2dlclJlbmRlckZyYW1lKCkpO1xuICAgICAgfVxuICAgIH0sIHNyLnByb3RvdHlwZS5yZW5kZXJGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2ZyYW1lSWQgJiYgKHRoaXMuX2ZyYW1lSWQgPSBudWxsLCB0aGlzLmlzQWN0aXZlKCkpKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoMCAhPT0gdGhpcy5fZGVsdGEpIHtcbiAgICAgICAgICB2YXIgbyA9IFwid2hlZWxcIiA9PT0gdGhpcy5fdHlwZSAmJiBNYXRoLmFicyh0aGlzLl9kZWx0YSkgPiA0LjAwMDI0NDE0MDYyNSA/IHRoaXMuX3doZWVsWm9vbVJhdGUgOiB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUsXG4gICAgICAgICAgICAgIHIgPSAyIC8gKDEgKyBNYXRoLmV4cCgtTWF0aC5hYnModGhpcy5fZGVsdGEgKiBvKSkpO1xuICAgICAgICAgIHRoaXMuX2RlbHRhIDwgMCAmJiAwICE9PSByICYmIChyID0gMSAvIHIpO1xuICAgICAgICAgIHZhciBhID0gXCJudW1iZXJcIiA9PSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA/IGkuem9vbVNjYWxlKHRoaXMuX3RhcmdldFpvb20pIDogaS5zY2FsZTtcbiAgICAgICAgICB0aGlzLl90YXJnZXRab29tID0gTWF0aC5taW4oaS5tYXhab29tLCBNYXRoLm1heChpLm1pblpvb20sIGkuc2NhbGVab29tKGEgKiByKSkpLCBcIndoZWVsXCIgPT09IHRoaXMuX3R5cGUgJiYgKHRoaXMuX3N0YXJ0Wm9vbSA9IGkuem9vbSwgdGhpcy5fZWFzaW5nID0gdGhpcy5fc21vb3RoT3V0RWFzaW5nKDIwMCkpLCB0aGlzLl9kZWx0YSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbixcbiAgICAgICAgICAgIHMgPSBcIm51bWJlclwiID09IHR5cGVvZiB0aGlzLl90YXJnZXRab29tID8gdGhpcy5fdGFyZ2V0Wm9vbSA6IGkuem9vbSxcbiAgICAgICAgICAgIGwgPSB0aGlzLl9zdGFydFpvb20sXG4gICAgICAgICAgICBjID0gdGhpcy5fZWFzaW5nLFxuICAgICAgICAgICAgdSA9ICExO1xuXG4gICAgICAgIGlmIChcIndoZWVsXCIgPT09IHRoaXMuX3R5cGUgJiYgbCAmJiBjKSB7XG4gICAgICAgICAgdmFyIGggPSBNYXRoLm1pbigodC5icm93c2VyLm5vdygpIC0gdGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lKSAvIDIwMCwgMSksXG4gICAgICAgICAgICAgIHAgPSBjKGgpO1xuICAgICAgICAgIG4gPSB0Lm51bWJlcihsLCBzLCBwKSwgaCA8IDEgPyB0aGlzLl9mcmFtZUlkIHx8ICh0aGlzLl9mcmFtZUlkID0gITApIDogdSA9ICEwO1xuICAgICAgICB9IGVsc2UgbiA9IHMsIHUgPSAhMDtcblxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlID0gITAsIHUgJiYgKHRoaXMuX2FjdGl2ZSA9ICExLCB0aGlzLl9maW5pc2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZS5fem9vbWluZyA9ICExLCBlLl9oYW5kbGVyLl90cmlnZ2VyUmVuZGVyRnJhbWUoKSwgZGVsZXRlIGUuX3RhcmdldFpvb20sIGRlbGV0ZSBlLl9maW5pc2hUaW1lb3V0O1xuICAgICAgICB9LCAyMDApKSwge1xuICAgICAgICAgIG5vSW5lcnRpYTogITAsXG4gICAgICAgICAgbmVlZHNSZW5kZXJGcmFtZTogIXUsXG4gICAgICAgICAgem9vbURlbHRhOiBuIC0gaS56b29tLFxuICAgICAgICAgIGFyb3VuZDogdGhpcy5fYXJvdW5kUG9pbnQsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBzci5wcm90b3R5cGUuX3Ntb290aE91dEVhc2luZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaSA9IHQuZWFzZTtcblxuICAgICAgaWYgKHRoaXMuX3ByZXZFYXNlKSB7XG4gICAgICAgIHZhciBvID0gdGhpcy5fcHJldkVhc2UsXG4gICAgICAgICAgICByID0gKHQuYnJvd3Nlci5ub3coKSAtIG8uc3RhcnQpIC8gby5kdXJhdGlvbixcbiAgICAgICAgICAgIGEgPSBvLmVhc2luZyhyICsgLjAxKSAtIG8uZWFzaW5nKHIpLFxuICAgICAgICAgICAgbiA9IC4yNyAvIE1hdGguc3FydChhICogYSArIDFlLTQpICogLjAxLFxuICAgICAgICAgICAgcyA9IE1hdGguc3FydCguMDcyOSAtIG4gKiBuKTtcbiAgICAgICAgaSA9IHQuYmV6aWVyKG4sIHMsIC4yNSwgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9wcmV2RWFzZSA9IHtcbiAgICAgICAgc3RhcnQ6IHQuYnJvd3Nlci5ub3coKSxcbiAgICAgICAgZHVyYXRpb246IGUsXG4gICAgICAgIGVhc2luZzogaVxuICAgICAgfSwgaTtcbiAgICB9LCBzci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMTtcbiAgICB9O1xuXG4gICAgdmFyIGxyID0gZnVuY3Rpb24gbHIodCwgZSkge1xuICAgICAgdGhpcy5fY2xpY2tab29tID0gdCwgdGhpcy5fdGFwWm9vbSA9IGU7XG4gICAgfTtcblxuICAgIGxyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jbGlja1pvb20uZW5hYmxlKCksIHRoaXMuX3RhcFpvb20uZW5hYmxlKCk7XG4gICAgfSwgbHIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jbGlja1pvb20uZGlzYWJsZSgpLCB0aGlzLl90YXBab29tLmRpc2FibGUoKTtcbiAgICB9LCBsci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsaWNrWm9vbS5pc0VuYWJsZWQoKSAmJiB0aGlzLl90YXBab29tLmlzRW5hYmxlZCgpO1xuICAgIH0sIGxyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGlja1pvb20uaXNBY3RpdmUoKSB8fCB0aGlzLl90YXBab29tLmlzQWN0aXZlKCk7XG4gICAgfTtcblxuICAgIHZhciBjciA9IGZ1bmN0aW9uIGNyKCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBjci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSAhMTtcbiAgICB9LCBjci5wcm90b3R5cGUuZGJsY2xpY2sgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwge1xuICAgICAgICBjYW1lcmFBbmltYXRpb246IGZ1bmN0aW9uIGNhbWVyYUFuaW1hdGlvbihpKSB7XG4gICAgICAgICAgaS5lYXNlVG8oe1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIHpvb206IGkuZ2V0Wm9vbSgpICsgKHQuc2hpZnRLZXkgPyAtMSA6IDEpLFxuICAgICAgICAgICAgYXJvdW5kOiBpLnVucHJvamVjdChlKVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBjci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICEwO1xuICAgIH0sIGNyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA9ICExLCB0aGlzLnJlc2V0KCk7XG4gICAgfSwgY3IucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH0sIGNyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfTtcblxuICAgIHZhciB1ciA9IGZ1bmN0aW9uIHVyKCkge1xuICAgICAgdGhpcy5fdGFwID0gbmV3IHFvKHtcbiAgICAgICAgbnVtVG91Y2hlczogMSxcbiAgICAgICAgbnVtVGFwczogMVxuICAgICAgfSksIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgdXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gITEsIGRlbGV0ZSB0aGlzLl9zd2lwZVBvaW50LCBkZWxldGUgdGhpcy5fc3dpcGVUb3VjaCwgZGVsZXRlIHRoaXMuX3RhcFRpbWUsIHRoaXMuX3RhcC5yZXNldCgpO1xuICAgIH0sIHVyLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3N3aXBlUG9pbnQgfHwgKHRoaXMuX3RhcFRpbWUgJiYgdC50aW1lU3RhbXAgLSB0aGlzLl90YXBUaW1lID4gNTAwICYmIHRoaXMucmVzZXQoKSwgdGhpcy5fdGFwVGltZSA/IGkubGVuZ3RoID4gMCAmJiAodGhpcy5fc3dpcGVQb2ludCA9IGVbMF0sIHRoaXMuX3N3aXBlVG91Y2ggPSBpWzBdLmlkZW50aWZpZXIpIDogdGhpcy5fdGFwLnRvdWNoc3RhcnQodCwgZSwgaSkpO1xuICAgIH0sIHVyLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgaWYgKHRoaXMuX3RhcFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N3aXBlUG9pbnQpIHtcbiAgICAgICAgICBpZiAoaVswXS5pZGVudGlmaWVyICE9PSB0aGlzLl9zd2lwZVRvdWNoKSByZXR1cm47XG4gICAgICAgICAgdmFyIG8gPSBlWzBdLFxuICAgICAgICAgICAgICByID0gby55IC0gdGhpcy5fc3dpcGVQb2ludC55O1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zd2lwZVBvaW50ID0gbywgdC5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLl9hY3RpdmUgPSAhMCwge1xuICAgICAgICAgICAgem9vbURlbHRhOiByIC8gMTI4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHRoaXMuX3RhcC50b3VjaG1vdmUodCwgZSwgaSk7XG4gICAgfSwgdXIucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3RhcFRpbWUgPyB0aGlzLl9zd2lwZVBvaW50ICYmIDAgPT09IGkubGVuZ3RoICYmIHRoaXMucmVzZXQoKSA6IHRoaXMuX3RhcC50b3VjaGVuZCh0LCBlLCBpKSAmJiAodGhpcy5fdGFwVGltZSA9IHQudGltZVN0YW1wKTtcbiAgICB9LCB1ci5wcm90b3R5cGUudG91Y2hjYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSwgdXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMDtcbiAgICB9LCB1ci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSAhMSwgdGhpcy5yZXNldCgpO1xuICAgIH0sIHVyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9LCB1ci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH07XG5cbiAgICB2YXIgaHIgPSBmdW5jdGlvbiBocih0LCBlLCBpKSB7XG4gICAgICB0aGlzLl9lbCA9IHQsIHRoaXMuX21vdXNlUGFuID0gZSwgdGhpcy5fdG91Y2hQYW4gPSBpO1xuICAgIH07XG5cbiAgICBoci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuX2luZXJ0aWFPcHRpb25zID0gdCB8fCB7fSwgdGhpcy5fbW91c2VQYW4uZW5hYmxlKCksIHRoaXMuX3RvdWNoUGFuLmVuYWJsZSgpLCB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC10b3VjaC1kcmFnLXBhblwiKTtcbiAgICB9LCBoci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX21vdXNlUGFuLmRpc2FibGUoKSwgdGhpcy5fdG91Y2hQYW4uZGlzYWJsZSgpLCB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC10b3VjaC1kcmFnLXBhblwiKTtcbiAgICB9LCBoci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzRW5hYmxlZCgpICYmIHRoaXMuX3RvdWNoUGFuLmlzRW5hYmxlZCgpO1xuICAgIH0sIGhyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb3VzZVBhbi5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RvdWNoUGFuLmlzQWN0aXZlKCk7XG4gICAgfTtcblxuICAgIHZhciBwciA9IGZ1bmN0aW9uIHByKHQsIGUsIGkpIHtcbiAgICAgIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSA9IHQucGl0Y2hXaXRoUm90YXRlLCB0aGlzLl9tb3VzZVJvdGF0ZSA9IGUsIHRoaXMuX21vdXNlUGl0Y2ggPSBpO1xuICAgIH07XG5cbiAgICBwci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZW5hYmxlKCksIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSAmJiB0aGlzLl9tb3VzZVBpdGNoLmVuYWJsZSgpO1xuICAgIH0sIHByLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZGlzYWJsZSgpLCB0aGlzLl9tb3VzZVBpdGNoLmRpc2FibGUoKTtcbiAgICB9LCBwci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUm90YXRlLmlzRW5hYmxlZCgpICYmICghdGhpcy5fcGl0Y2hXaXRoUm90YXRlIHx8IHRoaXMuX21vdXNlUGl0Y2guaXNFbmFibGVkKCkpO1xuICAgIH0sIHByLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb3VzZVJvdGF0ZS5pc0FjdGl2ZSgpIHx8IHRoaXMuX21vdXNlUGl0Y2guaXNBY3RpdmUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGRyID0gZnVuY3Rpb24gZHIodCwgZSwgaSwgbykge1xuICAgICAgdGhpcy5fZWwgPSB0LCB0aGlzLl90b3VjaFpvb20gPSBlLCB0aGlzLl90b3VjaFJvdGF0ZSA9IGksIHRoaXMuX3RhcERyYWdab29tID0gbywgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICExLCB0aGlzLl9lbmFibGVkID0gITA7XG4gICAgfTtcblxuICAgIGRyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fdG91Y2hab29tLmVuYWJsZSh0KSwgdGhpcy5fcm90YXRpb25EaXNhYmxlZCB8fCB0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUodCksIHRoaXMuX3RhcERyYWdab29tLmVuYWJsZSgpLCB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC10b3VjaC16b29tLXJvdGF0ZVwiKTtcbiAgICB9LCBkci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3RvdWNoWm9vbS5kaXNhYmxlKCksIHRoaXMuX3RvdWNoUm90YXRlLmRpc2FibGUoKSwgdGhpcy5fdGFwRHJhZ1pvb20uZGlzYWJsZSgpLCB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC10b3VjaC16b29tLXJvdGF0ZVwiKTtcbiAgICB9LCBkci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvdWNoWm9vbS5pc0VuYWJsZWQoKSAmJiAodGhpcy5fcm90YXRpb25EaXNhYmxlZCB8fCB0aGlzLl90b3VjaFJvdGF0ZS5pc0VuYWJsZWQoKSkgJiYgdGhpcy5fdGFwRHJhZ1pvb20uaXNFbmFibGVkKCk7XG4gICAgfSwgZHIucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvdWNoWm9vbS5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RvdWNoUm90YXRlLmlzQWN0aXZlKCkgfHwgdGhpcy5fdGFwRHJhZ1pvb20uaXNBY3RpdmUoKTtcbiAgICB9LCBkci5wcm90b3R5cGUuZGlzYWJsZVJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICEwLCB0aGlzLl90b3VjaFJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgfSwgZHIucHJvdG90eXBlLmVuYWJsZVJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9ICExLCB0aGlzLl90b3VjaFpvb20uaXNFbmFibGVkKCkgJiYgdGhpcy5fdG91Y2hSb3RhdGUuZW5hYmxlKCk7XG4gICAgfTtcblxuICAgIHZhciBfciA9IGZ1bmN0aW9uIF9yKHQpIHtcbiAgICAgIHJldHVybiB0Lnpvb20gfHwgdC5kcmFnIHx8IHQucGl0Y2ggfHwgdC5yb3RhdGU7XG4gICAgfSxcbiAgICAgICAgZnIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdCAmJiAoZS5fX3Byb3RvX18gPSB0KSwgKGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0ICYmIHQucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBlLCBlO1xuICAgIH0odC5FdmVudCk7XG5cbiAgICBmdW5jdGlvbiBtcih0KSB7XG4gICAgICByZXR1cm4gdC5wYW5EZWx0YSAmJiB0LnBhbkRlbHRhLm1hZygpIHx8IHQuem9vbURlbHRhIHx8IHQuYmVhcmluZ0RlbHRhIHx8IHQucGl0Y2hEZWx0YTtcbiAgICB9XG5cbiAgICB2YXIgZ3IgPSBmdW5jdGlvbiBncihlLCBvKSB7XG4gICAgICB0aGlzLl9tYXAgPSBlLCB0aGlzLl9lbCA9IHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKSwgdGhpcy5faGFuZGxlcnMgPSBbXSwgdGhpcy5faGFuZGxlcnNCeUlkID0ge30sIHRoaXMuX2NoYW5nZXMgPSBbXSwgdGhpcy5faW5lcnRpYSA9IG5ldyBBbyhlKSwgdGhpcy5fYmVhcmluZ1NuYXAgPSBvLmJlYXJpbmdTbmFwLCB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzID0ge30sIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MgPSB7fSwgdGhpcy5fYWRkRGVmYXVsdEhhbmRsZXJzKG8pLCB0LmJpbmRBbGwoW1wiaGFuZGxlRXZlbnRcIiwgXCJoYW5kbGVXaW5kb3dFdmVudFwiXSwgdGhpcyk7XG4gICAgICB2YXIgciA9IHRoaXMuX2VsO1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW1tyLCBcInRvdWNoc3RhcnRcIiwge1xuICAgICAgICBwYXNzaXZlOiAhMFxuICAgICAgfV0sIFtyLCBcInRvdWNobW92ZVwiLCB7XG4gICAgICAgIHBhc3NpdmU6ICExXG4gICAgICB9XSwgW3IsIFwidG91Y2hlbmRcIiwgdm9pZCAwXSwgW3IsIFwidG91Y2hjYW5jZWxcIiwgdm9pZCAwXSwgW3IsIFwibW91c2Vkb3duXCIsIHZvaWQgMF0sIFtyLCBcIm1vdXNlbW92ZVwiLCB2b2lkIDBdLCBbciwgXCJtb3VzZXVwXCIsIHZvaWQgMF0sIFt0LndpbmRvdy5kb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwge1xuICAgICAgICBjYXB0dXJlOiAhMFxuICAgICAgfV0sIFt0LndpbmRvdy5kb2N1bWVudCwgXCJtb3VzZXVwXCIsIHZvaWQgMF0sIFtyLCBcIm1vdXNlb3ZlclwiLCB2b2lkIDBdLCBbciwgXCJtb3VzZW91dFwiLCB2b2lkIDBdLCBbciwgXCJkYmxjbGlja1wiLCB2b2lkIDBdLCBbciwgXCJjbGlja1wiLCB2b2lkIDBdLCBbciwgXCJrZXlkb3duXCIsIHtcbiAgICAgICAgY2FwdHVyZTogITFcbiAgICAgIH1dLCBbciwgXCJrZXl1cFwiLCB2b2lkIDBdLCBbciwgXCJ3aGVlbFwiLCB7XG4gICAgICAgIHBhc3NpdmU6ICExXG4gICAgICB9XSwgW3IsIFwiY29udGV4dG1lbnVcIiwgdm9pZCAwXSwgW3Qud2luZG93LCBcImJsdXJcIiwgdm9pZCAwXV07XG5cbiAgICAgIGZvciAodmFyIGEgPSAwLCBuID0gdGhpcy5fbGlzdGVuZXJzOyBhIDwgbi5sZW5ndGg7IGEgKz0gMSkge1xuICAgICAgICB2YXIgcyA9IG5bYV0sXG4gICAgICAgICAgICBsID0gc1swXTtcbiAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKGwsIHNbMV0sIGwgPT09IHQud2luZG93LmRvY3VtZW50ID8gdGhpcy5oYW5kbGVXaW5kb3dFdmVudCA6IHRoaXMuaGFuZGxlRXZlbnQsIHNbMl0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBnci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwLCBvID0gdGhpcy5fbGlzdGVuZXJzOyBlIDwgby5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICB2YXIgciA9IG9bZV0sXG4gICAgICAgICAgICBhID0gclswXTtcbiAgICAgICAgaS5yZW1vdmVFdmVudExpc3RlbmVyKGEsIHJbMV0sIGEgPT09IHQud2luZG93LmRvY3VtZW50ID8gdGhpcy5oYW5kbGVXaW5kb3dFdmVudCA6IHRoaXMuaGFuZGxlRXZlbnQsIHJbMl0pO1xuICAgICAgfVxuICAgIH0sIGdyLnByb3RvdHlwZS5fYWRkRGVmYXVsdEhhbmRsZXJzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5fbWFwLFxuICAgICAgICAgIGkgPSBlLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICB0aGlzLl9hZGQoXCJtYXBFdmVudFwiLCBuZXcgT28oZSwgdCkpO1xuXG4gICAgICB2YXIgbyA9IGUuYm94Wm9vbSA9IG5ldyBVbyhlLCB0KTtcblxuICAgICAgdGhpcy5fYWRkKFwiYm94Wm9vbVwiLCBvKTtcblxuICAgICAgdmFyIHIgPSBuZXcgam8oKSxcbiAgICAgICAgICBhID0gbmV3IGNyKCk7XG4gICAgICBlLmRvdWJsZUNsaWNrWm9vbSA9IG5ldyBscihhLCByKSwgdGhpcy5fYWRkKFwidGFwWm9vbVwiLCByKSwgdGhpcy5fYWRkKFwiY2xpY2tab29tXCIsIGEpO1xuICAgICAgdmFyIG4gPSBuZXcgdXIoKTtcblxuICAgICAgdGhpcy5fYWRkKFwidGFwRHJhZ1pvb21cIiwgbik7XG5cbiAgICAgIHZhciBzID0gZS50b3VjaFBpdGNoID0gbmV3IG9yKCk7XG5cbiAgICAgIHRoaXMuX2FkZChcInRvdWNoUGl0Y2hcIiwgcyk7XG5cbiAgICAgIHZhciBsID0gbmV3IFhvKHQpLFxuICAgICAgICAgIGMgPSBuZXcgSG8odCk7XG4gICAgICBlLmRyYWdSb3RhdGUgPSBuZXcgcHIodCwgbCwgYyksIHRoaXMuX2FkZChcIm1vdXNlUm90YXRlXCIsIGwsIFtcIm1vdXNlUGl0Y2hcIl0pLCB0aGlzLl9hZGQoXCJtb3VzZVBpdGNoXCIsIGMsIFtcIm1vdXNlUm90YXRlXCJdKTtcbiAgICAgIHZhciB1ID0gbmV3IFdvKHQpLFxuICAgICAgICAgIGggPSBuZXcgS28odCk7XG4gICAgICBlLmRyYWdQYW4gPSBuZXcgaHIoaSwgdSwgaCksIHRoaXMuX2FkZChcIm1vdXNlUGFuXCIsIHUpLCB0aGlzLl9hZGQoXCJ0b3VjaFBhblwiLCBoLCBbXCJ0b3VjaFpvb21cIiwgXCJ0b3VjaFJvdGF0ZVwiXSk7XG4gICAgICB2YXIgcCA9IG5ldyBlcigpLFxuICAgICAgICAgIGQgPSBuZXcgJG8oKTtcbiAgICAgIGUudG91Y2hab29tUm90YXRlID0gbmV3IGRyKGksIGQsIHAsIG4pLCB0aGlzLl9hZGQoXCJ0b3VjaFJvdGF0ZVwiLCBwLCBbXCJ0b3VjaFBhblwiLCBcInRvdWNoWm9vbVwiXSksIHRoaXMuX2FkZChcInRvdWNoWm9vbVwiLCBkLCBbXCJ0b3VjaFBhblwiLCBcInRvdWNoUm90YXRlXCJdKTtcblxuICAgICAgdmFyIF8gPSBlLnNjcm9sbFpvb20gPSBuZXcgc3IoZSwgdGhpcyk7XG5cbiAgICAgIHRoaXMuX2FkZChcInNjcm9sbFpvb21cIiwgXywgW1wibW91c2VQYW5cIl0pO1xuXG4gICAgICB2YXIgZiA9IGUua2V5Ym9hcmQgPSBuZXcgYXIoKTtcbiAgICAgIHRoaXMuX2FkZChcImtleWJvYXJkXCIsIGYpLCB0aGlzLl9hZGQoXCJibG9ja2FibGVNYXBFdmVudFwiLCBuZXcgRm8oZSkpO1xuXG4gICAgICBmb3IgKHZhciBtID0gMCwgZyA9IFtcImJveFpvb21cIiwgXCJkb3VibGVDbGlja1pvb21cIiwgXCJ0YXBEcmFnWm9vbVwiLCBcInRvdWNoUGl0Y2hcIiwgXCJkcmFnUm90YXRlXCIsIFwiZHJhZ1BhblwiLCBcInRvdWNoWm9vbVJvdGF0ZVwiLCBcInNjcm9sbFpvb21cIiwgXCJrZXlib2FyZFwiXTsgbSA8IGcubGVuZ3RoOyBtICs9IDEpIHtcbiAgICAgICAgdmFyIHYgPSBnW21dO1xuICAgICAgICB0LmludGVyYWN0aXZlICYmIHRbdl0gJiYgZVt2XS5lbmFibGUodFt2XSk7XG4gICAgICB9XG4gICAgfSwgZ3IucHJvdG90eXBlLl9hZGQgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdGhpcy5faGFuZGxlcnMucHVzaCh7XG4gICAgICAgIGhhbmRsZXJOYW1lOiB0LFxuICAgICAgICBoYW5kbGVyOiBlLFxuICAgICAgICBhbGxvd2VkOiBpXG4gICAgICB9KSwgdGhpcy5faGFuZGxlcnNCeUlkW3RdID0gZTtcbiAgICB9LCBnci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAoIXRoaXMuX3VwZGF0aW5nQ2FtZXJhKSB7XG4gICAgICAgIGZvciAodmFyIGUgPSAwLCBpID0gdGhpcy5faGFuZGxlcnM7IGUgPCBpLmxlbmd0aDsgZSArPSAxKSB7XG4gICAgICAgICAgaVtlXS5oYW5kbGVyLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbmVydGlhLmNsZWFyKCksIHRoaXMuX2ZpcmVFdmVudHMoe30sIHt9LCB0KSwgdGhpcy5fY2hhbmdlcyA9IFtdO1xuICAgICAgfVxuICAgIH0sIGdyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIHQgPSAwLCBlID0gdGhpcy5faGFuZGxlcnM7IHQgPCBlLmxlbmd0aDsgdCArPSAxKSB7XG4gICAgICAgIGlmIChlW3RdLmhhbmRsZXIuaXNBY3RpdmUoKSkgcmV0dXJuICEwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gITE7XG4gICAgfSwgZ3IucHJvdG90eXBlLmlzWm9vbWluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3Muem9vbSB8fCB0aGlzLl9tYXAuc2Nyb2xsWm9vbS5pc1pvb21pbmcoKTtcbiAgICB9LCBnci5wcm90b3R5cGUuaXNSb3RhdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3Mucm90YXRlO1xuICAgIH0sIGdyLnByb3RvdHlwZS5pc01vdmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKF9yKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpKSB8fCB0aGlzLmlzWm9vbWluZygpO1xuICAgIH0sIGdyLnByb3RvdHlwZS5fYmxvY2tlZEJ5QWN0aXZlID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgIGZvciAodmFyIG8gaW4gdCkge1xuICAgICAgICBpZiAobyAhPT0gaSAmJiAoIWUgfHwgZS5pbmRleE9mKG8pIDwgMCkpIHJldHVybiAhMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICExO1xuICAgIH0sIGdyLnByb3RvdHlwZS5oYW5kbGVXaW5kb3dFdmVudCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50KHQsIHQudHlwZSArIFwiV2luZG93XCIpO1xuICAgIH0sIGdyLnByb3RvdHlwZS5fZ2V0TWFwVG91Y2hlcyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gW10sIGkgPSAwLCBvID0gdDsgaSA8IG8ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHIgPSBvW2ldO1xuICAgICAgICB0aGlzLl9lbC5jb250YWlucyhyLnRhcmdldCkgJiYgZS5wdXNoKHIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9LCBnci5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKFwiYmx1clwiICE9PSB0LnR5cGUpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSAhMDtcblxuICAgICAgICBmb3IgKHZhciBvID0gXCJyZW5kZXJGcmFtZVwiID09PSB0LnR5cGUgPyB2b2lkIDAgOiB0LCByID0ge1xuICAgICAgICAgIG5lZWRzUmVuZGVyRnJhbWU6ICExXG4gICAgICAgIH0sIGEgPSB7fSwgbiA9IHt9LCBzID0gdC50b3VjaGVzID8gdGhpcy5fZ2V0TWFwVG91Y2hlcyh0LnRvdWNoZXMpIDogdm9pZCAwLCBsID0gcyA/IGkudG91Y2hQb3ModGhpcy5fZWwsIHMpIDogaS5tb3VzZVBvcyh0aGlzLl9lbCwgdCksIGMgPSAwLCB1ID0gdGhpcy5faGFuZGxlcnM7IGMgPCB1Lmxlbmd0aDsgYyArPSAxKSB7XG4gICAgICAgICAgdmFyIGggPSB1W2NdLFxuICAgICAgICAgICAgICBwID0gaC5oYW5kbGVyTmFtZSxcbiAgICAgICAgICAgICAgZCA9IGguaGFuZGxlcixcbiAgICAgICAgICAgICAgXyA9IGguYWxsb3dlZDtcblxuICAgICAgICAgIGlmIChkLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICB2YXIgZiA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRoaXMuX2Jsb2NrZWRCeUFjdGl2ZShuLCBfLCBwKSA/IGQucmVzZXQoKSA6IGRbZSB8fCB0LnR5cGVdICYmIChmID0gZFtlIHx8IHQudHlwZV0odCwgbCwgcyksIHRoaXMubWVyZ2VIYW5kbGVyUmVzdWx0KHIsIGEsIGYsIHAsIG8pLCBmICYmIGYubmVlZHNSZW5kZXJGcmFtZSAmJiB0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKSksIChmIHx8IGQuaXNBY3RpdmUoKSkgJiYgKG5bcF0gPSBkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGcgaW4gdGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycykge1xuICAgICAgICAgIG5bZ10gfHwgKG1bZ10gPSBvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMgPSBuLCAoT2JqZWN0LmtleXMobSkubGVuZ3RoIHx8IG1yKHIpKSAmJiAodGhpcy5fY2hhbmdlcy5wdXNoKFtyLCBhLCBtXSksIHRoaXMuX3RyaWdnZXJSZW5kZXJGcmFtZSgpKSwgKE9iamVjdC5rZXlzKG4pLmxlbmd0aCB8fCBtcihyKSkgJiYgdGhpcy5fbWFwLl9zdG9wKCEwKSwgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSAhMTtcbiAgICAgICAgdmFyIHYgPSByLmNhbWVyYUFuaW1hdGlvbjtcbiAgICAgICAgdiAmJiAodGhpcy5faW5lcnRpYS5jbGVhcigpLCB0aGlzLl9maXJlRXZlbnRzKHt9LCB7fSwgITApLCB0aGlzLl9jaGFuZ2VzID0gW10sIHYodGhpcy5fbWFwKSk7XG4gICAgICB9IGVsc2UgdGhpcy5zdG9wKCEwKTtcbiAgICB9LCBnci5wcm90b3R5cGUubWVyZ2VIYW5kbGVyUmVzdWx0ID0gZnVuY3Rpb24gKGUsIGksIG8sIHIsIGEpIHtcbiAgICAgIGlmIChvKSB7XG4gICAgICAgIHQuZXh0ZW5kKGUsIG8pO1xuICAgICAgICB2YXIgbiA9IHtcbiAgICAgICAgICBoYW5kbGVyTmFtZTogcixcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBvLm9yaWdpbmFsRXZlbnQgfHwgYVxuICAgICAgICB9O1xuICAgICAgICB2b2lkIDAgIT09IG8uem9vbURlbHRhICYmIChpLnpvb20gPSBuKSwgdm9pZCAwICE9PSBvLnBhbkRlbHRhICYmIChpLmRyYWcgPSBuKSwgdm9pZCAwICE9PSBvLnBpdGNoRGVsdGEgJiYgKGkucGl0Y2ggPSBuKSwgdm9pZCAwICE9PSBvLmJlYXJpbmdEZWx0YSAmJiAoaS5yb3RhdGUgPSBuKTtcbiAgICAgIH1cbiAgICB9LCBnci5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGUgPSB7fSwgaSA9IHt9LCBvID0ge30sIHIgPSAwLCBhID0gdGhpcy5fY2hhbmdlczsgciA8IGEubGVuZ3RoOyByICs9IDEpIHtcbiAgICAgICAgdmFyIG4gPSBhW3JdLFxuICAgICAgICAgICAgcyA9IG5bMF0sXG4gICAgICAgICAgICBsID0gblsxXSxcbiAgICAgICAgICAgIGMgPSBuWzJdO1xuICAgICAgICBzLnBhbkRlbHRhICYmIChlLnBhbkRlbHRhID0gKGUucGFuRGVsdGEgfHwgbmV3IHQuUG9pbnQoMCwgMCkpLl9hZGQocy5wYW5EZWx0YSkpLCBzLnpvb21EZWx0YSAmJiAoZS56b29tRGVsdGEgPSAoZS56b29tRGVsdGEgfHwgMCkgKyBzLnpvb21EZWx0YSksIHMuYmVhcmluZ0RlbHRhICYmIChlLmJlYXJpbmdEZWx0YSA9IChlLmJlYXJpbmdEZWx0YSB8fCAwKSArIHMuYmVhcmluZ0RlbHRhKSwgcy5waXRjaERlbHRhICYmIChlLnBpdGNoRGVsdGEgPSAoZS5waXRjaERlbHRhIHx8IDApICsgcy5waXRjaERlbHRhKSwgdm9pZCAwICE9PSBzLmFyb3VuZCAmJiAoZS5hcm91bmQgPSBzLmFyb3VuZCksIHZvaWQgMCAhPT0gcy5waW5jaEFyb3VuZCAmJiAoZS5waW5jaEFyb3VuZCA9IHMucGluY2hBcm91bmQpLCBzLm5vSW5lcnRpYSAmJiAoZS5ub0luZXJ0aWEgPSBzLm5vSW5lcnRpYSksIHQuZXh0ZW5kKGksIGwpLCB0LmV4dGVuZChvLCBjKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlTWFwVHJhbnNmb3JtKGUsIGksIG8pLCB0aGlzLl9jaGFuZ2VzID0gW107XG4gICAgfSwgZ3IucHJvdG90eXBlLl91cGRhdGVNYXBUcmFuc2Zvcm0gPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9tYXAsXG4gICAgICAgICAgciA9IG8udHJhbnNmb3JtO1xuICAgICAgaWYgKCFtcih0KSkgcmV0dXJuIHRoaXMuX2ZpcmVFdmVudHMoZSwgaSwgITApO1xuICAgICAgdmFyIGEgPSB0LnBhbkRlbHRhLFxuICAgICAgICAgIG4gPSB0Lnpvb21EZWx0YSxcbiAgICAgICAgICBzID0gdC5iZWFyaW5nRGVsdGEsXG4gICAgICAgICAgbCA9IHQucGl0Y2hEZWx0YSxcbiAgICAgICAgICBjID0gdC5hcm91bmQsXG4gICAgICAgICAgdSA9IHQucGluY2hBcm91bmQ7XG4gICAgICB2b2lkIDAgIT09IHUgJiYgKGMgPSB1KSwgby5fc3RvcCghMCksIGMgPSBjIHx8IG8udHJhbnNmb3JtLmNlbnRlclBvaW50O1xuICAgICAgdmFyIGggPSByLnBvaW50TG9jYXRpb24oYSA/IGMuc3ViKGEpIDogYyk7XG4gICAgICBzICYmIChyLmJlYXJpbmcgKz0gcyksIGwgJiYgKHIucGl0Y2ggKz0gbCksIG4gJiYgKHIuem9vbSArPSBuKSwgci5zZXRMb2NhdGlvbkF0UG9pbnQoaCwgYyksIHRoaXMuX21hcC5fdXBkYXRlKCksIHQubm9JbmVydGlhIHx8IHRoaXMuX2luZXJ0aWEucmVjb3JkKHQpLCB0aGlzLl9maXJlRXZlbnRzKGUsIGksICEwKTtcbiAgICB9LCBnci5wcm90b3R5cGUuX2ZpcmVFdmVudHMgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgdmFyIHIgPSB0aGlzLFxuICAgICAgICAgIGEgPSBfcih0aGlzLl9ldmVudHNJblByb2dyZXNzKSxcbiAgICAgICAgICBuID0gX3IoZSksXG4gICAgICAgICAgcyA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBsIGluIGUpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tsXSB8fCAoc1tsICsgXCJzdGFydFwiXSA9IGVbbF0ub3JpZ2luYWxFdmVudCksIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbbF0gPSBlW2xdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBjIGluICFhICYmIG4gJiYgdGhpcy5fZmlyZUV2ZW50KFwibW92ZXN0YXJ0XCIsIG4ub3JpZ2luYWxFdmVudCksIHMpIHtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KGMsIHNbY10pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB1IGluIG4gJiYgdGhpcy5fZmlyZUV2ZW50KFwibW92ZVwiLCBuLm9yaWdpbmFsRXZlbnQpLCBlKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCh1LCBlW3VdLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaCxcbiAgICAgICAgICBwID0ge307XG5cbiAgICAgIGZvciAodmFyIGQgaW4gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcykge1xuICAgICAgICB2YXIgXyA9IHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZF0sXG4gICAgICAgICAgICBmID0gXy5oYW5kbGVyTmFtZSxcbiAgICAgICAgICAgIG0gPSBfLm9yaWdpbmFsRXZlbnQ7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzQnlJZFtmXS5pc0FjdGl2ZSgpIHx8IChkZWxldGUgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tkXSwgcFtkICsgXCJlbmRcIl0gPSBoID0gaVtmXSB8fCBtKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgZyBpbiBwKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudChnLCBwW2ddKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHYgPSBfcih0aGlzLl9ldmVudHNJblByb2dyZXNzKTtcblxuICAgICAgaWYgKG8gJiYgKGEgfHwgbikgJiYgIXYpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSAhMDtcblxuICAgICAgICB2YXIgeSA9IHRoaXMuX2luZXJ0aWEuX29uTW92ZUVuZCh0aGlzLl9tYXAuZHJhZ1Bhbi5faW5lcnRpYU9wdGlvbnMpLFxuICAgICAgICAgICAgeCA9IGZ1bmN0aW9uIHgodCkge1xuICAgICAgICAgIHJldHVybiAwICE9PSB0ICYmIC1yLl9iZWFyaW5nU25hcCA8IHQgJiYgdCA8IHIuX2JlYXJpbmdTbmFwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHkgPyAoeCh5LmJlYXJpbmcgfHwgdGhpcy5fbWFwLmdldEJlYXJpbmcoKSkgJiYgKHkuYmVhcmluZyA9IDApLCB0aGlzLl9tYXAuZWFzZVRvKHksIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBoXG4gICAgICAgIH0pKSA6ICh0aGlzLl9tYXAuZmlyZShuZXcgdC5FdmVudChcIm1vdmVlbmRcIiwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGhcbiAgICAgICAgfSkpLCB4KHRoaXMuX21hcC5nZXRCZWFyaW5nKCkpICYmIHRoaXMuX21hcC5yZXNldE5vcnRoKCkpLCB0aGlzLl91cGRhdGluZ0NhbWVyYSA9ICExO1xuICAgICAgfVxuICAgIH0sIGdyLnByb3RvdHlwZS5fZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIHRoaXMuX21hcC5maXJlKG5ldyB0LkV2ZW50KGUsIGkgPyB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGlcbiAgICAgIH0gOiB7fSkpO1xuICAgIH0sIGdyLnByb3RvdHlwZS5fcmVxdWVzdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC50cmlnZ2VyUmVwYWludCgpLCB0aGlzLl9tYXAuX3JlbmRlclRhc2tRdWV1ZS5hZGQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZGVsZXRlIHQuX2ZyYW1lSWQsIHQuaGFuZGxlRXZlbnQobmV3IGZyKFwicmVuZGVyRnJhbWVcIiwge1xuICAgICAgICAgIHRpbWVTdGFtcDogZVxuICAgICAgICB9KSksIHQuX2FwcGx5Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSwgZ3IucHJvdG90eXBlLl90cmlnZ2VyUmVuZGVyRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2b2lkIDAgPT09IHRoaXMuX2ZyYW1lSWQgJiYgKHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0RnJhbWUoKSk7XG4gICAgfTtcblxuICAgIHZhciB2ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBmdW5jdGlvbiBpKGksIG8pIHtcbiAgICAgICAgZS5jYWxsKHRoaXMpLCB0aGlzLl9tb3ZpbmcgPSAhMSwgdGhpcy5fem9vbWluZyA9ICExLCB0aGlzLnRyYW5zZm9ybSA9IGksIHRoaXMuX2JlYXJpbmdTbmFwID0gby5iZWFyaW5nU25hcCwgdC5iaW5kQWxsKFtcIl9yZW5kZXJGcmFtZUNhbGxiYWNrXCJdLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKGkuX19wcm90b19fID0gZSksIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5wcm90b3R5cGUuZ2V0Q2VudGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IHQuTG5nTGF0KHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcsIHRoaXMudHJhbnNmb3JtLmNlbnRlci5sYXQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0Q2VudGVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICBjZW50ZXI6IHRcbiAgICAgICAgfSwgZSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wYW5CeSA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiBlID0gdC5Qb2ludC5jb252ZXJ0KGUpLm11bHQoLTEpLCB0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlciwgdC5leHRlbmQoe1xuICAgICAgICAgIG9mZnNldDogZVxuICAgICAgICB9LCBpKSwgbyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5wYW5UbyA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh0LmV4dGVuZCh7XG4gICAgICAgICAgY2VudGVyOiBlXG4gICAgICAgIH0sIGkpLCBvKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFpvb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS56b29tO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0Wm9vbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgem9vbTogdFxuICAgICAgICB9LCBlKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnpvb21UbyA9IGZ1bmN0aW9uIChlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh0LmV4dGVuZCh7XG4gICAgICAgICAgem9vbTogZVxuICAgICAgICB9LCBpKSwgbyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS56b29tSW4gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgKyAxLCB0LCBlKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnpvb21PdXQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgLSAxLCB0LCBlKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldEJlYXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0QmVhcmluZyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgYmVhcmluZzogdFxuICAgICAgICB9LCBlKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmdldFBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wYWRkaW5nO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0UGFkZGluZyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgcGFkZGluZzogdFxuICAgICAgICB9LCBlKSwgdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLnJvdGF0ZVRvID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKHQuZXh0ZW5kKHtcbiAgICAgICAgICBiZWFyaW5nOiBlXG4gICAgICAgIH0sIGkpLCBvKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlc2V0Tm9ydGggPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGVUbygwLCB0LmV4dGVuZCh7XG4gICAgICAgICAgZHVyYXRpb246IDFlM1xuICAgICAgICB9LCBlKSwgaSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZXNldE5vcnRoUGl0Y2ggPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8odC5leHRlbmQoe1xuICAgICAgICAgIGJlYXJpbmc6IDAsXG4gICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgZHVyYXRpb246IDFlM1xuICAgICAgICB9LCBlKSwgaSksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zbmFwVG9Ob3J0aCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmdldEJlYXJpbmcoKSkgPCB0aGlzLl9iZWFyaW5nU25hcCA/IHRoaXMucmVzZXROb3J0aCh0LCBlKSA6IHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nZXRQaXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNoO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2V0UGl0Y2ggPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8oe1xuICAgICAgICAgIHBpdGNoOiB0XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuY2FtZXJhRm9yQm91bmRzID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgZSA9IHQuTG5nTGF0Qm91bmRzLmNvbnZlcnQoZSk7XG4gICAgICAgIHZhciBvID0gaSAmJiBpLmJlYXJpbmcgfHwgMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcoZS5nZXROb3J0aFdlc3QoKSwgZS5nZXRTb3V0aEVhc3QoKSwgbywgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyA9IGZ1bmN0aW9uIChlLCBpLCBvLCByKSB7XG4gICAgICAgIHZhciBhID0ge1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgbGVmdDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiAociA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICBwYWRkaW5nOiBhLFxuICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgIG1heFpvb206IHRoaXMudHJhbnNmb3JtLm1heFpvb21cbiAgICAgICAgfSwgcikpLnBhZGRpbmcpIHtcbiAgICAgICAgICB2YXIgbiA9IHIucGFkZGluZztcbiAgICAgICAgICByLnBhZGRpbmcgPSB7XG4gICAgICAgICAgICB0b3A6IG4sXG4gICAgICAgICAgICBib3R0b206IG4sXG4gICAgICAgICAgICByaWdodDogbixcbiAgICAgICAgICAgIGxlZnQ6IG5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgci5wYWRkaW5nID0gdC5leHRlbmQoYSwgci5wYWRkaW5nKTtcblxuICAgICAgICB2YXIgcyA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgbCA9IHMucGFkZGluZyxcbiAgICAgICAgICAgIGMgPSBzLnByb2plY3QodC5MbmdMYXQuY29udmVydChlKSksXG4gICAgICAgICAgICB1ID0gcy5wcm9qZWN0KHQuTG5nTGF0LmNvbnZlcnQoaSkpLFxuICAgICAgICAgICAgaCA9IGMucm90YXRlKC1vICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgICAgICBwID0gdS5yb3RhdGUoLW8gKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgICAgIGQgPSBuZXcgdC5Qb2ludChNYXRoLm1heChoLngsIHAueCksIE1hdGgubWF4KGgueSwgcC55KSksXG4gICAgICAgICAgICBfID0gbmV3IHQuUG9pbnQoTWF0aC5taW4oaC54LCBwLngpLCBNYXRoLm1pbihoLnksIHAueSkpLFxuICAgICAgICAgICAgZiA9IGQuc3ViKF8pLFxuICAgICAgICAgICAgbSA9IChzLndpZHRoIC0gKGwubGVmdCArIGwucmlnaHQgKyByLnBhZGRpbmcubGVmdCArIHIucGFkZGluZy5yaWdodCkpIC8gZi54LFxuICAgICAgICAgICAgZyA9IChzLmhlaWdodCAtIChsLnRvcCArIGwuYm90dG9tICsgci5wYWRkaW5nLnRvcCArIHIucGFkZGluZy5ib3R0b20pKSAvIGYueTtcblxuICAgICAgICBpZiAoIShnIDwgMCB8fCBtIDwgMCkpIHtcbiAgICAgICAgICB2YXIgdiA9IE1hdGgubWluKHMuc2NhbGVab29tKHMuc2NhbGUgKiBNYXRoLm1pbihtLCBnKSksIHIubWF4Wm9vbSksXG4gICAgICAgICAgICAgIHkgPSBcIm51bWJlclwiID09IHR5cGVvZiByLm9mZnNldC54ID8gbmV3IHQuUG9pbnQoci5vZmZzZXQueCwgci5vZmZzZXQueSkgOiB0LlBvaW50LmNvbnZlcnQoci5vZmZzZXQpLFxuICAgICAgICAgICAgICB4ID0gbmV3IHQuUG9pbnQoKHIucGFkZGluZy5sZWZ0IC0gci5wYWRkaW5nLnJpZ2h0KSAvIDIsIChyLnBhZGRpbmcudG9wIC0gci5wYWRkaW5nLmJvdHRvbSkgLyAyKS5yb3RhdGUobyAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICAgICAgICBiID0geS5hZGQoeCkubXVsdChzLnNjYWxlIC8gcy56b29tU2NhbGUodikpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXI6IHMudW5wcm9qZWN0KGMuYWRkKHUpLmRpdigyKS5zdWIoYikpLFxuICAgICAgICAgICAgem9vbTogdixcbiAgICAgICAgICAgIGJlYXJpbmc6IG9cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdC53YXJuT25jZShcIk1hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LlwiKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmZpdEJvdW5kcyA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXRJbnRlcm5hbCh0aGlzLmNhbWVyYUZvckJvdW5kcyh0LCBlKSwgZSwgaSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5maXRTY3JlZW5Db29yZGluYXRlcyA9IGZ1bmN0aW9uIChlLCBpLCBvLCByLCBhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXRJbnRlcm5hbCh0aGlzLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24odC5Qb2ludC5jb252ZXJ0KGUpKSwgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbih0LlBvaW50LmNvbnZlcnQoaSkpLCBvLCByKSwgciwgYSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fZml0SW50ZXJuYWwgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICByZXR1cm4gZSA/IChkZWxldGUgKGkgPSB0LmV4dGVuZChlLCBpKSkucGFkZGluZywgaS5saW5lYXIgPyB0aGlzLmVhc2VUbyhpLCBvKSA6IHRoaXMuZmx5VG8oaSwgbykpIDogdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmp1bXBUbyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB2YXIgbyA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgciA9ICExLFxuICAgICAgICAgICAgYSA9ICExLFxuICAgICAgICAgICAgbiA9ICExO1xuICAgICAgICByZXR1cm4gXCJ6b29tXCIgaW4gZSAmJiBvLnpvb20gIT09ICtlLnpvb20gJiYgKHIgPSAhMCwgby56b29tID0gK2Uuem9vbSksIHZvaWQgMCAhPT0gZS5jZW50ZXIgJiYgKG8uY2VudGVyID0gdC5MbmdMYXQuY29udmVydChlLmNlbnRlcikpLCBcImJlYXJpbmdcIiBpbiBlICYmIG8uYmVhcmluZyAhPT0gK2UuYmVhcmluZyAmJiAoYSA9ICEwLCBvLmJlYXJpbmcgPSArZS5iZWFyaW5nKSwgXCJwaXRjaFwiIGluIGUgJiYgby5waXRjaCAhPT0gK2UucGl0Y2ggJiYgKG4gPSAhMCwgby5waXRjaCA9ICtlLnBpdGNoKSwgbnVsbCA9PSBlLnBhZGRpbmcgfHwgby5pc1BhZGRpbmdFcXVhbChlLnBhZGRpbmcpIHx8IChvLnBhZGRpbmcgPSBlLnBhZGRpbmcpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJtb3Zlc3RhcnRcIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJtb3ZlXCIsIGkpKSwgciAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ6b29tc3RhcnRcIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJ6b29tXCIsIGkpKS5maXJlKG5ldyB0LkV2ZW50KFwiem9vbWVuZFwiLCBpKSksIGEgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicm90YXRlc3RhcnRcIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVcIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVlbmRcIiwgaSkpLCBuICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInBpdGNoc3RhcnRcIiwgaSkpLmZpcmUobmV3IHQuRXZlbnQoXCJwaXRjaFwiLCBpKSkuZmlyZShuZXcgdC5FdmVudChcInBpdGNoZW5kXCIsIGkpKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibW92ZWVuZFwiLCBpKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lYXNlVG8gPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N0b3AoITEsIGUuZWFzZUlkKSwgKCExID09PSAoZSA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgIGVhc2luZzogdC5lYXNlXG4gICAgICAgIH0sIGUpKS5hbmltYXRlIHx8ICFlLmVzc2VudGlhbCAmJiB0LmJyb3dzZXIucHJlZmVyc1JlZHVjZWRNb3Rpb24pICYmIChlLmR1cmF0aW9uID0gMCk7XG5cbiAgICAgICAgdmFyIHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIGEgPSB0aGlzLmdldFpvb20oKSxcbiAgICAgICAgICAgIG4gPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHMgPSB0aGlzLmdldFBpdGNoKCksXG4gICAgICAgICAgICBsID0gdGhpcy5nZXRQYWRkaW5nKCksXG4gICAgICAgICAgICBjID0gXCJ6b29tXCIgaW4gZSA/ICtlLnpvb20gOiBhLFxuICAgICAgICAgICAgdSA9IFwiYmVhcmluZ1wiIGluIGUgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKGUuYmVhcmluZywgbikgOiBuLFxuICAgICAgICAgICAgaCA9IFwicGl0Y2hcIiBpbiBlID8gK2UucGl0Y2ggOiBzLFxuICAgICAgICAgICAgcCA9IFwicGFkZGluZ1wiIGluIGUgPyBlLnBhZGRpbmcgOiByLnBhZGRpbmcsXG4gICAgICAgICAgICBkID0gdC5Qb2ludC5jb252ZXJ0KGUub2Zmc2V0KSxcbiAgICAgICAgICAgIF8gPSByLmNlbnRlclBvaW50LmFkZChkKSxcbiAgICAgICAgICAgIGYgPSByLnBvaW50TG9jYXRpb24oXyksXG4gICAgICAgICAgICBtID0gdC5MbmdMYXQuY29udmVydChlLmNlbnRlciB8fCBmKTtcblxuICAgICAgICB0aGlzLl9ub3JtYWxpemVDZW50ZXIobSk7XG5cbiAgICAgICAgdmFyIGcsXG4gICAgICAgICAgICB2LFxuICAgICAgICAgICAgeSA9IHIucHJvamVjdChmKSxcbiAgICAgICAgICAgIHggPSByLnByb2plY3QobSkuc3ViKHkpLFxuICAgICAgICAgICAgYiA9IHIuem9vbVNjYWxlKGMgLSBhKTtcbiAgICAgICAgZS5hcm91bmQgJiYgKGcgPSB0LkxuZ0xhdC5jb252ZXJ0KGUuYXJvdW5kKSwgdiA9IHIubG9jYXRpb25Qb2ludChnKSk7XG4gICAgICAgIHZhciB3ID0ge1xuICAgICAgICAgIG1vdmluZzogdGhpcy5fbW92aW5nLFxuICAgICAgICAgIHpvb21pbmc6IHRoaXMuX3pvb21pbmcsXG4gICAgICAgICAgcm90YXRpbmc6IHRoaXMuX3JvdGF0aW5nLFxuICAgICAgICAgIHBpdGNoaW5nOiB0aGlzLl9waXRjaGluZ1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fem9vbWluZyA9IHRoaXMuX3pvb21pbmcgfHwgYyAhPT0gYSwgdGhpcy5fcm90YXRpbmcgPSB0aGlzLl9yb3RhdGluZyB8fCBuICE9PSB1LCB0aGlzLl9waXRjaGluZyA9IHRoaXMuX3BpdGNoaW5nIHx8IGggIT09IHMsIHRoaXMuX3BhZGRpbmcgPSAhci5pc1BhZGRpbmdFcXVhbChwKSwgdGhpcy5fZWFzZUlkID0gZS5lYXNlSWQsIHRoaXMuX3ByZXBhcmVFYXNlKGksIGUubm9Nb3ZlU3RhcnQsIHcpLCB0aGlzLl9lYXNlKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgaWYgKG8uX3pvb21pbmcgJiYgKHIuem9vbSA9IHQubnVtYmVyKGEsIGMsIGUpKSwgby5fcm90YXRpbmcgJiYgKHIuYmVhcmluZyA9IHQubnVtYmVyKG4sIHUsIGUpKSwgby5fcGl0Y2hpbmcgJiYgKHIucGl0Y2ggPSB0Lm51bWJlcihzLCBoLCBlKSksIG8uX3BhZGRpbmcgJiYgKHIuaW50ZXJwb2xhdGVQYWRkaW5nKGwsIHAsIGUpLCBfID0gci5jZW50ZXJQb2ludC5hZGQoZCkpLCBnKSByLnNldExvY2F0aW9uQXRQb2ludChnLCB2KTtlbHNlIHtcbiAgICAgICAgICAgIHZhciBmID0gci56b29tU2NhbGUoci56b29tIC0gYSksXG4gICAgICAgICAgICAgICAgbSA9IGMgPiBhID8gTWF0aC5taW4oMiwgYikgOiBNYXRoLm1heCguNSwgYiksXG4gICAgICAgICAgICAgICAgdyA9IE1hdGgucG93KG0sIDEgLSBlKSxcbiAgICAgICAgICAgICAgICBUID0gci51bnByb2plY3QoeS5hZGQoeC5tdWx0KGUgKiB3KSkubXVsdChmKSk7XG4gICAgICAgICAgICByLnNldExvY2F0aW9uQXRQb2ludChyLnJlbmRlcldvcmxkQ29waWVzID8gVC53cmFwKCkgOiBULCBfKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvLl9maXJlTW92ZUV2ZW50cyhpKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBvLl9hZnRlckVhc2UoaSwgdCk7XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3ByZXBhcmVFYXNlID0gZnVuY3Rpb24gKGUsIGksIG8pIHtcbiAgICAgICAgdm9pZCAwID09PSBvICYmIChvID0ge30pLCB0aGlzLl9tb3ZpbmcgPSAhMCwgaSB8fCBvLm1vdmluZyB8fCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJtb3Zlc3RhcnRcIiwgZSkpLCB0aGlzLl96b29taW5nICYmICFvLnpvb21pbmcgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiem9vbXN0YXJ0XCIsIGUpKSwgdGhpcy5fcm90YXRpbmcgJiYgIW8ucm90YXRpbmcgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicm90YXRlc3RhcnRcIiwgZSkpLCB0aGlzLl9waXRjaGluZyAmJiAhby5waXRjaGluZyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJwaXRjaHN0YXJ0XCIsIGUpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9maXJlTW92ZUV2ZW50cyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgdC5FdmVudChcIm1vdmVcIiwgZSkpLCB0aGlzLl96b29taW5nICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInpvb21cIiwgZSkpLCB0aGlzLl9yb3RhdGluZyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVcIiwgZSkpLCB0aGlzLl9waXRjaGluZyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJwaXRjaFwiLCBlKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fYWZ0ZXJFYXNlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lYXNlSWQgfHwgIWkgfHwgdGhpcy5fZWFzZUlkICE9PSBpKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2Vhc2VJZDtcbiAgICAgICAgICB2YXIgbyA9IHRoaXMuX3pvb21pbmcsXG4gICAgICAgICAgICAgIHIgPSB0aGlzLl9yb3RhdGluZyxcbiAgICAgICAgICAgICAgYSA9IHRoaXMuX3BpdGNoaW5nO1xuICAgICAgICAgIHRoaXMuX21vdmluZyA9ICExLCB0aGlzLl96b29taW5nID0gITEsIHRoaXMuX3JvdGF0aW5nID0gITEsIHRoaXMuX3BpdGNoaW5nID0gITEsIHRoaXMuX3BhZGRpbmcgPSAhMSwgbyAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ6b29tZW5kXCIsIGUpKSwgciAmJiB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyb3RhdGVlbmRcIiwgZSkpLCBhICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInBpdGNoZW5kXCIsIGUpKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibW92ZWVuZFwiLCBlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGkucHJvdG90eXBlLmZseVRvID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuXG4gICAgICAgIGlmICghZS5lc3NlbnRpYWwgJiYgdC5icm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSB7XG4gICAgICAgICAgdmFyIHIgPSB0LnBpY2soZSwgW1wiY2VudGVyXCIsIFwiem9vbVwiLCBcImJlYXJpbmdcIiwgXCJwaXRjaFwiLCBcImFyb3VuZFwiXSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHIsIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdG9wKCksIGUgPSB0LmV4dGVuZCh7XG4gICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICBjdXJ2ZTogMS40MixcbiAgICAgICAgICBlYXNpbmc6IHQuZWFzZVxuICAgICAgICB9LCBlKTtcblxuICAgICAgICB2YXIgYSA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgbiA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgcyA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgbCA9IHRoaXMuZ2V0UGl0Y2goKSxcbiAgICAgICAgICAgIGMgPSB0aGlzLmdldFBhZGRpbmcoKSxcbiAgICAgICAgICAgIHUgPSBcInpvb21cIiBpbiBlID8gdC5jbGFtcCgrZS56b29tLCBhLm1pblpvb20sIGEubWF4Wm9vbSkgOiBuLFxuICAgICAgICAgICAgaCA9IFwiYmVhcmluZ1wiIGluIGUgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKGUuYmVhcmluZywgcykgOiBzLFxuICAgICAgICAgICAgcCA9IFwicGl0Y2hcIiBpbiBlID8gK2UucGl0Y2ggOiBsLFxuICAgICAgICAgICAgZCA9IFwicGFkZGluZ1wiIGluIGUgPyBlLnBhZGRpbmcgOiBhLnBhZGRpbmcsXG4gICAgICAgICAgICBfID0gYS56b29tU2NhbGUodSAtIG4pLFxuICAgICAgICAgICAgZiA9IHQuUG9pbnQuY29udmVydChlLm9mZnNldCksXG4gICAgICAgICAgICBtID0gYS5jZW50ZXJQb2ludC5hZGQoZiksXG4gICAgICAgICAgICBnID0gYS5wb2ludExvY2F0aW9uKG0pLFxuICAgICAgICAgICAgdiA9IHQuTG5nTGF0LmNvbnZlcnQoZS5jZW50ZXIgfHwgZyk7XG5cbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKHYpO1xuXG4gICAgICAgIHZhciB5ID0gYS5wcm9qZWN0KGcpLFxuICAgICAgICAgICAgeCA9IGEucHJvamVjdCh2KS5zdWIoeSksXG4gICAgICAgICAgICBiID0gZS5jdXJ2ZSxcbiAgICAgICAgICAgIHcgPSBNYXRoLm1heChhLndpZHRoLCBhLmhlaWdodCksXG4gICAgICAgICAgICBUID0gdyAvIF8sXG4gICAgICAgICAgICBFID0geC5tYWcoKTtcblxuICAgICAgICBpZiAoXCJtaW5ab29tXCIgaW4gZSkge1xuICAgICAgICAgIHZhciBJID0gdC5jbGFtcChNYXRoLm1pbihlLm1pblpvb20sIG4sIHUpLCBhLm1pblpvb20sIGEubWF4Wm9vbSksXG4gICAgICAgICAgICAgIFAgPSB3IC8gYS56b29tU2NhbGUoSSAtIG4pO1xuICAgICAgICAgIGIgPSBNYXRoLnNxcnQoUCAvIEUgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBTID0gYiAqIGI7XG5cbiAgICAgICAgZnVuY3Rpb24gQyh0KSB7XG4gICAgICAgICAgdmFyIGUgPSAoVCAqIFQgLSB3ICogdyArICh0ID8gLTEgOiAxKSAqIFMgKiBTICogRSAqIEUpIC8gKDIgKiAodCA/IFQgOiB3KSAqIFMgKiBFKTtcbiAgICAgICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGUgKiBlICsgMSkgLSBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHoodCkge1xuICAgICAgICAgIHJldHVybiAoTWF0aC5leHAodCkgLSBNYXRoLmV4cCgtdCkpIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIEQodCkge1xuICAgICAgICAgIHJldHVybiAoTWF0aC5leHAodCkgKyBNYXRoLmV4cCgtdCkpIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBBID0gQygwKSxcbiAgICAgICAgICAgIE0gPSBmdW5jdGlvbiBNKHQpIHtcbiAgICAgICAgICByZXR1cm4gRChBKSAvIEQoQSArIGIgKiB0KTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgIEwgPSBmdW5jdGlvbiBMKHQpIHtcbiAgICAgICAgICByZXR1cm4gdyAqICgoRChBKSAqICh6KGUgPSBBICsgYiAqIHQpIC8gRChlKSkgLSB6KEEpKSAvIFMpIC8gRTtcbiAgICAgICAgICB2YXIgZTtcbiAgICAgICAgfSxcbiAgICAgICAgICAgIFIgPSAoQygxKSAtIEEpIC8gYjtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoRSkgPCAxZS02IHx8ICFpc0Zpbml0ZShSKSkge1xuICAgICAgICAgIGlmIChNYXRoLmFicyh3IC0gVCkgPCAxZS02KSByZXR1cm4gdGhpcy5lYXNlVG8oZSwgaSk7XG4gICAgICAgICAgdmFyIGsgPSBUIDwgdyA/IC0xIDogMTtcbiAgICAgICAgICBSID0gTWF0aC5hYnMoTWF0aC5sb2coVCAvIHcpKSAvIGIsIEwgPSBmdW5jdGlvbiBMKCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSwgTSA9IGZ1bmN0aW9uIE0odCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZXhwKGsgKiBiICogdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlLmR1cmF0aW9uID0gXCJkdXJhdGlvblwiIGluIGUgPyArZS5kdXJhdGlvbiA6IDFlMyAqIFIgLyAoXCJzY3JlZW5TcGVlZFwiIGluIGUgPyArZS5zY3JlZW5TcGVlZCAvIGIgOiArZS5zcGVlZCksIGUubWF4RHVyYXRpb24gJiYgZS5kdXJhdGlvbiA+IGUubWF4RHVyYXRpb24gJiYgKGUuZHVyYXRpb24gPSAwKSwgdGhpcy5fem9vbWluZyA9ICEwLCB0aGlzLl9yb3RhdGluZyA9IHMgIT09IGgsIHRoaXMuX3BpdGNoaW5nID0gcCAhPT0gbCwgdGhpcy5fcGFkZGluZyA9ICFhLmlzUGFkZGluZ0VxdWFsKGQpLCB0aGlzLl9wcmVwYXJlRWFzZShpLCAhMSksIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgciA9IGUgKiBSLFxuICAgICAgICAgICAgICBfID0gMSAvIE0ocik7XG5cbiAgICAgICAgICBhLnpvb20gPSAxID09PSBlID8gdSA6IG4gKyBhLnNjYWxlWm9vbShfKSwgby5fcm90YXRpbmcgJiYgKGEuYmVhcmluZyA9IHQubnVtYmVyKHMsIGgsIGUpKSwgby5fcGl0Y2hpbmcgJiYgKGEucGl0Y2ggPSB0Lm51bWJlcihsLCBwLCBlKSksIG8uX3BhZGRpbmcgJiYgKGEuaW50ZXJwb2xhdGVQYWRkaW5nKGMsIGQsIGUpLCBtID0gYS5jZW50ZXJQb2ludC5hZGQoZikpO1xuICAgICAgICAgIHZhciBnID0gMSA9PT0gZSA/IHYgOiBhLnVucHJvamVjdCh5LmFkZCh4Lm11bHQoTChyKSkpLm11bHQoXykpO1xuICAgICAgICAgIGEuc2V0TG9jYXRpb25BdFBvaW50KGEucmVuZGVyV29ybGRDb3BpZXMgPyBnLndyYXAoKSA6IGcsIG0pLCBvLl9maXJlTW92ZUV2ZW50cyhpKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBvLl9hZnRlckVhc2UoaSk7XG4gICAgICAgIH0sIGUpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXNFYXNpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2Vhc2VGcmFtZUlkO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3AoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VGcmFtZUlkICYmICh0aGlzLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9lYXNlRnJhbWVJZCksIGRlbGV0ZSB0aGlzLl9lYXNlRnJhbWVJZCwgZGVsZXRlIHRoaXMuX29uRWFzZUZyYW1lKSwgdGhpcy5fb25FYXNlRW5kKSB7XG4gICAgICAgICAgdmFyIGkgPSB0aGlzLl9vbkVhc2VFbmQ7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX29uRWFzZUVuZCwgaS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgdmFyIG8gPSB0aGlzLmhhbmRsZXJzO1xuICAgICAgICAgIG8gJiYgby5zdG9wKCExKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2Vhc2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICAhMSA9PT0gby5hbmltYXRlIHx8IDAgPT09IG8uZHVyYXRpb24gPyAoZSgxKSwgaSgpKSA6ICh0aGlzLl9lYXNlU3RhcnQgPSB0LmJyb3dzZXIubm93KCksIHRoaXMuX2Vhc2VPcHRpb25zID0gbywgdGhpcy5fb25FYXNlRnJhbWUgPSBlLCB0aGlzLl9vbkVhc2VFbmQgPSBpLCB0aGlzLl9lYXNlRnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKSk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fcmVuZGVyRnJhbWVDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSBNYXRoLm1pbigodC5icm93c2VyLm5vdygpIC0gdGhpcy5fZWFzZVN0YXJ0KSAvIHRoaXMuX2Vhc2VPcHRpb25zLmR1cmF0aW9uLCAxKTtcbiAgICAgICAgdGhpcy5fb25FYXNlRnJhbWUodGhpcy5fZWFzZU9wdGlvbnMuZWFzaW5nKGUpKSwgZSA8IDEgPyB0aGlzLl9lYXNlRnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKSA6IHRoaXMuc3RvcCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX25vcm1hbGl6ZUJlYXJpbmcgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBlID0gdC53cmFwKGUsIC0xODAsIDE4MCk7XG4gICAgICAgIHZhciBvID0gTWF0aC5hYnMoZSAtIGkpO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoZSAtIDM2MCAtIGkpIDwgbyAmJiAoZSAtPSAzNjApLCBNYXRoLmFicyhlICsgMzYwIC0gaSkgPCBvICYmIChlICs9IDM2MCksIGU7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fbm9ybWFsaXplQ2VudGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoZS5yZW5kZXJXb3JsZENvcGllcyAmJiAhZS5sbmdSYW5nZSkge1xuICAgICAgICAgIHZhciBpID0gdC5sbmcgLSBlLmNlbnRlci5sbmc7XG4gICAgICAgICAgdC5sbmcgKz0gaSA+IDE4MCA/IC0zNjAgOiBpIDwgLTE4MCA/IDM2MCA6IDA7XG4gICAgICAgIH1cbiAgICAgIH0sIGk7XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICB5ciA9IGZ1bmN0aW9uIHlyKGUpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHt9KSwgdGhpcy5vcHRpb25zID0gZSwgdC5iaW5kQWxsKFtcIl90b2dnbGVBdHRyaWJ1dGlvblwiLCBcIl91cGRhdGVFZGl0TGlua1wiLCBcIl91cGRhdGVEYXRhXCIsIFwiX3VwZGF0ZUNvbXBhY3RcIl0sIHRoaXMpO1xuICAgIH07XG5cbiAgICB5ci5wcm90b3R5cGUuZ2V0RGVmYXVsdFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiYm90dG9tLXJpZ2h0XCI7XG4gICAgfSwgeXIucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jb21wYWN0O1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IHQsIHRoaXMuX2NvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwbGlicmVnbC1jdHJsIG1hcGxpYnJlZ2wtY3RybC1hdHRyaWJcIiksIHRoaXMuX2NvbXBhY3RCdXR0b24gPSBpLmNyZWF0ZShcImJ1dHRvblwiLCBcIm1hcGxpYnJlZ2wtY3RybC1hdHRyaWItYnV0dG9uXCIsIHRoaXMuX2NvbnRhaW5lciksIHRoaXMuX2NvbXBhY3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX3RvZ2dsZUF0dHJpYnV0aW9uKSwgdGhpcy5fY29tcGFjdEJ1dHRvbi50eXBlID0gXCJidXR0b25cIiwgdGhpcy5fc2V0RWxlbWVudFRpdGxlKHRoaXMuX2NvbXBhY3RCdXR0b24sIFwiVG9nZ2xlQXR0cmlidXRpb25cIiksIHRoaXMuX2lubmVyQ29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLWN0cmwtYXR0cmliLWlubmVyXCIsIHRoaXMuX2NvbnRhaW5lciksIHRoaXMuX2lubmVyQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJsaXN0XCIpLCBlICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jb21wYWN0XCIpLCB0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKSwgdGhpcy5fdXBkYXRlRWRpdExpbmsoKSwgdGhpcy5fbWFwLm9uKFwic3R5bGVkYXRhXCIsIHRoaXMuX3VwZGF0ZURhdGEpLCB0aGlzLl9tYXAub24oXCJzb3VyY2VkYXRhXCIsIHRoaXMuX3VwZGF0ZURhdGEpLCB0aGlzLl9tYXAub24oXCJtb3ZlZW5kXCIsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKSwgdm9pZCAwID09PSBlICYmICh0aGlzLl9tYXAub24oXCJyZXNpemVcIiwgdGhpcy5fdXBkYXRlQ29tcGFjdCksIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKSksIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9LCB5ci5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCB0aGlzLl9tYXAub2ZmKFwic3R5bGVkYXRhXCIsIHRoaXMuX3VwZGF0ZURhdGEpLCB0aGlzLl9tYXAub2ZmKFwic291cmNlZGF0YVwiLCB0aGlzLl91cGRhdGVEYXRhKSwgdGhpcy5fbWFwLm9mZihcIm1vdmVlbmRcIiwgdGhpcy5fdXBkYXRlRWRpdExpbmspLCB0aGlzLl9tYXAub2ZmKFwicmVzaXplXCIsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpLCB0aGlzLl9tYXAgPSB2b2lkIDAsIHRoaXMuX2F0dHJpYkhUTUwgPSB2b2lkIDA7XG4gICAgfSwgeXIucHJvdG90eXBlLl9zZXRFbGVtZW50VGl0bGUgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdmFyIGkgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKFwiQXR0cmlidXRpb25Db250cm9sLlwiICsgZSk7XG5cbiAgICAgIHQudGl0bGUgPSBpLCB0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgaSk7XG4gICAgfSwgeXIucHJvdG90eXBlLl90b2dnbGVBdHRyaWJ1dGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoXCJtYXBsaWJyZWdsLWNvbXBhY3Qtc2hvd1wiKSA/ICh0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY29tcGFjdC1zaG93XCIpLCB0aGlzLl9jb21wYWN0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCBcImZhbHNlXCIpKSA6ICh0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY29tcGFjdC1zaG93XCIpLCB0aGlzLl9jb21wYWN0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCBcInRydWVcIikpO1xuICAgIH0sIHlyLnByb3RvdHlwZS5fdXBkYXRlRWRpdExpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX2VkaXRMaW5rO1xuICAgICAgZSB8fCAoZSA9IHRoaXMuX2VkaXRMaW5rID0gdGhpcy5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIubWFwYm94LWltcHJvdmUtbWFwXCIpKTtcbiAgICAgIHZhciBpID0gW3tcbiAgICAgICAga2V5OiBcIm93bmVyXCIsXG4gICAgICAgIHZhbHVlOiB0aGlzLnN0eWxlT3duZXJcbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImlkXCIsXG4gICAgICAgIHZhbHVlOiB0aGlzLnN0eWxlSWRcbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFjY2Vzc190b2tlblwiLFxuICAgICAgICB2YWx1ZTogdGhpcy5fbWFwLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgdC5jb25maWcuQUNDRVNTX1RPS0VOXG4gICAgICB9XTtcblxuICAgICAgaWYgKGUpIHtcbiAgICAgICAgdmFyIG8gPSBpLnJlZHVjZShmdW5jdGlvbiAodCwgZSwgbykge1xuICAgICAgICAgIHJldHVybiBlLnZhbHVlICYmICh0ICs9IGUua2V5ICsgXCI9XCIgKyBlLnZhbHVlICsgKG8gPCBpLmxlbmd0aCAtIDEgPyBcIiZcIiA6IFwiXCIpKSwgdDtcbiAgICAgICAgfSwgXCI/XCIpO1xuICAgICAgICBlLmhyZWYgPSB0LmNvbmZpZy5GRUVEQkFDS19VUkwgKyBcIi9cIiArIG8gKyAodGhpcy5fbWFwLl9oYXNoID8gdGhpcy5fbWFwLl9oYXNoLmdldEhhc2hTdHJpbmcoITApIDogXCJcIiksIGUucmVsID0gXCJub29wZW5lciBub2ZvbGxvd1wiLCB0aGlzLl9zZXRFbGVtZW50VGl0bGUoZSwgXCJNYXBGZWVkYmFja1wiKTtcbiAgICAgIH1cbiAgICB9LCB5ci5wcm90b3R5cGUuX3VwZGF0ZURhdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgIXQgfHwgXCJtZXRhZGF0YVwiICE9PSB0LnNvdXJjZURhdGFUeXBlICYmIFwidmlzaWJpbGl0eVwiICE9PSB0LnNvdXJjZURhdGFUeXBlICYmIFwic3R5bGVcIiAhPT0gdC5kYXRhVHlwZSB8fCAodGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCksIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCkpO1xuICAgIH0sIHlyLnByb3RvdHlwZS5fdXBkYXRlQXR0cmlidXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuX21hcC5zdHlsZSkge1xuICAgICAgICB2YXIgdCA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24gJiYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSA/IHQgPSB0LmNvbmNhdCh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24ubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT0gdHlwZW9mIHQgPyBcIlwiIDogdDtcbiAgICAgICAgfSkpIDogXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uICYmIHQucHVzaCh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24pKSwgdGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQpIHtcbiAgICAgICAgICB2YXIgZSA9IHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0O1xuICAgICAgICAgIHRoaXMuc3R5bGVPd25lciA9IGUub3duZXIsIHRoaXMuc3R5bGVJZCA9IGUuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IHRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7XG5cbiAgICAgICAgZm9yICh2YXIgbyBpbiBpKSB7XG4gICAgICAgICAgdmFyIHIgPSBpW29dO1xuXG4gICAgICAgICAgaWYgKHIudXNlZCkge1xuICAgICAgICAgICAgdmFyIGEgPSByLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgYS5hdHRyaWJ1dGlvbiAmJiB0LmluZGV4T2YoYS5hdHRyaWJ1dGlvbikgPCAwICYmIHQucHVzaChhLmF0dHJpYnV0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0LnNvcnQoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gdC5sZW5ndGggLSBlLmxlbmd0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBuID0gKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIGZvciAodmFyIG8gPSBpICsgMTsgbyA8IHQubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgICAgIGlmICh0W29dLmluZGV4T2YoZSkgPj0gMCkgcmV0dXJuICExO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSkpLmpvaW4oXCIgfCBcIik7XG4gICAgICAgIG4gIT09IHRoaXMuX2F0dHJpYkhUTUwgJiYgKHRoaXMuX2F0dHJpYkhUTUwgPSBuLCB0Lmxlbmd0aCA/ICh0aGlzLl9pbm5lckNvbnRhaW5lci5pbm5lckhUTUwgPSBuLCB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtYXR0cmliLWVtcHR5XCIpKSA6IHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1hdHRyaWItZW1wdHlcIiksIHRoaXMuX2VkaXRMaW5rID0gbnVsbCk7XG4gICAgICB9XG4gICAgfSwgeXIucHJvdG90eXBlLl91cGRhdGVDb21wYWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCA/IHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jb21wYWN0XCIpIDogdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWNvbXBhY3RcIiwgXCJtYXBsaWJyZWdsLWNvbXBhY3Qtc2hvd1wiKTtcbiAgICB9O1xuXG4gICAgdmFyIHhyID0gZnVuY3Rpb24geHIoKSB7XG4gICAgICB0LmJpbmRBbGwoW1wiX3VwZGF0ZUxvZ29cIl0sIHRoaXMpLCB0LmJpbmRBbGwoW1wiX3VwZGF0ZUNvbXBhY3RcIl0sIHRoaXMpO1xuICAgIH07XG5cbiAgICB4ci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5fbWFwID0gdCwgdGhpcy5fY29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLWN0cmxcIik7XG4gICAgICB2YXIgZSA9IGkuY3JlYXRlKFwiYVwiLCBcIm1hcGxpYnJlZ2wtY3RybC1sb2dvXCIpO1xuICAgICAgcmV0dXJuIGUudGFyZ2V0ID0gXCJfYmxhbmtcIiwgZS5yZWwgPSBcIm5vb3BlbmVyIG5vZm9sbG93XCIsIGUuaHJlZiA9IFwiaHR0cHM6Ly9tYXBsaWJyZS5vcmcvXCIsIGUuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKFwiTG9nb0NvbnRyb2wuVGl0bGVcIikpLCBlLnNldEF0dHJpYnV0ZShcInJlbFwiLCBcIm5vb3BlbmVyIG5vZm9sbG93XCIpLCB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoZSksIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIHRoaXMuX21hcC5vbihcInNvdXJjZWRhdGFcIiwgdGhpcy5fdXBkYXRlTG9nbyksIHRoaXMuX3VwZGF0ZUxvZ28oKSwgdGhpcy5fbWFwLm9uKFwicmVzaXplXCIsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpLCB0aGlzLl91cGRhdGVDb21wYWN0KCksIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9LCB4ci5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCB0aGlzLl9tYXAub2ZmKFwic291cmNlZGF0YVwiLCB0aGlzLl91cGRhdGVMb2dvKSwgdGhpcy5fbWFwLm9mZihcInJlc2l6ZVwiLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICB9LCB4ci5wcm90b3R5cGUuZ2V0RGVmYXVsdFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFwiYm90dG9tLWxlZnRcIjtcbiAgICB9LCB4ci5wcm90b3R5cGUuX3VwZGF0ZUxvZ28gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdCAmJiBcIm1ldGFkYXRhXCIgIT09IHQuc291cmNlRGF0YVR5cGUgfHwgKHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fbG9nb1JlcXVpcmVkKCkgPyBcImJsb2NrXCIgOiBcIm5vbmVcIik7XG4gICAgfSwgeHIucHJvdG90eXBlLl9sb2dvUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5fbWFwLnN0eWxlKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztcblxuICAgICAgICBmb3IgKHZhciBlIGluIHQpIHtcbiAgICAgICAgICBpZiAodFtlXS5nZXRTb3VyY2UoKS5tYXBib3hfbG9nbykgcmV0dXJuICEwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgIH0sIHhyLnByb3RvdHlwZS5fdXBkYXRlQ29tcGFjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5fY29udGFpbmVyLmNoaWxkcmVuO1xuXG4gICAgICBpZiAodC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGUgPSB0WzBdO1xuICAgICAgICB0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkub2Zmc2V0V2lkdGggPCAyNTAgPyBlLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWNvbXBhY3RcIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWNvbXBhY3RcIik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBiciA9IGZ1bmN0aW9uIGJyKCkge1xuICAgICAgdGhpcy5fcXVldWUgPSBbXSwgdGhpcy5faWQgPSAwLCB0aGlzLl9jbGVhcmVkID0gITEsIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSAhMTtcbiAgICB9O1xuXG4gICAgYnIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9ICsrdGhpcy5faWQ7XG4gICAgICByZXR1cm4gdGhpcy5fcXVldWUucHVzaCh7XG4gICAgICAgIGNhbGxiYWNrOiB0LFxuICAgICAgICBpZDogZSxcbiAgICAgICAgY2FuY2VsbGVkOiAhMVxuICAgICAgfSksIGU7XG4gICAgfSwgYnIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlID0gdGhpcy5fY3VycmVudGx5UnVubmluZywgaSA9IDAsIG8gPSBlID8gdGhpcy5fcXVldWUuY29uY2F0KGUpIDogdGhpcy5fcXVldWU7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciByID0gb1tpXTtcbiAgICAgICAgaWYgKHIuaWQgPT09IHQpIHJldHVybiB2b2lkIChyLmNhbmNlbGxlZCA9ICEwKTtcbiAgICAgIH1cbiAgICB9LCBici5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IDApO1xuICAgICAgdmFyIGUgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gdGhpcy5fcXVldWU7XG4gICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbyA9IGU7IGkgPCBvLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciByID0gb1tpXTtcbiAgICAgICAgaWYgKCFyLmNhbmNlbGxlZCAmJiAoci5jYWxsYmFjayh0KSwgdGhpcy5fY2xlYXJlZCkpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGVhcmVkID0gITEsIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSAhMTtcbiAgICB9LCBici5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9jdXJyZW50bHlSdW5uaW5nICYmICh0aGlzLl9jbGVhcmVkID0gITApLCB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH07XG5cbiAgICB2YXIgd3IgPSB7XG4gICAgICBcIkF0dHJpYnV0aW9uQ29udHJvbC5Ub2dnbGVBdHRyaWJ1dGlvblwiOiBcIlRvZ2dsZSBhdHRyaWJ1dGlvblwiLFxuICAgICAgXCJBdHRyaWJ1dGlvbkNvbnRyb2wuTWFwRmVlZGJhY2tcIjogXCJNYXAgZmVlZGJhY2tcIixcbiAgICAgIFwiRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXJcIjogXCJFbnRlciBmdWxsc2NyZWVuXCIsXG4gICAgICBcIkZ1bGxzY3JlZW5Db250cm9sLkV4aXRcIjogXCJFeGl0IGZ1bGxzY3JlZW5cIixcbiAgICAgIFwiR2VvbG9jYXRlQ29udHJvbC5GaW5kTXlMb2NhdGlvblwiOiBcIkZpbmQgbXkgbG9jYXRpb25cIixcbiAgICAgIFwiR2VvbG9jYXRlQ29udHJvbC5Mb2NhdGlvbk5vdEF2YWlsYWJsZVwiOiBcIkxvY2F0aW9uIG5vdCBhdmFpbGFibGVcIixcbiAgICAgIFwiTG9nb0NvbnRyb2wuVGl0bGVcIjogXCJNYXBib3ggbG9nb1wiLFxuICAgICAgXCJOYXZpZ2F0aW9uQ29udHJvbC5SZXNldEJlYXJpbmdcIjogXCJSZXNldCBiZWFyaW5nIHRvIG5vcnRoXCIsXG4gICAgICBcIk5hdmlnYXRpb25Db250cm9sLlpvb21JblwiOiBcIlpvb20gaW5cIixcbiAgICAgIFwiTmF2aWdhdGlvbkNvbnRyb2wuWm9vbU91dFwiOiBcIlpvb20gb3V0XCIsXG4gICAgICBcIlNjYWxlQ29udHJvbC5GZWV0XCI6IFwiZnRcIixcbiAgICAgIFwiU2NhbGVDb250cm9sLk1ldGVyc1wiOiBcIm1cIixcbiAgICAgIFwiU2NhbGVDb250cm9sLktpbG9tZXRlcnNcIjogXCJrbVwiLFxuICAgICAgXCJTY2FsZUNvbnRyb2wuTWlsZXNcIjogXCJtaVwiLFxuICAgICAgXCJTY2FsZUNvbnRyb2wuTmF1dGljYWxNaWxlc1wiOiBcIm5tXCJcbiAgICB9LFxuICAgICAgICBUciA9IHQud2luZG93LkhUTUxJbWFnZUVsZW1lbnQsXG4gICAgICAgIEVyID0gdC53aW5kb3cuSFRNTEVsZW1lbnQsXG4gICAgICAgIElyID0gdC53aW5kb3cuSW1hZ2VCaXRtYXAsXG4gICAgICAgIFByID0ge1xuICAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICB6b29tOiAwLFxuICAgICAgYmVhcmluZzogMCxcbiAgICAgIHBpdGNoOiAwLFxuICAgICAgbWluWm9vbTogLTIsXG4gICAgICBtYXhab29tOiAyMixcbiAgICAgIG1pblBpdGNoOiAwLFxuICAgICAgbWF4UGl0Y2g6IDYwLFxuICAgICAgaW50ZXJhY3RpdmU6ICEwLFxuICAgICAgc2Nyb2xsWm9vbTogITAsXG4gICAgICBib3hab29tOiAhMCxcbiAgICAgIGRyYWdSb3RhdGU6ICEwLFxuICAgICAgZHJhZ1BhbjogITAsXG4gICAgICBrZXlib2FyZDogITAsXG4gICAgICBkb3VibGVDbGlja1pvb206ICEwLFxuICAgICAgdG91Y2hab29tUm90YXRlOiAhMCxcbiAgICAgIHRvdWNoUGl0Y2g6ICEwLFxuICAgICAgYmVhcmluZ1NuYXA6IDcsXG4gICAgICBjbGlja1RvbGVyYW5jZTogMyxcbiAgICAgIHBpdGNoV2l0aFJvdGF0ZTogITAsXG4gICAgICBoYXNoOiAhMSxcbiAgICAgIGF0dHJpYnV0aW9uQ29udHJvbDogITAsXG4gICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiAhMSxcbiAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogITEsXG4gICAgICB0cmFja1Jlc2l6ZTogITAsXG4gICAgICByZW5kZXJXb3JsZENvcGllczogITAsXG4gICAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiAhMCxcbiAgICAgIG1heFRpbGVDYWNoZVNpemU6IG51bGwsXG4gICAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IFwic2Fucy1zZXJpZlwiLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcbiAgICAgIGFjY2Vzc1Rva2VuOiBudWxsLFxuICAgICAgZmFkZUR1cmF0aW9uOiAzMDAsXG4gICAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6ICEwXG4gICAgfSxcbiAgICAgICAgU3IgPSBmdW5jdGlvbiAobykge1xuICAgICAgZnVuY3Rpb24gcihlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcztcbiAgICAgICAgaWYgKG51bGwgIT0gKGUgPSB0LmV4dGVuZCh7fSwgUHIsIGUpKS5taW5ab29tICYmIG51bGwgIT0gZS5tYXhab29tICYmIGUubWluWm9vbSA+IGUubWF4Wm9vbSkgdGhyb3cgbmV3IEVycm9yKFwibWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5ab29tXCIpO1xuICAgICAgICBpZiAobnVsbCAhPSBlLm1pblBpdGNoICYmIG51bGwgIT0gZS5tYXhQaXRjaCAmJiBlLm1pblBpdGNoID4gZS5tYXhQaXRjaCkgdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluUGl0Y2hcIik7XG4gICAgICAgIGlmIChudWxsICE9IGUubWluUGl0Y2ggJiYgZS5taW5QaXRjaCA8IDApIHRocm93IG5ldyBFcnJvcihcIm1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBcIik7XG4gICAgICAgIGlmIChudWxsICE9IGUubWF4UGl0Y2ggJiYgZS5tYXhQaXRjaCA+IDYwKSB0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2MFwiKTtcbiAgICAgICAgdmFyIHIgPSBuZXcgVG8oZS5taW5ab29tLCBlLm1heFpvb20sIGUubWluUGl0Y2gsIGUubWF4UGl0Y2gsIGUucmVuZGVyV29ybGRDb3BpZXMpO1xuXG4gICAgICAgIGlmIChvLmNhbGwodGhpcywgciwgZSksIHRoaXMuX2ludGVyYWN0aXZlID0gZS5pbnRlcmFjdGl2ZSwgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IGUubWF4VGlsZUNhY2hlU2l6ZSwgdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGUuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCwgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gZS5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsIHRoaXMuX2FudGlhbGlhcyA9IGUuYW50aWFsaWFzLCB0aGlzLl90cmFja1Jlc2l6ZSA9IGUudHJhY2tSZXNpemUsIHRoaXMuX2JlYXJpbmdTbmFwID0gZS5iZWFyaW5nU25hcCwgdGhpcy5fcmVmcmVzaEV4cGlyZWRUaWxlcyA9IGUucmVmcmVzaEV4cGlyZWRUaWxlcywgdGhpcy5fZmFkZUR1cmF0aW9uID0gZS5mYWRlRHVyYXRpb24sIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IGUuY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IDEsIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IGUuY29sbGVjdFJlc291cmNlVGltaW5nLCB0aGlzLl9yZW5kZXJUYXNrUXVldWUgPSBuZXcgYnIoKSwgdGhpcy5fY29udHJvbHMgPSBbXSwgdGhpcy5fbWFwSWQgPSB0LnVuaXF1ZUlkKCksIHRoaXMuX2xvY2FsZSA9IHQuZXh0ZW5kKHt9LCB3ciwgZS5sb2NhbGUpLCB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IGUuY2xpY2tUb2xlcmFuY2UsIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IHQuUmVxdWVzdE1hbmFnZXIoZS50cmFuc2Zvcm1SZXF1ZXN0LCBlLmFjY2Vzc1Rva2VuKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5jb250YWluZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyID0gdC53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5jb250YWluZXIpLCAhdGhpcy5fY29udGFpbmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJDb250YWluZXIgJ1wiICsgZS5jb250YWluZXIgKyBcIicgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShlLmNvbnRhaW5lciBpbnN0YW5jZW9mIEVyKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LlwiKTtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBlLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlLm1heEJvdW5kcyAmJiB0aGlzLnNldE1heEJvdW5kcyhlLm1heEJvdW5kcyksIHQuYmluZEFsbChbXCJfb25XaW5kb3dPbmxpbmVcIiwgXCJfb25XaW5kb3dSZXNpemVcIiwgXCJfb25NYXBTY3JvbGxcIiwgXCJfY29udGV4dExvc3RcIiwgXCJfY29udGV4dFJlc3RvcmVkXCJdLCB0aGlzKSwgdGhpcy5fc2V0dXBDb250YWluZXIoKSwgdGhpcy5fc2V0dXBQYWludGVyKCksIHZvaWQgMCA9PT0gdGhpcy5wYWludGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTC5cIik7XG4gICAgICAgIHRoaXMub24oXCJtb3ZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCExKTtcbiAgICAgICAgfSksIHRoaXMub24oXCJtb3ZlZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCExKTtcbiAgICAgICAgfSksIHRoaXMub24oXCJ6b29tXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaS5fdXBkYXRlKCEwKTtcbiAgICAgICAgfSksIHZvaWQgMCAhPT0gdC53aW5kb3cgJiYgKHQud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5fb25XaW5kb3dPbmxpbmUsICExKSwgdC53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgITEpLCB0LndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib3JpZW50YXRpb25jaGFuZ2VcIiwgdGhpcy5fb25XaW5kb3dSZXNpemUsICExKSksIHRoaXMuaGFuZGxlcnMgPSBuZXcgZ3IodGhpcywgZSksIHRoaXMuX2hhc2ggPSBlLmhhc2ggJiYgbmV3IElvKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUuaGFzaCAmJiBlLmhhc2ggfHwgdm9pZCAwKS5hZGRUbyh0aGlzKSwgdGhpcy5faGFzaCAmJiB0aGlzLl9oYXNoLl9vbkhhc2hDaGFuZ2UoKSB8fCAodGhpcy5qdW1wVG8oe1xuICAgICAgICAgIGNlbnRlcjogZS5jZW50ZXIsXG4gICAgICAgICAgem9vbTogZS56b29tLFxuICAgICAgICAgIGJlYXJpbmc6IGUuYmVhcmluZyxcbiAgICAgICAgICBwaXRjaDogZS5waXRjaFxuICAgICAgICB9KSwgZS5ib3VuZHMgJiYgKHRoaXMucmVzaXplKCksIHRoaXMuZml0Qm91bmRzKGUuYm91bmRzLCB0LmV4dGVuZCh7fSwgZS5maXRCb3VuZHNPcHRpb25zLCB7XG4gICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgfSkpKSksIHRoaXMucmVzaXplKCksIHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IGUubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5LCBlLnN0eWxlICYmIHRoaXMuc2V0U3R5bGUoZS5zdHlsZSwge1xuICAgICAgICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogZS5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHlcbiAgICAgICAgfSksIGUuYXR0cmlidXRpb25Db250cm9sICYmIHRoaXMuYWRkQ29udHJvbChuZXcgeXIoe1xuICAgICAgICAgIGN1c3RvbUF0dHJpYnV0aW9uOiBlLmN1c3RvbUF0dHJpYnV0aW9uXG4gICAgICAgIH0pKSwgdGhpcy5hZGRDb250cm9sKG5ldyB4cigpLCBlLmxvZ29Qb3NpdGlvbiksIHRoaXMub24oXCJzdHlsZS5sb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpLnRyYW5zZm9ybS51bm1vZGlmaWVkICYmIGkuanVtcFRvKGkuc3R5bGUuc3R5bGVzaGVldCk7XG4gICAgICAgIH0pLCB0aGlzLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGkuX3VwZGF0ZShcInN0eWxlXCIgPT09IGUuZGF0YVR5cGUpLCBpLmZpcmUobmV3IHQuRXZlbnQoZS5kYXRhVHlwZSArIFwiZGF0YVwiLCBlKSk7XG4gICAgICAgIH0pLCB0aGlzLm9uKFwiZGF0YWxvYWRpbmdcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpLmZpcmUobmV3IHQuRXZlbnQoZS5kYXRhVHlwZSArIFwiZGF0YWxvYWRpbmdcIiwgZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbyAmJiAoci5fX3Byb3RvX18gPSBvKSwgKHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvICYmIG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSByO1xuICAgICAgdmFyIGEgPSB7XG4gICAgICAgIHNob3dUaWxlQm91bmRhcmllczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd1BhZGRpbmc6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgIH0sXG4gICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICByZXBhaW50OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0aWNlczoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfSxcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByLnByb3RvdHlwZS5fZ2V0TWFwSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXBJZDtcbiAgICAgIH0sIHIucHJvdG90eXBlLmFkZENvbnRyb2wgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBpICYmIChpID0gZS5nZXREZWZhdWx0UG9zaXRpb24gPyBlLmdldERlZmF1bHRQb3NpdGlvbigpIDogXCJ0b3AtcmlnaHRcIiksICFlIHx8ICFlLm9uQWRkKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAuYWRkQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO1xuICAgICAgICB2YXIgbyA9IGUub25BZGQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5fY29udHJvbHMucHVzaChlKTtcblxuICAgICAgICB2YXIgciA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnNbaV07XG4gICAgICAgIHJldHVybiAtMSAhPT0gaS5pbmRleE9mKFwiYm90dG9tXCIpID8gci5pbnNlcnRCZWZvcmUobywgci5maXJzdENoaWxkKSA6IHIuYXBwZW5kQ2hpbGQobyksIHRoaXM7XG4gICAgICB9LCByLnByb3RvdHlwZS5yZW1vdmVDb250cm9sID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFlIHx8ICFlLm9uUmVtb3ZlKSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCB0byBtYXAucmVtb3ZlQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLlwiKSkpO1xuXG4gICAgICAgIHZhciBpID0gdGhpcy5fY29udHJvbHMuaW5kZXhPZihlKTtcblxuICAgICAgICByZXR1cm4gaSA+IC0xICYmIHRoaXMuX2NvbnRyb2xzLnNwbGljZShpLCAxKSwgZS5vblJlbW92ZSh0aGlzKSwgdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLmhhc0NvbnRyb2wgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udHJvbHMuaW5kZXhPZih0KSA+IC0xO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBvID0gaVswXSxcbiAgICAgICAgICAgIHIgPSBpWzFdO1xuXG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyhvLCByKSwgdGhpcy50cmFuc2Zvcm0ucmVzaXplKG8sIHIpLCB0aGlzLnBhaW50ZXIucmVzaXplKG8sIHIpO1xuICAgICAgICB2YXIgYSA9ICF0aGlzLl9tb3Zpbmc7XG4gICAgICAgIHJldHVybiBhICYmICh0aGlzLnN0b3AoKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibW92ZXN0YXJ0XCIsIGUpKS5maXJlKG5ldyB0LkV2ZW50KFwibW92ZVwiLCBlKSkpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJyZXNpemVcIiwgZSkpLCBhICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcIm1vdmVlbmRcIiwgZSkpLCB0aGlzO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0Qm91bmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0Qm91bmRzKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRNYXhCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRNYXhCb3VuZHMoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldE1heEJvdW5kcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5zZXRNYXhCb3VuZHModC5MbmdMYXRCb3VuZHMuY29udmVydChlKSksIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0TWluWm9vbSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICgodCA9IG51bGwgPT0gdCA/IC0yIDogdCkgPj0gLTIgJiYgdCA8PSB0aGlzLnRyYW5zZm9ybS5tYXhab29tKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbSA9IHQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLmdldFpvb20oKSA8IHQgJiYgdGhpcy5zZXRab29tKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaW5ab29tIG11c3QgYmUgYmV0d2VlbiAtMiBhbmQgdGhlIGN1cnJlbnQgbWF4Wm9vbSwgaW5jbHVzaXZlXCIpO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0TWluWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblpvb207XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRNYXhab29tID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKCh0ID0gbnVsbCA9PSB0ID8gMjIgOiB0KSA+PSB0aGlzLnRyYW5zZm9ybS5taW5ab29tKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSA9IHQsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLmdldFpvb20oKSA+IHQgJiYgdGhpcy5zZXRab29tKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG1pblpvb21cIik7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRNYXhab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldE1pblBpdGNoID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKCh0ID0gbnVsbCA9PSB0ID8gMCA6IHQpIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibWluUGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFwiKTtcbiAgICAgICAgaWYgKHQgPj0gMCAmJiB0IDw9IHRoaXMudHJhbnNmb3JtLm1heFBpdGNoKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2ggPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcy5nZXRQaXRjaCgpIDwgdCAmJiB0aGlzLnNldFBpdGNoKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaW5QaXRjaCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgdGhlIGN1cnJlbnQgbWF4UGl0Y2gsIGluY2x1c2l2ZVwiKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldE1pblBpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2g7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRNYXhQaXRjaCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICgodCA9IG51bGwgPT0gdCA/IDYwIDogdCkgPiA2MCkgdGhyb3cgbmV3IEVycm9yKFwibWF4UGl0Y2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNjBcIik7XG4gICAgICAgIGlmICh0ID49IHRoaXMudHJhbnNmb3JtLm1pblBpdGNoKSByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4UGl0Y2ggPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcy5nZXRQaXRjaCgpID4gdCAmJiB0aGlzLnNldFBpdGNoKHQpLCB0aGlzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtaW5QaXRjaFwiKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldE1heFBpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4UGl0Y2g7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRSZW5kZXJXb3JsZENvcGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0UmVuZGVyV29ybGRDb3BpZXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgPSB0LCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnByb2plY3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0LkxuZ0xhdC5jb252ZXJ0KGUpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnVucHJvamVjdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHQuUG9pbnQuY29udmVydChlKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc01vdmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmluZyB8fCB0aGlzLmhhbmRsZXJzLmlzTW92aW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1pvb21pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl96b29taW5nIHx8IHRoaXMuaGFuZGxlcnMuaXNab29taW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1JvdGF0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpbmcgfHwgdGhpcy5oYW5kbGVycy5pc1JvdGF0aW5nKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICB2YXIgbyxcbiAgICAgICAgICAgIHIgPSB0aGlzO1xuXG4gICAgICAgIGlmIChcIm1vdXNlZW50ZXJcIiA9PT0gdCB8fCBcIm1vdXNlb3ZlclwiID09PSB0KSB7XG4gICAgICAgICAgdmFyIGEgPSAhMTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF5ZXI6IGUsXG4gICAgICAgICAgICBsaXN0ZW5lcjogaSxcbiAgICAgICAgICAgIGRlbGVnYXRlczoge1xuICAgICAgICAgICAgICBtb3VzZW1vdmU6IGZ1bmN0aW9uIG1vdXNlbW92ZShvKSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSByLmdldExheWVyKGUpID8gci5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoby5wb2ludCwge1xuICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbZV1cbiAgICAgICAgICAgICAgICB9KSA6IFtdO1xuICAgICAgICAgICAgICAgIG4ubGVuZ3RoID8gYSB8fCAoYSA9ICEwLCBpLmNhbGwociwgbmV3IFJvKHQsIHIsIG8ub3JpZ2luYWxFdmVudCwge1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IG5cbiAgICAgICAgICAgICAgICB9KSkpIDogYSA9ICExO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24gbW91c2VvdXQoKSB7XG4gICAgICAgICAgICAgICAgYSA9ICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIm1vdXNlbGVhdmVcIiA9PT0gdCB8fCBcIm1vdXNlb3V0XCIgPT09IHQpIHtcbiAgICAgICAgICB2YXIgbiA9ICExO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXllcjogZSxcbiAgICAgICAgICAgIGxpc3RlbmVyOiBpLFxuICAgICAgICAgICAgZGVsZWdhdGVzOiB7XG4gICAgICAgICAgICAgIG1vdXNlbW92ZTogZnVuY3Rpb24gbW91c2Vtb3ZlKG8pIHtcbiAgICAgICAgICAgICAgICAoci5nZXRMYXllcihlKSA/IHIucXVlcnlSZW5kZXJlZEZlYXR1cmVzKG8ucG9pbnQsIHtcbiAgICAgICAgICAgICAgICAgIGxheWVyczogW2VdXG4gICAgICAgICAgICAgICAgfSkgOiBbXSkubGVuZ3RoID8gbiA9ICEwIDogbiAmJiAobiA9ICExLCBpLmNhbGwociwgbmV3IFJvKHQsIHIsIG8ub3JpZ2luYWxFdmVudCkpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uIG1vdXNlb3V0KGUpIHtcbiAgICAgICAgICAgICAgICBuICYmIChuID0gITEsIGkuY2FsbChyLCBuZXcgUm8odCwgciwgZS5vcmlnaW5hbEV2ZW50KSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGF5ZXI6IGUsXG4gICAgICAgICAgbGlzdGVuZXI6IGksXG4gICAgICAgICAgZGVsZWdhdGVzOiAobyA9IHt9LCBvW3RdID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHZhciBvID0gci5nZXRMYXllcihlKSA/IHIucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHQucG9pbnQsIHtcbiAgICAgICAgICAgICAgbGF5ZXJzOiBbZV1cbiAgICAgICAgICAgIH0pIDogW107XG4gICAgICAgICAgICBvLmxlbmd0aCAmJiAodC5mZWF0dXJlcyA9IG8sIGkuY2FsbChyLCB0KSwgZGVsZXRlIHQuZmVhdHVyZXMpO1xuICAgICAgICAgIH0sIG8pXG4gICAgICAgIH07XG4gICAgICB9LCByLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IGkpIHJldHVybiBvLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIHQsIGUpO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIodCwgZSwgaSk7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgfHwge30sIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XSA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0XSB8fCBbXSwgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3RdLnB1c2gociksIHIuZGVsZWdhdGVzKSB7XG4gICAgICAgICAgdGhpcy5vbihhLCByLmRlbGVnYXRlc1thXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiAodCwgZSwgaSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBpKSByZXR1cm4gby5wcm90b3R5cGUub25jZS5jYWxsKHRoaXMsIHQsIGUpO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIodCwgZSwgaSk7XG5cbiAgICAgICAgZm9yICh2YXIgYSBpbiByLmRlbGVnYXRlcykge1xuICAgICAgICAgIHRoaXMub25jZShhLCByLmRlbGVnYXRlc1thXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIHIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHZhciByID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSA/IG8ucHJvdG90eXBlLm9mZi5jYWxsKHRoaXMsIHQsIGUpIDogKHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyAmJiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdF0gJiYgZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICBmb3IgKHZhciBhID0gb1t0XSwgbiA9IDA7IG4gPCBhLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICB2YXIgcyA9IGFbbl07XG5cbiAgICAgICAgICAgIGlmIChzLmxheWVyID09PSBlICYmIHMubGlzdGVuZXIgPT09IGkpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbCBpbiBzLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgICAgIHIub2ZmKGwsIHMuZGVsZWdhdGVzW2xdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBhLnNwbGljZShuLCAxKSwgcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0odGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzKSwgdGhpcyk7XG4gICAgICB9LCByLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiBbXTtcbiAgICAgICAgdmFyIG87XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGkgfHwgdm9pZCAwID09PSBlIHx8IGUgaW5zdGFuY2VvZiB0LlBvaW50IHx8IEFycmF5LmlzQXJyYXkoZSkgfHwgKGkgPSBlLCBlID0gdm9pZCAwKSwgaSA9IGkgfHwge30sIChlID0gZSB8fCBbWzAsIDBdLCBbdGhpcy50cmFuc2Zvcm0ud2lkdGgsIHRoaXMudHJhbnNmb3JtLmhlaWdodF1dKSBpbnN0YW5jZW9mIHQuUG9pbnQgfHwgXCJudW1iZXJcIiA9PSB0eXBlb2YgZVswXSkgbyA9IFt0LlBvaW50LmNvbnZlcnQoZSldO2Vsc2Uge1xuICAgICAgICAgIHZhciByID0gdC5Qb2ludC5jb252ZXJ0KGVbMF0pLFxuICAgICAgICAgICAgICBhID0gdC5Qb2ludC5jb252ZXJ0KGVbMV0pO1xuICAgICAgICAgIG8gPSBbciwgbmV3IHQuUG9pbnQoYS54LCByLnkpLCBhLCBuZXcgdC5Qb2ludChyLngsIGEueSksIHJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhvLCBpLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5xdWVyeVNvdXJjZUZlYXR1cmVzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyh0LCBlKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnNldFN0eWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgcmV0dXJuICExICE9PSAoaSA9IHQuZXh0ZW5kKHt9LCB7XG4gICAgICAgICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHlcbiAgICAgICAgfSwgaSkpLmRpZmYgJiYgaS5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPT09IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSAmJiB0aGlzLnN0eWxlICYmIGUgPyAodGhpcy5fZGlmZlN0eWxlKGUsIGkpLCB0aGlzKSA6ICh0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBpLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSwgdGhpcy5fdXBkYXRlU3R5bGUoZSwgaSkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0VHJhbnNmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5zZXRUcmFuc2Zvcm1SZXF1ZXN0KHQpLCB0aGlzO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2dldFVJU3RyaW5nID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9sb2NhbGVbdF07XG4gICAgICAgIGlmIChudWxsID09IGUpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgVUkgc3RyaW5nICdcIiArIHQgKyBcIidcIik7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3VwZGF0ZVN0eWxlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUgJiYgKHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKSwgdGhpcy5zdHlsZS5fcmVtb3ZlKCkpLCB0ID8gKHRoaXMuc3R5bGUgPSBuZXcgamUodGhpcywgZSB8fCB7fSksIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7XG4gICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVcbiAgICAgICAgfSksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyB0aGlzLnN0eWxlLmxvYWRVUkwodCkgOiB0aGlzLnN0eWxlLmxvYWRKU09OKHQpLCB0aGlzKSA6IChkZWxldGUgdGhpcy5zdHlsZSwgdGhpcyk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fbGF6eUluaXRFbXB0eVN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0eWxlIHx8ICh0aGlzLnN0eWxlID0gbmV3IGplKHRoaXMsIHt9KSwgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtcbiAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZVxuICAgICAgICB9KSwgdGhpcy5zdHlsZS5sb2FkRW1wdHkoKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fZGlmZlN0eWxlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuXG4gICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChlKSxcbiAgICAgICAgICAgICAgYSA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QociwgdC5SZXNvdXJjZVR5cGUuU3R5bGUpO1xuXG4gICAgICAgICAgdC5nZXRKU09OKGEsIGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgICAgICBlID8gby5maXJlKG5ldyB0LkVycm9yRXZlbnQoZSkpIDogciAmJiBvLl91cGRhdGVEaWZmKHIsIGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgXCJvYmplY3RcIiA9PSB0eXBlb2YgZSAmJiB0aGlzLl91cGRhdGVEaWZmKGUsIGkpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3VwZGF0ZURpZmYgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuc3R5bGUuc2V0U3RhdGUoZSkgJiYgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgICAgfSBjYXRjaCAobykge1xuICAgICAgICAgIHQud2Fybk9uY2UoXCJVbmFibGUgdG8gcGVyZm9ybSBzdHlsZSBkaWZmOiBcIiArIChvLm1lc3NhZ2UgfHwgby5lcnJvciB8fCBvKSArIFwiLiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLlwiKSwgdGhpcy5fdXBkYXRlU3R5bGUoZSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5pc1N0eWxlTG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZSA/IHRoaXMuc3R5bGUubG9hZGVkKCkgOiB0Lndhcm5PbmNlKFwiVGhlcmUgaXMgbm8gc3R5bGUgYWRkZWQgdG8gdGhlIG1hcC5cIik7XG4gICAgICB9LCByLnByb3RvdHlwZS5hZGRTb3VyY2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCksIHRoaXMuc3R5bGUuYWRkU291cmNlKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuaXNTb3VyY2VMb2FkZWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbZV07XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGkpIHJldHVybiBpLmxvYWRlZCgpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCBJRCAnXCIgKyBlICsgXCInXCIpKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5hcmVUaWxlc0xvYWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzO1xuXG4gICAgICAgIGZvciAodmFyIGUgaW4gdCkge1xuICAgICAgICAgIHZhciBpID0gdFtlXS5fdGlsZXM7XG5cbiAgICAgICAgICBmb3IgKHZhciBvIGluIGkpIHtcbiAgICAgICAgICAgIHZhciByID0gaVtvXTtcbiAgICAgICAgICAgIGlmIChcImxvYWRlZFwiICE9PSByLnN0YXRlICYmIFwiZXJyb3JlZFwiICE9PSByLnN0YXRlKSByZXR1cm4gITE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfSwgci5wcm90b3R5cGUuYWRkU291cmNlVHlwZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKSwgdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKHQsIGUsIGkpO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlU291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucmVtb3ZlU291cmNlKHQpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0U291cmNlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKHQpO1xuICAgICAgfSwgci5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSwgbykge1xuICAgICAgICB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSk7XG4gICAgICAgIHZhciByID0gby5waXhlbFJhdGlvO1xuICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSAxKTtcbiAgICAgICAgdmFyIGEgPSBvLnNkZjtcbiAgICAgICAgdm9pZCAwID09PSBhICYmIChhID0gITEpO1xuICAgICAgICB2YXIgbiA9IG8uc3RyZXRjaFgsXG4gICAgICAgICAgICBzID0gby5zdHJldGNoWSxcbiAgICAgICAgICAgIGwgPSBvLmNvbnRlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLCBpIGluc3RhbmNlb2YgVHIgfHwgSXIgJiYgaSBpbnN0YW5jZW9mIElyKSB7XG4gICAgICAgICAgdmFyIGMgPSB0LmJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGkpO1xuICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoZSwge1xuICAgICAgICAgICAgZGF0YTogbmV3IHQuUkdCQUltYWdlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogYy5oZWlnaHRcbiAgICAgICAgICAgIH0sIGMuZGF0YSksXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiByLFxuICAgICAgICAgICAgc3RyZXRjaFg6IG4sXG4gICAgICAgICAgICBzdHJldGNoWTogcyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGwsXG4gICAgICAgICAgICBzZGY6IGEsXG4gICAgICAgICAgICB2ZXJzaW9uOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaS53aWR0aCB8fCB2b2lkIDAgPT09IGkuaGVpZ2h0KSByZXR1cm4gdGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgLCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgXCIpKSk7XG4gICAgICAgICAgdmFyIHUgPSBpO1xuICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoZSwge1xuICAgICAgICAgICAgZGF0YTogbmV3IHQuUkdCQUltYWdlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IGkud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogaS5oZWlnaHRcbiAgICAgICAgICAgIH0sIG5ldyBVaW50OEFycmF5KGkuZGF0YSkpLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogcixcbiAgICAgICAgICAgIHN0cmV0Y2hYOiBuLFxuICAgICAgICAgICAgc3RyZXRjaFk6IHMsXG4gICAgICAgICAgICBjb250ZW50OiBsLFxuICAgICAgICAgICAgc2RmOiBhLFxuICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgIHVzZXJJbWFnZTogdVxuICAgICAgICAgIH0pLCB1Lm9uQWRkICYmIHUub25BZGQodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHIucHJvdG90eXBlLnVwZGF0ZUltYWdlID0gZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLnN0eWxlLmdldEltYWdlKGUpO1xuICAgICAgICBpZiAoIW8pIHJldHVybiB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgbWFwIGhhcyBubyBpbWFnZSB3aXRoIHRoYXQgaWQuIElmIHlvdSBhcmUgYWRkaW5nIGEgbmV3IGltYWdlIHVzZSBgbWFwLmFkZEltYWdlKC4uLilgIGluc3RlYWQuXCIpKSk7XG4gICAgICAgIHZhciByID0gaSBpbnN0YW5jZW9mIFRyIHx8IElyICYmIGkgaW5zdGFuY2VvZiBJciA/IHQuYnJvd3Nlci5nZXRJbWFnZURhdGEoaSkgOiBpLFxuICAgICAgICAgICAgYSA9IHIud2lkdGgsXG4gICAgICAgICAgICBuID0gci5oZWlnaHQsXG4gICAgICAgICAgICBzID0gci5kYXRhO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBhIHx8IHZvaWQgMCA9PT0gbiA/IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHRvIG1hcC51cGRhdGVJbWFnZSgpLiBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCwgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYFwiKSkpIDogYSAhPT0gby5kYXRhLndpZHRoIHx8IG4gIT09IG8uZGF0YS5oZWlnaHQgPyB0aGlzLmZpcmUobmV3IHQuRXJyb3JFdmVudChuZXcgRXJyb3IoXCJUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdXBkYXRlZCBpbWFnZSBtdXN0IGJlIHRoYXQgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgaW1hZ2VcIikpKSA6IChvLmRhdGEucmVwbGFjZShzLCAhKGkgaW5zdGFuY2VvZiBUciB8fCBJciAmJiBpIGluc3RhbmNlb2YgSXIpKSwgdm9pZCB0aGlzLnN0eWxlLnVwZGF0ZUltYWdlKGUsIG8pKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmhhc0ltYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgPyAhIXRoaXMuc3R5bGUuZ2V0SW1hZ2UoZSkgOiAodGhpcy5maXJlKG5ldyB0LkVycm9yRXZlbnQobmV3IEVycm9yKFwiTWlzc2luZyByZXF1aXJlZCBpbWFnZSBpZFwiKSkpLCAhMSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5yZW1vdmVJbWFnZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlSW1hZ2UodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5sb2FkSW1hZ2UgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB0LmdldEltYWdlKHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoZSwgdC5SZXNvdXJjZVR5cGUuSW1hZ2UpLCBpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmxpc3RJbWFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxpc3RJbWFnZXMoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmFkZExheWVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpLCB0aGlzLnN0eWxlLmFkZExheWVyKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUubW92ZUxheWVyID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUubW92ZUxheWVyKHQsIGUpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUucmVtb3ZlTGF5ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5yZW1vdmVMYXllcih0KSwgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldExheWVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5ZXIodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRMYXllclpvb21SYW5nZSA9IGZ1bmN0aW9uICh0LCBlLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKHQsIGUsIGkpLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0RmlsdGVyID0gZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgdGhpcy5zdHlsZS5zZXRGaWx0ZXIodCwgZSwgaSksIHRoaXMuX3VwZGF0ZSghMCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRGaWx0ZXIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRGaWx0ZXIodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRQYWludFByb3BlcnR5ID0gZnVuY3Rpb24gKHQsIGUsIGksIG8pIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gbyAmJiAobyA9IHt9KSwgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KHQsIGUsIGksIG8pLCB0aGlzLl91cGRhdGUoITApO1xuICAgICAgfSwgci5wcm90b3R5cGUuZ2V0UGFpbnRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkodCwgZSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlLCBpLCBvKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IG8gJiYgKG8gPSB7fSksIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkodCwgZSwgaSwgbyksIHRoaXMuX3VwZGF0ZSghMCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRMYXlvdXRQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheW91dFByb3BlcnR5KHQsIGUpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0TGlnaHQgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlICYmIChlID0ge30pLCB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKSwgdGhpcy5zdHlsZS5zZXRMaWdodCh0LCBlKSwgdGhpcy5fdXBkYXRlKCEwKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLmdldExpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuc2V0RmVhdHVyZVN0YXRlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0RmVhdHVyZVN0YXRlKHQsIGUpLCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnJlbW92ZUZlYXR1cmVTdGF0ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnJlbW92ZUZlYXR1cmVTdGF0ZSh0LCBlKSwgdGhpcy5fdXBkYXRlKCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRGZWF0dXJlU3RhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRGZWF0dXJlU3RhdGUodCk7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDYW52YXNDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNDb250YWluZXI7XG4gICAgICB9LCByLnByb3RvdHlwZS5nZXRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXM7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY29udGFpbmVyRGltZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSAwLFxuICAgICAgICAgICAgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXIgJiYgKHQgPSB0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGggfHwgNDAwLCBlID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCAzMDApLCBbdCwgZV07XG4gICAgICB9LCByLnByb3RvdHlwZS5fc2V0dXBDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gdGhpcy5fY29udGFpbmVyO1xuICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLW1hcFwiKTtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9jYW52YXNDb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGJveGdsLWNhbnZhcy1jb250YWluZXJcIiwgdCk7XG4gICAgICAgIHRoaXMuX2ludGVyYWN0aXZlICYmIGUuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtaW50ZXJhY3RpdmVcIiksIHRoaXMuX2NhbnZhcyA9IGkuY3JlYXRlKFwiY2FudmFzXCIsIFwibWFwbGlicmVnbC1jYW52YXNcIiwgZSksIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0bG9zdFwiLCB0aGlzLl9jb250ZXh0TG9zdCwgITEpLCB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsIHRoaXMuX2NvbnRleHRSZXN0b3JlZCwgITEpLCB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpLCB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIk1hcFwiKSwgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJyZWdpb25cIik7XG5cbiAgICAgICAgdmFyIG8gPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XG5cbiAgICAgICAgdGhpcy5fcmVzaXplQ2FudmFzKG9bMF0sIG9bMV0pO1xuXG4gICAgICAgIHZhciByID0gdGhpcy5fY29udHJvbENvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwbGlicmVnbC1jb250cm9sLWNvbnRhaW5lclwiLCB0KSxcbiAgICAgICAgICAgIGEgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zID0ge307XG4gICAgICAgIFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIiwgXCJib3R0b20tcmlnaHRcIl0uZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGFbdF0gPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGxpYnJlZ2wtY3RybC1cIiArIHQsIHIpO1xuICAgICAgICB9KSwgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5fb25NYXBTY3JvbGwsICExKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9yZXNpemVDYW52YXMgPSBmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICB2YXIgbyA9IHQuYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IG8gKiBlLCB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gbyAqIGksIHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aCA9IGUgKyBcInB4XCIsIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBpICsgXCJweFwiO1xuICAgICAgfSwgci5wcm90b3R5cGUuX3NldHVwUGFpbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGkgPSB0LmV4dGVuZCh7fSwgZS53ZWJHTENvbnRleHRBdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRoaXMuX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcbiAgICAgICAgICBhbnRpYWxpYXM6IHRoaXMuX2FudGlhbGlhcyB8fCAhMVxuICAgICAgICB9KSxcbiAgICAgICAgICAgIG8gPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIsIGkpIHx8IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsIGkpO1xuXG4gICAgICAgIG8gPyAodGhpcy5wYWludGVyID0gbmV3IHlvKG8sIHRoaXMudHJhbnNmb3JtKSwgdC53ZWJwU3VwcG9ydGVkLnRlc3RTdXBwb3J0KG8pKSA6IHRoaXMuZmlyZShuZXcgdC5FcnJvckV2ZW50KG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpKSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY29udGV4dExvc3QgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCksIHRoaXMuX2ZyYW1lICYmICh0aGlzLl9mcmFtZS5jYW5jZWwoKSwgdGhpcy5fZnJhbWUgPSBudWxsKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwid2ViZ2xjb250ZXh0bG9zdFwiLCB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9KSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fY29udGV4dFJlc3RvcmVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCksIHRoaXMucmVzaXplKCksIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ3ZWJnbGNvbnRleHRyZXN0b3JlZFwiLCB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9KSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fb25NYXBTY3JvbGwgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodC50YXJnZXQgPT09IHRoaXMuX2NvbnRhaW5lcikgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5zY3JvbGxUb3AgPSAwLCB0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdCA9IDAsICExO1xuICAgICAgfSwgci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3N0eWxlRGlydHkgJiYgIXRoaXMuX3NvdXJjZXNEaXJ0eSAmJiAhIXRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5sb2FkZWQoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZSA/ICh0aGlzLl9zdHlsZURpcnR5ID0gdGhpcy5fc3R5bGVEaXJ0eSB8fCB0LCB0aGlzLl9zb3VyY2VzRGlydHkgPSAhMCwgdGhpcy50cmlnZ2VyUmVwYWludCgpLCB0aGlzKSA6IHRoaXM7XG4gICAgICB9LCByLnByb3RvdHlwZS5fcmVxdWVzdFJlbmRlckZyYW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9yZW5kZXJUYXNrUXVldWUuYWRkKHQpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX2NhbmNlbFJlbmRlckZyYW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLnJlbW92ZSh0KTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG8gPSB0aGlzLFxuICAgICAgICAgICAgciA9IDAsXG4gICAgICAgICAgICBhID0gdGhpcy5wYWludGVyLmNvbnRleHQuZXh0VGltZXJRdWVyeTtcblxuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKFwiZ3B1LXRpbWluZy1mcmFtZVwiKSAmJiAoaSA9IGEuY3JlYXRlUXVlcnlFWFQoKSwgYS5iZWdpblF1ZXJ5RVhUKGEuVElNRV9FTEFQU0VEX0VYVCwgaSksIHIgPSB0LmJyb3dzZXIubm93KCkpLCB0aGlzLnBhaW50ZXIuY29udGV4dC5zZXREaXJ0eSgpLCB0aGlzLnBhaW50ZXIuc2V0QmFzZVN0YXRlKCksIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5ydW4oZSksICF0aGlzLl9yZW1vdmVkKSB7XG4gICAgICAgICAgdmFyIG4gPSAhMTtcblxuICAgICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3N0eWxlRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSAhMTtcbiAgICAgICAgICAgIHZhciBzID0gdGhpcy50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgICAgICAgICBsID0gdC5icm93c2VyLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS56b29tSGlzdG9yeS51cGRhdGUocywgbCk7XG4gICAgICAgICAgICB2YXIgYyA9IG5ldyB0LkV2YWx1YXRpb25QYXJhbWV0ZXJzKHMsIHtcbiAgICAgICAgICAgICAgbm93OiBsLFxuICAgICAgICAgICAgICBmYWRlRHVyYXRpb246IHRoaXMuX2ZhZGVEdXJhdGlvbixcbiAgICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHRoaXMuc3R5bGUuem9vbUhpc3RvcnksXG4gICAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc3R5bGUuZ2V0VHJhbnNpdGlvbigpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB1ID0gYy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuICAgICAgICAgICAgMSA9PT0gdSAmJiB1ID09PSB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciB8fCAobiA9ICEwLCB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IHUpLCB0aGlzLnN0eWxlLnVwZGF0ZShjKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zb3VyY2VzRGlydHkgJiYgKHRoaXMuX3NvdXJjZXNEaXJ0eSA9ICExLCB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKSksIHRoaXMuX3BsYWNlbWVudERpcnR5ID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLl91cGRhdGVQbGFjZW1lbnQodGhpcy5wYWludGVyLnRyYW5zZm9ybSwgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsIHRoaXMuX2ZhZGVEdXJhdGlvbiwgdGhpcy5fY3Jvc3NTb3VyY2VDb2xsaXNpb25zKSwgdGhpcy5wYWludGVyLnJlbmRlcih0aGlzLnN0eWxlLCB7XG4gICAgICAgICAgICBzaG93VGlsZUJvdW5kYXJpZXM6IHRoaXMuc2hvd1RpbGVCb3VuZGFyaWVzLFxuICAgICAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IsXG4gICAgICAgICAgICByb3RhdGluZzogdGhpcy5pc1JvdGF0aW5nKCksXG4gICAgICAgICAgICB6b29taW5nOiB0aGlzLmlzWm9vbWluZygpLFxuICAgICAgICAgICAgbW92aW5nOiB0aGlzLmlzTW92aW5nKCksXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHRoaXMuX2ZhZGVEdXJhdGlvbixcbiAgICAgICAgICAgIHNob3dQYWRkaW5nOiB0aGlzLnNob3dQYWRkaW5nLFxuICAgICAgICAgICAgZ3B1VGltaW5nOiAhIXRoaXMubGlzdGVucyhcImdwdS10aW1pbmctbGF5ZXJcIilcbiAgICAgICAgICB9KSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicmVuZGVyXCIpKSwgdGhpcy5sb2FkZWQoKSAmJiAhdGhpcy5fbG9hZGVkICYmICh0aGlzLl9sb2FkZWQgPSAhMCwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwibG9hZFwiKSkpLCB0aGlzLnN0eWxlICYmICh0aGlzLnN0eWxlLmhhc1RyYW5zaXRpb25zKCkgfHwgbikgJiYgKHRoaXMuX3N0eWxlRGlydHkgPSAhMCksIHRoaXMuc3R5bGUgJiYgIXRoaXMuX3BsYWNlbWVudERpcnR5ICYmIHRoaXMuc3R5bGUuX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKSwgdGhpcy5saXN0ZW5zKFwiZ3B1LXRpbWluZy1mcmFtZVwiKSkge1xuICAgICAgICAgICAgdmFyIGggPSB0LmJyb3dzZXIubm93KCkgLSByO1xuICAgICAgICAgICAgYS5lbmRRdWVyeUVYVChhLlRJTUVfRUxBUFNFRF9FWFQsIGkpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIGUgPSBhLmdldFF1ZXJ5T2JqZWN0RVhUKGksIGEuUVVFUllfUkVTVUxUX0VYVCkgLyAxZTY7XG4gICAgICAgICAgICAgIGEuZGVsZXRlUXVlcnlFWFQoaSksIG8uZmlyZShuZXcgdC5FdmVudChcImdwdS10aW1pbmctZnJhbWVcIiwge1xuICAgICAgICAgICAgICAgIGNwdVRpbWU6IGgsXG4gICAgICAgICAgICAgICAgZ3B1VGltZTogZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMubGlzdGVucyhcImdwdS10aW1pbmctbGF5ZXJcIikpIHtcbiAgICAgICAgICAgIHZhciBwID0gdGhpcy5wYWludGVyLmNvbGxlY3RHcHVUaW1lcnMoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgZSA9IG8ucGFpbnRlci5xdWVyeUdwdVRpbWVycyhwKTtcbiAgICAgICAgICAgICAgby5maXJlKG5ldyB0LkV2ZW50KFwiZ3B1LXRpbWluZy1sYXllclwiLCB7XG4gICAgICAgICAgICAgICAgbGF5ZXJUaW1lczogZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGQgPSB0aGlzLl9zb3VyY2VzRGlydHkgfHwgdGhpcy5fc3R5bGVEaXJ0eSB8fCB0aGlzLl9wbGFjZW1lbnREaXJ0eTtcbiAgICAgICAgICByZXR1cm4gZCB8fCB0aGlzLl9yZXBhaW50ID8gdGhpcy50cmlnZ2VyUmVwYWludCgpIDogIXRoaXMuaXNNb3ZpbmcoKSAmJiB0aGlzLmxvYWRlZCgpICYmIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImlkbGVcIikpLCAhdGhpcy5fbG9hZGVkIHx8IHRoaXMuX2Z1bGx5TG9hZGVkIHx8IGQgfHwgKHRoaXMuX2Z1bGx5TG9hZGVkID0gITApLCB0aGlzO1xuICAgICAgICB9XG4gICAgICB9LCByLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2hhc2ggJiYgdGhpcy5faGFzaC5yZW1vdmUoKTtcblxuICAgICAgICBmb3IgKHZhciBlID0gMCwgaSA9IHRoaXMuX2NvbnRyb2xzOyBlIDwgaS5sZW5ndGg7IGUgKz0gMSkge1xuICAgICAgICAgIGlbZV0ub25SZW1vdmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb250cm9scyA9IFtdLCB0aGlzLl9mcmFtZSAmJiAodGhpcy5fZnJhbWUuY2FuY2VsKCksIHRoaXMuX2ZyYW1lID0gbnVsbCksIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5jbGVhcigpLCB0aGlzLnBhaW50ZXIuZGVzdHJveSgpLCB0aGlzLmhhbmRsZXJzLmRlc3Ryb3koKSwgZGVsZXRlIHRoaXMuaGFuZGxlcnMsIHRoaXMuc2V0U3R5bGUobnVsbCksIHZvaWQgMCAhPT0gdC53aW5kb3cgJiYgKHQud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5fb25XaW5kb3dSZXNpemUsICExKSwgdC53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9yaWVudGF0aW9uY2hhbmdlXCIsIHRoaXMuX29uV2luZG93UmVzaXplLCAhMSksIHQud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5fb25XaW5kb3dPbmxpbmUsICExKSk7XG4gICAgICAgIHZhciBvID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2wuZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfbG9zZV9jb250ZXh0XCIpO1xuICAgICAgICBvICYmIG8ubG9zZUNvbnRleHQoKSwgQ3IodGhpcy5fY2FudmFzQ29udGFpbmVyKSwgQ3IodGhpcy5fY29udHJvbENvbnRhaW5lciksIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1tYXBcIiksIHRoaXMuX3JlbW92ZWQgPSAhMCwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwicmVtb3ZlXCIpKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLnRyaWdnZXJSZXBhaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3R5bGUgJiYgIXRoaXMuX2ZyYW1lICYmICh0aGlzLl9mcmFtZSA9IHQuYnJvd3Nlci5mcmFtZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGUuX2ZyYW1lID0gbnVsbCwgZS5fcmVuZGVyKHQpO1xuICAgICAgICB9KSk7XG4gICAgICB9LCByLnByb3RvdHlwZS5fb25XaW5kb3dPbmxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSwgci5wcm90b3R5cGUuX29uV2luZG93UmVzaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdHJhY2tSZXNpemUgJiYgdGhpcy5yZXNpemUoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgfSkuX3VwZGF0ZSgpO1xuICAgICAgfSwgYS5zaG93VGlsZUJvdW5kYXJpZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM7XG4gICAgICB9LCBhLnNob3dUaWxlQm91bmRhcmllcy5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgIT09IHQgJiYgKHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9IHQsIHRoaXMuX3VwZGF0ZSgpKTtcbiAgICAgIH0sIGEuc2hvd1BhZGRpbmcuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93UGFkZGluZztcbiAgICAgIH0sIGEuc2hvd1BhZGRpbmcuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fc2hvd1BhZGRpbmcgIT09IHQgJiYgKHRoaXMuX3Nob3dQYWRkaW5nID0gdCwgdGhpcy5fdXBkYXRlKCkpO1xuICAgICAgfSwgYS5zaG93Q29sbGlzaW9uQm94ZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7XG4gICAgICB9LCBhLnNob3dDb2xsaXNpb25Cb3hlcy5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgIT09IHQgJiYgKHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHQsIHQgPyB0aGlzLnN0eWxlLl9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCkgOiB0aGlzLl91cGRhdGUoKSk7XG4gICAgICB9LCBhLnNob3dPdmVyZHJhd0luc3BlY3Rvci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcjtcbiAgICAgIH0sIGEuc2hvd092ZXJkcmF3SW5zcGVjdG9yLnNldCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciAhPT0gdCAmJiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gdCwgdGhpcy5fdXBkYXRlKCkpO1xuICAgICAgfSwgYS5yZXBhaW50LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcmVwYWludDtcbiAgICAgIH0sIGEucmVwYWludC5zZXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB0aGlzLl9yZXBhaW50ICE9PSB0ICYmICh0aGlzLl9yZXBhaW50ID0gdCwgdGhpcy50cmlnZ2VyUmVwYWludCgpKTtcbiAgICAgIH0sIGEudmVydGljZXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl92ZXJ0aWNlcztcbiAgICAgIH0sIGEudmVydGljZXMuc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdmVydGljZXMgPSB0LCB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0sIHIucHJvdG90eXBlLl9zZXRDYWNoZUxpbWl0cyA9IGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgIHQuc2V0Q2FjaGVMaW1pdHMoZSwgaSk7XG4gICAgICB9LCBhLnZlcnNpb24uZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdC52ZXJzaW9uO1xuICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoci5wcm90b3R5cGUsIGEpLCByO1xuICAgIH0odnIpO1xuXG4gICAgZnVuY3Rpb24gQ3IodCkge1xuICAgICAgdC5wYXJlbnROb2RlICYmIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtcbiAgICB9XG5cbiAgICB2YXIgenIgPSB7XG4gICAgICBzaG93Q29tcGFzczogITAsXG4gICAgICBzaG93Wm9vbTogITAsXG4gICAgICB2aXN1YWxpemVQaXRjaDogITFcbiAgICB9LFxuICAgICAgICBEciA9IGZ1bmN0aW9uIERyKGUpIHtcbiAgICAgIHZhciBvID0gdGhpcztcbiAgICAgIHRoaXMub3B0aW9ucyA9IHQuZXh0ZW5kKHt9LCB6ciwgZSksIHRoaXMuX2NvbnRhaW5lciA9IGkuY3JlYXRlKFwiZGl2XCIsIFwibWFwbGlicmVnbC1jdHJsIG1hcGxpYnJlZ2wtY3RybC1ncm91cFwiKSwgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSksIHRoaXMub3B0aW9ucy5zaG93Wm9vbSAmJiAodC5iaW5kQWxsKFtcIl9zZXRCdXR0b25UaXRsZVwiLCBcIl91cGRhdGVab29tQnV0dG9uc1wiXSwgdGhpcyksIHRoaXMuX3pvb21JbkJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUJ1dHRvbihcIm1hcGxpYnJlZ2wtY3RybC16b29tLWluXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBvLl9tYXAuem9vbUluKHt9LCB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogdFxuICAgICAgICB9KTtcbiAgICAgIH0pLCBpLmNyZWF0ZShcInNwYW5cIiwgXCJtYXBsaWJyZWdsLWN0cmwtaWNvblwiLCB0aGlzLl96b29tSW5CdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICEwKSwgdGhpcy5fem9vbU91dEJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUJ1dHRvbihcIm1hcGxpYnJlZ2wtY3RybC16b29tLW91dFwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gby5fbWFwLnpvb21PdXQoe30sIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0XG4gICAgICAgIH0pO1xuICAgICAgfSksIGkuY3JlYXRlKFwic3BhblwiLCBcIm1hcGxpYnJlZ2wtY3RybC1pY29uXCIsIHRoaXMuX3pvb21PdXRCdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICEwKSksIHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcyAmJiAodC5iaW5kQWxsKFtcIl9yb3RhdGVDb21wYXNzQXJyb3dcIl0sIHRoaXMpLCB0aGlzLl9jb21wYXNzID0gdGhpcy5fY3JlYXRlQnV0dG9uKFwibWFwbGlicmVnbC1jdHJsLWNvbXBhc3NcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgby5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoID8gby5fbWFwLnJlc2V0Tm9ydGhQaXRjaCh7fSwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgfSkgOiBvLl9tYXAucmVzZXROb3J0aCh7fSwge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRcbiAgICAgICAgfSk7XG4gICAgICB9KSwgdGhpcy5fY29tcGFzc0ljb24gPSBpLmNyZWF0ZShcInNwYW5cIiwgXCJtYXBsaWJyZWdsLWN0cmwtaWNvblwiLCB0aGlzLl9jb21wYXNzKSwgdGhpcy5fY29tcGFzc0ljb24uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgITApKTtcbiAgICB9O1xuXG4gICAgRHIucHJvdG90eXBlLl91cGRhdGVab29tQnV0dG9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICBlID0gdCA9PT0gdGhpcy5fbWFwLmdldE1heFpvb20oKSxcbiAgICAgICAgICBpID0gdCA9PT0gdGhpcy5fbWFwLmdldE1pblpvb20oKTtcblxuICAgICAgdGhpcy5fem9vbUluQnV0dG9uLmRpc2FibGVkID0gZSwgdGhpcy5fem9vbU91dEJ1dHRvbi5kaXNhYmxlZCA9IGksIHRoaXMuX3pvb21JbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIsIGUudG9TdHJpbmcoKSksIHRoaXMuX3pvb21PdXRCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiLCBpLnRvU3RyaW5nKCkpO1xuICAgIH0sIERyLnByb3RvdHlwZS5fcm90YXRlQ29tcGFzc0Fycm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2ggPyBcInNjYWxlKFwiICsgMSAvIE1hdGgucG93KE1hdGguY29zKHRoaXMuX21hcC50cmFuc2Zvcm0ucGl0Y2ggKiAoTWF0aC5QSSAvIDE4MCkpLCAuNSkgKyBcIikgcm90YXRlWChcIiArIHRoaXMuX21hcC50cmFuc2Zvcm0ucGl0Y2ggKyBcImRlZykgcm90YXRlWihcIiArIHRoaXMuX21hcC50cmFuc2Zvcm0uYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSkgKyBcImRlZylcIiA6IFwicm90YXRlKFwiICsgdGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZSAqICgxODAgLyBNYXRoLlBJKSArIFwiZGVnKVwiO1xuICAgICAgdGhpcy5fY29tcGFzc0ljb24uc3R5bGUudHJhbnNmb3JtID0gdDtcbiAgICB9LCBEci5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA9IHQsIHRoaXMub3B0aW9ucy5zaG93Wm9vbSAmJiAodGhpcy5fc2V0QnV0dG9uVGl0bGUodGhpcy5fem9vbUluQnV0dG9uLCBcIlpvb21JblwiKSwgdGhpcy5fc2V0QnV0dG9uVGl0bGUodGhpcy5fem9vbU91dEJ1dHRvbiwgXCJab29tT3V0XCIpLCB0aGlzLl9tYXAub24oXCJ6b29tXCIsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKSwgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMoKSksIHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcyAmJiAodGhpcy5fc2V0QnV0dG9uVGl0bGUodGhpcy5fY29tcGFzcywgXCJSZXNldEJlYXJpbmdcIiksIHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCAmJiB0aGlzLl9tYXAub24oXCJwaXRjaFwiLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLCB0aGlzLl9tYXAub24oXCJyb3RhdGVcIiwgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KSwgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KCksIHRoaXMuX2hhbmRsZXIgPSBuZXcgQXIodGhpcy5fbWFwLCB0aGlzLl9jb21wYXNzLCB0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpKSwgdGhpcy5fY29udGFpbmVyO1xuICAgIH0sIERyLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGkucmVtb3ZlKHRoaXMuX2NvbnRhaW5lciksIHRoaXMub3B0aW9ucy5zaG93Wm9vbSAmJiB0aGlzLl9tYXAub2ZmKFwiem9vbVwiLCB0aGlzLl91cGRhdGVab29tQnV0dG9ucyksIHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcyAmJiAodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoICYmIHRoaXMuX21hcC5vZmYoXCJwaXRjaFwiLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLCB0aGlzLl9tYXAub2ZmKFwicm90YXRlXCIsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyksIHRoaXMuX2hhbmRsZXIub2ZmKCksIGRlbGV0ZSB0aGlzLl9oYW5kbGVyKSwgZGVsZXRlIHRoaXMuX21hcDtcbiAgICB9LCBEci5wcm90b3R5cGUuX2NyZWF0ZUJ1dHRvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgbyA9IGkuY3JlYXRlKFwiYnV0dG9uXCIsIHQsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICByZXR1cm4gby50eXBlID0gXCJidXR0b25cIiwgby5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSksIG87XG4gICAgfSwgRHIucHJvdG90eXBlLl9zZXRCdXR0b25UaXRsZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJOYXZpZ2F0aW9uQ29udHJvbC5cIiArIGUpO1xuXG4gICAgICB0LnRpdGxlID0gaSwgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGkpO1xuICAgIH07XG5cbiAgICB2YXIgQXIgPSBmdW5jdGlvbiBBcihlLCBvLCByKSB7XG4gICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSAhMSksIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gMTAsIHRoaXMuZWxlbWVudCA9IG8sIHRoaXMubW91c2VSb3RhdGUgPSBuZXcgWG8oe1xuICAgICAgICBjbGlja1RvbGVyYW5jZTogZS5kcmFnUm90YXRlLl9tb3VzZVJvdGF0ZS5fY2xpY2tUb2xlcmFuY2VcbiAgICAgIH0pLCB0aGlzLm1hcCA9IGUsIHIgJiYgKHRoaXMubW91c2VQaXRjaCA9IG5ldyBIbyh7XG4gICAgICAgIGNsaWNrVG9sZXJhbmNlOiBlLmRyYWdSb3RhdGUuX21vdXNlUGl0Y2guX2NsaWNrVG9sZXJhbmNlXG4gICAgICB9KSksIHQuYmluZEFsbChbXCJtb3VzZWRvd25cIiwgXCJtb3VzZW1vdmVcIiwgXCJtb3VzZXVwXCIsIFwidG91Y2hzdGFydFwiLCBcInRvdWNobW92ZVwiLCBcInRvdWNoZW5kXCIsIFwicmVzZXRcIl0sIHRoaXMpLCBpLmFkZEV2ZW50TGlzdGVuZXIobywgXCJtb3VzZWRvd25cIiwgdGhpcy5tb3VzZWRvd24pLCBpLmFkZEV2ZW50TGlzdGVuZXIobywgXCJ0b3VjaHN0YXJ0XCIsIHRoaXMudG91Y2hzdGFydCwge1xuICAgICAgICBwYXNzaXZlOiAhMVxuICAgICAgfSksIGkuYWRkRXZlbnRMaXN0ZW5lcihvLCBcInRvdWNobW92ZVwiLCB0aGlzLnRvdWNobW92ZSksIGkuYWRkRXZlbnRMaXN0ZW5lcihvLCBcInRvdWNoZW5kXCIsIHRoaXMudG91Y2hlbmQpLCBpLmFkZEV2ZW50TGlzdGVuZXIobywgXCJ0b3VjaGNhbmNlbFwiLCB0aGlzLnJlc2V0KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gTXIoZSwgaSwgbykge1xuICAgICAgaWYgKGUgPSBuZXcgdC5MbmdMYXQoZS5sbmcsIGUubGF0KSwgaSkge1xuICAgICAgICB2YXIgciA9IG5ldyB0LkxuZ0xhdChlLmxuZyAtIDM2MCwgZS5sYXQpLFxuICAgICAgICAgICAgYSA9IG5ldyB0LkxuZ0xhdChlLmxuZyArIDM2MCwgZS5sYXQpLFxuICAgICAgICAgICAgbiA9IG8ubG9jYXRpb25Qb2ludChlKS5kaXN0U3FyKGkpO1xuICAgICAgICBvLmxvY2F0aW9uUG9pbnQocikuZGlzdFNxcihpKSA8IG4gPyBlID0gciA6IG8ubG9jYXRpb25Qb2ludChhKS5kaXN0U3FyKGkpIDwgbiAmJiAoZSA9IGEpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgTWF0aC5hYnMoZS5sbmcgLSBvLmNlbnRlci5sbmcpID4gMTgwOykge1xuICAgICAgICB2YXIgcyA9IG8ubG9jYXRpb25Qb2ludChlKTtcbiAgICAgICAgaWYgKHMueCA+PSAwICYmIHMueSA+PSAwICYmIHMueCA8PSBvLndpZHRoICYmIHMueSA8PSBvLmhlaWdodCkgYnJlYWs7XG4gICAgICAgIGUubG5nID4gby5jZW50ZXIubG5nID8gZS5sbmcgLT0gMzYwIDogZS5sbmcgKz0gMzYwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBBci5wcm90b3R5cGUuZG93biA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLm1vdXNlUm90YXRlLm1vdXNlZG93bih0LCBlKSwgdGhpcy5tb3VzZVBpdGNoICYmIHRoaXMubW91c2VQaXRjaC5tb3VzZWRvd24odCwgZSksIGkuZGlzYWJsZURyYWcoKTtcbiAgICB9LCBBci5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgaSA9IHRoaXMubWFwLFxuICAgICAgICAgIG8gPSB0aGlzLm1vdXNlUm90YXRlLm1vdXNlbW92ZVdpbmRvdyh0LCBlKTtcblxuICAgICAgaWYgKG8gJiYgby5iZWFyaW5nRGVsdGEgJiYgaS5zZXRCZWFyaW5nKGkuZ2V0QmVhcmluZygpICsgby5iZWFyaW5nRGVsdGEpLCB0aGlzLm1vdXNlUGl0Y2gpIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm1vdXNlUGl0Y2gubW91c2Vtb3ZlV2luZG93KHQsIGUpO1xuICAgICAgICByICYmIHIucGl0Y2hEZWx0YSAmJiBpLnNldFBpdGNoKGkuZ2V0UGl0Y2goKSArIHIucGl0Y2hEZWx0YSk7XG4gICAgICB9XG4gICAgfSwgQXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5lbGVtZW50O1xuICAgICAgaS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIFwibW91c2Vkb3duXCIsIHRoaXMubW91c2Vkb3duKSwgaS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIFwidG91Y2hzdGFydFwiLCB0aGlzLnRvdWNoc3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogITFcbiAgICAgIH0pLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgXCJ0b3VjaG1vdmVcIiwgdGhpcy50b3VjaG1vdmUpLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgXCJ0b3VjaGVuZFwiLCB0aGlzLnRvdWNoZW5kKSwgaS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIFwidG91Y2hjYW5jZWxcIiwgdGhpcy5yZXNldCksIHRoaXMub2ZmVGVtcCgpO1xuICAgIH0sIEFyLnByb3RvdHlwZS5vZmZUZW1wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaS5lbmFibGVEcmFnKCksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LndpbmRvdywgXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIodC53aW5kb3csIFwibW91c2V1cFwiLCB0aGlzLm1vdXNldXApO1xuICAgIH0sIEFyLnByb3RvdHlwZS5tb3VzZWRvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdGhpcy5kb3duKHQuZXh0ZW5kKHt9LCBlLCB7XG4gICAgICAgIGN0cmxLZXk6ICEwLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSksIGkubW91c2VQb3ModGhpcy5lbGVtZW50LCBlKSksIGkuYWRkRXZlbnRMaXN0ZW5lcih0LndpbmRvdywgXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpLCBpLmFkZEV2ZW50TGlzdGVuZXIodC53aW5kb3csIFwibW91c2V1cFwiLCB0aGlzLm1vdXNldXApO1xuICAgIH0sIEFyLnByb3RvdHlwZS5tb3VzZW1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5tb3ZlKHQsIGkubW91c2VQb3ModGhpcy5lbGVtZW50LCB0KSk7XG4gICAgfSwgQXIucHJvdG90eXBlLm1vdXNldXAgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5tb3VzZVJvdGF0ZS5tb3VzZXVwV2luZG93KHQpLCB0aGlzLm1vdXNlUGl0Y2ggJiYgdGhpcy5tb3VzZVBpdGNoLm1vdXNldXBXaW5kb3codCksIHRoaXMub2ZmVGVtcCgpO1xuICAgIH0sIEFyLnByb3RvdHlwZS50b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIDEgIT09IHQudGFyZ2V0VG91Y2hlcy5sZW5ndGggPyB0aGlzLnJlc2V0KCkgOiAodGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9sYXN0UG9zID0gaS50b3VjaFBvcyh0aGlzLmVsZW1lbnQsIHQudGFyZ2V0VG91Y2hlcylbMF0sIHRoaXMuZG93bih7XG4gICAgICAgIHR5cGU6IFwibW91c2Vkb3duXCIsXG4gICAgICAgIGJ1dHRvbjogMCxcbiAgICAgICAgY3RybEtleTogITAsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgICByZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLl9zdGFydFBvcykpO1xuICAgIH0sIEFyLnByb3RvdHlwZS50b3VjaG1vdmUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgMSAhPT0gdC50YXJnZXRUb3VjaGVzLmxlbmd0aCA/IHRoaXMucmVzZXQoKSA6ICh0aGlzLl9sYXN0UG9zID0gaS50b3VjaFBvcyh0aGlzLmVsZW1lbnQsIHQudGFyZ2V0VG91Y2hlcylbMF0sIHRoaXMubW92ZSh7XG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgICByZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLl9sYXN0UG9zKSk7XG4gICAgfSwgQXIucHJvdG90eXBlLnRvdWNoZW5kID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIDAgPT09IHQudGFyZ2V0VG91Y2hlcy5sZW5ndGggJiYgdGhpcy5fc3RhcnRQb3MgJiYgdGhpcy5fbGFzdFBvcyAmJiB0aGlzLl9zdGFydFBvcy5kaXN0KHRoaXMuX2xhc3RQb3MpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UgJiYgdGhpcy5lbGVtZW50LmNsaWNrKCksIHRoaXMucmVzZXQoKTtcbiAgICB9LCBBci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLm1vdXNlUm90YXRlLnJlc2V0KCksIHRoaXMubW91c2VQaXRjaCAmJiB0aGlzLm1vdXNlUGl0Y2gucmVzZXQoKSwgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zLCBkZWxldGUgdGhpcy5fbGFzdFBvcywgdGhpcy5vZmZUZW1wKCk7XG4gICAgfTtcbiAgICB2YXIgTHIgPSB7XG4gICAgICBjZW50ZXI6IFwidHJhbnNsYXRlKC01MCUsLTUwJSlcIixcbiAgICAgIHRvcDogXCJ0cmFuc2xhdGUoLTUwJSwwKVwiLFxuICAgICAgXCJ0b3AtbGVmdFwiOiBcInRyYW5zbGF0ZSgwLDApXCIsXG4gICAgICBcInRvcC1yaWdodFwiOiBcInRyYW5zbGF0ZSgtMTAwJSwwKVwiLFxuICAgICAgYm90dG9tOiBcInRyYW5zbGF0ZSgtNTAlLC0xMDAlKVwiLFxuICAgICAgXCJib3R0b20tbGVmdFwiOiBcInRyYW5zbGF0ZSgwLC0xMDAlKVwiLFxuICAgICAgXCJib3R0b20tcmlnaHRcIjogXCJ0cmFuc2xhdGUoLTEwMCUsLTEwMCUpXCIsXG4gICAgICBsZWZ0OiBcInRyYW5zbGF0ZSgwLC01MCUpXCIsXG4gICAgICByaWdodDogXCJ0cmFuc2xhdGUoLTEwMCUsLTUwJSlcIlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBScih0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IHQuY2xhc3NMaXN0O1xuXG4gICAgICBmb3IgKHZhciByIGluIExyKSB7XG4gICAgICAgIG8ucmVtb3ZlKFwibWFwbGlicmVnbC1cIiArIGkgKyBcIi1hbmNob3ItXCIgKyByKTtcbiAgICAgIH1cblxuICAgICAgby5hZGQoXCJtYXBsaWJyZWdsLVwiICsgaSArIFwiLWFuY2hvci1cIiArIGUpO1xuICAgIH1cblxuICAgIHZhciBrcixcbiAgICAgICAgQnIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gbyhvLCByKSB7XG4gICAgICAgIGlmIChlLmNhbGwodGhpcyksIChvIGluc3RhbmNlb2YgdC53aW5kb3cuSFRNTEVsZW1lbnQgfHwgcikgJiYgKG8gPSB0LmV4dGVuZCh7XG4gICAgICAgICAgZWxlbWVudDogb1xuICAgICAgICB9LCByKSksIHQuYmluZEFsbChbXCJfdXBkYXRlXCIsIFwiX29uTW92ZVwiLCBcIl9vblVwXCIsIFwiX2FkZERyYWdIYW5kbGVyXCIsIFwiX29uTWFwQ2xpY2tcIiwgXCJfb25LZXlQcmVzc1wiXSwgdGhpcyksIHRoaXMuX2FuY2hvciA9IG8gJiYgby5hbmNob3IgfHwgXCJjZW50ZXJcIiwgdGhpcy5fY29sb3IgPSBvICYmIG8uY29sb3IgfHwgXCIjM0ZCMUNFXCIsIHRoaXMuX3NjYWxlID0gbyAmJiBvLnNjYWxlIHx8IDEsIHRoaXMuX2RyYWdnYWJsZSA9IG8gJiYgby5kcmFnZ2FibGUgfHwgITEsIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gbyAmJiBvLmNsaWNrVG9sZXJhbmNlIHx8IDAsIHRoaXMuX2lzRHJhZ2dpbmcgPSAhMSwgdGhpcy5fc3RhdGUgPSBcImluYWN0aXZlXCIsIHRoaXMuX3JvdGF0aW9uID0gbyAmJiBvLnJvdGF0aW9uIHx8IDAsIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID0gbyAmJiBvLnJvdGF0aW9uQWxpZ25tZW50IHx8IFwiYXV0b1wiLCB0aGlzLl9waXRjaEFsaWdubWVudCA9IG8gJiYgby5waXRjaEFsaWdubWVudCAmJiBcImF1dG9cIiAhPT0gby5waXRjaEFsaWdubWVudCA/IG8ucGl0Y2hBbGlnbm1lbnQgOiB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCwgbyAmJiBvLmVsZW1lbnQpIHRoaXMuX2VsZW1lbnQgPSBvLmVsZW1lbnQsIHRoaXMuX29mZnNldCA9IHQuUG9pbnQuY29udmVydChvICYmIG8ub2Zmc2V0IHx8IFswLCAwXSk7ZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZGVmYXVsdE1hcmtlciA9ICEwLCB0aGlzLl9lbGVtZW50ID0gaS5jcmVhdGUoXCJkaXZcIiksIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIk1hcCBtYXJrZXJcIik7XG4gICAgICAgICAgdmFyIGEgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRpc3BsYXlcIiwgXCJibG9ja1wiKSwgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjQxcHhcIiksIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBcIjI3cHhcIiksIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAwIDI3IDQxXCIpO1xuICAgICAgICAgIHZhciBuID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlXCIsIFwibm9uZVwiKSwgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS13aWR0aFwiLCBcIjFcIiksIG4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKSwgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICAgICAgdmFyIHMgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJub256ZXJvXCIpO1xuICAgICAgICAgIHZhciBsID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKDMuMCwgMjkuMClcIiksIGwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwiIzAwMDAwMFwiKTtcblxuICAgICAgICAgIGZvciAodmFyIGMgPSAwLCB1ID0gW3tcbiAgICAgICAgICAgIHJ4OiBcIjEwLjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjUuMjUwMDIyNzNcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHJ4OiBcIjEwLjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjUuMjUwMDIyNzNcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHJ4OiBcIjkuNVwiLFxuICAgICAgICAgICAgcnk6IFwiNC43NzI3NTAwN1wiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgcng6IFwiOC41XCIsXG4gICAgICAgICAgICByeTogXCI0LjI5NTQ5OTM2XCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICByeDogXCI3LjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjMuODE4MjIzMDhcIlxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHJ4OiBcIjYuNVwiLFxuICAgICAgICAgICAgcnk6IFwiMy4zNDA5NDY3OVwiXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgcng6IFwiNS41XCIsXG4gICAgICAgICAgICByeTogXCIyLjg2MzY3MDUxXCJcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICByeDogXCI0LjVcIixcbiAgICAgICAgICAgIHJ5OiBcIjIuMzg2MzY4NjRcIlxuICAgICAgICAgIH1dOyBjIDwgdS5sZW5ndGg7IGMgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGggPSB1W2NdLFxuICAgICAgICAgICAgICAgIHAgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJlbGxpcHNlXCIpO1xuICAgICAgICAgICAgcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm9wYWNpdHlcIiwgXCIwLjA0XCIpLCBwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgXCIxMC41XCIpLCBwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3lcIiwgXCI1LjgwMDI5MDA4XCIpLCBwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwicnhcIiwgaC5yeCksIHAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJyeVwiLCBoLnJ5KSwgbC5hcHBlbmRDaGlsZChwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZCA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgdGhpcy5fY29sb3IpO1xuXG4gICAgICAgICAgdmFyIF8gPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuXG4gICAgICAgICAgXy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgXCJNMjcsMTMuNSBDMjcsMTkuMDc0NjQ0IDIwLjI1MDAwMSwyNy4wMDAwMDIgMTQuNzUsMzQuNTAwMDAyIEMxNC4wMTY2NjUsMzUuNTAwMDA0IDEyLjk4MzMzNSwzNS41MDAwMDQgMTIuMjUsMzQuNTAwMDAyIEM2Ljc0OTk5OTMsMjcuMDAwMDAyIDAsMTkuMjIyNTYyIDAsMTMuNSBDMCw2LjA0NDE1NTkgNi4wNDQxNTU5LDAgMTMuNSwwIEMyMC45NTU4NDQsMCAyNyw2LjA0NDE1NTkgMjcsMTMuNSBaXCIpLCBkLmFwcGVuZENoaWxkKF8pO1xuICAgICAgICAgIHZhciBmID0gaS5jcmVhdGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgICAgICAgICBmLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwib3BhY2l0eVwiLCBcIjAuMjVcIiksIGYuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwiIzAwMDAwMFwiKTtcbiAgICAgICAgICB2YXIgbSA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgICAgICAgbS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgXCJNMTMuNSwwIEM2LjA0NDE1NTksMCAwLDYuMDQ0MTU1OSAwLDEzLjUgQzAsMTkuMjIyNTYyIDYuNzQ5OTk5MywyNyAxMi4yNSwzNC41IEMxMywzNS41MjI3MjcgMTQuMDE2NjY0LDM1LjUwMDAwNCAxNC43NSwzNC41IEMyMC4yNTAwMDEsMjcgMjcsMTkuMDc0NjQ0IDI3LDEzLjUgQzI3LDYuMDQ0MTU1OSAyMC45NTU4NDQsMCAxMy41LDAgWiBNMTMuNSwxIEMyMC40MTU0MDQsMSAyNiw2LjU4NDU5NiAyNiwxMy41IEMyNiwxNS44OTg2NTcgMjQuNDk1NTg0LDE5LjE4MTQzMSAyMi4yMjA3MDMsMjIuNzM4MjgxIEMxOS45NDU4MjMsMjYuMjk1MTMyIDE2LjcwNTExOSwzMC4xNDIxNjcgMTMuOTQzMzU5LDMzLjkwODIwMyBDMTMuNzQzNDQ1LDM0LjE4MDgxNCAxMy42MTI3MTUsMzQuMzIyNzM4IDEzLjUsMzQuNDQxNDA2IEMxMy4zODcyODUsMzQuMzIyNzM4IDEzLjI1NjU1NSwzNC4xODA4MTQgMTMuMDU2NjQxLDMzLjkwODIwMyBDMTAuMjg0NDgxLDMwLjEyNzk4NSA3LjQxNDg2ODQsMjYuMzE0MTU5IDUuMDE1NjI1LDIyLjc3MzQzOCBDMi42MTYzODE2LDE5LjIzMjcxNSAxLDE1Ljk1MzUzOCAxLDEzLjUgQzEsNi41ODQ1OTYgNi41ODQ1OTYsMSAxMy41LDEgWlwiKSwgZi5hcHBlbmRDaGlsZChtKTtcbiAgICAgICAgICB2YXIgZyA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZSg2LjAsIDcuMClcIiksIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwiI0ZGRkZGRlwiKTtcbiAgICAgICAgICB2YXIgdiA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgICAgICAgdi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZSg4LjAsIDguMClcIik7XG4gICAgICAgICAgdmFyIHkgPSBpLmNyZWF0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJjaXJjbGVcIik7XG4gICAgICAgICAgeS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCIjMDAwMDAwXCIpLCB5LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwib3BhY2l0eVwiLCBcIjAuMjVcIiksIHkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeFwiLCBcIjUuNVwiKSwgeS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIFwiNS41XCIpLCB5LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBcIjUuNDk5OTk2MlwiKTtcbiAgICAgICAgICB2YXIgeCA9IGkuY3JlYXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImNpcmNsZVwiKTtcbiAgICAgICAgICB4LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIiNGRkZGRkZcIiksIHguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeFwiLCBcIjUuNVwiKSwgeC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIFwiNS41XCIpLCB4LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBcIjUuNDk5OTk2MlwiKSwgdi5hcHBlbmRDaGlsZCh5KSwgdi5hcHBlbmRDaGlsZCh4KSwgcy5hcHBlbmRDaGlsZChsKSwgcy5hcHBlbmRDaGlsZChkKSwgcy5hcHBlbmRDaGlsZChmKSwgcy5hcHBlbmRDaGlsZChnKSwgcy5hcHBlbmRDaGlsZCh2KSwgYS5hcHBlbmRDaGlsZChzKSwgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCA0MSAqIHRoaXMuX3NjYWxlICsgXCJweFwiKSwgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIDI3ICogdGhpcy5fc2NhbGUgKyBcInB4XCIpLCB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGEpLCB0aGlzLl9vZmZzZXQgPSB0LlBvaW50LmNvbnZlcnQobyAmJiBvLm9mZnNldCB8fCBbMCwgLTE0XSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1tYXJrZXJcIiksIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdzdGFydFwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksIFJyKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2FuY2hvciwgXCJtYXJrZXJcIiksIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGUgJiYgKG8uX19wcm90b19fID0gZSksIChvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gbywgby5wcm90b3R5cGUuYWRkVG8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoKSwgdGhpcy5fbWFwID0gdCwgdC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSwgdC5vbihcIm1vdmVcIiwgdGhpcy5fdXBkYXRlKSwgdC5vbihcIm1vdmVlbmRcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5zZXREcmFnZ2FibGUodGhpcy5fZHJhZ2dhYmxlKSwgdGhpcy5fdXBkYXRlKCksIHRoaXMuX21hcC5vbihcImNsaWNrXCIsIHRoaXMuX29uTWFwQ2xpY2spLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwICYmICh0aGlzLl9tYXAub2ZmKFwiY2xpY2tcIiwgdGhpcy5fb25NYXBDbGljayksIHRoaXMuX21hcC5vZmYoXCJtb3ZlXCIsIHRoaXMuX3VwZGF0ZSksIHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsIHRoaXMuX3VwZGF0ZSksIHRoaXMuX21hcC5vZmYoXCJtb3VzZWRvd25cIiwgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpLCB0aGlzLl9tYXAub2ZmKFwidG91Y2hzdGFydFwiLCB0aGlzLl9hZGREcmFnSGFuZGxlciksIHRoaXMuX21hcC5vZmYoXCJtb3VzZXVwXCIsIHRoaXMuX29uVXApLCB0aGlzLl9tYXAub2ZmKFwidG91Y2hlbmRcIiwgdGhpcy5fb25VcCksIHRoaXMuX21hcC5vZmYoXCJtb3VzZW1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fbWFwLm9mZihcInRvdWNobW92ZVwiLCB0aGlzLl9vbk1vdmUpLCBkZWxldGUgdGhpcy5fbWFwKSwgaS5yZW1vdmUodGhpcy5fZWxlbWVudCksIHRoaXMuX3BvcHVwICYmIHRoaXMuX3BvcHVwLnJlbW92ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0TG5nTGF0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0O1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0TG5nTGF0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdCA9IHQuTG5nTGF0LmNvbnZlcnQoZSksIHRoaXMuX3BvcyA9IG51bGwsIHRoaXMuX3BvcHVwICYmIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpLCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0UG9wdXAgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodGhpcy5fcG9wdXAgJiYgKHRoaXMuX3BvcHVwLnJlbW92ZSgpLCB0aGlzLl9wb3B1cCA9IG51bGwsIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIHRoaXMuX29uS2V5UHJlc3MpLCB0aGlzLl9vcmlnaW5hbFRhYkluZGV4IHx8IHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIikpLCB0KSB7XG4gICAgICAgICAgaWYgKCEoXCJvZmZzZXRcIiBpbiB0Lm9wdGlvbnMpKSB7XG4gICAgICAgICAgICB2YXIgZSA9IE1hdGguc3FydChNYXRoLnBvdygxMy41LCAyKSAvIDIpO1xuICAgICAgICAgICAgdC5vcHRpb25zLm9mZnNldCA9IHRoaXMuX2RlZmF1bHRNYXJrZXIgPyB7XG4gICAgICAgICAgICAgIHRvcDogWzAsIDBdLFxuICAgICAgICAgICAgICBcInRvcC1sZWZ0XCI6IFswLCAwXSxcbiAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogWzAsIDBdLFxuICAgICAgICAgICAgICBib3R0b206IFswLCAtMzguMV0sXG4gICAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjogW2UsIC0xICogKDI0LjYgKyBlKV0sXG4gICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IFstZSwgLTEgKiAoMjQuNiArIGUpXSxcbiAgICAgICAgICAgICAgbGVmdDogWzEzLjUsIC0yNC42XSxcbiAgICAgICAgICAgICAgcmlnaHQ6IFstMTMuNSwgLTI0LjZdXG4gICAgICAgICAgICB9IDogdGhpcy5fb2Zmc2V0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3BvcHVwID0gdCwgdGhpcy5fbG5nTGF0ICYmIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpLCB0aGlzLl9vcmlnaW5hbFRhYkluZGV4ID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSwgdGhpcy5fb3JpZ2luYWxUYWJJbmRleCB8fCB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKSwgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgdGhpcy5fb25LZXlQcmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vbktleVByZXNzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0LmNvZGUsXG4gICAgICAgICAgICBpID0gdC5jaGFyQ29kZSB8fCB0LmtleUNvZGU7XG4gICAgICAgIFwiU3BhY2VcIiAhPT0gZSAmJiBcIkVudGVyXCIgIT09IGUgJiYgMzIgIT09IGkgJiYgMTMgIT09IGkgfHwgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uTWFwQ2xpY2sgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQub3JpZ2luYWxFdmVudC50YXJnZXQsXG4gICAgICAgICAgICBpID0gdGhpcy5fZWxlbWVudDtcbiAgICAgICAgdGhpcy5fcG9wdXAgJiYgKGUgPT09IGkgfHwgaS5jb250YWlucyhlKSkgJiYgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0UG9wdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cDtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnRvZ2dsZVBvcHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuX3BvcHVwO1xuICAgICAgICByZXR1cm4gdCA/ICh0LmlzT3BlbigpID8gdC5yZW1vdmUoKSA6IHQuYWRkVG8odGhpcy5fbWFwKSwgdGhpcykgOiB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICB0aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzICYmICh0aGlzLl9sbmdMYXQgPSBNcih0aGlzLl9sbmdMYXQsIHRoaXMuX3BvcywgdGhpcy5fbWFwLnRyYW5zZm9ybSkpLCB0aGlzLl9wb3MgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sbmdMYXQpLl9hZGQodGhpcy5fb2Zmc2V0KTtcbiAgICAgICAgICB2YXIgZSA9IFwiXCI7XG4gICAgICAgICAgXCJ2aWV3cG9ydFwiID09PSB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCB8fCBcImF1dG9cIiA9PT0gdGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPyBlID0gXCJyb3RhdGVaKFwiICsgdGhpcy5fcm90YXRpb24gKyBcImRlZylcIiA6IFwibWFwXCIgPT09IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ICYmIChlID0gXCJyb3RhdGVaKFwiICsgKHRoaXMuX3JvdGF0aW9uIC0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSkgKyBcImRlZylcIik7XG4gICAgICAgICAgdmFyIG8gPSBcIlwiO1xuICAgICAgICAgIFwidmlld3BvcnRcIiA9PT0gdGhpcy5fcGl0Y2hBbGlnbm1lbnQgfHwgXCJhdXRvXCIgPT09IHRoaXMuX3BpdGNoQWxpZ25tZW50ID8gbyA9IFwicm90YXRlWCgwZGVnKVwiIDogXCJtYXBcIiA9PT0gdGhpcy5fcGl0Y2hBbGlnbm1lbnQgJiYgKG8gPSBcInJvdGF0ZVgoXCIgKyB0aGlzLl9tYXAuZ2V0UGl0Y2goKSArIFwiZGVnKVwiKSwgdCAmJiBcIm1vdmVlbmRcIiAhPT0gdC50eXBlIHx8ICh0aGlzLl9wb3MgPSB0aGlzLl9wb3Mucm91bmQoKSksIGkuc2V0VHJhbnNmb3JtKHRoaXMuX2VsZW1lbnQsIExyW3RoaXMuX2FuY2hvcl0gKyBcIiB0cmFuc2xhdGUoXCIgKyB0aGlzLl9wb3MueCArIFwicHgsIFwiICsgdGhpcy5fcG9zLnkgKyBcInB4KSBcIiArIG8gKyBcIiBcIiArIGUpO1xuICAgICAgICB9XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRPZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRPZmZzZXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2Zmc2V0ID0gdC5Qb2ludC5jb252ZXJ0KGUpLCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vbk1vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzRHJhZ2dpbmcpIHtcbiAgICAgICAgICB2YXIgaSA9IHRoaXMuX2NsaWNrVG9sZXJhbmNlIHx8IHRoaXMuX21hcC5fY2xpY2tUb2xlcmFuY2U7XG4gICAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGUucG9pbnQuZGlzdCh0aGlzLl9wb2ludGVyZG93blBvcykgPj0gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzRHJhZ2dpbmcgJiYgKHRoaXMuX3BvcyA9IGUucG9pbnQuc3ViKHRoaXMuX3Bvc2l0aW9uRGVsdGEpLCB0aGlzLl9sbmdMYXQgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHRoaXMuX3BvcyksIHRoaXMuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCksIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiLCBcInBlbmRpbmdcIiA9PT0gdGhpcy5fc3RhdGUgJiYgKHRoaXMuX3N0YXRlID0gXCJhY3RpdmVcIiwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZHJhZ3N0YXJ0XCIpKSksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcImRyYWdcIikpKTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vblVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIiwgdGhpcy5fcG9zaXRpb25EZWx0YSA9IG51bGwsIHRoaXMuX3BvaW50ZXJkb3duUG9zID0gbnVsbCwgdGhpcy5faXNEcmFnZ2luZyA9ICExLCB0aGlzLl9tYXAub2ZmKFwibW91c2Vtb3ZlXCIsIHRoaXMuX29uTW92ZSksIHRoaXMuX21hcC5vZmYoXCJ0b3VjaG1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgXCJhY3RpdmVcIiA9PT0gdGhpcy5fc3RhdGUgJiYgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZHJhZ2VuZFwiKSksIHRoaXMuX3N0YXRlID0gXCJpbmFjdGl2ZVwiO1xuICAgICAgfSwgby5wcm90b3R5cGUuX2FkZERyYWdIYW5kbGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jb250YWlucyh0Lm9yaWdpbmFsRXZlbnQudGFyZ2V0KSAmJiAodC5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLl9wb3NpdGlvbkRlbHRhID0gdC5wb2ludC5zdWIodGhpcy5fcG9zKS5hZGQodGhpcy5fb2Zmc2V0KSwgdGhpcy5fcG9pbnRlcmRvd25Qb3MgPSB0LnBvaW50LCB0aGlzLl9zdGF0ZSA9IFwicGVuZGluZ1wiLCB0aGlzLl9tYXAub24oXCJtb3VzZW1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fbWFwLm9uKFwidG91Y2htb3ZlXCIsIHRoaXMuX29uTW92ZSksIHRoaXMuX21hcC5vbmNlKFwibW91c2V1cFwiLCB0aGlzLl9vblVwKSwgdGhpcy5fbWFwLm9uY2UoXCJ0b3VjaGVuZFwiLCB0aGlzLl9vblVwKSk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXREcmFnZ2FibGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dhYmxlID0gISF0LCB0aGlzLl9tYXAgJiYgKHQgPyAodGhpcy5fbWFwLm9uKFwibW91c2Vkb3duXCIsIHRoaXMuX2FkZERyYWdIYW5kbGVyKSwgdGhpcy5fbWFwLm9uKFwidG91Y2hzdGFydFwiLCB0aGlzLl9hZGREcmFnSGFuZGxlcikpIDogKHRoaXMuX21hcC5vZmYoXCJtb3VzZWRvd25cIiwgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpLCB0aGlzLl9tYXAub2ZmKFwidG91Y2hzdGFydFwiLCB0aGlzLl9hZGREcmFnSGFuZGxlcikpKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmlzRHJhZ2dhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dhYmxlO1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0Um90YXRpb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb24gPSB0IHx8IDAsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbjtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldFJvdGF0aW9uQWxpZ25tZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID0gdCB8fCBcImF1dG9cIiwgdGhpcy5fdXBkYXRlKCksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRSb3RhdGlvbkFsaWdubWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50O1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0UGl0Y2hBbGlnbm1lbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPSB0ICYmIFwiYXV0b1wiICE9PSB0ID8gdCA6IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50LCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmdldFBpdGNoQWxpZ25tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2hBbGlnbm1lbnQ7XG4gICAgICB9LCBvO1xuICAgIH0odC5FdmVudGVkKSxcbiAgICAgICAgT3IgPSB7XG4gICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiAhMSxcbiAgICAgICAgbWF4aW11bUFnZTogMCxcbiAgICAgICAgdGltZW91dDogNmUzXG4gICAgICB9LFxuICAgICAgZml0Qm91bmRzT3B0aW9uczoge1xuICAgICAgICBtYXhab29tOiAxNVxuICAgICAgfSxcbiAgICAgIHRyYWNrVXNlckxvY2F0aW9uOiAhMSxcbiAgICAgIHNob3dBY2N1cmFjeUNpcmNsZTogITAsXG4gICAgICBzaG93VXNlckxvY2F0aW9uOiAhMFxuICAgIH0sXG4gICAgICAgIEZyID0gMCxcbiAgICAgICAgVXIgPSAhMSxcbiAgICAgICAgTnIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5vcHRpb25zID0gdC5leHRlbmQoe30sIE9yLCBpKSwgdC5iaW5kQWxsKFtcIl9vblN1Y2Nlc3NcIiwgXCJfb25FcnJvclwiLCBcIl9vblpvb21cIiwgXCJfZmluaXNoXCIsIFwiX3NldHVwVUlcIiwgXCJfdXBkYXRlQ2FtZXJhXCIsIFwiX3VwZGF0ZU1hcmtlclwiXSwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlICYmIChvLl9fcHJvdG9fXyA9IGUpLCAoby5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IG8sIG8ucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG87XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAgPSBlLCB0aGlzLl9jb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGxpYnJlZ2wtY3RybCBtYXBsaWJyZWdsLWN0cmwtZ3JvdXBcIiksIG8gPSB0aGlzLl9zZXR1cFVJLCB2b2lkIDAgIT09IGtyID8gbyhrcikgOiB2b2lkIDAgIT09IHQud2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyA/IHQud2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJnZW9sb2NhdGlvblwiXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBvKGtyID0gXCJkZW5pZWRcIiAhPT0gdC5zdGF0ZSk7XG4gICAgICAgIH0pIDogbyhrciA9ICEhdC53aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uKSwgdGhpcy5fY29udGFpbmVyO1xuICAgICAgfSwgby5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZvaWQgMCAhPT0gdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICYmICh0LndpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpLCB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB2b2lkIDApLCB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIgJiYgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnJlbW92ZSgpLCB0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlICYmIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyICYmIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnJlbW92ZSgpLCBpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCB0aGlzLl9tYXAub2ZmKFwiem9vbVwiLCB0aGlzLl9vblpvb20pLCB0aGlzLl9tYXAgPSB2b2lkIDAsIEZyID0gMCwgVXIgPSAhMTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9pc091dE9mTWFwTWF4Qm91bmRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9tYXAuZ2V0TWF4Qm91bmRzKCksXG4gICAgICAgICAgICBpID0gdC5jb29yZHM7XG5cbiAgICAgICAgcmV0dXJuIGUgJiYgKGkubG9uZ2l0dWRlIDwgZS5nZXRXZXN0KCkgfHwgaS5sb25naXR1ZGUgPiBlLmdldEVhc3QoKSB8fCBpLmxhdGl0dWRlIDwgZS5nZXRTb3V0aCgpIHx8IGkubGF0aXR1ZGUgPiBlLmdldE5vcnRoKCkpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX3NldEVycm9yU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgIGNhc2UgXCJXQUlUSU5HX0FDVElWRVwiOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQUNUSVZFX0VSUk9SXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIik7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfTE9DS1wiOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQUNUSVZFX0VSUk9SXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORFwiOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQkFDS0dST1VORF9FUlJPUlwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZFwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3JcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpO1xuICAgICAgICB9XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25TdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgIGlmICh0aGlzLl9pc091dE9mTWFwTWF4Qm91bmRzKGUpKSByZXR1cm4gdGhpcy5fc2V0RXJyb3JTdGF0ZSgpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJvdXRvZm1heGJvdW5kc1wiLCBlKSksIHRoaXMuX3VwZGF0ZU1hcmtlcigpLCB2b2lkIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHN3aXRjaCAodGhpcy5fbGFzdEtub3duUG9zaXRpb24gPSBlLCB0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFwiV0FJVElOR19BQ1RJVkVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfTE9DS1wiOlxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9FUlJPUlwiOlxuICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gXCJBQ1RJVkVfTE9DS1wiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZ1wiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvclwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJCQUNLR1JPVU5EXCI6XG4gICAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORF9FUlJPUlwiOlxuICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gXCJCQUNLR1JPVU5EXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIFwiT0ZGXCIgIT09IHRoaXMuX3dhdGNoU3RhdGUgJiYgdGhpcy5fdXBkYXRlTWFya2VyKGUpLCB0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24gJiYgXCJBQ1RJVkVfTE9DS1wiICE9PSB0aGlzLl93YXRjaFN0YXRlIHx8IHRoaXMuX3VwZGF0ZUNhbWVyYShlKSwgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZVwiKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwiZ2VvbG9jYXRlXCIsIGUpKSwgdGhpcy5fZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIG8ucHJvdG90eXBlLl91cGRhdGVDYW1lcmEgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSA9IG5ldyB0LkxuZ0xhdChlLmNvb3Jkcy5sb25naXR1ZGUsIGUuY29vcmRzLmxhdGl0dWRlKSxcbiAgICAgICAgICAgIG8gPSBlLmNvb3Jkcy5hY2N1cmFjeSxcbiAgICAgICAgICAgIHIgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgYSA9IHQuZXh0ZW5kKHtcbiAgICAgICAgICBiZWFyaW5nOiByXG4gICAgICAgIH0sIHRoaXMub3B0aW9ucy5maXRCb3VuZHNPcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9tYXAuZml0Qm91bmRzKGkudG9Cb3VuZHMobyksIGEsIHtcbiAgICAgICAgICBnZW9sb2NhdGVTb3VyY2U6ICEwXG4gICAgICAgIH0pO1xuICAgICAgfSwgby5wcm90b3R5cGUuX3VwZGF0ZU1hcmtlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgdmFyIGkgPSBuZXcgdC5MbmdMYXQoZS5jb29yZHMubG9uZ2l0dWRlLCBlLmNvb3Jkcy5sYXRpdHVkZSk7XG4gICAgICAgICAgdGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXIuc2V0TG5nTGF0KGkpLmFkZFRvKHRoaXMuX21hcCksIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5zZXRMbmdMYXQoaSkuYWRkVG8odGhpcy5fbWFwKSwgdGhpcy5fYWNjdXJhY3kgPSBlLmNvb3Jkcy5hY2N1cmFjeSwgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSAmJiB0aGlzLl91cGRhdGVDaXJjbGVSYWRpdXMoKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKSwgdGhpcy5fYWNjdXJhY3lDaXJjbGVNYXJrZXIucmVtb3ZlKCk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fdXBkYXRlQ2lyY2xlUmFkaXVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IHRoaXMuX21hcC5fY29udGFpbmVyLmNsaWVudEhlaWdodCAvIDIsXG4gICAgICAgICAgICBlID0gdGhpcy5fbWFwLnVucHJvamVjdChbMCwgdF0pLFxuICAgICAgICAgICAgaSA9IHRoaXMuX21hcC51bnByb2plY3QoWzEsIHRdKSxcbiAgICAgICAgICAgIG8gPSBlLmRpc3RhbmNlVG8oaSksXG4gICAgICAgICAgICByID0gTWF0aC5jZWlsKDIgKiB0aGlzLl9hY2N1cmFjeSAvIG8pO1xuXG4gICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQuc3R5bGUud2lkdGggPSByICsgXCJweFwiLCB0aGlzLl9jaXJjbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHIgKyBcInB4XCI7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25ab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlICYmIHRoaXMuX3VwZGF0ZUNpcmNsZVJhZGl1cygpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikgaWYgKDEgPT09IGUuY29kZSkge1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiT0ZGXCIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZFwiKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3JcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9ICEwO1xuXG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO1xuXG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGUgPSBpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBpKSwgdm9pZCAwICE9PSB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgJiYgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoMyA9PT0gZS5jb2RlICYmIFVyKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuX3NldEVycm9yU3RhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXCJPRkZcIiAhPT0gdGhpcy5fd2F0Y2hTdGF0ZSAmJiB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXVzZXItbG9jYXRpb24tZG90LXN0YWxlXCIpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJlcnJvclwiLCBlKSksIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9LCBvLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCksIHRoaXMuX3RpbWVvdXRJZCA9IHZvaWQgMDtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9zZXR1cFVJID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbiA9IGkuY3JlYXRlKFwiYnV0dG9uXCIsIFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZVwiLCB0aGlzLl9jb250YWluZXIpLCBpLmNyZWF0ZShcInNwYW5cIiwgXCJtYXBsaWJyZWdsLWN0cmwtaWNvblwiLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24pLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICEwKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiLCAhMSA9PT0gZSkge1xuICAgICAgICAgIHQud2Fybk9uY2UoXCJHZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUgc28gdGhlIEdlb2xvY2F0ZUNvbnRyb2wgd2lsbCBiZSBkaXNhYmxlZC5cIik7XG5cbiAgICAgICAgICB2YXIgciA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoXCJHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlXCIpO1xuXG4gICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmRpc2FibGVkID0gITAsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi50aXRsZSA9IHIsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhcIkdlb2xvY2F0ZUNvbnRyb2wuRmluZE15TG9jYXRpb25cIik7XG5cbiAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGUgPSBhLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiAodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCBcImZhbHNlXCIpLCB0aGlzLl93YXRjaFN0YXRlID0gXCJPRkZcIiksIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmICh0aGlzLl9kb3RFbGVtZW50ID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLXVzZXItbG9jYXRpb24tZG90XCIpLCB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIgPSBuZXcgQnIodGhpcy5fZG90RWxlbWVudCksIHRoaXMuX2NpcmNsZUVsZW1lbnQgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGxpYnJlZ2wtdXNlci1sb2NhdGlvbi1hY2N1cmFjeS1jaXJjbGVcIiksIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyID0gbmV3IEJyKHtcbiAgICAgICAgICBlbGVtZW50OiB0aGlzLl9jaXJjbGVFbGVtZW50LFxuICAgICAgICAgIHBpdGNoQWxpZ25tZW50OiBcIm1hcFwiXG4gICAgICAgIH0pLCB0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24gJiYgKHRoaXMuX3dhdGNoU3RhdGUgPSBcIk9GRlwiKSwgdGhpcy5fbWFwLm9uKFwiem9vbVwiLCB0aGlzLl9vblpvb20pKSwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRyaWdnZXIuYmluZCh0aGlzKSksIHRoaXMuX3NldHVwID0gITAsIHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiAmJiB0aGlzLl9tYXAub24oXCJtb3Zlc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBlLmdlb2xvY2F0ZVNvdXJjZSB8fCBcIkFDVElWRV9MT0NLXCIgIT09IG8uX3dhdGNoU3RhdGUgfHwgZS5vcmlnaW5hbEV2ZW50ICYmIFwicmVzaXplXCIgPT09IGUub3JpZ2luYWxFdmVudC50eXBlIHx8IChvLl93YXRjaFN0YXRlID0gXCJCQUNLR1JPVU5EXCIsIG8uX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLCBvLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpLCBvLmZpcmUobmV3IHQuRXZlbnQoXCJ0cmFja3VzZXJsb2NhdGlvbmVuZFwiKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dXApIHJldHVybiB0Lndhcm5PbmNlKFwiR2VvbG9jYXRlIGNvbnRyb2wgdHJpZ2dlcmVkIGJlZm9yZSBhZGRlZCB0byBhIG1hcFwiKSwgITE7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBcIk9GRlwiOlxuICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gXCJXQUlUSU5HX0FDVElWRVwiLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJ0cmFja3VzZXJsb2NhdGlvbnN0YXJ0XCIpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJXQUlUSU5HX0FDVElWRVwiOlxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9MT0NLXCI6XG4gICAgICAgICAgICBjYXNlIFwiQUNUSVZFX0VSUk9SXCI6XG4gICAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORF9FUlJPUlwiOlxuICAgICAgICAgICAgICBGci0tLCBVciA9ICExLCB0aGlzLl93YXRjaFN0YXRlID0gXCJPRkZcIiwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvclwiKSwgdGhpcy5maXJlKG5ldyB0LkV2ZW50KFwidHJhY2t1c2VybG9jYXRpb25lbmRcIikpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRcIjpcbiAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9IFwiQUNUSVZFX0xPQ0tcIiwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmRcIiksIHRoaXMuX2xhc3RLbm93blBvc2l0aW9uICYmIHRoaXMuX3VwZGF0ZUNhbWVyYSh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiksIHRoaXMuZmlyZShuZXcgdC5FdmVudChcInRyYWNrdXNlcmxvY2F0aW9uc3RhcnRcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBcIldBSVRJTkdfQUNUSVZFXCI6XG4gICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlXCIpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIkFDVElWRV9MT0NLXCI6XG4gICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmVcIik7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkVfRVJST1JcIjpcbiAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3JcIik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiQkFDS0dST1VORFwiOlxuICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZFwiKTtcblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRfRVJST1JcIjpcbiAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcIk9GRlwiID09PSB0aGlzLl93YXRjaFN0YXRlICYmIHZvaWQgMCAhPT0gdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSB0aGlzLl9jbGVhcldhdGNoKCk7ZWxzZSBpZiAodm9pZCAwID09PSB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpIHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmdcIiksIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIiwgXCJ0cnVlXCIpLCArK0ZyID4gMSA/IChlID0ge1xuICAgICAgICAgICAgICBtYXhpbXVtQWdlOiA2ZTUsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6IDBcbiAgICAgICAgICAgIH0sIFVyID0gITApIDogKGUgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25PcHRpb25zLCBVciA9ICExKSwgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gdC53aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odGhpcy5fb25TdWNjZXNzLCB0aGlzLl9vbkVycm9yLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB0LndpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyksIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQodGhpcy5fZmluaXNoLCAxZTQpO1xuXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9jbGVhcldhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0LndpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpLCB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB2b2lkIDAsIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwbGlicmVnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nXCIpLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIsIFwiZmFsc2VcIiksIHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMuX3VwZGF0ZU1hcmtlcihudWxsKTtcbiAgICAgIH0sIG87XG4gICAgfSh0LkV2ZW50ZWQpLFxuICAgICAgICBaciA9IHtcbiAgICAgIG1heFdpZHRoOiAxMDAsXG4gICAgICB1bml0OiBcIm1ldHJpY1wiXG4gICAgfSxcbiAgICAgICAgcXIgPSBmdW5jdGlvbiBxcihlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSB0LmV4dGVuZCh7fSwgWnIsIGUpLCB0LmJpbmRBbGwoW1wiX29uTW92ZVwiLCBcInNldFVuaXRcIl0sIHRoaXMpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBqcih0LCBlLCBpKSB7XG4gICAgICB2YXIgbyA9IGkgJiYgaS5tYXhXaWR0aCB8fCAxMDAsXG4gICAgICAgICAgciA9IHQuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgLyAyLFxuICAgICAgICAgIGEgPSB0LnVucHJvamVjdChbMCwgcl0pLFxuICAgICAgICAgIG4gPSB0LnVucHJvamVjdChbbywgcl0pLFxuICAgICAgICAgIHMgPSBhLmRpc3RhbmNlVG8obik7XG5cbiAgICAgIGlmIChpICYmIFwiaW1wZXJpYWxcIiA9PT0gaS51bml0KSB7XG4gICAgICAgIHZhciBsID0gMy4yODA4ICogcztcbiAgICAgICAgbCA+IDUyODAgPyBWcihlLCBvLCBsIC8gNTI4MCwgdC5fZ2V0VUlTdHJpbmcoXCJTY2FsZUNvbnRyb2wuTWlsZXNcIikpIDogVnIoZSwgbywgbCwgdC5fZ2V0VUlTdHJpbmcoXCJTY2FsZUNvbnRyb2wuRmVldFwiKSk7XG4gICAgICB9IGVsc2UgaSAmJiBcIm5hdXRpY2FsXCIgPT09IGkudW5pdCA/IFZyKGUsIG8sIHMgLyAxODUyLCB0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5OYXV0aWNhbE1pbGVzXCIpKSA6IHMgPj0gMWUzID8gVnIoZSwgbywgcyAvIDFlMywgdC5fZ2V0VUlTdHJpbmcoXCJTY2FsZUNvbnRyb2wuS2lsb21ldGVyc1wiKSkgOiBWcihlLCBvLCBzLCB0Ll9nZXRVSVN0cmluZyhcIlNjYWxlQ29udHJvbC5NZXRlcnNcIikpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFZyKHQsIGUsIGksIG8pIHtcbiAgICAgIHZhciByLFxuICAgICAgICAgIGEsXG4gICAgICAgICAgbixcbiAgICAgICAgICBzID0gKHIgPSBpLCAoYSA9IE1hdGgucG93KDEwLCAoXCJcIiArIE1hdGguZmxvb3IocikpLmxlbmd0aCAtIDEpKSAqIChuID0gKG4gPSByIC8gYSkgPj0gMTAgPyAxMCA6IG4gPj0gNSA/IDUgOiBuID49IDMgPyAzIDogbiA+PSAyID8gMiA6IG4gPj0gMSA/IDEgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IE1hdGgucG93KDEwLCBNYXRoLmNlaWwoLU1hdGgubG9nKHQpIC8gTWF0aC5MTjEwKSk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHQgKiBlKSAvIGU7XG4gICAgICB9KG4pKSk7XG4gICAgICB0LnN0eWxlLndpZHRoID0gZSAqIChzIC8gaSkgKyBcInB4XCIsIHQuaW5uZXJIVE1MID0gcyArIFwiJm5ic3A7XCIgKyBvO1xuICAgIH1cblxuICAgIHFyLnByb3RvdHlwZS5nZXREZWZhdWx0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJib3R0b20tbGVmdFwiO1xuICAgIH0sIHFyLnByb3RvdHlwZS5fb25Nb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAganIodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgfSwgcXIucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAgPSB0LCB0aGlzLl9jb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGxpYnJlZ2wtY3RybCBtYXBsaWJyZWdsLWN0cmwtc2NhbGVcIiwgdC5nZXRDb250YWluZXIoKSksIHRoaXMuX21hcC5vbihcIm1vdmVcIiwgdGhpcy5fb25Nb3ZlKSwgdGhpcy5fb25Nb3ZlKCksIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9LCBxci5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCB0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl9vbk1vdmUpLCB0aGlzLl9tYXAgPSB2b2lkIDA7XG4gICAgfSwgcXIucHJvdG90eXBlLnNldFVuaXQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVuaXQgPSB0LCBqcih0aGlzLl9tYXAsIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICB9O1xuXG4gICAgdmFyIEdyID0gZnVuY3Rpb24gR3IoZSkge1xuICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9ICExLCBlICYmIGUuY29udGFpbmVyICYmIChlLmNvbnRhaW5lciBpbnN0YW5jZW9mIHQud2luZG93LkhUTUxFbGVtZW50ID8gdGhpcy5fY29udGFpbmVyID0gZS5jb250YWluZXIgOiB0Lndhcm5PbmNlKFwiRnVsbCBzY3JlZW4gY29udHJvbCAnY29udGFpbmVyJyBtdXN0IGJlIGEgRE9NIGVsZW1lbnQuXCIpKSwgdC5iaW5kQWxsKFtcIl9vbkNsaWNrRnVsbHNjcmVlblwiLCBcIl9jaGFuZ2VJY29uXCJdLCB0aGlzKSwgXCJvbmZ1bGxzY3JlZW5jaGFuZ2VcIiBpbiB0LndpbmRvdy5kb2N1bWVudCA/IHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSBcImZ1bGxzY3JlZW5jaGFuZ2VcIiA6IFwib25tb3pmdWxsc2NyZWVuY2hhbmdlXCIgaW4gdC53aW5kb3cuZG9jdW1lbnQgPyB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gXCJtb3pmdWxsc2NyZWVuY2hhbmdlXCIgOiBcIm9ud2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiIGluIHQud2luZG93LmRvY3VtZW50ID8gdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9IFwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiIDogXCJvbm1zZnVsbHNjcmVlbmNoYW5nZVwiIGluIHQud2luZG93LmRvY3VtZW50ICYmICh0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gXCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIik7XG4gICAgfTtcblxuICAgIEdyLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwID0gZSwgdGhpcy5fY29udGFpbmVyIHx8ICh0aGlzLl9jb250YWluZXIgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpLCB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLWN0cmwgbWFwbGlicmVnbC1jdHJsLWdyb3VwXCIpLCB0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkgPyB0aGlzLl9zZXR1cFVJKCkgOiAodGhpcy5fY29udHJvbENvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIHQud2Fybk9uY2UoXCJUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gbW9kZS5cIikpLCB0aGlzLl9jb250cm9sQ29udGFpbmVyO1xuICAgIH0sIEdyLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGkucmVtb3ZlKHRoaXMuX2NvbnRyb2xDb250YWluZXIpLCB0aGlzLl9tYXAgPSBudWxsLCB0LndpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH0sIEdyLnByb3RvdHlwZS5fY2hlY2tGdWxsc2NyZWVuU3VwcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhISh0LndpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCB8fCB0LndpbmRvdy5kb2N1bWVudC5tb3pGdWxsU2NyZWVuRW5hYmxlZCB8fCB0LndpbmRvdy5kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbmFibGVkIHx8IHQud2luZG93LmRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkKTtcbiAgICB9LCBHci5wcm90b3R5cGUuX3NldHVwVUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24gPSBpLmNyZWF0ZShcImJ1dHRvblwiLCBcIm1hcGxpYnJlZ2wtY3RybC1mdWxsc2NyZWVuXCIsIHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgaS5jcmVhdGUoXCJzcGFuXCIsIFwibWFwbGlicmVnbC1jdHJsLWljb25cIiwgZSkuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgITApLCBlLnR5cGUgPSBcImJ1dHRvblwiLCB0aGlzLl91cGRhdGVUaXRsZSgpLCB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9vbkNsaWNrRnVsbHNjcmVlbiksIHQud2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5fY2hhbmdlSWNvbik7XG4gICAgfSwgR3IucHJvdG90eXBlLl91cGRhdGVUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcy5fZ2V0VGl0bGUoKTtcblxuICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQpLCB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLnRpdGxlID0gdDtcbiAgICB9LCBHci5wcm90b3R5cGUuX2dldFRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcodGhpcy5faXNGdWxsc2NyZWVuKCkgPyBcIkZ1bGxzY3JlZW5Db250cm9sLkV4aXRcIiA6IFwiRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXJcIik7XG4gICAgfSwgR3IucHJvdG90eXBlLl9pc0Z1bGxzY3JlZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZnVsbHNjcmVlbjtcbiAgICB9LCBHci5wcm90b3R5cGUuX2NoYW5nZUljb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAodC53aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgdC53aW5kb3cuZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwgdC53aW5kb3cuZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgdC53aW5kb3cuZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCkgPT09IHRoaXMuX2NvbnRhaW5lciAhPT0gdGhpcy5fZnVsbHNjcmVlbiAmJiAodGhpcy5fZnVsbHNjcmVlbiA9ICF0aGlzLl9mdWxsc2NyZWVuLCB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoXCJtYXBsaWJyZWdsLWN0cmwtc2hyaW5rXCIpLCB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoXCJtYXBsaWJyZWdsLWN0cmwtZnVsbHNjcmVlblwiKSwgdGhpcy5fdXBkYXRlVGl0bGUoKSk7XG4gICAgfSwgR3IucHJvdG90eXBlLl9vbkNsaWNrRnVsbHNjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX2lzRnVsbHNjcmVlbigpID8gdC53aW5kb3cuZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4gPyB0LndpbmRvdy5kb2N1bWVudC5leGl0RnVsbHNjcmVlbigpIDogdC53aW5kb3cuZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbiA/IHQud2luZG93LmRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKSA6IHQud2luZG93LmRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4gPyB0LndpbmRvdy5kb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCkgOiB0LndpbmRvdy5kb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuICYmIHQud2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKSA6IHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbiA/IHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbigpIDogdGhpcy5fY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuID8gdGhpcy5fY29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuKCkgOiB0aGlzLl9jb250YWluZXIubXNSZXF1ZXN0RnVsbHNjcmVlbiA/IHRoaXMuX2NvbnRhaW5lci5tc1JlcXVlc3RGdWxsc2NyZWVuKCkgOiB0aGlzLl9jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4gJiYgdGhpcy5fY29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfTtcblxuICAgIHZhciBXciA9IHtcbiAgICAgIGNsb3NlQnV0dG9uOiAhMCxcbiAgICAgIGNsb3NlT25DbGljazogITAsXG4gICAgICBmb2N1c0FmdGVyT3BlbjogITAsXG4gICAgICBjbGFzc05hbWU6IFwiXCIsXG4gICAgICBtYXhXaWR0aDogXCIyNDBweFwiXG4gICAgfSxcbiAgICAgICAgWHIgPSBbXCJhW2hyZWZdXCIsIFwiW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSctMSddKVwiLCBcIltjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPSdmYWxzZSddKVwiLCBcImJ1dHRvbjpub3QoW2Rpc2FibGVkXSlcIiwgXCJpbnB1dDpub3QoW2Rpc2FibGVkXSlcIiwgXCJzZWxlY3Q6bm90KFtkaXNhYmxlZF0pXCIsIFwidGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pXCJdLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgSHIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgIGUuY2FsbCh0aGlzKSwgdGhpcy5vcHRpb25zID0gdC5leHRlbmQoT2JqZWN0LmNyZWF0ZShXciksIGkpLCB0LmJpbmRBbGwoW1wiX3VwZGF0ZVwiLCBcIl9vbkNsb3NlXCIsIFwicmVtb3ZlXCIsIFwiX29uTW91c2VNb3ZlXCIsIFwiX29uTW91c2VVcFwiLCBcIl9vbkRyYWdcIl0sIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZSAmJiAoby5fX3Byb3RvX18gPSBlKSwgKG8ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBvLCBvLnByb3RvdHlwZS5hZGRUbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAgJiYgdGhpcy5yZW1vdmUoKSwgdGhpcy5fbWFwID0gZSwgdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayAmJiB0aGlzLl9tYXAub24oXCJjbGlja1wiLCB0aGlzLl9vbkNsb3NlKSwgdGhpcy5vcHRpb25zLmNsb3NlT25Nb3ZlICYmIHRoaXMuX21hcC5vbihcIm1vdmVcIiwgdGhpcy5fb25DbG9zZSksIHRoaXMuX21hcC5vbihcInJlbW92ZVwiLCB0aGlzLnJlbW92ZSksIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9mb2N1c0ZpcnN0RWxlbWVudCgpLCB0aGlzLl90cmFja1BvaW50ZXIgPyAodGhpcy5fbWFwLm9uKFwibW91c2Vtb3ZlXCIsIHRoaXMuX29uTW91c2VNb3ZlKSwgdGhpcy5fbWFwLm9uKFwibW91c2V1cFwiLCB0aGlzLl9vbk1vdXNlVXApLCB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXBvcHVwLXRyYWNrLXBvaW50ZXJcIiksIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXRyYWNrLXBvaW50ZXJcIikpIDogdGhpcy5fbWFwLm9uKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJvcGVuXCIpKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fbWFwO1xuICAgICAgfSwgby5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCAmJiBpLnJlbW92ZSh0aGlzLl9jb250ZW50KSwgdGhpcy5fY29udGFpbmVyICYmIChpLnJlbW92ZSh0aGlzLl9jb250YWluZXIpLCBkZWxldGUgdGhpcy5fY29udGFpbmVyKSwgdGhpcy5fbWFwICYmICh0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl91cGRhdGUpLCB0aGlzLl9tYXAub2ZmKFwibW92ZVwiLCB0aGlzLl9vbkNsb3NlKSwgdGhpcy5fbWFwLm9mZihcImNsaWNrXCIsIHRoaXMuX29uQ2xvc2UpLCB0aGlzLl9tYXAub2ZmKFwicmVtb3ZlXCIsIHRoaXMucmVtb3ZlKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdXNlTW92ZSksIHRoaXMuX21hcC5vZmYoXCJtb3VzZXVwXCIsIHRoaXMuX29uTW91c2VVcCksIHRoaXMuX21hcC5vZmYoXCJkcmFnXCIsIHRoaXMuX29uRHJhZyksIGRlbGV0ZSB0aGlzLl9tYXApLCB0aGlzLmZpcmUobmV3IHQuRXZlbnQoXCJjbG9zZVwiKSksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRMbmdMYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRMbmdMYXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0ID0gdC5MbmdMYXQuY29udmVydChlKSwgdGhpcy5fcG9zID0gbnVsbCwgdGhpcy5fdHJhY2tQb2ludGVyID0gITEsIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9tYXAgJiYgKHRoaXMuX21hcC5vbihcIm1vdmVcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5fbWFwLm9mZihcIm1vdXNlbW92ZVwiLCB0aGlzLl9vbk1vdXNlTW92ZSksIHRoaXMuX2NvbnRhaW5lciAmJiB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSwgdGhpcy5fbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGxpYnJlZ2wtdHJhY2stcG9pbnRlclwiKSksIHRoaXM7XG4gICAgICB9LCBvLnByb3RvdHlwZS50cmFja1BvaW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFja1BvaW50ZXIgPSAhMCwgdGhpcy5fcG9zID0gbnVsbCwgdGhpcy5fdXBkYXRlKCksIHRoaXMuX21hcCAmJiAodGhpcy5fbWFwLm9mZihcIm1vdmVcIiwgdGhpcy5fdXBkYXRlKSwgdGhpcy5fbWFwLm9uKFwibW91c2Vtb3ZlXCIsIHRoaXMuX29uTW91c2VNb3ZlKSwgdGhpcy5fbWFwLm9uKFwiZHJhZ1wiLCB0aGlzLl9vbkRyYWcpLCB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXBvcHVwLXRyYWNrLXBvaW50ZXJcIiksIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXBsaWJyZWdsLXRyYWNrLXBvaW50ZXJcIikpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KHQud2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpKTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldEhUTUwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG8gPSB0LndpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICByID0gdC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJvZHlcIik7XG5cbiAgICAgICAgZm9yIChyLmlubmVySFRNTCA9IGU7IGkgPSByLmZpcnN0Q2hpbGQ7KSB7XG4gICAgICAgICAgby5hcHBlbmRDaGlsZChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNldERPTUNvbnRlbnQobyk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5nZXRNYXhXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lciAmJiB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGg7XG4gICAgICB9LCBvLnByb3RvdHlwZS5zZXRNYXhXaWR0aCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4V2lkdGggPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLnNldERPTUNvbnRlbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCkgZm9yICg7IHRoaXMuX2NvbnRlbnQuaGFzQ2hpbGROb2RlcygpOykge1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnQuZmlyc3RDaGlsZCAmJiB0aGlzLl9jb250ZW50LnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB0aGlzLl9jb250ZW50ID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLXBvcHVwLWNvbnRlbnRcIiwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuYXBwZW5kQ2hpbGQodCksIHRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uKCksIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9mb2N1c0ZpcnN0RWxlbWVudCgpLCB0aGlzO1xuICAgICAgfSwgby5wcm90b3R5cGUuYWRkQ2xhc3NOYW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHQpO1xuICAgICAgfSwgby5wcm90b3R5cGUucmVtb3ZlQ2xhc3NOYW1lID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyICYmIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKHQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuc2V0T2Zmc2V0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vZmZzZXQgPSB0LCB0aGlzLl91cGRhdGUoKSwgdGhpcztcbiAgICAgIH0sIG8ucHJvdG90eXBlLnRvZ2dsZUNsYXNzTmFtZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHJldHVybiB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSh0KTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl9jcmVhdGVDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uICYmICh0aGlzLl9jbG9zZUJ1dHRvbiA9IGkuY3JlYXRlKFwiYnV0dG9uXCIsIFwibWFwbGlicmVnbC1wb3B1cC1jbG9zZS1idXR0b25cIiwgdGhpcy5fY29udGVudCksIHRoaXMuX2Nsb3NlQnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiLCB0aGlzLl9jbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ2xvc2UgcG9wdXBcIiksIHRoaXMuX2Nsb3NlQnV0dG9uLmlubmVySFRNTCA9IFwiJiMyMTU7XCIsIHRoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9vbkNsb3NlKSk7XG4gICAgICB9LCBvLnByb3RvdHlwZS5fb25Nb3VzZVVwID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHQucG9pbnQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uTW91c2VNb3ZlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHQucG9pbnQpO1xuICAgICAgfSwgby5wcm90b3R5cGUuX29uRHJhZyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0LnBvaW50KTtcbiAgICAgIH0sIG8ucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbyA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcCAmJiAodGhpcy5fbG5nTGF0IHx8IHRoaXMuX3RyYWNrUG9pbnRlcikgJiYgdGhpcy5fY29udGVudCAmJiAodGhpcy5fY29udGFpbmVyIHx8ICh0aGlzLl9jb250YWluZXIgPSBpLmNyZWF0ZShcImRpdlwiLCBcIm1hcGxpYnJlZ2wtcG9wdXBcIiwgdGhpcy5fbWFwLmdldENvbnRhaW5lcigpKSwgdGhpcy5fdGlwID0gaS5jcmVhdGUoXCJkaXZcIiwgXCJtYXBsaWJyZWdsLXBvcHVwLXRpcFwiLCB0aGlzLl9jb250YWluZXIpLCB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCksIHRoaXMub3B0aW9ucy5jbGFzc05hbWUgJiYgdGhpcy5vcHRpb25zLmNsYXNzTmFtZS5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBvLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0KTtcbiAgICAgICAgfSksIHRoaXMuX3RyYWNrUG9pbnRlciAmJiB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGxpYnJlZ2wtcG9wdXAtdHJhY2stcG9pbnRlclwiKSksIHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggIT09IHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiAodGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gdGhpcy5vcHRpb25zLm1heFdpZHRoKSwgdGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyAmJiAhdGhpcy5fdHJhY2tQb2ludGVyICYmICh0aGlzLl9sbmdMYXQgPSBNcih0aGlzLl9sbmdMYXQsIHRoaXMuX3BvcywgdGhpcy5fbWFwLnRyYW5zZm9ybSkpLCAhdGhpcy5fdHJhY2tQb2ludGVyIHx8IGUpKSB7XG4gICAgICAgICAgdmFyIHIgPSB0aGlzLl9wb3MgPSB0aGlzLl90cmFja1BvaW50ZXIgJiYgZSA/IGUgOiB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sbmdMYXQpLFxuICAgICAgICAgICAgICBhID0gdGhpcy5vcHRpb25zLmFuY2hvcixcbiAgICAgICAgICAgICAgbiA9IGZ1bmN0aW9uIGUoaSkge1xuICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbyA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KC41ICogTWF0aC5wb3coaSwgMikpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY2VudGVyOiBuZXcgdC5Qb2ludCgwLCAwKSxcbiAgICAgICAgICAgICAgICAgIHRvcDogbmV3IHQuUG9pbnQoMCwgaSksXG4gICAgICAgICAgICAgICAgICBcInRvcC1sZWZ0XCI6IG5ldyB0LlBvaW50KG8sIG8pLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogbmV3IHQuUG9pbnQoLW8sIG8pLFxuICAgICAgICAgICAgICAgICAgYm90dG9tOiBuZXcgdC5Qb2ludCgwLCAtaSksXG4gICAgICAgICAgICAgICAgICBcImJvdHRvbS1sZWZ0XCI6IG5ldyB0LlBvaW50KG8sIC1vKSxcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IG5ldyB0LlBvaW50KC1vLCAtbyksXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBuZXcgdC5Qb2ludChpLCAwKSxcbiAgICAgICAgICAgICAgICAgIHJpZ2h0OiBuZXcgdC5Qb2ludCgtaSwgMClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGkgaW5zdGFuY2VvZiB0LlBvaW50IHx8IEFycmF5LmlzQXJyYXkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHQuUG9pbnQuY29udmVydChpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY2VudGVyOiByLFxuICAgICAgICAgICAgICAgICAgdG9wOiByLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiByLFxuICAgICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogcixcbiAgICAgICAgICAgICAgICAgIGJvdHRvbTogcixcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjogcixcbiAgICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHIsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiByLFxuICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IHQuUG9pbnQuY29udmVydChpLmNlbnRlciB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIHRvcDogdC5Qb2ludC5jb252ZXJ0KGkudG9wIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgXCJ0b3AtbGVmdFwiOiB0LlBvaW50LmNvbnZlcnQoaVtcInRvcC1sZWZ0XCJdIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgXCJ0b3AtcmlnaHRcIjogdC5Qb2ludC5jb252ZXJ0KGlbXCJ0b3AtcmlnaHRcIl0gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICAgICBib3R0b206IHQuUG9pbnQuY29udmVydChpLmJvdHRvbSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIFwiYm90dG9tLWxlZnRcIjogdC5Qb2ludC5jb252ZXJ0KGlbXCJib3R0b20tbGVmdFwiXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIFwiYm90dG9tLXJpZ2h0XCI6IHQuUG9pbnQuY29udmVydChpW1wiYm90dG9tLXJpZ2h0XCJdIHx8IFswLCAwXSksXG4gICAgICAgICAgICAgICAgbGVmdDogdC5Qb2ludC5jb252ZXJ0KGkubGVmdCB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB0LlBvaW50LmNvbnZlcnQoaS5yaWdodCB8fCBbMCwgMF0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlKG5ldyB0LlBvaW50KDAsIDApKTtcbiAgICAgICAgICB9KHRoaXMub3B0aW9ucy5vZmZzZXQpO1xuXG4gICAgICAgICAgaWYgKCFhKSB7XG4gICAgICAgICAgICB2YXIgcyxcbiAgICAgICAgICAgICAgICBsID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgIGMgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgcyA9IHIueSArIG4uYm90dG9tLnkgPCBjID8gW1widG9wXCJdIDogci55ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQgLSBjID8gW1wiYm90dG9tXCJdIDogW10sIHIueCA8IGwgLyAyID8gcy5wdXNoKFwibGVmdFwiKSA6IHIueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSBsIC8gMiAmJiBzLnB1c2goXCJyaWdodFwiKSwgYSA9IDAgPT09IHMubGVuZ3RoID8gXCJib3R0b21cIiA6IHMuam9pbihcIi1cIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHUgPSByLmFkZChuW2FdKS5yb3VuZCgpO1xuICAgICAgICAgIGkuc2V0VHJhbnNmb3JtKHRoaXMuX2NvbnRhaW5lciwgTHJbYV0gKyBcIiB0cmFuc2xhdGUoXCIgKyB1LnggKyBcInB4LFwiICsgdS55ICsgXCJweClcIiksIFJyKHRoaXMuX2NvbnRhaW5lciwgYSwgXCJwb3B1cFwiKTtcbiAgICAgICAgfVxuICAgICAgfSwgby5wcm90b3R5cGUuX2ZvY3VzRmlyc3RFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvY3VzQWZ0ZXJPcGVuICYmIHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoWHIpO1xuXG4gICAgICAgICAgdCAmJiB0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIG8ucHJvdG90eXBlLl9vbkNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgfSwgbztcbiAgICB9KHQuRXZlbnRlZCksXG4gICAgICAgIEtyID0ge1xuICAgICAgdmVyc2lvbjogdC52ZXJzaW9uLFxuICAgICAgc3VwcG9ydGVkOiBlLFxuICAgICAgc2V0UlRMVGV4dFBsdWdpbjogdC5zZXRSVExUZXh0UGx1Z2luLFxuICAgICAgZ2V0UlRMVGV4dFBsdWdpblN0YXR1czogdC5nZXRSVExUZXh0UGx1Z2luU3RhdHVzLFxuICAgICAgTWFwOiBTcixcbiAgICAgIE5hdmlnYXRpb25Db250cm9sOiBEcixcbiAgICAgIEdlb2xvY2F0ZUNvbnRyb2w6IE5yLFxuICAgICAgQXR0cmlidXRpb25Db250cm9sOiB5cixcbiAgICAgIFNjYWxlQ29udHJvbDogcXIsXG4gICAgICBGdWxsc2NyZWVuQ29udHJvbDogR3IsXG4gICAgICBQb3B1cDogSHIsXG4gICAgICBNYXJrZXI6IEJyLFxuICAgICAgU3R5bGU6IGplLFxuICAgICAgTG5nTGF0OiB0LkxuZ0xhdCxcbiAgICAgIExuZ0xhdEJvdW5kczogdC5MbmdMYXRCb3VuZHMsXG4gICAgICBQb2ludDogdC5Qb2ludCxcbiAgICAgIE1lcmNhdG9yQ29vcmRpbmF0ZTogdC5NZXJjYXRvckNvb3JkaW5hdGUsXG4gICAgICBFdmVudGVkOiB0LkV2ZW50ZWQsXG4gICAgICBjb25maWc6IHQuY29uZmlnLFxuICAgICAgcHJld2FybTogZnVuY3Rpb24gcHJld2FybSgpIHtcbiAgICAgICAgRnQoKS5hY3F1aXJlKFJ0KTtcbiAgICAgIH0sXG4gICAgICBjbGVhclByZXdhcm1lZFJlc291cmNlczogZnVuY3Rpb24gY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMoKSB7XG4gICAgICAgIHZhciB0ID0gQnQ7XG4gICAgICAgIHQgJiYgKHQuaXNQcmVsb2FkZWQoKSAmJiAxID09PSB0Lm51bUFjdGl2ZSgpID8gKHQucmVsZWFzZShSdCksIEJ0ID0gbnVsbCkgOiBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgY2xlYXIgV2ViV29ya2VycyBzaW5jZSB0aGVyZSBhcmUgYWN0aXZlIE1hcCBpbnN0YW5jZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgaXQuIFRoZSBwcmUtd2FybWVkIFdlYldvcmtlciBwb29sIGNhbiBvbmx5IGJlIGNsZWFyZWQgd2hlbiBhbGwgbWFwIGluc3RhbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZCB3aXRoIG1hcC5yZW1vdmUoKVwiKSk7XG4gICAgICB9LFxuXG4gICAgICBnZXQgYWNjZXNzVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICB9LFxuXG4gICAgICBzZXQgYWNjZXNzVG9rZW4oZSkge1xuICAgICAgICB0LmNvbmZpZy5BQ0NFU1NfVE9LRU4gPSBlO1xuICAgICAgfSxcblxuICAgICAgZ2V0IGJhc2VBcGlVcmwoKSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5BUElfVVJMO1xuICAgICAgfSxcblxuICAgICAgc2V0IGJhc2VBcGlVcmwoZSkge1xuICAgICAgICB0LmNvbmZpZy5BUElfVVJMID0gZTtcbiAgICAgIH0sXG5cbiAgICAgIGdldCB3b3JrZXJDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIGt0LndvcmtlckNvdW50O1xuICAgICAgfSxcblxuICAgICAgc2V0IHdvcmtlckNvdW50KHQpIHtcbiAgICAgICAga3Qud29ya2VyQ291bnQgPSB0O1xuICAgICAgfSxcblxuICAgICAgZ2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHQuY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUztcbiAgICAgIH0sXG5cbiAgICAgIHNldCBtYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMoZSkge1xuICAgICAgICB0LmNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMgPSBlO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTdG9yYWdlOiBmdW5jdGlvbiBjbGVhclN0b3JhZ2UoZSkge1xuICAgICAgICB0LmNsZWFyVGlsZUNhY2hlKGUpO1xuICAgICAgfSxcbiAgICAgIHdvcmtlclVybDogXCJcIixcbiAgICAgIGFkZFByb3RvY29sOiBmdW5jdGlvbiBhZGRQcm90b2NvbChlLCBpKSB7XG4gICAgICAgIHQuY29uZmlnLlJFR0lTVEVSRURfUFJPVE9DT0xTW2VdID0gaTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVQcm90b2NvbDogZnVuY3Rpb24gcmVtb3ZlUHJvdG9jb2woZSkge1xuICAgICAgICBkZWxldGUgdC5jb25maWcuUkVHSVNURVJFRF9QUk9UT0NPTFNbZV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBLcjtcbiAgfSk7IC8vXG5cbiAgcmV0dXJuIG1hcGxpYnJlZ2w7XG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9910\n')}}]); \ No newline at end of file diff --git a/803-0bf34ac/dc6a8720040df98778fe970bf6c000a41750d3ae-01c585989aa2d2f2deba.js b/803-0bf34ac/dc6a8720040df98778fe970bf6c000a41750d3ae-01c585989aa2d2f2deba.js new file mode 100644 index 00000000..7f915d31 --- /dev/null +++ b/803-0bf34ac/dc6a8720040df98778fe970bf6c000a41750d3ae-01c585989aa2d2f2deba.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[349],{3099:function(module){eval("module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzPzFjMGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjMwOTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3099\n")},9670:function(module,__unused_webpack_exports,__webpack_require__){eval("var isObject = __webpack_require__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanM/ODI1YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBd0I7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI5NjcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9670\n")},1318:function(module,__unused_webpack_exports,__webpack_require__){eval("var toIndexedObject = __webpack_require__(5656);\nvar toLength = __webpack_require__(7466);\nvar toAbsoluteIndex = __webpack_require__(1400);\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcz80ZDY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLElBQWdDO0FBQzlELGVBQWUsbUJBQU8sQ0FBQyxJQUF3QjtBQUMvQyxzQkFBc0IsbUJBQU8sQ0FBQyxJQUFnQzs7QUFFOUQscUJBQXFCLG9CQUFvQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssWUFBWSxlQUFlO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxMzE4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1318\n")},4326:function(module){eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz9jNmI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBIiwiZmlsZSI6IjQzMjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4326\n")},9920:function(module,__unused_webpack_exports,__webpack_require__){eval("var has = __webpack_require__(6656);\nvar ownKeys = __webpack_require__(3887);\nvar getOwnPropertyDescriptorModule = __webpack_require__(1236);\nvar definePropertyModule = __webpack_require__(3070);\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanM/ZTg5MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVLG1CQUFPLENBQUMsSUFBa0I7QUFDcEMsY0FBYyxtQkFBTyxDQUFDLElBQXVCO0FBQzdDLHFDQUFxQyxtQkFBTyxDQUFDLElBQWlEO0FBQzlGLDJCQUEyQixtQkFBTyxDQUFDLElBQXFDOztBQUV4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiOTkyMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9920\n")},8880:function(module,__unused_webpack_exports,__webpack_require__){eval("var DESCRIPTORS = __webpack_require__(9781);\nvar definePropertyModule = __webpack_require__(3070);\nvar createPropertyDescriptor = __webpack_require__(9114);\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanM/OTExMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0IsbUJBQU8sQ0FBQyxJQUEwQjtBQUNwRCwyQkFBMkIsbUJBQU8sQ0FBQyxJQUFxQztBQUN4RSwrQkFBK0IsbUJBQU8sQ0FBQyxJQUF5Qzs7QUFFaEY7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EiLCJmaWxlIjoiODg4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8880\n")},9114:function(module){eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz81YzZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiOTExNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9114\n")},9781:function(module,__unused_webpack_exports,__webpack_require__){eval("var fails = __webpack_require__(7293);\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcz84M2FiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksbUJBQU8sQ0FBQyxJQUFvQjs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLE1BQU0sbUJBQW1CLFVBQVUsRUFBRSxFQUFFO0FBQ3hFLENBQUMiLCJmaWxlIjoiOTc4MS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBEZXRlY3QgSUU4J3MgaW5jb21wbGV0ZSBkZWZpbmVQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pWzFdICE9IDc7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9781\n")},317:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar isObject = __webpack_require__(111);\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcz9jYzEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsR0FBd0I7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///317\n")},8113:function(module,__unused_webpack_exports,__webpack_require__){eval("var getBuiltIn = __webpack_require__(5005);\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcz8zNDJmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLElBQTJCOztBQUVwRCIsImZpbGUiOiI4MTEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8113\n")},7392:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar userAgent = __webpack_require__(8113);\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] < 4 ? 1 : match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcz8yZDAwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjtBQUMxQyxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUFnQzs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI3MzkyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPCA0ID8gMSA6IG1hdGNoWzBdICsgbWF0Y2hbMV07XG59IGVsc2UgaWYgKHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9IG1hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7392\n")},748:function(module){eval("// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzPzc4MzkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNzQ4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///748\n")},2109:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar getOwnPropertyDescriptor = __webpack_require__(1236).f;\nvar createNonEnumerableProperty = __webpack_require__(8880);\nvar redefine = __webpack_require__(1320);\nvar setGlobal = __webpack_require__(3505);\nvar copyConstructorProperties = __webpack_require__(9920);\nvar isForced = __webpack_require__(4705);\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanM/MjNlNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBcUI7QUFDMUMsK0JBQStCLDJCQUE0RDtBQUMzRixrQ0FBa0MsbUJBQU8sQ0FBQyxJQUE2QztBQUN2RixlQUFlLG1CQUFPLENBQUMsSUFBdUI7QUFDOUMsZ0JBQWdCLG1CQUFPLENBQUMsSUFBeUI7QUFDakQsZ0NBQWdDLG1CQUFPLENBQUMsSUFBMEM7QUFDbEYsZUFBZSxtQkFBTyxDQUFDLElBQXdCOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsbURBQW1EO0FBQ25ELEdBQUc7QUFDSCxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjEwOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2109\n")},7293:function(module){eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz9kMDM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiNzI5My5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7293\n")},5005:function(module,__unused_webpack_exports,__webpack_require__){eval("var path = __webpack_require__(857);\nvar global = __webpack_require__(7854);\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanM/ZDA2NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxXQUFXLG1CQUFPLENBQUMsR0FBbUI7QUFDdEMsYUFBYSxtQkFBTyxDQUFDLElBQXFCOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTAwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5005\n")},7854:function(module,__unused_webpack_exports,__webpack_require__){eval("var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanM/ZGE4NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFCQUFNLGdCQUFnQixxQkFBTTtBQUMzQztBQUNBLGdCQUFnQixhQUFhLEVBQUUiLCJmaWxlIjoiNzg1NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7854\n")},6656:function(module,__unused_webpack_exports,__webpack_require__){eval("var toObject = __webpack_require__(7908);\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty.call(toObject(it), key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanM/NTEzNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBd0I7O0FBRS9DLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBIiwiZmlsZSI6IjY2NTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6656\n")},3501:function(module){eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcz9kMDEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjM1MDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3501\n")},4664:function(module,__unused_webpack_exports,__webpack_require__){eval("var DESCRIPTORS = __webpack_require__(9781);\nvar fails = __webpack_require__(7293);\nvar createElement = __webpack_require__(317);\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcz8wY2ZiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLElBQTBCO0FBQ3BELFlBQVksbUJBQU8sQ0FBQyxJQUFvQjtBQUN4QyxvQkFBb0IsbUJBQU8sQ0FBQyxHQUFzQzs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsVUFBVTtBQUNoQyxHQUFHO0FBQ0gsQ0FBQyIsImZpbGUiOiI0NjY0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWllZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4664\n")},8361:function(module,__unused_webpack_exports,__webpack_require__){eval("var fails = __webpack_require__(7293);\nvar classof = __webpack_require__(4326);\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcz80NGFkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksbUJBQU8sQ0FBQyxJQUFvQjtBQUN4QyxjQUFjLG1CQUFPLENBQUMsSUFBMEI7O0FBRWhEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxDQUFDIiwiZmlsZSI6IjgzNjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciBzcGxpdCA9ICcnLnNwbGl0O1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8361\n")},2788:function(module,__unused_webpack_exports,__webpack_require__){eval("var store = __webpack_require__(5465);\n\nvar functionToString = Function.toString;\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcz84OTI1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksbUJBQU8sQ0FBQyxJQUEyQjs7QUFFL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjI3ODguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmc7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2788\n")},9909:function(module,__unused_webpack_exports,__webpack_require__){eval("var NATIVE_WEAK_MAP = __webpack_require__(8536);\nvar global = __webpack_require__(7854);\nvar isObject = __webpack_require__(111);\nvar createNonEnumerableProperty = __webpack_require__(8880);\nvar objectHas = __webpack_require__(6656);\nvar shared = __webpack_require__(5465);\nvar sharedKey = __webpack_require__(6200);\nvar hiddenKeys = __webpack_require__(3501);\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (objectHas(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcz82OWYzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLElBQThCO0FBQzVELGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsR0FBd0I7QUFDL0Msa0NBQWtDLG1CQUFPLENBQUMsSUFBNkM7QUFDdkYsZ0JBQWdCLG1CQUFPLENBQUMsSUFBa0I7QUFDMUMsYUFBYSxtQkFBTyxDQUFDLElBQTJCO0FBQ2hELGdCQUFnQixtQkFBTyxDQUFDLElBQXlCO0FBQ2pELGlCQUFpQixtQkFBTyxDQUFDLElBQTBCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ijk5MDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHdtaGFzLmNhbGwoc3RvcmUsIGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChvYmplY3RIYXMoaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9909\n")},4705:function(module,__unused_webpack_exports,__webpack_require__){eval("var fails = __webpack_require__(7293);\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanM/OTRjYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsSUFBb0I7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDcwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4705\n")},111:function(module){eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanM/ODYxZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTExLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///111\n")},1913:function(module){eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzP2M0MzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiMTkxMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1913\n")},3366:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\n\nmodule.exports = global.Promise;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcz9mZWE5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjs7QUFFMUMiLCJmaWxlIjoiMzM2Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3366\n")},133:function(module,__unused_webpack_exports,__webpack_require__){eval("/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = __webpack_require__(7392);\nvar fails = __webpack_require__(7293);\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzPzQ5MzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxJQUFnQztBQUN6RCxZQUFZLG1CQUFPLENBQUMsSUFBb0I7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6IjEzMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzXG4gIHJldHVybiAhU3RyaW5nKHN5bWJvbCkgfHwgIShPYmplY3Qoc3ltYm9sKSBpbnN0YW5jZW9mIFN5bWJvbCkgfHxcbiAgICAvLyBDaHJvbWUgMzgtNDAgc3ltYm9scyBhcmUgbm90IGluaGVyaXRlZCBmcm9tIERPTSBjb2xsZWN0aW9ucyBwcm90b3R5cGVzIHRvIGluc3RhbmNlc1xuICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///133\n")},8536:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar inspectSource = __webpack_require__(2788);\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanM/N2Y5YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBcUI7QUFDMUMsb0JBQW9CLG1CQUFPLENBQUMsSUFBNkI7O0FBRXpEOztBQUVBIiwiZmlsZSI6Ijg1MzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8536\n")},8523:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar aFunction = __webpack_require__(3099);\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzP2YwNjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYixnQkFBZ0IsbUJBQU8sQ0FBQyxJQUF5Qjs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EiLCJmaWxlIjoiODUyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8523\n")},3070:function(__unused_webpack_module,exports,__webpack_require__){eval("var DESCRIPTORS = __webpack_require__(9781);\nvar IE8_DOM_DEFINE = __webpack_require__(4664);\nvar anObject = __webpack_require__(9670);\nvar toPrimitive = __webpack_require__(7593);\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzPzliZjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsSUFBMEI7QUFDcEQscUJBQXFCLG1CQUFPLENBQUMsSUFBNkI7QUFDMUQsZUFBZSxtQkFBTyxDQUFDLElBQXdCO0FBQy9DLGtCQUFrQixtQkFBTyxDQUFDLElBQTJCOztBQUVyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsZ0JBQWdCO0FBQ25CO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjMwNzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3070\n")},1236:function(__unused_webpack_module,exports,__webpack_require__){eval("var DESCRIPTORS = __webpack_require__(9781);\nvar propertyIsEnumerableModule = __webpack_require__(5296);\nvar createPropertyDescriptor = __webpack_require__(9114);\nvar toIndexedObject = __webpack_require__(5656);\nvar toPrimitive = __webpack_require__(7593);\nvar has = __webpack_require__(6656);\nvar IE8_DOM_DEFINE = __webpack_require__(4664);\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzPzA2Y2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsSUFBMEI7QUFDcEQsaUNBQWlDLG1CQUFPLENBQUMsSUFBNEM7QUFDckYsK0JBQStCLG1CQUFPLENBQUMsSUFBeUM7QUFDaEYsc0JBQXNCLG1CQUFPLENBQUMsSUFBZ0M7QUFDOUQsa0JBQWtCLG1CQUFPLENBQUMsSUFBMkI7QUFDckQsVUFBVSxtQkFBTyxDQUFDLElBQWtCO0FBQ3BDLHFCQUFxQixtQkFBTyxDQUFDLElBQTZCOztBQUUxRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGdCQUFnQjtBQUNuQjtBQUNBIiwiZmlsZSI6IjEyMzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1236\n")},8006:function(__unused_webpack_module,exports,__webpack_require__){eval("var internalObjectKeys = __webpack_require__(6324);\nvar enumBugKeys = __webpack_require__(748);\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcz8yNDFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QixtQkFBTyxDQUFDLElBQW1DO0FBQ3BFLGtCQUFrQixtQkFBTyxDQUFDLEdBQTRCOztBQUV0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSIsImZpbGUiOiI4MDA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8006\n")},5181:function(__unused_webpack_module,exports){eval("// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzPzc0MTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxTQUFTIiwiZmlsZSI6IjUxODEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5181\n")},6324:function(module,__unused_webpack_exports,__webpack_require__){eval("var has = __webpack_require__(6656);\nvar toIndexedObject = __webpack_require__(5656);\nvar indexOf = __webpack_require__(1318).indexOf;\nvar hiddenKeys = __webpack_require__(3501);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jYTg0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVUsbUJBQU8sQ0FBQyxJQUFrQjtBQUNwQyxzQkFBc0IsbUJBQU8sQ0FBQyxJQUFnQztBQUM5RCxjQUFjLGlDQUE4QztBQUM1RCxpQkFBaUIsbUJBQU8sQ0FBQyxJQUEwQjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjYzMjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6324\n")},5296:function(__unused_webpack_module,exports){"use strict";eval("\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcz9kMWU3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQSwyRUFBMkUsT0FBTzs7QUFFbEY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiI1Mjk2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5296\n")},3887:function(module,__unused_webpack_exports,__webpack_require__){eval("var getBuiltIn = __webpack_require__(5005);\nvar getOwnPropertyNamesModule = __webpack_require__(8006);\nvar getOwnPropertySymbolsModule = __webpack_require__(5181);\nvar anObject = __webpack_require__(9670);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcz81NmVmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLElBQTJCO0FBQ3BELGdDQUFnQyxtQkFBTyxDQUFDLElBQTRDO0FBQ3BGLGtDQUFrQyxtQkFBTyxDQUFDLElBQThDO0FBQ3hGLGVBQWUsbUJBQU8sQ0FBQyxJQUF3Qjs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjM4ODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3887\n")},857:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\n\nmodule.exports = global;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzPzQyOGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLElBQXFCOztBQUUxQyIsImZpbGUiOiI4NTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///857\n")},9478:function(module,__unused_webpack_exports,__webpack_require__){eval("var anObject = __webpack_require__(9670);\nvar isObject = __webpack_require__(111);\nvar newPromiseCapability = __webpack_require__(8523);\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanM/Y2RmOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsSUFBd0I7QUFDL0MsZUFBZSxtQkFBTyxDQUFDLEdBQXdCO0FBQy9DLDJCQUEyQixtQkFBTyxDQUFDLElBQXFDOztBQUV4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ijk0NzguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9478\n")},1320:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar createNonEnumerableProperty = __webpack_require__(8880);\nvar has = __webpack_require__(6656);\nvar setGlobal = __webpack_require__(3505);\nvar inspectSource = __webpack_require__(2788);\nvar InternalStateModule = __webpack_require__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcz82ZWViIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjtBQUMxQyxrQ0FBa0MsbUJBQU8sQ0FBQyxJQUE2QztBQUN2RixVQUFVLG1CQUFPLENBQUMsSUFBa0I7QUFDcEMsZ0JBQWdCLG1CQUFPLENBQUMsSUFBeUI7QUFDakQsb0JBQW9CLG1CQUFPLENBQUMsSUFBNkI7QUFDekQsMEJBQTBCLG1CQUFPLENBQUMsSUFBNkI7O0FBRS9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLENBQUMiLCJmaWxlIjoiMTMyMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgdmFyIHN0YXRlO1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywga2V5KTtcbiAgICB9XG4gICAgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCFzdGF0ZS5zb3VyY2UpIHtcbiAgICAgIHN0YXRlLnNvdXJjZSA9IFRFTVBMQVRFLmpvaW4odHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/IGtleSA6ICcnKTtcbiAgICB9XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1320\n")},4488:function(module){eval('// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError("Can\'t call method on " + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanM/MWQ4MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDQ4OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4488\n')},3505:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar createNonEnumerableProperty = __webpack_require__(8880);\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzP2NlNGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLElBQXFCO0FBQzFDLGtDQUFrQyxtQkFBTyxDQUFDLElBQTZDOztBQUV2RjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiMzUwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3505\n")},6200:function(module,__unused_webpack_exports,__webpack_require__){eval("var shared = __webpack_require__(2309);\nvar uid = __webpack_require__(9711);\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzP2Y3NzIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLElBQXFCO0FBQzFDLFVBQVUsbUJBQU8sQ0FBQyxJQUFrQjs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjYyMDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6200\n")},5465:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar setGlobal = __webpack_require__(3505);\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanM/YzZjZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsSUFBcUI7QUFDMUMsZ0JBQWdCLG1CQUFPLENBQUMsSUFBeUI7O0FBRWpEO0FBQ0Esa0RBQWtEOztBQUVsRCIsImZpbGUiOiI1NDY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5465\n")},2309:function(module,__unused_webpack_exports,__webpack_require__){eval("var IS_PURE = __webpack_require__(1913);\nvar store = __webpack_require__(5465);\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.15.2',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanM/NTY5MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1CQUFPLENBQUMsSUFBc0I7QUFDNUMsWUFBWSxtQkFBTyxDQUFDLElBQTJCOztBQUUvQztBQUNBLHFFQUFxRTtBQUNyRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiIyMzA5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMTUuMicsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2309\n")},6707:function(module,__unused_webpack_exports,__webpack_require__){eval("var anObject = __webpack_require__(9670);\nvar aFunction = __webpack_require__(3099);\nvar wellKnownSymbol = __webpack_require__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPzQ4NDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLElBQXdCO0FBQy9DLGdCQUFnQixtQkFBTyxDQUFDLElBQXlCO0FBQ2pELHNCQUFzQixtQkFBTyxDQUFDLElBQWdDOztBQUU5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI2NzA3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6707\n")},6091:function(module,__unused_webpack_exports,__webpack_require__){eval("var fails = __webpack_require__(7293);\nvar whitespaces = __webpack_require__(1361);\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQuanM/YzhkMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsSUFBb0I7QUFDeEMsa0JBQWtCLG1CQUFPLENBQUMsSUFBMEI7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNjA5MS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciBub24gPSAnXFx1MjAwQlxcdTAwODVcXHUxODBFJztcblxuLy8gY2hlY2sgdGhhdCBhIG1ldGhvZCB3b3JrcyB3aXRoIHRoZSBjb3JyZWN0IGxpc3Rcbi8vIG9mIHdoaXRlc3BhY2VzIGFuZCBoYXMgYSBjb3JyZWN0IG5hbWVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdKCkgfHwgbm9uW01FVEhPRF9OQU1FXSgpICE9IG5vbiB8fCB3aGl0ZXNwYWNlc1tNRVRIT0RfTkFNRV0ubmFtZSAhPT0gTUVUSE9EX05BTUU7XG4gIH0pO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6091\n")},3111:function(module,__unused_webpack_exports,__webpack_require__){eval("var requireObjectCoercible = __webpack_require__(4488);\nvar whitespaces = __webpack_require__(1361);\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcz81OGE4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUE2QixtQkFBTyxDQUFDLElBQXVDO0FBQzVFLGtCQUFrQixtQkFBTyxDQUFDLElBQTBCOztBQUVwRDtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLGdEQUFnRDtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzExMS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciB3aGl0ZXNwYWNlID0gJ1snICsgd2hpdGVzcGFjZXMgKyAnXSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgd2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbSwgdHJpbVN0YXJ0LCB0cmltRW5kLCB0cmltTGVmdCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzKSB7XG4gICAgdmFyIHN0cmluZyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpO1xuICAgIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUxlZnQsIHRyaW1TdGFydCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4gIHRyaW06IGNyZWF0ZU1ldGhvZCgzKVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3111\n")},1400:function(module,__unused_webpack_exports,__webpack_require__){eval("var toInteger = __webpack_require__(9958);\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8yM2NiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLElBQXlCOztBQUVqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTQwMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1400\n")},5656:function(module,__unused_webpack_exports,__webpack_require__){eval("// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __webpack_require__(8361);\nvar requireObjectCoercible = __webpack_require__(4488);\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz9mYzZhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0Esb0JBQW9CLG1CQUFPLENBQUMsSUFBNkI7QUFDekQsNkJBQTZCLG1CQUFPLENBQUMsSUFBdUM7O0FBRTVFO0FBQ0E7QUFDQSIsImZpbGUiOiI1NjU2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5656\n")},9958:function(module){eval("var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzP2E2OTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6Ijk5NTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9958\n")},7466:function(module,__unused_webpack_exports,__webpack_require__){eval("var toInteger = __webpack_require__(9958);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanM/NTBjNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxJQUF5Qjs7QUFFakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFIiwiZmlsZSI6Ijc0NjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7466\n")},7908:function(module,__unused_webpack_exports,__webpack_require__){eval("var requireObjectCoercible = __webpack_require__(4488);\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanM/N2IwYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkIsbUJBQU8sQ0FBQyxJQUF1Qzs7QUFFNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI3OTA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7908\n")},7593:function(module,__unused_webpack_exports,__webpack_require__){eval("var isObject = __webpack_require__(111);\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanM/YzA0ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBd0I7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI3NTkzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7593\n")},9711:function(module){eval("var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanM/OTBlMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiI5NzExLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9711\n")},3307:function(module,__unused_webpack_exports,__webpack_require__){eval("/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = __webpack_require__(133);\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcz9mZGJmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0Esb0JBQW9CLG1CQUFPLENBQUMsR0FBNEI7O0FBRXhEO0FBQ0E7QUFDQSIsImZpbGUiOiIzMzA3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3307\n")},5112:function(module,__unused_webpack_exports,__webpack_require__){eval("var global = __webpack_require__(7854);\nvar shared = __webpack_require__(2309);\nvar has = __webpack_require__(6656);\nvar uid = __webpack_require__(9711);\nvar NATIVE_SYMBOL = __webpack_require__(133);\nvar USE_SYMBOL_AS_UID = __webpack_require__(3307);\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n if (NATIVE_SYMBOL && has(Symbol, name)) {\n WellKnownSymbolsStore[name] = Symbol[name];\n } else {\n WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n }\n } return WellKnownSymbolsStore[name];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcz9iNjIyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxJQUFxQjtBQUMxQyxhQUFhLG1CQUFPLENBQUMsSUFBcUI7QUFDMUMsVUFBVSxtQkFBTyxDQUFDLElBQWtCO0FBQ3BDLFVBQVUsbUJBQU8sQ0FBQyxJQUFrQjtBQUNwQyxvQkFBb0IsbUJBQU8sQ0FBQyxHQUE0QjtBQUN4RCx3QkFBd0IsbUJBQU8sQ0FBQyxJQUFnQzs7QUFFaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNTExMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSB8fCAhKE5BVElWRV9TWU1CT0wgfHwgdHlwZW9mIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9PSAnc3RyaW5nJykpIHtcbiAgICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXMoU3ltYm9sLCBuYW1lKSkge1xuICAgICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gICAgfVxuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5112\n")},1361:function(module){eval("// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcz81ODk5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSIsImZpbGUiOiIxMzYxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1361\n")},7727:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar $ = __webpack_require__(2109);\nvar IS_PURE = __webpack_require__(1913);\nvar NativePromise = __webpack_require__(3366);\nvar fails = __webpack_require__(7293);\nvar getBuiltIn = __webpack_require__(5005);\nvar speciesConstructor = __webpack_require__(6707);\nvar promiseResolve = __webpack_require__(9478);\nvar redefine = __webpack_require__(1320);\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && typeof NativePromise == 'function') {\n var method = getBuiltIn('Promise').prototype['finally'];\n if (NativePromise.prototype['finally'] !== method) {\n redefine(NativePromise.prototype, 'finally', method, { unsafe: true });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzP2E3OWQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYixRQUFRLG1CQUFPLENBQUMsSUFBcUI7QUFDckMsY0FBYyxtQkFBTyxDQUFDLElBQXNCO0FBQzVDLG9CQUFvQixtQkFBTyxDQUFDLElBQXlDO0FBQ3JFLFlBQVksbUJBQU8sQ0FBQyxJQUFvQjtBQUN4QyxpQkFBaUIsbUJBQU8sQ0FBQyxJQUEyQjtBQUNwRCx5QkFBeUIsbUJBQU8sQ0FBQyxJQUFrQztBQUNuRSxxQkFBcUIsbUJBQU8sQ0FBQyxJQUE4QjtBQUMzRCxlQUFlLG1CQUFPLENBQUMsSUFBdUI7O0FBRTlDO0FBQ0E7QUFDQSwyQ0FBMkMsb0JBQW9CLGNBQWMsRUFBRSxlQUFlLGNBQWM7QUFDNUcsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsR0FBRyxrRUFBa0U7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxVQUFVLEVBQUU7QUFDNUUsT0FBTztBQUNQO0FBQ0EsZ0VBQWdFLFNBQVMsRUFBRTtBQUMzRSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsZUFBZTtBQUN6RTtBQUNBIiwiZmlsZSI6Ijc3MjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJykge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddO1xuICBpZiAoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSAhPT0gbWV0aG9kKSB7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7727\n")},8702:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar $ = __webpack_require__(2109);\nvar $trimEnd = __webpack_require__(3111).end;\nvar forcedStringTrimMethod = __webpack_require__(6091);\n\nvar FORCED = forcedStringTrimMethod('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n return $trimEnd(this);\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://tc39.es/ecma262/#sec-string.prototype.trimend\n// https://tc39.es/ecma262/#String.prototype.trimright\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimEnd: trimEnd,\n trimRight: trimEnd\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzPzFlMjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYixRQUFRLG1CQUFPLENBQUMsSUFBcUI7QUFDckMsZUFBZSw2QkFBdUM7QUFDdEQsNkJBQTZCLG1CQUFPLENBQUMsSUFBaUM7O0FBRXRFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0EsR0FBRyxnREFBZ0Q7QUFDbkQ7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoiODcwMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR0cmltRW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykuZW5kO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkJyk7XG5cbnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltRW5kJyk7XG5cbnZhciB0cmltRW5kID0gRk9SQ0VEID8gZnVuY3Rpb24gdHJpbUVuZCgpIHtcbiAgcmV0dXJuICR0cmltRW5kKHRoaXMpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbXN0YXJ0LXRyaW1lbmQgLS0gc2FmZVxufSA6ICcnLnRyaW1FbmQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUVuZCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHNcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jU3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICB0cmltRW5kOiB0cmltRW5kLFxuICB0cmltUmlnaHQ6IHRyaW1FbmRcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8702\n")}}]); \ No newline at end of file diff --git a/803-0bf34ac/en/404.html b/803-0bf34ac/en/404.html new file mode 100644 index 00000000..b20f0d4f --- /dev/null +++ b/803-0bf34ac/en/404.html @@ -0,0 +1 @@ +Page not found
\ No newline at end of file diff --git a/803-0bf34ac/en/404/index.html b/803-0bf34ac/en/404/index.html new file mode 100644 index 00000000..9b21525e --- /dev/null +++ b/803-0bf34ac/en/404/index.html @@ -0,0 +1 @@ +Page not found

Page not found

Sorry 😔 we couldn’t find what you were looking for.

\ No newline at end of file diff --git a/803-0bf34ac/en/cejst/index.html b/803-0bf34ac/en/cejst/index.html new file mode 100644 index 00000000..c3b97e42 --- /dev/null +++ b/803-0bf34ac/en/cejst/index.html @@ -0,0 +1,6 @@ +Explore the tool

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see communities of focus that can help Federal agencies + identify disadvantaged communities and to provide socioeconomic, + environmental, and climate information and data. Learn more about the methodology + and datasets that were used to determine these communities of focus on the + Data & methodology + page.

Draft community of focus

A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv, and one .pdf (111MB).

How you can help improve the tool

\ No newline at end of file diff --git a/803-0bf34ac/en/contact/index.html b/803-0bf34ac/en/contact/index.html new file mode 100644 index 00000000..fd2262c6 --- /dev/null +++ b/803-0bf34ac/en/contact/index.html @@ -0,0 +1 @@ +Contact

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file diff --git a/803-0bf34ac/en/index.html b/803-0bf34ac/en/index.html new file mode 100644 index 00000000..5a8f3631 --- /dev/null +++ b/803-0bf34ac/en/index.html @@ -0,0 +1 @@ +About

Public betaThis website may be continuously updated

About us

The screening tool

The screening tool

On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.

The current version of the tool is in a public beta form and will be updated based on feedback from the public.

The Justice40 Initiative

The Justice40 Initiative

The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.

Read more about the Justice40 Initiative in President Biden’s Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.

How to get started

Federal program managers

Federal program managers

Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.

Community members

Community members

Explore data about communities of focus in your area, and help provide feedback on the tool.

Get involved

Send feedback

Send feedback

Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?

Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.

\ No newline at end of file diff --git a/803-0bf34ac/en/methodology/index.html b/803-0bf34ac/en/methodology/index.html new file mode 100644 index 00000000..d649f1bd --- /dev/null +++ b/803-0bf34ac/en/methodology/index.html @@ -0,0 +1,24 @@ +Data and Methodology

Public betaThis website may be continuously updated

Methodology

The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.

Draft communities list v0.1 (111MB)
The package includes draft v0.1 of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf). Last updated: 10/01/21

Limited data sourcesDatasets may be added, updated, or removed.

Datasets used in methodology

The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.

Area Median Income

Median income of the census block group calculated as a percent + of the metropolitan area’s or state's median income.

Poverty

Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level.

Education, less than high school education

Percent of people ages 25 years or older in a block group whose + education level is less than a high school diploma.

Additional Indicators

These datasets provide additional information about each community.

Diabetes

People ages 18 years and older who report having ever been + told by a doctor, nurse, or other health professionals that they have + diabetes other than diabetes during pregnancy.

Asthma

Weighted number of respondents people who answer “yes” both + to both of the following questions: “Have you ever been told by a doctor, + nurse, or other health professional that you have asthma?” and the question + “Do you still have asthma?”

Heart disease

People ages 18 years and older who report ever having been told + by a doctor, nurse, or other health professionals that they had angina or + coronary heart disease.

Life expectancy

Estimated years of life expectancy.

Traffic proximity and volume

Count of vehicles (average annual daily traffic) at major roads + within 500 meters, divided by distance in meters (not km).

FEMA Risk Index Expected Annual Loss Score

Average economic loss in dollars resulting from natural + hazards each year. It is calculated for each hazard type and quantifies + loss for relevant consequence types: buildings, people, and agriculture.

Energy burden

Average annual energy cost ($) divided by household income.

Housing cost burden

Households that are low income and spend more than 30% of their + income to housing costs.

Wastewater discharge

RSEI modeled Toxic Concentrations at stream segments within 500 + meters, divided by distance in kilometers (km).

Lead paint

Percent of housing units built pre-1960, used as an + indicator of potential lead paint exposure in homes.

Diesel particulate matter

Mixture of particles that is part of diesel exhaust in the air.

PM2.5

Fine inhalable particles, with diameters that are generally + 2.5 micrometers and smaller.

Methodology

The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.

The following describes the process for identifying communities of focus.

  1. Gather datasets

    The methodology includes the following inputs that are equally weighted.

    Percent of Area Median Income

    If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.

    If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.

    Percent of households below or at 100% of the federal poverty line

    This is the percent of households in a state with a household income + below or at 100% of the federal poverty line. This federal poverty line is calculated + based on the composition of each household (e.g., based on household size), but it does not vary geographically.

    The high school degree achievement rate for adults 25 years and older

    The percent of individuals who are 25 or older who have received a high school degree.

  2. Determine communites of focus

    Under the existing formula, a census block group will be considered a community of focus if:

    (The median income is less than 80% of the area median income

    OR

    households living in poverty (at or below 100% of the federal poverty level) is greater than 20%)

    AND

    The high school degree achievement rate for adults 25 years and older is greater than 95%

\ No newline at end of file diff --git a/803-0bf34ac/es/404.html b/803-0bf34ac/es/404.html new file mode 100644 index 00000000..91d3dfd2 --- /dev/null +++ b/803-0bf34ac/es/404.html @@ -0,0 +1 @@ +Page not found

Page not found

Sorry 😔 we couldn’t find what you were looking for.

\ No newline at end of file diff --git a/803-0bf34ac/es/404/index.html b/803-0bf34ac/es/404/index.html new file mode 100644 index 00000000..2b4611d9 --- /dev/null +++ b/803-0bf34ac/es/404/index.html @@ -0,0 +1 @@ +Page not found

Page not found

Sorry 😔 we couldn’t find what you were looking for.

\ No newline at end of file diff --git a/803-0bf34ac/es/cejst/index.html b/803-0bf34ac/es/cejst/index.html new file mode 100644 index 00000000..cf9b6128 --- /dev/null +++ b/803-0bf34ac/es/cejst/index.html @@ -0,0 +1,6 @@ +Explore the tool

Public betaThis website may be continuously updated

Explore the tool

Zoom into the map to see communities of focus that can help Federal agencies + identify disadvantaged communities and to provide socioeconomic, + environmental, and climate information and data. Learn more about the methodology + and datasets that were used to determine these communities of focus on the + Data & methodology + page.

Draft community of focus

A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative

Limited data sourcesDatasets may be added, updated, or removed.

ZIP file will contain one .xlsx, one .csv, and one .pdf (111MB).

How you can help improve the tool

\ No newline at end of file diff --git a/803-0bf34ac/es/contact/index.html b/803-0bf34ac/es/contact/index.html new file mode 100644 index 00000000..37fac002 --- /dev/null +++ b/803-0bf34ac/es/contact/index.html @@ -0,0 +1 @@ +Contact

Public betaThis website may be continuously updated

Contact

Email us

For general feedback, email screeningtool.feedback@usds.gov

\ No newline at end of file diff --git a/803-0bf34ac/es/index.html b/803-0bf34ac/es/index.html new file mode 100644 index 00000000..c072dbc6 --- /dev/null +++ b/803-0bf34ac/es/index.html @@ -0,0 +1 @@ +About

Public betaThis website may be continuously updated

About us

The screening tool

The screening tool

On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.

The current version of the tool is in a public beta form and will be updated based on feedback from the public.

The Justice40 Initiative

The Justice40 Initiative

The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.

Read more about the Justice40 Initiative in President Biden’s Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.

How to get started

Federal program managers

Federal program managers

Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.

Community members

Community members

Explore data about communities of focus in your area, and help provide feedback on the tool.

Get involved

Send feedback

Send feedback

Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?

Join the open source community

Join the open source community

The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.

\ No newline at end of file diff --git a/803-0bf34ac/es/methodology/index.html b/803-0bf34ac/es/methodology/index.html new file mode 100644 index 00000000..88ccf531 --- /dev/null +++ b/803-0bf34ac/es/methodology/index.html @@ -0,0 +1,24 @@ +Data and Methodology

Public betaThis website may be continuously updated

Methodology

The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.

Draft communities list v0.1 (111MB)
The package includes draft v0.1 of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf). Last updated: 10/01/21

Limited data sourcesDatasets may be added, updated, or removed.

Datasets used in methodology

The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.

Area Median Income

Median income of the census block group calculated as a percent + of the metropolitan area’s or state's median income.

Poverty

Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level.

Education, less than high school education

Percent of people ages 25 years or older in a block group whose + education level is less than a high school diploma.

Additional Indicators

These datasets provide additional information about each community.

Diabetes

People ages 18 years and older who report having ever been + told by a doctor, nurse, or other health professionals that they have + diabetes other than diabetes during pregnancy.

Asthma

Weighted number of respondents people who answer “yes” both + to both of the following questions: “Have you ever been told by a doctor, + nurse, or other health professional that you have asthma?” and the question + “Do you still have asthma?”

Heart disease

People ages 18 years and older who report ever having been told + by a doctor, nurse, or other health professionals that they had angina or + coronary heart disease.

Life expectancy

Estimated years of life expectancy.

Traffic proximity and volume

Count of vehicles (average annual daily traffic) at major roads + within 500 meters, divided by distance in meters (not km).

FEMA Risk Index Expected Annual Loss Score

Average economic loss in dollars resulting from natural + hazards each year. It is calculated for each hazard type and quantifies + loss for relevant consequence types: buildings, people, and agriculture.

Energy burden

Average annual energy cost ($) divided by household income.

Housing cost burden

Households that are low income and spend more than 30% of their + income to housing costs.

Wastewater discharge

RSEI modeled Toxic Concentrations at stream segments within 500 + meters, divided by distance in kilometers (km).

Lead paint

Percent of housing units built pre-1960, used as an + indicator of potential lead paint exposure in homes.

Diesel particulate matter

Mixture of particles that is part of diesel exhaust in the air.

PM2.5

Fine inhalable particles, with diameters that are generally + 2.5 micrometers and smaller.

Methodology

The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.

The following describes the process for identifying communities of focus.

  1. Gather datasets

    The methodology includes the following inputs that are equally weighted.

    Percent of Area Median Income

    If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.

    If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.

    Percent of households below or at 100% of the federal poverty line

    This is the percent of households in a state with a household income + below or at 100% of the federal poverty line. This federal poverty line is calculated + based on the composition of each household (e.g., based on household size), but it does not vary geographically.

    The high school degree achievement rate for adults 25 years and older

    The percent of individuals who are 25 or older who have received a high school degree.

  2. Determine communites of focus

    Under the existing formula, a census block group will be considered a community of focus if:

    (The median income is less than 80% of the area median income

    OR

    households living in poverty (at or below 100% of the federal poverty level) is greater than 20%)

    AND

    The high school degree achievement rate for adults 25 years and older is greater than 95%

\ No newline at end of file diff --git a/803-0bf34ac/favicon.ico b/803-0bf34ac/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9b143e190b31191f48459f4c77996c5fa84b14e1 GIT binary patch literal 2148 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 B(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var D={};\n"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1,!1)});\n["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1,!1)});\n["checked","multiple","muted","selected"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1,!1)});["capture","download"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1,!1)});["cols","rows","size","span"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1,!1)});["rowSpan","start"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1,!1)});var oa=/[\\-:]([a-z])/g;function pa(a){return a[1].toUpperCase()}\n"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(oa,\npa);D[b]=new B(b,1,!1,a,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1,!1)});\nD.xlinkHref=new B("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction qa(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2h||e[g]!==f[h])return"\\n"+e[g].replace(" at new "," at ");while(1<=g&&0<=h)}break}}}finally{Oa=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:"")?Na(a):""}\nfunction Qa(a){switch(a.tag){case 5:return Na(a.type);case 16:return Na("Lazy");case 13:return Na("Suspense");case 19:return Na("SuspenseList");case 0:case 2:case 15:return a=Pa(a.type,!1),a;case 11:return a=Pa(a.type.render,!1),a;case 22:return a=Pa(a.type._render,!1),a;case 1:return a=Pa(a.type,!0),a;default:return""}}\nfunction Ra(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case ua:return"Fragment";case ta:return"Portal";case xa:return"Profiler";case wa:return"StrictMode";case Ba:return"Suspense";case Ca:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case za:return(a.displayName||"Context")+".Consumer";case ya:return(a._context.displayName||"Context")+".Provider";case Aa:var b=a.render;b=b.displayName||b.name||"";\nreturn a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Da:return Ra(a.type);case Fa:return Ra(a._render);case Ea:b=a._payload;a=a._init;try{return Ra(a(b))}catch(c){}}return null}function Sa(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function Ta(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}\nfunction Ua(a){var b=Ta(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ta(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return m({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function $a(a,b){b=b.checked;null!=b&&qa(a,"checked",b,!1)}\nfunction ab(a,b){$a(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?bb(a,b.type,c):b.hasOwnProperty("defaultValue")&&bb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction cb(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}\nfunction bb(a,b,c){if("number"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function db(a){var b="";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function eb(a,b){a=m({children:void 0},b);if(b=db(b.children))a.children=b;return a}\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e=c.length))throw Error(y(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}var kb={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};\nfunction lb(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function mb(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?lb(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}\nvar nb,ob=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==kb.svg||"innerHTML"in a)a.innerHTML=b;else{nb=nb||document.createElement("div");nb.innerHTML=""+b.valueOf().toString()+"";for(b=nb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction pb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar qb={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rb=["Webkit","ms","Moz","O"];Object.keys(qb).forEach(function(a){rb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);qb[b]=qb[a]})});function sb(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||qb.hasOwnProperty(a)&&qb[a]?(""+b).trim():b+"px"}\nfunction tb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=sb(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}var ub=m({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction vb(a,b){if(b){if(ub[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(y(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(y(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(y(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(y(62));}}\nfunction wb(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}}function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if("function"!==typeof yb)throw Error(y(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;ad?0:1<c;c++)b.push(a);return b}\nfunction $c(a,b,c){a.pendingLanes|=b;var d=b-1;a.suspendedLanes&=d;a.pingedLanes&=d;a=a.eventTimes;b=31-Vc(b);a[b]=c}var Vc=Math.clz32?Math.clz32:ad,bd=Math.log,cd=Math.LN2;function ad(a){return 0===a?32:31-(bd(a)/cd|0)|0}var dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function gd(a,b,c,d){Kb||Ib();var e=hd,f=Kb;Kb=!0;try{Hb(e,a,b,c,d)}finally{(Kb=f)||Mb()}}function id(a,b,c,d){ed(dd,hd.bind(null,a,b,c,d))}\nfunction hd(a,b,c,d){if(fd){var e;if((e=0===(b&4))&&0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case "keyup":return-1!==$d.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "focusout":return!0;default:return!1}}function he(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case "compositionend":return he(b);case "keypress":if(32!==b.which)return null;fe=!0;return ee;case "textInput":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return"compositionend"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Ke(c)}}function Me(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Me(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Ne(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Oe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}\nvar Pe=fa&&"documentMode"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,"selectionStart"in d&&Oe(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Je(Se,d)||(Se=d,d=oe(Re,"onSelect"),0Af||(a.current=zf[Af],zf[Af]=null,Af--)}function I(a,b){Af++;zf[Af]=a.current;a.current=b}var Cf={},M=Bf(Cf),N=Bf(!1),Df=Cf;\nfunction Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function Ff(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Gf(){H(N);H(M)}function Hf(a,b,c){if(M.current!==Cf)throw Error(y(168));I(M,b);I(N,c)}\nfunction If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(y(108,Ra(b)||"Unknown",e));return m({},c,d)}function Jf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Cf;Df=M.current;I(M,a);I(N,N.current);return!0}function Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(y(169));c?(a=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=a,H(N),H(M),I(M,a)):H(N);I(N,c)}\nvar Lf=null,Mf=null,Nf=r.unstable_runWithPriority,Of=r.unstable_scheduleCallback,Pf=r.unstable_cancelCallback,Qf=r.unstable_shouldYield,Rf=r.unstable_requestPaint,Sf=r.unstable_now,Tf=r.unstable_getCurrentPriorityLevel,Uf=r.unstable_ImmediatePriority,Vf=r.unstable_UserBlockingPriority,Wf=r.unstable_NormalPriority,Xf=r.unstable_LowPriority,Yf=r.unstable_IdlePriority,Zf={},$f=void 0!==Rf?Rf:function(){},ag=null,bg=null,cg=!1,dg=Sf(),O=1E4>dg?Sf:function(){return Sf()-dg};\nfunction eg(){switch(Tf()){case Uf:return 99;case Vf:return 98;case Wf:return 97;case Xf:return 96;case Yf:return 95;default:throw Error(y(332));}}function fg(a){switch(a){case 99:return Uf;case 98:return Vf;case 97:return Wf;case 96:return Xf;case 95:return Yf;default:throw Error(y(332));}}function gg(a,b){a=fg(a);return Nf(a,b)}function hg(a,b,c){a=fg(a);return Of(a,b,c)}function ig(){if(null!==bg){var a=bg;bg=null;Pf(a)}jg()}\nfunction jg(){if(!cg&&null!==ag){cg=!0;var a=0;try{var b=ag;gg(99,function(){for(;az?(q=u,u=null):q=u.sibling;var n=p(e,u,h[z],k);if(null===n){null===u&&(u=q);break}a&&u&&null===\nn.alternate&&b(e,u);g=f(n,g,z);null===t?l=n:t.sibling=n;t=n;u=q}if(z===h.length)return c(e,u),l;if(null===u){for(;zz?(q=u,u=null):q=u.sibling;var w=p(e,u,n.value,k);if(null===w){null===u&&(u=q);break}a&&u&&null===w.alternate&&b(e,u);g=f(w,g,z);null===t?l=w:t.sibling=w;t=w;u=q}if(n.done)return c(e,u),l;if(null===u){for(;!n.done;z++,n=h.next())n=A(e,n.value,k),null!==n&&(g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);return l}for(u=d(e,u);!n.done;z++,n=h.next())n=C(u,e,z,n.value,k),null!==n&&(a&&null!==n.alternate&&\nu.delete(null===n.key?z:n.key),g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);a&&u.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!==f&&f.type===ua&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case sa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ua){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,k.sibling);\nd=e(k,f.props);d.ref=Qg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ua?(d=Xg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Vg(f.type,f.key,f.props,null,a.mode,h),h.ref=Qg(a,d,f),h.return=a,a=h)}return g(a);case ta:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=\nWg(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Ug(f,a.mode,h),d.return=a,a=d),g(a);if(Pg(f))return x(a,d,f,h);if(La(f))return w(a,d,f,h);l&&Rg(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 22:case 0:case 11:case 15:throw Error(y(152,Ra(a.type)||"Component"));}return c(a,d)}}var Yg=Sg(!0),Zg=Sg(!1),$g={},ah=Bf($g),bh=Bf($g),ch=Bf($g);\nfunction dh(a){if(a===$g)throw Error(y(174));return a}function eh(a,b){I(ch,b);I(bh,a);I(ah,$g);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:mb(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=mb(b,a)}H(ah);I(ah,b)}function fh(){H(ah);H(bh);H(ch)}function gh(a){dh(ch.current);var b=dh(ah.current);var c=mb(b,a.type);b!==c&&(I(bh,a),I(ah,c))}function hh(a){bh.current===a&&(H(ah),H(bh))}var P=Bf(0);\nfunction ih(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||"$?"===c.data||"$!"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var jh=null,kh=null,lh=!1;\nfunction mh(a,b){var c=nh(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.flags=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function oh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ph(a){if(lh){var b=kh;if(b){var c=b;if(!oh(a,b)){b=rf(c.nextSibling);if(!b||!oh(a,b)){a.flags=a.flags&-1025|2;lh=!1;jh=a;return}mh(jh,c)}jh=a;kh=rf(b.firstChild)}else a.flags=a.flags&-1025|2,lh=!1,jh=a}}function qh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;jh=a}\nfunction rh(a){if(a!==jh)return!1;if(!lh)return qh(a),lh=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!nf(b,a.memoizedProps))for(b=kh;b;)mh(a,b),b=rf(b.nextSibling);qh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(y(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if("/$"===c){if(0===b){kh=rf(a.nextSibling);break a}b--}else"$"!==c&&"$!"!==c&&"$?"!==c||b++}a=a.nextSibling}kh=null}}else kh=jh?rf(a.stateNode.nextSibling):null;return!0}\nfunction sh(){kh=jh=null;lh=!1}var th=[];function uh(){for(var a=0;af))throw Error(y(301));f+=1;T=S=null;b.updateQueue=null;vh.current=Fh;a=c(d,e)}while(zh)}vh.current=Gh;b=null!==S&&null!==S.next;xh=0;T=S=R=null;yh=!1;if(b)throw Error(y(300));return a}function Hh(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===T?R.memoizedState=T=a:T=T.next=a;return T}\nfunction Ih(){if(null===S){var a=R.alternate;a=null!==a?a.memoizedState:null}else a=S.next;var b=null===T?R.memoizedState:T.next;if(null!==b)T=b,S=a;else{if(null===a)throw Error(y(310));S=a;a={memoizedState:S.memoizedState,baseState:S.baseState,baseQueue:S.baseQueue,queue:S.queue,next:null};null===T?R.memoizedState=T=a:T=T.next=a}return T}function Jh(a,b){return"function"===typeof b?b(a):b}\nfunction Kh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=S,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.lane;if((xh&l)===l)null!==h&&(h=h.next={lane:0,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),d=k.eagerReducer===a?k.eagerState:a(d,k.action);else{var n={lane:l,action:k.action,eagerReducer:k.eagerReducer,\neagerState:k.eagerState,next:null};null===h?(g=h=n,f=d):h=h.next=n;R.lanes|=l;Dg|=l}k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;He(d,b.memoizedState)||(ug=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction Lh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction Mh(a,b,c){var d=b._getVersion;d=d(b._source);var e=b._workInProgressVersionPrimary;if(null!==e)a=e===d;else if(a=a.mutableReadLanes,a=(xh&a)===a)b._workInProgressVersionPrimary=d,th.push(b);if(a)return c(b._source);th.push(b);throw Error(y(350));}\nfunction Nh(a,b,c,d){var e=U;if(null===e)throw Error(y(349));var f=b._getVersion,g=f(b._source),h=vh.current,k=h.useState(function(){return Mh(e,b,c)}),l=k[1],n=k[0];k=T;var A=a.memoizedState,p=A.refs,C=p.getSnapshot,x=A.source;A=A.subscribe;var w=R;a.memoizedState={refs:p,source:b,subscribe:d};h.useEffect(function(){p.getSnapshot=c;p.setSnapshot=l;var a=f(b._source);if(!He(g,a)){a=c(b._source);He(n,a)||(l(a),a=Ig(w),e.mutableReadLanes|=a&e.pendingLanes);a=e.mutableReadLanes;e.entangledLanes|=a;for(var d=\ne.entanglements,h=a;0c?98:c,function(){a(!0)});gg(97\\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),"select"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[wf]=b;a[xf]=d;Bi(a,b,!1,!1);b.stateNode=a;g=wb(c,d);switch(c){case "dialog":G("cancel",a);G("close",a);\ne=d;break;case "iframe":case "object":case "embed":G("load",a);e=d;break;case "video":case "audio":for(e=0;eJi&&(b.flags|=64,f=!0,Fi(d,!1),b.lanes=33554432)}else{if(!f)if(a=ih(g),null!==a){if(b.flags|=64,f=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Fi(d,!0),null===d.tail&&"hidden"===d.tailMode&&!g.alternate&&!lh)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*O()-d.renderingStartTime>Ji&&1073741824!==c&&(b.flags|=\n64,f=!0,Fi(d,!1),b.lanes=33554432);d.isBackwards?(g.sibling=b.child,b.child=g):(c=d.last,null!==c?c.sibling=g:b.child=g,d.last=g)}return null!==d.tail?(c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=O(),c.sibling=null,b=P.current,I(P,f?b&1|2:b&1),c):null;case 23:case 24:return Ki(),null!==a&&null!==a.memoizedState!==(null!==b.memoizedState)&&"unstable-defer-without-hiding"!==d.mode&&(b.flags|=4),null}throw Error(y(156,b.tag));}\nfunction Li(a){switch(a.tag){case 1:Ff(a.type)&&Gf();var b=a.flags;return b&4096?(a.flags=b&-4097|64,a):null;case 3:fh();H(N);H(M);uh();b=a.flags;if(0!==(b&64))throw Error(y(285));a.flags=b&-4097|64;return a;case 5:return hh(a),null;case 13:return H(P),b=a.flags,b&4096?(a.flags=b&-4097|64,a):null;case 19:return H(P),null;case 4:return fh(),null;case 10:return rg(a),null;case 23:case 24:return Ki(),null;default:return null}}\nfunction Mi(a,b){try{var c="",d=b;do c+=Qa(d),d=d.return;while(d);var e=c}catch(f){e="\\nError generating stack: "+f.message+"\\n"+f.stack}return{value:a,source:b,stack:e}}function Ni(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Oi="function"===typeof WeakMap?WeakMap:Map;function Pi(a,b,c){c=zg(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Qi||(Qi=!0,Ri=d);Ni(a,b)};return c}\nfunction Si(a,b,c){c=zg(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Ni(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&(null===Ti?Ti=new Set([this]):Ti.add(this),Ni(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}var Ui="function"===typeof WeakSet?WeakSet:Set;\nfunction Vi(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Wi(a,c)}else b.current=null}function Xi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.flags&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:lg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:b.flags&256&&qf(b.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(y(163));}\nfunction Yi(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{if(3===(a.tag&3)){var d=a.create;a.destroy=d()}a=a.next}while(a!==b)}b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{var e=a;d=e.next;e=e.tag;0!==(e&4)&&0!==(e&1)&&(Zi(c,a),$i(c,a));a=d}while(a!==b)}return;case 1:a=c.stateNode;c.flags&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:lg(c.type,b.memoizedProps),a.componentDidUpdate(d,\nb.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Eg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Eg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.flags&4&&mf(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Cc(c))));\nreturn;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(y(163));}\nfunction aj(a,b){for(var c=a;;){if(5===c.tag){var d=c.stateNode;if(b)d=d.style,"function"===typeof d.setProperty?d.setProperty("display","none","important"):d.display="none";else{d=c.stateNode;var e=c.memoizedProps.style;e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null;d.style.display=sb("display",e)}}else if(6===c.tag)c.stateNode.nodeValue=b?"":c.memoizedProps;else if((23!==c.tag&&24!==c.tag||null===c.memoizedState||c===a)&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===\na)break;for(;null===c.sibling;){if(null===c.return||c.return===a)return;c=c.return}c.sibling.return=c.return;c=c.sibling}}\nfunction bj(a,b){if(Mf&&"function"===typeof Mf.onCommitFiberUnmount)try{Mf.onCommitFiberUnmount(Lf,b)}catch(f){}switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var c=a=a.next;do{var d=c,e=d.destroy;d=d.tag;if(void 0!==e)if(0!==(d&4))Zi(b,c);else{d=b;try{e()}catch(f){Wi(d,f)}}c=c.next}while(c!==a)}break;case 1:Vi(b);a=b.stateNode;if("function"===typeof a.componentWillUnmount)try{a.props=b.memoizedProps,a.state=b.memoizedState,a.componentWillUnmount()}catch(f){Wi(b,\nf)}break;case 5:Vi(b);break;case 4:cj(a,b)}}function dj(a){a.alternate=null;a.child=null;a.dependencies=null;a.firstEffect=null;a.lastEffect=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.return=null;a.updateQueue=null}function ej(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction fj(a){a:{for(var b=a.return;null!==b;){if(ej(b))break a;b=b.return}throw Error(y(160));}var c=b;b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(y(161));}c.flags&16&&(pb(b,""),c.flags&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||ej(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.flags&2)continue b;if(null===\nc.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.flags&2)){c=c.stateNode;break a}}d?gj(a,c,b):hj(a,c,b)}\nfunction gj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=jf));else if(4!==d&&(a=a.child,null!==a))for(gj(a,b,c),a=a.sibling;null!==a;)gj(a,b,c),a=a.sibling}\nfunction hj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(hj(a,b,c),a=a.sibling;null!==a;)hj(a,b,c),a=a.sibling}\nfunction cj(a,b){for(var c=b,d=!1,e,f;;){if(!d){d=c.return;a:for(;;){if(null===d)throw Error(y(160));e=d.stateNode;switch(d.tag){case 5:f=!1;break a;case 3:e=e.containerInfo;f=!0;break a;case 4:e=e.containerInfo;f=!0;break a}d=d.return}d=!0}if(5===c.tag||6===c.tag){a:for(var g=a,h=c,k=h;;)if(bj(g,k),null!==k.child&&4!==k.tag)k.child.return=k,k=k.child;else{if(k===h)break a;for(;null===k.sibling;){if(null===k.return||k.return===h)break a;k=k.return}k.sibling.return=k.return;k=k.sibling}f?(g=e,h=c.stateNode,\n8===g.nodeType?g.parentNode.removeChild(h):g.removeChild(h)):e.removeChild(c.stateNode)}else if(4===c.tag){if(null!==c.child){e=c.stateNode.containerInfo;f=!0;c.child.return=c;c=c.child;continue}}else if(bj(a,c),null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return;4===c.tag&&(d=!1)}c.sibling.return=c.return;c=c.sibling}}\nfunction ij(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:var c=b.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do 3===(d.tag&3)&&(a=d.destroy,d.destroy=void 0,void 0!==a&&a()),d=d.next;while(d!==c)}return;case 1:return;case 5:c=b.stateNode;if(null!=c){d=b.memoizedProps;var e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[xf]=d;"input"===a&&"radio"===d.type&&null!=d.name&&$a(c,d);wb(a,e);b=wb(a,d);for(e=0;ee&&(e=g);c&=~f}c=e;c=O()-c;c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3E3>c?3E3:4320>\nc?4320:1960*nj(c/1960))-c;if(10 component higher in the tree to provide a loading indicator or placeholder to display.")}5!==V&&(V=2);k=Mi(k,h);p=\ng;do{switch(p.tag){case 3:f=k;p.flags|=4096;b&=-b;p.lanes|=b;var J=Pi(p,f,b);Bg(p,J);break a;case 1:f=k;var K=p.type,Q=p.stateNode;if(0===(p.flags&64)&&("function"===typeof K.getDerivedStateFromError||null!==Q&&"function"===typeof Q.componentDidCatch&&(null===Ti||!Ti.has(Q)))){p.flags|=4096;b&=-b;p.lanes|=b;var L=Si(p,f,b);Bg(p,L);break a}}p=p.return}while(null!==p)}Zj(c)}catch(va){b=va;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}\nfunction Pj(){var a=oj.current;oj.current=Gh;return null===a?Gh:a}function Tj(a,b){var c=X;X|=16;var d=Pj();U===a&&W===b||Qj(a,b);do try{ak();break}catch(e){Sj(a,e)}while(1);qg();X=c;oj.current=d;if(null!==Y)throw Error(y(261));U=null;W=0;return V}function ak(){for(;null!==Y;)bk(Y)}function Rj(){for(;null!==Y&&!Qf();)bk(Y)}function bk(a){var b=ck(a.alternate,a,qj);a.memoizedProps=a.pendingProps;null===b?Zj(a):Y=b;pj.current=null}\nfunction Zj(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&2048)){c=Gi(c,b,qj);if(null!==c){Y=c;return}c=b;if(24!==c.tag&&23!==c.tag||null===c.memoizedState||0!==(qj&1073741824)||0===(c.mode&4)){for(var d=0,e=c.child;null!==e;)d|=e.lanes|e.childLanes,e=e.sibling;c.childLanes=d}null!==a&&0===(a.flags&2048)&&(null===a.firstEffect&&(a.firstEffect=b.firstEffect),null!==b.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=b.firstEffect),a.lastEffect=b.lastEffect),1g&&(h=g,g=J,J=h),h=Le(t,J),f=Le(t,g),h&&f&&(1!==v.rangeCount||v.anchorNode!==h.node||v.anchorOffset!==h.offset||v.focusNode!==f.node||v.focusOffset!==f.offset)&&(q=q.createRange(),q.setStart(h.node,h.offset),v.removeAllRanges(),J>g?(v.addRange(q),v.extend(f.node,f.offset)):(q.setEnd(f.node,f.offset),v.addRange(q))))));q=[];for(v=t;v=v.parentNode;)1===v.nodeType&&q.push({element:v,left:v.scrollLeft,top:v.scrollTop});"function"===typeof t.focus&&t.focus();for(t=\n0;tO()-jj?Qj(a,0):uj|=c);Mj(a,b)}function lj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=a.mode,0===(b&2)?b=1:0===(b&4)?b=99===eg()?1:2:(0===Gj&&(Gj=tj),b=Yc(62914560&~Gj),0===b&&(b=4194304)));c=Hg();a=Kj(a,b);null!==a&&($c(a,b,c),Mj(a,c))}var ck;\nck=function(a,b,c){var d=b.lanes;if(null!==a)if(a.memoizedProps!==b.pendingProps||N.current)ug=!0;else if(0!==(c&d))ug=0!==(a.flags&16384)?!0:!1;else{ug=!1;switch(b.tag){case 3:ri(b);sh();break;case 5:gh(b);break;case 1:Ff(b.type)&&Jf(b);break;case 4:eh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;var e=b.type._context;I(mg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){if(0!==(c&b.child.childLanes))return ti(a,b,c);I(P,P.current&1);b=hi(a,b,c);return null!==\nb?b.sibling:null}I(P,P.current&1);break;case 19:d=0!==(c&b.childLanes);if(0!==(a.flags&64)){if(d)return Ai(a,b,c);b.flags|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);I(P,P.current);if(d)break;else return null;case 23:case 24:return b.lanes=0,mi(a,b,c)}return hi(a,b,c)}else ug=!1;b.lanes=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;e=Ef(b,M.current);tg(b,c);e=Ch(null,b,d,a,e,c);b.flags|=1;if("object"===\ntypeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(Ff(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;xg(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Gg(b,d,g,a);e.updater=Kg;b.stateNode=e;e._reactInternals=b;Og(b,d,a,c);b=qi(null,b,d,!0,f,c)}else b.tag=0,fi(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;a:{null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);\na=b.pendingProps;f=e._init;e=f(e._payload);b.type=e;f=b.tag=hk(e);a=lg(e,a);switch(f){case 0:b=li(null,b,e,a,c);break a;case 1:b=pi(null,b,e,a,c);break a;case 11:b=gi(null,b,e,a,c);break a;case 14:b=ii(null,b,e,lg(e.type,a),d,c);break a}throw Error(y(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),li(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),pi(a,b,d,e,c);case 3:ri(b);d=b.updateQueue;if(null===a||null===d)throw Error(y(282));\nd=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;yg(a,b);Cg(b,d,null,c);d=b.memoizedState.element;if(d===e)sh(),b=hi(a,b,c);else{e=b.stateNode;if(f=e.hydrate)kh=rf(b.stateNode.containerInfo.firstChild),jh=b,f=lh=!0;if(f){a=e.mutableSourceEagerHydrationData;if(null!=a)for(e=0;e=\nE};k=function(){};exports.unstable_forceFrameRate=function(a){0>a||125>>1,e=a[d];if(void 0!==e&&0I(n,c))void 0!==r&&0>I(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>I(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function I(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var L=[],M=[],N=1,O=null,P=3,Q=!1,R=!1,S=!1;\nfunction T(a){for(var b=J(M);null!==b;){if(null===b.callback)K(M);else if(b.startTime<=a)K(M),b.sortIndex=b.expirationTime,H(L,b);else break;b=J(M)}}function U(a){S=!1;T(a);if(!R)if(null!==J(L))R=!0,f(V);else{var b=J(M);null!==b&&g(U,b.startTime-a)}}\nfunction V(a,b){R=!1;S&&(S=!1,h());Q=!0;var c=P;try{T(b);for(O=J(L);null!==O&&(!(O.expirationTime>b)||a&&!exports.unstable_shouldYield());){var d=O.callback;if("function"===typeof d){O.callback=null;P=O.priorityLevel;var e=d(O.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?O.callback=e:O===J(L)&&K(L);T(b)}else K(L);O=J(L)}if(null!==O)var m=!0;else{var n=J(M);null!==n&&g(U,n.startTime-b);m=!1}return m}finally{O=null,P=c,Q=!1}}var W=k;exports.unstable_IdlePriority=5;\nexports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){R||Q||(R=!0,f(V))};exports.unstable_getCurrentPriorityLevel=function(){return P};exports.unstable_getFirstCallbackNode=function(){return J(L)};\nexports.unstable_next=function(a){switch(P){case 1:case 2:case 3:var b=3;break;default:b=P}var c=P;P=b;try{return a()}finally{P=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=W;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=P;P=a;try{return b()}finally{P=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0d?(a.sortIndex=c,H(M,a),null===J(L)&&a===J(M)&&(S?h():S=!0,g(U,c-d))):(a.sortIndex=e,H(L,a),R||Q||(R=!0,f(V)));return a};\nexports.unstable_wrapCallback=function(a){var b=P;return function(){var c=P;P=b;try{return a.apply(this,arguments)}finally{P=c}}};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcz9mYjA3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYSxZQUFZLHVFQUF1RSxrQkFBa0Isb0JBQW9CLFlBQVksZ0JBQWdCLEtBQUsscUJBQXFCLG9CQUFvQixZQUFZO0FBQzVOLG9FQUFvRSwrQkFBK0IsZ0JBQWdCLDZCQUE2QixRQUFRLE9BQU8sU0FBUywyQkFBMkIsY0FBYyxrREFBa0QsZ0JBQWdCLG1CQUFtQixhQUFhLGlCQUFpQiw0QkFBNEIsWUFBWSxVQUFVLEVBQUUsK0JBQStCLGNBQWMsS0FBSyw4Q0FBOEMsaUNBQWlDO0FBQ3pmLDRCQUE0QixzTkFBc04sMExBQTBMLDZCQUE2Qiw0QkFBNEIsWUFBWTtBQUNqZixHQUFHLGVBQWUsK0JBQStCLGFBQWEsdUtBQXVLLG1DQUFtQyw2QkFBNkIsYUFBYSw2QkFBNkIsTUFBTSxJQUFJLDBDQUEwQyxTQUFTLDhCQUE4QixXQUFXLGNBQWMsSUFBSSwrQkFBK0IsZ0JBQWdCO0FBQ3RmLGFBQWEsMEJBQTBCLEtBQUssYUFBYSxLQUFLLE1BQU0sZ0JBQWdCLGVBQWUsVUFBVSxRQUFRLEVBQUUscUJBQXFCLDBDQUEwQyxjQUFjLGNBQWMsT0FBTztBQUN6TixjQUFjLFdBQVcsZUFBZSxjQUFjLFVBQVUsT0FBTyx5QkFBeUIsSUFBSSxFQUFFLG9DQUFvQyxxRkFBcUYsK0NBQStDLGNBQWMsU0FBUyxZQUFZLGdCQUFnQiw4QkFBOEIseUJBQXlCO0FBQ3hYLGNBQWMsZUFBZSxTQUFTLEVBQUUsMEJBQTBCLGdFQUFnRSxXQUFXLFFBQVEsY0FBYyxLQUFLLEtBQUssK0JBQStCLEtBQUssV0FBVztBQUM1TixnQkFBZ0IsS0FBSyxjQUFjLEtBQUssUUFBUSxJQUFJLEtBQUssV0FBVyxzRUFBc0UsRUFBRSxpQkFBaUIsMEJBQTBCLGdCQUFnQixrQkFBa0IsNkJBQTZCLHlCQUF5QixrREFBa0QsS0FBSyxVQUFVLE9BQU8scUJBQXFCLEtBQUssV0FBVyw2QkFBNkIsS0FBSyxTQUFTLFFBQVEsaUJBQWlCLFFBQVEsNkJBQTZCO0FBQ3JlLGtDQUFrQyxHQUFHLDRCQUE0QixHQUFHLCtCQUErQixHQUFHLDBCQUEwQixNQUFNLHFDQUFxQyxHQUFHLCtCQUErQixhQUFhLGlCQUFpQixrQ0FBa0MsWUFBWSxtQkFBbUIsd0NBQXdDLFlBQVksVUFBVSxxQ0FBcUMsWUFBWTtBQUMzWixxQkFBcUIsYUFBYSxVQUFVLDZCQUE2QixNQUFNLFlBQVksUUFBUSxJQUFJLElBQUksV0FBVyxRQUFRLE1BQU0sK0JBQStCLGNBQWMsNkJBQTZCLEdBQUcsZ0NBQWdDLGVBQWUsVUFBVSx5Q0FBeUMsWUFBWSxRQUFRLElBQUksSUFBSSxXQUFXLFFBQVE7QUFDbFcsaUNBQWlDLGlCQUFpQiw2QkFBNkIsK0VBQStFLFVBQVUsZ0JBQWdCLE1BQU0sYUFBYSxNQUFNLG9CQUFvQixNQUFNLGFBQWEsTUFBTSxjQUFjLE1BQU0sR0FBRyw2RUFBNkUsaUhBQWlIO0FBQ25kLDZCQUE2QixhQUFhLFFBQVEsa0JBQWtCLFFBQVEsSUFBSSxJQUFJLCtCQUErQixRQUFRIiwiZmlsZSI6IjUzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjIwLjJcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGYsZyxoLGs7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGw9cGVyZm9ybWFuY2U7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gbC5ub3coKX19ZWxzZXt2YXIgcD1EYXRlLHE9cC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBwLm5vdygpLXF9fVxuaWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIHQ9bnVsbCx1PW51bGwsdz1mdW5jdGlvbigpe2lmKG51bGwhPT10KXRyeXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO3QoITAsYSk7dD1udWxsfWNhdGNoKGIpe3Rocm93IHNldFRpbWVvdXQodywwKSxiO319O2Y9ZnVuY3Rpb24oYSl7bnVsbCE9PXQ/c2V0VGltZW91dChmLDAsYSk6KHQ9YSxzZXRUaW1lb3V0KHcsMCkpfTtnPWZ1bmN0aW9uKGEsYil7dT1zZXRUaW1lb3V0KGEsYil9O2g9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodSl9O2V4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07az1leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKCl7fX1lbHNle3ZhciB4PXdpbmRvdy5zZXRUaW1lb3V0LHk9d2luZG93LmNsZWFyVGltZW91dDtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUpe3ZhciB6PVxud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHNcIik7XCJmdW5jdGlvblwiIT09dHlwZW9mIHomJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzXCIpfXZhciBBPSExLEI9bnVsbCxDPS0xLEQ9NSxFPTA7ZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpPj1cbkV9O2s9ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCIpOkQ9MDxhP01hdGguZmxvb3IoMUUzL2EpOjV9O3ZhciBGPW5ldyBNZXNzYWdlQ2hhbm5lbCxHPUYucG9ydDI7Ri5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtpZihudWxsIT09Qil7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtFPWErRDt0cnl7QighMCxhKT9HLnBvc3RNZXNzYWdlKG51bGwpOihBPSExLEI9bnVsbCl9Y2F0Y2goYil7dGhyb3cgRy5wb3N0TWVzc2FnZShudWxsKSxiO319ZWxzZSBBPSExfTtmPWZ1bmN0aW9uKGEpe0I9YTtBfHwoQT0hMCxHLnBvc3RNZXNzYWdlKG51bGwpKX07Zz1mdW5jdGlvbihhLGIpe0M9XG54KGZ1bmN0aW9uKCl7YShleHBvcnRzLnVuc3RhYmxlX25vdygpKX0sYil9O2g9ZnVuY3Rpb24oKXt5KEMpO0M9LTF9fWZ1bmN0aW9uIEgoYSxiKXt2YXIgYz1hLmxlbmd0aDthLnB1c2goYik7YTpmb3IoOzspe3ZhciBkPWMtMT4+PjEsZT1hW2RdO2lmKHZvaWQgMCE9PWUmJjA8SShlLGIpKWFbZF09YixhW2NdPWUsYz1kO2Vsc2UgYnJlYWsgYX19ZnVuY3Rpb24gSihhKXthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bnVsbDphfVxuZnVuY3Rpb24gSyhhKXt2YXIgYj1hWzBdO2lmKHZvaWQgMCE9PWIpe3ZhciBjPWEucG9wKCk7aWYoYyE9PWIpe2FbMF09YzthOmZvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlOyl7dmFyIG09MiooZCsxKS0xLG49YVttXSx2PW0rMSxyPWFbdl07aWYodm9pZCAwIT09biYmMD5JKG4sYykpdm9pZCAwIT09ciYmMD5JKHIsbik/KGFbZF09cixhW3ZdPWMsZD12KTooYVtkXT1uLGFbbV09YyxkPW0pO2Vsc2UgaWYodm9pZCAwIT09ciYmMD5JKHIsYykpYVtkXT1yLGFbdl09YyxkPXY7ZWxzZSBicmVhayBhfX1yZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBJKGEsYil7dmFyIGM9YS5zb3J0SW5kZXgtYi5zb3J0SW5kZXg7cmV0dXJuIDAhPT1jP2M6YS5pZC1iLmlkfXZhciBMPVtdLE09W10sTj0xLE89bnVsbCxQPTMsUT0hMSxSPSExLFM9ITE7XG5mdW5jdGlvbiBUKGEpe2Zvcih2YXIgYj1KKE0pO251bGwhPT1iOyl7aWYobnVsbD09PWIuY2FsbGJhY2spSyhNKTtlbHNlIGlmKGIuc3RhcnRUaW1lPD1hKUsoTSksYi5zb3J0SW5kZXg9Yi5leHBpcmF0aW9uVGltZSxIKEwsYik7ZWxzZSBicmVhaztiPUooTSl9fWZ1bmN0aW9uIFUoYSl7Uz0hMTtUKGEpO2lmKCFSKWlmKG51bGwhPT1KKEwpKVI9ITAsZihWKTtlbHNle3ZhciBiPUooTSk7bnVsbCE9PWImJmcoVSxiLnN0YXJ0VGltZS1hKX19XG5mdW5jdGlvbiBWKGEsYil7Uj0hMTtTJiYoUz0hMSxoKCkpO1E9ITA7dmFyIGM9UDt0cnl7VChiKTtmb3IoTz1KKEwpO251bGwhPT1PJiYoIShPLmV4cGlyYXRpb25UaW1lPmIpfHxhJiYhZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCgpKTspe3ZhciBkPU8uY2FsbGJhY2s7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe08uY2FsbGJhY2s9bnVsbDtQPU8ucHJpb3JpdHlMZXZlbDt2YXIgZT1kKE8uZXhwaXJhdGlvblRpbWU8PWIpO2I9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT9PLmNhbGxiYWNrPWU6Tz09PUooTCkmJksoTCk7VChiKX1lbHNlIEsoTCk7Tz1KKEwpfWlmKG51bGwhPT1PKXZhciBtPSEwO2Vsc2V7dmFyIG49SihNKTtudWxsIT09biYmZyhVLG4uc3RhcnRUaW1lLWIpO209ITF9cmV0dXJuIG19ZmluYWxseXtPPW51bGwsUD1jLFE9ITF9fXZhciBXPWs7ZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MTtleHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQ7ZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO2V4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nPW51bGw7ZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yO2V4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7YS5jYWxsYmFjaz1udWxsfTtleHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7Unx8UXx8KFI9ITAsZihWKSl9O2V4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gUH07ZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBKKEwpfTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dD1mdW5jdGlvbihhKXtzd2l0Y2goUCl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIGI9MzticmVhaztkZWZhdWx0OmI9UH12YXIgYz1QO1A9Yjt0cnl7cmV0dXJuIGEoKX1maW5hbGx5e1A9Y319O2V4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PVc7ZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OmE9M312YXIgYz1QO1A9YTt0cnl7cmV0dXJuIGIoKX1maW5hbGx5e1A9Y319O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWM/KGM9Yy5kZWxheSxjPVwibnVtYmVyXCI9PT10eXBlb2YgYyYmMDxjP2QrYzpkKTpjPWQ7c3dpdGNoKGEpe2Nhc2UgMTp2YXIgZT0tMTticmVhaztjYXNlIDI6ZT0yNTA7YnJlYWs7Y2FzZSA1OmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6ZT0xRTQ7YnJlYWs7ZGVmYXVsdDplPTVFM31lPWMrZTthPXtpZDpOKyssY2FsbGJhY2s6Yixwcmlvcml0eUxldmVsOmEsc3RhcnRUaW1lOmMsZXhwaXJhdGlvblRpbWU6ZSxzb3J0SW5kZXg6LTF9O2M+ZD8oYS5zb3J0SW5kZXg9YyxIKE0sYSksbnVsbD09PUooTCkmJmE9PT1KKE0pJiYoUz9oKCk6Uz0hMCxnKFUsYy1kKSkpOihhLnNvcnRJbmRleD1lLEgoTCxhKSxSfHxRfHwoUj0hMCxmKFYpKSk7cmV0dXJuIGF9O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9UDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1QO1A9Yjt0cnl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7UD1jfX19O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///53\n')},3840:function(module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(53);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanM/NDAyOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLEVBQUUsd0NBQTZEO0FBQy9ELENBQUMsTUFBTSxFQUVOIiwiZmlsZSI6IjM4NDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3840\n")}}]); \ No newline at end of file diff --git a/803-0bf34ac/index.html b/803-0bf34ac/index.html new file mode 100644 index 00000000..02dac6b2 --- /dev/null +++ b/803-0bf34ac/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/methodology/index.html b/803-0bf34ac/methodology/index.html new file mode 100644 index 00000000..8bbb86e2 --- /dev/null +++ b/803-0bf34ac/methodology/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/803-0bf34ac/page-data/404.html/page-data.json b/803-0bf34ac/page-data/404.html/page-data.json new file mode 100644 index 00000000..eac8ffb1 --- /dev/null +++ b/803-0bf34ac/page-data/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/404.html","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/404/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/404/page-data.json b/803-0bf34ac/page-data/404/page-data.json new file mode 100644 index 00000000..aed59d1b --- /dev/null +++ b/803-0bf34ac/page-data/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/404/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/404/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/app-data.json b/803-0bf34ac/page-data/app-data.json new file mode 100644 index 00000000..3b571148 --- /dev/null +++ b/803-0bf34ac/page-data/app-data.json @@ -0,0 +1 @@ +{"webpackCompilationHash":"dca6ae381790bcb64344"} diff --git a/803-0bf34ac/page-data/cejst/page-data.json b/803-0bf34ac/page-data/cejst/page-data.json new file mode 100644 index 00000000..52829701 --- /dev/null +++ b/803-0bf34ac/page-data/cejst/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-cejst-tsx","path":"/cejst/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/cejst/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/contact/page-data.json b/803-0bf34ac/page-data/contact/page-data.json new file mode 100644 index 00000000..8be3bf9e --- /dev/null +++ b/803-0bf34ac/page-data/contact/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-contact-tsx","path":"/contact/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/contact/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/dev-404-page/page-data.json b/803-0bf34ac/page-data/dev-404-page/page-data.json new file mode 100644 index 00000000..a5e18ede --- /dev/null +++ b/803-0bf34ac/page-data/dev-404-page/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---cache-dev-404-page-js","path":"/dev-404-page/","result":{"data":{"allSiteFunction":{"nodes":[]},"allSitePage":{"nodes":[{"path":"/en/dev-404-page/"},{"path":"/es/dev-404-page/"},{"path":"/en/404.html"},{"path":"/es/404.html"},{"path":"/404.html"},{"path":"/404/"},{"path":"/en/404/"},{"path":"/es/404/"},{"path":"/cejst/"},{"path":"/en/cejst/"},{"path":"/es/cejst/"},{"path":"/contact/"},{"path":"/en/contact/"},{"path":"/es/contact/"},{"path":"/"},{"path":"/en/"},{"path":"/es/"},{"path":"/methodology/"},{"path":"/en/methodology/"},{"path":"/es/methodology/"}]}},"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/dev-404-page/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/404.html/page-data.json b/803-0bf34ac/page-data/en/404.html/page-data.json new file mode 100644 index 00000000..4ef6f93c --- /dev/null +++ b/803-0bf34ac/page-data/en/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/en/404.html","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/404.html","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/404/page-data.json b/803-0bf34ac/page-data/en/404/page-data.json new file mode 100644 index 00000000..7841e5c9 --- /dev/null +++ b/803-0bf34ac/page-data/en/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/en/404/","matchPath":"/en/*","result":{"pageContext":{"matchPath":"/en/*","language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/404/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/cejst/page-data.json b/803-0bf34ac/page-data/en/cejst/page-data.json new file mode 100644 index 00000000..4f3013fa --- /dev/null +++ b/803-0bf34ac/page-data/en/cejst/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-cejst-tsx","path":"/en/cejst/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/cejst/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/contact/page-data.json b/803-0bf34ac/page-data/en/contact/page-data.json new file mode 100644 index 00000000..93dfe4d4 --- /dev/null +++ b/803-0bf34ac/page-data/en/contact/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-contact-tsx","path":"/en/contact/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/contact/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/dev-404-page/page-data.json b/803-0bf34ac/page-data/en/dev-404-page/page-data.json new file mode 100644 index 00000000..3c4f8b10 --- /dev/null +++ b/803-0bf34ac/page-data/en/dev-404-page/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---cache-dev-404-page-js","path":"/en/dev-404-page/","result":{"data":{"allSiteFunction":{"nodes":[]},"allSitePage":{"nodes":[{"path":"/en/dev-404-page/"},{"path":"/es/dev-404-page/"},{"path":"/en/404.html"},{"path":"/es/404.html"},{"path":"/404.html"},{"path":"/404/"},{"path":"/en/404/"},{"path":"/es/404/"},{"path":"/cejst/"},{"path":"/en/cejst/"},{"path":"/es/cejst/"},{"path":"/contact/"},{"path":"/en/contact/"},{"path":"/es/contact/"},{"path":"/"},{"path":"/en/"},{"path":"/es/"},{"path":"/methodology/"},{"path":"/en/methodology/"},{"path":"/es/methodology/"}]}},"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/dev-404-page/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/methodology/page-data.json b/803-0bf34ac/page-data/en/methodology/page-data.json new file mode 100644 index 00000000..555f09d4 --- /dev/null +++ b/803-0bf34ac/page-data/en/methodology/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-methodology-tsx","path":"/en/methodology/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/methodology/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/en/page-data.json b/803-0bf34ac/page-data/en/page-data.json new file mode 100644 index 00000000..0db6393f --- /dev/null +++ b/803-0bf34ac/page-data/en/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-tsx","path":"/en/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":true,"originalPath":"/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/404.html/page-data.json b/803-0bf34ac/page-data/es/404.html/page-data.json new file mode 100644 index 00000000..f41aa897 --- /dev/null +++ b/803-0bf34ac/page-data/es/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/es/404.html","result":{"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/404.html","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/404/page-data.json b/803-0bf34ac/page-data/es/404/page-data.json new file mode 100644 index 00000000..cdf8d5f6 --- /dev/null +++ b/803-0bf34ac/page-data/es/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-tsx","path":"/es/404/","matchPath":"/es/*","result":{"pageContext":{"matchPath":"/es/*","language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/404/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/cejst/page-data.json b/803-0bf34ac/page-data/es/cejst/page-data.json new file mode 100644 index 00000000..1fd1d559 --- /dev/null +++ b/803-0bf34ac/page-data/es/cejst/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-cejst-tsx","path":"/es/cejst/","result":{"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/cejst/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/contact/page-data.json b/803-0bf34ac/page-data/es/contact/page-data.json new file mode 100644 index 00000000..dea97725 --- /dev/null +++ b/803-0bf34ac/page-data/es/contact/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-contact-tsx","path":"/es/contact/","result":{"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/contact/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/dev-404-page/page-data.json b/803-0bf34ac/page-data/es/dev-404-page/page-data.json new file mode 100644 index 00000000..da89457d --- /dev/null +++ b/803-0bf34ac/page-data/es/dev-404-page/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---cache-dev-404-page-js","path":"/es/dev-404-page/","result":{"data":{"allSiteFunction":{"nodes":[]},"allSitePage":{"nodes":[{"path":"/en/dev-404-page/"},{"path":"/es/dev-404-page/"},{"path":"/en/404.html"},{"path":"/es/404.html"},{"path":"/404.html"},{"path":"/404/"},{"path":"/en/404/"},{"path":"/es/404/"},{"path":"/cejst/"},{"path":"/en/cejst/"},{"path":"/es/cejst/"},{"path":"/contact/"},{"path":"/en/contact/"},{"path":"/es/contact/"},{"path":"/"},{"path":"/en/"},{"path":"/es/"},{"path":"/methodology/"},{"path":"/en/methodology/"},{"path":"/es/methodology/"}]}},"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/dev-404-page/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/methodology/page-data.json b/803-0bf34ac/page-data/es/methodology/page-data.json new file mode 100644 index 00000000..321cd36a --- /dev/null +++ b/803-0bf34ac/page-data/es/methodology/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-methodology-tsx","path":"/es/methodology/","result":{"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/methodology/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/es/page-data.json b/803-0bf34ac/page-data/es/page-data.json new file mode 100644 index 00000000..6da3f4c2 --- /dev/null +++ b/803-0bf34ac/page-data/es/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-tsx","path":"/es/","result":{"pageContext":{"language":"es","intl":{"language":"es","languages":["en","es"],"messages":{"areasOfInterest.climate":"Cambio climático","areasOfInterest.energy":"Energía limpia y eficiencia energética","areasOfInterest.housing":"Vivienda asequible y sostenible","areasOfInterest.pollution":"Remediación de la contaminación heredada","areasOfInterest.training":"Capacitación y desarrollo de la fuerza laboral","areasOfInterest.transit":"Transporte limpio","areasOfInterest.water":"Infraestructura de agua limpia","header.about":"Sobre nosotras","header.contact":"Contacto","header.explore":"Explore el trabajo","header.methodology":"Metodología","header.timeline":"Cronología","header.title":"Justice40","index.aboutContent.header":"Acerca de Justice40","index.aboutContent.p1":"En un esfuerzo por abordar las injusticias ambientales históricas, el presidente Biden creó la Iniciativa Justice40 el 27 de enero de 2021. La Iniciativa Justice40 dirige el 40% de los beneficios de las inversiones federales en siete áreas clave a comunidades sobrecargadas y desatendidas.","index.aboutContent.p2":"Las agencias federales darán prioridad a los beneficios utilizando una nueva herramienta de evaluación de la justicia económica y climática. Esta herramienta de selección será un mapa que visualiza datos para comparar los impactos acumulativos de factores ambientales, climáticos y económicos. Está siendo desarrollado por el Consejo de Calidad Ambiental (Council on Environmental Quality - CEQ) con la orientación de líderes de justicia ambiental y comunidades afectadas por injusticias ambientales. La primera versión de la herramienta de detección se lanzará en julio de 2021. Sin embargo, la herramienta de detección y los datos que se utilizan se actualizarán continuamente para reflejar mejor las experiencias vividas por los miembros de la comunidad.","index.aboutContent.p3":"Lea más sobre la Iniciativa Justice40 en {presidentLink} del presidente Biden.","index.presidentalLinkLabel":"Orden ejecutiva sobre la lucha contra la crisis climática en el país y en el extranjero.","index.presidentalLinkUri":"https://www.whitehouse.gov/briefing-room/presidential-actions/2021/01/27/executive-order-on-tackling-the-climate-crisis-at-home-and-abroad/","index.section2.header":"Áreas de enfoque","index.section3.header":"Un enfoque transparente, centrado en la comunidad","index.section3.inclusive":"{inlineHeader} Muchas áreas que carecen de inversiones también carecen de datos ambientales y se pasarían por alto utilizando los datos ambientales disponibles. CEQ se está acercando activamente a grupos que históricamente han sido excluidos de la toma de decisiones, como grupos en áreas rurales y tribales, para comprender sus necesidades y solicitar su opinión.","index.section3.inclusiveLabel":"Inclusivo:","index.section3.intro":"Las iniciativas exitosas están guiadas por aportes directos de las comunidades a las que sirven. CEQ se compromete con la transparencia, la inclusión y la iteración en la construcción de esta herramienta de evaluación.","index.section3.iterative":"{inlineHeader} La lista de priorización de la comunidad inicial proporcionada por la herramienta de evaluación es el comienzo de un proceso de colaboración en el refinamiento de la puntuación, en lugar de una respuesta final. CEQ ha recibido recomendaciones sobre conjuntos de datos de entrevistas comunitarias, el Consejo Asesor de Justicia Ambiental de la Casa Blanca y mediante comentarios públicos, pero establecer una puntuación que sea verdaderamente representativa será un proceso continuo a largo plazo. A medida que las comunidades envíen comentarios y recomendaciones, CEQ continuará mejorando las herramientas que se están construyendo y los procesos para la participación pública y de las partes interesadas.","index.section3.iterativeLabel":"Iterativo:","index.section3.transparent":"{inlineHeader} El código y los datos detrás de la herramienta de detección son de código abierto, lo que significa que está disponible para que el público los revise y contribuya. Esta herramienta se está desarrollando públicamente para que las comunidades, los expertos académicos y cualquier persona interesada puedan participar en el proceso de creación de herramientas.","index.section3.transparentLabel":"Transparencia:"},"routed":true,"originalPath":"/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/index/page-data.json b/803-0bf34ac/page-data/index/page-data.json new file mode 100644 index 00000000..4e94107b --- /dev/null +++ b/803-0bf34ac/page-data/index/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-tsx","path":"/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/page-data/methodology/page-data.json b/803-0bf34ac/page-data/methodology/page-data.json new file mode 100644 index 00000000..eb85552a --- /dev/null +++ b/803-0bf34ac/page-data/methodology/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-methodology-tsx","path":"/methodology/","result":{"pageContext":{"language":"en","intl":{"language":"en","languages":["en","es"],"messages":{"about.page.sub.header.1.text.1.defaultMessage":"On January 27, 2021, President Biden directed the Council on Environmental Quality (CEQ) to create a climate and economic justice screening tool. The purpose of the tool is to help Federal agencies identify disadvantaged communities and provide socioeconomic, environmental, and climate information and data to inform decisions that may affect these communities. The tool identifies disadvantaged communities as communities of focus through publicly available, nationally consistent, high-quality data.","about.page.sub.header.1.text.1.description":"about page sub header text","about.page.sub.header.1.text.2.defaultMessage":"The current version of the tool is in a public beta form and will be updated based on feedback from the public.","about.page.sub.header.1.text.2.description":"about page sub header text","about.page.sub.header.2.text.1.defaultMessage":"The tool will provide important information for the Justice40 Initiative. The goal of the Justice40 Initiative is to provide 40-percent of the overall benefits of certain federal programs in seven key areas to disadvantaged communities. These seven key areas are: climate change, clean energy and energy efficiency, clean transit, affordable and sustainable housing, training and workforce development, the remediation and reduction of legacy pollution, and the development of critical clean water infrastructure.","about.page.sub.header.2.text.1.description":"about page sub header text","about.page.sub.header.2.text.2.defaultMessage":"Read more about the Justice40 Initiative in President Biden’s","about.page.sub.header.2.text.2.description":"about page sub header text","about.page.title.text.defaultMessage":"About","about.page.title.text.description":"about page title text","alert.alertBetaBody.defaultMessage":"This website may be continuously updated","alert.alertBetaBody.description":"Body for an alert inform users that datasets may change","alert.alertBetaTitle.defaultMessage":"Public beta","alert.alertBetaTitle.description":"Title for an alert inform users that datasets may change","alert.alertDataLimitedBody.defaultMessage":"Datasets may be added, updated, or removed.","alert.alertDataLimitedBody.description":"Body for an alert inform users that datasets may change","alert.alertDataLimitedTitle.defaultMessage":"Limited data sources","alert.alertDataLimitedTitle.description":"Title for an alert inform users that datasets may change","areaDetail.categorization.community.of.focus.defaultMessage":"Community of focus","areaDetail.categorization.community.of.focus.description":"the communities the score currently is focused on","areaDetail.categorization.not.community.of.focus.defaultMessage":"Not a community of focus","areaDetail.categorization.not.community.of.focus.description":"the communities the score currently is not focused on","areaDetail.geographicInfo.censusBlockGroup.defaultMessage":"Census block group:","areaDetail.geographicInfo.censusBlockGroup.description":"the census block group id number of the feature selected","areaDetail.geographicInfo.county.defaultMessage":"County:","areaDetail.geographicInfo.county.description":"the county of the feature selected","areaDetail.geographicInfo.population.defaultMessage":"Population:","areaDetail.geographicInfo.population.description":"the population of the feature selected","areaDetail.geographicInfo.state.defaultMessage":"State:","areaDetail.geographicInfo.state.description":"the state of the feature selected","areaDetail.indicator.areaMedianIncome.defaultMessage":"Area Median Income","areaDetail.indicator.areaMedianIncome.description":"calculated as percent of the area median income","areaDetail.indicator.asthma.defaultMessage":"Asthma","areaDetail.indicator.asthma.description":"have asthma or been diagnosed by a doctor to have asthma","areaDetail.indicator.description.area_median_income.defaultMessage":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.area_median_income.description":"Median income of the census block group calculated as a percent of the metropolitan area’s or state's median income","areaDetail.indicator.description.asthma.defaultMessage":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.asthma.description":"People who answer “yes” to both of the questions: “Have you ever been told by a doctor nurse, or other health professional that you have asthma?” and “Do you still have asthma?\"","areaDetail.indicator.description.diabetes.defaultMessage":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.diabetes.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.description.dieselPartMatter.defaultMessage":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.dieselPartMatter.description":"Mixture of particles that is part of diesel exhaust in the air","areaDetail.indicator.description.education.defaultMessage":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.description.energyBurden.defaultMessage":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.description.femaRisk.defaultMessage":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.femaRisk.description":"Expected Annual Loss Score, which is the average economic loss in dollars resulting from natural hazards each year.","areaDetail.indicator.description.heartDisease.defaultMessage":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.heartDisease.description":"People ages 18 and up who report ever having been told by a doctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.description.houseBurden.defaultMessage":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.houseBurden.description":"Households that are low income and spend more than 30% of their income on housing costs","areaDetail.indicator.description.leadPaint.defaultMessage":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.description.lifeExpect.defaultMessage":"Estimated years of life expectancy","areaDetail.indicator.description.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.description.pm25.defaultMessage":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.description.poverty.defaultMessage":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.poverty.description":"Percent of a block group's population in households where the household income is at or below 100% of the federal poverty level","areaDetail.indicator.description.trafficVolume.defaultMessage":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.description.wasteWater.defaultMessage":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.description.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicator.diabetes.defaultMessage":"Diabetes","areaDetail.indicator.diabetes.description":"diabetes from dr or nurse","areaDetail.indicator.dieselPartMatter.defaultMessage":"Diesel particulate matter","areaDetail.indicator.dieselPartMatter.description":"Diesel particulate matter level in air","areaDetail.indicator.education.defaultMessage":"Education, less than high school","areaDetail.indicator.education.description":"Percent of people age 25 or older that didn’t get a high school diploma","areaDetail.indicator.energyBurden.defaultMessage":"Energy burden","areaDetail.indicator.energyBurden.description":"Average annual energy cost ($) divided by household income","areaDetail.indicator.femaRisk.defaultMessage":"FEMA Risk Index","areaDetail.indicator.femaRisk.description":"Risk based on 18 natural hazard types, in addition to a community's social vulnerability and community resilience","areaDetail.indicator.heartDisease.defaultMessage":"Heart disease","areaDetail.indicator.heartDisease.description":"People ages 18 and up who report ever having been told by adoctor, nurse, or other health professionals that they had angina or coronary heart disease","areaDetail.indicator.houseBurden.defaultMessage":"Housing cost burden","areaDetail.indicator.houseBurden.description":"People ages 18 and up who report having been told by a doctor, nurse, or other health professionals that they have diabetes other than diabetes during pregnancy","areaDetail.indicator.leadPaint.defaultMessage":"Lead paint","areaDetail.indicator.leadPaint.description":"Housing units built pre-1960, used as an indicator of potential lead paint exposure in homes","areaDetail.indicator.lifeExpect.defaultMessage":"Life expectancy","areaDetail.indicator.lifeExpect.description":"Estimated years of life expectancy","areaDetail.indicator.pm25.defaultMessage":"PM2.5","areaDetail.indicator.pm25.description":"Fine inhalable particles, with diameters that are generally 2.5 micrometers and smaller","areaDetail.indicator.poverty.defaultMessage":"Poverty","areaDetail.indicator.poverty.description":"Household income is less than or equal to twice the federal \"poverty level\"","areaDetail.indicator.trafficVolume.defaultMessage":"Traffic proximity and volume","areaDetail.indicator.trafficVolume.description":"Count of vehicles (average annual daily traffic) at major roads within 500 meters, divided by distance in meters","areaDetail.indicator.wasteWater.defaultMessage":"Wastewater discharge","areaDetail.indicator.wasteWater.description":"Toxic concentrations at stream segments within 500 meters divided by distance in kilometers","areaDetail.indicators.indicatorColumnHeader.defaultMessage":"Indicator","areaDetail.indicators.indicatorColumnHeader.description":"the population of the feature selected","areaDetail.indicators.percentileColumnHeader.defaultMessage":"Percentile (0-100)","areaDetail.indicators.percentileColumnHeader.description":"the population of the feature selected","community.members.heading.defaultMessage":"Community members","community.members.heading.description":"sub heading of page","community.members.info.defaultMessage":"Explore data about communities of focus in your area, and help provide feedback on the tool.","community.members.info.description":"sub heading of page","community.members.link.defaultMessage":"Explore the tool","community.members.link.description":"link to explore the tool page","contact.page.header.text.defaultMessage":"Contact","contact.page.header.text.description":"contact page header text","contact.page.sub.header.text.defaultMessage":"Email us","contact.page.sub.header.text.description":"contact page sub header text","contact.page.title.text.defaultMessage":"Contact","contact.page.title.text.description":"contact page title text","datasetCard.dataDateRange.defaultMessage":"Data date range:","datasetCard.dataDateRange.description":"label associated with explaining the card","datasetCard.dataResolution.defaultMessage":"Data resolution:","datasetCard.dataResolution.description":"label associated with explaining the card","datasetCard.dataSource.defaultMessage":"Data source:","datasetCard.dataSource.description":"label associated with explaining the card","datasetContainer.additional.heading.defaultMessage":"Additional Indicators","datasetContainer.additional.heading.description":"additional indicators heading","datasetContainer.additional.info.defaultMessage":"These datasets provide additional information about each community.","datasetContainer.additional.info.description":"additional indicator info","datasetContainer.heading.defaultMessage":"Datasets used in methodology","datasetContainer.heading.description":"section heading of which datasets are used in cumulative score","datasetContainer.info.defaultMessage":"The datasets come from a variety of sources and were selected based on relevance, availability, recency, and quality. The datasets seek to identify a range of human health, environmental, climate-related, and other cumulative impacts on communities.","datasetContainer.info.description":"description of the dataset section","download.draft.ptag.1.defaultMessage":"{downloadDraft} of communities of focus and datasets used. Last updated: {dateUpdated}.","download.draft.ptag.1.description":"Download the draft list of communities of focus and datasets used.","download.draft.ptag.2.defaultMessage":"ZIP file will contain one .xlsx, one .csv, and one .pdf ({downloadFileSize}).","download.draft.ptag.2.description":"Download the draft list of communities of focus and datasets used.","downloadPacket.button.text.defaultMessage":"Download package","downloadPacket.button.text.description":"download packet button text","downloadPacket.header.text.defaultMessage":"Draft communities list v{versionNumber} ({downloadFileSize})","downloadPacket.header.text.description":"download packet header text","downloadPacket.info.last.updated.defaultMessage":"Last updated: {downloadLastUpdated}","downloadPacket.info.last.updated.description":"download packet info last updated","downloadPacket.info.text.defaultMessage":"The package includes draft v{versionNumber} of the list of communities of focus (.csv and .xlsx) and information about how to use the list (.pdf).","downloadPacket.info.text.description":"download packet info text","exploreTool.heading.text.defaultMessage":"Explore the tool","exploreTool.heading.text.description":"explore the tool heading text","exploreTool.page.description.defaultMessage":"Zoom into the map to see communities of focus that can help Federal agencies identify disadvantaged communities and to provide socioeconomic, environmental, and climate information and data. Learn more about the methodology and datasets that were used to determine these communities of focus on the {methodologyLink} page.","exploreTool.page.description.description":"page description","exploreTool.title.text.defaultMessage":"Explore the tool","exploreTool.title.text.description":"explore the tool title text","federal.pm.heading.defaultMessage":"Federal program managers","federal.pm.heading.description":"sub heading of page","federal.pm.info.defaultMessage":"Download the screening tool’s draft list of communities of focus. Explore data that may be useful to your program, and provide feedback on the tool.","federal.pm.info.description":"sub heading of page","federal.pm.link.defaultMessage":"Go to data & methodology","federal.pm.link.description":"link text to go to methodology page","footer.arialabel.defaultMessage":"Footer navigation","footer.arialabel.description":"aria-label text for whole footer","footer.contactheader.defaultMessage":"Contact","footer.contactheader.description":"Footer column header","footer.findcontactlink.defaultMessage":"Find a contact at USA.gov","footer.findcontactlink.description":"Footer find contact link text","footer.foialink.defaultMessage":"Freedom of Information Act (FOIA)","footer.foialink.description":"Footer FOIA link text","footer.logo.title.defaultMessage":"Council on Environmental Quality","footer.logo.title.description":"Footer under logo","footer.moreinfoheader.defaultMessage":"More information","footer.moreinfoheader.description":"Footer column header","footer.privacylink.defaultMessage":"Privacy Policy","footer.privacylink.description":"Footer privacy policy link text","footer.questionsheader.defaultMessage":"Have a question about government services?","footer.questionsheader.description":"Footer column header","footer.whitehouselogoalt.defaultMessage":"Whitehouse logo","footer.whitehouselogoalt.description":"Footer Whitehouse logo alt text","getInvolved.title.defaultMessage":"Get involved","getInvolved.title.description":"sub heading of page","header.about.defaultMessage":"About","header.about.description":"Header navigate item to the about page","header.contact.defaultMessage":"Contact","header.contact.description":"Header navigate item to the Contact page","header.explore.defaultMessage":"Explore the tool","header.explore.description":"Header navigate item to the Explore the tool page","header.methodology.defaultMessage":"Data & methodology","header.methodology.description":"Header navigate item to the Methodology page","header.title.line1.defaultMessage":"Climate and Economic Justice","header.title.line1.description":"Title in nav header line 1 of 2","header.title.line2.defaultMessage":"Screening Tool","header.title.line2.description":"Title in nav header line 2 of 2","howToGetStarted.title.defaultMessage":"How to get started","howToGetStarted.title.description":"sub heading of page","index.heading.about.us.defaultMessage":"About us","index.heading.about.us.description":"main heading for about page","index.heading.justice40.defaultMessage":"The Justice40 Initiative","index.heading.justice40.description":"heading for about justice 40","index.heading.screentool.defaultMessage":"The screening tool","index.heading.screentool.description":"heading for about screening tool","index.presidentalLinkLabel.defaultMessage":"Executive Order 14008 on Tackling the Climate Crisis at Home and Abroad.","index.presidentalLinkLabel.description":"Link url to presidential actions executive order. Part of paragraph 2","join.open.source.info.defaultMessage":"The screening tool’s code is open source, which means it is available for the public to view and contribute to. Anyone can view and contribute on GitHub.","join.open.source.info.description":"info on joining open source community","join.open.source.link.defaultMessage":"Check it out on GitHub","join.open.source.link.description":"link to github repository","join.opensource.heading.defaultMessage":"Join the open source community","join.opensource.heading.description":"join the community heading","legend.info.priority.label.defaultMessage":"Draft community of focus","legend.info.priority.label.description":"the label of the prioritized community legend","legend.info.threshold.label.defaultMessage":"A community identified as experiencing disadvantages that merits the focus of certain Federal investments, including through the Justice40 Initiative","legend.info.threshold.label.description":"the label of the threshold community legend","map.territoryFocus.alaska.long.defaultMessage":"Alaska","map.territoryFocus.alaska.long.description":"The full name indicating the bounds of Alaska","map.territoryFocus.alaska.short.defaultMessage":"AK","map.territoryFocus.alaska.short.description":"The abbreviated indicating the bounds of Alaska","map.territoryFocus.focusOn.defaultMessage":"Focus on {territory}","map.territoryFocus.focusOn.description":"Focus on the bounds of a specific territory","map.territoryFocus.hawaii.long.defaultMessage":"Hawaii","map.territoryFocus.hawaii.long.description":"The longer name indicating the bounds of Hawaii","map.territoryFocus.hawaii.short.defaultMessage":"HI","map.territoryFocus.hawaii.short.description":"The abbreviated name indicating the bounds of Hawaii","map.territoryFocus.lower48.long.defaultMessage":"Lower 48","map.territoryFocus.lower48.long.description":"The longer name indicating the bounds of the Lower 48 states","map.territoryFocus.lower48.short.defaultMessage":"48","map.territoryFocus.lower48.short.description":"The abbreviated name indicating the bounds of the Lower 48 states","map.territoryFocus.puerto_rico.long.defaultMessage":"Puerto Rico","map.territoryFocus.puerto_rico.long.description":"The full name indicating the bounds of Puerto Rico","map.territoryFocus.puerto_rico.short.defaultMessage":"PR","map.territoryFocus.puerto_rico.short.description":"The abbreviated name indicating the bounds of Puerto Rico","map.zoom.warning.defaultMessage":"Zoom in to the state or regional level to see prioritized communities on the map.","map.zoom.warning.description":"zoom warning on map","mapIntro.censusBlockGroupDefinition.defaultMessage":"A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.","mapIntro.censusBlockGroupDefinition.description":"cites the definition and helpful information about census groups","mapIntro.didYouKnow.defaultMessage":"Did you know?","mapIntro.didYouKnow.description":"text prompting a cite paragraph","mapIntro.mapIntroHeader.defaultMessage":"Zoom and select a census block group to view data","mapIntro.mapIntroHeader.description":"introductory text of ways to use the map","methodology.page.header.text.defaultMessage":"Methodology","methodology.page.header.text.description":"methodology page header text","methodology.page.paragraph.first.defaultMessage":"The methodology for identifying communities of focus is currently in a draft, pre-decisional form that may change over time as more datasets become available.","methodology.page.paragraph.first.description":"methodology page paragraph 1","methodology.page.title.text.defaultMessage":"Data and Methodology","methodology.page.title.text.description":"methodology page title text","methodology.step.1.a.heading.defaultMessage":"Percent of Area Median Income","methodology.step.1.a.heading.description":"step 1 a heading","methodology.step.1.a.info.1.defaultMessage":"If a census block group is in a metropolitan area, this value is the median income of the census block group calculated as a percent of the metropolitan area’s median income.","methodology.step.1.a.info.1.description":"step 1 a info 1","methodology.step.1.a.info.2.defaultMessage":"If a census block group is not in a metropolitan area, this value is the median income of the census block group calculated as a percent of the state’s median income.","methodology.step.1.a.info.2.description":"step 1 a info 2","methodology.step.1.b.heading.defaultMessage":"Percent of households below or at 100% of the federal poverty line","methodology.step.1.b.heading.description":"step 1 b heading","methodology.step.1.c.heading.defaultMessage":"The high school degree achievement rate for adults 25 years and older","methodology.step.1.c.heading.description":"step 1 a heading","methodology.step.1.c.info.defaultMessage":"The percent of individuals who are 25 or older who have received a high school degree.","methodology.step.1.c.info.description":"step 1 c info","methodology.step.1.heading.defaultMessage":"Gather datasets","methodology.step.1.heading.description":"first step heading","methodology.step.1.info.defaultMessage":"The methodology includes the following inputs that are equally weighted.","methodology.step.1.info.description":"first step info","methodology.step.2.heading.defaultMessage":"Determine communites of focus","methodology.step.2.heading.description":"second step heading","methodology.step.2.info.defaultMessage":"Under the existing formula, a census block group will be considered a community of focus if:","methodology.step.2.info.description":"second step info","methodology.steps.2.b.info.defaultMessage":"This is the percent of households in a state with a household income below or at 100% of the {federalPovertyLine}. This federal poverty line is calculated based on the composition of each household (e.g., based on household size), but it does not vary geographically.","methodology.steps.2.b.info.description":"Download the draft list of communities of focus and datasets used.","methodology.steps.2.formula.defaultMessage":"{medianIncome} {or} {livingAtPovery} {and} {education}","methodology.steps.2.formula.description":"Formala used to calculate communities of focus","methodology.steps.description.1.defaultMessage":"The methodology for identifying communities of focus is calculated at the census block group level. Census block geographical boundaries are determined by the U.S. Census Bureau once every ten years. This tool utilizes the census block boundaries from 2010.","methodology.steps.description.1.description":"first description text ","methodology.steps.description.2.defaultMessage":"The following describes the process for identifying communities of focus.","methodology.steps.description.2.description":"second description text","methodology.steps.heading.defaultMessage":"Methodology","methodology.steps.heading.description":"heading of methodology section","pageNotFound.Guidance.text.defaultMessage":"Try creating a page in","pageNotFound.Guidance.text.description":"page not found guidance text","pageNotFound.apology.description.text.defaultMessage":"we couldn’t find what you were looking for.","pageNotFound.apology.description.text.description":"page not found apology description text","pageNotFound.apology.text.defaultMessage":"Sorry","pageNotFound.apology.text.description":"page not found apology text","pageNotFound.heading.text.defaultMessage":"Page not found","pageNotFound.heading.text.description":"page not found heading text","pageNotFound.link.to.go.home.text.defaultMessage":"Go home","pageNotFound.link.to.go.home.text.description":"page not found link to go home text","pageNotFound.title.text.defaultMessage":"Page not found","pageNotFound.title.text.description":"page not found title text","send.feedback.heading.defaultMessage":"Send feedback","send.feedback.heading.description":"sending feedback heading","send.feedback.info.defaultMessage":"Have ideas about how this tool can be improved to better reflect the on-the-ground experiences of your community?","send.feedback.info.description":"sending feedback information","youCanHelpInfoText.heading.defaultMessage":"How you can help improve the tool","youCanHelpInfoText.heading.description":"how one can help us improve the tool","youCanHelpInfoText.list.item.1.defaultMessage":"If you have helpful information, we would love to {rxEmailFromYou}.","youCanHelpInfoText.list.item.1.description":"how one can help us via email","youCanHelpInfoText.list.item.2.defaultMessage":"View our {dataMeth} page and send us feedback.","youCanHelpInfoText.list.item.2.description":"give us feedback on our data and methodology","youCanHelpInfoText.list.item.3.defaultMessage":"Find your community of interest and {shareFeedback}.","youCanHelpInfoText.list.item.3.description":"share your feedback"},"routed":false,"originalPath":"/methodology/","redirect":true,"defaultLanguage":"en"}}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/803-0bf34ac/polyfill-6ed6bf3e44ff10cfb669.js b/803-0bf34ac/polyfill-6ed6bf3e44ff10cfb669.js new file mode 100644 index 00000000..cfb36b67 --- /dev/null +++ b/803-0bf34ac/polyfill-6ed6bf3e44ff10cfb669.js @@ -0,0 +1 @@ +(self.webpackChunkjustice40_tool=self.webpackChunkjustice40_tool||[]).push([[920],{5674:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){"use strict";eval("\nvar $ = __webpack_require__(2109);\nvar $trimStart = __webpack_require__(3111).start;\nvar forcedStringTrimMethod = __webpack_require__(6091);\n\nvar FORCED = forcedStringTrimMethod('trimStart');\n\nvar trimStart = FORCED ? function trimStart() {\n return $trimStart(this);\n// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe\n} : ''.trimStart;\n\n// `String.prototype.{ trimStart, trimLeft }` methods\n// https://tc39.es/ecma262/#sec-string.prototype.trimstart\n// https://tc39.es/ecma262/#String.prototype.trimleft\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimStart: trimStart,\n trimLeft: trimStart\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tc3RhcnQuanM/ZWVlNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLFFBQVEsbUJBQU8sQ0FBQyxJQUFxQjtBQUNyQyxpQkFBaUIsK0JBQXlDO0FBQzFELDZCQUE2QixtQkFBTyxDQUFDLElBQWlDOztBQUV0RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBLEdBQUcsZ0RBQWdEO0FBQ25EO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6IjU2NzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkdHJpbVN0YXJ0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykuc3RhcnQ7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQnKTtcblxudmFyIEZPUkNFRCA9IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW1TdGFydCcpO1xuXG52YXIgdHJpbVN0YXJ0ID0gRk9SQ0VEID8gZnVuY3Rpb24gdHJpbVN0YXJ0KCkge1xuICByZXR1cm4gJHRyaW1TdGFydCh0aGlzKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zdHJpbmctcHJvdG90eXBlLXRyaW1zdGFydC10cmltZW5kIC0tIHNhZmVcbn0gOiAnJy50cmltU3RhcnQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVN0YXJ0LCB0cmltTGVmdCB9YCBtZXRob2RzXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jU3RyaW5nLnByb3RvdHlwZS50cmltbGVmdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHRyaW1TdGFydDogdHJpbVN0YXJ0LFxuICB0cmltTGVmdDogdHJpbVN0YXJ0XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5674\n")},2947:function(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var gatsby_legacy_polyfills__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7751);\n/* harmony import */ var gatsby_legacy_polyfills__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(gatsby_legacy_polyfills__WEBPACK_IMPORTED_MODULE_0__);\nif(false){}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qdXN0aWNlNDAtdG9vbC8uLy5jYWNoZS9wb2x5ZmlsbC1lbnRyeS5qcz81OTViIl0sIm5hbWVzIjpbInByb2Nlc3MiXSwibWFwcGluZ3MiOiI7O0FBRUEsR0FBSUEsS0FBSixDQUE0QyIsImZpbGUiOiIyOTQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwiZ2F0c2J5LWxlZ2FjeS1wb2x5ZmlsbHNcIlxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IGBkZXZlbG9wbWVudGApIHtcbiAgcmVxdWlyZShgZXZlbnQtc291cmNlLXBvbHlmaWxsYClcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2947\n")},7751:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval('__webpack_require__(5674);__webpack_require__(8702);__webpack_require__(7727);!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof __webpack_require__.g?__webpack_require__.g:"undefined"!=typeof self?self:{};function e(t,e,r){return t(r={path:e,exports:{},require:function require(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs");}();}},r.exports),r.exports;}var r=function r(t){return t&&t.Math==Math&&t;},n=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t&&t)||function(){return this;}()||Function("return this")(),o=function o(t){try{return!!t();}catch(t){return!0;}},i=!o(function(){return 7!=Object.defineProperty({},1,{get:function get(){return 7;}})[1];}),a={}.propertyIsEnumerable,u=Object.getOwnPropertyDescriptor,c={f:u&&!a.call({1:2},1)?function(t){var e=u(this,t);return!!e&&e.enumerable;}:a},s=function s(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e};},f={}.toString,l=function l(t){return f.call(t).slice(8,-1);},h="".split,p=o(function(){return!Object("z").propertyIsEnumerable(0);})?function(t){return"String"==l(t)?h.call(t,""):Object(t);}:Object,d=function d(t){if(null==t)throw TypeError("Can\'t call method on "+t);return t;},v=function v(t){return p(d(t));},g=function g(t){return"object"==typeof t?null!==t:"function"==typeof t;},y=function y(t,e){if(!g(t))return t;var r,n;if(e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;if("function"==typeof(r=t.valueOf)&&!g(n=r.call(t)))return n;if(!e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;throw TypeError("Can\'t convert object to primitive value");},m={}.hasOwnProperty,b=function b(t,e){return m.call(t,e);},E=n.document,S=g(E)&&g(E.createElement),w=function w(t){return S?E.createElement(t):{};},R=!i&&!o(function(){return 7!=Object.defineProperty(w("div"),"a",{get:function get(){return 7;}}).a;}),T=Object.getOwnPropertyDescriptor,O={f:i?T:function(t,e){if(t=v(t),e=y(e,!0),R)try{return T(t,e);}catch(t){}if(b(t,e))return s(!c.f.call(t,e),t[e]);}},x=function x(t){if(!g(t))throw TypeError(String(t)+" is not an object");return t;},A=Object.defineProperty,I={f:i?A:function(t,e,r){if(x(t),e=y(e,!0),x(r),R)try{return A(t,e,r);}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[e]=r.value),t;}},_=i?function(t,e,r){return I.f(t,e,s(1,r));}:function(t,e,r){return t[e]=r,t;},j=function j(t,e){try{_(n,t,e);}catch(r){n[t]=e;}return e;},P="__core-js_shared__",M=n[P]||j(P,{}),N=Function.toString;"function"!=typeof M.inspectSource&&(M.inspectSource=function(t){return N.call(t);});var U,k,L,D=M.inspectSource,C=n.WeakMap,F="function"==typeof C&&/native code/.test(D(C)),B=!1,W=e(function(t){(t.exports=function(t,e){return M[t]||(M[t]=void 0!==e?e:{});})("versions",[]).push({version:"3.9.0",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});}),z=0,G=Math.random(),K=function K(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++z+G).toString(36);},$=W("keys"),V=function V(t){return $[t]||($[t]=K(t));},q={};if(F){var H=M.state||(M.state=new(0,n.WeakMap)()),X=H.get,Y=H.has,J=H.set;U=function U(t,e){return e.facade=t,J.call(H,t,e),e;},k=function k(t){return X.call(H,t)||{};},L=function L(t){return Y.call(H,t);};}else{var Q=V("state");q[Q]=!0,U=function U(t,e){return e.facade=t,_(t,Q,e),e;},k=function k(t){return b(t,Q)?t[Q]:{};},L=function L(t){return b(t,Q);};}var Z,tt={set:U,get:k,has:L,enforce:function enforce(t){return L(t)?k(t):U(t,{});},getterFor:function getterFor(t){return function(e){var r;if(!g(e)||(r=k(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r;};}},et=e(function(t){var e=tt.get,r=tt.enforce,o=String(String).split("String");(t.exports=function(t,e,i,a){var u,c=!!a&&!!a.unsafe,s=!!a&&!!a.enumerable,f=!!a&&!!a.noTargetGet;"function"==typeof i&&("string"!=typeof e||b(i,"name")||_(i,"name",e),(u=r(i)).source||(u.source=o.join("string"==typeof e?e:""))),t!==n?(c?!f&&t[e]&&(s=!0):delete t[e],s?t[e]=i:_(t,e,i)):s?t[e]=i:j(e,i);})(Function.prototype,"toString",function(){return"function"==typeof this&&e(this).source||D(this);});}),rt=n,nt=function nt(t){return"function"==typeof t?t:void 0;},ot=function ot(t,e){return arguments.length<2?nt(rt[t])||nt(n[t]):rt[t]&&rt[t][e]||n[t]&&n[t][e];},it=Math.ceil,at=Math.floor,ut=function ut(t){return isNaN(t=+t)?0:(t>0?at:it)(t);},ct=Math.min,st=function st(t){return t>0?ct(ut(t),9007199254740991):0;},ft=Math.max,lt=Math.min,ht=function ht(t,e){var r=ut(t);return r<0?ft(r+e,0):lt(r,e);},pt=function pt(t){return function(e,r,n){var o,i=v(e),a=st(i.length),u=ht(n,a);if(t&&r!=r){for(;a>u;){if((o=i[u++])!=o)return!0;}}else for(;a>u;u++){if((t||u in i)&&i[u]===r)return t||u||0;}return!t&&-1;};},dt={includes:pt(!0),indexOf:pt(!1)},vt=dt.indexOf,gt=function gt(t,e){var r,n=v(t),o=0,i=[];for(r in n){!b(q,r)&&b(n,r)&&i.push(r);}for(;e.length>o;){b(n,r=e[o++])&&(~vt(i,r)||i.push(r));}return i;},yt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],mt=yt.concat("length","prototype"),bt={f:Object.getOwnPropertyNames||function(t){return gt(t,mt);}},Et={f:Object.getOwnPropertySymbols},St=ot("Reflect","ownKeys")||function(t){var e=bt.f(x(t)),r=Et.f;return r?e.concat(r(t)):e;},wt=function wt(t,e){for(var r=St(e),n=I.f,o=O.f,i=0;i2?arguments[2]:void 0,u=Nt((void 0===a?n:ht(a,n))-i,n-o),c=1;for(ii;){I.f(t,r=n[i++],e[r]);}return t;},Gt=ot("document","documentElement"),Kt=V("IE_PROTO"),$t=function $t(){},Vt=function Vt(t){return"