@gravityforms/components 6.2.1 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/admin/kanban.css +12 -7
- package/dist/css/admin/kanban.css +20 -7
- package/dist/css/admin/kanban.css.map +1 -1
- package/dist/js/968.9c3fa3386ebd16656f1d.min.js +1 -0
- package/dist/js/admin-components.asset.php +1 -1
- package/dist/js/admin-components.js +43 -43
- package/dist/js/admin-components.min.asset.php +1 -1
- package/dist/js/admin-components.min.js +1 -1
- package/dist/js/components_react_admin_modules_Chart_AreaChart_index_js.9435f12f3e93d5d6b1b5.js +1 -1
- package/dist/js/components_react_admin_modules_Phone_PhoneComponent_js.ca87da6c1ccaf970cf6d.js +1 -1
- package/dist/js/vendors-node_modules_libphonenumber-js_examples_mobile_json_js-node_modules_libphonenumber-js-a6c76f.b0815a9e2e1e5cfbd5db.js +2 -2
- package/dist/js/{vendors-node_modules_recharts_es6_cartesian_CartesianGrid_js-node_modules_recharts_es6_chart_-d9f675.a687c27e5a25f34883d1.js → vendors-node_modules_recharts_es6_cartesian_CartesianGrid_js-node_modules_recharts_es6_chart_-d9f675.846956e222cf4f63a114.js} +243 -243
- package/dist/mappings/admin.js +48 -48
- package/package.json +2 -2
- package/dist/js/968.304094dd9734d27ac2e6.min.js +0 -1
- /package/dist/js/{653.c5a3f4ea5996f84cb182.min.js → 653.61e7ebba89a62bd48408.min.js} +0 -0
- /package/dist/js/{881.9cb8ff2be86b51fa386c.min.js → 881.a04b7065f7b02b55f8bd.min.js} +0 -0
- /package/dist/js/{91.5577381a87a6ada339c1.min.js → 91.d1d4dd50cbd0b889c78b.min.js} +0 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
\***********************************************************************/
|
|
16
16
|
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
17
17
|
|
|
18
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\"AC\":\"40123\",\"AD\":\"312345\",\"AE\":\"501234567\",\"AF\":\"701234567\",\"AG\":\"2684641234\",\"AI\":\"2642351234\",\"AL\":\"672123456\",\"AM\":\"77123456\",\"AO\":\"923123456\",\"AR\":\"91123456789\",\"AS\":\"6847331234\",\"AT\":\"664123456\",\"AU\":\"412345678\",\"AW\":\"5601234\",\"AX\":\"412345678\",\"AZ\":\"401234567\",\"BA\":\"61123456\",\"BB\":\"2462501234\",\"BD\":\"1812345678\",\"BE\":\"470123456\",\"BF\":\"70123456\",\"BG\":\"43012345\",\"BH\":\"36001234\",\"BI\":\"79561234\",\"BJ\":\"0195123456\",\"BL\":\"690001234\",\"BM\":\"4413701234\",\"BN\":\"7123456\",\"BO\":\"71234567\",\"BQ\":\"3181234\",\"BR\":\"11961234567\",\"BS\":\"2423591234\",\"BT\":\"17123456\",\"BW\":\"71123456\",\"BY\":\"294911911\",\"BZ\":\"6221234\",\"CA\":\"5062345678\",\"CC\":\"412345678\",\"CD\":\"991234567\",\"CF\":\"70012345\",\"CG\":\"061234567\",\"CH\":\"781234567\",\"CI\":\"0123456789\",\"CK\":\"71234\",\"CL\":\"221234567\",\"CM\":\"671234567\",\"CN\":\"13123456789\",\"CO\":\"3211234567\",\"CR\":\"83123456\",\"CU\":\"51234567\",\"CV\":\"9911234\",\"CW\":\"95181234\",\"CX\":\"412345678\",\"CY\":\"96123456\",\"CZ\":\"601123456\",\"DE\":\"15123456789\",\"DJ\":\"77831001\",\"DK\":\"34412345\",\"DM\":\"7672251234\",\"DO\":\"8092345678\",\"DZ\":\"551234567\",\"EC\":\"991234567\",\"EE\":\"51234567\",\"EG\":\"1001234567\",\"EH\":\"650123456\",\"ER\":\"7123456\",\"ES\":\"612345678\",\"ET\":\"911234567\",\"FI\":\"412345678\",\"FJ\":\"7012345\",\"FK\":\"51234\",\"FM\":\"3501234\",\"FO\":\"211234\",\"FR\":\"612345678\",\"GA\":\"06031234\",\"GB\":\"7400123456\",\"GD\":\"4734031234\",\"GE\":\"555123456\",\"GF\":\"694201234\",\"GG\":\"7781123456\",\"GH\":\"231234567\",\"GI\":\"57123456\",\"GL\":\"221234\",\"GM\":\"3012345\",\"GN\":\"601123456\",\"GP\":\"690001234\",\"GQ\":\"222123456\",\"GR\":\"6912345678\",\"GT\":\"51234567\",\"GU\":\"6713001234\",\"GW\":\"955012345\",\"GY\":\"6091234\",\"HK\":\"51234567\",\"HN\":\"91234567\",\"HR\":\"921234567\",\"HT\":\"34101234\",\"HU\":\"201234567\",\"ID\":\"812345678\",\"IE\":\"850123456\",\"IL\":\"502345678\",\"IM\":\"7924123456\",\"IN\":\"8123456789\",\"IO\":\"3801234\",\"IQ\":\"7912345678\",\"IR\":\"9123456789\",\"IS\":\"6111234\",\"IT\":\"3123456789\",\"JE\":\"7797712345\",\"JM\":\"8762101234\",\"JO\":\"790123456\",\"JP\":\"9012345678\",\"KE\":\"712123456\",\"KG\":\"700123456\",\"KH\":\"91234567\",\"KI\":\"72001234\",\"KM\":\"3212345\",\"KN\":\"8697652917\",\"KP\":\"1921234567\",\"KR\":\"1020000000\",\"KW\":\"50012345\",\"KY\":\"3453231234\",\"KZ\":\"7710009998\",\"LA\":\"2023123456\",\"LB\":\"71123456\",\"LC\":\"7582845678\",\"LI\":\"660234567\",\"LK\":\"712345678\",\"LR\":\"770123456\",\"LS\":\"50123456\",\"LT\":\"61234567\",\"LU\":\"628123456\",\"LV\":\"21234567\",\"LY\":\"912345678\",\"MA\":\"650123456\",\"MC\":\"612345678\",\"MD\":\"62112345\",\"ME\":\"67622901\",\"MF\":\"690001234\",\"MG\":\"321234567\",\"MH\":\"2351234\",\"MK\":\"72345678\",\"ML\":\"65012345\",\"MM\":\"92123456\",\"MN\":\"88123456\",\"MO\":\"66123456\",\"MP\":\"6702345678\",\"MQ\":\"696201234\",\"MR\":\"22123456\",\"MS\":\"6644923456\",\"MT\":\"96961234\",\"MU\":\"52512345\",\"MV\":\"7712345\",\"MW\":\"991234567\",\"MX\":\"2221234567\",\"MY\":\"123456789\",\"MZ\":\"821234567\",\"NA\":\"811234567\",\"NC\":\"751234\",\"NE\":\"93123456\",\"NF\":\"381234\",\"NG\":\"8021234567\",\"NI\":\"81234567\",\"NL\":\"612345678\",\"NO\":\"40612345\",\"NP\":\"9841234567\",\"NR\":\"5551234\",\"NU\":\"8884012\",\"NZ\":\"211234567\",\"OM\":\"92123456\",\"PA\":\"61234567\",\"PE\":\"912345678\",\"PF\":\"87123456\",\"PG\":\"70123456\",\"PH\":\"9051234567\",\"PK\":\"3012345678\",\"PL\":\"512345678\",\"PM\":\"551234\",\"PR\":\"7872345678\",\"PS\":\"599123456\",\"PT\":\"912345678\",\"PW\":\"6201234\",\"PY\":\"961456789\",\"QA\":\"33123456\",\"RE\":\"692123456\",\"RO\":\"712034567\",\"RS\":\"601234567\",\"RU\":\"9123456789\",\"RW\":\"720123456\",\"SA\":\"512345678\",\"SB\":\"7421234\",\"SC\":\"2510123\",\"SD\":\"911231234\",\"SE\":\"701234567\",\"SG\":\"81234567\",\"SH\":\"51234\",\"SI\":\"31234567\",\"SJ\":\"41234567\",\"SK\":\"912123456\",\"SL\":\"25123456\",\"SM\":\"66661212\",\"SN\":\"701234567\",\"SO\":\"71123456\",\"SR\":\"7412345\",\"SS\":\"977123456\",\"ST\":\"9812345\",\"SV\":\"70123456\",\"SX\":\"7215205678\",\"SY\":\"944567890\",\"SZ\":\"76123456\",\"TA\":\"8999\",\"TC\":\"6492311234\",\"TD\":\"63012345\",\"TG\":\"90112345\",\"TH\":\"812345678\",\"TJ\":\"917123456\",\"TK\":\"7290\",\"TL\":\"77212345\",\"TM\":\"66123456\",\"TN\":\"20123456\",\"TO\":\"7715123\",\"TR\":\"5012345678\",\"TT\":\"8682911234\",\"TV\":\"901234\",\"TW\":\"912345678\",\"TZ\":\"621234567\",\"UA\":\"501234567\",\"UG\":\"712345678\",\"US\":\"2015550123\",\"UY\":\"94231234\",\"UZ\":\"912345678\",\"VA\":\"3123456789\",\"VC\":\"7844301234\",\"VE\":\"4121234567\",\"VG\":\"2843001234\",\"VI\":\"3406421234\",\"VN\":\"912345678\",\"VU\":\"5912345\",\"WF\":\"821234\",\"WS\":\"7212345\",\"XK\":\"43201234\",\"YE\":\"712345678\",\"YT\":\"639012345\",\"ZA\":\"711234567\",\"ZM\":\"955123456\",\"ZW\":\"712345678\"});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2V4YW1wbGVzLm1vYmlsZS5qc29uLmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQSwrREFBZSxDQUFDLCs5SCIsInNvdXJjZXMiOlsid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXhhbXBsZXMubW9iaWxlLmpzb24uanM/YjhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB3ZWIgYnJvd3NlcnMnIFwibmF0aXZlXCJcbi8vIEVTNiBpbXBvcnRpbmcgc3lzdGVtIHdoaWNoIGlzIHVuY2FwYWJsZSBvZiBpbXBvcnRpbmcgXCIqLmpzb25cIiBmaWxlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy9pc3N1ZXMvMjM5XG5leHBvcnQgZGVmYXVsdCB7XCJBQ1wiOlwiNDAxMjNcIixcIkFEXCI6XCIzMTIzNDVcIixcIkFFXCI6XCI1MDEyMzQ1NjdcIixcIkFGXCI6XCI3MDEyMzQ1NjdcIixcIkFHXCI6XCIyNjg0NjQxMjM0XCIsXCJBSVwiOlwiMjY0MjM1MTIzNFwiLFwiQUxcIjpcIjY3MjEyMzQ1NlwiLFwiQU1cIjpcIjc3MTIzNDU2XCIsXCJBT1wiOlwiOTIzMTIzNDU2XCIsXCJBUlwiOlwiOTExMjM0NTY3ODlcIixcIkFTXCI6XCI2ODQ3MzMxMjM0XCIsXCJBVFwiOlwiNjY0MTIzNDU2XCIsXCJBVVwiOlwiNDEyMzQ1Njc4XCIsXCJBV1wiOlwiNTYwMTIzNFwiLFwiQVhcIjpcIjQxMjM0NTY3OFwiLFwiQVpcIjpcIjQwMTIzNDU2N1wiLFwiQkFcIjpcIjYxMTIzNDU2XCIsXCJCQlwiOlwiMjQ2MjUwMTIzNFwiLFwiQkRcIjpcIjE4MTIzNDU2NzhcIixcIkJFXCI6XCI0NzAxMjM0NTZcIixcIkJGXCI6XCI3MDEyMzQ1NlwiLFwiQkdcIjpcIjQzMDEyMzQ1XCIsXCJCSFwiOlwiMzYwMDEyMzRcIixcIkJJXCI6XCI3OTU2MTIzNFwiLFwiQkpcIjpcIjAxOTUxMjM0NTZcIixcIkJMXCI6XCI2OTAwMDEyMzRcIixcIkJNXCI6XCI0NDEzNzAxMjM0XCIsXCJCTlwiOlwiNzEyMzQ1NlwiLFwiQk9cIjpcIjcxMjM0NTY3XCIsXCJCUVwiOlwiMzE4MTIzNFwiLFwiQlJcIjpcIjExOTYxMjM0NTY3XCIsXCJCU1wiOlwiMjQyMzU5MTIzNFwiLFwiQlRcIjpcIjE3MTIzNDU2XCIsXCJCV1wiOlwiNzExMjM0NTZcIixcIkJZXCI6XCIyOTQ5MTE5MTFcIixcIkJaXCI6XCI2MjIxMjM0XCIsXCJDQVwiOlwiNTA2MjM0NTY3OFwiLFwiQ0NcIjpcIjQxMjM0NTY3OFwiLFwiQ0RcIjpcIjk5MTIzNDU2N1wiLFwiQ0ZcIjpcIjcwMDEyMzQ1XCIsXCJDR1wiOlwiMDYxMjM0NTY3XCIsXCJDSFwiOlwiNzgxMjM0NTY3XCIsXCJDSVwiOlwiMDEyMzQ1Njc4OVwiLFwiQ0tcIjpcIjcxMjM0XCIsXCJDTFwiOlwiMjIxMjM0NTY3XCIsXCJDTVwiOlwiNjcxMjM0NTY3XCIsXCJDTlwiOlwiMTMxMjM0NTY3ODlcIixcIkNPXCI6XCIzMjExMjM0NTY3XCIsXCJDUlwiOlwiODMxMjM0NTZcIixcIkNVXCI6XCI1MTIzNDU2N1wiLFwiQ1ZcIjpcIjk5MTEyMzRcIixcIkNXXCI6XCI5NTE4MTIzNFwiLFwiQ1hcIjpcIjQxMjM0NTY3OFwiLFwiQ1lcIjpcIjk2MTIzNDU2XCIsXCJDWlwiOlwiNjAxMTIzNDU2XCIsXCJERVwiOlwiMTUxMjM0NTY3ODlcIixcIkRKXCI6XCI3NzgzMTAwMVwiLFwiREtcIjpcIjM0NDEyMzQ1XCIsXCJETVwiOlwiNzY3MjI1MTIzNFwiLFwiRE9cIjpcIjgwOTIzNDU2NzhcIixcIkRaXCI6XCI1NTEyMzQ1NjdcIixcIkVDXCI6XCI5OTEyMzQ1NjdcIixcIkVFXCI6XCI1MTIzNDU2N1wiLFwiRUdcIjpcIjEwMDEyMzQ1NjdcIixcIkVIXCI6XCI2NTAxMjM0NTZcIixcIkVSXCI6XCI3MTIzNDU2XCIsXCJFU1wiOlwiNjEyMzQ1Njc4XCIsXCJFVFwiOlwiOTExMjM0NTY3XCIsXCJGSVwiOlwiNDEyMzQ1Njc4XCIsXCJGSlwiOlwiNzAxMjM0NVwiLFwiRktcIjpcIjUxMjM0XCIsXCJGTVwiOlwiMzUwMTIzNFwiLFwiRk9cIjpcIjIxMTIzNFwiLFwiRlJcIjpcIjYxMjM0NTY3OFwiLFwiR0FcIjpcIjA2MDMxMjM0XCIsXCJHQlwiOlwiNzQwMDEyMzQ1NlwiLFwiR0RcIjpcIjQ3MzQwMzEyMzRcIixcIkdFXCI6XCI1NTUxMjM0NTZcIixcIkdGXCI6XCI2OTQyMDEyMzRcIixcIkdHXCI6XCI3NzgxMTIzNDU2XCIsXCJHSFwiOlwiMjMxMjM0NTY3XCIsXCJHSVwiOlwiNTcxMjM0NTZcIixcIkdMXCI6XCIyMjEyMzRcIixcIkdNXCI6XCIzMDEyMzQ1XCIsXCJHTlwiOlwiNjAxMTIzNDU2XCIsXCJHUFwiOlwiNjkwMDAxMjM0XCIsXCJHUVwiOlwiMjIyMTIzNDU2XCIsXCJHUlwiOlwiNjkxMjM0NTY3OFwiLFwiR1RcIjpcIjUxMjM0NTY3XCIsXCJHVVwiOlwiNjcxMzAwMTIzNFwiLFwiR1dcIjpcIjk1NTAxMjM0NVwiLFwiR1lcIjpcIjYwOTEyMzRcIixcIkhLXCI6XCI1MTIzNDU2N1wiLFwiSE5cIjpcIjkxMjM0NTY3XCIsXCJIUlwiOlwiOTIxMjM0NTY3XCIsXCJIVFwiOlwiMzQxMDEyMzRcIixcIkhVXCI6XCIyMDEyMzQ1NjdcIixcIklEXCI6XCI4MTIzNDU2NzhcIixcIklFXCI6XCI4NTAxMjM0NTZcIixcIklMXCI6XCI1MDIzNDU2NzhcIixcIklNXCI6XCI3OTI0MTIzNDU2XCIsXCJJTlwiOlwiODEyMzQ1Njc4OVwiLFwiSU9cIjpcIjM4MDEyMzRcIixcIklRXCI6XCI3OTEyMzQ1Njc4XCIsXCJJUlwiOlwiOTEyMzQ1Njc4OVwiLFwiSVNcIjpcIjYxMTEyMzRcIixcIklUXCI6XCIzMTIzNDU2Nzg5XCIsXCJKRVwiOlwiNzc5NzcxMjM0NVwiLFwiSk1cIjpcIjg3NjIxMDEyMzRcIixcIkpPXCI6XCI3OTAxMjM0NTZcIixcIkpQXCI6XCI5MDEyMzQ1Njc4XCIsXCJLRVwiOlwiNzEyMTIzNDU2XCIsXCJLR1wiOlwiNzAwMTIzNDU2XCIsXCJLSFwiOlwiOTEyMzQ1NjdcIixcIktJXCI6XCI3MjAwMTIzNFwiLFwiS01cIjpcIjMyMTIzNDVcIixcIktOXCI6XCI4Njk3NjUyOTE3XCIsXCJLUFwiOlwiMTkyMTIzNDU2N1wiLFwiS1JcIjpcIjEwMjAwMDAwMDBcIixcIktXXCI6XCI1MDAxMjM0NVwiLFwiS1lcIjpcIjM0NTMyMzEyMzRcIixcIktaXCI6XCI3NzEwMDA5OTk4XCIsXCJMQVwiOlwiMjAyMzEyMzQ1NlwiLFwiTEJcIjpcIjcxMTIzNDU2XCIsXCJMQ1wiOlwiNzU4Mjg0NTY3OFwiLFwiTElcIjpcIjY2MDIzNDU2N1wiLFwiTEtcIjpcIjcxMjM0NTY3OFwiLFwiTFJcIjpcIjc3MDEyMzQ1NlwiLFwiTFNcIjpcIjUwMTIzNDU2XCIsXCJMVFwiOlwiNjEyMzQ1NjdcIixcIkxVXCI6XCI2MjgxMjM0NTZcIixcIkxWXCI6XCIyMTIzNDU2N1wiLFwiTFlcIjpcIjkxMjM0NTY3OFwiLFwiTUFcIjpcIjY1MDEyMzQ1NlwiLFwiTUNcIjpcIjYxMjM0NTY3OFwiLFwiTURcIjpcIjYyMTEyMzQ1XCIsXCJNRVwiOlwiNjc2MjI5MDFcIixcIk1GXCI6XCI2OTAwMDEyMzRcIixcIk1HXCI6XCIzMjEyMzQ1NjdcIixcIk1IXCI6XCIyMzUxMjM0XCIsXCJNS1wiOlwiNzIzNDU2NzhcIixcIk1MXCI6XCI2NTAxMjM0NVwiLFwiTU1cIjpcIjkyMTIzNDU2XCIsXCJNTlwiOlwiODgxMjM0NTZcIixcIk1PXCI6XCI2NjEyMzQ1NlwiLFwiTVBcIjpcIjY3MDIzNDU2NzhcIixcIk1RXCI6XCI2OTYyMDEyMzRcIixcIk1SXCI6XCIyMjEyMzQ1NlwiLFwiTVNcIjpcIjY2NDQ5MjM0NTZcIixcIk1UXCI6XCI5Njk2MTIzNFwiLFwiTVVcIjpcIjUyNTEyMzQ1XCIsXCJNVlwiOlwiNzcxMjM0NVwiLFwiTVdcIjpcIjk5MTIzNDU2N1wiLFwiTVhcIjpcIjIyMjEyMzQ1NjdcIixcIk1ZXCI6XCIxMjM0NTY3ODlcIixcIk1aXCI6XCI4MjEyMzQ1NjdcIixcIk5BXCI6XCI4MTEyMzQ1NjdcIixcIk5DXCI6XCI3NTEyMzRcIixcIk5FXCI6XCI5MzEyMzQ1NlwiLFwiTkZcIjpcIjM4MTIzNFwiLFwiTkdcIjpcIjgwMjEyMzQ1NjdcIixcIk5JXCI6XCI4MTIzNDU2N1wiLFwiTkxcIjpcIjYxMjM0NTY3OFwiLFwiTk9cIjpcIjQwNjEyMzQ1XCIsXCJOUFwiOlwiOTg0MTIzNDU2N1wiLFwiTlJcIjpcIjU1NTEyMzRcIixcIk5VXCI6XCI4ODg0MDEyXCIsXCJOWlwiOlwiMjExMjM0NTY3XCIsXCJPTVwiOlwiOTIxMjM0NTZcIixcIlBBXCI6XCI2MTIzNDU2N1wiLFwiUEVcIjpcIjkxMjM0NTY3OFwiLFwiUEZcIjpcIjg3MTIzNDU2XCIsXCJQR1wiOlwiNzAxMjM0NTZcIixcIlBIXCI6XCI5MDUxMjM0NTY3XCIsXCJQS1wiOlwiMzAxMjM0NTY3OFwiLFwiUExcIjpcIjUxMjM0NTY3OFwiLFwiUE1cIjpcIjU1MTIzNFwiLFwiUFJcIjpcIjc4NzIzNDU2NzhcIixcIlBTXCI6XCI1OTkxMjM0NTZcIixcIlBUXCI6XCI5MTIzNDU2NzhcIixcIlBXXCI6XCI2MjAxMjM0XCIsXCJQWVwiOlwiOTYxNDU2Nzg5XCIsXCJRQVwiOlwiMzMxMjM0NTZcIixcIlJFXCI6XCI2OTIxMjM0NTZcIixcIlJPXCI6XCI3MTIwMzQ1NjdcIixcIlJTXCI6XCI2MDEyMzQ1NjdcIixcIlJVXCI6XCI5MTIzNDU2Nzg5XCIsXCJSV1wiOlwiNzIwMTIzNDU2XCIsXCJTQVwiOlwiNTEyMzQ1Njc4XCIsXCJTQlwiOlwiNzQyMTIzNFwiLFwiU0NcIjpcIjI1MTAxMjNcIixcIlNEXCI6XCI5MTEyMzEyMzRcIixcIlNFXCI6XCI3MDEyMzQ1NjdcIixcIlNHXCI6XCI4MTIzNDU2N1wiLFwiU0hcIjpcIjUxMjM0XCIsXCJTSVwiOlwiMzEyMzQ1NjdcIixcIlNKXCI6XCI0MTIzNDU2N1wiLFwiU0tcIjpcIjkxMjEyMzQ1NlwiLFwiU0xcIjpcIjI1MTIzNDU2XCIsXCJTTVwiOlwiNjY2NjEyMTJcIixcIlNOXCI6XCI3MDEyMzQ1NjdcIixcIlNPXCI6XCI3MTEyMzQ1NlwiLFwiU1JcIjpcIjc0MTIzNDVcIixcIlNTXCI6XCI5NzcxMjM0NTZcIixcIlNUXCI6XCI5ODEyMzQ1XCIsXCJTVlwiOlwiNzAxMjM0NTZcIixcIlNYXCI6XCI3MjE1MjA1Njc4XCIsXCJTWVwiOlwiOTQ0NTY3ODkwXCIsXCJTWlwiOlwiNzYxMjM0NTZcIixcIlRBXCI6XCI4OTk5XCIsXCJUQ1wiOlwiNjQ5MjMxMTIzNFwiLFwiVERcIjpcIjYzMDEyMzQ1XCIsXCJUR1wiOlwiOTAxMTIzNDVcIixcIlRIXCI6XCI4MTIzNDU2NzhcIixcIlRKXCI6XCI5MTcxMjM0NTZcIixcIlRLXCI6XCI3MjkwXCIsXCJUTFwiOlwiNzcyMTIzNDVcIixcIlRNXCI6XCI2NjEyMzQ1NlwiLFwiVE5cIjpcIjIwMTIzNDU2XCIsXCJUT1wiOlwiNzcxNTEyM1wiLFwiVFJcIjpcIjUwMTIzNDU2NzhcIixcIlRUXCI6XCI4NjgyOTExMjM0XCIsXCJUVlwiOlwiOTAxMjM0XCIsXCJUV1wiOlwiOTEyMzQ1Njc4XCIsXCJUWlwiOlwiNjIxMjM0NTY3XCIsXCJVQVwiOlwiNTAxMjM0NTY3XCIsXCJVR1wiOlwiNzEyMzQ1Njc4XCIsXCJVU1wiOlwiMjAxNTU1MDEyM1wiLFwiVVlcIjpcIjk0MjMxMjM0XCIsXCJVWlwiOlwiOTEyMzQ1Njc4XCIsXCJWQVwiOlwiMzEyMzQ1Njc4OVwiLFwiVkNcIjpcIjc4NDQzMDEyMzRcIixcIlZFXCI6XCI0MTIxMjM0NTY3XCIsXCJWR1wiOlwiMjg0MzAwMTIzNFwiLFwiVklcIjpcIjM0MDY0MjEyMzRcIixcIlZOXCI6XCI5MTIzNDU2NzhcIixcIlZVXCI6XCI1OTEyMzQ1XCIsXCJXRlwiOlwiODIxMjM0XCIsXCJXU1wiOlwiNzIxMjM0NVwiLFwiWEtcIjpcIjQzMjAxMjM0XCIsXCJZRVwiOlwiNzEyMzQ1Njc4XCIsXCJZVFwiOlwiNjM5MDEyMzQ1XCIsXCJaQVwiOlwiNzExMjM0NTY3XCIsXCJaTVwiOlwiOTU1MTIzNDU2XCIsXCJaV1wiOlwiNzEyMzQ1Njc4XCJ9Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/libphonenumber-js/examples.mobile.json.js\n\n}");
|
|
18
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n// This file is a workaround for a bug in web browsers' \"native\"\n// ES6 importing system which is uncapable of importing \"*.json\" files.\n// https://github.com/catamphetamine/libphonenumber-js/issues/239\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\"AC\":\"40123\",\"AD\":\"312345\",\"AE\":\"501234567\",\"AF\":\"701234567\",\"AG\":\"2684641234\",\"AI\":\"2642351234\",\"AL\":\"672123456\",\"AM\":\"77123456\",\"AO\":\"923123456\",\"AR\":\"91123456789\",\"AS\":\"6847331234\",\"AT\":\"664123456\",\"AU\":\"412345678\",\"AW\":\"5601234\",\"AX\":\"412345678\",\"AZ\":\"401234567\",\"BA\":\"61123456\",\"BB\":\"2462501234\",\"BD\":\"1812345678\",\"BE\":\"470123456\",\"BF\":\"70123456\",\"BG\":\"43012345\",\"BH\":\"36001234\",\"BI\":\"79561234\",\"BJ\":\"0195123456\",\"BL\":\"690001234\",\"BM\":\"4413701234\",\"BN\":\"7123456\",\"BO\":\"71234567\",\"BQ\":\"3181234\",\"BR\":\"11961234567\",\"BS\":\"2423591234\",\"BT\":\"17123456\",\"BW\":\"71123456\",\"BY\":\"294911911\",\"BZ\":\"6221234\",\"CA\":\"5062345678\",\"CC\":\"412345678\",\"CD\":\"991234567\",\"CF\":\"70012345\",\"CG\":\"061234567\",\"CH\":\"781234567\",\"CI\":\"0123456789\",\"CK\":\"71234\",\"CL\":\"221234567\",\"CM\":\"671234567\",\"CN\":\"13123456789\",\"CO\":\"3211234567\",\"CR\":\"83123456\",\"CU\":\"51234567\",\"CV\":\"9911234\",\"CW\":\"95181234\",\"CX\":\"412345678\",\"CY\":\"96123456\",\"CZ\":\"601123456\",\"DE\":\"15123456789\",\"DJ\":\"77831001\",\"DK\":\"34412345\",\"DM\":\"7672251234\",\"DO\":\"8092345678\",\"DZ\":\"551234567\",\"EC\":\"991234567\",\"EE\":\"51234567\",\"EG\":\"1001234567\",\"EH\":\"650123456\",\"ER\":\"7123456\",\"ES\":\"612345678\",\"ET\":\"911234567\",\"FI\":\"412345678\",\"FJ\":\"7012345\",\"FK\":\"51234\",\"FM\":\"3501234\",\"FO\":\"211234\",\"FR\":\"612345678\",\"GA\":\"06031234\",\"GB\":\"7400123456\",\"GD\":\"4734031234\",\"GE\":\"555123456\",\"GF\":\"694201234\",\"GG\":\"7781123456\",\"GH\":\"231234567\",\"GI\":\"57123456\",\"GL\":\"221234\",\"GM\":\"3012345\",\"GN\":\"601123456\",\"GP\":\"690001234\",\"GQ\":\"222123456\",\"GR\":\"6912345678\",\"GT\":\"51234567\",\"GU\":\"6713001234\",\"GW\":\"955012345\",\"GY\":\"6091234\",\"HK\":\"51234567\",\"HN\":\"91234567\",\"HR\":\"921234567\",\"HT\":\"34101234\",\"HU\":\"201234567\",\"ID\":\"812345678\",\"IE\":\"850123456\",\"IL\":\"502345678\",\"IM\":\"7924123456\",\"IN\":\"8123456789\",\"IO\":\"3801234\",\"IQ\":\"7912345678\",\"IR\":\"9123456789\",\"IS\":\"6111234\",\"IT\":\"3123456789\",\"JE\":\"7797712345\",\"JM\":\"8762101234\",\"JO\":\"790123456\",\"JP\":\"9012345678\",\"KE\":\"712123456\",\"KG\":\"700123456\",\"KH\":\"91234567\",\"KI\":\"72001234\",\"KM\":\"3212345\",\"KN\":\"8697652917\",\"KP\":\"1921234567\",\"KR\":\"1020000000\",\"KW\":\"50012345\",\"KY\":\"3453231234\",\"KZ\":\"7710009998\",\"LA\":\"2023123456\",\"LB\":\"71123456\",\"LC\":\"7582845678\",\"LI\":\"660234567\",\"LK\":\"712345678\",\"LR\":\"770123456\",\"LS\":\"50123456\",\"LT\":\"61234567\",\"LU\":\"628123456\",\"LV\":\"21234567\",\"LY\":\"912345678\",\"MA\":\"650123456\",\"MC\":\"612345678\",\"MD\":\"62112345\",\"ME\":\"67622901\",\"MF\":\"690001234\",\"MG\":\"321234567\",\"MH\":\"2351234\",\"MK\":\"72345678\",\"ML\":\"65012345\",\"MM\":\"92123456\",\"MN\":\"88123456\",\"MO\":\"66123456\",\"MP\":\"6702345678\",\"MQ\":\"696201234\",\"MR\":\"22123456\",\"MS\":\"6644923456\",\"MT\":\"96961234\",\"MU\":\"52512345\",\"MV\":\"7712345\",\"MW\":\"991234567\",\"MX\":\"2221234567\",\"MY\":\"123456789\",\"MZ\":\"821234567\",\"NA\":\"811234567\",\"NC\":\"751234\",\"NE\":\"93123456\",\"NF\":\"381234\",\"NG\":\"8021234567\",\"NI\":\"81234567\",\"NL\":\"612345678\",\"NO\":\"40612345\",\"NP\":\"9841234567\",\"NR\":\"5551234\",\"NU\":\"8884012\",\"NZ\":\"211234567\",\"OM\":\"92123456\",\"PA\":\"61234567\",\"PE\":\"912345678\",\"PF\":\"87123456\",\"PG\":\"70123456\",\"PH\":\"9051234567\",\"PK\":\"3012345678\",\"PL\":\"512345678\",\"PM\":\"551234\",\"PR\":\"7872345678\",\"PS\":\"599123456\",\"PT\":\"912345678\",\"PW\":\"6201234\",\"PY\":\"961456789\",\"QA\":\"33123456\",\"RE\":\"692123456\",\"RO\":\"712034567\",\"RS\":\"601234567\",\"RU\":\"9123456789\",\"RW\":\"720123456\",\"SA\":\"512345678\",\"SB\":\"7421234\",\"SC\":\"2510123\",\"SD\":\"911231234\",\"SE\":\"701234567\",\"SG\":\"81234567\",\"SH\":\"51234\",\"SI\":\"31234567\",\"SJ\":\"41234567\",\"SK\":\"912123456\",\"SL\":\"25123456\",\"SM\":\"66661212\",\"SN\":\"701234567\",\"SO\":\"71123456\",\"SR\":\"7412345\",\"SS\":\"977123456\",\"ST\":\"9812345\",\"SV\":\"70123456\",\"SX\":\"7215205678\",\"SY\":\"944567890\",\"SZ\":\"76123456\",\"TA\":\"8999\",\"TC\":\"6492311234\",\"TD\":\"63012345\",\"TG\":\"90112345\",\"TH\":\"812345678\",\"TJ\":\"917123456\",\"TK\":\"7290\",\"TL\":\"77212345\",\"TM\":\"66123456\",\"TN\":\"20123456\",\"TO\":\"7715123\",\"TR\":\"5012345678\",\"TT\":\"8682911234\",\"TV\":\"901234\",\"TW\":\"912345678\",\"TZ\":\"621234567\",\"UA\":\"501234567\",\"UG\":\"712345678\",\"US\":\"2015550123\",\"UY\":\"94231234\",\"UZ\":\"912345678\",\"VA\":\"3123456789\",\"VC\":\"7844301234\",\"VE\":\"4121234567\",\"VG\":\"2843001234\",\"VI\":\"3406421234\",\"VN\":\"912345678\",\"VU\":\"5912345\",\"WF\":\"821234\",\"WS\":\"7212345\",\"XK\":\"43201234\",\"YE\":\"712345678\",\"YT\":\"639012345\",\"ZA\":\"711234567\",\"ZM\":\"955123456\",\"ZW\":\"712345678\"});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2V4YW1wbGVzLm1vYmlsZS5qc29uLmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQSwrREFBZSxDQUFDLCs5SCIsInNvdXJjZXMiOlsid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXhhbXBsZXMubW9iaWxlLmpzb24uanM/YjhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGZpbGUgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB3ZWIgYnJvd3NlcnMnIFwibmF0aXZlXCJcbi8vIEVTNiBpbXBvcnRpbmcgc3lzdGVtIHdoaWNoIGlzIHVuY2FwYWJsZSBvZiBpbXBvcnRpbmcgXCIqLmpzb25cIiBmaWxlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRhbXBoZXRhbWluZS9saWJwaG9uZW51bWJlci1qcy9pc3N1ZXMvMjM5XG5leHBvcnQgZGVmYXVsdCB7XCJBQ1wiOlwiNDAxMjNcIixcIkFEXCI6XCIzMTIzNDVcIixcIkFFXCI6XCI1MDEyMzQ1NjdcIixcIkFGXCI6XCI3MDEyMzQ1NjdcIixcIkFHXCI6XCIyNjg0NjQxMjM0XCIsXCJBSVwiOlwiMjY0MjM1MTIzNFwiLFwiQUxcIjpcIjY3MjEyMzQ1NlwiLFwiQU1cIjpcIjc3MTIzNDU2XCIsXCJBT1wiOlwiOTIzMTIzNDU2XCIsXCJBUlwiOlwiOTExMjM0NTY3ODlcIixcIkFTXCI6XCI2ODQ3MzMxMjM0XCIsXCJBVFwiOlwiNjY0MTIzNDU2XCIsXCJBVVwiOlwiNDEyMzQ1Njc4XCIsXCJBV1wiOlwiNTYwMTIzNFwiLFwiQVhcIjpcIjQxMjM0NTY3OFwiLFwiQVpcIjpcIjQwMTIzNDU2N1wiLFwiQkFcIjpcIjYxMTIzNDU2XCIsXCJCQlwiOlwiMjQ2MjUwMTIzNFwiLFwiQkRcIjpcIjE4MTIzNDU2NzhcIixcIkJFXCI6XCI0NzAxMjM0NTZcIixcIkJGXCI6XCI3MDEyMzQ1NlwiLFwiQkdcIjpcIjQzMDEyMzQ1XCIsXCJCSFwiOlwiMzYwMDEyMzRcIixcIkJJXCI6XCI3OTU2MTIzNFwiLFwiQkpcIjpcIjAxOTUxMjM0NTZcIixcIkJMXCI6XCI2OTAwMDEyMzRcIixcIkJNXCI6XCI0NDEzNzAxMjM0XCIsXCJCTlwiOlwiNzEyMzQ1NlwiLFwiQk9cIjpcIjcxMjM0NTY3XCIsXCJCUVwiOlwiMzE4MTIzNFwiLFwiQlJcIjpcIjExOTYxMjM0NTY3XCIsXCJCU1wiOlwiMjQyMzU5MTIzNFwiLFwiQlRcIjpcIjE3MTIzNDU2XCIsXCJCV1wiOlwiNzExMjM0NTZcIixcIkJZXCI6XCIyOTQ5MTE5MTFcIixcIkJaXCI6XCI2MjIxMjM0XCIsXCJDQVwiOlwiNTA2MjM0NTY3OFwiLFwiQ0NcIjpcIjQxMjM0NTY3OFwiLFwiQ0RcIjpcIjk5MTIzNDU2N1wiLFwiQ0ZcIjpcIjcwMDEyMzQ1XCIsXCJDR1wiOlwiMDYxMjM0NTY3XCIsXCJDSFwiOlwiNzgxMjM0NTY3XCIsXCJDSVwiOlwiMDEyMzQ1Njc4OVwiLFwiQ0tcIjpcIjcxMjM0XCIsXCJDTFwiOlwiMjIxMjM0NTY3XCIsXCJDTVwiOlwiNjcxMjM0NTY3XCIsXCJDTlwiOlwiMTMxMjM0NTY3ODlcIixcIkNPXCI6XCIzMjExMjM0NTY3XCIsXCJDUlwiOlwiODMxMjM0NTZcIixcIkNVXCI6XCI1MTIzNDU2N1wiLFwiQ1ZcIjpcIjk5MTEyMzRcIixcIkNXXCI6XCI5NTE4MTIzNFwiLFwiQ1hcIjpcIjQxMjM0NTY3OFwiLFwiQ1lcIjpcIjk2MTIzNDU2XCIsXCJDWlwiOlwiNjAxMTIzNDU2XCIsXCJERVwiOlwiMTUxMjM0NTY3ODlcIixcIkRKXCI6XCI3NzgzMTAwMVwiLFwiREtcIjpcIjM0NDEyMzQ1XCIsXCJETVwiOlwiNzY3MjI1MTIzNFwiLFwiRE9cIjpcIjgwOTIzNDU2NzhcIixcIkRaXCI6XCI1NTEyMzQ1NjdcIixcIkVDXCI6XCI5OTEyMzQ1NjdcIixcIkVFXCI6XCI1MTIzNDU2N1wiLFwiRUdcIjpcIjEwMDEyMzQ1NjdcIixcIkVIXCI6XCI2NTAxMjM0NTZcIixcIkVSXCI6XCI3MTIzNDU2XCIsXCJFU1wiOlwiNjEyMzQ1Njc4XCIsXCJFVFwiOlwiOTExMjM0NTY3XCIsXCJGSVwiOlwiNDEyMzQ1Njc4XCIsXCJGSlwiOlwiNzAxMjM0NVwiLFwiRktcIjpcIjUxMjM0XCIsXCJGTVwiOlwiMzUwMTIzNFwiLFwiRk9cIjpcIjIxMTIzNFwiLFwiRlJcIjpcIjYxMjM0NTY3OFwiLFwiR0FcIjpcIjA2MDMxMjM0XCIsXCJHQlwiOlwiNzQwMDEyMzQ1NlwiLFwiR0RcIjpcIjQ3MzQwMzEyMzRcIixcIkdFXCI6XCI1NTUxMjM0NTZcIixcIkdGXCI6XCI2OTQyMDEyMzRcIixcIkdHXCI6XCI3NzgxMTIzNDU2XCIsXCJHSFwiOlwiMjMxMjM0NTY3XCIsXCJHSVwiOlwiNTcxMjM0NTZcIixcIkdMXCI6XCIyMjEyMzRcIixcIkdNXCI6XCIzMDEyMzQ1XCIsXCJHTlwiOlwiNjAxMTIzNDU2XCIsXCJHUFwiOlwiNjkwMDAxMjM0XCIsXCJHUVwiOlwiMjIyMTIzNDU2XCIsXCJHUlwiOlwiNjkxMjM0NTY3OFwiLFwiR1RcIjpcIjUxMjM0NTY3XCIsXCJHVVwiOlwiNjcxMzAwMTIzNFwiLFwiR1dcIjpcIjk1NTAxMjM0NVwiLFwiR1lcIjpcIjYwOTEyMzRcIixcIkhLXCI6XCI1MTIzNDU2N1wiLFwiSE5cIjpcIjkxMjM0NTY3XCIsXCJIUlwiOlwiOTIxMjM0NTY3XCIsXCJIVFwiOlwiMzQxMDEyMzRcIixcIkhVXCI6XCIyMDEyMzQ1NjdcIixcIklEXCI6XCI4MTIzNDU2NzhcIixcIklFXCI6XCI4NTAxMjM0NTZcIixcIklMXCI6XCI1MDIzNDU2NzhcIixcIklNXCI6XCI3OTI0MTIzNDU2XCIsXCJJTlwiOlwiODEyMzQ1Njc4OVwiLFwiSU9cIjpcIjM4MDEyMzRcIixcIklRXCI6XCI3OTEyMzQ1Njc4XCIsXCJJUlwiOlwiOTEyMzQ1Njc4OVwiLFwiSVNcIjpcIjYxMTEyMzRcIixcIklUXCI6XCIzMTIzNDU2Nzg5XCIsXCJKRVwiOlwiNzc5NzcxMjM0NVwiLFwiSk1cIjpcIjg3NjIxMDEyMzRcIixcIkpPXCI6XCI3OTAxMjM0NTZcIixcIkpQXCI6XCI5MDEyMzQ1Njc4XCIsXCJLRVwiOlwiNzEyMTIzNDU2XCIsXCJLR1wiOlwiNzAwMTIzNDU2XCIsXCJLSFwiOlwiOTEyMzQ1NjdcIixcIktJXCI6XCI3MjAwMTIzNFwiLFwiS01cIjpcIjMyMTIzNDVcIixcIktOXCI6XCI4Njk3NjUyOTE3XCIsXCJLUFwiOlwiMTkyMTIzNDU2N1wiLFwiS1JcIjpcIjEwMjAwMDAwMDBcIixcIktXXCI6XCI1MDAxMjM0NVwiLFwiS1lcIjpcIjM0NTMyMzEyMzRcIixcIktaXCI6XCI3NzEwMDA5OTk4XCIsXCJMQVwiOlwiMjAyMzEyMzQ1NlwiLFwiTEJcIjpcIjcxMTIzNDU2XCIsXCJMQ1wiOlwiNzU4Mjg0NTY3OFwiLFwiTElcIjpcIjY2MDIzNDU2N1wiLFwiTEtcIjpcIjcxMjM0NTY3OFwiLFwiTFJcIjpcIjc3MDEyMzQ1NlwiLFwiTFNcIjpcIjUwMTIzNDU2XCIsXCJMVFwiOlwiNjEyMzQ1NjdcIixcIkxVXCI6XCI2MjgxMjM0NTZcIixcIkxWXCI6XCIyMTIzNDU2N1wiLFwiTFlcIjpcIjkxMjM0NTY3OFwiLFwiTUFcIjpcIjY1MDEyMzQ1NlwiLFwiTUNcIjpcIjYxMjM0NTY3OFwiLFwiTURcIjpcIjYyMTEyMzQ1XCIsXCJNRVwiOlwiNjc2MjI5MDFcIixcIk1GXCI6XCI2OTAwMDEyMzRcIixcIk1HXCI6XCIzMjEyMzQ1NjdcIixcIk1IXCI6XCIyMzUxMjM0XCIsXCJNS1wiOlwiNzIzNDU2NzhcIixcIk1MXCI6XCI2NTAxMjM0NVwiLFwiTU1cIjpcIjkyMTIzNDU2XCIsXCJNTlwiOlwiODgxMjM0NTZcIixcIk1PXCI6XCI2NjEyMzQ1NlwiLFwiTVBcIjpcIjY3MDIzNDU2NzhcIixcIk1RXCI6XCI2OTYyMDEyMzRcIixcIk1SXCI6XCIyMjEyMzQ1NlwiLFwiTVNcIjpcIjY2NDQ5MjM0NTZcIixcIk1UXCI6XCI5Njk2MTIzNFwiLFwiTVVcIjpcIjUyNTEyMzQ1XCIsXCJNVlwiOlwiNzcxMjM0NVwiLFwiTVdcIjpcIjk5MTIzNDU2N1wiLFwiTVhcIjpcIjIyMjEyMzQ1NjdcIixcIk1ZXCI6XCIxMjM0NTY3ODlcIixcIk1aXCI6XCI4MjEyMzQ1NjdcIixcIk5BXCI6XCI4MTEyMzQ1NjdcIixcIk5DXCI6XCI3NTEyMzRcIixcIk5FXCI6XCI5MzEyMzQ1NlwiLFwiTkZcIjpcIjM4MTIzNFwiLFwiTkdcIjpcIjgwMjEyMzQ1NjdcIixcIk5JXCI6XCI4MTIzNDU2N1wiLFwiTkxcIjpcIjYxMjM0NTY3OFwiLFwiTk9cIjpcIjQwNjEyMzQ1XCIsXCJOUFwiOlwiOTg0MTIzNDU2N1wiLFwiTlJcIjpcIjU1NTEyMzRcIixcIk5VXCI6XCI4ODg0MDEyXCIsXCJOWlwiOlwiMjExMjM0NTY3XCIsXCJPTVwiOlwiOTIxMjM0NTZcIixcIlBBXCI6XCI2MTIzNDU2N1wiLFwiUEVcIjpcIjkxMjM0NTY3OFwiLFwiUEZcIjpcIjg3MTIzNDU2XCIsXCJQR1wiOlwiNzAxMjM0NTZcIixcIlBIXCI6XCI5MDUxMjM0NTY3XCIsXCJQS1wiOlwiMzAxMjM0NTY3OFwiLFwiUExcIjpcIjUxMjM0NTY3OFwiLFwiUE1cIjpcIjU1MTIzNFwiLFwiUFJcIjpcIjc4NzIzNDU2NzhcIixcIlBTXCI6XCI1OTkxMjM0NTZcIixcIlBUXCI6XCI5MTIzNDU2NzhcIixcIlBXXCI6XCI2MjAxMjM0XCIsXCJQWVwiOlwiOTYxNDU2Nzg5XCIsXCJRQVwiOlwiMzMxMjM0NTZcIixcIlJFXCI6XCI2OTIxMjM0NTZcIixcIlJPXCI6XCI3MTIwMzQ1NjdcIixcIlJTXCI6XCI2MDEyMzQ1NjdcIixcIlJVXCI6XCI5MTIzNDU2Nzg5XCIsXCJSV1wiOlwiNzIwMTIzNDU2XCIsXCJTQVwiOlwiNTEyMzQ1Njc4XCIsXCJTQlwiOlwiNzQyMTIzNFwiLFwiU0NcIjpcIjI1MTAxMjNcIixcIlNEXCI6XCI5MTEyMzEyMzRcIixcIlNFXCI6XCI3MDEyMzQ1NjdcIixcIlNHXCI6XCI4MTIzNDU2N1wiLFwiU0hcIjpcIjUxMjM0XCIsXCJTSVwiOlwiMzEyMzQ1NjdcIixcIlNKXCI6XCI0MTIzNDU2N1wiLFwiU0tcIjpcIjkxMjEyMzQ1NlwiLFwiU0xcIjpcIjI1MTIzNDU2XCIsXCJTTVwiOlwiNjY2NjEyMTJcIixcIlNOXCI6XCI3MDEyMzQ1NjdcIixcIlNPXCI6XCI3MTEyMzQ1NlwiLFwiU1JcIjpcIjc0MTIzNDVcIixcIlNTXCI6XCI5NzcxMjM0NTZcIixcIlNUXCI6XCI5ODEyMzQ1XCIsXCJTVlwiOlwiNzAxMjM0NTZcIixcIlNYXCI6XCI3MjE1MjA1Njc4XCIsXCJTWVwiOlwiOTQ0NTY3ODkwXCIsXCJTWlwiOlwiNzYxMjM0NTZcIixcIlRBXCI6XCI4OTk5XCIsXCJUQ1wiOlwiNjQ5MjMxMTIzNFwiLFwiVERcIjpcIjYzMDEyMzQ1XCIsXCJUR1wiOlwiOTAxMTIzNDVcIixcIlRIXCI6XCI4MTIzNDU2NzhcIixcIlRKXCI6XCI5MTcxMjM0NTZcIixcIlRLXCI6XCI3MjkwXCIsXCJUTFwiOlwiNzcyMTIzNDVcIixcIlRNXCI6XCI2NjEyMzQ1NlwiLFwiVE5cIjpcIjIwMTIzNDU2XCIsXCJUT1wiOlwiNzcxNTEyM1wiLFwiVFJcIjpcIjUwMTIzNDU2NzhcIixcIlRUXCI6XCI4NjgyOTExMjM0XCIsXCJUVlwiOlwiOTAxMjM0XCIsXCJUV1wiOlwiOTEyMzQ1Njc4XCIsXCJUWlwiOlwiNjIxMjM0NTY3XCIsXCJVQVwiOlwiNTAxMjM0NTY3XCIsXCJVR1wiOlwiNzEyMzQ1Njc4XCIsXCJVU1wiOlwiMjAxNTU1MDEyM1wiLFwiVVlcIjpcIjk0MjMxMjM0XCIsXCJVWlwiOlwiOTEyMzQ1Njc4XCIsXCJWQVwiOlwiMzEyMzQ1Njc4OVwiLFwiVkNcIjpcIjc4NDQzMDEyMzRcIixcIlZFXCI6XCI0MTIxMjM0NTY3XCIsXCJWR1wiOlwiMjg0MzAwMTIzNFwiLFwiVklcIjpcIjM0MDY0MjEyMzRcIixcIlZOXCI6XCI5MTIzNDU2NzhcIixcIlZVXCI6XCI1OTEyMzQ1XCIsXCJXRlwiOlwiODIxMjM0XCIsXCJXU1wiOlwiNzIxMjM0NVwiLFwiWEtcIjpcIjQzMjAxMjM0XCIsXCJZRVwiOlwiNzEyMzQ1Njc4XCIsXCJZVFwiOlwiNjM5MDEyMzQ1XCIsXCJaQVwiOlwiNzExMjM0NTY3XCIsXCJaTVwiOlwiOTU1MTIzNDU2XCIsXCJaV1wiOlwiNzEyMzQ1Njc4XCJ9Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/libphonenumber-js/examples.mobile.json.js\n\n}");
|
|
19
19
|
|
|
20
20
|
/***/ }),
|
|
21
21
|
|
|
@@ -25,7 +25,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n// This file is a workaround
|
|
|
25
25
|
\********************************************************************************************/
|
|
26
26
|
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
27
27
|
|
|
28
|
-
eval("{// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n getExampleNumber: function() { return /* binding */ getExampleNumber_getExampleNumber; }\n});\n\n// EXTERNAL MODULE: ../../../node_modules/libphonenumber-js/min/exports/withMetadataArgument.js + 1 modules\nvar withMetadataArgument = __webpack_require__(\"../../../node_modules/libphonenumber-js/min/exports/withMetadataArgument.js\");\n// EXTERNAL MODULE: ../../../node_modules/libphonenumber-js/es6/metadata.js + 2 modules\nvar es6_metadata = __webpack_require__(\"../../../node_modules/libphonenumber-js/es6/metadata.js\");\n;// ../../../node_modules/libphonenumber-js/es6/helpers/mergeArrays.js\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.\"); }\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/**\r\n * Merges two arrays.\r\n * @param {*} a\r\n * @param {*} b\r\n * @return {*}\r\n */\nfunction mergeArrays(a, b) {\n var merged = a.slice();\n\n for (var _iterator = _createForOfIteratorHelperLoose(b), _step; !(_step = _iterator()).done;) {\n var element = _step.value;\n\n if (a.indexOf(element) < 0) {\n merged.push(element);\n }\n }\n\n return merged.sort(function (a, b) {\n return a - b;\n }); // ES6 version, requires Set polyfill.\n // let merged = new Set(a)\n // for (const element of b) {\n // \tmerged.add(i)\n // }\n // return Array.from(merged).sort((a, b) => a - b)\n}\n//# sourceMappingURL=mergeArrays.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js\n\nfunction checkNumberLength(nationalNumber, metadata) {\n return checkNumberLengthForType(nationalNumber, undefined, metadata);\n} // Checks whether a number is possible for the country based on its length.\n// Should only be called for the \"new\" metadata which has \"possible lengths\".\n\nfunction checkNumberLengthForType(nationalNumber, type, metadata) {\n var type_info = metadata.type(type); // There should always be \"<possiblePengths/>\" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \"<possiblePengths/>\" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths(); // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, 'MOBILE', metadata);\n }\n\n var mobile_type = metadata.type('MOBILE');\n\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = mergeArrays(possible_lengths, mobile_type.possibleLengths()); // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n } // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n\n var actual_length = nationalNumber.length; // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n } // We skip the first element since we've already checked it.\n\n\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map\n;// ../../../node_modules/libphonenumber-js/es6/isPossible.js\n\n\n/**\r\n * Checks if a phone number is \"possible\" (basically just checks its length).\r\n *\r\n * isPossible(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\nfunction isPossiblePhoneNumber(input, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n\n if (options.v2) {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else {\n if (!input.phone) {\n return false;\n }\n\n if (input.country) {\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n }\n } // Old metadata (< 1.0.18) had no \"possible length\" data.\n\n\n if (metadata.possibleLengths()) {\n return isPossibleNumber(input.phone || input.nationalNumber, metadata);\n } else {\n // There was a bug between `1.7.35` and `1.7.37` where \"possible_lengths\"\n // were missing for \"non-geographical\" numbering plans.\n // Just assume the number is possible in such cases:\n // it's unlikely that anyone generated their custom metadata\n // in that short period of time (one day).\n // This code can be removed in some future major version update.\n if (input.countryCallingCode && metadata.isNonGeographicCallingCode(input.countryCallingCode)) {\n // \"Non-geographic entities\" did't have `possibleLengths`\n // due to a bug in metadata generation process.\n return true;\n } else {\n throw new Error('Missing \"possibleLengths\" in metadata. Perhaps the metadata has been generated before v1.0.18.');\n }\n }\n}\nfunction isPossibleNumber(nationalNumber, metadata) {\n //, isInternational) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'IS_POSSIBLE':\n return true;\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n // \treturn !isInternational\n\n default:\n return false;\n }\n}\n//# sourceMappingURL=isPossible.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/matchesEntirely.js\n/**\r\n * Checks whether the entire input sequence can be matched\r\n * against the regular expression.\r\n * @return {boolean}\r\n */\nfunction matchesEntirely(text, regular_expression) {\n // If assigning the `''` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n text = text || '';\n return new RegExp('^(?:' + regular_expression + ')$').test(text);\n}\n//# sourceMappingURL=matchesEntirely.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getNumberType.js\nfunction getNumberType_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 = getNumberType_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.\"); }\n\nfunction getNumberType_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return getNumberType_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 getNumberType_arrayLikeToArray(o, minLen); }\n\nfunction getNumberType_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\nvar NON_FIXED_LINE_PHONE_TYPES = ['MOBILE', 'PREMIUM_RATE', 'TOLL_FREE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL']; // Finds out national phone number type (fixed line, mobile, etc)\n\nfunction getNumberType(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {}; // When `parse()` returns an empty object — `{}` —\n // that means that the phone number is malformed,\n // so it can't possibly be valid.\n\n if (!input.country && !input.countryCallingCode) {\n return;\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode);\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // The following is copy-pasted from the original function:\n // https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835\n // Is this national number even valid for this country\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern())) {\n return;\n } // Is it fixed line number\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'FIXED_LINE', metadata)) {\n // Because duplicate regular expressions are removed\n // to reduce metadata size, if \"mobile\" pattern is \"\"\n // then it means it was removed due to being a duplicate of the fixed-line pattern.\n //\n if (metadata.type('MOBILE') && metadata.type('MOBILE').pattern() === '') {\n return 'FIXED_LINE_OR_MOBILE';\n } // `MOBILE` type pattern isn't included if it matched `FIXED_LINE` one.\n // For example, for \"US\" country.\n // Old metadata (< `1.0.18`) had a specific \"types\" data structure\n // that happened to be `undefined` for `MOBILE` in that case.\n // Newer metadata (>= `1.0.18`) has another data structure that is\n // not `undefined` for `MOBILE` in that case (it's just an empty array).\n // So this `if` is just for backwards compatibility with old metadata.\n\n\n if (!metadata.type('MOBILE')) {\n return 'FIXED_LINE_OR_MOBILE';\n } // Check if the number happens to qualify as both fixed line and mobile.\n // (no such country in the minimal metadata set)\n\n /* istanbul ignore if */\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'MOBILE', metadata)) {\n return 'FIXED_LINE_OR_MOBILE';\n }\n\n return 'FIXED_LINE';\n }\n\n for (var _iterator = getNumberType_createForOfIteratorHelperLoose(NON_FIXED_LINE_PHONE_TYPES), _step; !(_step = _iterator()).done;) {\n var type = _step.value;\n\n if (isNumberTypeEqualTo(nationalNumber, type, metadata)) {\n return type;\n }\n }\n}\nfunction isNumberTypeEqualTo(nationalNumber, type, metadata) {\n type = metadata.type(type);\n\n if (!type || !type.pattern()) {\n return false;\n } // Check if any possible number lengths are present;\n // if so, we use them to avoid checking\n // the validation pattern if they don't match.\n // If they are absent, this means they match\n // the general description, which we have\n // already checked before a specific number type.\n\n\n if (type.possibleLengths() && type.possibleLengths().indexOf(nationalNumber.length) < 0) {\n return false;\n }\n\n return matchesEntirely(nationalNumber, type.pattern());\n}\n//# sourceMappingURL=getNumberType.js.map\n;// ../../../node_modules/libphonenumber-js/es6/isValid.js\n\n\n\n/**\r\n * Checks if a given phone number is valid.\r\n *\r\n * isValid(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * If the `number` is a string, it will be parsed to an object,\r\n * but only if it contains only valid phone number characters (including punctuation).\r\n * If the `number` is an object, it is used as is.\r\n *\r\n * The optional `defaultCountry` argument is the default country.\r\n * I.e. it does not restrict to just that country,\r\n * e.g. in those cases where several countries share\r\n * the same phone numbering rules (NANPA, Britain, etc).\r\n * For example, even though the number `07624 369230`\r\n * belongs to the Isle of Man (\"IM\" country code)\r\n * calling `isValidNumber('07624369230', 'GB', metadata)`\r\n * still returns `true` because the country is not restricted to `GB`,\r\n * it's just that `GB` is the default one for the phone numbering rules.\r\n * For restricting the country see `isValidNumberForRegion()`\r\n * though restricting a country might not be a good idea.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isValidNumber('+78005553535', metadata)\r\n * isValidNumber('8005553535', 'RU', metadata)\r\n * isValidNumber('88005553535', 'RU', metadata)\r\n * isValidNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\n\nfunction isValidNumber(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new es6_metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode); // By default, countries only have type regexps when it's required for\n // distinguishing different countries having the same `countryCallingCode`.\n\n if (metadata.hasTypes()) {\n return getNumberType(input, options, metadata.metadata) !== undefined;\n } // If there are no type regexps for this country in metadata then use\n // `nationalNumberPattern` as a \"better than nothing\" replacement.\n\n\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone;\n return matchesEntirely(nationalNumber, metadata.nationalNumberPattern());\n}\n//# sourceMappingURL=isValid.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getPossibleCountriesForNumber.js\n\n/**\r\n * Returns a list of countries that the phone number could potentially belong to.\r\n * @param {string} callingCode — Calling code.\r\n * @param {string} nationalNumber — National (significant) number.\r\n * @param {object} metadata — Metadata.\r\n * @return {string[]} A list of possible countries.\r\n */\n\nfunction getPossibleCountriesForNumber(callingCode, nationalNumber, metadata) {\n var _metadata = new es6_metadata[\"default\"](metadata);\n\n var possibleCountries = _metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return [];\n }\n\n return possibleCountries.filter(function (country) {\n return couldNationalNumberBelongToCountry(nationalNumber, country, metadata);\n });\n}\n\nfunction couldNationalNumberBelongToCountry(nationalNumber, country, metadata) {\n var _metadata = new es6_metadata[\"default\"](metadata);\n\n _metadata.selectNumberingPlan(country);\n\n if (_metadata.numberingPlan.possibleLengths().indexOf(nationalNumber.length) >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=getPossibleCountriesForNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/constants.js\n// The minimum length of the national significant number.\nvar MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15,\n// but one can find longer numbers in Germany.\n\nvar MAX_LENGTH_FOR_NSN = 17; // The maximum length of the country calling code.\n\nvar MAX_LENGTH_COUNTRY_CODE = 3; // Digits accepted in phone numbers\n// (ascii, fullwidth, arabic-indic, and eastern arabic digits).\n\nvar VALID_DIGITS = \"0-9\\uFF10-\\uFF19\\u0660-\\u0669\\u06F0-\\u06F9\"; // `DASHES` will be right after the opening square bracket of the \"character class\"\n\nvar DASHES = \"-\\u2010-\\u2015\\u2212\\u30FC\\uFF0D\";\nvar SLASHES = \"\\uFF0F/\";\nvar DOTS = \"\\uFF0E.\";\nvar WHITESPACE = \" \\xA0\\xAD\\u200B\\u2060\\u3000\";\nvar BRACKETS = \"()\\uFF08\\uFF09\\uFF3B\\uFF3D\\\\[\\\\]\"; // export const OPENING_BRACKETS = '(\\uFF08\\uFF3B\\\\\\['\n\nvar TILDES = \"~\\u2053\\u223C\\uFF5E\"; // Regular expression of acceptable punctuation found in phone numbers. This\n// excludes punctuation found as a leading character only. This consists of dash\n// characters, white space characters, full stops, slashes, square brackets,\n// parentheses and tildes. Full-width variants are also present.\n\nvar VALID_PUNCTUATION = \"\".concat(DASHES).concat(SLASHES).concat(DOTS).concat(WHITESPACE).concat(BRACKETS).concat(TILDES);\nvar PLUS_CHARS = \"+\\uFF0B\"; // const LEADING_PLUS_CHARS_PATTERN = new RegExp('^[' + PLUS_CHARS + ']+')\n//# sourceMappingURL=constants.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/applyInternationalSeparatorStyle.js\n // Removes brackets and replaces dashes with spaces.\n//\n// E.g. \"(999) 111-22-33\" -> \"999 111 22 33\"\n//\n// For some reason Google's metadata contains `<intlFormat/>`s with brackets and dashes.\n// Meanwhile, there's no single opinion about using punctuation in international phone numbers.\n//\n// For example, Google's `<intlFormat/>` for USA is `+1 213-373-4253`.\n// And here's a quote from WikiPedia's \"North American Numbering Plan\" page:\n// https://en.wikipedia.org/wiki/North_American_Numbering_Plan\n//\n// \"The country calling code for all countries participating in the NANP is 1.\n// In international format, an NANP number should be listed as +1 301 555 01 00,\n// where 301 is an area code (Maryland).\"\n//\n// I personally prefer the international format without any punctuation.\n// For example, brackets are remnants of the old age, meaning that the\n// phone number part in brackets (so called \"area code\") can be omitted\n// if dialing within the same \"area\".\n// And hyphens were clearly introduced for splitting local numbers into memorizable groups.\n// For example, remembering \"5553535\" is difficult but \"555-35-35\" is much simpler.\n// Imagine a man taking a bus from home to work and seeing an ad with a phone number.\n// He has a couple of seconds to memorize that number until it passes by.\n// If it were spaces instead of hyphens the man wouldn't necessarily get it,\n// but with hyphens instead of spaces the grouping is more explicit.\n// I personally think that hyphens introduce visual clutter,\n// so I prefer replacing them with spaces in international numbers.\n// In the modern age all output is done on displays where spaces are clearly distinguishable\n// so hyphens can be safely replaced with spaces without losing any legibility.\n//\n\nfunction applyInternationalSeparatorStyle(formattedNumber) {\n return formattedNumber.replace(new RegExp(\"[\".concat(VALID_PUNCTUATION, \"]+\"), 'g'), ' ').trim();\n}\n//# sourceMappingURL=applyInternationalSeparatorStyle.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/formatNationalNumberUsingFormat.js\n // This was originally set to $1 but there are some countries for which the\n// first group is not used in the national pattern (e.g. Argentina) so the $1\n// group does not match correctly. Therefore, we use `\\d`, so that the first\n// group actually used in the pattern will be matched.\n\nvar FIRST_GROUP_PATTERN = /(\\$\\d)/;\nfunction formatNationalNumberUsingFormat(number, format, _ref) {\n var useInternationalFormat = _ref.useInternationalFormat,\n withNationalPrefix = _ref.withNationalPrefix,\n carrierCode = _ref.carrierCode,\n metadata = _ref.metadata;\n var formattedNumber = number.replace(new RegExp(format.pattern()), useInternationalFormat ? format.internationalFormat() : // This library doesn't use `domestic_carrier_code_formatting_rule`,\n // because that one is only used when formatting phone numbers\n // for dialing from a mobile phone, and this is not a dialing library.\n // carrierCode && format.domesticCarrierCodeFormattingRule()\n // \t// First, replace the $CC in the formatting rule with the desired carrier code.\n // \t// Then, replace the $FG in the formatting rule with the first group\n // \t// and the carrier code combined in the appropriate way.\n // \t? format.format().replace(FIRST_GROUP_PATTERN, format.domesticCarrierCodeFormattingRule().replace('$CC', carrierCode))\n // \t: (\n // \t\twithNationalPrefix && format.nationalPrefixFormattingRule()\n // \t\t\t? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule())\n // \t\t\t: format.format()\n // \t)\n withNationalPrefix && format.nationalPrefixFormattingRule() ? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()) : format.format());\n\n if (useInternationalFormat) {\n return applyInternationalSeparatorStyle(formattedNumber);\n }\n\n return formattedNumber;\n}\n//# sourceMappingURL=formatNationalNumberUsingFormat.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getIddPrefix.js\n\n/**\r\n * Pattern that makes it easy to distinguish whether a region has a single\r\n * international dialing prefix or not. If a region has a single international\r\n * prefix (e.g. 011 in USA), it will be represented as a string that contains\r\n * a sequence of ASCII digits, and possibly a tilde, which signals waiting for\r\n * the tone. If there are multiple available international prefixes in a\r\n * region, they will be represented as a regex string that always contains one\r\n * or more characters that are not ASCII digits or a tilde.\r\n */\n\nvar SINGLE_IDD_PREFIX_REG_EXP = /^[\\d]+(?:[~\\u2053\\u223C\\uFF5E][\\d]+)?$/; // For regions that have multiple IDD prefixes\n// a preferred IDD prefix is returned.\n\nfunction getIddPrefix(country, callingCode, metadata) {\n var countryMetadata = new es6_metadata[\"default\"](metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n\n if (countryMetadata.defaultIDDPrefix()) {\n return countryMetadata.defaultIDDPrefix();\n }\n\n if (SINGLE_IDD_PREFIX_REG_EXP.test(countryMetadata.IDDPrefix())) {\n return countryMetadata.IDDPrefix();\n }\n}\n//# sourceMappingURL=getIddPrefix.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/extension/createExtensionPattern.js\n // The RFC 3966 format for extensions.\n\nvar RFC3966_EXTN_PREFIX = ';ext=';\n/**\r\n * Helper method for constructing regular expressions for parsing. Creates\r\n * an expression that captures up to max_length digits.\r\n * @return {string} RegEx pattern to capture extension digits.\r\n */\n\nvar getExtensionDigitsPattern = function getExtensionDigitsPattern(maxLength) {\n return \"([\".concat(VALID_DIGITS, \"]{1,\").concat(maxLength, \"})\");\n};\n/**\r\n * Helper initialiser method to create the regular-expression pattern to match\r\n * extensions.\r\n * Copy-pasted from Google's `libphonenumber`:\r\n * https://github.com/google/libphonenumber/blob/55b2646ec9393f4d3d6661b9c82ef9e258e8b829/javascript/i18n/phonenumbers/phonenumberutil.js#L759-L766\r\n * @return {string} RegEx pattern to capture extensions.\r\n */\n\n\nfunction createExtensionPattern(purpose) {\n // We cap the maximum length of an extension based on the ambiguity of the way\n // the extension is prefixed. As per ITU, the officially allowed length for\n // extensions is actually 40, but we don't support this since we haven't seen real\n // examples and this introduces many false interpretations as the extension labels\n // are not standardized.\n\n /** @type {string} */\n var extLimitAfterExplicitLabel = '20';\n /** @type {string} */\n\n var extLimitAfterLikelyLabel = '15';\n /** @type {string} */\n\n var extLimitAfterAmbiguousChar = '9';\n /** @type {string} */\n\n var extLimitWhenNotSure = '6';\n /** @type {string} */\n\n var possibleSeparatorsBetweenNumberAndExtLabel = \"[ \\xA0\\\\t,]*\"; // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.\n\n /** @type {string} */\n\n var possibleCharsAfterExtLabel = \"[:\\\\.\\uFF0E]?[ \\xA0\\\\t,-]*\";\n /** @type {string} */\n\n var optionalExtnSuffix = \"#?\"; // Here the extension is called out in more explicit way, i.e mentioning it obvious\n // patterns like \"ext.\".\n\n /** @type {string} */\n\n var explicitExtLabels = \"(?:e?xt(?:ensi(?:o\\u0301?|\\xF3))?n?|\\uFF45?\\uFF58\\uFF54\\uFF4E?|\\u0434\\u043E\\u0431|anexo)\"; // One-character symbols that can be used to indicate an extension, and less\n // commonly used or more ambiguous extension labels.\n\n /** @type {string} */\n\n var ambiguousExtLabels = \"(?:[x\\uFF58#\\uFF03~\\uFF5E]|int|\\uFF49\\uFF4E\\uFF54)\"; // When extension is not separated clearly.\n\n /** @type {string} */\n\n var ambiguousSeparator = \"[- ]+\"; // This is the same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching\n // comma as extension label may have it.\n\n /** @type {string} */\n\n var possibleSeparatorsNumberExtLabelNoComma = \"[ \\xA0\\\\t]*\"; // \",,\" is commonly used for auto dialling the extension when connected. First\n // comma is matched through possibleSeparatorsBetweenNumberAndExtLabel, so we do\n // not repeat it here. Semi-colon works in Iphone and Android also to pop up a\n // button with the extension number following.\n\n /** @type {string} */\n\n var autoDiallingAndExtLabelsFound = \"(?:,{2}|;)\";\n /** @type {string} */\n\n var rfcExtn = RFC3966_EXTN_PREFIX + getExtensionDigitsPattern(extLimitAfterExplicitLabel);\n /** @type {string} */\n\n var explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterExplicitLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix;\n /** @type {string} */\n\n var americanStyleExtnWithSuffix = ambiguousSeparator + getExtensionDigitsPattern(extLimitWhenNotSure) + \"#\";\n /** @type {string} */\n\n var autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterLikelyLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + \"(?:,)+\" + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix; // The first regular expression covers RFC 3966 format, where the extension is added\n // using \";ext=\". The second more generic where extension is mentioned with explicit\n // labels like \"ext:\". In both the above cases we allow more numbers in extension than\n // any other extension labels. The third one captures when single character extension\n // labels or less commonly used labels are used. In such cases we capture fewer\n // extension digits in order to reduce the chance of falsely interpreting two\n // numbers beside each other as a number + extension. The fourth one covers the\n // special case of American numbers where the extension is written with a hash\n // at the end, such as \"- 503#\". The fifth one is exclusively for extension\n // autodialling formats which are used when dialling and in this case we accept longer\n // extensions. The last one is more liberal on the number of commas that acts as\n // extension labels, so we have a strict cap on the number of digits in such extensions.\n\n return rfcExtn + \"|\" + explicitExtn + \"|\" + ambiguousExtn + \"|\" + americanStyleExtnWithSuffix + \"|\" + autoDiallingExtn + \"|\" + onlyCommasExtn;\n}\n//# sourceMappingURL=createExtensionPattern.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/isViablePhoneNumber.js\n\n // Regular expression of viable phone numbers. This is location independent.\n// Checks we have at least three leading digits, and only valid punctuation,\n// alpha characters and digits in the phone number. Does not include extension\n// data. The symbol 'x' is allowed here as valid punctuation since it is often\n// used as a placeholder for carrier codes, for example in Brazilian phone\n// numbers. We also allow multiple '+' characters at the start.\n//\n// Corresponds to the following:\n// [digits]{minLengthNsn}|\n// plus_sign*\n// (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*\n//\n// The first reg-ex is to allow short numbers (two digits long) to be parsed if\n// they are entered as \"15\" etc, but only if there is no punctuation in them.\n// The second expression restricts the number of digits to three or more, but\n// then allows them to be in international form, and to have alpha-characters\n// and punctuation. We split up the two reg-exes here and combine them when\n// creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it\n// with ^ and append $ to each branch.\n//\n// \"Note VALID_PUNCTUATION starts with a -,\n// so must be the first in the range\" (c) Google devs.\n// (wtf did they mean by saying that; probably nothing)\n//\n\nvar MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + VALID_DIGITS + ']{' + MIN_LENGTH_FOR_NSN + '}'; //\n// And this is the second reg-exp:\n// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)\n//\n\nvar VALID_PHONE_NUMBER = '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){3,}' + '[' + VALID_PUNCTUATION + VALID_DIGITS + ']*'; // This regular expression isn't present in Google's `libphonenumber`\n// and is only used to determine whether the phone number being input\n// is too short for it to even consider it a \"valid\" number.\n// This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nvar VALID_PHONE_NUMBER_START_REG_EXP = new RegExp('^' + '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){1,2}' + '$', 'i');\nvar VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER + // Phone number extensions\n'(?:' + createExtensionPattern() + ')?'; // The combined regular expression for valid phone numbers:\n//\n\nvar VALID_PHONE_NUMBER_PATTERN = new RegExp( // Either a short two-digit-only phone number\n'^' + MIN_LENGTH_PHONE_NUMBER_PATTERN + '$' + '|' + // Or a longer fully parsed phone number (min 3 characters)\n'^' + VALID_PHONE_NUMBER_WITH_EXTENSION + '$', 'i'); // Checks to see if the string of characters could possibly be a phone number at\n// all. At the moment, checks to see that the string begins with at least 2\n// digits, ignoring any punctuation commonly found in phone numbers. This method\n// does not require the number to be normalized in advance - but does assume\n// that leading non-number symbols have been removed, such as by the method\n// `extract_possible_number`.\n//\n\nfunction isViablePhoneNumber(number) {\n return number.length >= MIN_LENGTH_FOR_NSN && VALID_PHONE_NUMBER_PATTERN.test(number);\n} // This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nfunction isViablePhoneNumberStart(number) {\n return VALID_PHONE_NUMBER_START_REG_EXP.test(number);\n}\n//# sourceMappingURL=isViablePhoneNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/RFC3966.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || RFC3966_unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { 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\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RFC3966_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 = RFC3966_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.\"); }\n\nfunction RFC3966_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return RFC3966_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 RFC3966_arrayLikeToArray(o, minLen); }\n\nfunction RFC3966_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 // https://www.ietf.org/rfc/rfc3966.txt\n\n/**\r\n * @param {string} text - Phone URI (RFC 3966).\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\nfunction parseRFC3966(text) {\n var number;\n var ext; // Replace \"tel:\" with \"tel=\" for parsing convenience.\n\n text = text.replace(/^tel:/, 'tel=');\n\n for (var _iterator = RFC3966_createForOfIteratorHelperLoose(text.split(';')), _step; !(_step = _iterator()).done;) {\n var part = _step.value;\n\n var _part$split = part.split('='),\n _part$split2 = _slicedToArray(_part$split, 2),\n name = _part$split2[0],\n value = _part$split2[1];\n\n switch (name) {\n case 'tel':\n number = value;\n break;\n\n case 'ext':\n ext = value;\n break;\n\n case 'phone-context':\n // Only \"country contexts\" are supported.\n // \"Domain contexts\" are ignored.\n if (value[0] === '+') {\n number = value + number;\n }\n\n break;\n }\n } // If the phone number is not viable, then abort.\n\n\n if (!isViablePhoneNumber(number)) {\n return {};\n }\n\n var result = {\n number: number\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * @param {object} - `{ ?number, ?extension }`.\r\n * @return {string} Phone URI (RFC 3966).\r\n */\n\nfunction formatRFC3966(_ref) {\n var number = _ref.number,\n ext = _ref.ext;\n\n if (!number) {\n return '';\n }\n\n if (number[0] !== '+') {\n throw new Error(\"\\\"formatRFC3966()\\\" expects \\\"number\\\" to be in E.164 format.\");\n }\n\n return \"tel:\".concat(number).concat(ext ? ';ext=' + ext : '');\n}\n//# sourceMappingURL=RFC3966.js.map\n;// ../../../node_modules/libphonenumber-js/es6/format.js\nfunction format_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 = format_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.\"); }\n\nfunction format_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return format_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 format_arrayLikeToArray(o, minLen); }\n\nfunction format_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\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\n\n\n\n\n\nvar DEFAULT_OPTIONS = {\n formatExtension: function formatExtension(formattedNumber, extension, metadata) {\n return \"\".concat(formattedNumber).concat(metadata.ext()).concat(extension);\n }\n};\n/**\r\n * Formats a phone number.\r\n *\r\n * format(phoneNumberInstance, 'INTERNATIONAL', { ..., v2: true }, metadata)\r\n * format(phoneNumberInstance, 'NATIONAL', { ..., v2: true }, metadata)\r\n *\r\n * format({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL', { ... }, metadata)\r\n * format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {string} format\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\nfunction formatNumber(input, format, options, metadata) {\n // Apply default options.\n if (options) {\n options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);\n } else {\n options = DEFAULT_OPTIONS;\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n\n if (input.country && input.country !== '001') {\n // Validate `input.country`.\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else if (input.countryCallingCode) {\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else return input.phone || '';\n\n var countryCallingCode = metadata.countryCallingCode();\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // This variable should have been declared inside `case`s\n // but Babel has a bug and it says \"duplicate variable declaration\".\n\n var number;\n\n switch (format) {\n case 'NATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return '';\n }\n\n number = formatNationalNumber(nationalNumber, input.carrierCode, 'NATIONAL', metadata, options);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'INTERNATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return \"+\".concat(countryCallingCode);\n }\n\n number = formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata, options);\n number = \"+\".concat(countryCallingCode, \" \").concat(number);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'E.164':\n // `E.164` doesn't define \"phone number extensions\".\n return \"+\".concat(countryCallingCode).concat(nationalNumber);\n\n case 'RFC3966':\n return formatRFC3966({\n number: \"+\".concat(countryCallingCode).concat(nationalNumber),\n ext: input.ext\n });\n // For reference, here's Google's IDD formatter:\n // https://github.com/google/libphonenumber/blob/32719cf74e68796788d1ca45abc85dcdc63ba5b9/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L1546\n // Not saying that this IDD formatter replicates it 1:1, but it seems to work.\n // Who would even need to format phone numbers in IDD format anyway?\n\n case 'IDD':\n if (!options.fromCountry) {\n return; // throw new Error('`fromCountry` option not passed for IDD-prefixed formatting.')\n }\n\n var formattedNumber = formatIDD(nationalNumber, input.carrierCode, countryCallingCode, options.fromCountry, metadata);\n return addExtension(formattedNumber, input.ext, metadata, options.formatExtension);\n\n default:\n throw new Error(\"Unknown \\\"format\\\" argument passed to \\\"formatNumber()\\\": \\\"\".concat(format, \"\\\"\"));\n }\n}\n\nfunction formatNationalNumber(number, carrierCode, formatAs, metadata, options) {\n var format = chooseFormatForNumber(metadata.formats(), number);\n\n if (!format) {\n return number;\n }\n\n return formatNationalNumberUsingFormat(number, format, {\n useInternationalFormat: formatAs === 'INTERNATIONAL',\n withNationalPrefix: format.nationalPrefixIsOptionalWhenFormattingInNationalFormat() && options && options.nationalPrefix === false ? false : true,\n carrierCode: carrierCode,\n metadata: metadata\n });\n}\n\nfunction chooseFormatForNumber(availableFormats, nationalNnumber) {\n for (var _iterator = format_createForOfIteratorHelperLoose(availableFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n\n // Validate leading digits.\n // The test case for \"else path\" could be found by searching for\n // \"format.leadingDigitsPatterns().length === 0\".\n if (format.leadingDigitsPatterns().length > 0) {\n // The last leading_digits_pattern is used here, as it is the most detailed\n var lastLeadingDigitsPattern = format.leadingDigitsPatterns()[format.leadingDigitsPatterns().length - 1]; // If leading digits don't match then move on to the next phone number format\n\n if (nationalNnumber.search(lastLeadingDigitsPattern) !== 0) {\n continue;\n }\n } // Check that the national number matches the phone number format regular expression\n\n\n if (matchesEntirely(nationalNnumber, format.pattern())) {\n return format;\n }\n }\n}\n\nfunction addExtension(formattedNumber, ext, metadata, formatExtension) {\n return ext ? formatExtension(formattedNumber, ext, metadata) : formattedNumber;\n}\n\nfunction formatIDD(nationalNumber, carrierCode, countryCallingCode, fromCountry, metadata) {\n var fromCountryCallingCode = (0,es6_metadata.getCountryCallingCode)(fromCountry, metadata.metadata); // When calling within the same country calling code.\n\n if (fromCountryCallingCode === countryCallingCode) {\n var formattedNumber = formatNationalNumber(nationalNumber, carrierCode, 'NATIONAL', metadata); // For NANPA regions, return the national format for these regions\n // but prefix it with the country calling code.\n\n if (countryCallingCode === '1') {\n return countryCallingCode + ' ' + formattedNumber;\n } // If regions share a country calling code, the country calling code need\n // not be dialled. This also applies when dialling within a region, so this\n // if clause covers both these cases. Technically this is the case for\n // dialling from La Reunion to other overseas departments of France (French\n // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover\n // this edge case for now and for those cases return the version including\n // country calling code. Details here:\n // http://www.petitfute.com/voyage/225-info-pratiques-reunion\n //\n\n\n return formattedNumber;\n }\n\n var iddPrefix = getIddPrefix(fromCountry, undefined, metadata.metadata);\n\n if (iddPrefix) {\n return \"\".concat(iddPrefix, \" \").concat(countryCallingCode, \" \").concat(formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata));\n }\n}\n//# sourceMappingURL=format.js.map\n;// ../../../node_modules/libphonenumber-js/es6/PhoneNumber.js\nfunction PhoneNumber_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction PhoneNumber_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? PhoneNumber_ownKeys(Object(source), !0).forEach(function (key) { PhoneNumber_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : PhoneNumber_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction PhoneNumber_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n // import checkNumberLength from './helpers/checkNumberLength.js'\n\n\n\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar PhoneNumber = /*#__PURE__*/function () {\n /**\r\n * @param {string} countryOrCountryCallingCode\r\n * @param {string} nationalNumber\r\n * @param {object} metadata — Metadata JSON\r\n * @return {PhoneNumber}\r\n */\n function PhoneNumber(countryOrCountryCallingCode, nationalNumber, metadata) {\n _classCallCheck(this, PhoneNumber);\n\n if (!countryOrCountryCallingCode) {\n throw new TypeError('`country` or `countryCallingCode` not passed');\n }\n\n if (!nationalNumber) {\n throw new TypeError('`nationalNumber` not passed');\n }\n\n if (!metadata) {\n throw new TypeError('`metadata` not passed');\n }\n\n var _getCountryAndCountry = getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadata),\n country = _getCountryAndCountry.country,\n countryCallingCode = _getCountryAndCountry.countryCallingCode;\n\n this.country = country;\n this.countryCallingCode = countryCallingCode;\n this.nationalNumber = nationalNumber;\n this.number = '+' + this.countryCallingCode + this.nationalNumber; // Exclude `metadata` property output from `PhoneNumber.toString()`\n // so that it doesn't clutter the console output of Node.js.\n // Previously, when Node.js did `console.log(new PhoneNumber(...))`,\n // it would output the whole internal structure of the `metadata` object.\n\n this.getMetadata = function () {\n return metadata;\n };\n }\n\n _createClass(PhoneNumber, [{\n key: \"setExt\",\n value: function setExt(ext) {\n this.ext = ext;\n }\n }, {\n key: \"getPossibleCountries\",\n value: function getPossibleCountries() {\n if (this.country) {\n return [this.country];\n }\n\n return getPossibleCountriesForNumber(this.countryCallingCode, this.nationalNumber, this.getMetadata());\n }\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n return isPossiblePhoneNumber(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return isValidNumber(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"isNonGeographic\",\n value: function isNonGeographic() {\n var metadata = new es6_metadata[\"default\"](this.getMetadata());\n return metadata.isNonGeographicCallingCode(this.countryCallingCode);\n }\n }, {\n key: \"isEqual\",\n value: function isEqual(phoneNumber) {\n return this.number === phoneNumber.number && this.ext === phoneNumber.ext;\n } // This function was originally meant to be an equivalent for `validatePhoneNumberLength()`,\n // but later it was found out that it doesn't include the possible `TOO_SHORT` result\n // returned from `parsePhoneNumberWithError()` in the original `validatePhoneNumberLength()`,\n // so eventually I simply commented out this method from the `PhoneNumber` class\n // and just left the `validatePhoneNumberLength()` function, even though that one would require\n // and additional step to also validate the actual country / calling code of the phone number.\n // validateLength() {\n // \tconst metadata = new Metadata(this.getMetadata())\n // \tmetadata.selectNumberingPlan(this.countryCallingCode)\n // \tconst result = checkNumberLength(this.nationalNumber, metadata)\n // \tif (result !== 'IS_POSSIBLE') {\n // \t\treturn result\n // \t}\n // }\n\n }, {\n key: \"getType\",\n value: function getType() {\n return getNumberType(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"format\",\n value: function format(_format, options) {\n return formatNumber(this, _format, options ? PhoneNumber_objectSpread(PhoneNumber_objectSpread({}, options), {}, {\n v2: true\n }) : {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"formatNational\",\n value: function formatNational(options) {\n return this.format('NATIONAL', options);\n }\n }, {\n key: \"formatInternational\",\n value: function formatInternational(options) {\n return this.format('INTERNATIONAL', options);\n }\n }, {\n key: \"getURI\",\n value: function getURI(options) {\n return this.format('RFC3966', options);\n }\n }]);\n\n return PhoneNumber;\n}();\n\n\n\nvar isCountryCode = function isCountryCode(value) {\n return /^[A-Z]{2}$/.test(value);\n};\n\nfunction getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadataJson) {\n var country;\n var countryCallingCode;\n var metadata = new es6_metadata[\"default\"](metadataJson); // If country code is passed then derive `countryCallingCode` from it.\n // Also store the country code as `.country`.\n\n if (isCountryCode(countryOrCountryCallingCode)) {\n country = countryOrCountryCallingCode;\n metadata.selectNumberingPlan(country);\n countryCallingCode = metadata.countryCallingCode();\n } else {\n countryCallingCode = countryOrCountryCallingCode;\n /* istanbul ignore if */\n\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(countryCallingCode)) {\n country = '001';\n }\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode\n };\n}\n//# sourceMappingURL=PhoneNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/getExampleNumber.js\n\nfunction getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new PhoneNumber(country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map\n;// ../../../node_modules/libphonenumber-js/min/exports/getExampleNumber.js\n\r\n\r\n\r\nfunction getExampleNumber_getExampleNumber() {\r\n\treturn (0,withMetadataArgument[\"default\"])(getExampleNumber, arguments)\r\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL21pbi9leHBvcnRzL2dldEV4YW1wbGVOdW1iZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDhEQUE4RCxpRkFBaUYsZ0RBQWdELHdIQUF3SCxnQkFBZ0IsV0FBVyxxQkFBcUIsNEJBQTRCLGNBQWMsU0FBUyxtQ0FBbUM7O0FBRTdiLGtEQUFrRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNEOztBQUU3Uyx1Q0FBdUMsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUV6SztBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsWUFBWSxHQUFHO0FBQ2YsWUFBWTtBQUNaO0FBQ2U7QUFDZjs7QUFFQSxrRUFBa0UsNEJBQTRCO0FBQzlGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLEdBQUc7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7QUNoQzJDO0FBQzVCO0FBQ2Y7QUFDQSxFQUFFO0FBQ0Y7O0FBRU87QUFDUCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlHQUFpRztBQUNqRzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFdBQVcsbURBQW1ELCtCQUErQjtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLDZDQUE2QztBQUM3QztBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsNkM7O0FD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LE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQVE7QUFDakM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGFBQWEsWUFBWSwwQkFBMEIsd0JBQWEsQ0FBQyx3QkFBYSxHQUFHLGNBQWM7QUFDL0Y7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFaUM7O0FBRWxDO0FBQ0EsaUJBQWlCLEVBQUU7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUFRLGdCQUFnQjtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUM7O0FDckwyQztBQUM1QjtBQUNmO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQSw0Qzs7QUNONEQ7QUFDZTtBQUMzRTtBQUNPLFNBQVMsaUNBQWdCO0FBQ2hDLFFBQVEsbUNBQW9CLENBQUMsZ0JBQWlCO0FBQzlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9tZXJnZUFycmF5cy5qcz80Y2EzIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanM/YjRjMSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9pc1Bvc3NpYmxlLmpzP2JmYjAiLCJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9tYXRjaGVzRW50aXJlbHkuanM/OWI1NSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2dldE51bWJlclR5cGUuanM/MjAwOCIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9pc1ZhbGlkLmpzPzE4N2UiLCJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9nZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlci5qcz8wNDVjIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2NvbnN0YW50cy5qcz9lMjNmIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUuanM/YzRkZSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanM/OWFjMCIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2dldElkZFByZWZpeC5qcz83OTRmIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvZXh0ZW5zaW9uL2NyZWF0ZUV4dGVuc2lvblBhdHRlcm4uanM/MzYzYSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2lzVmlhYmxlUGhvbmVOdW1iZXIuanM/NzU1YSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL1JGQzM5NjYuanM/ODBmOSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9mb3JtYXQuanM/N2QwMyIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9QaG9uZU51bWJlci5qcz80ZTMyIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2dldEV4YW1wbGVOdW1iZXIuanM/NDBjZSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL21pbi9leHBvcnRzL2dldEV4YW1wbGVOdW1iZXIuanM/MzAyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyoqXHJcbiAqIE1lcmdlcyB0d28gYXJyYXlzLlxyXG4gKiBAcGFyYW0gIHsqfSBhXHJcbiAqIEBwYXJhbSAgeyp9IGJcclxuICogQHJldHVybiB7Kn1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUFycmF5cyhhLCBiKSB7XG4gIHZhciBtZXJnZWQgPSBhLnNsaWNlKCk7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShiKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgZWxlbWVudCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgaWYgKGEuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgIG1lcmdlZC5wdXNoKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7IC8vIEVTNiB2ZXJzaW9uLCByZXF1aXJlcyBTZXQgcG9seWZpbGwuXG4gIC8vIGxldCBtZXJnZWQgPSBuZXcgU2V0KGEpXG4gIC8vIGZvciAoY29uc3QgZWxlbWVudCBvZiBiKSB7XG4gIC8vIFx0bWVyZ2VkLmFkZChpKVxuICAvLyB9XG4gIC8vIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCkuc29ydCgoYSwgYikgPT4gYSAtIGIpXG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZUFycmF5cy5qcy5tYXAiLCJpbXBvcnQgbWVyZ2VBcnJheXMgZnJvbSAnLi9tZXJnZUFycmF5cy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjaGVja051bWJlckxlbmd0aChuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgcmV0dXJuIGNoZWNrTnVtYmVyTGVuZ3RoRm9yVHlwZShuYXRpb25hbE51bWJlciwgdW5kZWZpbmVkLCBtZXRhZGF0YSk7XG59IC8vIENoZWNrcyB3aGV0aGVyIGEgbnVtYmVyIGlzIHBvc3NpYmxlIGZvciB0aGUgY291bnRyeSBiYXNlZCBvbiBpdHMgbGVuZ3RoLlxuLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUgXCJuZXdcIiBtZXRhZGF0YSB3aGljaCBoYXMgXCJwb3NzaWJsZSBsZW5ndGhzXCIuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja051bWJlckxlbmd0aEZvclR5cGUobmF0aW9uYWxOdW1iZXIsIHR5cGUsIG1ldGFkYXRhKSB7XG4gIHZhciB0eXBlX2luZm8gPSBtZXRhZGF0YS50eXBlKHR5cGUpOyAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIFwiPHBvc3NpYmxlUGVuZ3Rocy8+XCIgc2V0IGZvciBldmVyeSB0eXBlIGVsZW1lbnQuXG4gIC8vIFRoaXMgaXMgZGVjbGFyZWQgaW4gdGhlIFhNTCBzY2hlbWEuXG4gIC8vIEZvciBzaXplIGVmZmljaWVuY3ksIHdoZXJlIGEgc3ViLWRlc2NyaXB0aW9uIChlLmcuIGZpeGVkLWxpbmUpXG4gIC8vIGhhcyB0aGUgc2FtZSBcIjxwb3NzaWJsZVBlbmd0aHMvPlwiIGFzIHRoZSBcImdlbmVyYWwgZGVzY3JpcHRpb25cIiwgdGhpcyBpcyBtaXNzaW5nLFxuICAvLyBzbyB3ZSBmYWxsIGJhY2sgdG8gdGhlIFwiZ2VuZXJhbCBkZXNjcmlwdGlvblwiLiBXaGVyZSBubyBudW1iZXJzIG9mIHRoZSB0eXBlXG4gIC8vIGV4aXN0IGF0IGFsbCwgdGhlcmUgaXMgb25lIHBvc3NpYmxlIGxlbmd0aCAoLTEpIHdoaWNoIGlzIGd1YXJhbnRlZWRcbiAgLy8gbm90IHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgYW55IHJlYWwgcGhvbmUgbnVtYmVyLlxuXG4gIHZhciBwb3NzaWJsZV9sZW5ndGhzID0gdHlwZV9pbmZvICYmIHR5cGVfaW5mby5wb3NzaWJsZUxlbmd0aHMoKSB8fCBtZXRhZGF0YS5wb3NzaWJsZUxlbmd0aHMoKTsgLy8gbGV0IGxvY2FsX2xlbmd0aHMgICAgPSB0eXBlX2luZm8gJiYgdHlwZS5wb3NzaWJsZUxlbmd0aHNMb2NhbCgpIHx8IG1ldGFkYXRhLnBvc3NpYmxlTGVuZ3Roc0xvY2FsKClcbiAgLy8gTWV0YWRhdGEgYmVmb3JlIHZlcnNpb24gYDEuMC4xOGAgZGlkbid0IGNvbnRhaW4gYHBvc3NpYmxlX2xlbmd0aHNgLlxuXG4gIGlmICghcG9zc2libGVfbGVuZ3Rocykge1xuICAgIHJldHVybiAnSVNfUE9TU0lCTEUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdGSVhFRF9MSU5FX09SX01PQklMRScpIHtcbiAgICAvLyBObyBzdWNoIGNvdW50cnkgaW4gbWV0YWRhdGEuXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghbWV0YWRhdGEudHlwZSgnRklYRURfTElORScpKSB7XG4gICAgICAvLyBUaGUgcmFyZSBjYXNlIGhhcyBiZWVuIGVuY291bnRlcmVkIHdoZXJlIG5vIGZpeGVkTGluZSBkYXRhIGlzIGF2YWlsYWJsZVxuICAgICAgLy8gKHRydWUgZm9yIHNvbWUgbm9uLWdlb2dyYXBoaWMgZW50aXRpZXMpLCBzbyB3ZSBqdXN0IGNoZWNrIG1vYmlsZS5cbiAgICAgIHJldHVybiBjaGVja051bWJlckxlbmd0aEZvclR5cGUobmF0aW9uYWxOdW1iZXIsICdNT0JJTEUnLCBtZXRhZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIG1vYmlsZV90eXBlID0gbWV0YWRhdGEudHlwZSgnTU9CSUxFJyk7XG5cbiAgICBpZiAobW9iaWxlX3R5cGUpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBtb2JpbGUgZGF0YSBpbiBpZiB0aGVyZSB3YXMgYW55LiBcIkNvbmNhdFwiIGNyZWF0ZXMgYSBuZXdcbiAgICAgIC8vIGFycmF5LCBpdCBkb2Vzbid0IGVkaXQgcG9zc2libGVfbGVuZ3RocyBpbiBwbGFjZSwgc28gd2UgZG9uJ3QgbmVlZCBhIGNvcHkuXG4gICAgICAvLyBOb3RlIHRoYXQgd2hlbiBhZGRpbmcgdGhlIHBvc3NpYmxlIGxlbmd0aHMgZnJvbSBtb2JpbGUsIHdlIGhhdmVcbiAgICAgIC8vIHRvIGFnYWluIGNoZWNrIHRoZXkgYXJlbid0IGVtcHR5IHNpbmNlIGlmIHRoZXkgYXJlIHRoaXMgaW5kaWNhdGVzXG4gICAgICAvLyB0aGV5IGFyZSB0aGUgc2FtZSBhcyB0aGUgZ2VuZXJhbCBkZXNjIGFuZCBzaG91bGQgYmUgb2J0YWluZWQgZnJvbSB0aGVyZS5cbiAgICAgIHBvc3NpYmxlX2xlbmd0aHMgPSBtZXJnZUFycmF5cyhwb3NzaWJsZV9sZW5ndGhzLCBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHMoKSk7IC8vIFRoZSBjdXJyZW50IGxpc3QgaXMgc29ydGVkOyB3ZSBuZWVkIHRvIG1lcmdlIGluIHRoZSBuZXcgbGlzdCBhbmRcbiAgICAgIC8vIHJlLXNvcnQgKGR1cGxpY2F0ZXMgYXJlIG9rYXkpLiBTb3J0aW5nIGlzbid0IHNvIGV4cGVuc2l2ZSBiZWNhdXNlXG4gICAgICAvLyB0aGUgbGlzdHMgYXJlIHZlcnkgc21hbGwuXG4gICAgICAvLyBpZiAobG9jYWxfbGVuZ3Rocykge1xuICAgICAgLy8gXHRsb2NhbF9sZW5ndGhzID0gbWVyZ2VBcnJheXMobG9jYWxfbGVuZ3RocywgbW9iaWxlX3R5cGUucG9zc2libGVMZW5ndGhzTG9jYWwoKSlcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyBcdGxvY2FsX2xlbmd0aHMgPSBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHNMb2NhbCgpXG4gICAgICAvLyB9XG4gICAgfVxuICB9IC8vIElmIHRoZSB0eXBlIGRvZXNuJ3QgZXhpc3QgdGhlbiByZXR1cm4gJ0lOVkFMSURfTEVOR1RIJy5cbiAgZWxzZSBpZiAodHlwZSAmJiAhdHlwZV9pbmZvKSB7XG4gICAgcmV0dXJuICdJTlZBTElEX0xFTkdUSCc7XG4gIH1cblxuICB2YXIgYWN0dWFsX2xlbmd0aCA9IG5hdGlvbmFsTnVtYmVyLmxlbmd0aDsgLy8gSW4gYGxpYnBob25lbnVtYmVyLWpzYCBhbGwgXCJsb2NhbC1vbmx5XCIgZm9ybWF0cyBhcmUgZHJvcHBlZCBmb3Igc2ltcGxpY2l0eS5cbiAgLy8gLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlcmUgaXMgbmV2ZXIgYW4gb3ZlcmxhcCBiZXdlZW4gdGhlIHBvc3NpYmxlIGxlbmd0aHNcbiAgLy8gLy8gYW5kIHRoZSBsb2NhbC1vbmx5IGxlbmd0aHM7IHRoaXMgaXMgY2hlY2tlZCBhdCBidWlsZCB0aW1lLlxuICAvLyBpZiAobG9jYWxfbGVuZ3RocyAmJiBsb2NhbF9sZW5ndGhzLmluZGV4T2YobmF0aW9uYWxOdW1iZXIubGVuZ3RoKSA+PSAwKVxuICAvLyB7XG4gIC8vIFx0cmV0dXJuICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJ1xuICAvLyB9XG5cbiAgdmFyIG1pbmltdW1fbGVuZ3RoID0gcG9zc2libGVfbGVuZ3Roc1swXTtcblxuICBpZiAobWluaW11bV9sZW5ndGggPT09IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ0lTX1BPU1NJQkxFJztcbiAgfVxuXG4gIGlmIChtaW5pbXVtX2xlbmd0aCA+IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ1RPT19TSE9SVCc7XG4gIH1cblxuICBpZiAocG9zc2libGVfbGVuZ3Roc1twb3NzaWJsZV9sZW5ndGhzLmxlbmd0aCAtIDFdIDwgYWN0dWFsX2xlbmd0aCkge1xuICAgIHJldHVybiAnVE9PX0xPTkcnO1xuICB9IC8vIFdlIHNraXAgdGhlIGZpcnN0IGVsZW1lbnQgc2luY2Ugd2UndmUgYWxyZWFkeSBjaGVja2VkIGl0LlxuXG5cbiAgcmV0dXJuIHBvc3NpYmxlX2xlbmd0aHMuaW5kZXhPZihhY3R1YWxfbGVuZ3RoLCAxKSA+PSAwID8gJ0lTX1BPU1NJQkxFJyA6ICdJTlZBTElEX0xFTkdUSCc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVja051bWJlckxlbmd0aC5qcy5tYXAiLCJpbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi9tZXRhZGF0YS5qcyc7XG5pbXBvcnQgY2hlY2tOdW1iZXJMZW5ndGggZnJvbSAnLi9oZWxwZXJzL2NoZWNrTnVtYmVyTGVuZ3RoLmpzJztcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBwaG9uZSBudW1iZXIgaXMgXCJwb3NzaWJsZVwiIChiYXNpY2FsbHkganVzdCBjaGVja3MgaXRzIGxlbmd0aCkuXHJcbiAqXHJcbiAqIGlzUG9zc2libGUocGhvbmVOdW1iZXJJbnN0YW5jZSwgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB7IC4uLiB9LCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZSh7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgdW5kZWZpbmVkLCBtZXRhZGF0YSlcclxuICpcclxuICogQHBhcmFtICB7b2JqZWN0fFBob25lTnVtYmVyfSBpbnB1dCDigJQgSWYgYG9wdGlvbnMudjI6IHRydWVgIGZsYWcgaXMgcGFzc2VkLCB0aGUgYGlucHV0YCBzaG91bGQgYmUgYSBgUGhvbmVOdW1iZXJgIGluc3RhbmNlLiBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHsgcGhvbmU6ICcuLi4nLCBjb3VudHJ5OiAnLi4uJyB9YC5cclxuICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Bvc3NpYmxlUGhvbmVOdW1iZXIoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gIGlmIChvcHRpb25zLnYyKSB7XG4gICAgaWYgKCFpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaG9uZSBudW1iZXIgb2JqZWN0IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWlucHV0LnBob25lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmNvdW50cnkpIHtcbiAgICAgIGlmICghbWV0YWRhdGEuaGFzQ291bnRyeShpbnB1dC5jb3VudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvdW50cnk6IFwiLmNvbmNhdChpbnB1dC5jb3VudHJ5KSk7XG4gICAgICB9XG5cbiAgICAgIG1ldGFkYXRhLmNvdW50cnkoaW5wdXQuY291bnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaG9uZSBudW1iZXIgb2JqZWN0IHBhc3NlZCcpO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSk7XG4gICAgfVxuICB9IC8vIE9sZCBtZXRhZGF0YSAoPCAxLjAuMTgpIGhhZCBubyBcInBvc3NpYmxlIGxlbmd0aFwiIGRhdGEuXG5cblxuICBpZiAobWV0YWRhdGEucG9zc2libGVMZW5ndGhzKCkpIHtcbiAgICByZXR1cm4gaXNQb3NzaWJsZU51bWJlcihpbnB1dC5waG9uZSB8fCBpbnB1dC5uYXRpb25hbE51bWJlciwgbWV0YWRhdGEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIHdhcyBhIGJ1ZyBiZXR3ZWVuIGAxLjcuMzVgIGFuZCBgMS43LjM3YCB3aGVyZSBcInBvc3NpYmxlX2xlbmd0aHNcIlxuICAgIC8vIHdlcmUgbWlzc2luZyBmb3IgXCJub24tZ2VvZ3JhcGhpY2FsXCIgbnVtYmVyaW5nIHBsYW5zLlxuICAgIC8vIEp1c3QgYXNzdW1lIHRoZSBudW1iZXIgaXMgcG9zc2libGUgaW4gc3VjaCBjYXNlczpcbiAgICAvLyBpdCdzIHVubGlrZWx5IHRoYXQgYW55b25lIGdlbmVyYXRlZCB0aGVpciBjdXN0b20gbWV0YWRhdGFcbiAgICAvLyBpbiB0aGF0IHNob3J0IHBlcmlvZCBvZiB0aW1lIChvbmUgZGF5KS5cbiAgICAvLyBUaGlzIGNvZGUgY2FuIGJlIHJlbW92ZWQgaW4gc29tZSBmdXR1cmUgbWFqb3IgdmVyc2lvbiB1cGRhdGUuXG4gICAgaWYgKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSAmJiBtZXRhZGF0YS5pc05vbkdlb2dyYXBoaWNDYWxsaW5nQ29kZShpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpKSB7XG4gICAgICAvLyBcIk5vbi1nZW9ncmFwaGljIGVudGl0aWVzXCIgZGlkJ3QgaGF2ZSBgcG9zc2libGVMZW5ndGhzYFxuICAgICAgLy8gZHVlIHRvIGEgYnVnIGluIG1ldGFkYXRhIGdlbmVyYXRpb24gcHJvY2Vzcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgXCJwb3NzaWJsZUxlbmd0aHNcIiBpbiBtZXRhZGF0YS4gUGVyaGFwcyB0aGUgbWV0YWRhdGEgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlZm9yZSB2MS4wLjE4LicpO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9zc2libGVOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gIC8vLCBpc0ludGVybmF0aW9uYWwpIHtcbiAgc3dpdGNoIChjaGVja051bWJlckxlbmd0aChuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpKSB7XG4gICAgY2FzZSAnSVNfUE9TU0lCTEUnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gVGhpcyBsaWJyYXJ5IGlnbm9yZXMgXCJsb2NhbC1vbmx5XCIgcGhvbmUgbnVtYmVycyAoZm9yIHNpbXBsaWNpdHkpLlxuICAgIC8vIFNlZSB0aGUgcmVhZG1lIGZvciBtb3JlIGluZm8gb24gd2hhdCBhcmUgXCJsb2NhbC1vbmx5XCIgcGhvbmUgbnVtYmVycy5cbiAgICAvLyBjYXNlICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJzpcbiAgICAvLyBcdHJldHVybiAhaXNJbnRlcm5hdGlvbmFsXG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Bvc3NpYmxlLmpzLm1hcCIsIi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZW50aXJlIGlucHV0IHNlcXVlbmNlIGNhbiBiZSBtYXRjaGVkXHJcbiAqIGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogQHJldHVybiB7Ym9vbGVhbn1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaGVzRW50aXJlbHkodGV4dCwgcmVndWxhcl9leHByZXNzaW9uKSB7XG4gIC8vIElmIGFzc2lnbmluZyB0aGUgYCcnYCBkZWZhdWx0IHZhbHVlIGlzIG1vdmVkIHRvIHRoZSBhcmd1bWVudHMgYWJvdmUsXG4gIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuICB0ZXh0ID0gdGV4dCB8fCAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJ14oPzonICsgcmVndWxhcl9leHByZXNzaW9uICsgJykkJykudGVzdCh0ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGNoZXNFbnRpcmVseS5qcy5tYXAiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4uL21ldGFkYXRhLmpzJztcbmltcG9ydCBtYXRjaGVzRW50aXJlbHkgZnJvbSAnLi9tYXRjaGVzRW50aXJlbHkuanMnO1xudmFyIE5PTl9GSVhFRF9MSU5FX1BIT05FX1RZUEVTID0gWydNT0JJTEUnLCAnUFJFTUlVTV9SQVRFJywgJ1RPTExfRlJFRScsICdTSEFSRURfQ09TVCcsICdWT0lQJywgJ1BFUlNPTkFMX05VTUJFUicsICdQQUdFUicsICdVQU4nLCAnVk9JQ0VNQUlMJ107IC8vIEZpbmRzIG91dCBuYXRpb25hbCBwaG9uZSBudW1iZXIgdHlwZSAoZml4ZWQgbGluZSwgbW9iaWxlLCBldGMpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE51bWJlclR5cGUoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8vIElmIGFzc2lnbmluZyB0aGUgYHt9YCBkZWZhdWx0IHZhbHVlIGlzIG1vdmVkIHRvIHRoZSBhcmd1bWVudHMgYWJvdmUsXG4gIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gV2hlbiBgcGFyc2UoKWAgcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qg4oCUIGB7fWAg4oCUXG4gIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgcGhvbmUgbnVtYmVyIGlzIG1hbGZvcm1lZCxcbiAgLy8gc28gaXQgY2FuJ3QgcG9zc2libHkgYmUgdmFsaWQuXG5cbiAgaWYgKCFpbnB1dC5jb3VudHJ5ICYmICFpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeSwgaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gb3B0aW9ucy52MiA/IGlucHV0Lm5hdGlvbmFsTnVtYmVyIDogaW5wdXQucGhvbmU7IC8vIFRoZSBmb2xsb3dpbmcgaXMgY29weS1wYXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZnVuY3Rpb246XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvM2VhNTQ3ZDRmYmFhMmQwYjY3NTg4OTA0ZGZhNWQzZjI1NTdjMjdmZi9qYXZhc2NyaXB0L2kxOG4vcGhvbmVudW1iZXJzL3Bob25lbnVtYmVydXRpbC5qcyNMMjgzNVxuICAvLyBJcyB0aGlzIG5hdGlvbmFsIG51bWJlciBldmVuIHZhbGlkIGZvciB0aGlzIGNvdW50cnlcblxuICBpZiAoIW1hdGNoZXNFbnRpcmVseShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEubmF0aW9uYWxOdW1iZXJQYXR0ZXJuKCkpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIElzIGl0IGZpeGVkIGxpbmUgbnVtYmVyXG5cblxuICBpZiAoaXNOdW1iZXJUeXBlRXF1YWxUbyhuYXRpb25hbE51bWJlciwgJ0ZJWEVEX0xJTkUnLCBtZXRhZGF0YSkpIHtcbiAgICAvLyBCZWNhdXNlIGR1cGxpY2F0ZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSByZW1vdmVkXG4gICAgLy8gdG8gcmVkdWNlIG1ldGFkYXRhIHNpemUsIGlmIFwibW9iaWxlXCIgcGF0dGVybiBpcyBcIlwiXG4gICAgLy8gdGhlbiBpdCBtZWFucyBpdCB3YXMgcmVtb3ZlZCBkdWUgdG8gYmVpbmcgYSBkdXBsaWNhdGUgb2YgdGhlIGZpeGVkLWxpbmUgcGF0dGVybi5cbiAgICAvL1xuICAgIGlmIChtZXRhZGF0YS50eXBlKCdNT0JJTEUnKSAmJiBtZXRhZGF0YS50eXBlKCdNT0JJTEUnKS5wYXR0ZXJuKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJ0ZJWEVEX0xJTkVfT1JfTU9CSUxFJztcbiAgICB9IC8vIGBNT0JJTEVgIHR5cGUgcGF0dGVybiBpc24ndCBpbmNsdWRlZCBpZiBpdCBtYXRjaGVkIGBGSVhFRF9MSU5FYCBvbmUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIGZvciBcIlVTXCIgY291bnRyeS5cbiAgICAvLyBPbGQgbWV0YWRhdGEgKDwgYDEuMC4xOGApIGhhZCBhIHNwZWNpZmljIFwidHlwZXNcIiBkYXRhIHN0cnVjdHVyZVxuICAgIC8vIHRoYXQgaGFwcGVuZWQgdG8gYmUgYHVuZGVmaW5lZGAgZm9yIGBNT0JJTEVgIGluIHRoYXQgY2FzZS5cbiAgICAvLyBOZXdlciBtZXRhZGF0YSAoPj0gYDEuMC4xOGApIGhhcyBhbm90aGVyIGRhdGEgc3RydWN0dXJlIHRoYXQgaXNcbiAgICAvLyBub3QgYHVuZGVmaW5lZGAgZm9yIGBNT0JJTEVgIGluIHRoYXQgY2FzZSAoaXQncyBqdXN0IGFuIGVtcHR5IGFycmF5KS5cbiAgICAvLyBTbyB0aGlzIGBpZmAgaXMganVzdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgbWV0YWRhdGEuXG5cblxuICAgIGlmICghbWV0YWRhdGEudHlwZSgnTU9CSUxFJykpIHtcbiAgICAgIHJldHVybiAnRklYRURfTElORV9PUl9NT0JJTEUnO1xuICAgIH0gLy8gQ2hlY2sgaWYgdGhlIG51bWJlciBoYXBwZW5zIHRvIHF1YWxpZnkgYXMgYm90aCBmaXhlZCBsaW5lIGFuZCBtb2JpbGUuXG4gICAgLy8gKG5vIHN1Y2ggY291bnRyeSBpbiB0aGUgbWluaW1hbCBtZXRhZGF0YSBzZXQpXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuXG4gICAgaWYgKGlzTnVtYmVyVHlwZUVxdWFsVG8obmF0aW9uYWxOdW1iZXIsICdNT0JJTEUnLCBtZXRhZGF0YSkpIHtcbiAgICAgIHJldHVybiAnRklYRURfTElORV9PUl9NT0JJTEUnO1xuICAgIH1cblxuICAgIHJldHVybiAnRklYRURfTElORSc7XG4gIH1cblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKE5PTl9GSVhFRF9MSU5FX1BIT05FX1RZUEVTKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgdHlwZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgaWYgKGlzTnVtYmVyVHlwZUVxdWFsVG8obmF0aW9uYWxOdW1iZXIsIHR5cGUsIG1ldGFkYXRhKSkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJUeXBlRXF1YWxUbyhuYXRpb25hbE51bWJlciwgdHlwZSwgbWV0YWRhdGEpIHtcbiAgdHlwZSA9IG1ldGFkYXRhLnR5cGUodHlwZSk7XG5cbiAgaWYgKCF0eXBlIHx8ICF0eXBlLnBhdHRlcm4oKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDaGVjayBpZiBhbnkgcG9zc2libGUgbnVtYmVyIGxlbmd0aHMgYXJlIHByZXNlbnQ7XG4gIC8vIGlmIHNvLCB3ZSB1c2UgdGhlbSB0byBhdm9pZCBjaGVja2luZ1xuICAvLyB0aGUgdmFsaWRhdGlvbiBwYXR0ZXJuIGlmIHRoZXkgZG9uJ3QgbWF0Y2guXG4gIC8vIElmIHRoZXkgYXJlIGFic2VudCwgdGhpcyBtZWFucyB0aGV5IG1hdGNoXG4gIC8vIHRoZSBnZW5lcmFsIGRlc2NyaXB0aW9uLCB3aGljaCB3ZSBoYXZlXG4gIC8vIGFscmVhZHkgY2hlY2tlZCBiZWZvcmUgYSBzcGVjaWZpYyBudW1iZXIgdHlwZS5cblxuXG4gIGlmICh0eXBlLnBvc3NpYmxlTGVuZ3RocygpICYmIHR5cGUucG9zc2libGVMZW5ndGhzKCkuaW5kZXhPZihuYXRpb25hbE51bWJlci5sZW5ndGgpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVzRW50aXJlbHkobmF0aW9uYWxOdW1iZXIsIHR5cGUucGF0dGVybigpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE51bWJlclR5cGUuanMubWFwIiwiaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IG1hdGNoZXNFbnRpcmVseSBmcm9tICcuL2hlbHBlcnMvbWF0Y2hlc0VudGlyZWx5LmpzJztcbmltcG9ydCBnZXROdW1iZXJUeXBlIGZyb20gJy4vaGVscGVycy9nZXROdW1iZXJUeXBlLmpzJztcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwaG9uZSBudW1iZXIgaXMgdmFsaWQuXHJcbiAqXHJcbiAqIGlzVmFsaWQocGhvbmVOdW1iZXJJbnN0YW5jZSwgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB7IC4uLiB9LCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZSh7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgdW5kZWZpbmVkLCBtZXRhZGF0YSlcclxuICpcclxuICogSWYgdGhlIGBudW1iZXJgIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIHBhcnNlZCB0byBhbiBvYmplY3QsXHJcbiAqIGJ1dCBvbmx5IGlmIGl0IGNvbnRhaW5zIG9ubHkgdmFsaWQgcGhvbmUgbnVtYmVyIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBwdW5jdHVhdGlvbikuXHJcbiAqIElmIHRoZSBgbnVtYmVyYCBpcyBhbiBvYmplY3QsIGl0IGlzIHVzZWQgYXMgaXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgZGVmYXVsdENvdW50cnlgIGFyZ3VtZW50IGlzIHRoZSBkZWZhdWx0IGNvdW50cnkuXHJcbiAqIEkuZS4gaXQgZG9lcyBub3QgcmVzdHJpY3QgdG8ganVzdCB0aGF0IGNvdW50cnksXHJcbiAqIGUuZy4gaW4gdGhvc2UgY2FzZXMgd2hlcmUgc2V2ZXJhbCBjb3VudHJpZXMgc2hhcmVcclxuICogdGhlIHNhbWUgcGhvbmUgbnVtYmVyaW5nIHJ1bGVzIChOQU5QQSwgQnJpdGFpbiwgZXRjKS5cclxuICogRm9yIGV4YW1wbGUsIGV2ZW4gdGhvdWdoIHRoZSBudW1iZXIgYDA3NjI0IDM2OTIzMGBcclxuICogYmVsb25ncyB0byB0aGUgSXNsZSBvZiBNYW4gKFwiSU1cIiBjb3VudHJ5IGNvZGUpXHJcbiAqIGNhbGxpbmcgYGlzVmFsaWROdW1iZXIoJzA3NjI0MzY5MjMwJywgJ0dCJywgbWV0YWRhdGEpYFxyXG4gKiBzdGlsbCByZXR1cm5zIGB0cnVlYCBiZWNhdXNlIHRoZSBjb3VudHJ5IGlzIG5vdCByZXN0cmljdGVkIHRvIGBHQmAsXHJcbiAqIGl0J3MganVzdCB0aGF0IGBHQmAgaXMgdGhlIGRlZmF1bHQgb25lIGZvciB0aGUgcGhvbmUgbnVtYmVyaW5nIHJ1bGVzLlxyXG4gKiBGb3IgcmVzdHJpY3RpbmcgdGhlIGNvdW50cnkgc2VlIGBpc1ZhbGlkTnVtYmVyRm9yUmVnaW9uKClgXHJcbiAqIHRob3VnaCByZXN0cmljdGluZyBhIGNvdW50cnkgbWlnaHQgbm90IGJlIGEgZ29vZCBpZGVhLlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlaTE4bi9saWJwaG9uZW51bWJlci9ibG9iL21hc3Rlci9GQVEubWQjd2hlbi1zaG91bGQtaS11c2UtaXN2YWxpZG51bWJlcmZvcnJlZ2lvblxyXG4gKlxyXG4gKiBFeGFtcGxlczpcclxuICpcclxuICogYGBganNcclxuICogaXNWYWxpZE51bWJlcignKzc4MDA1NTUzNTM1JywgbWV0YWRhdGEpXHJcbiAqIGlzVmFsaWROdW1iZXIoJzgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNWYWxpZE51bWJlcignODgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNWYWxpZE51bWJlcih7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgbWV0YWRhdGEpXHJcbiAqIGBgYFxyXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZE51bWJlcihpbnB1dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gSWYgYXNzaWduaW5nIHRoZSBge31gIGRlZmF1bHQgdmFsdWUgaXMgbW92ZWQgdG8gdGhlIGFyZ3VtZW50cyBhYm92ZSxcbiAgLy8gY29kZSBjb3ZlcmFnZSB3b3VsZCBkZWNyZWFzZSBmb3Igc29tZSB3ZWlyZCByZWFzb24uXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeSwgaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTsgLy8gQnkgZGVmYXVsdCwgY291bnRyaWVzIG9ubHkgaGF2ZSB0eXBlIHJlZ2V4cHMgd2hlbiBpdCdzIHJlcXVpcmVkIGZvclxuICAvLyBkaXN0aW5ndWlzaGluZyBkaWZmZXJlbnQgY291bnRyaWVzIGhhdmluZyB0aGUgc2FtZSBgY291bnRyeUNhbGxpbmdDb2RlYC5cblxuICBpZiAobWV0YWRhdGEuaGFzVHlwZXMoKSkge1xuICAgIHJldHVybiBnZXROdW1iZXJUeXBlKGlucHV0LCBvcHRpb25zLCBtZXRhZGF0YS5tZXRhZGF0YSkgIT09IHVuZGVmaW5lZDtcbiAgfSAvLyBJZiB0aGVyZSBhcmUgbm8gdHlwZSByZWdleHBzIGZvciB0aGlzIGNvdW50cnkgaW4gbWV0YWRhdGEgdGhlbiB1c2VcbiAgLy8gYG5hdGlvbmFsTnVtYmVyUGF0dGVybmAgYXMgYSBcImJldHRlciB0aGFuIG5vdGhpbmdcIiByZXBsYWNlbWVudC5cblxuXG4gIHZhciBuYXRpb25hbE51bWJlciA9IG9wdGlvbnMudjIgPyBpbnB1dC5uYXRpb25hbE51bWJlciA6IGlucHV0LnBob25lO1xuICByZXR1cm4gbWF0Y2hlc0VudGlyZWx5KG5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YS5uYXRpb25hbE51bWJlclBhdHRlcm4oKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1ZhbGlkLmpzLm1hcCIsImltcG9ydCBNZXRhZGF0YSBmcm9tICcuLi9tZXRhZGF0YS5qcyc7XG4vKipcclxuICogUmV0dXJucyBhIGxpc3Qgb2YgY291bnRyaWVzIHRoYXQgdGhlIHBob25lIG51bWJlciBjb3VsZCBwb3RlbnRpYWxseSBiZWxvbmcgdG8uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY2FsbGluZ0NvZGUg4oCUIENhbGxpbmcgY29kZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuYXRpb25hbE51bWJlciDigJQgTmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIuXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGEg4oCUIE1ldGFkYXRhLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gQSBsaXN0IG9mIHBvc3NpYmxlIGNvdW50cmllcy5cclxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyKGNhbGxpbmdDb2RlLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgdmFyIF9tZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG5cbiAgdmFyIHBvc3NpYmxlQ291bnRyaWVzID0gX21ldGFkYXRhLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcblxuICBpZiAoIXBvc3NpYmxlQ291bnRyaWVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHBvc3NpYmxlQ291bnRyaWVzLmZpbHRlcihmdW5jdGlvbiAoY291bnRyeSkge1xuICAgIHJldHVybiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSkge1xuICB2YXIgX21ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhKTtcblxuICBfbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5KTtcblxuICBpZiAoX21ldGFkYXRhLm51bWJlcmluZ1BsYW4ucG9zc2libGVMZW5ndGhzKCkuaW5kZXhPZihuYXRpb25hbE51bWJlci5sZW5ndGgpID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyLmpzLm1hcCIsIi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyLlxuZXhwb3J0IHZhciBNSU5fTEVOR1RIX0ZPUl9OU04gPSAyOyAvLyBUaGUgSVRVIHNheXMgdGhlIG1heGltdW0gbGVuZ3RoIHNob3VsZCBiZSAxNSxcbi8vIGJ1dCBvbmUgY2FuIGZpbmQgbG9uZ2VyIG51bWJlcnMgaW4gR2VybWFueS5cblxuZXhwb3J0IHZhciBNQVhfTEVOR1RIX0ZPUl9OU04gPSAxNzsgLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuZXhwb3J0IHZhciBNQVhfTEVOR1RIX0NPVU5UUllfQ09ERSA9IDM7IC8vIERpZ2l0cyBhY2NlcHRlZCBpbiBwaG9uZSBudW1iZXJzXG4vLyAoYXNjaWksIGZ1bGx3aWR0aCwgYXJhYmljLWluZGljLCBhbmQgZWFzdGVybiBhcmFiaWMgZGlnaXRzKS5cblxuZXhwb3J0IHZhciBWQUxJRF9ESUdJVFMgPSBcIjAtOVxcdUZGMTAtXFx1RkYxOVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVwiOyAvLyBgREFTSEVTYCB3aWxsIGJlIHJpZ2h0IGFmdGVyIHRoZSBvcGVuaW5nIHNxdWFyZSBicmFja2V0IG9mIHRoZSBcImNoYXJhY3RlciBjbGFzc1wiXG5cbnZhciBEQVNIRVMgPSBcIi1cXHUyMDEwLVxcdTIwMTVcXHUyMjEyXFx1MzBGQ1xcdUZGMERcIjtcbnZhciBTTEFTSEVTID0gXCJcXHVGRjBGL1wiO1xudmFyIERPVFMgPSBcIlxcdUZGMEUuXCI7XG5leHBvcnQgdmFyIFdISVRFU1BBQ0UgPSBcIiBcXHhBMFxceEFEXFx1MjAwQlxcdTIwNjBcXHUzMDAwXCI7XG52YXIgQlJBQ0tFVFMgPSBcIigpXFx1RkYwOFxcdUZGMDlcXHVGRjNCXFx1RkYzRFxcXFxbXFxcXF1cIjsgLy8gZXhwb3J0IGNvbnN0IE9QRU5JTkdfQlJBQ0tFVFMgPSAnKFxcdUZGMDhcXHVGRjNCXFxcXFxcWydcblxudmFyIFRJTERFUyA9IFwiflxcdTIwNTNcXHUyMjNDXFx1RkY1RVwiOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gb2YgYWNjZXB0YWJsZSBwdW5jdHVhdGlvbiBmb3VuZCBpbiBwaG9uZSBudW1iZXJzLiBUaGlzXG4vLyBleGNsdWRlcyBwdW5jdHVhdGlvbiBmb3VuZCBhcyBhIGxlYWRpbmcgY2hhcmFjdGVyIG9ubHkuIFRoaXMgY29uc2lzdHMgb2YgZGFzaFxuLy8gY2hhcmFjdGVycywgd2hpdGUgc3BhY2UgY2hhcmFjdGVycywgZnVsbCBzdG9wcywgc2xhc2hlcywgc3F1YXJlIGJyYWNrZXRzLFxuLy8gcGFyZW50aGVzZXMgYW5kIHRpbGRlcy4gRnVsbC13aWR0aCB2YXJpYW50cyBhcmUgYWxzbyBwcmVzZW50LlxuXG5leHBvcnQgdmFyIFZBTElEX1BVTkNUVUFUSU9OID0gXCJcIi5jb25jYXQoREFTSEVTKS5jb25jYXQoU0xBU0hFUykuY29uY2F0KERPVFMpLmNvbmNhdChXSElURVNQQUNFKS5jb25jYXQoQlJBQ0tFVFMpLmNvbmNhdChUSUxERVMpO1xuZXhwb3J0IHZhciBQTFVTX0NIQVJTID0gXCIrXFx1RkYwQlwiOyAvLyBjb25zdCBMRUFESU5HX1BMVVNfQ0hBUlNfUEFUVEVSTiA9IG5ldyBSZWdFeHAoJ15bJyArIFBMVVNfQ0hBUlMgKyAnXSsnKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsImltcG9ydCB7IFZBTElEX1BVTkNUVUFUSU9OIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJzsgLy8gUmVtb3ZlcyBicmFja2V0cyBhbmQgcmVwbGFjZXMgZGFzaGVzIHdpdGggc3BhY2VzLlxuLy9cbi8vIEUuZy4gXCIoOTk5KSAxMTEtMjItMzNcIiAtPiBcIjk5OSAxMTEgMjIgMzNcIlxuLy9cbi8vIEZvciBzb21lIHJlYXNvbiBHb29nbGUncyBtZXRhZGF0YSBjb250YWlucyBgPGludGxGb3JtYXQvPmBzIHdpdGggYnJhY2tldHMgYW5kIGRhc2hlcy5cbi8vIE1lYW53aGlsZSwgdGhlcmUncyBubyBzaW5nbGUgb3BpbmlvbiBhYm91dCB1c2luZyBwdW5jdHVhdGlvbiBpbiBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnMuXG4vL1xuLy8gRm9yIGV4YW1wbGUsIEdvb2dsZSdzIGA8aW50bEZvcm1hdC8+YCBmb3IgVVNBIGlzIGArMSAyMTMtMzczLTQyNTNgLlxuLy8gQW5kIGhlcmUncyBhIHF1b3RlIGZyb20gV2lraVBlZGlhJ3MgXCJOb3J0aCBBbWVyaWNhbiBOdW1iZXJpbmcgUGxhblwiIHBhZ2U6XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob3J0aF9BbWVyaWNhbl9OdW1iZXJpbmdfUGxhblxuLy9cbi8vIFwiVGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIGZvciBhbGwgY291bnRyaWVzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIE5BTlAgaXMgMS5cbi8vIEluIGludGVybmF0aW9uYWwgZm9ybWF0LCBhbiBOQU5QIG51bWJlciBzaG91bGQgYmUgbGlzdGVkIGFzICsxIDMwMSA1NTUgMDEgMDAsXG4vLyB3aGVyZSAzMDEgaXMgYW4gYXJlYSBjb2RlIChNYXJ5bGFuZCkuXCJcbi8vXG4vLyBJIHBlcnNvbmFsbHkgcHJlZmVyIHRoZSBpbnRlcm5hdGlvbmFsIGZvcm1hdCB3aXRob3V0IGFueSBwdW5jdHVhdGlvbi5cbi8vIEZvciBleGFtcGxlLCBicmFja2V0cyBhcmUgcmVtbmFudHMgb2YgdGhlIG9sZCBhZ2UsIG1lYW5pbmcgdGhhdCB0aGVcbi8vIHBob25lIG51bWJlciBwYXJ0IGluIGJyYWNrZXRzIChzbyBjYWxsZWQgXCJhcmVhIGNvZGVcIikgY2FuIGJlIG9taXR0ZWRcbi8vIGlmIGRpYWxpbmcgd2l0aGluIHRoZSBzYW1lIFwiYXJlYVwiLlxuLy8gQW5kIGh5cGhlbnMgd2VyZSBjbGVhcmx5IGludHJvZHVjZWQgZm9yIHNwbGl0dGluZyBsb2NhbCBudW1iZXJzIGludG8gbWVtb3JpemFibGUgZ3JvdXBzLlxuLy8gRm9yIGV4YW1wbGUsIHJlbWVtYmVyaW5nIFwiNTU1MzUzNVwiIGlzIGRpZmZpY3VsdCBidXQgXCI1NTUtMzUtMzVcIiBpcyBtdWNoIHNpbXBsZXIuXG4vLyBJbWFnaW5lIGEgbWFuIHRha2luZyBhIGJ1cyBmcm9tIGhvbWUgdG8gd29yayBhbmQgc2VlaW5nIGFuIGFkIHdpdGggYSBwaG9uZSBudW1iZXIuXG4vLyBIZSBoYXMgYSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBtZW1vcml6ZSB0aGF0IG51bWJlciB1bnRpbCBpdCBwYXNzZXMgYnkuXG4vLyBJZiBpdCB3ZXJlIHNwYWNlcyBpbnN0ZWFkIG9mIGh5cGhlbnMgdGhlIG1hbiB3b3VsZG4ndCBuZWNlc3NhcmlseSBnZXQgaXQsXG4vLyBidXQgd2l0aCBoeXBoZW5zIGluc3RlYWQgb2Ygc3BhY2VzIHRoZSBncm91cGluZyBpcyBtb3JlIGV4cGxpY2l0LlxuLy8gSSBwZXJzb25hbGx5IHRoaW5rIHRoYXQgaHlwaGVucyBpbnRyb2R1Y2UgdmlzdWFsIGNsdXR0ZXIsXG4vLyBzbyBJIHByZWZlciByZXBsYWNpbmcgdGhlbSB3aXRoIHNwYWNlcyBpbiBpbnRlcm5hdGlvbmFsIG51bWJlcnMuXG4vLyBJbiB0aGUgbW9kZXJuIGFnZSBhbGwgb3V0cHV0IGlzIGRvbmUgb24gZGlzcGxheXMgd2hlcmUgc3BhY2VzIGFyZSBjbGVhcmx5IGRpc3Rpbmd1aXNoYWJsZVxuLy8gc28gaHlwaGVucyBjYW4gYmUgc2FmZWx5IHJlcGxhY2VkIHdpdGggc3BhY2VzIHdpdGhvdXQgbG9zaW5nIGFueSBsZWdpYmlsaXR5LlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUoZm9ybWF0dGVkTnVtYmVyKSB7XG4gIHJldHVybiBmb3JtYXR0ZWROdW1iZXIucmVwbGFjZShuZXcgUmVnRXhwKFwiW1wiLmNvbmNhdChWQUxJRF9QVU5DVFVBVElPTiwgXCJdK1wiKSwgJ2cnKSwgJyAnKS50cmltKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBseUludGVybmF0aW9uYWxTZXBhcmF0b3JTdHlsZS5qcy5tYXAiLCJpbXBvcnQgYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUgZnJvbSAnLi9hcHBseUludGVybmF0aW9uYWxTZXBhcmF0b3JTdHlsZS5qcyc7IC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgc2V0IHRvICQxIGJ1dCB0aGVyZSBhcmUgc29tZSBjb3VudHJpZXMgZm9yIHdoaWNoIHRoZVxuLy8gZmlyc3QgZ3JvdXAgaXMgbm90IHVzZWQgaW4gdGhlIG5hdGlvbmFsIHBhdHRlcm4gKGUuZy4gQXJnZW50aW5hKSBzbyB0aGUgJDFcbi8vIGdyb3VwIGRvZXMgbm90IG1hdGNoIGNvcnJlY3RseS4gVGhlcmVmb3JlLCB3ZSB1c2UgYFxcZGAsIHNvIHRoYXQgdGhlIGZpcnN0XG4vLyBncm91cCBhY3R1YWxseSB1c2VkIGluIHRoZSBwYXR0ZXJuIHdpbGwgYmUgbWF0Y2hlZC5cblxuZXhwb3J0IHZhciBGSVJTVF9HUk9VUF9QQVRURVJOID0gLyhcXCRcXGQpLztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQobnVtYmVyLCBmb3JtYXQsIF9yZWYpIHtcbiAgdmFyIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPSBfcmVmLnVzZUludGVybmF0aW9uYWxGb3JtYXQsXG4gICAgICB3aXRoTmF0aW9uYWxQcmVmaXggPSBfcmVmLndpdGhOYXRpb25hbFByZWZpeCxcbiAgICAgIGNhcnJpZXJDb2RlID0gX3JlZi5jYXJyaWVyQ29kZSxcbiAgICAgIG1ldGFkYXRhID0gX3JlZi5tZXRhZGF0YTtcbiAgdmFyIGZvcm1hdHRlZE51bWJlciA9IG51bWJlci5yZXBsYWNlKG5ldyBSZWdFeHAoZm9ybWF0LnBhdHRlcm4oKSksIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPyBmb3JtYXQuaW50ZXJuYXRpb25hbEZvcm1hdCgpIDogLy8gVGhpcyBsaWJyYXJ5IGRvZXNuJ3QgdXNlIGBkb21lc3RpY19jYXJyaWVyX2NvZGVfZm9ybWF0dGluZ19ydWxlYCxcbiAgLy8gYmVjYXVzZSB0aGF0IG9uZSBpcyBvbmx5IHVzZWQgd2hlbiBmb3JtYXR0aW5nIHBob25lIG51bWJlcnNcbiAgLy8gZm9yIGRpYWxpbmcgZnJvbSBhIG1vYmlsZSBwaG9uZSwgYW5kIHRoaXMgaXMgbm90IGEgZGlhbGluZyBsaWJyYXJ5LlxuICAvLyBjYXJyaWVyQ29kZSAmJiBmb3JtYXQuZG9tZXN0aWNDYXJyaWVyQ29kZUZvcm1hdHRpbmdSdWxlKClcbiAgLy8gXHQvLyBGaXJzdCwgcmVwbGFjZSB0aGUgJENDIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZGVzaXJlZCBjYXJyaWVyIGNvZGUuXG4gIC8vIFx0Ly8gVGhlbiwgcmVwbGFjZSB0aGUgJEZHIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZmlyc3QgZ3JvdXBcbiAgLy8gXHQvLyBhbmQgdGhlIGNhcnJpZXIgY29kZSBjb21iaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5LlxuICAvLyBcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0LmRvbWVzdGljQ2FycmllckNvZGVGb3JtYXR0aW5nUnVsZSgpLnJlcGxhY2UoJyRDQycsIGNhcnJpZXJDb2RlKSlcbiAgLy8gXHQ6IChcbiAgLy8gXHRcdHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpXG4gIC8vIFx0XHRcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSlcbiAgLy8gXHRcdFx0OiBmb3JtYXQuZm9ybWF0KClcbiAgLy8gXHQpXG4gIHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpID8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSkgOiBmb3JtYXQuZm9ybWF0KCkpO1xuXG4gIGlmICh1c2VJbnRlcm5hdGlvbmFsRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlKGZvcm1hdHRlZE51bWJlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVkTnVtYmVyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0TmF0aW9uYWxOdW1iZXJVc2luZ0Zvcm1hdC5qcy5tYXAiLCJpbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi4vbWV0YWRhdGEuanMnO1xuLyoqXHJcbiAqIFBhdHRlcm4gdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGRpc3Rpbmd1aXNoIHdoZXRoZXIgYSByZWdpb24gaGFzIGEgc2luZ2xlXHJcbiAqIGludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXggb3Igbm90LiBJZiBhIHJlZ2lvbiBoYXMgYSBzaW5nbGUgaW50ZXJuYXRpb25hbFxyXG4gKiBwcmVmaXggKGUuZy4gMDExIGluIFVTQSksIGl0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgdGhhdCBjb250YWluc1xyXG4gKiBhIHNlcXVlbmNlIG9mIEFTQ0lJIGRpZ2l0cywgYW5kIHBvc3NpYmx5IGEgdGlsZGUsIHdoaWNoIHNpZ25hbHMgd2FpdGluZyBmb3JcclxuICogdGhlIHRvbmUuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhdmFpbGFibGUgaW50ZXJuYXRpb25hbCBwcmVmaXhlcyBpbiBhXHJcbiAqIHJlZ2lvbiwgdGhleSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgcmVnZXggc3RyaW5nIHRoYXQgYWx3YXlzIGNvbnRhaW5zIG9uZVxyXG4gKiBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEFTQ0lJIGRpZ2l0cyBvciBhIHRpbGRlLlxyXG4gKi9cblxudmFyIFNJTkdMRV9JRERfUFJFRklYX1JFR19FWFAgPSAvXltcXGRdKyg/Olt+XFx1MjA1M1xcdTIyM0NcXHVGRjVFXVtcXGRdKyk/JC87IC8vIEZvciByZWdpb25zIHRoYXQgaGF2ZSBtdWx0aXBsZSBJREQgcHJlZml4ZXNcbi8vIGEgcHJlZmVycmVkIElERCBwcmVmaXggaXMgcmV0dXJuZWQuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldElkZFByZWZpeChjb3VudHJ5LCBjYWxsaW5nQ29kZSwgbWV0YWRhdGEpIHtcbiAgdmFyIGNvdW50cnlNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIGNvdW50cnlNZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGNvdW50cnksIGNhbGxpbmdDb2RlKTtcblxuICBpZiAoY291bnRyeU1ldGFkYXRhLmRlZmF1bHRJRERQcmVmaXgoKSkge1xuICAgIHJldHVybiBjb3VudHJ5TWV0YWRhdGEuZGVmYXVsdElERFByZWZpeCgpO1xuICB9XG5cbiAgaWYgKFNJTkdMRV9JRERfUFJFRklYX1JFR19FWFAudGVzdChjb3VudHJ5TWV0YWRhdGEuSUREUHJlZml4KCkpKSB7XG4gICAgcmV0dXJuIGNvdW50cnlNZXRhZGF0YS5JRERQcmVmaXgoKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0SWRkUHJlZml4LmpzLm1hcCIsImltcG9ydCB7IFZBTElEX0RJR0lUUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7IC8vIFRoZSBSRkMgMzk2NiBmb3JtYXQgZm9yIGV4dGVuc2lvbnMuXG5cbnZhciBSRkMzOTY2X0VYVE5fUFJFRklYID0gJztleHQ9Jztcbi8qKlxyXG4gKiBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgcGFyc2luZy4gQ3JlYXRlc1xyXG4gKiBhbiBleHByZXNzaW9uIHRoYXQgY2FwdHVyZXMgdXAgdG8gbWF4X2xlbmd0aCBkaWdpdHMuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gUmVnRXggcGF0dGVybiB0byBjYXB0dXJlIGV4dGVuc2lvbiBkaWdpdHMuXHJcbiAqL1xuXG52YXIgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybiA9IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4obWF4TGVuZ3RoKSB7XG4gIHJldHVybiBcIihbXCIuY29uY2F0KFZBTElEX0RJR0lUUywgXCJdezEsXCIpLmNvbmNhdChtYXhMZW5ndGgsIFwifSlcIik7XG59O1xuLyoqXHJcbiAqIEhlbHBlciBpbml0aWFsaXNlciBtZXRob2QgdG8gY3JlYXRlIHRoZSByZWd1bGFyLWV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaFxyXG4gKiBleHRlbnNpb25zLlxyXG4gKiBDb3B5LXBhc3RlZCBmcm9tIEdvb2dsZSdzIGBsaWJwaG9uZW51bWJlcmA6XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvYmxvYi81NWIyNjQ2ZWM5MzkzZjRkM2Q2NjYxYjljODJlZjllMjU4ZThiODI5L2phdmFzY3JpcHQvaTE4bi9waG9uZW51bWJlcnMvcGhvbmVudW1iZXJ1dGlsLmpzI0w3NTktTDc2NlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJlZ0V4IHBhdHRlcm4gdG8gY2FwdHVyZSBleHRlbnNpb25zLlxyXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25QYXR0ZXJuKHB1cnBvc2UpIHtcbiAgLy8gV2UgY2FwIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBleHRlbnNpb24gYmFzZWQgb24gdGhlIGFtYmlndWl0eSBvZiB0aGUgd2F5XG4gIC8vIHRoZSBleHRlbnNpb24gaXMgcHJlZml4ZWQuIEFzIHBlciBJVFUsIHRoZSBvZmZpY2lhbGx5IGFsbG93ZWQgbGVuZ3RoIGZvclxuICAvLyBleHRlbnNpb25zIGlzIGFjdHVhbGx5IDQwLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHNpbmNlIHdlIGhhdmVuJ3Qgc2VlbiByZWFsXG4gIC8vIGV4YW1wbGVzIGFuZCB0aGlzIGludHJvZHVjZXMgbWFueSBmYWxzZSBpbnRlcnByZXRhdGlvbnMgYXMgdGhlIGV4dGVuc2lvbiBsYWJlbHNcbiAgLy8gYXJlIG5vdCBzdGFuZGFyZGl6ZWQuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gIHZhciBleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCA9ICcyMCc7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHRMaW1pdEFmdGVyTGlrZWx5TGFiZWwgPSAnMTUnO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgZXh0TGltaXRBZnRlckFtYmlndW91c0NoYXIgPSAnOSc7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHRMaW1pdFdoZW5Ob3RTdXJlID0gJzYnO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgcG9zc2libGVTZXBhcmF0b3JzQmV0d2Vlbk51bWJlckFuZEV4dExhYmVsID0gXCJbIFxceEEwXFxcXHQsXSpcIjsgLy8gT3B0aW9uYWwgZnVsbCBzdG9wICguKSBvciBjb2xvbiwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlcy90YWJzL2NvbW1hcy5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgPSBcIls6XFxcXC5cXHVGRjBFXT9bIFxceEEwXFxcXHQsLV0qXCI7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBvcHRpb25hbEV4dG5TdWZmaXggPSBcIiM/XCI7IC8vIEhlcmUgdGhlIGV4dGVuc2lvbiBpcyBjYWxsZWQgb3V0IGluIG1vcmUgZXhwbGljaXQgd2F5LCBpLmUgbWVudGlvbmluZyBpdCBvYnZpb3VzXG4gIC8vIHBhdHRlcm5zIGxpa2UgXCJleHQuXCIuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGV4cGxpY2l0RXh0TGFiZWxzID0gXCIoPzplP3h0KD86ZW5zaSg/Om9cXHUwMzAxP3xcXHhGMykpP24/fFxcdUZGNDU/XFx1RkY1OFxcdUZGNTRcXHVGRjRFP3xcXHUwNDM0XFx1MDQzRVxcdTA0MzF8YW5leG8pXCI7IC8vIE9uZS1jaGFyYWN0ZXIgc3ltYm9scyB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4dGVuc2lvbiwgYW5kIGxlc3NcbiAgLy8gY29tbW9ubHkgdXNlZCBvciBtb3JlIGFtYmlndW91cyBleHRlbnNpb24gbGFiZWxzLlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhbWJpZ3VvdXNFeHRMYWJlbHMgPSBcIig/Olt4XFx1RkY1OCNcXHVGRjAzflxcdUZGNUVdfGludHxcXHVGRjQ5XFx1RkY0RVxcdUZGNTQpXCI7IC8vIFdoZW4gZXh0ZW5zaW9uIGlzIG5vdCBzZXBhcmF0ZWQgY2xlYXJseS5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYW1iaWd1b3VzU2VwYXJhdG9yID0gXCJbLSBdK1wiOyAvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCwgYnV0IG5vdCBtYXRjaGluZ1xuICAvLyBjb21tYSBhcyBleHRlbnNpb24gbGFiZWwgbWF5IGhhdmUgaXQuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHBvc3NpYmxlU2VwYXJhdG9yc051bWJlckV4dExhYmVsTm9Db21tYSA9IFwiWyBcXHhBMFxcXFx0XSpcIjsgLy8gXCIsLFwiIGlzIGNvbW1vbmx5IHVzZWQgZm9yIGF1dG8gZGlhbGxpbmcgdGhlIGV4dGVuc2lvbiB3aGVuIGNvbm5lY3RlZC4gRmlyc3RcbiAgLy8gY29tbWEgaXMgbWF0Y2hlZCB0aHJvdWdoIHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCwgc28gd2UgZG9cbiAgLy8gbm90IHJlcGVhdCBpdCBoZXJlLiBTZW1pLWNvbG9uIHdvcmtzIGluIElwaG9uZSBhbmQgQW5kcm9pZCBhbHNvIHRvIHBvcCB1cCBhXG4gIC8vIGJ1dHRvbiB3aXRoIHRoZSBleHRlbnNpb24gbnVtYmVyIGZvbGxvd2luZy5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYXV0b0RpYWxsaW5nQW5kRXh0TGFiZWxzRm91bmQgPSBcIig/Oix7Mn18OylcIjtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHJmY0V4dG4gPSBSRkMzOTY2X0VYVE5fUFJFRklYICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCk7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHBsaWNpdEV4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNCZXR3ZWVuTnVtYmVyQW5kRXh0TGFiZWwgKyBleHBsaWNpdEV4dExhYmVscyArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCkgKyBvcHRpb25hbEV4dG5TdWZmaXg7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhbWJpZ3VvdXNFeHRuID0gcG9zc2libGVTZXBhcmF0b3JzQmV0d2Vlbk51bWJlckFuZEV4dExhYmVsICsgYW1iaWd1b3VzRXh0TGFiZWxzICsgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgKyBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuKGV4dExpbWl0QWZ0ZXJBbWJpZ3VvdXNDaGFyKSArIG9wdGlvbmFsRXh0blN1ZmZpeDtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGFtZXJpY2FuU3R5bGVFeHRuV2l0aFN1ZmZpeCA9IGFtYmlndW91c1NlcGFyYXRvciArIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4oZXh0TGltaXRXaGVuTm90U3VyZSkgKyBcIiNcIjtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGF1dG9EaWFsbGluZ0V4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNOdW1iZXJFeHRMYWJlbE5vQ29tbWEgKyBhdXRvRGlhbGxpbmdBbmRFeHRMYWJlbHNGb3VuZCArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyTGlrZWx5TGFiZWwpICsgb3B0aW9uYWxFeHRuU3VmZml4O1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgb25seUNvbW1hc0V4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNOdW1iZXJFeHRMYWJlbE5vQ29tbWEgKyBcIig/OiwpK1wiICsgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgKyBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuKGV4dExpbWl0QWZ0ZXJBbWJpZ3VvdXNDaGFyKSArIG9wdGlvbmFsRXh0blN1ZmZpeDsgLy8gVGhlIGZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3ZlcnMgUkZDIDM5NjYgZm9ybWF0LCB3aGVyZSB0aGUgZXh0ZW5zaW9uIGlzIGFkZGVkXG4gIC8vIHVzaW5nIFwiO2V4dD1cIi4gVGhlIHNlY29uZCBtb3JlIGdlbmVyaWMgd2hlcmUgZXh0ZW5zaW9uIGlzIG1lbnRpb25lZCB3aXRoIGV4cGxpY2l0XG4gIC8vIGxhYmVscyBsaWtlIFwiZXh0OlwiLiBJbiBib3RoIHRoZSBhYm92ZSBjYXNlcyB3ZSBhbGxvdyBtb3JlIG51bWJlcnMgaW4gZXh0ZW5zaW9uIHRoYW5cbiAgLy8gYW55IG90aGVyIGV4dGVuc2lvbiBsYWJlbHMuIFRoZSB0aGlyZCBvbmUgY2FwdHVyZXMgd2hlbiBzaW5nbGUgY2hhcmFjdGVyIGV4dGVuc2lvblxuICAvLyBsYWJlbHMgb3IgbGVzcyBjb21tb25seSB1c2VkIGxhYmVscyBhcmUgdXNlZC4gSW4gc3VjaCBjYXNlcyB3ZSBjYXB0dXJlIGZld2VyXG4gIC8vIGV4dGVuc2lvbiBkaWdpdHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2YgZmFsc2VseSBpbnRlcnByZXRpbmcgdHdvXG4gIC8vIG51bWJlcnMgYmVzaWRlIGVhY2ggb3RoZXIgYXMgYSBudW1iZXIgKyBleHRlbnNpb24uIFRoZSBmb3VydGggb25lIGNvdmVycyB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlIG9mIEFtZXJpY2FuIG51bWJlcnMgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyB3cml0dGVuIHdpdGggYSBoYXNoXG4gIC8vIGF0IHRoZSBlbmQsIHN1Y2ggYXMgXCItIDUwMyNcIi4gVGhlIGZpZnRoIG9uZSBpcyBleGNsdXNpdmVseSBmb3IgZXh0ZW5zaW9uXG4gIC8vIGF1dG9kaWFsbGluZyBmb3JtYXRzIHdoaWNoIGFyZSB1c2VkIHdoZW4gZGlhbGxpbmcgYW5kIGluIHRoaXMgY2FzZSB3ZSBhY2NlcHQgbG9uZ2VyXG4gIC8vIGV4dGVuc2lvbnMuIFRoZSBsYXN0IG9uZSBpcyBtb3JlIGxpYmVyYWwgb24gdGhlIG51bWJlciBvZiBjb21tYXMgdGhhdCBhY3RzIGFzXG4gIC8vIGV4dGVuc2lvbiBsYWJlbHMsIHNvIHdlIGhhdmUgYSBzdHJpY3QgY2FwIG9uIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHN1Y2ggZXh0ZW5zaW9ucy5cblxuICByZXR1cm4gcmZjRXh0biArIFwifFwiICsgZXhwbGljaXRFeHRuICsgXCJ8XCIgKyBhbWJpZ3VvdXNFeHRuICsgXCJ8XCIgKyBhbWVyaWNhblN0eWxlRXh0bldpdGhTdWZmaXggKyBcInxcIiArIGF1dG9EaWFsbGluZ0V4dG4gKyBcInxcIiArIG9ubHlDb21tYXNFeHRuO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qcy5tYXAiLCJpbXBvcnQgeyBNSU5fTEVOR1RIX0ZPUl9OU04sIFZBTElEX0RJR0lUUywgVkFMSURfUFVOQ1RVQVRJT04sIFBMVVNfQ0hBUlMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IGNyZWF0ZUV4dGVuc2lvblBhdHRlcm4gZnJvbSAnLi9leHRlbnNpb24vY3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qcyc7IC8vICBSZWd1bGFyIGV4cHJlc3Npb24gb2YgdmlhYmxlIHBob25lIG51bWJlcnMuIFRoaXMgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4vLyAgQ2hlY2tzIHdlIGhhdmUgYXQgbGVhc3QgdGhyZWUgbGVhZGluZyBkaWdpdHMsIGFuZCBvbmx5IHZhbGlkIHB1bmN0dWF0aW9uLFxuLy8gIGFscGhhIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyBpbiB0aGUgcGhvbmUgbnVtYmVyLiBEb2VzIG5vdCBpbmNsdWRlIGV4dGVuc2lvblxuLy8gIGRhdGEuIFRoZSBzeW1ib2wgJ3gnIGlzIGFsbG93ZWQgaGVyZSBhcyB2YWxpZCBwdW5jdHVhdGlvbiBzaW5jZSBpdCBpcyBvZnRlblxuLy8gIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgY2FycmllciBjb2RlcywgZm9yIGV4YW1wbGUgaW4gQnJhemlsaWFuIHBob25lXG4vLyAgbnVtYmVycy4gV2UgYWxzbyBhbGxvdyBtdWx0aXBsZSAnKycgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQuXG4vL1xuLy8gIENvcnJlc3BvbmRzIHRvIHRoZSBmb2xsb3dpbmc6XG4vLyAgW2RpZ2l0c117bWluTGVuZ3RoTnNufXxcbi8vICBwbHVzX3NpZ24qXG4vLyAgKChbcHVuY3R1YXRpb25dfFtzdGFyXSkqW2RpZ2l0c10pezMsfShbcHVuY3R1YXRpb25dfFtzdGFyXXxbZGlnaXRzXXxbYWxwaGFdKSpcbi8vXG4vLyAgVGhlIGZpcnN0IHJlZy1leCBpcyB0byBhbGxvdyBzaG9ydCBudW1iZXJzICh0d28gZGlnaXRzIGxvbmcpIHRvIGJlIHBhcnNlZCBpZlxuLy8gIHRoZXkgYXJlIGVudGVyZWQgYXMgXCIxNVwiIGV0YywgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbm8gcHVuY3R1YXRpb24gaW4gdGhlbS5cbi8vICBUaGUgc2Vjb25kIGV4cHJlc3Npb24gcmVzdHJpY3RzIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIHRocmVlIG9yIG1vcmUsIGJ1dFxuLy8gIHRoZW4gYWxsb3dzIHRoZW0gdG8gYmUgaW4gaW50ZXJuYXRpb25hbCBmb3JtLCBhbmQgdG8gaGF2ZSBhbHBoYS1jaGFyYWN0ZXJzXG4vLyAgYW5kIHB1bmN0dWF0aW9uLiBXZSBzcGxpdCB1cCB0aGUgdHdvIHJlZy1leGVzIGhlcmUgYW5kIGNvbWJpbmUgdGhlbSB3aGVuXG4vLyAgY3JlYXRpbmcgdGhlIHJlZy1leCBWQUxJRF9QSE9ORV9OVU1CRVJfUEFUVEVSTiBpdHNlbGYgc28gd2UgY2FuIHByZWZpeCBpdFxuLy8gIHdpdGggXiBhbmQgYXBwZW5kICQgdG8gZWFjaCBicmFuY2guXG4vL1xuLy8gIFwiTm90ZSBWQUxJRF9QVU5DVFVBVElPTiBzdGFydHMgd2l0aCBhIC0sXG4vLyAgIHNvIG11c3QgYmUgdGhlIGZpcnN0IGluIHRoZSByYW5nZVwiIChjKSBHb29nbGUgZGV2cy5cbi8vICAod3RmIGRpZCB0aGV5IG1lYW4gYnkgc2F5aW5nIHRoYXQ7IHByb2JhYmx5IG5vdGhpbmcpXG4vL1xuXG52YXIgTUlOX0xFTkdUSF9QSE9ORV9OVU1CRVJfUEFUVEVSTiA9ICdbJyArIFZBTElEX0RJR0lUUyArICddeycgKyBNSU5fTEVOR1RIX0ZPUl9OU04gKyAnfSc7IC8vXG4vLyBBbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHJlZy1leHA6XG4vLyAoc2VlIE1JTl9MRU5HVEhfUEhPTkVfTlVNQkVSX1BBVFRFUk4gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHJlZy1leHApXG4vL1xuXG5leHBvcnQgdmFyIFZBTElEX1BIT05FX05VTUJFUiA9ICdbJyArIFBMVVNfQ0hBUlMgKyAnXXswLDF9JyArICcoPzonICsgJ1snICsgVkFMSURfUFVOQ1RVQVRJT04gKyAnXSonICsgJ1snICsgVkFMSURfRElHSVRTICsgJ10nICsgJyl7Myx9JyArICdbJyArIFZBTElEX1BVTkNUVUFUSU9OICsgVkFMSURfRElHSVRTICsgJ10qJzsgLy8gVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXNuJ3QgcHJlc2VudCBpbiBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgXG4vLyBhbmQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwaG9uZSBudW1iZXIgYmVpbmcgaW5wdXRcbi8vIGlzIHRvbyBzaG9ydCBmb3IgaXQgdG8gZXZlbiBjb25zaWRlciBpdCBhIFwidmFsaWRcIiBudW1iZXIuXG4vLyBUaGlzIGlzIGp1c3QgYSB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgcmVhbGx5IGludmFsaWQgcGhvbmVcbi8vIG51bWJlciBsaWtlIFwiYWJjZGVcIiBhbmQgYSB2YWxpZCBwaG9uZSBudW1iZXIgdGhhdCBhIHVzZXIgaGFzIGp1c3Rcbi8vIHN0YXJ0ZWQgaW5wdXR0aW5nLCBsaWtlIFwiKzFcIiBvciBcIjFcIjogYm90aCB0aGVzZSBjYXNlcyB3b3VsZCBiZVxuLy8gY29uc2lkZXJlZCBgTk9UX0FfTlVNQkVSYCBieSBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgLCBidXQgdGhpc1xuLy8gbGlicmFyeSBjYW4gcHJvdmlkZSBhIG1vcmUgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZSDigJQgd2hldGhlciBpdCdzXG4vLyByZWFsbHkgXCJub3QgYSBudW1iZXJcIiwgb3IgaXMgaXQganVzdCBhIHN0YXJ0IG9mIGEgdmFsaWQgcGhvbmUgbnVtYmVyLlxuXG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1NUQVJUX1JFR19FWFAgPSBuZXcgUmVnRXhwKCdeJyArICdbJyArIFBMVVNfQ0hBUlMgKyAnXXswLDF9JyArICcoPzonICsgJ1snICsgVkFMSURfUFVOQ1RVQVRJT04gKyAnXSonICsgJ1snICsgVkFMSURfRElHSVRTICsgJ10nICsgJyl7MSwyfScgKyAnJCcsICdpJyk7XG5leHBvcnQgdmFyIFZBTElEX1BIT05FX05VTUJFUl9XSVRIX0VYVEVOU0lPTiA9IFZBTElEX1BIT05FX05VTUJFUiArIC8vIFBob25lIG51bWJlciBleHRlbnNpb25zXG4nKD86JyArIGNyZWF0ZUV4dGVuc2lvblBhdHRlcm4oKSArICcpPyc7IC8vIFRoZSBjb21iaW5lZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHZhbGlkIHBob25lIG51bWJlcnM6XG4vL1xuXG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCAvLyBFaXRoZXIgYSBzaG9ydCB0d28tZGlnaXQtb25seSBwaG9uZSBudW1iZXJcbideJyArIE1JTl9MRU5HVEhfUEhPTkVfTlVNQkVSX1BBVFRFUk4gKyAnJCcgKyAnfCcgKyAvLyBPciBhIGxvbmdlciBmdWxseSBwYXJzZWQgcGhvbmUgbnVtYmVyIChtaW4gMyBjaGFyYWN0ZXJzKVxuJ14nICsgVkFMSURfUEhPTkVfTlVNQkVSX1dJVEhfRVhURU5TSU9OICsgJyQnLCAnaScpOyAvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyBjb3VsZCBwb3NzaWJseSBiZSBhIHBob25lIG51bWJlciBhdFxuLy8gYWxsLiBBdCB0aGUgbW9tZW50LCBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCBhdCBsZWFzdCAyXG4vLyBkaWdpdHMsIGlnbm9yaW5nIGFueSBwdW5jdHVhdGlvbiBjb21tb25seSBmb3VuZCBpbiBwaG9uZSBudW1iZXJzLiBUaGlzIG1ldGhvZFxuLy8gZG9lcyBub3QgcmVxdWlyZSB0aGUgbnVtYmVyIHRvIGJlIG5vcm1hbGl6ZWQgaW4gYWR2YW5jZSAtIGJ1dCBkb2VzIGFzc3VtZVxuLy8gdGhhdCBsZWFkaW5nIG5vbi1udW1iZXIgc3ltYm9scyBoYXZlIGJlZW4gcmVtb3ZlZCwgc3VjaCBhcyBieSB0aGUgbWV0aG9kXG4vLyBgZXh0cmFjdF9wb3NzaWJsZV9udW1iZXJgLlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWaWFibGVQaG9uZU51bWJlcihudW1iZXIpIHtcbiAgcmV0dXJuIG51bWJlci5sZW5ndGggPj0gTUlOX0xFTkdUSF9GT1JfTlNOICYmIFZBTElEX1BIT05FX05VTUJFUl9QQVRURVJOLnRlc3QobnVtYmVyKTtcbn0gLy8gVGhpcyBpcyBqdXN0IGEgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIHJlYWxseSBpbnZhbGlkIHBob25lXG4vLyBudW1iZXIgbGlrZSBcImFiY2RlXCIgYW5kIGEgdmFsaWQgcGhvbmUgbnVtYmVyIHRoYXQgYSB1c2VyIGhhcyBqdXN0XG4vLyBzdGFydGVkIGlucHV0dGluZywgbGlrZSBcIisxXCIgb3IgXCIxXCI6IGJvdGggdGhlc2UgY2FzZXMgd291bGQgYmVcbi8vIGNvbnNpZGVyZWQgYE5PVF9BX05VTUJFUmAgYnkgR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYCwgYnV0IHRoaXNcbi8vIGxpYnJhcnkgY2FuIHByb3ZpZGUgYSBtb3JlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2Ug4oCUIHdoZXRoZXIgaXQnc1xuLy8gcmVhbGx5IFwibm90IGEgbnVtYmVyXCIsIG9yIGlzIGl0IGp1c3QgYSBzdGFydCBvZiBhIHZhbGlkIHBob25lIG51bWJlci5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlhYmxlUGhvbmVOdW1iZXJTdGFydChudW1iZXIpIHtcbiAgcmV0dXJuIFZBTElEX1BIT05FX05VTUJFUl9TVEFSVF9SRUdfRVhQLnRlc3QobnVtYmVyKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzVmlhYmxlUGhvbmVOdW1iZXIuanMubWFwIiwiZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKF9pID09IG51bGwpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfcywgX2U7IHRyeSB7IGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCBpc1ZpYWJsZVBob25lTnVtYmVyIGZyb20gJy4vaXNWaWFibGVQaG9uZU51bWJlci5qcyc7IC8vIGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTY2LnR4dFxuXG4vKipcclxuICogQHBhcmFtICB7c3RyaW5nfSB0ZXh0IC0gUGhvbmUgVVJJIChSRkMgMzk2NikuXHJcbiAqIEByZXR1cm4ge29iamVjdH0gYHsgP251bWJlciwgP2V4dCB9YC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJGQzM5NjYodGV4dCkge1xuICB2YXIgbnVtYmVyO1xuICB2YXIgZXh0OyAvLyBSZXBsYWNlIFwidGVsOlwiIHdpdGggXCJ0ZWw9XCIgZm9yIHBhcnNpbmcgY29udmVuaWVuY2UuXG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXnRlbDovLCAndGVsPScpO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UodGV4dC5zcGxpdCgnOycpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgcGFydCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgdmFyIF9wYXJ0JHNwbGl0ID0gcGFydC5zcGxpdCgnPScpLFxuICAgICAgICBfcGFydCRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfcGFydCRzcGxpdCwgMiksXG4gICAgICAgIG5hbWUgPSBfcGFydCRzcGxpdDJbMF0sXG4gICAgICAgIHZhbHVlID0gX3BhcnQkc3BsaXQyWzFdO1xuXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICd0ZWwnOlxuICAgICAgICBudW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2V4dCc6XG4gICAgICAgIGV4dCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncGhvbmUtY29udGV4dCc6XG4gICAgICAgIC8vIE9ubHkgXCJjb3VudHJ5IGNvbnRleHRzXCIgYXJlIHN1cHBvcnRlZC5cbiAgICAgICAgLy8gXCJEb21haW4gY29udGV4dHNcIiBhcmUgaWdub3JlZC5cbiAgICAgICAgaWYgKHZhbHVlWzBdID09PSAnKycpIHtcbiAgICAgICAgICBudW1iZXIgPSB2YWx1ZSArIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG5vdCB2aWFibGUsIHRoZW4gYWJvcnQuXG5cblxuICBpZiAoIWlzVmlhYmxlUGhvbmVOdW1iZXIobnVtYmVyKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbnVtYmVyOiBudW1iZXJcbiAgfTtcblxuICBpZiAoZXh0KSB7XG4gICAgcmVzdWx0LmV4dCA9IGV4dDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcclxuICogQHBhcmFtICB7b2JqZWN0fSAtIGB7ID9udW1iZXIsID9leHRlbnNpb24gfWAuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gUGhvbmUgVVJJIChSRkMgMzk2NikuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UkZDMzk2NihfcmVmKSB7XG4gIHZhciBudW1iZXIgPSBfcmVmLm51bWJlcixcbiAgICAgIGV4dCA9IF9yZWYuZXh0O1xuXG4gIGlmICghbnVtYmVyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKG51bWJlclswXSAhPT0gJysnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiXFxcImZvcm1hdFJGQzM5NjYoKVxcXCIgZXhwZWN0cyBcXFwibnVtYmVyXFxcIiB0byBiZSBpbiBFLjE2NCBmb3JtYXQuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFwidGVsOlwiLmNvbmNhdChudW1iZXIpLmNvbmNhdChleHQgPyAnO2V4dD0nICsgZXh0IDogJycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UkZDMzk2Ni5qcy5tYXAiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLy8gVGhpcyBpcyBhIHBvcnQgb2YgR29vZ2xlIEFuZHJvaWQgYGxpYnBob25lbnVtYmVyYCdzXG4vLyBgcGhvbmVudW1iZXJ1dGlsLmpzYCBvZiBEZWNlbWJlciAzMXRoLCAyMDE4LlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2NvbW1pdHMvbWFzdGVyL2phdmFzY3JpcHQvaTE4bi9waG9uZW51bWJlcnMvcGhvbmVudW1iZXJ1dGlsLmpzXG5pbXBvcnQgbWF0Y2hlc0VudGlyZWx5IGZyb20gJy4vaGVscGVycy9tYXRjaGVzRW50aXJlbHkuanMnO1xuaW1wb3J0IGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQgZnJvbSAnLi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanMnO1xuaW1wb3J0IE1ldGFkYXRhLCB7IGdldENvdW50cnlDYWxsaW5nQ29kZSB9IGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IGdldElkZFByZWZpeCBmcm9tICcuL2hlbHBlcnMvZ2V0SWRkUHJlZml4LmpzJztcbmltcG9ydCB7IGZvcm1hdFJGQzM5NjYgfSBmcm9tICcuL2hlbHBlcnMvUkZDMzk2Ni5qcyc7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBmb3JtYXRFeHRlbnNpb246IGZ1bmN0aW9uIGZvcm1hdEV4dGVuc2lvbihmb3JtYXR0ZWROdW1iZXIsIGV4dGVuc2lvbiwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZm9ybWF0dGVkTnVtYmVyKS5jb25jYXQobWV0YWRhdGEuZXh0KCkpLmNvbmNhdChleHRlbnNpb24pO1xuICB9XG59O1xuLyoqXHJcbiAqIEZvcm1hdHMgYSBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIGZvcm1hdChwaG9uZU51bWJlckluc3RhbmNlLCAnSU5URVJOQVRJT05BTCcsIHsgLi4uLCB2MjogdHJ1ZSB9LCBtZXRhZGF0YSlcclxuICogZm9ybWF0KHBob25lTnVtYmVySW5zdGFuY2UsICdOQVRJT05BTCcsIHsgLi4uLCB2MjogdHJ1ZSB9LCBtZXRhZGF0YSlcclxuICpcclxuICogZm9ybWF0KHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCAnSU5URVJOQVRJT05BTCcsIHsgLi4uIH0sIG1ldGFkYXRhKVxyXG4gKiBmb3JtYXQoeyBwaG9uZTogJzgwMDU1NTM1MzUnLCBjb3VudHJ5OiAnUlUnIH0sICdOQVRJT05BTCcsIHVuZGVmaW5lZCwgbWV0YWRhdGEpXHJcbiAqXHJcbiAqIEBwYXJhbSAge29iamVjdHxQaG9uZU51bWJlcn0gaW5wdXQg4oCUIElmIGBvcHRpb25zLnYyOiB0cnVlYCBmbGFnIGlzIHBhc3NlZCwgdGhlIGBpbnB1dGAgc2hvdWxkIGJlIGEgYFBob25lTnVtYmVyYCBpbnN0YW5jZS4gT3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgYW4gb2JqZWN0IG9mIHNoYXBlIGB7IHBob25lOiAnLi4uJywgY291bnRyeTogJy4uLicgfWAuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gZm9ybWF0XHJcbiAqIEBwYXJhbSAge29iamVjdH0gW29wdGlvbnNdXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGFcclxuICogQHJldHVybiB7c3RyaW5nfVxyXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKGlucHV0LCBmb3JtYXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8vIEFwcGx5IGRlZmF1bHQgb3B0aW9ucy5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gREVGQVVMVF9PUFRJT05TO1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gIGlmIChpbnB1dC5jb3VudHJ5ICYmIGlucHV0LmNvdW50cnkgIT09ICcwMDEnKSB7XG4gICAgLy8gVmFsaWRhdGUgYGlucHV0LmNvdW50cnlgLlxuICAgIGlmICghbWV0YWRhdGEuaGFzQ291bnRyeShpbnB1dC5jb3VudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjb3VudHJ5OiBcIi5jb25jYXQoaW5wdXQuY291bnRyeSkpO1xuICAgIH1cblxuICAgIG1ldGFkYXRhLmNvdW50cnkoaW5wdXQuY291bnRyeSk7XG4gIH0gZWxzZSBpZiAoaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpO1xuICB9IGVsc2UgcmV0dXJuIGlucHV0LnBob25lIHx8ICcnO1xuXG4gIHZhciBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBtZXRhZGF0YS5jb3VudHJ5Q2FsbGluZ0NvZGUoKTtcbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gb3B0aW9ucy52MiA/IGlucHV0Lm5hdGlvbmFsTnVtYmVyIDogaW5wdXQucGhvbmU7IC8vIFRoaXMgdmFyaWFibGUgc2hvdWxkIGhhdmUgYmVlbiBkZWNsYXJlZCBpbnNpZGUgYGNhc2Vgc1xuICAvLyBidXQgQmFiZWwgaGFzIGEgYnVnIGFuZCBpdCBzYXlzIFwiZHVwbGljYXRlIHZhcmlhYmxlIGRlY2xhcmF0aW9uXCIuXG5cbiAgdmFyIG51bWJlcjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ05BVElPTkFMJzpcbiAgICAgIC8vIExlZ2FjeSBhcmd1bWVudCBzdXBwb3J0LlxuICAgICAgLy8gKGB7IGNvdW50cnk6IC4uLiwgcGhvbmU6ICcnIH1gKVxuICAgICAgaWYgKCFuYXRpb25hbE51bWJlcikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIG51bWJlciA9IGZvcm1hdE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsTnVtYmVyLCBpbnB1dC5jYXJyaWVyQ29kZSwgJ05BVElPTkFMJywgbWV0YWRhdGEsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGFkZEV4dGVuc2lvbihudW1iZXIsIGlucHV0LmV4dCwgbWV0YWRhdGEsIG9wdGlvbnMuZm9ybWF0RXh0ZW5zaW9uKTtcblxuICAgIGNhc2UgJ0lOVEVSTkFUSU9OQUwnOlxuICAgICAgLy8gTGVnYWN5IGFyZ3VtZW50IHN1cHBvcnQuXG4gICAgICAvLyAoYHsgY291bnRyeTogLi4uLCBwaG9uZTogJycgfWApXG4gICAgICBpZiAoIW5hdGlvbmFsTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBcIitcIi5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyID0gZm9ybWF0TmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG51bGwsICdJTlRFUk5BVElPTkFMJywgbWV0YWRhdGEsIG9wdGlvbnMpO1xuICAgICAgbnVtYmVyID0gXCIrXCIuY29uY2F0KGNvdW50cnlDYWxsaW5nQ29kZSwgXCIgXCIpLmNvbmNhdChudW1iZXIpO1xuICAgICAgcmV0dXJuIGFkZEV4dGVuc2lvbihudW1iZXIsIGlucHV0LmV4dCwgbWV0YWRhdGEsIG9wdGlvbnMuZm9ybWF0RXh0ZW5zaW9uKTtcblxuICAgIGNhc2UgJ0UuMTY0JzpcbiAgICAgIC8vIGBFLjE2NGAgZG9lc24ndCBkZWZpbmUgXCJwaG9uZSBudW1iZXIgZXh0ZW5zaW9uc1wiLlxuICAgICAgcmV0dXJuIFwiK1wiLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUpLmNvbmNhdChuYXRpb25hbE51bWJlcik7XG5cbiAgICBjYXNlICdSRkMzOTY2JzpcbiAgICAgIHJldHVybiBmb3JtYXRSRkMzOTY2KHtcbiAgICAgICAgbnVtYmVyOiBcIitcIi5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlKS5jb25jYXQobmF0aW9uYWxOdW1iZXIpLFxuICAgICAgICBleHQ6IGlucHV0LmV4dFxuICAgICAgfSk7XG4gICAgLy8gRm9yIHJlZmVyZW5jZSwgaGVyZSdzIEdvb2dsZSdzIElERCBmb3JtYXR0ZXI6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9saWJwaG9uZW51bWJlci9ibG9iLzMyNzE5Y2Y3NGU2ODc5Njc4OGQxY2E0NWFiYzg1ZGNkYzYzYmE1YjkvamF2YS9saWJwaG9uZW51bWJlci9zcmMvY29tL2dvb2dsZS9pMThuL3Bob25lbnVtYmVycy9QaG9uZU51bWJlclV0aWwuamF2YSNMMTU0NlxuICAgIC8vIE5vdCBzYXlpbmcgdGhhdCB0aGlzIElERCBmb3JtYXR0ZXIgcmVwbGljYXRlcyBpdCAxOjEsIGJ1dCBpdCBzZWVtcyB0byB3b3JrLlxuICAgIC8vIFdobyB3b3VsZCBldmVuIG5lZWQgdG8gZm9ybWF0IHBob25lIG51bWJlcnMgaW4gSUREIGZvcm1hdCBhbnl3YXk/XG5cbiAgICBjYXNlICdJREQnOlxuICAgICAgaWYgKCFvcHRpb25zLmZyb21Db3VudHJ5KSB7XG4gICAgICAgIHJldHVybjsgLy8gdGhyb3cgbmV3IEVycm9yKCdgZnJvbUNvdW50cnlgIG9wdGlvbiBub3QgcGFzc2VkIGZvciBJREQtcHJlZml4ZWQgZm9ybWF0dGluZy4nKVxuICAgICAgfVxuXG4gICAgICB2YXIgZm9ybWF0dGVkTnVtYmVyID0gZm9ybWF0SUREKG5hdGlvbmFsTnVtYmVyLCBpbnB1dC5jYXJyaWVyQ29kZSwgY291bnRyeUNhbGxpbmdDb2RlLCBvcHRpb25zLmZyb21Db3VudHJ5LCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm4gYWRkRXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgaW5wdXQuZXh0LCBtZXRhZGF0YSwgb3B0aW9ucy5mb3JtYXRFeHRlbnNpb24pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gXFxcImZvcm1hdFxcXCIgYXJndW1lbnQgcGFzc2VkIHRvIFxcXCJmb3JtYXROdW1iZXIoKVxcXCI6IFxcXCJcIi5jb25jYXQoZm9ybWF0LCBcIlxcXCJcIikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsTnVtYmVyKG51bWJlciwgY2FycmllckNvZGUsIGZvcm1hdEFzLCBtZXRhZGF0YSwgb3B0aW9ucykge1xuICB2YXIgZm9ybWF0ID0gY2hvb3NlRm9ybWF0Rm9yTnVtYmVyKG1ldGFkYXRhLmZvcm1hdHMoKSwgbnVtYmVyKTtcblxuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0TmF0aW9uYWxOdW1iZXJVc2luZ0Zvcm1hdChudW1iZXIsIGZvcm1hdCwge1xuICAgIHVzZUludGVybmF0aW9uYWxGb3JtYXQ6IGZvcm1hdEFzID09PSAnSU5URVJOQVRJT05BTCcsXG4gICAgd2l0aE5hdGlvbmFsUHJlZml4OiBmb3JtYXQubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCkgJiYgb3B0aW9ucyAmJiBvcHRpb25zLm5hdGlvbmFsUHJlZml4ID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSxcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGUsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hvb3NlRm9ybWF0Rm9yTnVtYmVyKGF2YWlsYWJsZUZvcm1hdHMsIG5hdGlvbmFsTm51bWJlcikge1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKGF2YWlsYWJsZUZvcm1hdHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBmb3JtYXQgPSBfc3RlcC52YWx1ZTtcblxuICAgIC8vIFZhbGlkYXRlIGxlYWRpbmcgZGlnaXRzLlxuICAgIC8vIFRoZSB0ZXN0IGNhc2UgZm9yIFwiZWxzZSBwYXRoXCIgY291bGQgYmUgZm91bmQgYnkgc2VhcmNoaW5nIGZvclxuICAgIC8vIFwiZm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpLmxlbmd0aCA9PT0gMFwiLlxuICAgIGlmIChmb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKCkubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGxhc3QgbGVhZGluZ19kaWdpdHNfcGF0dGVybiBpcyB1c2VkIGhlcmUsIGFzIGl0IGlzIHRoZSBtb3N0IGRldGFpbGVkXG4gICAgICB2YXIgbGFzdExlYWRpbmdEaWdpdHNQYXR0ZXJuID0gZm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpW2Zvcm1hdC5sZWFkaW5nRGlnaXRzUGF0dGVybnMoKS5sZW5ndGggLSAxXTsgLy8gSWYgbGVhZGluZyBkaWdpdHMgZG9uJ3QgbWF0Y2ggdGhlbiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHBob25lIG51bWJlciBmb3JtYXRcblxuICAgICAgaWYgKG5hdGlvbmFsTm51bWJlci5zZWFyY2gobGFzdExlYWRpbmdEaWdpdHNQYXR0ZXJuKSAhPT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIHRoYXQgdGhlIG5hdGlvbmFsIG51bWJlciBtYXRjaGVzIHRoZSBwaG9uZSBudW1iZXIgZm9ybWF0IHJlZ3VsYXIgZXhwcmVzc2lvblxuXG5cbiAgICBpZiAobWF0Y2hlc0VudGlyZWx5KG5hdGlvbmFsTm51bWJlciwgZm9ybWF0LnBhdHRlcm4oKSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVuc2lvbihmb3JtYXR0ZWROdW1iZXIsIGV4dCwgbWV0YWRhdGEsIGZvcm1hdEV4dGVuc2lvbikge1xuICByZXR1cm4gZXh0ID8gZm9ybWF0RXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgZXh0LCBtZXRhZGF0YSkgOiBmb3JtYXR0ZWROdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdElERChuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsIGNvdW50cnlDYWxsaW5nQ29kZSwgZnJvbUNvdW50cnksIG1ldGFkYXRhKSB7XG4gIHZhciBmcm9tQ291bnRyeUNhbGxpbmdDb2RlID0gZ2V0Q291bnRyeUNhbGxpbmdDb2RlKGZyb21Db3VudHJ5LCBtZXRhZGF0YS5tZXRhZGF0YSk7IC8vIFdoZW4gY2FsbGluZyB3aXRoaW4gdGhlIHNhbWUgY291bnRyeSBjYWxsaW5nIGNvZGUuXG5cbiAgaWYgKGZyb21Db3VudHJ5Q2FsbGluZ0NvZGUgPT09IGNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgIHZhciBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXROYXRpb25hbE51bWJlcihuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsICdOQVRJT05BTCcsIG1ldGFkYXRhKTsgLy8gRm9yIE5BTlBBIHJlZ2lvbnMsIHJldHVybiB0aGUgbmF0aW9uYWwgZm9ybWF0IGZvciB0aGVzZSByZWdpb25zXG4gICAgLy8gYnV0IHByZWZpeCBpdCB3aXRoIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuICAgIGlmIChjb3VudHJ5Q2FsbGluZ0NvZGUgPT09ICcxJykge1xuICAgICAgcmV0dXJuIGNvdW50cnlDYWxsaW5nQ29kZSArICcgJyArIGZvcm1hdHRlZE51bWJlcjtcbiAgICB9IC8vIElmIHJlZ2lvbnMgc2hhcmUgYSBjb3VudHJ5IGNhbGxpbmcgY29kZSwgdGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIG5lZWRcbiAgICAvLyBub3QgYmUgZGlhbGxlZC4gVGhpcyBhbHNvIGFwcGxpZXMgd2hlbiBkaWFsbGluZyB3aXRoaW4gYSByZWdpb24sIHNvIHRoaXNcbiAgICAvLyBpZiBjbGF1c2UgY292ZXJzIGJvdGggdGhlc2UgY2FzZXMuIFRlY2huaWNhbGx5IHRoaXMgaXMgdGhlIGNhc2UgZm9yXG4gICAgLy8gZGlhbGxpbmcgZnJvbSBMYSBSZXVuaW9uIHRvIG90aGVyIG92ZXJzZWFzIGRlcGFydG1lbnRzIG9mIEZyYW5jZSAoRnJlbmNoXG4gICAgLy8gR3VpYW5hLCBNYXJ0aW5pcXVlLCBHdWFkZWxvdXBlKSwgYnV0IG5vdCB2aWNlIHZlcnNhIC0gc28gd2UgZG9uJ3QgY292ZXJcbiAgICAvLyB0aGlzIGVkZ2UgY2FzZSBmb3Igbm93IGFuZCBmb3IgdGhvc2UgY2FzZXMgcmV0dXJuIHRoZSB2ZXJzaW9uIGluY2x1ZGluZ1xuICAgIC8vIGNvdW50cnkgY2FsbGluZyBjb2RlLiBEZXRhaWxzIGhlcmU6XG4gICAgLy8gaHR0cDovL3d3dy5wZXRpdGZ1dGUuY29tL3ZveWFnZS8yMjUtaW5mby1wcmF0aXF1ZXMtcmV1bmlvblxuICAgIC8vXG5cblxuICAgIHJldHVybiBmb3JtYXR0ZWROdW1iZXI7XG4gIH1cblxuICB2YXIgaWRkUHJlZml4ID0gZ2V0SWRkUHJlZml4KGZyb21Db3VudHJ5LCB1bmRlZmluZWQsIG1ldGFkYXRhLm1ldGFkYXRhKTtcblxuICBpZiAoaWRkUHJlZml4KSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGlkZFByZWZpeCwgXCIgXCIpLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUsIFwiIFwiKS5jb25jYXQoZm9ybWF0TmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG51bGwsICdJTlRFUk5BVElPTkFMJywgbWV0YWRhdGEpKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0LmpzLm1hcCIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IGlzUG9zc2libGVOdW1iZXIgZnJvbSAnLi9pc1Bvc3NpYmxlLmpzJztcbmltcG9ydCBpc1ZhbGlkTnVtYmVyIGZyb20gJy4vaXNWYWxpZC5qcyc7IC8vIGltcG9ydCBjaGVja051bWJlckxlbmd0aCBmcm9tICcuL2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanMnXG5cbmltcG9ydCBnZXROdW1iZXJUeXBlIGZyb20gJy4vaGVscGVycy9nZXROdW1iZXJUeXBlLmpzJztcbmltcG9ydCBnZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlciBmcm9tICcuL2hlbHBlcnMvZ2V0UG9zc2libGVDb3VudHJpZXNGb3JOdW1iZXIuanMnO1xuaW1wb3J0IGZvcm1hdE51bWJlciBmcm9tICcuL2Zvcm1hdC5qcyc7XG52YXIgVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSA9IGZhbHNlO1xuXG52YXIgUGhvbmVOdW1iZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZVxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmF0aW9uYWxOdW1iZXJcclxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG1ldGFkYXRhIOKAlCBNZXRhZGF0YSBKU09OXHJcbiAgICogQHJldHVybiB7UGhvbmVOdW1iZXJ9XHJcbiAgICovXG4gIGZ1bmN0aW9uIFBob25lTnVtYmVyKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSwgbmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBob25lTnVtYmVyKTtcblxuICAgIGlmICghY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY291bnRyeWAgb3IgYGNvdW50cnlDYWxsaW5nQ29kZWAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIGlmICghbmF0aW9uYWxOdW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BuYXRpb25hbE51bWJlcmAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BtZXRhZGF0YWAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIHZhciBfZ2V0Q291bnRyeUFuZENvdW50cnkgPSBnZXRDb3VudHJ5QW5kQ291bnRyeUNhbGxpbmdDb2RlKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSwgbWV0YWRhdGEpLFxuICAgICAgICBjb3VudHJ5ID0gX2dldENvdW50cnlBbmRDb3VudHJ5LmNvdW50cnksXG4gICAgICAgIGNvdW50cnlDYWxsaW5nQ29kZSA9IF9nZXRDb3VudHJ5QW5kQ291bnRyeS5jb3VudHJ5Q2FsbGluZ0NvZGU7XG5cbiAgICB0aGlzLmNvdW50cnkgPSBjb3VudHJ5O1xuICAgIHRoaXMuY291bnRyeUNhbGxpbmdDb2RlID0gY291bnRyeUNhbGxpbmdDb2RlO1xuICAgIHRoaXMubmF0aW9uYWxOdW1iZXIgPSBuYXRpb25hbE51bWJlcjtcbiAgICB0aGlzLm51bWJlciA9ICcrJyArIHRoaXMuY291bnRyeUNhbGxpbmdDb2RlICsgdGhpcy5uYXRpb25hbE51bWJlcjsgLy8gRXhjbHVkZSBgbWV0YWRhdGFgIHByb3BlcnR5IG91dHB1dCBmcm9tIGBQaG9uZU51bWJlci50b1N0cmluZygpYFxuICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCBjbHV0dGVyIHRoZSBjb25zb2xlIG91dHB1dCBvZiBOb2RlLmpzLlxuICAgIC8vIFByZXZpb3VzbHksIHdoZW4gTm9kZS5qcyBkaWQgYGNvbnNvbGUubG9nKG5ldyBQaG9uZU51bWJlciguLi4pKWAsXG4gICAgLy8gaXQgd291bGQgb3V0cHV0IHRoZSB3aG9sZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlIGBtZXRhZGF0YWAgb2JqZWN0LlxuXG4gICAgdGhpcy5nZXRNZXRhZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBob25lTnVtYmVyLCBbe1xuICAgIGtleTogXCJzZXRFeHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RXh0KGV4dCkge1xuICAgICAgdGhpcy5leHQgPSBleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvc3NpYmxlQ291bnRyaWVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvc3NpYmxlQ291bnRyaWVzKCkge1xuICAgICAgaWYgKHRoaXMuY291bnRyeSkge1xuICAgICAgICByZXR1cm4gW3RoaXMuY291bnRyeV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlcih0aGlzLmNvdW50cnlDYWxsaW5nQ29kZSwgdGhpcy5uYXRpb25hbE51bWJlciwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNQb3NzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Bvc3NpYmxlKCkge1xuICAgICAgcmV0dXJuIGlzUG9zc2libGVOdW1iZXIodGhpcywge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkKCkge1xuICAgICAgcmV0dXJuIGlzVmFsaWROdW1iZXIodGhpcywge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNOb25HZW9ncmFwaGljXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzTm9uR2VvZ3JhcGhpYygpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSh0aGlzLmdldE1ldGFkYXRhKCkpO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKHRoaXMuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNFcXVhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VxdWFsKHBob25lTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXIgPT09IHBob25lTnVtYmVyLm51bWJlciAmJiB0aGlzLmV4dCA9PT0gcGhvbmVOdW1iZXIuZXh0O1xuICAgIH0gLy8gVGhpcyBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IGZvciBgdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpYCxcbiAgICAvLyBidXQgbGF0ZXIgaXQgd2FzIGZvdW5kIG91dCB0aGF0IGl0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgcG9zc2libGUgYFRPT19TSE9SVGAgcmVzdWx0XG4gICAgLy8gcmV0dXJuZWQgZnJvbSBgcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcigpYCBpbiB0aGUgb3JpZ2luYWwgYHZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGgoKWAsXG4gICAgLy8gc28gZXZlbnR1YWxseSBJIHNpbXBseSBjb21tZW50ZWQgb3V0IHRoaXMgbWV0aG9kIGZyb20gdGhlIGBQaG9uZU51bWJlcmAgY2xhc3NcbiAgICAvLyBhbmQganVzdCBsZWZ0IHRoZSBgdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpYCBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggdGhhdCBvbmUgd291bGQgcmVxdWlyZVxuICAgIC8vIGFuZCBhZGRpdGlvbmFsIHN0ZXAgdG8gYWxzbyB2YWxpZGF0ZSB0aGUgYWN0dWFsIGNvdW50cnkgLyBjYWxsaW5nIGNvZGUgb2YgdGhlIHBob25lIG51bWJlci5cbiAgICAvLyB2YWxpZGF0ZUxlbmd0aCgpIHtcbiAgICAvLyBcdGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKHRoaXMuZ2V0TWV0YWRhdGEoKSlcbiAgICAvLyBcdG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4odGhpcy5jb3VudHJ5Q2FsbGluZ0NvZGUpXG4gICAgLy8gXHRjb25zdCByZXN1bHQgPSBjaGVja051bWJlckxlbmd0aCh0aGlzLm5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YSlcbiAgICAvLyBcdGlmIChyZXN1bHQgIT09ICdJU19QT1NTSUJMRScpIHtcbiAgICAvLyBcdFx0cmV0dXJuIHJlc3VsdFxuICAgIC8vIFx0fVxuICAgIC8vIH1cblxuICB9LCB7XG4gICAga2V5OiBcImdldFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHlwZSgpIHtcbiAgICAgIHJldHVybiBnZXROdW1iZXJUeXBlKHRoaXMsIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0sIHRoaXMuZ2V0TWV0YWRhdGEoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXQoX2Zvcm1hdCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih0aGlzLCBfZm9ybWF0LCBvcHRpb25zID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0pIDoge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0TmF0aW9uYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0TmF0aW9uYWwob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdOQVRJT05BTCcsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRJbnRlcm5hdGlvbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdEludGVybmF0aW9uYWwob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdJTlRFUk5BVElPTkFMJywgb3B0aW9ucyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFVSSVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVUkkob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdSRkMzOTY2Jywgb3B0aW9ucyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBob25lTnVtYmVyO1xufSgpO1xuXG5leHBvcnQgeyBQaG9uZU51bWJlciBhcyBkZWZhdWx0IH07XG5cbnZhciBpc0NvdW50cnlDb2RlID0gZnVuY3Rpb24gaXNDb3VudHJ5Q29kZSh2YWx1ZSkge1xuICByZXR1cm4gL15bQS1aXXsyfSQvLnRlc3QodmFsdWUpO1xufTtcblxuZnVuY3Rpb24gZ2V0Q291bnRyeUFuZENvdW50cnlDYWxsaW5nQ29kZShjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGUsIG1ldGFkYXRhSnNvbikge1xuICB2YXIgY291bnRyeTtcbiAgdmFyIGNvdW50cnlDYWxsaW5nQ29kZTtcbiAgdmFyIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhSnNvbik7IC8vIElmIGNvdW50cnkgY29kZSBpcyBwYXNzZWQgdGhlbiBkZXJpdmUgYGNvdW50cnlDYWxsaW5nQ29kZWAgZnJvbSBpdC5cbiAgLy8gQWxzbyBzdG9yZSB0aGUgY291bnRyeSBjb2RlIGFzIGAuY291bnRyeWAuXG5cbiAgaWYgKGlzQ291bnRyeUNvZGUoY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlKSkge1xuICAgIGNvdW50cnkgPSBjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGU7XG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5KTtcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBtZXRhZGF0YS5jb3VudHJ5Q2FsbGluZ0NvZGUoKTtcbiAgfSBlbHNlIHtcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICBpZiAoVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSkge1xuICAgICAgaWYgKG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGNvdW50cnlDYWxsaW5nQ29kZSkpIHtcbiAgICAgICAgY291bnRyeSA9ICcwMDEnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY291bnRyeTogY291bnRyeSxcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGU6IGNvdW50cnlDYWxsaW5nQ29kZVxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGhvbmVOdW1iZXIuanMubWFwIiwiaW1wb3J0IFBob25lTnVtYmVyIGZyb20gJy4vUGhvbmVOdW1iZXIuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXhhbXBsZU51bWJlcihjb3VudHJ5LCBleGFtcGxlcywgbWV0YWRhdGEpIHtcbiAgaWYgKGV4YW1wbGVzW2NvdW50cnldKSB7XG4gICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlcihjb3VudHJ5LCBleGFtcGxlc1tjb3VudHJ5XSwgbWV0YWRhdGEpO1xuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRFeGFtcGxlTnVtYmVyLmpzLm1hcCIsImltcG9ydCB3aXRoTWV0YWRhdGFBcmd1bWVudCBmcm9tICcuL3dpdGhNZXRhZGF0YUFyZ3VtZW50LmpzJ1xyXG5pbXBvcnQgeyBnZXRFeGFtcGxlTnVtYmVyIGFzIF9nZXRFeGFtcGxlTnVtYmVyIH0gZnJvbSAnLi4vLi4vY29yZS9pbmRleC5qcydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFeGFtcGxlTnVtYmVyKCkge1xyXG5cdHJldHVybiB3aXRoTWV0YWRhdGFBcmd1bWVudChfZ2V0RXhhbXBsZU51bWJlciwgYXJndW1lbnRzKVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/libphonenumber-js/min/exports/getExampleNumber.js\n\n}");
|
|
28
|
+
eval("{// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n getExampleNumber: function() { return /* binding */ getExampleNumber_getExampleNumber; }\n});\n\n// EXTERNAL MODULE: ../../../node_modules/libphonenumber-js/min/exports/withMetadataArgument.js + 1 modules\nvar withMetadataArgument = __webpack_require__(\"../../../node_modules/libphonenumber-js/min/exports/withMetadataArgument.js\");\n// EXTERNAL MODULE: ../../../node_modules/libphonenumber-js/es6/metadata.js + 2 modules\nvar es6_metadata = __webpack_require__(\"../../../node_modules/libphonenumber-js/es6/metadata.js\");\n;// ../../../node_modules/libphonenumber-js/es6/helpers/mergeArrays.js\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.\"); }\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/**\r\n * Merges two arrays.\r\n * @param {*} a\r\n * @param {*} b\r\n * @return {*}\r\n */\nfunction mergeArrays(a, b) {\n var merged = a.slice();\n\n for (var _iterator = _createForOfIteratorHelperLoose(b), _step; !(_step = _iterator()).done;) {\n var element = _step.value;\n\n if (a.indexOf(element) < 0) {\n merged.push(element);\n }\n }\n\n return merged.sort(function (a, b) {\n return a - b;\n }); // ES6 version, requires Set polyfill.\n // let merged = new Set(a)\n // for (const element of b) {\n // \tmerged.add(i)\n // }\n // return Array.from(merged).sort((a, b) => a - b)\n}\n//# sourceMappingURL=mergeArrays.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js\n\nfunction checkNumberLength(nationalNumber, metadata) {\n return checkNumberLengthForType(nationalNumber, undefined, metadata);\n} // Checks whether a number is possible for the country based on its length.\n// Should only be called for the \"new\" metadata which has \"possible lengths\".\n\nfunction checkNumberLengthForType(nationalNumber, type, metadata) {\n var type_info = metadata.type(type); // There should always be \"<possiblePengths/>\" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \"<possiblePengths/>\" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths(); // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, 'MOBILE', metadata);\n }\n\n var mobile_type = metadata.type('MOBILE');\n\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = mergeArrays(possible_lengths, mobile_type.possibleLengths()); // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n } // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n\n var actual_length = nationalNumber.length; // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n } // We skip the first element since we've already checked it.\n\n\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map\n;// ../../../node_modules/libphonenumber-js/es6/isPossible.js\n\n\n/**\r\n * Checks if a phone number is \"possible\" (basically just checks its length).\r\n *\r\n * isPossible(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\nfunction isPossiblePhoneNumber(input, options, metadata) {\n /* istanbul ignore if */\n if (options === undefined) {\n options = {};\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n\n if (options.v2) {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else {\n if (!input.phone) {\n return false;\n }\n\n if (input.country) {\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else {\n if (!input.countryCallingCode) {\n throw new Error('Invalid phone number object passed');\n }\n\n metadata.selectNumberingPlan(input.countryCallingCode);\n }\n } // Old metadata (< 1.0.18) had no \"possible length\" data.\n\n\n if (metadata.possibleLengths()) {\n return isPossibleNumber(input.phone || input.nationalNumber, metadata);\n } else {\n // There was a bug between `1.7.35` and `1.7.37` where \"possible_lengths\"\n // were missing for \"non-geographical\" numbering plans.\n // Just assume the number is possible in such cases:\n // it's unlikely that anyone generated their custom metadata\n // in that short period of time (one day).\n // This code can be removed in some future major version update.\n if (input.countryCallingCode && metadata.isNonGeographicCallingCode(input.countryCallingCode)) {\n // \"Non-geographic entities\" did't have `possibleLengths`\n // due to a bug in metadata generation process.\n return true;\n } else {\n throw new Error('Missing \"possibleLengths\" in metadata. Perhaps the metadata has been generated before v1.0.18.');\n }\n }\n}\nfunction isPossibleNumber(nationalNumber, metadata) {\n //, isInternational) {\n switch (checkNumberLength(nationalNumber, metadata)) {\n case 'IS_POSSIBLE':\n return true;\n // This library ignores \"local-only\" phone numbers (for simplicity).\n // See the readme for more info on what are \"local-only\" phone numbers.\n // case 'IS_POSSIBLE_LOCAL_ONLY':\n // \treturn !isInternational\n\n default:\n return false;\n }\n}\n//# sourceMappingURL=isPossible.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/matchesEntirely.js\n/**\r\n * Checks whether the entire input sequence can be matched\r\n * against the regular expression.\r\n * @return {boolean}\r\n */\nfunction matchesEntirely(text, regular_expression) {\n // If assigning the `''` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n text = text || '';\n return new RegExp('^(?:' + regular_expression + ')$').test(text);\n}\n//# sourceMappingURL=matchesEntirely.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getNumberType.js\nfunction getNumberType_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 = getNumberType_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.\"); }\n\nfunction getNumberType_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return getNumberType_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 getNumberType_arrayLikeToArray(o, minLen); }\n\nfunction getNumberType_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\nvar NON_FIXED_LINE_PHONE_TYPES = ['MOBILE', 'PREMIUM_RATE', 'TOLL_FREE', 'SHARED_COST', 'VOIP', 'PERSONAL_NUMBER', 'PAGER', 'UAN', 'VOICEMAIL']; // Finds out national phone number type (fixed line, mobile, etc)\n\nfunction getNumberType(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {}; // When `parse()` returns an empty object — `{}` —\n // that means that the phone number is malformed,\n // so it can't possibly be valid.\n\n if (!input.country && !input.countryCallingCode) {\n return;\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode);\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // The following is copy-pasted from the original function:\n // https://github.com/googlei18n/libphonenumber/blob/3ea547d4fbaa2d0b67588904dfa5d3f2557c27ff/javascript/i18n/phonenumbers/phonenumberutil.js#L2835\n // Is this national number even valid for this country\n\n if (!matchesEntirely(nationalNumber, metadata.nationalNumberPattern())) {\n return;\n } // Is it fixed line number\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'FIXED_LINE', metadata)) {\n // Because duplicate regular expressions are removed\n // to reduce metadata size, if \"mobile\" pattern is \"\"\n // then it means it was removed due to being a duplicate of the fixed-line pattern.\n //\n if (metadata.type('MOBILE') && metadata.type('MOBILE').pattern() === '') {\n return 'FIXED_LINE_OR_MOBILE';\n } // `MOBILE` type pattern isn't included if it matched `FIXED_LINE` one.\n // For example, for \"US\" country.\n // Old metadata (< `1.0.18`) had a specific \"types\" data structure\n // that happened to be `undefined` for `MOBILE` in that case.\n // Newer metadata (>= `1.0.18`) has another data structure that is\n // not `undefined` for `MOBILE` in that case (it's just an empty array).\n // So this `if` is just for backwards compatibility with old metadata.\n\n\n if (!metadata.type('MOBILE')) {\n return 'FIXED_LINE_OR_MOBILE';\n } // Check if the number happens to qualify as both fixed line and mobile.\n // (no such country in the minimal metadata set)\n\n /* istanbul ignore if */\n\n\n if (isNumberTypeEqualTo(nationalNumber, 'MOBILE', metadata)) {\n return 'FIXED_LINE_OR_MOBILE';\n }\n\n return 'FIXED_LINE';\n }\n\n for (var _iterator = getNumberType_createForOfIteratorHelperLoose(NON_FIXED_LINE_PHONE_TYPES), _step; !(_step = _iterator()).done;) {\n var type = _step.value;\n\n if (isNumberTypeEqualTo(nationalNumber, type, metadata)) {\n return type;\n }\n }\n}\nfunction isNumberTypeEqualTo(nationalNumber, type, metadata) {\n type = metadata.type(type);\n\n if (!type || !type.pattern()) {\n return false;\n } // Check if any possible number lengths are present;\n // if so, we use them to avoid checking\n // the validation pattern if they don't match.\n // If they are absent, this means they match\n // the general description, which we have\n // already checked before a specific number type.\n\n\n if (type.possibleLengths() && type.possibleLengths().indexOf(nationalNumber.length) < 0) {\n return false;\n }\n\n return matchesEntirely(nationalNumber, type.pattern());\n}\n//# sourceMappingURL=getNumberType.js.map\n;// ../../../node_modules/libphonenumber-js/es6/isValid.js\n\n\n\n/**\r\n * Checks if a given phone number is valid.\r\n *\r\n * isValid(phoneNumberInstance, { ..., v2: true }, metadata)\r\n *\r\n * isPossible({ phone: '8005553535', country: 'RU' }, { ... }, metadata)\r\n * isPossible({ phone: '8005553535', country: 'RU' }, undefined, metadata)\r\n *\r\n * If the `number` is a string, it will be parsed to an object,\r\n * but only if it contains only valid phone number characters (including punctuation).\r\n * If the `number` is an object, it is used as is.\r\n *\r\n * The optional `defaultCountry` argument is the default country.\r\n * I.e. it does not restrict to just that country,\r\n * e.g. in those cases where several countries share\r\n * the same phone numbering rules (NANPA, Britain, etc).\r\n * For example, even though the number `07624 369230`\r\n * belongs to the Isle of Man (\"IM\" country code)\r\n * calling `isValidNumber('07624369230', 'GB', metadata)`\r\n * still returns `true` because the country is not restricted to `GB`,\r\n * it's just that `GB` is the default one for the phone numbering rules.\r\n * For restricting the country see `isValidNumberForRegion()`\r\n * though restricting a country might not be a good idea.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isValidNumber('+78005553535', metadata)\r\n * isValidNumber('8005553535', 'RU', metadata)\r\n * isValidNumber('88005553535', 'RU', metadata)\r\n * isValidNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\n\nfunction isValidNumber(input, options, metadata) {\n // If assigning the `{}` default value is moved to the arguments above,\n // code coverage would decrease for some weird reason.\n options = options || {};\n metadata = new es6_metadata[\"default\"](metadata);\n metadata.selectNumberingPlan(input.country, input.countryCallingCode); // By default, countries only have type regexps when it's required for\n // distinguishing different countries having the same `countryCallingCode`.\n\n if (metadata.hasTypes()) {\n return getNumberType(input, options, metadata.metadata) !== undefined;\n } // If there are no type regexps for this country in metadata then use\n // `nationalNumberPattern` as a \"better than nothing\" replacement.\n\n\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone;\n return matchesEntirely(nationalNumber, metadata.nationalNumberPattern());\n}\n//# sourceMappingURL=isValid.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getPossibleCountriesForNumber.js\n\n/**\r\n * Returns a list of countries that the phone number could potentially belong to.\r\n * @param {string} callingCode — Calling code.\r\n * @param {string} nationalNumber — National (significant) number.\r\n * @param {object} metadata — Metadata.\r\n * @return {string[]} A list of possible countries.\r\n */\n\nfunction getPossibleCountriesForNumber(callingCode, nationalNumber, metadata) {\n var _metadata = new es6_metadata[\"default\"](metadata);\n\n var possibleCountries = _metadata.getCountryCodesForCallingCode(callingCode);\n\n if (!possibleCountries) {\n return [];\n }\n\n return possibleCountries.filter(function (country) {\n return couldNationalNumberBelongToCountry(nationalNumber, country, metadata);\n });\n}\n\nfunction couldNationalNumberBelongToCountry(nationalNumber, country, metadata) {\n var _metadata = new es6_metadata[\"default\"](metadata);\n\n _metadata.selectNumberingPlan(country);\n\n if (_metadata.numberingPlan.possibleLengths().indexOf(nationalNumber.length) >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=getPossibleCountriesForNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/constants.js\n// The minimum length of the national significant number.\nvar MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15,\n// but one can find longer numbers in Germany.\n\nvar MAX_LENGTH_FOR_NSN = 17; // The maximum length of the country calling code.\n\nvar MAX_LENGTH_COUNTRY_CODE = 3; // Digits accepted in phone numbers\n// (ascii, fullwidth, arabic-indic, and eastern arabic digits).\n\nvar VALID_DIGITS = \"0-9\\uFF10-\\uFF19\\u0660-\\u0669\\u06F0-\\u06F9\"; // `DASHES` will be right after the opening square bracket of the \"character class\"\n\nvar DASHES = \"-\\u2010-\\u2015\\u2212\\u30FC\\uFF0D\";\nvar SLASHES = \"\\uFF0F/\";\nvar DOTS = \"\\uFF0E.\";\nvar WHITESPACE = \" \\xA0\\xAD\\u200B\\u2060\\u3000\";\nvar BRACKETS = \"()\\uFF08\\uFF09\\uFF3B\\uFF3D\\\\[\\\\]\"; // export const OPENING_BRACKETS = '(\\uFF08\\uFF3B\\\\\\['\n\nvar TILDES = \"~\\u2053\\u223C\\uFF5E\"; // Regular expression of acceptable punctuation found in phone numbers. This\n// excludes punctuation found as a leading character only. This consists of dash\n// characters, white space characters, full stops, slashes, square brackets,\n// parentheses and tildes. Full-width variants are also present.\n\nvar VALID_PUNCTUATION = \"\".concat(DASHES).concat(SLASHES).concat(DOTS).concat(WHITESPACE).concat(BRACKETS).concat(TILDES);\nvar PLUS_CHARS = \"+\\uFF0B\"; // const LEADING_PLUS_CHARS_PATTERN = new RegExp('^[' + PLUS_CHARS + ']+')\n//# sourceMappingURL=constants.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/applyInternationalSeparatorStyle.js\n // Removes brackets and replaces dashes with spaces.\n//\n// E.g. \"(999) 111-22-33\" -> \"999 111 22 33\"\n//\n// For some reason Google's metadata contains `<intlFormat/>`s with brackets and dashes.\n// Meanwhile, there's no single opinion about using punctuation in international phone numbers.\n//\n// For example, Google's `<intlFormat/>` for USA is `+1 213-373-4253`.\n// And here's a quote from WikiPedia's \"North American Numbering Plan\" page:\n// https://en.wikipedia.org/wiki/North_American_Numbering_Plan\n//\n// \"The country calling code for all countries participating in the NANP is 1.\n// In international format, an NANP number should be listed as +1 301 555 01 00,\n// where 301 is an area code (Maryland).\"\n//\n// I personally prefer the international format without any punctuation.\n// For example, brackets are remnants of the old age, meaning that the\n// phone number part in brackets (so called \"area code\") can be omitted\n// if dialing within the same \"area\".\n// And hyphens were clearly introduced for splitting local numbers into memorizable groups.\n// For example, remembering \"5553535\" is difficult but \"555-35-35\" is much simpler.\n// Imagine a man taking a bus from home to work and seeing an ad with a phone number.\n// He has a couple of seconds to memorize that number until it passes by.\n// If it were spaces instead of hyphens the man wouldn't necessarily get it,\n// but with hyphens instead of spaces the grouping is more explicit.\n// I personally think that hyphens introduce visual clutter,\n// so I prefer replacing them with spaces in international numbers.\n// In the modern age all output is done on displays where spaces are clearly distinguishable\n// so hyphens can be safely replaced with spaces without losing any legibility.\n//\n\nfunction applyInternationalSeparatorStyle(formattedNumber) {\n return formattedNumber.replace(new RegExp(\"[\".concat(VALID_PUNCTUATION, \"]+\"), 'g'), ' ').trim();\n}\n//# sourceMappingURL=applyInternationalSeparatorStyle.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/formatNationalNumberUsingFormat.js\n // This was originally set to $1 but there are some countries for which the\n// first group is not used in the national pattern (e.g. Argentina) so the $1\n// group does not match correctly. Therefore, we use `\\d`, so that the first\n// group actually used in the pattern will be matched.\n\nvar FIRST_GROUP_PATTERN = /(\\$\\d)/;\nfunction formatNationalNumberUsingFormat(number, format, _ref) {\n var useInternationalFormat = _ref.useInternationalFormat,\n withNationalPrefix = _ref.withNationalPrefix,\n carrierCode = _ref.carrierCode,\n metadata = _ref.metadata;\n var formattedNumber = number.replace(new RegExp(format.pattern()), useInternationalFormat ? format.internationalFormat() : // This library doesn't use `domestic_carrier_code_formatting_rule`,\n // because that one is only used when formatting phone numbers\n // for dialing from a mobile phone, and this is not a dialing library.\n // carrierCode && format.domesticCarrierCodeFormattingRule()\n // \t// First, replace the $CC in the formatting rule with the desired carrier code.\n // \t// Then, replace the $FG in the formatting rule with the first group\n // \t// and the carrier code combined in the appropriate way.\n // \t? format.format().replace(FIRST_GROUP_PATTERN, format.domesticCarrierCodeFormattingRule().replace('$CC', carrierCode))\n // \t: (\n // \t\twithNationalPrefix && format.nationalPrefixFormattingRule()\n // \t\t\t? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule())\n // \t\t\t: format.format()\n // \t)\n withNationalPrefix && format.nationalPrefixFormattingRule() ? format.format().replace(FIRST_GROUP_PATTERN, format.nationalPrefixFormattingRule()) : format.format());\n\n if (useInternationalFormat) {\n return applyInternationalSeparatorStyle(formattedNumber);\n }\n\n return formattedNumber;\n}\n//# sourceMappingURL=formatNationalNumberUsingFormat.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/getIddPrefix.js\n\n/**\r\n * Pattern that makes it easy to distinguish whether a region has a single\r\n * international dialing prefix or not. If a region has a single international\r\n * prefix (e.g. 011 in USA), it will be represented as a string that contains\r\n * a sequence of ASCII digits, and possibly a tilde, which signals waiting for\r\n * the tone. If there are multiple available international prefixes in a\r\n * region, they will be represented as a regex string that always contains one\r\n * or more characters that are not ASCII digits or a tilde.\r\n */\n\nvar SINGLE_IDD_PREFIX_REG_EXP = /^[\\d]+(?:[~\\u2053\\u223C\\uFF5E][\\d]+)?$/; // For regions that have multiple IDD prefixes\n// a preferred IDD prefix is returned.\n\nfunction getIddPrefix(country, callingCode, metadata) {\n var countryMetadata = new es6_metadata[\"default\"](metadata);\n countryMetadata.selectNumberingPlan(country, callingCode);\n\n if (countryMetadata.defaultIDDPrefix()) {\n return countryMetadata.defaultIDDPrefix();\n }\n\n if (SINGLE_IDD_PREFIX_REG_EXP.test(countryMetadata.IDDPrefix())) {\n return countryMetadata.IDDPrefix();\n }\n}\n//# sourceMappingURL=getIddPrefix.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/extension/createExtensionPattern.js\n // The RFC 3966 format for extensions.\n\nvar RFC3966_EXTN_PREFIX = ';ext=';\n/**\r\n * Helper method for constructing regular expressions for parsing. Creates\r\n * an expression that captures up to max_length digits.\r\n * @return {string} RegEx pattern to capture extension digits.\r\n */\n\nvar getExtensionDigitsPattern = function getExtensionDigitsPattern(maxLength) {\n return \"([\".concat(VALID_DIGITS, \"]{1,\").concat(maxLength, \"})\");\n};\n/**\r\n * Helper initialiser method to create the regular-expression pattern to match\r\n * extensions.\r\n * Copy-pasted from Google's `libphonenumber`:\r\n * https://github.com/google/libphonenumber/blob/55b2646ec9393f4d3d6661b9c82ef9e258e8b829/javascript/i18n/phonenumbers/phonenumberutil.js#L759-L766\r\n * @return {string} RegEx pattern to capture extensions.\r\n */\n\n\nfunction createExtensionPattern(purpose) {\n // We cap the maximum length of an extension based on the ambiguity of the way\n // the extension is prefixed. As per ITU, the officially allowed length for\n // extensions is actually 40, but we don't support this since we haven't seen real\n // examples and this introduces many false interpretations as the extension labels\n // are not standardized.\n\n /** @type {string} */\n var extLimitAfterExplicitLabel = '20';\n /** @type {string} */\n\n var extLimitAfterLikelyLabel = '15';\n /** @type {string} */\n\n var extLimitAfterAmbiguousChar = '9';\n /** @type {string} */\n\n var extLimitWhenNotSure = '6';\n /** @type {string} */\n\n var possibleSeparatorsBetweenNumberAndExtLabel = \"[ \\xA0\\\\t,]*\"; // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.\n\n /** @type {string} */\n\n var possibleCharsAfterExtLabel = \"[:\\\\.\\uFF0E]?[ \\xA0\\\\t,-]*\";\n /** @type {string} */\n\n var optionalExtnSuffix = \"#?\"; // Here the extension is called out in more explicit way, i.e mentioning it obvious\n // patterns like \"ext.\".\n\n /** @type {string} */\n\n var explicitExtLabels = \"(?:e?xt(?:ensi(?:o\\u0301?|\\xF3))?n?|\\uFF45?\\uFF58\\uFF54\\uFF4E?|\\u0434\\u043E\\u0431|anexo)\"; // One-character symbols that can be used to indicate an extension, and less\n // commonly used or more ambiguous extension labels.\n\n /** @type {string} */\n\n var ambiguousExtLabels = \"(?:[x\\uFF58#\\uFF03~\\uFF5E]|int|\\uFF49\\uFF4E\\uFF54)\"; // When extension is not separated clearly.\n\n /** @type {string} */\n\n var ambiguousSeparator = \"[- ]+\"; // This is the same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching\n // comma as extension label may have it.\n\n /** @type {string} */\n\n var possibleSeparatorsNumberExtLabelNoComma = \"[ \\xA0\\\\t]*\"; // \",,\" is commonly used for auto dialling the extension when connected. First\n // comma is matched through possibleSeparatorsBetweenNumberAndExtLabel, so we do\n // not repeat it here. Semi-colon works in Iphone and Android also to pop up a\n // button with the extension number following.\n\n /** @type {string} */\n\n var autoDiallingAndExtLabelsFound = \"(?:,{2}|;)\";\n /** @type {string} */\n\n var rfcExtn = RFC3966_EXTN_PREFIX + getExtensionDigitsPattern(extLimitAfterExplicitLabel);\n /** @type {string} */\n\n var explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterExplicitLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix;\n /** @type {string} */\n\n var americanStyleExtnWithSuffix = ambiguousSeparator + getExtensionDigitsPattern(extLimitWhenNotSure) + \"#\";\n /** @type {string} */\n\n var autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterLikelyLabel) + optionalExtnSuffix;\n /** @type {string} */\n\n var onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + \"(?:,)+\" + possibleCharsAfterExtLabel + getExtensionDigitsPattern(extLimitAfterAmbiguousChar) + optionalExtnSuffix; // The first regular expression covers RFC 3966 format, where the extension is added\n // using \";ext=\". The second more generic where extension is mentioned with explicit\n // labels like \"ext:\". In both the above cases we allow more numbers in extension than\n // any other extension labels. The third one captures when single character extension\n // labels or less commonly used labels are used. In such cases we capture fewer\n // extension digits in order to reduce the chance of falsely interpreting two\n // numbers beside each other as a number + extension. The fourth one covers the\n // special case of American numbers where the extension is written with a hash\n // at the end, such as \"- 503#\". The fifth one is exclusively for extension\n // autodialling formats which are used when dialling and in this case we accept longer\n // extensions. The last one is more liberal on the number of commas that acts as\n // extension labels, so we have a strict cap on the number of digits in such extensions.\n\n return rfcExtn + \"|\" + explicitExtn + \"|\" + ambiguousExtn + \"|\" + americanStyleExtnWithSuffix + \"|\" + autoDiallingExtn + \"|\" + onlyCommasExtn;\n}\n//# sourceMappingURL=createExtensionPattern.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/isViablePhoneNumber.js\n\n // Regular expression of viable phone numbers. This is location independent.\n// Checks we have at least three leading digits, and only valid punctuation,\n// alpha characters and digits in the phone number. Does not include extension\n// data. The symbol 'x' is allowed here as valid punctuation since it is often\n// used as a placeholder for carrier codes, for example in Brazilian phone\n// numbers. We also allow multiple '+' characters at the start.\n//\n// Corresponds to the following:\n// [digits]{minLengthNsn}|\n// plus_sign*\n// (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*\n//\n// The first reg-ex is to allow short numbers (two digits long) to be parsed if\n// they are entered as \"15\" etc, but only if there is no punctuation in them.\n// The second expression restricts the number of digits to three or more, but\n// then allows them to be in international form, and to have alpha-characters\n// and punctuation. We split up the two reg-exes here and combine them when\n// creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it\n// with ^ and append $ to each branch.\n//\n// \"Note VALID_PUNCTUATION starts with a -,\n// so must be the first in the range\" (c) Google devs.\n// (wtf did they mean by saying that; probably nothing)\n//\n\nvar MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + VALID_DIGITS + ']{' + MIN_LENGTH_FOR_NSN + '}'; //\n// And this is the second reg-exp:\n// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)\n//\n\nvar VALID_PHONE_NUMBER = '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){3,}' + '[' + VALID_PUNCTUATION + VALID_DIGITS + ']*'; // This regular expression isn't present in Google's `libphonenumber`\n// and is only used to determine whether the phone number being input\n// is too short for it to even consider it a \"valid\" number.\n// This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nvar VALID_PHONE_NUMBER_START_REG_EXP = new RegExp('^' + '[' + PLUS_CHARS + ']{0,1}' + '(?:' + '[' + VALID_PUNCTUATION + ']*' + '[' + VALID_DIGITS + ']' + '){1,2}' + '$', 'i');\nvar VALID_PHONE_NUMBER_WITH_EXTENSION = VALID_PHONE_NUMBER + // Phone number extensions\n'(?:' + createExtensionPattern() + ')?'; // The combined regular expression for valid phone numbers:\n//\n\nvar VALID_PHONE_NUMBER_PATTERN = new RegExp( // Either a short two-digit-only phone number\n'^' + MIN_LENGTH_PHONE_NUMBER_PATTERN + '$' + '|' + // Or a longer fully parsed phone number (min 3 characters)\n'^' + VALID_PHONE_NUMBER_WITH_EXTENSION + '$', 'i'); // Checks to see if the string of characters could possibly be a phone number at\n// all. At the moment, checks to see that the string begins with at least 2\n// digits, ignoring any punctuation commonly found in phone numbers. This method\n// does not require the number to be normalized in advance - but does assume\n// that leading non-number symbols have been removed, such as by the method\n// `extract_possible_number`.\n//\n\nfunction isViablePhoneNumber(number) {\n return number.length >= MIN_LENGTH_FOR_NSN && VALID_PHONE_NUMBER_PATTERN.test(number);\n} // This is just a way to differentiate between a really invalid phone\n// number like \"abcde\" and a valid phone number that a user has just\n// started inputting, like \"+1\" or \"1\": both these cases would be\n// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this\n// library can provide a more detailed error message — whether it's\n// really \"not a number\", or is it just a start of a valid phone number.\n\nfunction isViablePhoneNumberStart(number) {\n return VALID_PHONE_NUMBER_START_REG_EXP.test(number);\n}\n//# sourceMappingURL=isViablePhoneNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/helpers/RFC3966.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || RFC3966_unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { 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\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RFC3966_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 = RFC3966_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.\"); }\n\nfunction RFC3966_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return RFC3966_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 RFC3966_arrayLikeToArray(o, minLen); }\n\nfunction RFC3966_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 // https://www.ietf.org/rfc/rfc3966.txt\n\n/**\r\n * @param {string} text - Phone URI (RFC 3966).\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\n\nfunction parseRFC3966(text) {\n var number;\n var ext; // Replace \"tel:\" with \"tel=\" for parsing convenience.\n\n text = text.replace(/^tel:/, 'tel=');\n\n for (var _iterator = RFC3966_createForOfIteratorHelperLoose(text.split(';')), _step; !(_step = _iterator()).done;) {\n var part = _step.value;\n\n var _part$split = part.split('='),\n _part$split2 = _slicedToArray(_part$split, 2),\n name = _part$split2[0],\n value = _part$split2[1];\n\n switch (name) {\n case 'tel':\n number = value;\n break;\n\n case 'ext':\n ext = value;\n break;\n\n case 'phone-context':\n // Only \"country contexts\" are supported.\n // \"Domain contexts\" are ignored.\n if (value[0] === '+') {\n number = value + number;\n }\n\n break;\n }\n } // If the phone number is not viable, then abort.\n\n\n if (!isViablePhoneNumber(number)) {\n return {};\n }\n\n var result = {\n number: number\n };\n\n if (ext) {\n result.ext = ext;\n }\n\n return result;\n}\n/**\r\n * @param {object} - `{ ?number, ?extension }`.\r\n * @return {string} Phone URI (RFC 3966).\r\n */\n\nfunction formatRFC3966(_ref) {\n var number = _ref.number,\n ext = _ref.ext;\n\n if (!number) {\n return '';\n }\n\n if (number[0] !== '+') {\n throw new Error(\"\\\"formatRFC3966()\\\" expects \\\"number\\\" to be in E.164 format.\");\n }\n\n return \"tel:\".concat(number).concat(ext ? ';ext=' + ext : '');\n}\n//# sourceMappingURL=RFC3966.js.map\n;// ../../../node_modules/libphonenumber-js/es6/format.js\nfunction format_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 = format_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.\"); }\n\nfunction format_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return format_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 format_arrayLikeToArray(o, minLen); }\n\nfunction format_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\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// This is a port of Google Android `libphonenumber`'s\n// `phonenumberutil.js` of December 31th, 2018.\n//\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\n\n\n\n\n\nvar DEFAULT_OPTIONS = {\n formatExtension: function formatExtension(formattedNumber, extension, metadata) {\n return \"\".concat(formattedNumber).concat(metadata.ext()).concat(extension);\n }\n};\n/**\r\n * Formats a phone number.\r\n *\r\n * format(phoneNumberInstance, 'INTERNATIONAL', { ..., v2: true }, metadata)\r\n * format(phoneNumberInstance, 'NATIONAL', { ..., v2: true }, metadata)\r\n *\r\n * format({ phone: '8005553535', country: 'RU' }, 'INTERNATIONAL', { ... }, metadata)\r\n * format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', undefined, metadata)\r\n *\r\n * @param {object|PhoneNumber} input — If `options.v2: true` flag is passed, the `input` should be a `PhoneNumber` instance. Otherwise, it should be an object of shape `{ phone: '...', country: '...' }`.\r\n * @param {string} format\r\n * @param {object} [options]\r\n * @param {object} metadata\r\n * @return {string}\r\n */\n\nfunction formatNumber(input, format, options, metadata) {\n // Apply default options.\n if (options) {\n options = _objectSpread(_objectSpread({}, DEFAULT_OPTIONS), options);\n } else {\n options = DEFAULT_OPTIONS;\n }\n\n metadata = new es6_metadata[\"default\"](metadata);\n\n if (input.country && input.country !== '001') {\n // Validate `input.country`.\n if (!metadata.hasCountry(input.country)) {\n throw new Error(\"Unknown country: \".concat(input.country));\n }\n\n metadata.country(input.country);\n } else if (input.countryCallingCode) {\n metadata.selectNumberingPlan(input.countryCallingCode);\n } else return input.phone || '';\n\n var countryCallingCode = metadata.countryCallingCode();\n var nationalNumber = options.v2 ? input.nationalNumber : input.phone; // This variable should have been declared inside `case`s\n // but Babel has a bug and it says \"duplicate variable declaration\".\n\n var number;\n\n switch (format) {\n case 'NATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return '';\n }\n\n number = formatNationalNumber(nationalNumber, input.carrierCode, 'NATIONAL', metadata, options);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'INTERNATIONAL':\n // Legacy argument support.\n // (`{ country: ..., phone: '' }`)\n if (!nationalNumber) {\n return \"+\".concat(countryCallingCode);\n }\n\n number = formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata, options);\n number = \"+\".concat(countryCallingCode, \" \").concat(number);\n return addExtension(number, input.ext, metadata, options.formatExtension);\n\n case 'E.164':\n // `E.164` doesn't define \"phone number extensions\".\n return \"+\".concat(countryCallingCode).concat(nationalNumber);\n\n case 'RFC3966':\n return formatRFC3966({\n number: \"+\".concat(countryCallingCode).concat(nationalNumber),\n ext: input.ext\n });\n // For reference, here's Google's IDD formatter:\n // https://github.com/google/libphonenumber/blob/32719cf74e68796788d1ca45abc85dcdc63ba5b9/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L1546\n // Not saying that this IDD formatter replicates it 1:1, but it seems to work.\n // Who would even need to format phone numbers in IDD format anyway?\n\n case 'IDD':\n if (!options.fromCountry) {\n return; // throw new Error('`fromCountry` option not passed for IDD-prefixed formatting.')\n }\n\n var formattedNumber = formatIDD(nationalNumber, input.carrierCode, countryCallingCode, options.fromCountry, metadata);\n return addExtension(formattedNumber, input.ext, metadata, options.formatExtension);\n\n default:\n throw new Error(\"Unknown \\\"format\\\" argument passed to \\\"formatNumber()\\\": \\\"\".concat(format, \"\\\"\"));\n }\n}\n\nfunction formatNationalNumber(number, carrierCode, formatAs, metadata, options) {\n var format = chooseFormatForNumber(metadata.formats(), number);\n\n if (!format) {\n return number;\n }\n\n return formatNationalNumberUsingFormat(number, format, {\n useInternationalFormat: formatAs === 'INTERNATIONAL',\n withNationalPrefix: format.nationalPrefixIsOptionalWhenFormattingInNationalFormat() && options && options.nationalPrefix === false ? false : true,\n carrierCode: carrierCode,\n metadata: metadata\n });\n}\n\nfunction chooseFormatForNumber(availableFormats, nationalNnumber) {\n for (var _iterator = format_createForOfIteratorHelperLoose(availableFormats), _step; !(_step = _iterator()).done;) {\n var format = _step.value;\n\n // Validate leading digits.\n // The test case for \"else path\" could be found by searching for\n // \"format.leadingDigitsPatterns().length === 0\".\n if (format.leadingDigitsPatterns().length > 0) {\n // The last leading_digits_pattern is used here, as it is the most detailed\n var lastLeadingDigitsPattern = format.leadingDigitsPatterns()[format.leadingDigitsPatterns().length - 1]; // If leading digits don't match then move on to the next phone number format\n\n if (nationalNnumber.search(lastLeadingDigitsPattern) !== 0) {\n continue;\n }\n } // Check that the national number matches the phone number format regular expression\n\n\n if (matchesEntirely(nationalNnumber, format.pattern())) {\n return format;\n }\n }\n}\n\nfunction addExtension(formattedNumber, ext, metadata, formatExtension) {\n return ext ? formatExtension(formattedNumber, ext, metadata) : formattedNumber;\n}\n\nfunction formatIDD(nationalNumber, carrierCode, countryCallingCode, fromCountry, metadata) {\n var fromCountryCallingCode = (0,es6_metadata.getCountryCallingCode)(fromCountry, metadata.metadata); // When calling within the same country calling code.\n\n if (fromCountryCallingCode === countryCallingCode) {\n var formattedNumber = formatNationalNumber(nationalNumber, carrierCode, 'NATIONAL', metadata); // For NANPA regions, return the national format for these regions\n // but prefix it with the country calling code.\n\n if (countryCallingCode === '1') {\n return countryCallingCode + ' ' + formattedNumber;\n } // If regions share a country calling code, the country calling code need\n // not be dialled. This also applies when dialling within a region, so this\n // if clause covers both these cases. Technically this is the case for\n // dialling from La Reunion to other overseas departments of France (French\n // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover\n // this edge case for now and for those cases return the version including\n // country calling code. Details here:\n // http://www.petitfute.com/voyage/225-info-pratiques-reunion\n //\n\n\n return formattedNumber;\n }\n\n var iddPrefix = getIddPrefix(fromCountry, undefined, metadata.metadata);\n\n if (iddPrefix) {\n return \"\".concat(iddPrefix, \" \").concat(countryCallingCode, \" \").concat(formatNationalNumber(nationalNumber, null, 'INTERNATIONAL', metadata));\n }\n}\n//# sourceMappingURL=format.js.map\n;// ../../../node_modules/libphonenumber-js/es6/PhoneNumber.js\nfunction PhoneNumber_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction PhoneNumber_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? PhoneNumber_ownKeys(Object(source), !0).forEach(function (key) { PhoneNumber_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : PhoneNumber_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction PhoneNumber_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n // import checkNumberLength from './helpers/checkNumberLength.js'\n\n\n\n\nvar USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;\n\nvar PhoneNumber = /*#__PURE__*/function () {\n /**\r\n * @param {string} countryOrCountryCallingCode\r\n * @param {string} nationalNumber\r\n * @param {object} metadata — Metadata JSON\r\n * @return {PhoneNumber}\r\n */\n function PhoneNumber(countryOrCountryCallingCode, nationalNumber, metadata) {\n _classCallCheck(this, PhoneNumber);\n\n if (!countryOrCountryCallingCode) {\n throw new TypeError('`country` or `countryCallingCode` not passed');\n }\n\n if (!nationalNumber) {\n throw new TypeError('`nationalNumber` not passed');\n }\n\n if (!metadata) {\n throw new TypeError('`metadata` not passed');\n }\n\n var _getCountryAndCountry = getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadata),\n country = _getCountryAndCountry.country,\n countryCallingCode = _getCountryAndCountry.countryCallingCode;\n\n this.country = country;\n this.countryCallingCode = countryCallingCode;\n this.nationalNumber = nationalNumber;\n this.number = '+' + this.countryCallingCode + this.nationalNumber; // Exclude `metadata` property output from `PhoneNumber.toString()`\n // so that it doesn't clutter the console output of Node.js.\n // Previously, when Node.js did `console.log(new PhoneNumber(...))`,\n // it would output the whole internal structure of the `metadata` object.\n\n this.getMetadata = function () {\n return metadata;\n };\n }\n\n _createClass(PhoneNumber, [{\n key: \"setExt\",\n value: function setExt(ext) {\n this.ext = ext;\n }\n }, {\n key: \"getPossibleCountries\",\n value: function getPossibleCountries() {\n if (this.country) {\n return [this.country];\n }\n\n return getPossibleCountriesForNumber(this.countryCallingCode, this.nationalNumber, this.getMetadata());\n }\n }, {\n key: \"isPossible\",\n value: function isPossible() {\n return isPossiblePhoneNumber(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return isValidNumber(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"isNonGeographic\",\n value: function isNonGeographic() {\n var metadata = new es6_metadata[\"default\"](this.getMetadata());\n return metadata.isNonGeographicCallingCode(this.countryCallingCode);\n }\n }, {\n key: \"isEqual\",\n value: function isEqual(phoneNumber) {\n return this.number === phoneNumber.number && this.ext === phoneNumber.ext;\n } // This function was originally meant to be an equivalent for `validatePhoneNumberLength()`,\n // but later it was found out that it doesn't include the possible `TOO_SHORT` result\n // returned from `parsePhoneNumberWithError()` in the original `validatePhoneNumberLength()`,\n // so eventually I simply commented out this method from the `PhoneNumber` class\n // and just left the `validatePhoneNumberLength()` function, even though that one would require\n // and additional step to also validate the actual country / calling code of the phone number.\n // validateLength() {\n // \tconst metadata = new Metadata(this.getMetadata())\n // \tmetadata.selectNumberingPlan(this.countryCallingCode)\n // \tconst result = checkNumberLength(this.nationalNumber, metadata)\n // \tif (result !== 'IS_POSSIBLE') {\n // \t\treturn result\n // \t}\n // }\n\n }, {\n key: \"getType\",\n value: function getType() {\n return getNumberType(this, {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"format\",\n value: function format(_format, options) {\n return formatNumber(this, _format, options ? PhoneNumber_objectSpread(PhoneNumber_objectSpread({}, options), {}, {\n v2: true\n }) : {\n v2: true\n }, this.getMetadata());\n }\n }, {\n key: \"formatNational\",\n value: function formatNational(options) {\n return this.format('NATIONAL', options);\n }\n }, {\n key: \"formatInternational\",\n value: function formatInternational(options) {\n return this.format('INTERNATIONAL', options);\n }\n }, {\n key: \"getURI\",\n value: function getURI(options) {\n return this.format('RFC3966', options);\n }\n }]);\n\n return PhoneNumber;\n}();\n\n\n\nvar isCountryCode = function isCountryCode(value) {\n return /^[A-Z]{2}$/.test(value);\n};\n\nfunction getCountryAndCountryCallingCode(countryOrCountryCallingCode, metadataJson) {\n var country;\n var countryCallingCode;\n var metadata = new es6_metadata[\"default\"](metadataJson); // If country code is passed then derive `countryCallingCode` from it.\n // Also store the country code as `.country`.\n\n if (isCountryCode(countryOrCountryCallingCode)) {\n country = countryOrCountryCallingCode;\n metadata.selectNumberingPlan(country);\n countryCallingCode = metadata.countryCallingCode();\n } else {\n countryCallingCode = countryOrCountryCallingCode;\n /* istanbul ignore if */\n\n if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\n if (metadata.isNonGeographicCallingCode(countryCallingCode)) {\n country = '001';\n }\n }\n }\n\n return {\n country: country,\n countryCallingCode: countryCallingCode\n };\n}\n//# sourceMappingURL=PhoneNumber.js.map\n;// ../../../node_modules/libphonenumber-js/es6/getExampleNumber.js\n\nfunction getExampleNumber(country, examples, metadata) {\n if (examples[country]) {\n return new PhoneNumber(country, examples[country], metadata);\n }\n}\n//# sourceMappingURL=getExampleNumber.js.map\n;// ../../../node_modules/libphonenumber-js/min/exports/getExampleNumber.js\n\r\n\r\n\r\nfunction getExampleNumber_getExampleNumber() {\r\n\treturn (0,withMetadataArgument[\"default\"])(getExampleNumber, arguments)\r\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL21pbi9leHBvcnRzL2dldEV4YW1wbGVOdW1iZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDhEQUE4RCxpRkFBaUYsZ0RBQWdELHdIQUF3SCxnQkFBZ0IsV0FBVyxxQkFBcUIsNEJBQTRCLGNBQWMsU0FBUyxtQ0FBbUM7O0FBRTdiLGtEQUFrRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNEOztBQUU3Uyx1Q0FBdUMsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUV6SztBQUNBO0FBQ0EsWUFBWSxHQUFHO0FBQ2YsWUFBWSxHQUFHO0FBQ2YsWUFBWTtBQUNaO0FBQ2U7QUFDZjs7QUFFQSxrRUFBa0UsNEJBQTRCO0FBQzlGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLEdBQUc7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7QUNoQzJDO0FBQzVCO0FBQ2Y7QUFDQSxFQUFFO0FBQ0Y7O0FBRU87QUFDUCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlHQUFpRztBQUNqRzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFdBQVcsbURBQW1ELCtCQUErQjtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLDZDQUE2QztBQUM3QztBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsNkM7O0FDL0VxQztBQUMwQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBZTtBQUNwRDtBQUNBLGdCQUFnQixvQ0FBb0MsSUFBSSxLQUFLO0FBQzdELGdCQUFnQixvQ0FBb0M7QUFDcEQ7QUFDQSxZQUFZLG9CQUFvQiw0SUFBNEksOEJBQThCO0FBQzFNLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEIsWUFBWTtBQUNaOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLHVCQUFROztBQUV6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDOztBQ25GQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQzs7QUNYQSxTQUFTLDRDQUErQixzQkFBc0IsaUZBQWlGLGdEQUFnRCw4QkFBOEIsd0NBQTJCLCtEQUErRCxnQkFBZ0IsV0FBVyxxQkFBcUIsNEJBQTRCLGNBQWMsU0FBUyxtQ0FBbUM7O0FBRTdiLFNBQVMsd0NBQTJCLGNBQWMsZ0JBQWdCLGtDQUFrQyw4QkFBaUIsYUFBYSx3REFBd0QsNkRBQTZELHNEQUFzRCxvRkFBb0YsOEJBQWlCOztBQUVsWixTQUFTLDhCQUFpQixhQUFhLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFbkk7QUFDYTtBQUNuRCxpSkFBaUo7O0FBRWxJO0FBQ2YseUJBQXlCO0FBQ3pCO0FBQ0EsMkJBQTJCLCtDQUErQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsdUJBQVE7QUFDekI7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTs7QUFFQSxPQUFPLGVBQWU7QUFDdEI7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHVCQUF1Qiw0Q0FBK0IscUNBQXFDLDRCQUE0QjtBQUN2SDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLGVBQWU7QUFDeEI7QUFDQSx5Qzs7QUMxRnFDO0FBQ3NCO0FBQ0o7QUFDdkQ7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGVBQWU7QUFDakQ7QUFDQSxnQkFBZ0Isb0NBQW9DLElBQUksS0FBSztBQUM3RCxnQkFBZ0Isb0NBQW9DO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvQ0FBb0M7QUFDdkQ7QUFDQTs7QUFFZTtBQUNmLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EsaUJBQWlCLHVCQUFRO0FBQ3pCLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixJQUFJO0FBQ0o7OztBQUdBO0FBQ0EsU0FBUyxlQUFlO0FBQ3hCO0FBQ0EsbUM7O0FDdkRzQztBQUN0QztBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCOztBQUVlO0FBQ2Ysc0JBQXNCLHVCQUFROztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHNCQUFzQix1QkFBUTs7QUFFOUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5RDs7QUNsQ0E7QUFDTyw0QkFBNEI7QUFDbkM7O0FBRU8sNkJBQTZCOztBQUU3QixpQ0FBaUM7QUFDeEM7O0FBRU8saUVBQWlFOztBQUV4RTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1EQUFtRDs7QUFFbkQsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFTztBQUNBLDRCQUE0QjtBQUNuQyxxQzs7QUN4Qm9ELENBQUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmLHVEQUF1RCxpQkFBaUI7QUFDeEU7QUFDQSw0RDs7QUNsQ3FGLENBQUM7QUFDdEY7QUFDQTtBQUNBOztBQUVPO0FBQ1E7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLGdDQUFnQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0EsMkQ7O0FDaENzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEVBQTBFO0FBQzFFOztBQUVlO0FBQ2YsNEJBQTRCLHVCQUFRO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDOztBQzFCa0QsQ0FBQzs7QUFFbkQsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBLHFCQUFxQixZQUFZLEtBQUsseUJBQXlCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7O0FBR2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTs7QUFFckI7QUFDQSxhQUFhLFFBQVE7O0FBRXJCO0FBQ0EsYUFBYSxRQUFROztBQUVyQjtBQUNBLGFBQWEsUUFBUTs7QUFFckIsbUVBQW1FOztBQUVuRSxhQUFhLFFBQVE7O0FBRXJCO0FBQ0EsYUFBYSxRQUFROztBQUVyQixpQ0FBaUM7QUFDakM7O0FBRUEsYUFBYSxRQUFROztBQUVyQixzSEFBc0g7QUFDdEg7O0FBRUEsYUFBYSxRQUFROztBQUVyQixpRkFBaUY7O0FBRWpGLGFBQWEsUUFBUTs7QUFFckIsb0NBQW9DO0FBQ3BDOztBQUVBLGFBQWEsUUFBUTs7QUFFckIsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLFFBQVE7O0FBRXJCLDRDQUE0QyxFQUFFLEVBQUU7QUFDaEQsYUFBYSxRQUFROztBQUVyQjtBQUNBLGFBQWEsUUFBUTs7QUFFckI7QUFDQSxhQUFhLFFBQVE7O0FBRXJCO0FBQ0EsYUFBYSxRQUFROztBQUVyQjtBQUNBLGFBQWEsUUFBUTs7QUFFckI7QUFDQSxhQUFhLFFBQVE7O0FBRXJCLHFMQUFxTDtBQUNyTCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtEOztBQzNHa0c7QUFDdkIsQ0FBQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsYUFBYTtBQUMxQjtBQUNBLHNDQUFzQyxHQUFHO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUEsNENBQTRDLFlBQVksTUFBTSxJQUFJLGtCQUFrQixLQUFLLEdBQUc7QUFDNUY7QUFDQTtBQUNBOztBQUVPLCtCQUErQixVQUFVLE1BQU0sSUFBSSxrQkFBa0IsaUJBQWlCLGdCQUFnQixZQUFZLFlBQVksR0FBRyxVQUFVLGlCQUFpQixHQUFHLFlBQVksU0FBUztBQUMzTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhEQUE4RCxVQUFVLE1BQU0sSUFBSSxrQkFBa0IsaUJBQWlCLGdCQUFnQixZQUFZLFlBQVksSUFBSTtBQUMxSjtBQUNQLFFBQVEsc0JBQXNCLFdBQVc7QUFDekM7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZiwwQkFBMEIsa0JBQWtCO0FBQzVDLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBLCtDOztBQ3BFQSxrQ0FBa0MsZ0VBQWdFLGtDQUEyQjs7QUFFN0gsOEJBQThCOztBQUU5Qix5Q0FBeUMsMEdBQTBHLHdCQUF3QixlQUFlLGVBQWUsZ0JBQWdCLFlBQVksTUFBTSx3QkFBd0IsK0JBQStCLGFBQWEscUJBQXFCLHVDQUF1QyxjQUFjLFdBQVcsWUFBWSxVQUFVLE1BQU0sbURBQW1ELFVBQVUsc0JBQXNCOztBQUVuZixnQ0FBZ0M7O0FBRWhDLFNBQVMsc0NBQStCLHNCQUFzQixpRkFBaUYsZ0RBQWdELDhCQUE4QixrQ0FBMkIsK0RBQStELGdCQUFnQixXQUFXLHFCQUFxQiw0QkFBNEIsY0FBYyxTQUFTLG1DQUFtQzs7QUFFN2IsU0FBUyxrQ0FBMkIsY0FBYyxnQkFBZ0Isa0NBQWtDLHdCQUFpQixhQUFhLHdEQUF3RCw2REFBNkQsc0RBQXNELG9GQUFvRix3QkFBaUI7O0FBRWxaLFNBQVMsd0JBQWlCLGFBQWEsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUU5RyxDQUFDOztBQUU1RDtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVEsR0FBRyxlQUFlO0FBQ3RDOztBQUVPO0FBQ1A7QUFDQSxXQUFXOztBQUVYOztBQUVBLHVCQUF1QixzQ0FBK0IsY0FBYyxZQUFZLDRCQUE0QjtBQUM1Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSixPQUFPLG1CQUFtQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRLEtBQUsscUJBQXFCO0FBQzlDLFlBQVksUUFBUTtBQUNwQjs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQSxtQzs7QUN6RkEsU0FBUyxxQ0FBK0Isc0JBQXNCLGlGQUFpRixnREFBZ0QsOEJBQThCLGlDQUEyQiwrREFBK0QsZ0JBQWdCLFdBQVcscUJBQXFCLDRCQUE0QixjQUFjLFNBQVMsbUNBQW1DOztBQUU3YixTQUFTLGlDQUEyQixjQUFjLGdCQUFnQixrQ0FBa0MsdUJBQWlCLGFBQWEsd0RBQXdELDZEQUE2RCxzREFBc0Qsb0ZBQW9GLHVCQUFpQjs7QUFFbFosU0FBUyx1QkFBaUIsYUFBYSx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7O0FBRXpLLDJDQUEyQyxnQ0FBZ0Msb0NBQW9DLG9EQUFvRCw2REFBNkQsaUVBQWlFLHNDQUFzQzs7QUFFdlUsaUNBQWlDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsNkRBQTZELDRDQUE0QyxvS0FBb0ssbUZBQW1GLEtBQUs7O0FBRTFlLDRDQUE0QyxrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9COztBQUVwTTtBQUNBO0FBQ0E7QUFDQTtBQUMyRDtBQUNnQztBQUMzQjtBQUNYO0FBQ0E7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxlQUFlO0FBQ2pFLDZDQUE2QyxlQUFlO0FBQzVEO0FBQ0EsWUFBWSxvQ0FBb0MscUJBQXFCLEtBQUs7QUFDMUUsWUFBWSxvQ0FBb0M7QUFDaEQ7QUFDQSxZQUFZLG9CQUFvQiw0SUFBNEksOEJBQThCO0FBQzFNLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVk7QUFDWjs7QUFFZTtBQUNmO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsSUFBSTtBQUNKO0FBQ0E7O0FBRUEsaUJBQWlCLHVCQUFROztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLHdFQUF3RTtBQUN4RTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHlCQUF5QjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSx5QkFBeUI7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUywrQkFBK0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRU87QUFDUCx1QkFBdUIscUNBQStCLDJCQUEyQiw0QkFBNEI7QUFDN0c7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSDs7QUFFaEg7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR04sUUFBUSxlQUFlO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQixzQ0FBcUIsa0NBQWtDOztBQUV0RjtBQUNBLG1HQUFtRztBQUNuRzs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0M7O0FDN0xBLFNBQVMsbUJBQU8sMkJBQTJCLGdDQUFnQyxvQ0FBb0Msb0RBQW9ELDZEQUE2RCxpRUFBaUUsc0NBQXNDOztBQUV2VSxTQUFTLHdCQUFhLFdBQVcsZ0JBQWdCLHNCQUFzQixPQUFPLHVEQUF1RCxRQUFRLG1CQUFPLDhDQUE4QywwQkFBZSw2QkFBNkIsbUhBQW1ILG1CQUFPLDBDQUEwQyxtRkFBbUYsS0FBSzs7QUFFMWUsU0FBUywwQkFBZSxvQkFBb0Isa0JBQWtCLGtDQUFrQyxvRUFBb0UsS0FBSyxPQUFPLG9CQUFvQjs7QUFFcE0sa0RBQWtELDBDQUEwQzs7QUFFNUYsNENBQTRDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7O0FBRS9QLDhEQUE4RCxzRUFBc0UsOERBQThELGtEQUFrRCxpQkFBaUIsR0FBRzs7QUFFbk87QUFDVTtBQUNOLENBQUM7O0FBRWE7QUFDZ0M7QUFDaEQ7QUFDdkM7O0FBRUE7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsNkJBQTZCO0FBQzFDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxhQUFhLHFCQUFnQjtBQUM3QjtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQVE7QUFDakM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUI7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGFBQWEsWUFBWSwwQkFBMEIsd0JBQWEsQ0FBQyx3QkFBYSxHQUFHLGNBQWM7QUFDL0Y7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFaUM7O0FBRWxDO0FBQ0EsaUJBQWlCLEVBQUU7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUFRLGdCQUFnQjtBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUM7O0FDckwyQztBQUM1QjtBQUNmO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQSw0Qzs7QUNONEQ7QUFDZTtBQUMzRTtBQUNPLFNBQVMsaUNBQWdCO0FBQ2hDLFFBQVEsbUNBQW9CLENBQUMsZ0JBQWlCO0FBQzlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9tZXJnZUFycmF5cy5qcz80Y2EzIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanM/YjRjMSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9pc1Bvc3NpYmxlLmpzP2JmYjAiLCJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9tYXRjaGVzRW50aXJlbHkuanM/OWI1NSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2dldE51bWJlclR5cGUuanM/MjAwOCIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9pc1ZhbGlkLmpzPzE4N2UiLCJ3ZWJwYWNrOi8vZ3Jhdml0eWZvcm1zLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9saWJwaG9uZW51bWJlci1qcy9lczYvaGVscGVycy9nZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlci5qcz8wNDVjIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2NvbnN0YW50cy5qcz9lMjNmIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUuanM/YzRkZSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanM/OWFjMCIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2dldElkZFByZWZpeC5qcz83OTRmIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2hlbHBlcnMvZXh0ZW5zaW9uL2NyZWF0ZUV4dGVuc2lvblBhdHRlcm4uanM/MzYzYSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL2lzVmlhYmxlUGhvbmVOdW1iZXIuanM/NzU1YSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9oZWxwZXJzL1JGQzM5NjYuanM/ODBmOSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9mb3JtYXQuanM/N2QwMyIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL2VzNi9QaG9uZU51bWJlci5qcz80ZTMyIiwid2VicGFjazovL2dyYXZpdHlmb3Jtcy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbGlicGhvbmVudW1iZXItanMvZXM2L2dldEV4YW1wbGVOdW1iZXIuanM/NDBjZSIsIndlYnBhY2s6Ly9ncmF2aXR5Zm9ybXMvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xpYnBob25lbnVtYmVyLWpzL21pbi9leHBvcnRzL2dldEV4YW1wbGVOdW1iZXIuanM/MzAyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyoqXHJcbiAqIE1lcmdlcyB0d28gYXJyYXlzLlxyXG4gKiBAcGFyYW0gIHsqfSBhXHJcbiAqIEBwYXJhbSAgeyp9IGJcclxuICogQHJldHVybiB7Kn1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUFycmF5cyhhLCBiKSB7XG4gIHZhciBtZXJnZWQgPSBhLnNsaWNlKCk7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShiKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgZWxlbWVudCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgaWYgKGEuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgIG1lcmdlZC5wdXNoKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7IC8vIEVTNiB2ZXJzaW9uLCByZXF1aXJlcyBTZXQgcG9seWZpbGwuXG4gIC8vIGxldCBtZXJnZWQgPSBuZXcgU2V0KGEpXG4gIC8vIGZvciAoY29uc3QgZWxlbWVudCBvZiBiKSB7XG4gIC8vIFx0bWVyZ2VkLmFkZChpKVxuICAvLyB9XG4gIC8vIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCkuc29ydCgoYSwgYikgPT4gYSAtIGIpXG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZUFycmF5cy5qcy5tYXAiLCJpbXBvcnQgbWVyZ2VBcnJheXMgZnJvbSAnLi9tZXJnZUFycmF5cy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjaGVja051bWJlckxlbmd0aChuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgcmV0dXJuIGNoZWNrTnVtYmVyTGVuZ3RoRm9yVHlwZShuYXRpb25hbE51bWJlciwgdW5kZWZpbmVkLCBtZXRhZGF0YSk7XG59IC8vIENoZWNrcyB3aGV0aGVyIGEgbnVtYmVyIGlzIHBvc3NpYmxlIGZvciB0aGUgY291bnRyeSBiYXNlZCBvbiBpdHMgbGVuZ3RoLlxuLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUgXCJuZXdcIiBtZXRhZGF0YSB3aGljaCBoYXMgXCJwb3NzaWJsZSBsZW5ndGhzXCIuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja051bWJlckxlbmd0aEZvclR5cGUobmF0aW9uYWxOdW1iZXIsIHR5cGUsIG1ldGFkYXRhKSB7XG4gIHZhciB0eXBlX2luZm8gPSBtZXRhZGF0YS50eXBlKHR5cGUpOyAvLyBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIFwiPHBvc3NpYmxlUGVuZ3Rocy8+XCIgc2V0IGZvciBldmVyeSB0eXBlIGVsZW1lbnQuXG4gIC8vIFRoaXMgaXMgZGVjbGFyZWQgaW4gdGhlIFhNTCBzY2hlbWEuXG4gIC8vIEZvciBzaXplIGVmZmljaWVuY3ksIHdoZXJlIGEgc3ViLWRlc2NyaXB0aW9uIChlLmcuIGZpeGVkLWxpbmUpXG4gIC8vIGhhcyB0aGUgc2FtZSBcIjxwb3NzaWJsZVBlbmd0aHMvPlwiIGFzIHRoZSBcImdlbmVyYWwgZGVzY3JpcHRpb25cIiwgdGhpcyBpcyBtaXNzaW5nLFxuICAvLyBzbyB3ZSBmYWxsIGJhY2sgdG8gdGhlIFwiZ2VuZXJhbCBkZXNjcmlwdGlvblwiLiBXaGVyZSBubyBudW1iZXJzIG9mIHRoZSB0eXBlXG4gIC8vIGV4aXN0IGF0IGFsbCwgdGhlcmUgaXMgb25lIHBvc3NpYmxlIGxlbmd0aCAoLTEpIHdoaWNoIGlzIGd1YXJhbnRlZWRcbiAgLy8gbm90IHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgYW55IHJlYWwgcGhvbmUgbnVtYmVyLlxuXG4gIHZhciBwb3NzaWJsZV9sZW5ndGhzID0gdHlwZV9pbmZvICYmIHR5cGVfaW5mby5wb3NzaWJsZUxlbmd0aHMoKSB8fCBtZXRhZGF0YS5wb3NzaWJsZUxlbmd0aHMoKTsgLy8gbGV0IGxvY2FsX2xlbmd0aHMgICAgPSB0eXBlX2luZm8gJiYgdHlwZS5wb3NzaWJsZUxlbmd0aHNMb2NhbCgpIHx8IG1ldGFkYXRhLnBvc3NpYmxlTGVuZ3Roc0xvY2FsKClcbiAgLy8gTWV0YWRhdGEgYmVmb3JlIHZlcnNpb24gYDEuMC4xOGAgZGlkbid0IGNvbnRhaW4gYHBvc3NpYmxlX2xlbmd0aHNgLlxuXG4gIGlmICghcG9zc2libGVfbGVuZ3Rocykge1xuICAgIHJldHVybiAnSVNfUE9TU0lCTEUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdGSVhFRF9MSU5FX09SX01PQklMRScpIHtcbiAgICAvLyBObyBzdWNoIGNvdW50cnkgaW4gbWV0YWRhdGEuXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghbWV0YWRhdGEudHlwZSgnRklYRURfTElORScpKSB7XG4gICAgICAvLyBUaGUgcmFyZSBjYXNlIGhhcyBiZWVuIGVuY291bnRlcmVkIHdoZXJlIG5vIGZpeGVkTGluZSBkYXRhIGlzIGF2YWlsYWJsZVxuICAgICAgLy8gKHRydWUgZm9yIHNvbWUgbm9uLWdlb2dyYXBoaWMgZW50aXRpZXMpLCBzbyB3ZSBqdXN0IGNoZWNrIG1vYmlsZS5cbiAgICAgIHJldHVybiBjaGVja051bWJlckxlbmd0aEZvclR5cGUobmF0aW9uYWxOdW1iZXIsICdNT0JJTEUnLCBtZXRhZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIG1vYmlsZV90eXBlID0gbWV0YWRhdGEudHlwZSgnTU9CSUxFJyk7XG5cbiAgICBpZiAobW9iaWxlX3R5cGUpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBtb2JpbGUgZGF0YSBpbiBpZiB0aGVyZSB3YXMgYW55LiBcIkNvbmNhdFwiIGNyZWF0ZXMgYSBuZXdcbiAgICAgIC8vIGFycmF5LCBpdCBkb2Vzbid0IGVkaXQgcG9zc2libGVfbGVuZ3RocyBpbiBwbGFjZSwgc28gd2UgZG9uJ3QgbmVlZCBhIGNvcHkuXG4gICAgICAvLyBOb3RlIHRoYXQgd2hlbiBhZGRpbmcgdGhlIHBvc3NpYmxlIGxlbmd0aHMgZnJvbSBtb2JpbGUsIHdlIGhhdmVcbiAgICAgIC8vIHRvIGFnYWluIGNoZWNrIHRoZXkgYXJlbid0IGVtcHR5IHNpbmNlIGlmIHRoZXkgYXJlIHRoaXMgaW5kaWNhdGVzXG4gICAgICAvLyB0aGV5IGFyZSB0aGUgc2FtZSBhcyB0aGUgZ2VuZXJhbCBkZXNjIGFuZCBzaG91bGQgYmUgb2J0YWluZWQgZnJvbSB0aGVyZS5cbiAgICAgIHBvc3NpYmxlX2xlbmd0aHMgPSBtZXJnZUFycmF5cyhwb3NzaWJsZV9sZW5ndGhzLCBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHMoKSk7IC8vIFRoZSBjdXJyZW50IGxpc3QgaXMgc29ydGVkOyB3ZSBuZWVkIHRvIG1lcmdlIGluIHRoZSBuZXcgbGlzdCBhbmRcbiAgICAgIC8vIHJlLXNvcnQgKGR1cGxpY2F0ZXMgYXJlIG9rYXkpLiBTb3J0aW5nIGlzbid0IHNvIGV4cGVuc2l2ZSBiZWNhdXNlXG4gICAgICAvLyB0aGUgbGlzdHMgYXJlIHZlcnkgc21hbGwuXG4gICAgICAvLyBpZiAobG9jYWxfbGVuZ3Rocykge1xuICAgICAgLy8gXHRsb2NhbF9sZW5ndGhzID0gbWVyZ2VBcnJheXMobG9jYWxfbGVuZ3RocywgbW9iaWxlX3R5cGUucG9zc2libGVMZW5ndGhzTG9jYWwoKSlcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyBcdGxvY2FsX2xlbmd0aHMgPSBtb2JpbGVfdHlwZS5wb3NzaWJsZUxlbmd0aHNMb2NhbCgpXG4gICAgICAvLyB9XG4gICAgfVxuICB9IC8vIElmIHRoZSB0eXBlIGRvZXNuJ3QgZXhpc3QgdGhlbiByZXR1cm4gJ0lOVkFMSURfTEVOR1RIJy5cbiAgZWxzZSBpZiAodHlwZSAmJiAhdHlwZV9pbmZvKSB7XG4gICAgcmV0dXJuICdJTlZBTElEX0xFTkdUSCc7XG4gIH1cblxuICB2YXIgYWN0dWFsX2xlbmd0aCA9IG5hdGlvbmFsTnVtYmVyLmxlbmd0aDsgLy8gSW4gYGxpYnBob25lbnVtYmVyLWpzYCBhbGwgXCJsb2NhbC1vbmx5XCIgZm9ybWF0cyBhcmUgZHJvcHBlZCBmb3Igc2ltcGxpY2l0eS5cbiAgLy8gLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlcmUgaXMgbmV2ZXIgYW4gb3ZlcmxhcCBiZXdlZW4gdGhlIHBvc3NpYmxlIGxlbmd0aHNcbiAgLy8gLy8gYW5kIHRoZSBsb2NhbC1vbmx5IGxlbmd0aHM7IHRoaXMgaXMgY2hlY2tlZCBhdCBidWlsZCB0aW1lLlxuICAvLyBpZiAobG9jYWxfbGVuZ3RocyAmJiBsb2NhbF9sZW5ndGhzLmluZGV4T2YobmF0aW9uYWxOdW1iZXIubGVuZ3RoKSA+PSAwKVxuICAvLyB7XG4gIC8vIFx0cmV0dXJuICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJ1xuICAvLyB9XG5cbiAgdmFyIG1pbmltdW1fbGVuZ3RoID0gcG9zc2libGVfbGVuZ3Roc1swXTtcblxuICBpZiAobWluaW11bV9sZW5ndGggPT09IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ0lTX1BPU1NJQkxFJztcbiAgfVxuXG4gIGlmIChtaW5pbXVtX2xlbmd0aCA+IGFjdHVhbF9sZW5ndGgpIHtcbiAgICByZXR1cm4gJ1RPT19TSE9SVCc7XG4gIH1cblxuICBpZiAocG9zc2libGVfbGVuZ3Roc1twb3NzaWJsZV9sZW5ndGhzLmxlbmd0aCAtIDFdIDwgYWN0dWFsX2xlbmd0aCkge1xuICAgIHJldHVybiAnVE9PX0xPTkcnO1xuICB9IC8vIFdlIHNraXAgdGhlIGZpcnN0IGVsZW1lbnQgc2luY2Ugd2UndmUgYWxyZWFkeSBjaGVja2VkIGl0LlxuXG5cbiAgcmV0dXJuIHBvc3NpYmxlX2xlbmd0aHMuaW5kZXhPZihhY3R1YWxfbGVuZ3RoLCAxKSA+PSAwID8gJ0lTX1BPU1NJQkxFJyA6ICdJTlZBTElEX0xFTkdUSCc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVja051bWJlckxlbmd0aC5qcy5tYXAiLCJpbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi9tZXRhZGF0YS5qcyc7XG5pbXBvcnQgY2hlY2tOdW1iZXJMZW5ndGggZnJvbSAnLi9oZWxwZXJzL2NoZWNrTnVtYmVyTGVuZ3RoLmpzJztcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBwaG9uZSBudW1iZXIgaXMgXCJwb3NzaWJsZVwiIChiYXNpY2FsbHkganVzdCBjaGVja3MgaXRzIGxlbmd0aCkuXHJcbiAqXHJcbiAqIGlzUG9zc2libGUocGhvbmVOdW1iZXJJbnN0YW5jZSwgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB7IC4uLiB9LCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZSh7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgdW5kZWZpbmVkLCBtZXRhZGF0YSlcclxuICpcclxuICogQHBhcmFtICB7b2JqZWN0fFBob25lTnVtYmVyfSBpbnB1dCDigJQgSWYgYG9wdGlvbnMudjI6IHRydWVgIGZsYWcgaXMgcGFzc2VkLCB0aGUgYGlucHV0YCBzaG91bGQgYmUgYSBgUGhvbmVOdW1iZXJgIGluc3RhbmNlLiBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHsgcGhvbmU6ICcuLi4nLCBjb3VudHJ5OiAnLi4uJyB9YC5cclxuICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtICB7b2JqZWN0fSBtZXRhZGF0YVxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Bvc3NpYmxlUGhvbmVOdW1iZXIoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gIGlmIChvcHRpb25zLnYyKSB7XG4gICAgaWYgKCFpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaG9uZSBudW1iZXIgb2JqZWN0IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWlucHV0LnBob25lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmNvdW50cnkpIHtcbiAgICAgIGlmICghbWV0YWRhdGEuaGFzQ291bnRyeShpbnB1dC5jb3VudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvdW50cnk6IFwiLmNvbmNhdChpbnB1dC5jb3VudHJ5KSk7XG4gICAgICB9XG5cbiAgICAgIG1ldGFkYXRhLmNvdW50cnkoaW5wdXQuY291bnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaG9uZSBudW1iZXIgb2JqZWN0IHBhc3NlZCcpO1xuICAgICAgfVxuXG4gICAgICBtZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSk7XG4gICAgfVxuICB9IC8vIE9sZCBtZXRhZGF0YSAoPCAxLjAuMTgpIGhhZCBubyBcInBvc3NpYmxlIGxlbmd0aFwiIGRhdGEuXG5cblxuICBpZiAobWV0YWRhdGEucG9zc2libGVMZW5ndGhzKCkpIHtcbiAgICByZXR1cm4gaXNQb3NzaWJsZU51bWJlcihpbnB1dC5waG9uZSB8fCBpbnB1dC5uYXRpb25hbE51bWJlciwgbWV0YWRhdGEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIHdhcyBhIGJ1ZyBiZXR3ZWVuIGAxLjcuMzVgIGFuZCBgMS43LjM3YCB3aGVyZSBcInBvc3NpYmxlX2xlbmd0aHNcIlxuICAgIC8vIHdlcmUgbWlzc2luZyBmb3IgXCJub24tZ2VvZ3JhcGhpY2FsXCIgbnVtYmVyaW5nIHBsYW5zLlxuICAgIC8vIEp1c3QgYXNzdW1lIHRoZSBudW1iZXIgaXMgcG9zc2libGUgaW4gc3VjaCBjYXNlczpcbiAgICAvLyBpdCdzIHVubGlrZWx5IHRoYXQgYW55b25lIGdlbmVyYXRlZCB0aGVpciBjdXN0b20gbWV0YWRhdGFcbiAgICAvLyBpbiB0aGF0IHNob3J0IHBlcmlvZCBvZiB0aW1lIChvbmUgZGF5KS5cbiAgICAvLyBUaGlzIGNvZGUgY2FuIGJlIHJlbW92ZWQgaW4gc29tZSBmdXR1cmUgbWFqb3IgdmVyc2lvbiB1cGRhdGUuXG4gICAgaWYgKGlucHV0LmNvdW50cnlDYWxsaW5nQ29kZSAmJiBtZXRhZGF0YS5pc05vbkdlb2dyYXBoaWNDYWxsaW5nQ29kZShpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpKSB7XG4gICAgICAvLyBcIk5vbi1nZW9ncmFwaGljIGVudGl0aWVzXCIgZGlkJ3QgaGF2ZSBgcG9zc2libGVMZW5ndGhzYFxuICAgICAgLy8gZHVlIHRvIGEgYnVnIGluIG1ldGFkYXRhIGdlbmVyYXRpb24gcHJvY2Vzcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgXCJwb3NzaWJsZUxlbmd0aHNcIiBpbiBtZXRhZGF0YS4gUGVyaGFwcyB0aGUgbWV0YWRhdGEgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlZm9yZSB2MS4wLjE4LicpO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9zc2libGVOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gIC8vLCBpc0ludGVybmF0aW9uYWwpIHtcbiAgc3dpdGNoIChjaGVja051bWJlckxlbmd0aChuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpKSB7XG4gICAgY2FzZSAnSVNfUE9TU0lCTEUnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gVGhpcyBsaWJyYXJ5IGlnbm9yZXMgXCJsb2NhbC1vbmx5XCIgcGhvbmUgbnVtYmVycyAoZm9yIHNpbXBsaWNpdHkpLlxuICAgIC8vIFNlZSB0aGUgcmVhZG1lIGZvciBtb3JlIGluZm8gb24gd2hhdCBhcmUgXCJsb2NhbC1vbmx5XCIgcGhvbmUgbnVtYmVycy5cbiAgICAvLyBjYXNlICdJU19QT1NTSUJMRV9MT0NBTF9PTkxZJzpcbiAgICAvLyBcdHJldHVybiAhaXNJbnRlcm5hdGlvbmFsXG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Bvc3NpYmxlLmpzLm1hcCIsIi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZW50aXJlIGlucHV0IHNlcXVlbmNlIGNhbiBiZSBtYXRjaGVkXHJcbiAqIGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogQHJldHVybiB7Ym9vbGVhbn1cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXRjaGVzRW50aXJlbHkodGV4dCwgcmVndWxhcl9leHByZXNzaW9uKSB7XG4gIC8vIElmIGFzc2lnbmluZyB0aGUgYCcnYCBkZWZhdWx0IHZhbHVlIGlzIG1vdmVkIHRvIHRoZSBhcmd1bWVudHMgYWJvdmUsXG4gIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuICB0ZXh0ID0gdGV4dCB8fCAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJ14oPzonICsgcmVndWxhcl9leHByZXNzaW9uICsgJykkJykudGVzdCh0ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGNoZXNFbnRpcmVseS5qcy5tYXAiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4uL21ldGFkYXRhLmpzJztcbmltcG9ydCBtYXRjaGVzRW50aXJlbHkgZnJvbSAnLi9tYXRjaGVzRW50aXJlbHkuanMnO1xudmFyIE5PTl9GSVhFRF9MSU5FX1BIT05FX1RZUEVTID0gWydNT0JJTEUnLCAnUFJFTUlVTV9SQVRFJywgJ1RPTExfRlJFRScsICdTSEFSRURfQ09TVCcsICdWT0lQJywgJ1BFUlNPTkFMX05VTUJFUicsICdQQUdFUicsICdVQU4nLCAnVk9JQ0VNQUlMJ107IC8vIEZpbmRzIG91dCBuYXRpb25hbCBwaG9uZSBudW1iZXIgdHlwZSAoZml4ZWQgbGluZSwgbW9iaWxlLCBldGMpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE51bWJlclR5cGUoaW5wdXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8vIElmIGFzc2lnbmluZyB0aGUgYHt9YCBkZWZhdWx0IHZhbHVlIGlzIG1vdmVkIHRvIHRoZSBhcmd1bWVudHMgYWJvdmUsXG4gIC8vIGNvZGUgY292ZXJhZ2Ugd291bGQgZGVjcmVhc2UgZm9yIHNvbWUgd2VpcmQgcmVhc29uLlxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gV2hlbiBgcGFyc2UoKWAgcmV0dXJucyBhbiBlbXB0eSBvYmplY3Qg4oCUIGB7fWAg4oCUXG4gIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgcGhvbmUgbnVtYmVyIGlzIG1hbGZvcm1lZCxcbiAgLy8gc28gaXQgY2FuJ3QgcG9zc2libHkgYmUgdmFsaWQuXG5cbiAgaWYgKCFpbnB1dC5jb3VudHJ5ICYmICFpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeSwgaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gb3B0aW9ucy52MiA/IGlucHV0Lm5hdGlvbmFsTnVtYmVyIDogaW5wdXQucGhvbmU7IC8vIFRoZSBmb2xsb3dpbmcgaXMgY29weS1wYXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZnVuY3Rpb246XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvM2VhNTQ3ZDRmYmFhMmQwYjY3NTg4OTA0ZGZhNWQzZjI1NTdjMjdmZi9qYXZhc2NyaXB0L2kxOG4vcGhvbmVudW1iZXJzL3Bob25lbnVtYmVydXRpbC5qcyNMMjgzNVxuICAvLyBJcyB0aGlzIG5hdGlvbmFsIG51bWJlciBldmVuIHZhbGlkIGZvciB0aGlzIGNvdW50cnlcblxuICBpZiAoIW1hdGNoZXNFbnRpcmVseShuYXRpb25hbE51bWJlciwgbWV0YWRhdGEubmF0aW9uYWxOdW1iZXJQYXR0ZXJuKCkpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIElzIGl0IGZpeGVkIGxpbmUgbnVtYmVyXG5cblxuICBpZiAoaXNOdW1iZXJUeXBlRXF1YWxUbyhuYXRpb25hbE51bWJlciwgJ0ZJWEVEX0xJTkUnLCBtZXRhZGF0YSkpIHtcbiAgICAvLyBCZWNhdXNlIGR1cGxpY2F0ZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSByZW1vdmVkXG4gICAgLy8gdG8gcmVkdWNlIG1ldGFkYXRhIHNpemUsIGlmIFwibW9iaWxlXCIgcGF0dGVybiBpcyBcIlwiXG4gICAgLy8gdGhlbiBpdCBtZWFucyBpdCB3YXMgcmVtb3ZlZCBkdWUgdG8gYmVpbmcgYSBkdXBsaWNhdGUgb2YgdGhlIGZpeGVkLWxpbmUgcGF0dGVybi5cbiAgICAvL1xuICAgIGlmIChtZXRhZGF0YS50eXBlKCdNT0JJTEUnKSAmJiBtZXRhZGF0YS50eXBlKCdNT0JJTEUnKS5wYXR0ZXJuKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJ0ZJWEVEX0xJTkVfT1JfTU9CSUxFJztcbiAgICB9IC8vIGBNT0JJTEVgIHR5cGUgcGF0dGVybiBpc24ndCBpbmNsdWRlZCBpZiBpdCBtYXRjaGVkIGBGSVhFRF9MSU5FYCBvbmUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIGZvciBcIlVTXCIgY291bnRyeS5cbiAgICAvLyBPbGQgbWV0YWRhdGEgKDwgYDEuMC4xOGApIGhhZCBhIHNwZWNpZmljIFwidHlwZXNcIiBkYXRhIHN0cnVjdHVyZVxuICAgIC8vIHRoYXQgaGFwcGVuZWQgdG8gYmUgYHVuZGVmaW5lZGAgZm9yIGBNT0JJTEVgIGluIHRoYXQgY2FzZS5cbiAgICAvLyBOZXdlciBtZXRhZGF0YSAoPj0gYDEuMC4xOGApIGhhcyBhbm90aGVyIGRhdGEgc3RydWN0dXJlIHRoYXQgaXNcbiAgICAvLyBub3QgYHVuZGVmaW5lZGAgZm9yIGBNT0JJTEVgIGluIHRoYXQgY2FzZSAoaXQncyBqdXN0IGFuIGVtcHR5IGFycmF5KS5cbiAgICAvLyBTbyB0aGlzIGBpZmAgaXMganVzdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgbWV0YWRhdGEuXG5cblxuICAgIGlmICghbWV0YWRhdGEudHlwZSgnTU9CSUxFJykpIHtcbiAgICAgIHJldHVybiAnRklYRURfTElORV9PUl9NT0JJTEUnO1xuICAgIH0gLy8gQ2hlY2sgaWYgdGhlIG51bWJlciBoYXBwZW5zIHRvIHF1YWxpZnkgYXMgYm90aCBmaXhlZCBsaW5lIGFuZCBtb2JpbGUuXG4gICAgLy8gKG5vIHN1Y2ggY291bnRyeSBpbiB0aGUgbWluaW1hbCBtZXRhZGF0YSBzZXQpXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuXG4gICAgaWYgKGlzTnVtYmVyVHlwZUVxdWFsVG8obmF0aW9uYWxOdW1iZXIsICdNT0JJTEUnLCBtZXRhZGF0YSkpIHtcbiAgICAgIHJldHVybiAnRklYRURfTElORV9PUl9NT0JJTEUnO1xuICAgIH1cblxuICAgIHJldHVybiAnRklYRURfTElORSc7XG4gIH1cblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKE5PTl9GSVhFRF9MSU5FX1BIT05FX1RZUEVTKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgdHlwZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgaWYgKGlzTnVtYmVyVHlwZUVxdWFsVG8obmF0aW9uYWxOdW1iZXIsIHR5cGUsIG1ldGFkYXRhKSkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJUeXBlRXF1YWxUbyhuYXRpb25hbE51bWJlciwgdHlwZSwgbWV0YWRhdGEpIHtcbiAgdHlwZSA9IG1ldGFkYXRhLnR5cGUodHlwZSk7XG5cbiAgaWYgKCF0eXBlIHx8ICF0eXBlLnBhdHRlcm4oKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDaGVjayBpZiBhbnkgcG9zc2libGUgbnVtYmVyIGxlbmd0aHMgYXJlIHByZXNlbnQ7XG4gIC8vIGlmIHNvLCB3ZSB1c2UgdGhlbSB0byBhdm9pZCBjaGVja2luZ1xuICAvLyB0aGUgdmFsaWRhdGlvbiBwYXR0ZXJuIGlmIHRoZXkgZG9uJ3QgbWF0Y2guXG4gIC8vIElmIHRoZXkgYXJlIGFic2VudCwgdGhpcyBtZWFucyB0aGV5IG1hdGNoXG4gIC8vIHRoZSBnZW5lcmFsIGRlc2NyaXB0aW9uLCB3aGljaCB3ZSBoYXZlXG4gIC8vIGFscmVhZHkgY2hlY2tlZCBiZWZvcmUgYSBzcGVjaWZpYyBudW1iZXIgdHlwZS5cblxuXG4gIGlmICh0eXBlLnBvc3NpYmxlTGVuZ3RocygpICYmIHR5cGUucG9zc2libGVMZW5ndGhzKCkuaW5kZXhPZihuYXRpb25hbE51bWJlci5sZW5ndGgpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVzRW50aXJlbHkobmF0aW9uYWxOdW1iZXIsIHR5cGUucGF0dGVybigpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE51bWJlclR5cGUuanMubWFwIiwiaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IG1hdGNoZXNFbnRpcmVseSBmcm9tICcuL2hlbHBlcnMvbWF0Y2hlc0VudGlyZWx5LmpzJztcbmltcG9ydCBnZXROdW1iZXJUeXBlIGZyb20gJy4vaGVscGVycy9nZXROdW1iZXJUeXBlLmpzJztcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwaG9uZSBudW1iZXIgaXMgdmFsaWQuXHJcbiAqXHJcbiAqIGlzVmFsaWQocGhvbmVOdW1iZXJJbnN0YW5jZSwgeyAuLi4sIHYyOiB0cnVlIH0sIG1ldGFkYXRhKVxyXG4gKlxyXG4gKiBpc1Bvc3NpYmxlKHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCB7IC4uLiB9LCBtZXRhZGF0YSlcclxuICogaXNQb3NzaWJsZSh7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgdW5kZWZpbmVkLCBtZXRhZGF0YSlcclxuICpcclxuICogSWYgdGhlIGBudW1iZXJgIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIHBhcnNlZCB0byBhbiBvYmplY3QsXHJcbiAqIGJ1dCBvbmx5IGlmIGl0IGNvbnRhaW5zIG9ubHkgdmFsaWQgcGhvbmUgbnVtYmVyIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBwdW5jdHVhdGlvbikuXHJcbiAqIElmIHRoZSBgbnVtYmVyYCBpcyBhbiBvYmplY3QsIGl0IGlzIHVzZWQgYXMgaXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgZGVmYXVsdENvdW50cnlgIGFyZ3VtZW50IGlzIHRoZSBkZWZhdWx0IGNvdW50cnkuXHJcbiAqIEkuZS4gaXQgZG9lcyBub3QgcmVzdHJpY3QgdG8ganVzdCB0aGF0IGNvdW50cnksXHJcbiAqIGUuZy4gaW4gdGhvc2UgY2FzZXMgd2hlcmUgc2V2ZXJhbCBjb3VudHJpZXMgc2hhcmVcclxuICogdGhlIHNhbWUgcGhvbmUgbnVtYmVyaW5nIHJ1bGVzIChOQU5QQSwgQnJpdGFpbiwgZXRjKS5cclxuICogRm9yIGV4YW1wbGUsIGV2ZW4gdGhvdWdoIHRoZSBudW1iZXIgYDA3NjI0IDM2OTIzMGBcclxuICogYmVsb25ncyB0byB0aGUgSXNsZSBvZiBNYW4gKFwiSU1cIiBjb3VudHJ5IGNvZGUpXHJcbiAqIGNhbGxpbmcgYGlzVmFsaWROdW1iZXIoJzA3NjI0MzY5MjMwJywgJ0dCJywgbWV0YWRhdGEpYFxyXG4gKiBzdGlsbCByZXR1cm5zIGB0cnVlYCBiZWNhdXNlIHRoZSBjb3VudHJ5IGlzIG5vdCByZXN0cmljdGVkIHRvIGBHQmAsXHJcbiAqIGl0J3MganVzdCB0aGF0IGBHQmAgaXMgdGhlIGRlZmF1bHQgb25lIGZvciB0aGUgcGhvbmUgbnVtYmVyaW5nIHJ1bGVzLlxyXG4gKiBGb3IgcmVzdHJpY3RpbmcgdGhlIGNvdW50cnkgc2VlIGBpc1ZhbGlkTnVtYmVyRm9yUmVnaW9uKClgXHJcbiAqIHRob3VnaCByZXN0cmljdGluZyBhIGNvdW50cnkgbWlnaHQgbm90IGJlIGEgZ29vZCBpZGVhLlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlaTE4bi9saWJwaG9uZW51bWJlci9ibG9iL21hc3Rlci9GQVEubWQjd2hlbi1zaG91bGQtaS11c2UtaXN2YWxpZG51bWJlcmZvcnJlZ2lvblxyXG4gKlxyXG4gKiBFeGFtcGxlczpcclxuICpcclxuICogYGBganNcclxuICogaXNWYWxpZE51bWJlcignKzc4MDA1NTUzNTM1JywgbWV0YWRhdGEpXHJcbiAqIGlzVmFsaWROdW1iZXIoJzgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNWYWxpZE51bWJlcignODgwMDU1NTM1MzUnLCAnUlUnLCBtZXRhZGF0YSlcclxuICogaXNWYWxpZE51bWJlcih7IHBob25lOiAnODAwNTU1MzUzNScsIGNvdW50cnk6ICdSVScgfSwgbWV0YWRhdGEpXHJcbiAqIGBgYFxyXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZE51bWJlcihpbnB1dCwgb3B0aW9ucywgbWV0YWRhdGEpIHtcbiAgLy8gSWYgYXNzaWduaW5nIHRoZSBge31gIGRlZmF1bHQgdmFsdWUgaXMgbW92ZWQgdG8gdGhlIGFyZ3VtZW50cyBhYm92ZSxcbiAgLy8gY29kZSBjb3ZlcmFnZSB3b3VsZCBkZWNyZWFzZSBmb3Igc29tZSB3ZWlyZCByZWFzb24uXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4oaW5wdXQuY291bnRyeSwgaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKTsgLy8gQnkgZGVmYXVsdCwgY291bnRyaWVzIG9ubHkgaGF2ZSB0eXBlIHJlZ2V4cHMgd2hlbiBpdCdzIHJlcXVpcmVkIGZvclxuICAvLyBkaXN0aW5ndWlzaGluZyBkaWZmZXJlbnQgY291bnRyaWVzIGhhdmluZyB0aGUgc2FtZSBgY291bnRyeUNhbGxpbmdDb2RlYC5cblxuICBpZiAobWV0YWRhdGEuaGFzVHlwZXMoKSkge1xuICAgIHJldHVybiBnZXROdW1iZXJUeXBlKGlucHV0LCBvcHRpb25zLCBtZXRhZGF0YS5tZXRhZGF0YSkgIT09IHVuZGVmaW5lZDtcbiAgfSAvLyBJZiB0aGVyZSBhcmUgbm8gdHlwZSByZWdleHBzIGZvciB0aGlzIGNvdW50cnkgaW4gbWV0YWRhdGEgdGhlbiB1c2VcbiAgLy8gYG5hdGlvbmFsTnVtYmVyUGF0dGVybmAgYXMgYSBcImJldHRlciB0aGFuIG5vdGhpbmdcIiByZXBsYWNlbWVudC5cblxuXG4gIHZhciBuYXRpb25hbE51bWJlciA9IG9wdGlvbnMudjIgPyBpbnB1dC5uYXRpb25hbE51bWJlciA6IGlucHV0LnBob25lO1xuICByZXR1cm4gbWF0Y2hlc0VudGlyZWx5KG5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YS5uYXRpb25hbE51bWJlclBhdHRlcm4oKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1ZhbGlkLmpzLm1hcCIsImltcG9ydCBNZXRhZGF0YSBmcm9tICcuLi9tZXRhZGF0YS5qcyc7XG4vKipcclxuICogUmV0dXJucyBhIGxpc3Qgb2YgY291bnRyaWVzIHRoYXQgdGhlIHBob25lIG51bWJlciBjb3VsZCBwb3RlbnRpYWxseSBiZWxvbmcgdG8uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY2FsbGluZ0NvZGUg4oCUIENhbGxpbmcgY29kZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuYXRpb25hbE51bWJlciDigJQgTmF0aW9uYWwgKHNpZ25pZmljYW50KSBudW1iZXIuXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGEg4oCUIE1ldGFkYXRhLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gQSBsaXN0IG9mIHBvc3NpYmxlIGNvdW50cmllcy5cclxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyKGNhbGxpbmdDb2RlLCBuYXRpb25hbE51bWJlciwgbWV0YWRhdGEpIHtcbiAgdmFyIF9tZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG5cbiAgdmFyIHBvc3NpYmxlQ291bnRyaWVzID0gX21ldGFkYXRhLmdldENvdW50cnlDb2Rlc0ZvckNhbGxpbmdDb2RlKGNhbGxpbmdDb2RlKTtcblxuICBpZiAoIXBvc3NpYmxlQ291bnRyaWVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHBvc3NpYmxlQ291bnRyaWVzLmZpbHRlcihmdW5jdGlvbiAoY291bnRyeSkge1xuICAgIHJldHVybiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb3VsZE5hdGlvbmFsTnVtYmVyQmVsb25nVG9Db3VudHJ5KG5hdGlvbmFsTnVtYmVyLCBjb3VudHJ5LCBtZXRhZGF0YSkge1xuICB2YXIgX21ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhKTtcblxuICBfbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5KTtcblxuICBpZiAoX21ldGFkYXRhLm51bWJlcmluZ1BsYW4ucG9zc2libGVMZW5ndGhzKCkuaW5kZXhPZihuYXRpb25hbE51bWJlci5sZW5ndGgpID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFBvc3NpYmxlQ291bnRyaWVzRm9yTnVtYmVyLmpzLm1hcCIsIi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyLlxuZXhwb3J0IHZhciBNSU5fTEVOR1RIX0ZPUl9OU04gPSAyOyAvLyBUaGUgSVRVIHNheXMgdGhlIG1heGltdW0gbGVuZ3RoIHNob3VsZCBiZSAxNSxcbi8vIGJ1dCBvbmUgY2FuIGZpbmQgbG9uZ2VyIG51bWJlcnMgaW4gR2VybWFueS5cblxuZXhwb3J0IHZhciBNQVhfTEVOR1RIX0ZPUl9OU04gPSAxNzsgLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuZXhwb3J0IHZhciBNQVhfTEVOR1RIX0NPVU5UUllfQ09ERSA9IDM7IC8vIERpZ2l0cyBhY2NlcHRlZCBpbiBwaG9uZSBudW1iZXJzXG4vLyAoYXNjaWksIGZ1bGx3aWR0aCwgYXJhYmljLWluZGljLCBhbmQgZWFzdGVybiBhcmFiaWMgZGlnaXRzKS5cblxuZXhwb3J0IHZhciBWQUxJRF9ESUdJVFMgPSBcIjAtOVxcdUZGMTAtXFx1RkYxOVxcdTA2NjAtXFx1MDY2OVxcdTA2RjAtXFx1MDZGOVwiOyAvLyBgREFTSEVTYCB3aWxsIGJlIHJpZ2h0IGFmdGVyIHRoZSBvcGVuaW5nIHNxdWFyZSBicmFja2V0IG9mIHRoZSBcImNoYXJhY3RlciBjbGFzc1wiXG5cbnZhciBEQVNIRVMgPSBcIi1cXHUyMDEwLVxcdTIwMTVcXHUyMjEyXFx1MzBGQ1xcdUZGMERcIjtcbnZhciBTTEFTSEVTID0gXCJcXHVGRjBGL1wiO1xudmFyIERPVFMgPSBcIlxcdUZGMEUuXCI7XG5leHBvcnQgdmFyIFdISVRFU1BBQ0UgPSBcIiBcXHhBMFxceEFEXFx1MjAwQlxcdTIwNjBcXHUzMDAwXCI7XG52YXIgQlJBQ0tFVFMgPSBcIigpXFx1RkYwOFxcdUZGMDlcXHVGRjNCXFx1RkYzRFxcXFxbXFxcXF1cIjsgLy8gZXhwb3J0IGNvbnN0IE9QRU5JTkdfQlJBQ0tFVFMgPSAnKFxcdUZGMDhcXHVGRjNCXFxcXFxcWydcblxudmFyIFRJTERFUyA9IFwiflxcdTIwNTNcXHUyMjNDXFx1RkY1RVwiOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gb2YgYWNjZXB0YWJsZSBwdW5jdHVhdGlvbiBmb3VuZCBpbiBwaG9uZSBudW1iZXJzLiBUaGlzXG4vLyBleGNsdWRlcyBwdW5jdHVhdGlvbiBmb3VuZCBhcyBhIGxlYWRpbmcgY2hhcmFjdGVyIG9ubHkuIFRoaXMgY29uc2lzdHMgb2YgZGFzaFxuLy8gY2hhcmFjdGVycywgd2hpdGUgc3BhY2UgY2hhcmFjdGVycywgZnVsbCBzdG9wcywgc2xhc2hlcywgc3F1YXJlIGJyYWNrZXRzLFxuLy8gcGFyZW50aGVzZXMgYW5kIHRpbGRlcy4gRnVsbC13aWR0aCB2YXJpYW50cyBhcmUgYWxzbyBwcmVzZW50LlxuXG5leHBvcnQgdmFyIFZBTElEX1BVTkNUVUFUSU9OID0gXCJcIi5jb25jYXQoREFTSEVTKS5jb25jYXQoU0xBU0hFUykuY29uY2F0KERPVFMpLmNvbmNhdChXSElURVNQQUNFKS5jb25jYXQoQlJBQ0tFVFMpLmNvbmNhdChUSUxERVMpO1xuZXhwb3J0IHZhciBQTFVTX0NIQVJTID0gXCIrXFx1RkYwQlwiOyAvLyBjb25zdCBMRUFESU5HX1BMVVNfQ0hBUlNfUEFUVEVSTiA9IG5ldyBSZWdFeHAoJ15bJyArIFBMVVNfQ0hBUlMgKyAnXSsnKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsImltcG9ydCB7IFZBTElEX1BVTkNUVUFUSU9OIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJzsgLy8gUmVtb3ZlcyBicmFja2V0cyBhbmQgcmVwbGFjZXMgZGFzaGVzIHdpdGggc3BhY2VzLlxuLy9cbi8vIEUuZy4gXCIoOTk5KSAxMTEtMjItMzNcIiAtPiBcIjk5OSAxMTEgMjIgMzNcIlxuLy9cbi8vIEZvciBzb21lIHJlYXNvbiBHb29nbGUncyBtZXRhZGF0YSBjb250YWlucyBgPGludGxGb3JtYXQvPmBzIHdpdGggYnJhY2tldHMgYW5kIGRhc2hlcy5cbi8vIE1lYW53aGlsZSwgdGhlcmUncyBubyBzaW5nbGUgb3BpbmlvbiBhYm91dCB1c2luZyBwdW5jdHVhdGlvbiBpbiBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcnMuXG4vL1xuLy8gRm9yIGV4YW1wbGUsIEdvb2dsZSdzIGA8aW50bEZvcm1hdC8+YCBmb3IgVVNBIGlzIGArMSAyMTMtMzczLTQyNTNgLlxuLy8gQW5kIGhlcmUncyBhIHF1b3RlIGZyb20gV2lraVBlZGlhJ3MgXCJOb3J0aCBBbWVyaWNhbiBOdW1iZXJpbmcgUGxhblwiIHBhZ2U6XG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob3J0aF9BbWVyaWNhbl9OdW1iZXJpbmdfUGxhblxuLy9cbi8vIFwiVGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIGZvciBhbGwgY291bnRyaWVzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIE5BTlAgaXMgMS5cbi8vIEluIGludGVybmF0aW9uYWwgZm9ybWF0LCBhbiBOQU5QIG51bWJlciBzaG91bGQgYmUgbGlzdGVkIGFzICsxIDMwMSA1NTUgMDEgMDAsXG4vLyB3aGVyZSAzMDEgaXMgYW4gYXJlYSBjb2RlIChNYXJ5bGFuZCkuXCJcbi8vXG4vLyBJIHBlcnNvbmFsbHkgcHJlZmVyIHRoZSBpbnRlcm5hdGlvbmFsIGZvcm1hdCB3aXRob3V0IGFueSBwdW5jdHVhdGlvbi5cbi8vIEZvciBleGFtcGxlLCBicmFja2V0cyBhcmUgcmVtbmFudHMgb2YgdGhlIG9sZCBhZ2UsIG1lYW5pbmcgdGhhdCB0aGVcbi8vIHBob25lIG51bWJlciBwYXJ0IGluIGJyYWNrZXRzIChzbyBjYWxsZWQgXCJhcmVhIGNvZGVcIikgY2FuIGJlIG9taXR0ZWRcbi8vIGlmIGRpYWxpbmcgd2l0aGluIHRoZSBzYW1lIFwiYXJlYVwiLlxuLy8gQW5kIGh5cGhlbnMgd2VyZSBjbGVhcmx5IGludHJvZHVjZWQgZm9yIHNwbGl0dGluZyBsb2NhbCBudW1iZXJzIGludG8gbWVtb3JpemFibGUgZ3JvdXBzLlxuLy8gRm9yIGV4YW1wbGUsIHJlbWVtYmVyaW5nIFwiNTU1MzUzNVwiIGlzIGRpZmZpY3VsdCBidXQgXCI1NTUtMzUtMzVcIiBpcyBtdWNoIHNpbXBsZXIuXG4vLyBJbWFnaW5lIGEgbWFuIHRha2luZyBhIGJ1cyBmcm9tIGhvbWUgdG8gd29yayBhbmQgc2VlaW5nIGFuIGFkIHdpdGggYSBwaG9uZSBudW1iZXIuXG4vLyBIZSBoYXMgYSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBtZW1vcml6ZSB0aGF0IG51bWJlciB1bnRpbCBpdCBwYXNzZXMgYnkuXG4vLyBJZiBpdCB3ZXJlIHNwYWNlcyBpbnN0ZWFkIG9mIGh5cGhlbnMgdGhlIG1hbiB3b3VsZG4ndCBuZWNlc3NhcmlseSBnZXQgaXQsXG4vLyBidXQgd2l0aCBoeXBoZW5zIGluc3RlYWQgb2Ygc3BhY2VzIHRoZSBncm91cGluZyBpcyBtb3JlIGV4cGxpY2l0LlxuLy8gSSBwZXJzb25hbGx5IHRoaW5rIHRoYXQgaHlwaGVucyBpbnRyb2R1Y2UgdmlzdWFsIGNsdXR0ZXIsXG4vLyBzbyBJIHByZWZlciByZXBsYWNpbmcgdGhlbSB3aXRoIHNwYWNlcyBpbiBpbnRlcm5hdGlvbmFsIG51bWJlcnMuXG4vLyBJbiB0aGUgbW9kZXJuIGFnZSBhbGwgb3V0cHV0IGlzIGRvbmUgb24gZGlzcGxheXMgd2hlcmUgc3BhY2VzIGFyZSBjbGVhcmx5IGRpc3Rpbmd1aXNoYWJsZVxuLy8gc28gaHlwaGVucyBjYW4gYmUgc2FmZWx5IHJlcGxhY2VkIHdpdGggc3BhY2VzIHdpdGhvdXQgbG9zaW5nIGFueSBsZWdpYmlsaXR5LlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUoZm9ybWF0dGVkTnVtYmVyKSB7XG4gIHJldHVybiBmb3JtYXR0ZWROdW1iZXIucmVwbGFjZShuZXcgUmVnRXhwKFwiW1wiLmNvbmNhdChWQUxJRF9QVU5DVFVBVElPTiwgXCJdK1wiKSwgJ2cnKSwgJyAnKS50cmltKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBseUludGVybmF0aW9uYWxTZXBhcmF0b3JTdHlsZS5qcy5tYXAiLCJpbXBvcnQgYXBwbHlJbnRlcm5hdGlvbmFsU2VwYXJhdG9yU3R5bGUgZnJvbSAnLi9hcHBseUludGVybmF0aW9uYWxTZXBhcmF0b3JTdHlsZS5qcyc7IC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgc2V0IHRvICQxIGJ1dCB0aGVyZSBhcmUgc29tZSBjb3VudHJpZXMgZm9yIHdoaWNoIHRoZVxuLy8gZmlyc3QgZ3JvdXAgaXMgbm90IHVzZWQgaW4gdGhlIG5hdGlvbmFsIHBhdHRlcm4gKGUuZy4gQXJnZW50aW5hKSBzbyB0aGUgJDFcbi8vIGdyb3VwIGRvZXMgbm90IG1hdGNoIGNvcnJlY3RseS4gVGhlcmVmb3JlLCB3ZSB1c2UgYFxcZGAsIHNvIHRoYXQgdGhlIGZpcnN0XG4vLyBncm91cCBhY3R1YWxseSB1c2VkIGluIHRoZSBwYXR0ZXJuIHdpbGwgYmUgbWF0Y2hlZC5cblxuZXhwb3J0IHZhciBGSVJTVF9HUk9VUF9QQVRURVJOID0gLyhcXCRcXGQpLztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQobnVtYmVyLCBmb3JtYXQsIF9yZWYpIHtcbiAgdmFyIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPSBfcmVmLnVzZUludGVybmF0aW9uYWxGb3JtYXQsXG4gICAgICB3aXRoTmF0aW9uYWxQcmVmaXggPSBfcmVmLndpdGhOYXRpb25hbFByZWZpeCxcbiAgICAgIGNhcnJpZXJDb2RlID0gX3JlZi5jYXJyaWVyQ29kZSxcbiAgICAgIG1ldGFkYXRhID0gX3JlZi5tZXRhZGF0YTtcbiAgdmFyIGZvcm1hdHRlZE51bWJlciA9IG51bWJlci5yZXBsYWNlKG5ldyBSZWdFeHAoZm9ybWF0LnBhdHRlcm4oKSksIHVzZUludGVybmF0aW9uYWxGb3JtYXQgPyBmb3JtYXQuaW50ZXJuYXRpb25hbEZvcm1hdCgpIDogLy8gVGhpcyBsaWJyYXJ5IGRvZXNuJ3QgdXNlIGBkb21lc3RpY19jYXJyaWVyX2NvZGVfZm9ybWF0dGluZ19ydWxlYCxcbiAgLy8gYmVjYXVzZSB0aGF0IG9uZSBpcyBvbmx5IHVzZWQgd2hlbiBmb3JtYXR0aW5nIHBob25lIG51bWJlcnNcbiAgLy8gZm9yIGRpYWxpbmcgZnJvbSBhIG1vYmlsZSBwaG9uZSwgYW5kIHRoaXMgaXMgbm90IGEgZGlhbGluZyBsaWJyYXJ5LlxuICAvLyBjYXJyaWVyQ29kZSAmJiBmb3JtYXQuZG9tZXN0aWNDYXJyaWVyQ29kZUZvcm1hdHRpbmdSdWxlKClcbiAgLy8gXHQvLyBGaXJzdCwgcmVwbGFjZSB0aGUgJENDIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZGVzaXJlZCBjYXJyaWVyIGNvZGUuXG4gIC8vIFx0Ly8gVGhlbiwgcmVwbGFjZSB0aGUgJEZHIGluIHRoZSBmb3JtYXR0aW5nIHJ1bGUgd2l0aCB0aGUgZmlyc3QgZ3JvdXBcbiAgLy8gXHQvLyBhbmQgdGhlIGNhcnJpZXIgY29kZSBjb21iaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5LlxuICAvLyBcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0LmRvbWVzdGljQ2FycmllckNvZGVGb3JtYXR0aW5nUnVsZSgpLnJlcGxhY2UoJyRDQycsIGNhcnJpZXJDb2RlKSlcbiAgLy8gXHQ6IChcbiAgLy8gXHRcdHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpXG4gIC8vIFx0XHRcdD8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSlcbiAgLy8gXHRcdFx0OiBmb3JtYXQuZm9ybWF0KClcbiAgLy8gXHQpXG4gIHdpdGhOYXRpb25hbFByZWZpeCAmJiBmb3JtYXQubmF0aW9uYWxQcmVmaXhGb3JtYXR0aW5nUnVsZSgpID8gZm9ybWF0LmZvcm1hdCgpLnJlcGxhY2UoRklSU1RfR1JPVVBfUEFUVEVSTiwgZm9ybWF0Lm5hdGlvbmFsUHJlZml4Rm9ybWF0dGluZ1J1bGUoKSkgOiBmb3JtYXQuZm9ybWF0KCkpO1xuXG4gIGlmICh1c2VJbnRlcm5hdGlvbmFsRm9ybWF0KSB7XG4gICAgcmV0dXJuIGFwcGx5SW50ZXJuYXRpb25hbFNlcGFyYXRvclN0eWxlKGZvcm1hdHRlZE51bWJlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVkTnVtYmVyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0TmF0aW9uYWxOdW1iZXJVc2luZ0Zvcm1hdC5qcy5tYXAiLCJpbXBvcnQgTWV0YWRhdGEgZnJvbSAnLi4vbWV0YWRhdGEuanMnO1xuLyoqXHJcbiAqIFBhdHRlcm4gdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGRpc3Rpbmd1aXNoIHdoZXRoZXIgYSByZWdpb24gaGFzIGEgc2luZ2xlXHJcbiAqIGludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXggb3Igbm90LiBJZiBhIHJlZ2lvbiBoYXMgYSBzaW5nbGUgaW50ZXJuYXRpb25hbFxyXG4gKiBwcmVmaXggKGUuZy4gMDExIGluIFVTQSksIGl0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgdGhhdCBjb250YWluc1xyXG4gKiBhIHNlcXVlbmNlIG9mIEFTQ0lJIGRpZ2l0cywgYW5kIHBvc3NpYmx5IGEgdGlsZGUsIHdoaWNoIHNpZ25hbHMgd2FpdGluZyBmb3JcclxuICogdGhlIHRvbmUuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhdmFpbGFibGUgaW50ZXJuYXRpb25hbCBwcmVmaXhlcyBpbiBhXHJcbiAqIHJlZ2lvbiwgdGhleSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgcmVnZXggc3RyaW5nIHRoYXQgYWx3YXlzIGNvbnRhaW5zIG9uZVxyXG4gKiBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEFTQ0lJIGRpZ2l0cyBvciBhIHRpbGRlLlxyXG4gKi9cblxudmFyIFNJTkdMRV9JRERfUFJFRklYX1JFR19FWFAgPSAvXltcXGRdKyg/Olt+XFx1MjA1M1xcdTIyM0NcXHVGRjVFXVtcXGRdKyk/JC87IC8vIEZvciByZWdpb25zIHRoYXQgaGF2ZSBtdWx0aXBsZSBJREQgcHJlZml4ZXNcbi8vIGEgcHJlZmVycmVkIElERCBwcmVmaXggaXMgcmV0dXJuZWQuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldElkZFByZWZpeChjb3VudHJ5LCBjYWxsaW5nQ29kZSwgbWV0YWRhdGEpIHtcbiAgdmFyIGNvdW50cnlNZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShtZXRhZGF0YSk7XG4gIGNvdW50cnlNZXRhZGF0YS5zZWxlY3ROdW1iZXJpbmdQbGFuKGNvdW50cnksIGNhbGxpbmdDb2RlKTtcblxuICBpZiAoY291bnRyeU1ldGFkYXRhLmRlZmF1bHRJRERQcmVmaXgoKSkge1xuICAgIHJldHVybiBjb3VudHJ5TWV0YWRhdGEuZGVmYXVsdElERFByZWZpeCgpO1xuICB9XG5cbiAgaWYgKFNJTkdMRV9JRERfUFJFRklYX1JFR19FWFAudGVzdChjb3VudHJ5TWV0YWRhdGEuSUREUHJlZml4KCkpKSB7XG4gICAgcmV0dXJuIGNvdW50cnlNZXRhZGF0YS5JRERQcmVmaXgoKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0SWRkUHJlZml4LmpzLm1hcCIsImltcG9ydCB7IFZBTElEX0RJR0lUUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7IC8vIFRoZSBSRkMgMzk2NiBmb3JtYXQgZm9yIGV4dGVuc2lvbnMuXG5cbnZhciBSRkMzOTY2X0VYVE5fUFJFRklYID0gJztleHQ9Jztcbi8qKlxyXG4gKiBIZWxwZXIgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgcGFyc2luZy4gQ3JlYXRlc1xyXG4gKiBhbiBleHByZXNzaW9uIHRoYXQgY2FwdHVyZXMgdXAgdG8gbWF4X2xlbmd0aCBkaWdpdHMuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gUmVnRXggcGF0dGVybiB0byBjYXB0dXJlIGV4dGVuc2lvbiBkaWdpdHMuXHJcbiAqL1xuXG52YXIgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybiA9IGZ1bmN0aW9uIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4obWF4TGVuZ3RoKSB7XG4gIHJldHVybiBcIihbXCIuY29uY2F0KFZBTElEX0RJR0lUUywgXCJdezEsXCIpLmNvbmNhdChtYXhMZW5ndGgsIFwifSlcIik7XG59O1xuLyoqXHJcbiAqIEhlbHBlciBpbml0aWFsaXNlciBtZXRob2QgdG8gY3JlYXRlIHRoZSByZWd1bGFyLWV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaFxyXG4gKiBleHRlbnNpb25zLlxyXG4gKiBDb3B5LXBhc3RlZCBmcm9tIEdvb2dsZSdzIGBsaWJwaG9uZW51bWJlcmA6XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbGlicGhvbmVudW1iZXIvYmxvYi81NWIyNjQ2ZWM5MzkzZjRkM2Q2NjYxYjljODJlZjllMjU4ZThiODI5L2phdmFzY3JpcHQvaTE4bi9waG9uZW51bWJlcnMvcGhvbmVudW1iZXJ1dGlsLmpzI0w3NTktTDc2NlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJlZ0V4IHBhdHRlcm4gdG8gY2FwdHVyZSBleHRlbnNpb25zLlxyXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25QYXR0ZXJuKHB1cnBvc2UpIHtcbiAgLy8gV2UgY2FwIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBleHRlbnNpb24gYmFzZWQgb24gdGhlIGFtYmlndWl0eSBvZiB0aGUgd2F5XG4gIC8vIHRoZSBleHRlbnNpb24gaXMgcHJlZml4ZWQuIEFzIHBlciBJVFUsIHRoZSBvZmZpY2lhbGx5IGFsbG93ZWQgbGVuZ3RoIGZvclxuICAvLyBleHRlbnNpb25zIGlzIGFjdHVhbGx5IDQwLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHNpbmNlIHdlIGhhdmVuJ3Qgc2VlbiByZWFsXG4gIC8vIGV4YW1wbGVzIGFuZCB0aGlzIGludHJvZHVjZXMgbWFueSBmYWxzZSBpbnRlcnByZXRhdGlvbnMgYXMgdGhlIGV4dGVuc2lvbiBsYWJlbHNcbiAgLy8gYXJlIG5vdCBzdGFuZGFyZGl6ZWQuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gIHZhciBleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCA9ICcyMCc7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHRMaW1pdEFmdGVyTGlrZWx5TGFiZWwgPSAnMTUnO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgZXh0TGltaXRBZnRlckFtYmlndW91c0NoYXIgPSAnOSc7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHRMaW1pdFdoZW5Ob3RTdXJlID0gJzYnO1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgcG9zc2libGVTZXBhcmF0b3JzQmV0d2Vlbk51bWJlckFuZEV4dExhYmVsID0gXCJbIFxceEEwXFxcXHQsXSpcIjsgLy8gT3B0aW9uYWwgZnVsbCBzdG9wICguKSBvciBjb2xvbiwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlcy90YWJzL2NvbW1hcy5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgPSBcIls6XFxcXC5cXHVGRjBFXT9bIFxceEEwXFxcXHQsLV0qXCI7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBvcHRpb25hbEV4dG5TdWZmaXggPSBcIiM/XCI7IC8vIEhlcmUgdGhlIGV4dGVuc2lvbiBpcyBjYWxsZWQgb3V0IGluIG1vcmUgZXhwbGljaXQgd2F5LCBpLmUgbWVudGlvbmluZyBpdCBvYnZpb3VzXG4gIC8vIHBhdHRlcm5zIGxpa2UgXCJleHQuXCIuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGV4cGxpY2l0RXh0TGFiZWxzID0gXCIoPzplP3h0KD86ZW5zaSg/Om9cXHUwMzAxP3xcXHhGMykpP24/fFxcdUZGNDU/XFx1RkY1OFxcdUZGNTRcXHVGRjRFP3xcXHUwNDM0XFx1MDQzRVxcdTA0MzF8YW5leG8pXCI7IC8vIE9uZS1jaGFyYWN0ZXIgc3ltYm9scyB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4dGVuc2lvbiwgYW5kIGxlc3NcbiAgLy8gY29tbW9ubHkgdXNlZCBvciBtb3JlIGFtYmlndW91cyBleHRlbnNpb24gbGFiZWxzLlxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhbWJpZ3VvdXNFeHRMYWJlbHMgPSBcIig/Olt4XFx1RkY1OCNcXHVGRjAzflxcdUZGNUVdfGludHxcXHVGRjQ5XFx1RkY0RVxcdUZGNTQpXCI7IC8vIFdoZW4gZXh0ZW5zaW9uIGlzIG5vdCBzZXBhcmF0ZWQgY2xlYXJseS5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYW1iaWd1b3VzU2VwYXJhdG9yID0gXCJbLSBdK1wiOyAvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCwgYnV0IG5vdCBtYXRjaGluZ1xuICAvLyBjb21tYSBhcyBleHRlbnNpb24gbGFiZWwgbWF5IGhhdmUgaXQuXG5cbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHBvc3NpYmxlU2VwYXJhdG9yc051bWJlckV4dExhYmVsTm9Db21tYSA9IFwiWyBcXHhBMFxcXFx0XSpcIjsgLy8gXCIsLFwiIGlzIGNvbW1vbmx5IHVzZWQgZm9yIGF1dG8gZGlhbGxpbmcgdGhlIGV4dGVuc2lvbiB3aGVuIGNvbm5lY3RlZC4gRmlyc3RcbiAgLy8gY29tbWEgaXMgbWF0Y2hlZCB0aHJvdWdoIHBvc3NpYmxlU2VwYXJhdG9yc0JldHdlZW5OdW1iZXJBbmRFeHRMYWJlbCwgc28gd2UgZG9cbiAgLy8gbm90IHJlcGVhdCBpdCBoZXJlLiBTZW1pLWNvbG9uIHdvcmtzIGluIElwaG9uZSBhbmQgQW5kcm9pZCBhbHNvIHRvIHBvcCB1cCBhXG4gIC8vIGJ1dHRvbiB3aXRoIHRoZSBleHRlbnNpb24gbnVtYmVyIGZvbGxvd2luZy5cblxuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgYXV0b0RpYWxsaW5nQW5kRXh0TGFiZWxzRm91bmQgPSBcIig/Oix7Mn18OylcIjtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIHJmY0V4dG4gPSBSRkMzOTY2X0VYVE5fUFJFRklYICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCk7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBleHBsaWNpdEV4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNCZXR3ZWVuTnVtYmVyQW5kRXh0TGFiZWwgKyBleHBsaWNpdEV4dExhYmVscyArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyRXhwbGljaXRMYWJlbCkgKyBvcHRpb25hbEV4dG5TdWZmaXg7XG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuXG4gIHZhciBhbWJpZ3VvdXNFeHRuID0gcG9zc2libGVTZXBhcmF0b3JzQmV0d2Vlbk51bWJlckFuZEV4dExhYmVsICsgYW1iaWd1b3VzRXh0TGFiZWxzICsgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgKyBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuKGV4dExpbWl0QWZ0ZXJBbWJpZ3VvdXNDaGFyKSArIG9wdGlvbmFsRXh0blN1ZmZpeDtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGFtZXJpY2FuU3R5bGVFeHRuV2l0aFN1ZmZpeCA9IGFtYmlndW91c1NlcGFyYXRvciArIGdldEV4dGVuc2lvbkRpZ2l0c1BhdHRlcm4oZXh0TGltaXRXaGVuTm90U3VyZSkgKyBcIiNcIjtcbiAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5cbiAgdmFyIGF1dG9EaWFsbGluZ0V4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNOdW1iZXJFeHRMYWJlbE5vQ29tbWEgKyBhdXRvRGlhbGxpbmdBbmRFeHRMYWJlbHNGb3VuZCArIHBvc3NpYmxlQ2hhcnNBZnRlckV4dExhYmVsICsgZ2V0RXh0ZW5zaW9uRGlnaXRzUGF0dGVybihleHRMaW1pdEFmdGVyTGlrZWx5TGFiZWwpICsgb3B0aW9uYWxFeHRuU3VmZml4O1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cblxuICB2YXIgb25seUNvbW1hc0V4dG4gPSBwb3NzaWJsZVNlcGFyYXRvcnNOdW1iZXJFeHRMYWJlbE5vQ29tbWEgKyBcIig/OiwpK1wiICsgcG9zc2libGVDaGFyc0FmdGVyRXh0TGFiZWwgKyBnZXRFeHRlbnNpb25EaWdpdHNQYXR0ZXJuKGV4dExpbWl0QWZ0ZXJBbWJpZ3VvdXNDaGFyKSArIG9wdGlvbmFsRXh0blN1ZmZpeDsgLy8gVGhlIGZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3ZlcnMgUkZDIDM5NjYgZm9ybWF0LCB3aGVyZSB0aGUgZXh0ZW5zaW9uIGlzIGFkZGVkXG4gIC8vIHVzaW5nIFwiO2V4dD1cIi4gVGhlIHNlY29uZCBtb3JlIGdlbmVyaWMgd2hlcmUgZXh0ZW5zaW9uIGlzIG1lbnRpb25lZCB3aXRoIGV4cGxpY2l0XG4gIC8vIGxhYmVscyBsaWtlIFwiZXh0OlwiLiBJbiBib3RoIHRoZSBhYm92ZSBjYXNlcyB3ZSBhbGxvdyBtb3JlIG51bWJlcnMgaW4gZXh0ZW5zaW9uIHRoYW5cbiAgLy8gYW55IG90aGVyIGV4dGVuc2lvbiBsYWJlbHMuIFRoZSB0aGlyZCBvbmUgY2FwdHVyZXMgd2hlbiBzaW5nbGUgY2hhcmFjdGVyIGV4dGVuc2lvblxuICAvLyBsYWJlbHMgb3IgbGVzcyBjb21tb25seSB1c2VkIGxhYmVscyBhcmUgdXNlZC4gSW4gc3VjaCBjYXNlcyB3ZSBjYXB0dXJlIGZld2VyXG4gIC8vIGV4dGVuc2lvbiBkaWdpdHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2YgZmFsc2VseSBpbnRlcnByZXRpbmcgdHdvXG4gIC8vIG51bWJlcnMgYmVzaWRlIGVhY2ggb3RoZXIgYXMgYSBudW1iZXIgKyBleHRlbnNpb24uIFRoZSBmb3VydGggb25lIGNvdmVycyB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlIG9mIEFtZXJpY2FuIG51bWJlcnMgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyB3cml0dGVuIHdpdGggYSBoYXNoXG4gIC8vIGF0IHRoZSBlbmQsIHN1Y2ggYXMgXCItIDUwMyNcIi4gVGhlIGZpZnRoIG9uZSBpcyBleGNsdXNpdmVseSBmb3IgZXh0ZW5zaW9uXG4gIC8vIGF1dG9kaWFsbGluZyBmb3JtYXRzIHdoaWNoIGFyZSB1c2VkIHdoZW4gZGlhbGxpbmcgYW5kIGluIHRoaXMgY2FzZSB3ZSBhY2NlcHQgbG9uZ2VyXG4gIC8vIGV4dGVuc2lvbnMuIFRoZSBsYXN0IG9uZSBpcyBtb3JlIGxpYmVyYWwgb24gdGhlIG51bWJlciBvZiBjb21tYXMgdGhhdCBhY3RzIGFzXG4gIC8vIGV4dGVuc2lvbiBsYWJlbHMsIHNvIHdlIGhhdmUgYSBzdHJpY3QgY2FwIG9uIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHN1Y2ggZXh0ZW5zaW9ucy5cblxuICByZXR1cm4gcmZjRXh0biArIFwifFwiICsgZXhwbGljaXRFeHRuICsgXCJ8XCIgKyBhbWJpZ3VvdXNFeHRuICsgXCJ8XCIgKyBhbWVyaWNhblN0eWxlRXh0bldpdGhTdWZmaXggKyBcInxcIiArIGF1dG9EaWFsbGluZ0V4dG4gKyBcInxcIiArIG9ubHlDb21tYXNFeHRuO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qcy5tYXAiLCJpbXBvcnQgeyBNSU5fTEVOR1RIX0ZPUl9OU04sIFZBTElEX0RJR0lUUywgVkFMSURfUFVOQ1RVQVRJT04sIFBMVVNfQ0hBUlMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IGNyZWF0ZUV4dGVuc2lvblBhdHRlcm4gZnJvbSAnLi9leHRlbnNpb24vY3JlYXRlRXh0ZW5zaW9uUGF0dGVybi5qcyc7IC8vICBSZWd1bGFyIGV4cHJlc3Npb24gb2YgdmlhYmxlIHBob25lIG51bWJlcnMuIFRoaXMgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4vLyAgQ2hlY2tzIHdlIGhhdmUgYXQgbGVhc3QgdGhyZWUgbGVhZGluZyBkaWdpdHMsIGFuZCBvbmx5IHZhbGlkIHB1bmN0dWF0aW9uLFxuLy8gIGFscGhhIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyBpbiB0aGUgcGhvbmUgbnVtYmVyLiBEb2VzIG5vdCBpbmNsdWRlIGV4dGVuc2lvblxuLy8gIGRhdGEuIFRoZSBzeW1ib2wgJ3gnIGlzIGFsbG93ZWQgaGVyZSBhcyB2YWxpZCBwdW5jdHVhdGlvbiBzaW5jZSBpdCBpcyBvZnRlblxuLy8gIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgY2FycmllciBjb2RlcywgZm9yIGV4YW1wbGUgaW4gQnJhemlsaWFuIHBob25lXG4vLyAgbnVtYmVycy4gV2UgYWxzbyBhbGxvdyBtdWx0aXBsZSAnKycgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQuXG4vL1xuLy8gIENvcnJlc3BvbmRzIHRvIHRoZSBmb2xsb3dpbmc6XG4vLyAgW2RpZ2l0c117bWluTGVuZ3RoTnNufXxcbi8vICBwbHVzX3NpZ24qXG4vLyAgKChbcHVuY3R1YXRpb25dfFtzdGFyXSkqW2RpZ2l0c10pezMsfShbcHVuY3R1YXRpb25dfFtzdGFyXXxbZGlnaXRzXXxbYWxwaGFdKSpcbi8vXG4vLyAgVGhlIGZpcnN0IHJlZy1leCBpcyB0byBhbGxvdyBzaG9ydCBudW1iZXJzICh0d28gZGlnaXRzIGxvbmcpIHRvIGJlIHBhcnNlZCBpZlxuLy8gIHRoZXkgYXJlIGVudGVyZWQgYXMgXCIxNVwiIGV0YywgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbm8gcHVuY3R1YXRpb24gaW4gdGhlbS5cbi8vICBUaGUgc2Vjb25kIGV4cHJlc3Npb24gcmVzdHJpY3RzIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIHRocmVlIG9yIG1vcmUsIGJ1dFxuLy8gIHRoZW4gYWxsb3dzIHRoZW0gdG8gYmUgaW4gaW50ZXJuYXRpb25hbCBmb3JtLCBhbmQgdG8gaGF2ZSBhbHBoYS1jaGFyYWN0ZXJzXG4vLyAgYW5kIHB1bmN0dWF0aW9uLiBXZSBzcGxpdCB1cCB0aGUgdHdvIHJlZy1leGVzIGhlcmUgYW5kIGNvbWJpbmUgdGhlbSB3aGVuXG4vLyAgY3JlYXRpbmcgdGhlIHJlZy1leCBWQUxJRF9QSE9ORV9OVU1CRVJfUEFUVEVSTiBpdHNlbGYgc28gd2UgY2FuIHByZWZpeCBpdFxuLy8gIHdpdGggXiBhbmQgYXBwZW5kICQgdG8gZWFjaCBicmFuY2guXG4vL1xuLy8gIFwiTm90ZSBWQUxJRF9QVU5DVFVBVElPTiBzdGFydHMgd2l0aCBhIC0sXG4vLyAgIHNvIG11c3QgYmUgdGhlIGZpcnN0IGluIHRoZSByYW5nZVwiIChjKSBHb29nbGUgZGV2cy5cbi8vICAod3RmIGRpZCB0aGV5IG1lYW4gYnkgc2F5aW5nIHRoYXQ7IHByb2JhYmx5IG5vdGhpbmcpXG4vL1xuXG52YXIgTUlOX0xFTkdUSF9QSE9ORV9OVU1CRVJfUEFUVEVSTiA9ICdbJyArIFZBTElEX0RJR0lUUyArICddeycgKyBNSU5fTEVOR1RIX0ZPUl9OU04gKyAnfSc7IC8vXG4vLyBBbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHJlZy1leHA6XG4vLyAoc2VlIE1JTl9MRU5HVEhfUEhPTkVfTlVNQkVSX1BBVFRFUk4gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHJlZy1leHApXG4vL1xuXG5leHBvcnQgdmFyIFZBTElEX1BIT05FX05VTUJFUiA9ICdbJyArIFBMVVNfQ0hBUlMgKyAnXXswLDF9JyArICcoPzonICsgJ1snICsgVkFMSURfUFVOQ1RVQVRJT04gKyAnXSonICsgJ1snICsgVkFMSURfRElHSVRTICsgJ10nICsgJyl7Myx9JyArICdbJyArIFZBTElEX1BVTkNUVUFUSU9OICsgVkFMSURfRElHSVRTICsgJ10qJzsgLy8gVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXNuJ3QgcHJlc2VudCBpbiBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgXG4vLyBhbmQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwaG9uZSBudW1iZXIgYmVpbmcgaW5wdXRcbi8vIGlzIHRvbyBzaG9ydCBmb3IgaXQgdG8gZXZlbiBjb25zaWRlciBpdCBhIFwidmFsaWRcIiBudW1iZXIuXG4vLyBUaGlzIGlzIGp1c3QgYSB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgcmVhbGx5IGludmFsaWQgcGhvbmVcbi8vIG51bWJlciBsaWtlIFwiYWJjZGVcIiBhbmQgYSB2YWxpZCBwaG9uZSBudW1iZXIgdGhhdCBhIHVzZXIgaGFzIGp1c3Rcbi8vIHN0YXJ0ZWQgaW5wdXR0aW5nLCBsaWtlIFwiKzFcIiBvciBcIjFcIjogYm90aCB0aGVzZSBjYXNlcyB3b3VsZCBiZVxuLy8gY29uc2lkZXJlZCBgTk9UX0FfTlVNQkVSYCBieSBHb29nbGUncyBgbGlicGhvbmVudW1iZXJgLCBidXQgdGhpc1xuLy8gbGlicmFyeSBjYW4gcHJvdmlkZSBhIG1vcmUgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZSDigJQgd2hldGhlciBpdCdzXG4vLyByZWFsbHkgXCJub3QgYSBudW1iZXJcIiwgb3IgaXMgaXQganVzdCBhIHN0YXJ0IG9mIGEgdmFsaWQgcGhvbmUgbnVtYmVyLlxuXG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1NUQVJUX1JFR19FWFAgPSBuZXcgUmVnRXhwKCdeJyArICdbJyArIFBMVVNfQ0hBUlMgKyAnXXswLDF9JyArICcoPzonICsgJ1snICsgVkFMSURfUFVOQ1RVQVRJT04gKyAnXSonICsgJ1snICsgVkFMSURfRElHSVRTICsgJ10nICsgJyl7MSwyfScgKyAnJCcsICdpJyk7XG5leHBvcnQgdmFyIFZBTElEX1BIT05FX05VTUJFUl9XSVRIX0VYVEVOU0lPTiA9IFZBTElEX1BIT05FX05VTUJFUiArIC8vIFBob25lIG51bWJlciBleHRlbnNpb25zXG4nKD86JyArIGNyZWF0ZUV4dGVuc2lvblBhdHRlcm4oKSArICcpPyc7IC8vIFRoZSBjb21iaW5lZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHZhbGlkIHBob25lIG51bWJlcnM6XG4vL1xuXG52YXIgVkFMSURfUEhPTkVfTlVNQkVSX1BBVFRFUk4gPSBuZXcgUmVnRXhwKCAvLyBFaXRoZXIgYSBzaG9ydCB0d28tZGlnaXQtb25seSBwaG9uZSBudW1iZXJcbideJyArIE1JTl9MRU5HVEhfUEhPTkVfTlVNQkVSX1BBVFRFUk4gKyAnJCcgKyAnfCcgKyAvLyBPciBhIGxvbmdlciBmdWxseSBwYXJzZWQgcGhvbmUgbnVtYmVyIChtaW4gMyBjaGFyYWN0ZXJzKVxuJ14nICsgVkFMSURfUEhPTkVfTlVNQkVSX1dJVEhfRVhURU5TSU9OICsgJyQnLCAnaScpOyAvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyBjb3VsZCBwb3NzaWJseSBiZSBhIHBob25lIG51bWJlciBhdFxuLy8gYWxsLiBBdCB0aGUgbW9tZW50LCBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCBhdCBsZWFzdCAyXG4vLyBkaWdpdHMsIGlnbm9yaW5nIGFueSBwdW5jdHVhdGlvbiBjb21tb25seSBmb3VuZCBpbiBwaG9uZSBudW1iZXJzLiBUaGlzIG1ldGhvZFxuLy8gZG9lcyBub3QgcmVxdWlyZSB0aGUgbnVtYmVyIHRvIGJlIG5vcm1hbGl6ZWQgaW4gYWR2YW5jZSAtIGJ1dCBkb2VzIGFzc3VtZVxuLy8gdGhhdCBsZWFkaW5nIG5vbi1udW1iZXIgc3ltYm9scyBoYXZlIGJlZW4gcmVtb3ZlZCwgc3VjaCBhcyBieSB0aGUgbWV0aG9kXG4vLyBgZXh0cmFjdF9wb3NzaWJsZV9udW1iZXJgLlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWaWFibGVQaG9uZU51bWJlcihudW1iZXIpIHtcbiAgcmV0dXJuIG51bWJlci5sZW5ndGggPj0gTUlOX0xFTkdUSF9GT1JfTlNOICYmIFZBTElEX1BIT05FX05VTUJFUl9QQVRURVJOLnRlc3QobnVtYmVyKTtcbn0gLy8gVGhpcyBpcyBqdXN0IGEgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIHJlYWxseSBpbnZhbGlkIHBob25lXG4vLyBudW1iZXIgbGlrZSBcImFiY2RlXCIgYW5kIGEgdmFsaWQgcGhvbmUgbnVtYmVyIHRoYXQgYSB1c2VyIGhhcyBqdXN0XG4vLyBzdGFydGVkIGlucHV0dGluZywgbGlrZSBcIisxXCIgb3IgXCIxXCI6IGJvdGggdGhlc2UgY2FzZXMgd291bGQgYmVcbi8vIGNvbnNpZGVyZWQgYE5PVF9BX05VTUJFUmAgYnkgR29vZ2xlJ3MgYGxpYnBob25lbnVtYmVyYCwgYnV0IHRoaXNcbi8vIGxpYnJhcnkgY2FuIHByb3ZpZGUgYSBtb3JlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2Ug4oCUIHdoZXRoZXIgaXQnc1xuLy8gcmVhbGx5IFwibm90IGEgbnVtYmVyXCIsIG9yIGlzIGl0IGp1c3QgYSBzdGFydCBvZiBhIHZhbGlkIHBob25lIG51bWJlci5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlhYmxlUGhvbmVOdW1iZXJTdGFydChudW1iZXIpIHtcbiAgcmV0dXJuIFZBTElEX1BIT05FX05VTUJFUl9TVEFSVF9SRUdfRVhQLnRlc3QobnVtYmVyKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzVmlhYmxlUGhvbmVOdW1iZXIuanMubWFwIiwiZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKF9pID09IG51bGwpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfcywgX2U7IHRyeSB7IGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvW1wiQEBpdGVyYXRvclwiXTsgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCBpc1ZpYWJsZVBob25lTnVtYmVyIGZyb20gJy4vaXNWaWFibGVQaG9uZU51bWJlci5qcyc7IC8vIGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTY2LnR4dFxuXG4vKipcclxuICogQHBhcmFtICB7c3RyaW5nfSB0ZXh0IC0gUGhvbmUgVVJJIChSRkMgMzk2NikuXHJcbiAqIEByZXR1cm4ge29iamVjdH0gYHsgP251bWJlciwgP2V4dCB9YC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJGQzM5NjYodGV4dCkge1xuICB2YXIgbnVtYmVyO1xuICB2YXIgZXh0OyAvLyBSZXBsYWNlIFwidGVsOlwiIHdpdGggXCJ0ZWw9XCIgZm9yIHBhcnNpbmcgY29udmVuaWVuY2UuXG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXnRlbDovLCAndGVsPScpO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UodGV4dC5zcGxpdCgnOycpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgcGFydCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgdmFyIF9wYXJ0JHNwbGl0ID0gcGFydC5zcGxpdCgnPScpLFxuICAgICAgICBfcGFydCRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfcGFydCRzcGxpdCwgMiksXG4gICAgICAgIG5hbWUgPSBfcGFydCRzcGxpdDJbMF0sXG4gICAgICAgIHZhbHVlID0gX3BhcnQkc3BsaXQyWzFdO1xuXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICd0ZWwnOlxuICAgICAgICBudW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2V4dCc6XG4gICAgICAgIGV4dCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncGhvbmUtY29udGV4dCc6XG4gICAgICAgIC8vIE9ubHkgXCJjb3VudHJ5IGNvbnRleHRzXCIgYXJlIHN1cHBvcnRlZC5cbiAgICAgICAgLy8gXCJEb21haW4gY29udGV4dHNcIiBhcmUgaWdub3JlZC5cbiAgICAgICAgaWYgKHZhbHVlWzBdID09PSAnKycpIHtcbiAgICAgICAgICBudW1iZXIgPSB2YWx1ZSArIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG5vdCB2aWFibGUsIHRoZW4gYWJvcnQuXG5cblxuICBpZiAoIWlzVmlhYmxlUGhvbmVOdW1iZXIobnVtYmVyKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgbnVtYmVyOiBudW1iZXJcbiAgfTtcblxuICBpZiAoZXh0KSB7XG4gICAgcmVzdWx0LmV4dCA9IGV4dDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcclxuICogQHBhcmFtICB7b2JqZWN0fSAtIGB7ID9udW1iZXIsID9leHRlbnNpb24gfWAuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gUGhvbmUgVVJJIChSRkMgMzk2NikuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UkZDMzk2NihfcmVmKSB7XG4gIHZhciBudW1iZXIgPSBfcmVmLm51bWJlcixcbiAgICAgIGV4dCA9IF9yZWYuZXh0O1xuXG4gIGlmICghbnVtYmVyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKG51bWJlclswXSAhPT0gJysnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiXFxcImZvcm1hdFJGQzM5NjYoKVxcXCIgZXhwZWN0cyBcXFwibnVtYmVyXFxcIiB0byBiZSBpbiBFLjE2NCBmb3JtYXQuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFwidGVsOlwiLmNvbmNhdChudW1iZXIpLmNvbmNhdChleHQgPyAnO2V4dD0nICsgZXh0IDogJycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UkZDMzk2Ni5qcy5tYXAiLCJmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoaXQpIHJldHVybiAoaXQgPSBpdC5jYWxsKG8pKS5uZXh0LmJpbmQoaXQpOyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLy8gVGhpcyBpcyBhIHBvcnQgb2YgR29vZ2xlIEFuZHJvaWQgYGxpYnBob25lbnVtYmVyYCdzXG4vLyBgcGhvbmVudW1iZXJ1dGlsLmpzYCBvZiBEZWNlbWJlciAzMXRoLCAyMDE4LlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2NvbW1pdHMvbWFzdGVyL2phdmFzY3JpcHQvaTE4bi9waG9uZW51bWJlcnMvcGhvbmVudW1iZXJ1dGlsLmpzXG5pbXBvcnQgbWF0Y2hlc0VudGlyZWx5IGZyb20gJy4vaGVscGVycy9tYXRjaGVzRW50aXJlbHkuanMnO1xuaW1wb3J0IGZvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQgZnJvbSAnLi9oZWxwZXJzL2Zvcm1hdE5hdGlvbmFsTnVtYmVyVXNpbmdGb3JtYXQuanMnO1xuaW1wb3J0IE1ldGFkYXRhLCB7IGdldENvdW50cnlDYWxsaW5nQ29kZSB9IGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IGdldElkZFByZWZpeCBmcm9tICcuL2hlbHBlcnMvZ2V0SWRkUHJlZml4LmpzJztcbmltcG9ydCB7IGZvcm1hdFJGQzM5NjYgfSBmcm9tICcuL2hlbHBlcnMvUkZDMzk2Ni5qcyc7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBmb3JtYXRFeHRlbnNpb246IGZ1bmN0aW9uIGZvcm1hdEV4dGVuc2lvbihmb3JtYXR0ZWROdW1iZXIsIGV4dGVuc2lvbiwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoZm9ybWF0dGVkTnVtYmVyKS5jb25jYXQobWV0YWRhdGEuZXh0KCkpLmNvbmNhdChleHRlbnNpb24pO1xuICB9XG59O1xuLyoqXHJcbiAqIEZvcm1hdHMgYSBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIGZvcm1hdChwaG9uZU51bWJlckluc3RhbmNlLCAnSU5URVJOQVRJT05BTCcsIHsgLi4uLCB2MjogdHJ1ZSB9LCBtZXRhZGF0YSlcclxuICogZm9ybWF0KHBob25lTnVtYmVySW5zdGFuY2UsICdOQVRJT05BTCcsIHsgLi4uLCB2MjogdHJ1ZSB9LCBtZXRhZGF0YSlcclxuICpcclxuICogZm9ybWF0KHsgcGhvbmU6ICc4MDA1NTUzNTM1JywgY291bnRyeTogJ1JVJyB9LCAnSU5URVJOQVRJT05BTCcsIHsgLi4uIH0sIG1ldGFkYXRhKVxyXG4gKiBmb3JtYXQoeyBwaG9uZTogJzgwMDU1NTM1MzUnLCBjb3VudHJ5OiAnUlUnIH0sICdOQVRJT05BTCcsIHVuZGVmaW5lZCwgbWV0YWRhdGEpXHJcbiAqXHJcbiAqIEBwYXJhbSAge29iamVjdHxQaG9uZU51bWJlcn0gaW5wdXQg4oCUIElmIGBvcHRpb25zLnYyOiB0cnVlYCBmbGFnIGlzIHBhc3NlZCwgdGhlIGBpbnB1dGAgc2hvdWxkIGJlIGEgYFBob25lTnVtYmVyYCBpbnN0YW5jZS4gT3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgYW4gb2JqZWN0IG9mIHNoYXBlIGB7IHBob25lOiAnLi4uJywgY291bnRyeTogJy4uLicgfWAuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gZm9ybWF0XHJcbiAqIEBwYXJhbSAge29iamVjdH0gW29wdGlvbnNdXHJcbiAqIEBwYXJhbSAge29iamVjdH0gbWV0YWRhdGFcclxuICogQHJldHVybiB7c3RyaW5nfVxyXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKGlucHV0LCBmb3JtYXQsIG9wdGlvbnMsIG1ldGFkYXRhKSB7XG4gIC8vIEFwcGx5IGRlZmF1bHQgb3B0aW9ucy5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gREVGQVVMVF9PUFRJT05TO1xuICB9XG5cbiAgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gIGlmIChpbnB1dC5jb3VudHJ5ICYmIGlucHV0LmNvdW50cnkgIT09ICcwMDEnKSB7XG4gICAgLy8gVmFsaWRhdGUgYGlucHV0LmNvdW50cnlgLlxuICAgIGlmICghbWV0YWRhdGEuaGFzQ291bnRyeShpbnB1dC5jb3VudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjb3VudHJ5OiBcIi5jb25jYXQoaW5wdXQuY291bnRyeSkpO1xuICAgIH1cblxuICAgIG1ldGFkYXRhLmNvdW50cnkoaW5wdXQuY291bnRyeSk7XG4gIH0gZWxzZSBpZiAoaW5wdXQuY291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihpbnB1dC5jb3VudHJ5Q2FsbGluZ0NvZGUpO1xuICB9IGVsc2UgcmV0dXJuIGlucHV0LnBob25lIHx8ICcnO1xuXG4gIHZhciBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBtZXRhZGF0YS5jb3VudHJ5Q2FsbGluZ0NvZGUoKTtcbiAgdmFyIG5hdGlvbmFsTnVtYmVyID0gb3B0aW9ucy52MiA/IGlucHV0Lm5hdGlvbmFsTnVtYmVyIDogaW5wdXQucGhvbmU7IC8vIFRoaXMgdmFyaWFibGUgc2hvdWxkIGhhdmUgYmVlbiBkZWNsYXJlZCBpbnNpZGUgYGNhc2Vgc1xuICAvLyBidXQgQmFiZWwgaGFzIGEgYnVnIGFuZCBpdCBzYXlzIFwiZHVwbGljYXRlIHZhcmlhYmxlIGRlY2xhcmF0aW9uXCIuXG5cbiAgdmFyIG51bWJlcjtcblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ05BVElPTkFMJzpcbiAgICAgIC8vIExlZ2FjeSBhcmd1bWVudCBzdXBwb3J0LlxuICAgICAgLy8gKGB7IGNvdW50cnk6IC4uLiwgcGhvbmU6ICcnIH1gKVxuICAgICAgaWYgKCFuYXRpb25hbE51bWJlcikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIG51bWJlciA9IGZvcm1hdE5hdGlvbmFsTnVtYmVyKG5hdGlvbmFsTnVtYmVyLCBpbnB1dC5jYXJyaWVyQ29kZSwgJ05BVElPTkFMJywgbWV0YWRhdGEsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGFkZEV4dGVuc2lvbihudW1iZXIsIGlucHV0LmV4dCwgbWV0YWRhdGEsIG9wdGlvbnMuZm9ybWF0RXh0ZW5zaW9uKTtcblxuICAgIGNhc2UgJ0lOVEVSTkFUSU9OQUwnOlxuICAgICAgLy8gTGVnYWN5IGFyZ3VtZW50IHN1cHBvcnQuXG4gICAgICAvLyAoYHsgY291bnRyeTogLi4uLCBwaG9uZTogJycgfWApXG4gICAgICBpZiAoIW5hdGlvbmFsTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBcIitcIi5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyID0gZm9ybWF0TmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG51bGwsICdJTlRFUk5BVElPTkFMJywgbWV0YWRhdGEsIG9wdGlvbnMpO1xuICAgICAgbnVtYmVyID0gXCIrXCIuY29uY2F0KGNvdW50cnlDYWxsaW5nQ29kZSwgXCIgXCIpLmNvbmNhdChudW1iZXIpO1xuICAgICAgcmV0dXJuIGFkZEV4dGVuc2lvbihudW1iZXIsIGlucHV0LmV4dCwgbWV0YWRhdGEsIG9wdGlvbnMuZm9ybWF0RXh0ZW5zaW9uKTtcblxuICAgIGNhc2UgJ0UuMTY0JzpcbiAgICAgIC8vIGBFLjE2NGAgZG9lc24ndCBkZWZpbmUgXCJwaG9uZSBudW1iZXIgZXh0ZW5zaW9uc1wiLlxuICAgICAgcmV0dXJuIFwiK1wiLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUpLmNvbmNhdChuYXRpb25hbE51bWJlcik7XG5cbiAgICBjYXNlICdSRkMzOTY2JzpcbiAgICAgIHJldHVybiBmb3JtYXRSRkMzOTY2KHtcbiAgICAgICAgbnVtYmVyOiBcIitcIi5jb25jYXQoY291bnRyeUNhbGxpbmdDb2RlKS5jb25jYXQobmF0aW9uYWxOdW1iZXIpLFxuICAgICAgICBleHQ6IGlucHV0LmV4dFxuICAgICAgfSk7XG4gICAgLy8gRm9yIHJlZmVyZW5jZSwgaGVyZSdzIEdvb2dsZSdzIElERCBmb3JtYXR0ZXI6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9saWJwaG9uZW51bWJlci9ibG9iLzMyNzE5Y2Y3NGU2ODc5Njc4OGQxY2E0NWFiYzg1ZGNkYzYzYmE1YjkvamF2YS9saWJwaG9uZW51bWJlci9zcmMvY29tL2dvb2dsZS9pMThuL3Bob25lbnVtYmVycy9QaG9uZU51bWJlclV0aWwuamF2YSNMMTU0NlxuICAgIC8vIE5vdCBzYXlpbmcgdGhhdCB0aGlzIElERCBmb3JtYXR0ZXIgcmVwbGljYXRlcyBpdCAxOjEsIGJ1dCBpdCBzZWVtcyB0byB3b3JrLlxuICAgIC8vIFdobyB3b3VsZCBldmVuIG5lZWQgdG8gZm9ybWF0IHBob25lIG51bWJlcnMgaW4gSUREIGZvcm1hdCBhbnl3YXk/XG5cbiAgICBjYXNlICdJREQnOlxuICAgICAgaWYgKCFvcHRpb25zLmZyb21Db3VudHJ5KSB7XG4gICAgICAgIHJldHVybjsgLy8gdGhyb3cgbmV3IEVycm9yKCdgZnJvbUNvdW50cnlgIG9wdGlvbiBub3QgcGFzc2VkIGZvciBJREQtcHJlZml4ZWQgZm9ybWF0dGluZy4nKVxuICAgICAgfVxuXG4gICAgICB2YXIgZm9ybWF0dGVkTnVtYmVyID0gZm9ybWF0SUREKG5hdGlvbmFsTnVtYmVyLCBpbnB1dC5jYXJyaWVyQ29kZSwgY291bnRyeUNhbGxpbmdDb2RlLCBvcHRpb25zLmZyb21Db3VudHJ5LCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm4gYWRkRXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgaW5wdXQuZXh0LCBtZXRhZGF0YSwgb3B0aW9ucy5mb3JtYXRFeHRlbnNpb24pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gXFxcImZvcm1hdFxcXCIgYXJndW1lbnQgcGFzc2VkIHRvIFxcXCJmb3JtYXROdW1iZXIoKVxcXCI6IFxcXCJcIi5jb25jYXQoZm9ybWF0LCBcIlxcXCJcIikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5hdGlvbmFsTnVtYmVyKG51bWJlciwgY2FycmllckNvZGUsIGZvcm1hdEFzLCBtZXRhZGF0YSwgb3B0aW9ucykge1xuICB2YXIgZm9ybWF0ID0gY2hvb3NlRm9ybWF0Rm9yTnVtYmVyKG1ldGFkYXRhLmZvcm1hdHMoKSwgbnVtYmVyKTtcblxuICBpZiAoIWZvcm1hdCkge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0TmF0aW9uYWxOdW1iZXJVc2luZ0Zvcm1hdChudW1iZXIsIGZvcm1hdCwge1xuICAgIHVzZUludGVybmF0aW9uYWxGb3JtYXQ6IGZvcm1hdEFzID09PSAnSU5URVJOQVRJT05BTCcsXG4gICAgd2l0aE5hdGlvbmFsUHJlZml4OiBmb3JtYXQubmF0aW9uYWxQcmVmaXhJc09wdGlvbmFsV2hlbkZvcm1hdHRpbmdJbk5hdGlvbmFsRm9ybWF0KCkgJiYgb3B0aW9ucyAmJiBvcHRpb25zLm5hdGlvbmFsUHJlZml4ID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSxcbiAgICBjYXJyaWVyQ29kZTogY2FycmllckNvZGUsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hvb3NlRm9ybWF0Rm9yTnVtYmVyKGF2YWlsYWJsZUZvcm1hdHMsIG5hdGlvbmFsTm51bWJlcikge1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKGF2YWlsYWJsZUZvcm1hdHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBmb3JtYXQgPSBfc3RlcC52YWx1ZTtcblxuICAgIC8vIFZhbGlkYXRlIGxlYWRpbmcgZGlnaXRzLlxuICAgIC8vIFRoZSB0ZXN0IGNhc2UgZm9yIFwiZWxzZSBwYXRoXCIgY291bGQgYmUgZm91bmQgYnkgc2VhcmNoaW5nIGZvclxuICAgIC8vIFwiZm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpLmxlbmd0aCA9PT0gMFwiLlxuICAgIGlmIChmb3JtYXQubGVhZGluZ0RpZ2l0c1BhdHRlcm5zKCkubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGxhc3QgbGVhZGluZ19kaWdpdHNfcGF0dGVybiBpcyB1c2VkIGhlcmUsIGFzIGl0IGlzIHRoZSBtb3N0IGRldGFpbGVkXG4gICAgICB2YXIgbGFzdExlYWRpbmdEaWdpdHNQYXR0ZXJuID0gZm9ybWF0LmxlYWRpbmdEaWdpdHNQYXR0ZXJucygpW2Zvcm1hdC5sZWFkaW5nRGlnaXRzUGF0dGVybnMoKS5sZW5ndGggLSAxXTsgLy8gSWYgbGVhZGluZyBkaWdpdHMgZG9uJ3QgbWF0Y2ggdGhlbiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHBob25lIG51bWJlciBmb3JtYXRcblxuICAgICAgaWYgKG5hdGlvbmFsTm51bWJlci5zZWFyY2gobGFzdExlYWRpbmdEaWdpdHNQYXR0ZXJuKSAhPT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIHRoYXQgdGhlIG5hdGlvbmFsIG51bWJlciBtYXRjaGVzIHRoZSBwaG9uZSBudW1iZXIgZm9ybWF0IHJlZ3VsYXIgZXhwcmVzc2lvblxuXG5cbiAgICBpZiAobWF0Y2hlc0VudGlyZWx5KG5hdGlvbmFsTm51bWJlciwgZm9ybWF0LnBhdHRlcm4oKSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVuc2lvbihmb3JtYXR0ZWROdW1iZXIsIGV4dCwgbWV0YWRhdGEsIGZvcm1hdEV4dGVuc2lvbikge1xuICByZXR1cm4gZXh0ID8gZm9ybWF0RXh0ZW5zaW9uKGZvcm1hdHRlZE51bWJlciwgZXh0LCBtZXRhZGF0YSkgOiBmb3JtYXR0ZWROdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdElERChuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsIGNvdW50cnlDYWxsaW5nQ29kZSwgZnJvbUNvdW50cnksIG1ldGFkYXRhKSB7XG4gIHZhciBmcm9tQ291bnRyeUNhbGxpbmdDb2RlID0gZ2V0Q291bnRyeUNhbGxpbmdDb2RlKGZyb21Db3VudHJ5LCBtZXRhZGF0YS5tZXRhZGF0YSk7IC8vIFdoZW4gY2FsbGluZyB3aXRoaW4gdGhlIHNhbWUgY291bnRyeSBjYWxsaW5nIGNvZGUuXG5cbiAgaWYgKGZyb21Db3VudHJ5Q2FsbGluZ0NvZGUgPT09IGNvdW50cnlDYWxsaW5nQ29kZSkge1xuICAgIHZhciBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXROYXRpb25hbE51bWJlcihuYXRpb25hbE51bWJlciwgY2FycmllckNvZGUsICdOQVRJT05BTCcsIG1ldGFkYXRhKTsgLy8gRm9yIE5BTlBBIHJlZ2lvbnMsIHJldHVybiB0aGUgbmF0aW9uYWwgZm9ybWF0IGZvciB0aGVzZSByZWdpb25zXG4gICAgLy8gYnV0IHByZWZpeCBpdCB3aXRoIHRoZSBjb3VudHJ5IGNhbGxpbmcgY29kZS5cblxuICAgIGlmIChjb3VudHJ5Q2FsbGluZ0NvZGUgPT09ICcxJykge1xuICAgICAgcmV0dXJuIGNvdW50cnlDYWxsaW5nQ29kZSArICcgJyArIGZvcm1hdHRlZE51bWJlcjtcbiAgICB9IC8vIElmIHJlZ2lvbnMgc2hhcmUgYSBjb3VudHJ5IGNhbGxpbmcgY29kZSwgdGhlIGNvdW50cnkgY2FsbGluZyBjb2RlIG5lZWRcbiAgICAvLyBub3QgYmUgZGlhbGxlZC4gVGhpcyBhbHNvIGFwcGxpZXMgd2hlbiBkaWFsbGluZyB3aXRoaW4gYSByZWdpb24sIHNvIHRoaXNcbiAgICAvLyBpZiBjbGF1c2UgY292ZXJzIGJvdGggdGhlc2UgY2FzZXMuIFRlY2huaWNhbGx5IHRoaXMgaXMgdGhlIGNhc2UgZm9yXG4gICAgLy8gZGlhbGxpbmcgZnJvbSBMYSBSZXVuaW9uIHRvIG90aGVyIG92ZXJzZWFzIGRlcGFydG1lbnRzIG9mIEZyYW5jZSAoRnJlbmNoXG4gICAgLy8gR3VpYW5hLCBNYXJ0aW5pcXVlLCBHdWFkZWxvdXBlKSwgYnV0IG5vdCB2aWNlIHZlcnNhIC0gc28gd2UgZG9uJ3QgY292ZXJcbiAgICAvLyB0aGlzIGVkZ2UgY2FzZSBmb3Igbm93IGFuZCBmb3IgdGhvc2UgY2FzZXMgcmV0dXJuIHRoZSB2ZXJzaW9uIGluY2x1ZGluZ1xuICAgIC8vIGNvdW50cnkgY2FsbGluZyBjb2RlLiBEZXRhaWxzIGhlcmU6XG4gICAgLy8gaHR0cDovL3d3dy5wZXRpdGZ1dGUuY29tL3ZveWFnZS8yMjUtaW5mby1wcmF0aXF1ZXMtcmV1bmlvblxuICAgIC8vXG5cblxuICAgIHJldHVybiBmb3JtYXR0ZWROdW1iZXI7XG4gIH1cblxuICB2YXIgaWRkUHJlZml4ID0gZ2V0SWRkUHJlZml4KGZyb21Db3VudHJ5LCB1bmRlZmluZWQsIG1ldGFkYXRhLm1ldGFkYXRhKTtcblxuICBpZiAoaWRkUHJlZml4KSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGlkZFByZWZpeCwgXCIgXCIpLmNvbmNhdChjb3VudHJ5Q2FsbGluZ0NvZGUsIFwiIFwiKS5jb25jYXQoZm9ybWF0TmF0aW9uYWxOdW1iZXIobmF0aW9uYWxOdW1iZXIsIG51bGwsICdJTlRFUk5BVElPTkFMJywgbWV0YWRhdGEpKTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0LmpzLm1hcCIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuaW1wb3J0IE1ldGFkYXRhIGZyb20gJy4vbWV0YWRhdGEuanMnO1xuaW1wb3J0IGlzUG9zc2libGVOdW1iZXIgZnJvbSAnLi9pc1Bvc3NpYmxlLmpzJztcbmltcG9ydCBpc1ZhbGlkTnVtYmVyIGZyb20gJy4vaXNWYWxpZC5qcyc7IC8vIGltcG9ydCBjaGVja051bWJlckxlbmd0aCBmcm9tICcuL2hlbHBlcnMvY2hlY2tOdW1iZXJMZW5ndGguanMnXG5cbmltcG9ydCBnZXROdW1iZXJUeXBlIGZyb20gJy4vaGVscGVycy9nZXROdW1iZXJUeXBlLmpzJztcbmltcG9ydCBnZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlciBmcm9tICcuL2hlbHBlcnMvZ2V0UG9zc2libGVDb3VudHJpZXNGb3JOdW1iZXIuanMnO1xuaW1wb3J0IGZvcm1hdE51bWJlciBmcm9tICcuL2Zvcm1hdC5qcyc7XG52YXIgVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSA9IGZhbHNlO1xuXG52YXIgUGhvbmVOdW1iZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZVxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmF0aW9uYWxOdW1iZXJcclxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG1ldGFkYXRhIOKAlCBNZXRhZGF0YSBKU09OXHJcbiAgICogQHJldHVybiB7UGhvbmVOdW1iZXJ9XHJcbiAgICovXG4gIGZ1bmN0aW9uIFBob25lTnVtYmVyKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSwgbmF0aW9uYWxOdW1iZXIsIG1ldGFkYXRhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBob25lTnVtYmVyKTtcblxuICAgIGlmICghY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY291bnRyeWAgb3IgYGNvdW50cnlDYWxsaW5nQ29kZWAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIGlmICghbmF0aW9uYWxOdW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BuYXRpb25hbE51bWJlcmAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BtZXRhZGF0YWAgbm90IHBhc3NlZCcpO1xuICAgIH1cblxuICAgIHZhciBfZ2V0Q291bnRyeUFuZENvdW50cnkgPSBnZXRDb3VudHJ5QW5kQ291bnRyeUNhbGxpbmdDb2RlKGNvdW50cnlPckNvdW50cnlDYWxsaW5nQ29kZSwgbWV0YWRhdGEpLFxuICAgICAgICBjb3VudHJ5ID0gX2dldENvdW50cnlBbmRDb3VudHJ5LmNvdW50cnksXG4gICAgICAgIGNvdW50cnlDYWxsaW5nQ29kZSA9IF9nZXRDb3VudHJ5QW5kQ291bnRyeS5jb3VudHJ5Q2FsbGluZ0NvZGU7XG5cbiAgICB0aGlzLmNvdW50cnkgPSBjb3VudHJ5O1xuICAgIHRoaXMuY291bnRyeUNhbGxpbmdDb2RlID0gY291bnRyeUNhbGxpbmdDb2RlO1xuICAgIHRoaXMubmF0aW9uYWxOdW1iZXIgPSBuYXRpb25hbE51bWJlcjtcbiAgICB0aGlzLm51bWJlciA9ICcrJyArIHRoaXMuY291bnRyeUNhbGxpbmdDb2RlICsgdGhpcy5uYXRpb25hbE51bWJlcjsgLy8gRXhjbHVkZSBgbWV0YWRhdGFgIHByb3BlcnR5IG91dHB1dCBmcm9tIGBQaG9uZU51bWJlci50b1N0cmluZygpYFxuICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCBjbHV0dGVyIHRoZSBjb25zb2xlIG91dHB1dCBvZiBOb2RlLmpzLlxuICAgIC8vIFByZXZpb3VzbHksIHdoZW4gTm9kZS5qcyBkaWQgYGNvbnNvbGUubG9nKG5ldyBQaG9uZU51bWJlciguLi4pKWAsXG4gICAgLy8gaXQgd291bGQgb3V0cHV0IHRoZSB3aG9sZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlIGBtZXRhZGF0YWAgb2JqZWN0LlxuXG4gICAgdGhpcy5nZXRNZXRhZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBob25lTnVtYmVyLCBbe1xuICAgIGtleTogXCJzZXRFeHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RXh0KGV4dCkge1xuICAgICAgdGhpcy5leHQgPSBleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvc3NpYmxlQ291bnRyaWVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvc3NpYmxlQ291bnRyaWVzKCkge1xuICAgICAgaWYgKHRoaXMuY291bnRyeSkge1xuICAgICAgICByZXR1cm4gW3RoaXMuY291bnRyeV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRQb3NzaWJsZUNvdW50cmllc0Zvck51bWJlcih0aGlzLmNvdW50cnlDYWxsaW5nQ29kZSwgdGhpcy5uYXRpb25hbE51bWJlciwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNQb3NzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Bvc3NpYmxlKCkge1xuICAgICAgcmV0dXJuIGlzUG9zc2libGVOdW1iZXIodGhpcywge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkKCkge1xuICAgICAgcmV0dXJuIGlzVmFsaWROdW1iZXIodGhpcywge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNOb25HZW9ncmFwaGljXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzTm9uR2VvZ3JhcGhpYygpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSh0aGlzLmdldE1ldGFkYXRhKCkpO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKHRoaXMuY291bnRyeUNhbGxpbmdDb2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNFcXVhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0VxdWFsKHBob25lTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXIgPT09IHBob25lTnVtYmVyLm51bWJlciAmJiB0aGlzLmV4dCA9PT0gcGhvbmVOdW1iZXIuZXh0O1xuICAgIH0gLy8gVGhpcyBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IGZvciBgdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpYCxcbiAgICAvLyBidXQgbGF0ZXIgaXQgd2FzIGZvdW5kIG91dCB0aGF0IGl0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgcG9zc2libGUgYFRPT19TSE9SVGAgcmVzdWx0XG4gICAgLy8gcmV0dXJuZWQgZnJvbSBgcGFyc2VQaG9uZU51bWJlcldpdGhFcnJvcigpYCBpbiB0aGUgb3JpZ2luYWwgYHZhbGlkYXRlUGhvbmVOdW1iZXJMZW5ndGgoKWAsXG4gICAgLy8gc28gZXZlbnR1YWxseSBJIHNpbXBseSBjb21tZW50ZWQgb3V0IHRoaXMgbWV0aG9kIGZyb20gdGhlIGBQaG9uZU51bWJlcmAgY2xhc3NcbiAgICAvLyBhbmQganVzdCBsZWZ0IHRoZSBgdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCgpYCBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggdGhhdCBvbmUgd291bGQgcmVxdWlyZVxuICAgIC8vIGFuZCBhZGRpdGlvbmFsIHN0ZXAgdG8gYWxzbyB2YWxpZGF0ZSB0aGUgYWN0dWFsIGNvdW50cnkgLyBjYWxsaW5nIGNvZGUgb2YgdGhlIHBob25lIG51bWJlci5cbiAgICAvLyB2YWxpZGF0ZUxlbmd0aCgpIHtcbiAgICAvLyBcdGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKHRoaXMuZ2V0TWV0YWRhdGEoKSlcbiAgICAvLyBcdG1ldGFkYXRhLnNlbGVjdE51bWJlcmluZ1BsYW4odGhpcy5jb3VudHJ5Q2FsbGluZ0NvZGUpXG4gICAgLy8gXHRjb25zdCByZXN1bHQgPSBjaGVja051bWJlckxlbmd0aCh0aGlzLm5hdGlvbmFsTnVtYmVyLCBtZXRhZGF0YSlcbiAgICAvLyBcdGlmIChyZXN1bHQgIT09ICdJU19QT1NTSUJMRScpIHtcbiAgICAvLyBcdFx0cmV0dXJuIHJlc3VsdFxuICAgIC8vIFx0fVxuICAgIC8vIH1cblxuICB9LCB7XG4gICAga2V5OiBcImdldFR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHlwZSgpIHtcbiAgICAgIHJldHVybiBnZXROdW1iZXJUeXBlKHRoaXMsIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0sIHRoaXMuZ2V0TWV0YWRhdGEoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcm1hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXQoX2Zvcm1hdCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih0aGlzLCBfZm9ybWF0LCBvcHRpb25zID8gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICAgICAgdjI6IHRydWVcbiAgICAgIH0pIDoge1xuICAgICAgICB2MjogdHJ1ZVxuICAgICAgfSwgdGhpcy5nZXRNZXRhZGF0YSgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9ybWF0TmF0aW9uYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0TmF0aW9uYWwob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdOQVRJT05BTCcsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JtYXRJbnRlcm5hdGlvbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdEludGVybmF0aW9uYWwob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdJTlRFUk5BVElPTkFMJywgb3B0aW9ucyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFVSSVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVUkkob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdSRkMzOTY2Jywgb3B0aW9ucyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBob25lTnVtYmVyO1xufSgpO1xuXG5leHBvcnQgeyBQaG9uZU51bWJlciBhcyBkZWZhdWx0IH07XG5cbnZhciBpc0NvdW50cnlDb2RlID0gZnVuY3Rpb24gaXNDb3VudHJ5Q29kZSh2YWx1ZSkge1xuICByZXR1cm4gL15bQS1aXXsyfSQvLnRlc3QodmFsdWUpO1xufTtcblxuZnVuY3Rpb24gZ2V0Q291bnRyeUFuZENvdW50cnlDYWxsaW5nQ29kZShjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGUsIG1ldGFkYXRhSnNvbikge1xuICB2YXIgY291bnRyeTtcbiAgdmFyIGNvdW50cnlDYWxsaW5nQ29kZTtcbiAgdmFyIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKG1ldGFkYXRhSnNvbik7IC8vIElmIGNvdW50cnkgY29kZSBpcyBwYXNzZWQgdGhlbiBkZXJpdmUgYGNvdW50cnlDYWxsaW5nQ29kZWAgZnJvbSBpdC5cbiAgLy8gQWxzbyBzdG9yZSB0aGUgY291bnRyeSBjb2RlIGFzIGAuY291bnRyeWAuXG5cbiAgaWYgKGlzQ291bnRyeUNvZGUoY291bnRyeU9yQ291bnRyeUNhbGxpbmdDb2RlKSkge1xuICAgIGNvdW50cnkgPSBjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGU7XG4gICAgbWV0YWRhdGEuc2VsZWN0TnVtYmVyaW5nUGxhbihjb3VudHJ5KTtcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBtZXRhZGF0YS5jb3VudHJ5Q2FsbGluZ0NvZGUoKTtcbiAgfSBlbHNlIHtcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGUgPSBjb3VudHJ5T3JDb3VudHJ5Q2FsbGluZ0NvZGU7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICBpZiAoVVNFX05PTl9HRU9HUkFQSElDX0NPVU5UUllfQ09ERSkge1xuICAgICAgaWYgKG1ldGFkYXRhLmlzTm9uR2VvZ3JhcGhpY0NhbGxpbmdDb2RlKGNvdW50cnlDYWxsaW5nQ29kZSkpIHtcbiAgICAgICAgY291bnRyeSA9ICcwMDEnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY291bnRyeTogY291bnRyeSxcbiAgICBjb3VudHJ5Q2FsbGluZ0NvZGU6IGNvdW50cnlDYWxsaW5nQ29kZVxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGhvbmVOdW1iZXIuanMubWFwIiwiaW1wb3J0IFBob25lTnVtYmVyIGZyb20gJy4vUGhvbmVOdW1iZXIuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXhhbXBsZU51bWJlcihjb3VudHJ5LCBleGFtcGxlcywgbWV0YWRhdGEpIHtcbiAgaWYgKGV4YW1wbGVzW2NvdW50cnldKSB7XG4gICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlcihjb3VudHJ5LCBleGFtcGxlc1tjb3VudHJ5XSwgbWV0YWRhdGEpO1xuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRFeGFtcGxlTnVtYmVyLmpzLm1hcCIsImltcG9ydCB3aXRoTWV0YWRhdGFBcmd1bWVudCBmcm9tICcuL3dpdGhNZXRhZGF0YUFyZ3VtZW50LmpzJ1xyXG5pbXBvcnQgeyBnZXRFeGFtcGxlTnVtYmVyIGFzIF9nZXRFeGFtcGxlTnVtYmVyIH0gZnJvbSAnLi4vLi4vY29yZS9pbmRleC5qcydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFeGFtcGxlTnVtYmVyKCkge1xyXG5cdHJldHVybiB3aXRoTWV0YWRhdGFBcmd1bWVudChfZ2V0RXhhbXBsZU51bWJlciwgYXJndW1lbnRzKVxyXG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/libphonenumber-js/min/exports/getExampleNumber.js\n\n}");
|
|
29
29
|
|
|
30
30
|
/***/ })
|
|
31
31
|
|