/******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "../config/instance.js": /*!*****************************!*\ !*** ../config/instance.js ***! \*****************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { const users = __webpack_require__(/*! ./users */ "../config/users.js"); const questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); module.exports = { apiUrl: "http://localhost:3000/api", siteUrl: "http://localhost:8080", adminName: "Fabrice", adminEmail: "dev@wikilerni.com", senderName: "WikiLerni (local)", senderEmail: "bonjour@wikilerni.com", adminLang: "fr", theme: "wikilerni", // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. availableLangs: ["fr"], // Languages in which the site is available. The first one is the default one. siteName: "WikiLerni (local)", beginCodeGodfather: "WL", // case-sensitive and can't contain "@" ! defaultReceiptDays: "147", // Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi) cronTimingAlertInSeconde: 120, // for logs responseTimingAlertInSeconde: 3, // idem tokenSignupValidationTimeInHours: "48h", // https://github.com/zeit/ms tokenLoginLinkTimeInHours: "1h", tokenConnexionMinTimeInHours: "24h", tokenConnexionMaxTimeInDays: "180 days", tokenLoginChangingTimeInHours: "1h", // for email & password changing tokenDeleteUserTimeInHours: "1h", tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails freeAccountTimingInDays: 0, // if 0 = unlimited freeAccountExpirationNotificationInDays: 3, accountExpirationFirstNotificationInDays: 10, accountExpirationSecondNotificationInDays: 3, inactiveAccountTimeToDeleteInDays: 180, // Questionnaires: nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable nbQuestionsMax: 2, // if 0 = not maximum nbChoicesMax: 10, nbNewQuestionnaires: 12, // for RSS, etc. hourGiveNewQuestionnaireBegin: 7, // in user local time hourGiveNewQuestionnaireEnd: 21, // idem maxQuestionnaireSendedAtSameTime: 50, // for subscription's e-mailing minSearchQuestionnaires: 3, fieldNewQuestionnaires: "publishingAt", // field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt" // Groups : nbQuestionnairesByGroupMin: 1, nbQuestionnairesByGroupMax: 0, // Illustrations: nbIllustrationsMin: 1, nbIllustrationsMax: 1, maxIllustrationSizeinOctet: 1000000, // pas contrôlé pour l'instant. À revoir. mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], // -- Upload and resize: illustrationsWidthMaxInPx: 500, illustrationsMiniaturesWidthMaxInPx: 200, // Links: nbLinksMin: 1, nbLinksMax: 0, // Questions & responses: nbQuestionsMin: 1, nbQuestionsMax: 0, nbChoicesMax: 10, // à supprimer quand tous les "require" à jour: passwordMinLength: users.password.minlength, dirCacheUsers: users.dirCacheUsers, dirCacheUsersAnswers: users.dirCacheUsersAnswers, dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires, dirCacheQuestions: questionnaires.dirCacheQuestions, dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires, dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires, dirWebQuestionnaires: questionnaires.dirWebQuestionnaires }; /***/ }), /***/ "../config/matomo.js": /*!***************************!*\ !*** ../config/matomo.js ***! \***************************/ /***/ (function(module) { // Si non utilisé, supprimer l'appel des JS front-end puis recompiler. // Revoir comment réorganiser cela sous-forme de module indépendant. module.exports = { // Stats Matomo : matomo: { url: "https://stats.le-fab-lab.com/", siteId: "5" } }; /***/ }), /***/ "../config/questionnaires.js": /*!***********************************!*\ !*** ../config/questionnaires.js ***! \***********************************/ /***/ (function(module) { module.exports = { // API'routes (after "apiUrl" defined in instance.js) questionnaireRoutes: "/questionnaire", // la base à laquelle s'ajoute les routes suivantes getListNextQuestionnaires: "/getlistnextquestionnaires/", getQuestionnaireRoutes: "/get", getRandomQuestionnairesRoute: "/getrandom", getStatsQuestionnaires: "/stats/", previewQuestionnaireRoutes: "/preview", publishedQuestionnaireRoutes: "/quiz/", regenerateHTML: "/htmlregenerated", searchAdminQuestionnairesRoute: "/searchadmin", searchQuestionnairesRoute: "/search", // -- groupes : groupRoutes: "/group", getGroupRoute: "/get/", previewGroupRoutes: "/preview", searchGroupsRoute: "/search", // -- questions & choices : questionsRoute: "/question/", // -- tags : tagsSearchRoute: "/tags/search/", // -- answers : getAdminStats: "/getadminstats/", getPreviousAnswers: "/user/answers/", getStatsAnswers: "/user/anwswers/stats/", // fonctionne aussi pour les groupes saveAnswersRoute: "/answer/", // idem // forms : à compléter avec valeurs par défaut, etc. cf modèle Questionnaire: { title: { maxlength: 255, required: true }, slug: { maxlength: 150 }, // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire introduction: { required: true } }, searchQuestionnaires: { minlength: 3, required: true }, Group: { title: { maxlength: 255, required: true }, slug: { maxlength: 150 } // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire }, Question: { text: { maxlength: 255, required: true }, rank: { required: true, min: 1, defaultValue: 1 } }, Choice: { text: { maxlength: 255, required: true } }, search: { minlength: 3, required: true }, searchGroups: { minlength: 3, required: true }, // Emplacement des fichiers JSON générés : dirCacheGroups: "datas/questionnaires/groups", dirCacheQuestionnaires: "datas/questionnaires", dirCacheQuestions: "datas/questionnaires/questions", dirCacheTags: "datas/questionnaires/tags", dirCacheUsersQuestionnaires: "datas/users/questionnaires", // Emplacement des fichiers HTML générés : dirHTMLGroups: "front/public/quiz/gp", dirHTMLQuestionnaires: "front/public/quiz", dirHTMLNews: "front/public/quizs", dirHTMLTags: "front/public/quizs", // Idem mais pour urls : dirWebGroups: "quiz/gp", dirWebQuestionnaires: "quiz", dirWebNews: "quizs/", dirWebTags: "quizs/", // limite des résultat du moteur de recherche, quand demande de résultats au hasard : nbRandomResults: 3, /* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */ nbQuestionsMin: 1, nbQuestionsMax: 0, nbChoicesMax: 10, nbTagsMin: 0, nbTagsMax: 0 // 0 = not max }; /***/ }), /***/ "../config/users.js": /*!**************************!*\ !*** ../config/users.js ***! \**************************/ /***/ (function(module) { module.exports = { // API'routes (after "apiUrl" defined in instance.js) userRoutes: "/user", checkDeleteLinkRoute: "/confirmdelete/", checkIfIsEmailfreeRoute: "/isemailfree", checkLoginRoute: "/checklogin/", checkNewLoginLinkRoute: "/confirmnewlogin/", checkSubscribeTokenRoute: "/validation/", connectionRoute: "/login", connectionWithLinkRoute: "/checkloginlink", createUserRoute: "/create", getAdminStats: "/getadminstats/", getGodChilds: "/getgodchilds/", getGodfatherRoute: "/getgodfatherid", getLoginLinkRoute: "/getloginlink", getPayments: "/payment/getforoneuser/", getUserInfos: "/get/", getUsersQuestionnairesRoute: "/getusersquestionnaires/", // les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement searchUserRoute: "/search/", signupCompletionRoute: "/signupcompletion/", subscribeRoute: "/signup", unsubscribeRoute: "/subscription/stop/", updateUserInfos: "/modify/", validateUserRoute: "/validate/", // forms : à compléter avec valeurs par défaut, etc. cf modèle name: { maxlength: 70, required: true }, email: { maxlength: 255, required: true }, password: { minlength: 8, maxlength: 72, required: true }, // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns newPassword: { minlength: 8, maxlength: 72 }, codeGodfather: { maxlength: 255 }, cguOk: { value: "true", required: true }, search: { minlength: 1, required: true }, timeDifferenceMin: -720, timeDifferenceMax: 840, // JSON dir dirCacheUsers: "datas/users", dirCacheUsersAnswers: "datas/users/questionnaires/answers", dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without" }; /***/ }), /***/ "./src/tools/clientstorage.js": /*!************************************!*\ !*** ./src/tools/clientstorage.js ***! \************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "saveLocaly": function() { return /* binding */ saveLocaly; }, /* harmony export */ "getLocaly": function() { return /* binding */ getLocaly; }, /* harmony export */ "removeLocaly": function() { return /* binding */ removeLocaly; } /* harmony export */ }); // FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) // Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie const saveLocaly = (name, data) => { localStorage.setItem(name, JSON.stringify(data)); }; const getLocaly = (name, json = false) => { if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); }; const removeLocaly = name => { localStorage.removeItem(name); }; /***/ }), /***/ "./src/tools/everywhere.js": /*!*********************************!*\ !*** ./src/tools/everywhere.js ***! \*********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "helloDev": function() { return /* binding */ helloDev; }, /* harmony export */ "updateAccountLink": function() { return /* binding */ updateAccountLink; } /* harmony export */ }); // Ce script fournit des fonctions utilisées sur toutes les pages du site const helloDev = () => { console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); return true; }; const updateAccountLink = (status, configTemplate) => { const link = document.getElementById("accountHeadLink"); const homePage = status + "HomePage"; link.href = "/" + configTemplate[homePage]; }; /***/ }), /***/ "./src/tools/matomo.js": /*!*****************************!*\ !*** ./src/tools/matomo.js ***! \*****************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "loadMatomo": function() { return /* binding */ loadMatomo; } /* harmony export */ }); /* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ "../config/matomo.js"); /* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__); // Fonction chargeant le code matomo const loadMatomo = () => { // chargement de matomo var _paq = window._paq = window._paq || []; //ajout cnil : _paq.push([function () { var self = this; function getOriginalVisitorCookieTimeout() { var now = new Date(), nowTs = Math.round(now.getTime() / 1000), visitorInfo = self.getVisitorInfo(); var createTs = parseInt(visitorInfo[2]); var cookieTimeout = 33696000; // 13 mois en secondes var originalTimeout = createTs + cookieTimeout - nowTs; return originalTimeout; } this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout()); }]); //--fin ajout cnil _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function () { var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url; _paq.push(['setTrackerUrl', u + 'matomo.php']); _paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]); var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; g.type = 'text/javascript'; g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s); })(); }; /***/ }), /***/ "./src/tools/users.js": /*!****************************!*\ !*** ./src/tools/users.js ***! \****************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "getTimeDifference": function() { return /* binding */ getTimeDifference; }, /* harmony export */ "setSession": function() { return /* binding */ setSession; }, /* harmony export */ "checkAnswerDatas": function() { return /* binding */ checkAnswerDatas; }, /* harmony export */ "checkSession": function() { return /* binding */ checkSession; } /* harmony export */ }); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); /* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); /* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0]; const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js"); const getTimeDifference = () => { // multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse const timeLocal = new Date().getTimezoneOffset() * -1; if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal; }; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite // Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. const setSession = (userId, token, durationTS) => { const storageUser = { id: userId, token: token, duration: durationTS }; (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", storageUser); }; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs // Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas const checkAnswerDatas = datas => { const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("lastAnswer"); if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) { const answer = JSON.parse(lastAnswer); if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) { datas.duration = answer.duration; datas.nbCorrectAnswers = answer.nbCorrectAnswers; datas.nbQuestions = answer.nbQuestions; if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId; } } return datas; }; // Cette fonction teste la connexion de l'utilisateur d'une page // On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté const checkSession = async (status = [], urlRedirection, message, urlWanted) => { return new Promise((resolve, reject) => { const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("user"); if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) { redirectUser(urlRedirection, message, urlWanted); resolve(false); } else { const user = JSON.parse(userDatas); if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) { (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user"); redirectUser(urlRedirection, message, urlWanted); resolve(false); } else { const xhr = new XMLHttpRequest(); xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token); xhr.onload = () => { let response = JSON.parse(xhr.responseText); if (xhr.status === 200 && response.isValid && response.id != undefined) { if (response.id === user.id) { user.name = response.name; user.language = response.language; user.timeDifference = response.timeDifference; user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) if (response.status === "user" && response.nbDaysOk <= 0) { const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + "/" + configTemplate.accountPage; if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate.accountPage + "#subscribe"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? resolve(true); } else { if (status.length !== 0 && status.indexOf(response.status) === -1) { redirectUser(urlRedirection, message, urlWanted); resolve(false); } else resolve(true); } } else { (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user"); redirectUser(urlRedirection, message, urlWanted); resolve(false); } } else { (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user"); redirectUser(urlRedirection, message, urlWanted); resolve(false); } }; xhr.onerror = () => reject(xhr.statusText); xhr.send(); } } }); }; // Cette fonction sert à la précédente en cas de connexion non valide const redirectUser = (urlRedirection, message, urlWanted) => { if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("message", message); if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("url", urlWanted); if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection); }; /***/ }), /***/ "./src/tools/webportage.js": /*!*********************************!*\ !*** ./src/tools/webportage.js ***! \*********************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "unCheckAllOthers": function() { return /* binding */ unCheckAllOthers; }, /* harmony export */ "showBtnPayment": function() { return /* binding */ showBtnPayment; } /* harmony export */ }); const checkBoxes = { "CGV": document.getElementById("CGVOk"), "abo1": document.getElementById("abo1"), "abo2": document.getElementById("abo2"), "abo3": document.getElementById("abo3"), "abo4": document.getElementById("abo4") }; const divWPBtns = document.getElementById("WPBtns"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés const unCheckAllOthers = choice => { for (let id in checkBoxes) { if (id !== choice) checkBoxes[id].checked = false; divWPBtns.style.display = "none"; } }; const btns = { "btn1": document.getElementById("WPBtn1"), "btn2": document.getElementById("WPBtn2"), "btn3": document.getElementById("WPBtn3"), "btn4": document.getElementById("WPBtn4") }; // Affiche le bon bouton de paiement et cache les autres const showBtnPayment = choice => { for (let id in btns) { if (id !== choice) btns[id].style.display = "none";else btns[id].style.display = "block"; } }; /***/ }), /***/ "../tools/main.js": /*!************************!*\ !*** ../tools/main.js ***! \************************/ /***/ (function(module) { // Quelques fonctions utiles pour les chaînes class Tool { static isEmpty(myVar) { if (myVar === undefined || myVar === null) return true;else { myVar += ""; // si autre chose qu'une chaîne envoyé... myVar = myVar.trim(); if (myVar === "") return true;else return false; } } static trimIfNotNull(myString) { if (Tool.isEmpty(myString)) myString = null;else { myString += ""; // si autre chose qu'une chaîne envoyé... myString = myString.trim(); } return myString; } static shortenIfLongerThan(myString, max) { myString += ""; // au cas où cela ne serait pas une chaîne... if (myString.length > max) myString = myString.substring(0, max - 3) + "…"; return myString; } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings static replaceAll(myString, mapObj) { const replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); return myString.replace(replaceElts, matched => { return mapObj[matched]; }); } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random static getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country static dateFormat(dateString, lang = "fr") { if (Tool.isEmpty(dateString)) return ""; let myDate = new Date(dateString); let myDay = myDate.getDate() + ""; if (myDay.length === 1) myDay = "0" + myDay; let myMounth = myDate.getMonth() + 1 + ""; if (myMounth.length === 1) myMounth = "0" + myMounth; let myYear = myDate.getFullYear(); if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; } // On enlève volontairement les 0/O pour éviter les confusions ! // Et mieux vaut aussi débuter et finir par une lettre simple. static getPassword(nbCarMin, nbCarMax) { const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); const letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; const others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; let password = letters[Math.floor(Math.random() * letters.length)]; for (let i = 1; i < nbCar - 1; i++) { if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; } password += letters[Math.floor(Math.random() * letters.length)]; return password; } } module.exports = Tool; /***/ }), /***/ "../views/default/config/fr.js": /*!*************************************!*\ !*** ../views/default/config/fr.js ***! \*************************************/ /***/ (function(module) { module.exports = { headLinks: [{ anchor: "Accueil", attributes: { href: "/" } }, { anchor: "Mon compte", attributes: { href: "/connexion.html", id: "accountHeadLink" } }, { anchor: "À propos", attributes: { href: "/a-propos.html" } }, { anchor: "Contact", attributes: { href: "/contact.html" } }], footLinks: [{ anchor: "Crédits", attributes: { href: "/credits.html" } }, { anchor: "Mentions légales", attributes: { href: "/mentions-legales.html", rel: "nofollow" } }, { anchor: "Données personnelles", attributes: { href: "/donnees.html" } }, { anchor: "C.G.U.", attributes: { href: "/cgu.html", rel: "nofollow" } }, { anchor: "C.G.V.", attributes: { href: "/cgv.html", rel: "nofollow" } }], maxQuestionnairesByPage: 10, userHomePage: "accueil.html", adminHomePage: "admin.html", managerHomePage: "gestion.html", subscribePage: "inscription.html", connectionPage: "connexion.html", accountPage: "compte.html", questionnairesManagementPage: "gestion-quizs.html", usersManagementPage: "gestion-utilisateurs.html", nbQuestionnairesUserHomePage: 10, illustrationDir: "/img/quizs/", siteSlogan: "Cultivons notre jardin !", homeTitle1: "De nature curieuse ?", homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", homeTitle2: "La culture en liberté", homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", explanationTitle: "Vous découvrez WikiLerni ?", explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.", tagsListTxt: "Parcourir les rubriques :" }; /***/ }), /***/ "../views/wikilerni/config/fr.js": /*!***************************************!*\ !*** ../views/wikilerni/config/fr.js ***! \***************************************/ /***/ (function(module) { module.exports = { // liens de l'interface headLinks: [{ anchor: "Contact", attributes: { href: "/contact.html", rel: "nofollow" } }, { anchor: "Parcourir", attributes: { href: "/quizs/", id: "indexHeadLink", title: "Les dernières publications" } }, { anchor: "Mon compte", attributes: { href: "/connexion.html", id: "accountHeadLink", title: "Accéder ou créez votre compte WikiLerni" } }, { anchor: "À propos", attributes: { href: "/a-propos.html", title: "En savoir + sur WikiLerni" } }, { anchor: "Accueil", attributes: { href: "/", title: "Page d'accueil" } }], footLinks: [{ anchor: "Blog", attributes: { href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625", title: "Le blog WikiLerni sur diaspora*" } }, { anchor: "Crédits", attributes: { href: "/credits.html", title: "Qui a créé WikiLerni ? Quels sont vos droits ?" } }, { anchor: "Mentions légales", attributes: { href: "/mentions-legales.html", rel: "nofollow" } }, { anchor: "Données personnelles", attributes: { href: "/donnees.html", title: "Vos données personnelles sur WikiLerni" } }, { anchor: "CGV & CGU", attributes: { href: "/CGV-CGU.html", rel: "nofollow" } }], accountPage: "compte.html", aboutPage: "a-propos.html", adminHomePage: "admin.html", cguPage: "CGV-CGU.html", connectionPage: "connexion.html", deleteLinkPage: "aurevoir.html?t=", loginLinkPage: "login.html?t=", managerHomePage: "gestion.html", newLoginLinkPage: "newlogin.html?t=", questionnairesManagementPage: "gestion-quizs.html", stopMailPage: "stop-mail.html?t=", subscribePage: "inscription.html", updateAccountPage: "compte.html", userHomePage: "accueil.html", userHomePageTxt: "Ma page d'accueil.", usersManagementPage: "gestion-utilisateurs.html", validationLinkPage: "validation.html?t=", /* Textes (général) */ siteSlogan: "Cultivons notre jardin !", noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.", mailRecipientTxt: "Message envoyé à :", licenceTxt: "@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.", /* Page d'accueil */ homePageTxt: "Page d'accueil", homeTitle1: "De nature curieuse ?", homeP1: "Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous recevez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.", homeTitle2: "La culture générale en liberté", homeP2: "Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.", homeBtnAboutTxt: "En savoir plus sur WikiLerni ?", homeBtnSubscribeTxt: "Testez WikiLerni", homeSubcriptionFormTitle: "Recevez les prochains articles WikiLerni", /* Page dernières publications... */ newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni", newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", newsListTitle: "

Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.

", /* Plan du site, liste des tags */ tagListTitle: "Culture générale - des articles et quizs sur de nombreux thèmes !", tagListMetaDesc: "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site.", tagListIntro: "

Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)

Aristote : « L’homme a naturellement la passion de connaître… »
", /* Page quizs */ answersExplanationsLinkText: "Relire", quizElementLinksIntro: "En savoir plus", quizElementSubcriptionFormTitle: "Recevez les prochains articles WikiLerni", explanationTitle: "Vous découvrez WikiLerni ?", explanationTxt: "

Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur.

WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous.

", explanationElementTxt: "

WikiLerni vous propose de recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.).

Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations.

Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu.

Vous apprenez ainsi régulièrement de nouvelles choses très simplement.

", /* Autres */ illustrationDir: "/img/quizs/", twitterAccount: "WikiLerni", maxQuestionnairesByPage: 12, maxQuestionnairesSiteHomePage: 3, nbQuestionnairesUserHomePage: 3 }; /***/ }), /***/ "../views sync recursive ^\\.\\/.*\\.js$": /*!***********************************!*\ !*** ../views/ sync ^\.\/.*\.js$ ***! \***********************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { var map = { "./default/config/fr.js": "../views/default/config/fr.js", "./wikilerni/config/fr.js": "../views/wikilerni/config/fr.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be in strict mode. !function() { "use strict"; /*!****************************!*\ !*** ./src/paymentPage.js ***! \****************************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); /* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); /* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); /* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/matomo.js */ "./src/tools/matomo.js"); /* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); /* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/webportage.js */ "./src/tools/webportage.js"); // -- GESTION DE LA PAGE DU FINANCEMENT PARTICIPATIF (SANS DEVOIR ÊTRE CONNECTÉ) /// Permet d'afficher les boutons de paiement WP suivant le choix de l'utilisateur. /// Matomo est également activé si l'internaute n'est pas connecté. // Fichier de configuration tirés du backend : const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0]; const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js"); // Fonctions utiles au script : (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__.helloDev)(); const initialise = async () => { try { const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_4__.checkSession)(); if (isConnected) { // on change le lien du compte en haut : const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__.getLocaly)("user", true); (0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__.updateAccountLink)(user.status, configTemplate); } else (0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_3__.loadMatomo)(); // Les boutons de paiement WP : const CGV = document.getElementById("CGVOk"); const abo1 = document.getElementById("abo1"); const abo2 = document.getElementById("abo2"); const abo3 = document.getElementById("abo3"); const abo4 = document.getElementById("abo4"); const divWPBtns = document.getElementById("WPBtns"); divWPBtns.style.display = "none"; abo1.addEventListener("change", function (e) { (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)("abo1"); }); abo2.addEventListener("change", function (e) { (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)("abo2"); }); abo3.addEventListener("change", function (e) { (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)("abo3"); }); abo4.addEventListener("change", function (e) { (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.unCheckAllOthers)("abo4"); }); CGV.addEventListener("change", function (e) { if (CGV.checked === true) { divWPBtns.style.display = "block"; if (abo1.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)("btn1");else if (abo2.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)("btn2");else if (abo3.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)("btn3");else if (abo4.checked === true) (0,_tools_webportage_js__WEBPACK_IMPORTED_MODULE_5__.showBtnPayment)("btn4");else { divWPBtns.style.display = "none"; CGV.checked = false; } } else divWPBtns.style.display = "none"; }); } catch (e) { console.error(e); } }; initialise(); }(); /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vY29uZmlnL2luc3RhbmNlLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvbWF0b21vLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvcXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2NvbmZpZy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvbWF0b21vLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvd2VicG9ydGFnZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy9ob21lL2ZhYnJpY2UvRG9jdW1lbnRzL0JpZG91aWxsZXMvd2lraWxlcm5pL3ZpZXdzfHN5bmN8L15cXC5cXC8uKlxcLmpzJC8iLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly93aWtpbGVybmkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy9wYXltZW50UGFnZS5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImRlZmF1bHRSZWNlaXB0RGF5cyIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW4iLCJuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1heCIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZE1pbkxlbmd0aCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmVzIiwiZGlyV2ViUXVlc3Rpb25uYWlyZXMiLCJtYXRvbW8iLCJ1cmwiLCJzaXRlSWQiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInJlZ2VuZXJhdGVIVE1MIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdyb3VwUm91dGVzIiwiZ2V0R3JvdXBSb3V0ZSIsInByZXZpZXdHcm91cFJvdXRlcyIsInNlYXJjaEdyb3Vwc1JvdXRlIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRBZG1pblN0YXRzIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiR3JvdXAiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwic2VhcmNoIiwic2VhcmNoR3JvdXBzIiwiZGlyQ2FjaGVHcm91cHMiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MR3JvdXBzIiwiZGlySFRNTE5ld3MiLCJkaXJIVE1MVGFncyIsImRpcldlYkdyb3VwcyIsImRpcldlYk5ld3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwidXNlclJvdXRlcyIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJjcmVhdGVVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJnZXRVc2VySW5mb3MiLCJnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hVc2VyUm91dGUiLCJzaWdudXBDb21wbGV0aW9uUm91dGUiLCJzdWJzY3JpYmVSb3V0ZSIsInVuc3Vic2NyaWJlUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwiZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIiwic2F2ZUxvY2FseSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldExvY2FseSIsImpzb24iLCJwYXJzZSIsImdldEl0ZW0iLCJyZW1vdmVMb2NhbHkiLCJyZW1vdmVJdGVtIiwiaGVsbG9EZXYiLCJjb25zb2xlIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaG9tZVBhZ2UiLCJocmVmIiwibG9hZE1hdG9tbyIsIl9wYXEiLCJ3aW5kb3ciLCJwdXNoIiwic2VsZiIsImdldE9yaWdpbmFsVmlzaXRvckNvb2tpZVRpbWVvdXQiLCJub3ciLCJEYXRlIiwibm93VHMiLCJNYXRoIiwicm91bmQiLCJnZXRUaW1lIiwidmlzaXRvckluZm8iLCJnZXRWaXNpdG9ySW5mbyIsImNyZWF0ZVRzIiwicGFyc2VJbnQiLCJjb29raWVUaW1lb3V0Iiwib3JpZ2luYWxUaW1lb3V0Iiwic2V0VmlzaXRvckNvb2tpZVRpbWVvdXQiLCJ1IiwiZCIsImciLCJjcmVhdGVFbGVtZW50IiwicyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidHlwZSIsImFzeW5jIiwic3JjIiwicGFyZW50Tm9kZSIsImluc2VydEJlZm9yZSIsImxhbmciLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0Iiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsInRva2VuIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiaWQiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJkYXRhcyIsImxhc3RBbnN3ZXIiLCJpc0VtcHR5IiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIm5iUXVlc3Rpb25zIiwiUXVlc3Rpb25uYWlyZUlkIiwiR3JvdXBJZCIsImNoZWNrU2Vzc2lvbiIsInVybFJlZGlyZWN0aW9uIiwibWVzc2FnZSIsInVybFdhbnRlZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwidXNlciIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlIiwicmVzcG9uc2VUZXh0IiwiaXNWYWxpZCIsInVuZGVmaW5lZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJhY2NvdW50UGFnZSIsImxvY2F0aW9uIiwiaW5kZXhPZiIsImFzc2lnbiIsImxlbmd0aCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImNoZWNrQm94ZXMiLCJkaXZXUEJ0bnMiLCJ1bkNoZWNrQWxsT3RoZXJzIiwiY2hvaWNlIiwiY2hlY2tlZCIsInN0eWxlIiwiZGlzcGxheSIsImJ0bnMiLCJzaG93QnRuUGF5bWVudCIsIlRvb2wiLCJteVZhciIsInRyaW0iLCJ0cmltSWZOb3ROdWxsIiwibXlTdHJpbmciLCJzaG9ydGVuSWZMb25nZXJUaGFuIiwibWF4Iiwic3Vic3RyaW5nIiwicmVwbGFjZUFsbCIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsImdldFJhbmRvbUludCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVGb3JtYXQiLCJkYXRlU3RyaW5nIiwibXlEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiaSIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ0YWdzTGlzdFR4dCIsImFib3V0UGFnZSIsImNndVBhZ2UiLCJkZWxldGVMaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJ1c2VySG9tZVBhZ2VUeHQiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJtYWlsUmVjaXBpZW50VHh0IiwibGljZW5jZVR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsImhvbWVTdWJjcmlwdGlvbkZvcm1UaXRsZSIsIm5ld3NMaXN0VGl0bGUiLCJ0YWdMaXN0VGl0bGUiLCJ0YWdMaXN0TWV0YURlc2MiLCJ0YWdMaXN0SW50cm8iLCJhbnN3ZXJzRXhwbGFuYXRpb25zTGlua1RleHQiLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwiZXhwbGFuYXRpb25FbGVtZW50VHh0IiwidHdpdHRlckFjY291bnQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsImluaXRpYWxpc2UiLCJpc0Nvbm5lY3RlZCIsIkNHViIsImFibzEiLCJhYm8yIiwiYWJvMyIsImFibzQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxNQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJQyxRQUFNLEVBQUUsMkJBRFo7QUFFSUMsU0FBTyxFQUFFLHVCQUZiO0FBR0lDLFdBQVMsRUFBRSxTQUhmO0FBSUlDLFlBQVUsRUFBRSxtQkFKaEI7QUFLSUMsWUFBVSxFQUFFLG1CQUxoQjtBQU1JQyxhQUFXLEVBQUUsdUJBTmpCO0FBT0lDLFdBQVMsRUFBRSxJQVBmO0FBUUlDLE9BQUssRUFBRSxXQVJYO0FBUXdCO0FBQ3BCQyxnQkFBYyxFQUFFLENBQUMsSUFBRCxDQVRwQjtBQVMyQjtBQUN2QkMsVUFBUSxFQUFFLG1CQVZkO0FBV0lDLG9CQUFrQixFQUFFLElBWHhCO0FBVzhCO0FBQzFCQyxvQkFBa0IsRUFBRSxLQVp4QjtBQVkrQjtBQUMzQkMsMEJBQXdCLEVBQUUsR0FiOUI7QUFhbUM7QUFDL0JDLDhCQUE0QixFQUFFLENBZGxDO0FBY3FDO0FBQ2pDQyxrQ0FBZ0MsRUFBRSxLQWZ0QztBQWU2QztBQUN6Q0MsMkJBQXlCLEVBQUUsSUFoQi9CO0FBaUJJQyw4QkFBNEIsRUFBRSxLQWpCbEM7QUFrQklDLDZCQUEyQixFQUFFLFVBbEJqQztBQW1CSUMsK0JBQTZCLEVBQUUsSUFuQm5DO0FBbUJ3QztBQUNwQ0MsNEJBQTBCLEVBQUUsSUFwQmhDO0FBcUJJQyxnQ0FBOEIsRUFBRSxRQXJCcEM7QUFxQjhDO0FBQzFDQyx5QkFBdUIsRUFBRSxDQXRCN0I7QUFzQitCO0FBQzNCQyx5Q0FBdUMsRUFBRSxDQXZCN0M7QUF3QklD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Q0gsS0FIRDtBQUlBcUcsUUFBSSxDQUFDQyxnQkFBTCxDQUFzQixRQUF0QixFQUFnQyxVQUFTQyxDQUFULEVBQ2hDO0FBQ0l2Ryw0RUFBZ0IsQ0FBQyxNQUFELENBQWhCO0FBQ0gsS0FIRDtBQUlBaUcsT0FBRyxDQUFDSyxnQkFBSixDQUFxQixRQUFyQixFQUErQixVQUFTQyxDQUFULEVBQy9CO0FBQ0ksVUFBR04sR0FBRyxDQUFDL0YsT0FBSixLQUFjLElBQWpCLEVBQ0E7QUFDSUgsaUJBQVMsQ0FBQ0ksS0FBVixDQUFnQkMsT0FBaEIsR0FBd0IsT0FBeEI7QUFDQSxZQUFHOEYsSUFBSSxDQUFDaEcsT0FBTCxLQUFlLElBQWxCLEVBQ0lJLG9FQUFjLENBQUMsTUFBRCxDQUFkLENBREosS0FFSyxJQUFHNkYsSUFBSSxDQUFDakcsT0FBTCxLQUFlLElBQWxCLEVBQ0RJLG9FQUFjLENBQUMsTUFBRCxDQUFkLENBREMsS0FFQSxJQUFHOEYsSUFBSSxDQUFDbEcsT0FBTCxLQUFlLElBQWxCLEVBQ0RJLG9FQUFjLENBQUMsTUFBRCxDQUFkLENBREMsS0FFQSxJQUFHK0YsSUFBSSxDQUFDbkcsT0FBTCxLQUFlLElBQWxCLEVBQ0RJLG9FQUFjLENBQUMsTUFBRCxDQUFkLENBREMsS0FHTDtBQUNJUCxtQkFBUyxDQUFDSSxLQUFWLENBQWdCQyxPQUFoQixHQUF3QixNQUF4QjtBQUNBNkYsYUFBRyxDQUFDL0YsT0FBSixHQUFZLEtBQVo7QUFDSDtBQUNKLE9BaEJELE1Ba0JJSCxTQUFTLENBQUNJLEtBQVYsQ0FBZ0JDLE9BQWhCLEdBQXdCLE1BQXhCO0FBQ1AsS0FyQkQ7QUFzQkgsR0ExREQsQ0EyREEsT0FBTW1HLENBQU4sRUFDQTtBQUNJbk0sV0FBTyxDQUFDb00sS0FBUixDQUFjRCxDQUFkO0FBQ0g7QUFDSixDQWpFRDs7QUFrRUFSLFVBQVUsRyIsImZpbGUiOiIuL0pTL3BheW1lbnRQYWdlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJ3aWtpbGVybmlcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIldMXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBkZWZhdWx0UmVjZWlwdERheXM6IFwiMTQ3XCIsIC8vIFBhciBkw6lmYXV0LCBxdWVsKHMpIGpvdXIocykgZGUgbGEgc2VtYWluZSwgbCd1dGlsaXNhdGV1ciByZcOnb2l0LWlsIHF1ZWxxdWUgY2hvc2UgPyAoMT1kaW1hbmNoZSwgMj1sdW5kaS4uLiA3PXNhbWVkaSlcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDAsLy8gaWYgMCA9IHVubGltaXRlZFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxMCxcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAyLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEyLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjo3LCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjEsIC8vIGlkZW1cbiAgICBtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZTogNTAsIC8vIGZvciBzdWJzY3JpcHRpb24ncyBlLW1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICBmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIDogXCJwdWJsaXNoaW5nQXRcIiwgLy8gZmllbGQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGxpc3Qgb2YgdGhlIGxhc3QgcXVlc3Rpb25uYWlyZXMsIGNhbiBiZSBcImNyZWF0ZWRBdFwiLCBcInVwZGF0ZWRBdFwiIG9yIFwicHVibGlzaGluZ0F0XCJcbiAgICAvLyBHcm91cHMgOlxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluOiAxLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWF4OiAwLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAxLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDUwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMCxcbiAgICAvLyBRdWVzdGlvbnMgJiByZXNwb25zZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlc1xufTsiLCIvLyBTaSBub24gdXRpbGlzw6ksIHN1cHByaW1lciBsJ2FwcGVsIGRlcyBKUyBmcm9udC1lbmQgcHVpcyByZWNvbXBpbGVyLlxuLy8gUmV2b2lyIGNvbW1lbnQgcsOpb3JnYW5pc2VyIGNlbGEgc291cy1mb3JtZSBkZSBtb2R1bGUgaW5kw6lwZW5kYW50LlxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIFN0YXRzIE1hdG9tbyA6XG4gICAgbWF0b21vOiB7IHVybDogXCJodHRwczovL3N0YXRzLmxlLWZhYi1sYWIuY29tL1wiLCBzaXRlSWQ6IFwiNVwiIH0sXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIiwvLyBsYSBiYXNlIMOgIGxhcXVlbGxlIHMnYWpvdXRlIGxlcyByb3V0ZXMgc3VpdmFudGVzXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvZ2V0cmFuZG9tXCIsIFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgcmVnZW5lcmF0ZUhUTUw6IFwiL2h0bWxyZWdlbmVyYXRlZFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIGdyb3VwZXMgOlxuICAgIGdyb3VwUm91dGVzOiBcIi9ncm91cFwiLFxuICAgIGdldEdyb3VwUm91dGU6IFwiL2dldC9cIixcbiAgICBwcmV2aWV3R3JvdXBSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBzZWFyY2hHcm91cHNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIiwvLyBmb25jdGlvbm5lIGF1c3NpIHBvdXIgbGVzIGdyb3VwZXNcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsLy8gaWRlbVxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgR3JvdXAgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoR3JvdXBzOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSlNPTiBnw6luw6lyw6lzIDpcbiAgICBkaXJDYWNoZUdyb3VwcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvZ3JvdXBzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBIVE1MIGfDqW7DqXLDqXMgOlxuICAgIGRpckhUTUxHcm91cHMgOiBcImZyb250L3B1YmxpYy9xdWl6L2dwXCIsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxOZXdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgLy8gSWRlbSBtYWlzIHBvdXIgdXJscyA6XG4gICAgZGlyV2ViR3JvdXBzIDogXCJxdWl6L2dwXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXMgOiBcInF1aXpcIixcbiAgICBkaXJXZWJOZXdzIDogXCJxdWl6cy9cIixcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6cy9cIixcbiAgICAvLyBsaW1pdGUgZGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlLCBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkIDpcbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLFxuICAgIC8qIFZhbGV1cnMgZW4gZmFpdCBkw6lmaW5pZXMgZGFucyBpbnN0YW5jZS5qcyBkb25jIMOgIHN1cHByaW1lciBxdWFuZCBwbHVzIHV0aWxpc8OpZXMgYWlsbGV1cnMgOiAqL1xuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLCAgIFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsICAgIFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGdldFVzZXJzUXVlc3Rpb25uYWlyZXNSb3V0ZTogXCIvZ2V0dXNlcnNxdWVzdGlvbm5haXJlcy9cIiwvLyBsZXMgcXVlc3Rpb25uYWlyZXMgYXV4cXVlbHMgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCBldSBhY2PDqHMgdmlhIHNvbiBhYm9ubmVtZW50ICAgIFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIHNpZ251cENvbXBsZXRpb25Sb3V0ZTogXCIvc2lnbnVwY29tcGxldGlvbi9cIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDogODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvd2l0aG91dFwiXG59O1xuIiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcblxcbkxlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCB2b3VzIHBvdXZleiBsZSB0cm91dmVyIMOgIGNldHRlIGFkcmVzc2UgOlxcbmh0dHBzOi8vZm9yZ2UuY2hhcHJpbC5vcmcvRmFiX0JsYWIvV2lraUxlcm5pXFxuXFxuUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IG1hdG9tbyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvbWF0b21vLmpzXCI7XG5cbi8vIEZvbmN0aW9uIGNoYXJnZWFudCBsZSBjb2RlIG1hdG9tb1xuZXhwb3J0IGNvbnN0IGxvYWRNYXRvbW8gPSAoKSA9Plxue1xuICAgIC8vIGNoYXJnZW1lbnQgZGUgbWF0b21vXG4gICAgdmFyIF9wYXEgPSB3aW5kb3cuX3BhcSA9IHdpbmRvdy5fcGFxIHx8IFtdO1xuICAgIC8vYWpvdXQgY25pbCAgOlxuICAgIF9wYXEucHVzaChbZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBmdW5jdGlvbiBnZXRPcmlnaW5hbFZpc2l0b3JDb29raWVUaW1lb3V0KClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBub3dUcyA9IE1hdGgucm91bmQobm93LmdldFRpbWUoKSAvIDEwMDApLFxuICAgICAgICAgICAgdmlzaXRvckluZm8gPSBzZWxmLmdldFZpc2l0b3JJbmZvKCk7XG4gICAgICAgICAgICB2YXIgY3JlYXRlVHMgPSBwYXJzZUludCh2aXNpdG9ySW5mb1syXSk7XG4gICAgICAgICAgICB2YXIgY29va2llVGltZW91dCA9IDMzNjk2MDAwOyAvLyAxMyBtb2lzIGVuIHNlY29uZGVzXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxUaW1lb3V0ID0gY3JlYXRlVHMgKyBjb29raWVUaW1lb3V0IC0gbm93VHM7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmlzaXRvckNvb2tpZVRpbWVvdXQoIGdldE9yaWdpbmFsVmlzaXRvckNvb2tpZVRpbWVvdXQoKSApO1xuICAgIH1dKTtcbiAgICAvLy0tZmluIGFqb3V0IGNuaWxcbiAgICBfcGFxLnB1c2goWyd0cmFja1BhZ2VWaWV3J10pO1xuICAgIF9wYXEucHVzaChbJ2VuYWJsZUxpbmtUcmFja2luZyddKTtcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1PW1hdG9tby51cmw7XG4gICAgICAgIF9wYXEucHVzaChbJ3NldFRyYWNrZXJVcmwnLCB1KydtYXRvbW8ucGhwJ10pO1xuICAgICAgICBfcGFxLnB1c2goWydzZXRTaXRlSWQnLCBtYXRvbW8uc2l0ZUlkXSk7XG4gICAgICAgIHZhciBkPWRvY3VtZW50LCBnPWQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksIHM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgICAgIGcudHlwZT0ndGV4dC9qYXZhc2NyaXB0JzsgZy5hc3luYz10cnVlOyBnLnNyYz11KydtYXRvbW8uanMnOyBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcscyk7XG4gICAgfSkoKTtcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgLy8gbXVsdGlwbGllciBwYXIgLTEsIGNhciBjJ2VzdCBjZSBxdSdpbCBmYXV0IFwiYWpvdXRlclwiIMOgIGwnaGV1cmUgVVRDIHBvdXIgcmV2ZW5pciBlbiBoZXVyZSBsb2NhbGUgcXVpIG0naW50w6lyZXNzZSBldCBub24gbCdpbnZlcnNlXG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSotMTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXogb3UgZCd1biBncm91cGUgZGUgcXVpenNcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykgJiYgKCFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpIHx8ICFpc0VtcHR5KGFuc3dlci5Hcm91cElkKSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSlcbiAgICAgICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkYXRhcy5Hcm91cElkPWFuc3dlci5Hcm91cElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGMnZXN0IGxlIHRva2VuIHF1aSBzZXJ0IMOgIHbDqXJpZmllciBsZSBzdGF0dXQgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZStcIiNzdWJzY3JpYmVcIik7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iLCJjb25zdCBjaGVja0JveGVzPVxue1xuICAgIFwiQ0dWXCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkNHVk9rXCIpLFxuICAgIFwiYWJvMVwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8xXCIpLFxuICAgIFwiYWJvMlwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8yXCIpLFxuICAgIFwiYWJvM1wiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8zXCIpLFxuICAgIFwiYWJvNFwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm80XCIpXG59XG5jb25zdCBkaXZXUEJ0bnM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bnNcIik7XG5cbi8vIExvcnNxdWUgbCdvbiBzw6lsZWN0aW9ubmUgdW4gbW9udGFudCwgbGVzIGF1dHJlcyBvcHRpb25zICsgbGVzIENHViBzb250IGTDqXPDqWxlY3Rpb25uw6lzXG5leHBvcnQgY29uc3QgdW5DaGVja0FsbE90aGVycyA9IChjaG9pY2UpID0+XG57XG4gICAgZm9yIChsZXQgaWQgaW4gY2hlY2tCb3hlcylcbiAgICB7XG4gICAgICAgIGlmKGlkIT09Y2hvaWNlKVxuICAgICAgICAgICAgY2hlY2tCb3hlc1tpZF0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgfVxufVxuXG5cbmNvbnN0IGJ0bnM9XG57XG4gICAgXCJidG4xXCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuMVwiKSxcbiAgICBcImJ0bjJcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG4yXCIpLFxuICAgIFwiYnRuM1wiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjNcIiksXG4gICAgXCJidG40XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuNFwiKVxufVxuXG4vLyBBZmZpY2hlIGxlIGJvbiBib3V0b24gZGUgcGFpZW1lbnQgZXQgY2FjaGUgbGVzIGF1dHJlc1xuZXhwb3J0IGNvbnN0IHNob3dCdG5QYXltZW50ID0gKGNob2ljZSkgPT5cbntcbiAgICBmb3IgKGxldCBpZCBpbiBidG5zKVxuICAgIHtcbiAgICAgICAgaWYoaWQhPT1jaG9pY2UpXG4gICAgICAgICAgICBidG5zW2lkXS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBidG5zW2lkXS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICB9XG59IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIuKAplwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxuXG4gICAgLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4gICAgLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG4gICAgc3RhdGljIGdldFBhc3N3b3JkIChuYkNhck1pbiwgbmJDYXJNYXgpXG4gICAge1xuICAgICAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgICAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICAgICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgICAgICB9XG4gICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzIDpcIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIGxpZW5zIGRlIGwnaW50ZXJmYWNlXG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiUGFyY291cmlyXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9xdWl6cy9cIiwgaWQ6XCJpbmRleEhlYWRMaW5rXCIsIHRpdGxlOlwiTGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiwgdGl0bGU6XCJBY2PDqWRlciBvdSBjcsOpZXogdm90cmUgY29tcHRlIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIsIHRpdGxlOlwiRW4gc2F2b2lyICsgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIsIHRpdGxlOlwiUGFnZSBkJ2FjY3VlaWxcIiB9IH1cbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkJsb2dcIiwgYXR0cmlidXRlczogeyBocmVmOlwiaHR0cHM6Ly9mcmFtYXNwaGVyZS5vcmcvcGVvcGxlLzdlNTRiN2EwYjUzMjAxMzg5ZWVmMmEwMDAwMDUzNjI1XCIsIHRpdGxlOlwiTGUgYmxvZyBXaWtpTGVybmkgc3VyIGRpYXNwb3JhKlwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiLCB0aXRsZTpcIlF1aSBhIGNyw6nDqSBXaWtpTGVybmkgPyBRdWVscyBzb250IHZvcyBkcm9pdHMgP1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIsIHRpdGxlOlwiVm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBzdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDR1YgJiBDR1VcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL0NHVi1DR1UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH1cbiAgICBdLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgYWJvdXRQYWdlOiBcImEtcHJvcG9zLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlOiBcImFkbWluLmh0bWxcIixcbiAgICBjZ3VQYWdlOiBcIkNHVi1DR1UuaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGRlbGV0ZUxpbmtQYWdlIDogXCJhdXJldm9pci5odG1sP3Q9XCIsXG4gICAgbG9naW5MaW5rUGFnZSA6IFwibG9naW4uaHRtbD90PVwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgbmV3TG9naW5MaW5rUGFnZSA6IFwibmV3bG9naW4uaHRtbD90PVwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsICAgIFxuICAgIHN0b3BNYWlsUGFnZSA6IFwic3RvcC1tYWlsLmh0bWw/dD1cIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgdXBkYXRlQWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIHVzZXJIb21lUGFnZVR4dCA6IFwiTWEgcGFnZSBkJ2FjY3VlaWwuXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgdmFsaWRhdGlvbkxpbmtQYWdlIDogXCJ2YWxpZGF0aW9uLmh0bWw/dD1cIixcbiAgICAvKiBUZXh0ZXMgKGfDqW7DqXJhbCkgKi9cbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxuICAgIGxpY2VuY2VUeHQ6IFwiQGNvcHlsZWZ0IExlIGNvbnRlbnUgZGUgV2lraUxlcm5pIDxhIGhyZWY9XFxcIi9jcmVkaXRzLmh0bWxcXFwiIHRpdGxlPVxcXCJFbiBzYXZvaXIgcGx1cyA/XFxcIj5lc3QgbGlicmU8L2E+IGV0IHZvdXMgZXN0IG9mZmVydCBzYW5zIHB1YmxpY2l0w6kuIFZvdXMgcG91dmV6IDxhIGhyZWY9XFxcIi9wYXJ0aWNpcGVyLWZpbmFuY2VtZW50Lmh0bWxcXFwiIHRpdGxlPVxcXCJGaW5hbmNlbWVudCBwYXJ0aWNpcGF0aWYgYXZlYyBjb250cmUtcGFydGllc1xcXCI+cGFydGljaXBlciDDoCBzb24gZmluYW5jZW1lbnQgZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICAvKiBQYWdlIGQnYWNjdWVpbCAqL1xuICAgIGhvbWVQYWdlVHh0OiBcIlBhZ2UgZCdhY2N1ZWlsXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCI8Yj5BdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIGNob3NlczwvYj4uPGJyPlZvdXMgcmVjZXZleiBkZSBjb3VydHMgYXJ0aWNsZXMsIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuPGJyPkRlcyBxdWl6cyB2b3VzIHBlcm1ldHRlbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciA8Yj5kZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBjdWx0dXJlIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIGphcmRpbjwvYj4uXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGfDqW7DqXJhbGUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiPGI+UGFzIGRlIGZhaXRzIGFsdGVybmF0aWZzPC9iPiwgdG91cyBsZXMgY29udGVudXMgc29udCA8Yj5zb3VyY8OpcyBwYXIgZGVzIGFydGljbGVzIFdpa2lww6lkaWE8L2I+Ljxicj5FdCB0b3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHB1Ymxpw6kgc3VyIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgc3VyIGNlIHN1amV0XFxcIj5zb250IHBhcnRhZ8OpcyBzb3VzIGxpY2VuY2VzIGxpYnJlczwvYT4uPGJyPkxlIHRvdXQgc2FucyBwdWJsaWNpdMOpLCBuaSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMuPGJyPjxiPlN1ciBXaWtpTGVybmksIHZvdXMgY3VsdGl2ZXogdm90cmUgamFyZGluIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPC9iPlwiLFxuICAgIGhvbWVCdG5BYm91dFR4dDogXCJFbiBzYXZvaXIgcGx1cyBzdXIgV2lraUxlcm5pID9cIixcbiAgICBob21lQnRuU3Vic2NyaWJlVHh0OiAgXCJUZXN0ZXogV2lraUxlcm5pXCIsXG4gICAgaG9tZVN1YmNyaXB0aW9uRm9ybVRpdGxlOiAgXCJSZWNldmV6IGxlcyBwcm9jaGFpbnMgYXJ0aWNsZXMgV2lraUxlcm5pXCIsXG4gICAgLyogUGFnZSBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4uLiAqLyAgIFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiQ3VsdHVyZSBnw6luw6lyYWxlIC0gYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiV2lraUxlcm5pIDogdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCI8cD48Yj5BdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBxdWVscXVlIGNob3NlIGRlIG5vdXZlYXU8L2I+PGJyPlNpIGRlc3NvdXMgbGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zLiBWb3VzIHBvdXZleiBhdXNzaSA8YSBocmVmPScvcXVpenMvdGhlbWVzLmh0bWwnPnBhcmNvdXJpciBsZSBzaXRlIHBhciB0aMOobWVzIG91IG1vdHMtY2zDqXM8L2E+LjwvcD5cIixcbiAgICAvKiBQbGFuIGR1IHNpdGUsIGxpc3RlIGRlcyB0YWdzICovICAgXG4gICAgdGFnTGlzdFRpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGRlcyBhcnRpY2xlcyBldCBxdWl6cyBzdXIgZGUgbm9tYnJldXggdGjDqG1lcyAhXCIsXG4gICAgdGFnTGlzdE1ldGFEZXNjOiBcIldpa2lMZXJuaSA6IGTDqWNvdXZyaXIgbGVzIGRpZmbDqXJlbnRzIHRow6htZXMgYWJvcmTDqXMgcGFyIFdpa2lMZXJuaS4gSW54ZXggZHUgc2l0ZS5cIixcbiAgICB0YWdMaXN0SW50cm86IFwiPGgzPkF2ZWMgV2lraUxlcm5pLCBkZXZlbmV6IGZvcnQgZW4gdGjDqG1lcy4uLiBPdWkgbWFpcyBxdWVscyB0aMOobWVzID8gOik8L2gzPjxibG9ja3F1b3RlPkFyaXN0b3Rl4oCvOiDCq+KAr0zigJlob21tZSBhIG5hdHVyZWxsZW1lbnQgbGEgcGFzc2lvbiBkZSBjb25uYcOudHJl4oCm4oCvwrs8L2Jsb2NrcXVvdGU+XCIsXG4gICAgLyogUGFnZSBxdWl6cyAqL1xuICAgIGFuc3dlcnNFeHBsYW5hdGlvbnNMaW5rVGV4dDogXCJSZWxpcmVcIixcbiAgICBxdWl6RWxlbWVudExpbmtzSW50cm86IFwiRW4gc2F2b2lyIHBsdXNcIixcbiAgICBxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlOiBcIlJlY2V2ZXogbGVzIHByb2NoYWlucyBhcnRpY2xlcyBXaWtpTGVybmlcIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmnigK8/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiPHA+TGUgcHJpbmNpcGUgZXN0IHNpbXBsZeKArzogPGI+dm91cyBjb21tZW5jZXogcGFyIGxpcmUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6k8L2I+LiBQdWlzIHZvdXMgPGI+YWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlPC9iPi4gU3VpdmFudCBsZXMgcXVlc3Rpb25zLCA8Yj51bmUgb3UgcGx1c2lldXJzIHLDqXBvbnNlcyBwZXV2ZW50IMOqdHJlIGNvcnJlY3RlczwvYj4gZXQgZG9pdmVudCBkb25jIMOqdHJlIGNvY2jDqWVzLiBD4oCZZXN0IHRvdWpvdXJzIDxiPmxlIGNvbnRlbnUgZGUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBxdWkgZmFpdCBmb2k8L2I+IGNvbmNlcm5hbnQgbGVzIMKr4oCvYm9ubmVz4oCvwrsgcsOpcG9uc2VzLiBD4oCZZXN0IHVuZSBmYcOnb24gZGUgdGVzdGVyIMOgIGxhIGZvaXMgdm90cmUgY2FwYWNpdMOpIGTigJlhdHRlbnRpb24gZXQgdm90cmUgbcOpbW9pcmUuIExlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHBldXZlbnQgw6l2b2x1ZXIsIGRvbmMgbuKAmWjDqXNpdGV6IHBhcyA8YSBocmVmPScvY29udGFjdC5odG1sJz7DoCBtZSBzaWduYWxlciB1bmUgZXJyZXVyPC9hPi48L3A+PHA+PGI+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBk4oCZYXV0cmVzIHNvbHV0aW9ucyBwb3VyIGFtw6lsaW9yZXIgdm90cmUgY3VsdHVyZSBnw6luw6lyYWxlPC9iPi4gUG91ciBlbiBzYXZvaXIgcGx1cywgY2xpcXVleiBzdXIgbGUgYm91dG9uIGNpLWRlc3NvdXMuPC9wPlwiLFxuICAgIGV4cGxhbmF0aW9uRWxlbWVudFR4dDogXCI8cD5XaWtpTGVybmkgdm91cyBwcm9wb3NlIGRlIDxiPnJlY2V2b2lyIHBhciBlLW1haWwgw6AgbGEgZnLDqXF1ZW5jZSBjaG9pc2llLCBkZSBjb3VydHMgYXJ0aWNsZXMgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlczwvYj4gZXQgcG9ydGFudCBzdXIgZGVzIHN1amV0cyB0csOocyB2YXJpw6lzIGRlIDxiPmN1bHR1cmUgZ8OpbsOpcmFsZTwvYj4gKGFydHMsIGhpc3RvaXJlLCBsaXR0w6lyYXR1cmUsIHNjaWVuY2VzLCBldGMuKS48L3A+PHA+Q2VzIGFydGljbGVzIHNvbnQgYmFzw6lzIHN1ciA8Yj51bmUgb3UgcGx1c2lldXJzIHBhZ2VzIGRlIFdpa2lww6lkaWE8L2I+IChmb3VybmllcyBlbiBsaWVuKSwgZG9udCA8Yj5pbHMgZXh0cmFpZW50IGNlcnRhaW5lcyBpbmZvcm1hdGlvbnM8L2I+LjwvcD48cD5DaGFxdWUgc8OpcmllIGTigJlhcnRpY2xlcyBlc3QgPGI+c3VpdmllIGTigJl1biBxdWl6PC9iPiBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48L3A+PHA+PGI+Vm91cyBhcHByZW5leiBhaW5zaSByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIGNob3NlczwvYj4gdHLDqHMgc2ltcGxlbWVudC48L3A+XCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyAtLSBHRVNUSU9OIERFIExBIFBBR0UgRFUgRklOQU5DRU1FTlQgUEFSVElDSVBBVElGIChTQU5TIERFVk9JUiDDilRSRSBDT05ORUNUw4kpXG5cbi8vLyBQZXJtZXQgZCdhZmZpY2hlciBsZXMgYm91dG9ucyBkZSBwYWllbWVudCBXUCBzdWl2YW50IGxlIGNob2l4IGRlIGwndXRpbGlzYXRldXIuXG4vLy8gTWF0b21vIGVzdCDDqWdhbGVtZW50IGFjdGl2w6kgc2kgbCdpbnRlcm5hdXRlIG4nZXN0IHBhcyBjb25uZWN0w6kuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gRm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYsIHVwZGF0ZUFjY291bnRMaW5rIH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgbG9hZE1hdG9tbyB9IGZyb20gXCIuL3Rvb2xzL21hdG9tby5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcbmltcG9ydCB7IHNob3dCdG5QYXltZW50LCB1bkNoZWNrQWxsT3RoZXJzIH0gZnJvbSBcIi4vdG9vbHMvd2VicG9ydGFnZS5qc1wiO1xuXG5oZWxsb0RldigpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbigpO1xuICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gb24gY2hhbmdlIGxlIGxpZW4gZHUgY29tcHRlIGVuIGhhdXQgOlxuICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2FkTWF0b21vKCk7XG5cbiAgICAgICAgLy8gTGVzIGJvdXRvbnMgZGUgcGFpZW1lbnQgV1AgOiAgICAgICAgXG4gICAgICAgIGNvbnN0IENHVj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkNHVk9rXCIpO1xuICAgICAgICBjb25zdCBhYm8xPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMVwiKTtcbiAgICAgICAgY29uc3QgYWJvMj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzJcIik7XG4gICAgICAgIGNvbnN0IGFibzM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8zXCIpO1xuICAgICAgICBjb25zdCBhYm80PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvNFwiKTtcbiAgICAgICAgY29uc3QgZGl2V1BCdG5zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG5zXCIpO1xuICAgICAgICBkaXZXUEJ0bnMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgYWJvMS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm8xXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWJvMi5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm8yXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWJvMy5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm8zXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWJvNC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm80XCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgQ0dWLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoQ0dWLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICBpZihhYm8xLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjFcIik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZihhYm8yLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjJcIik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZihhYm8zLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjNcIik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZihhYm80LmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjRcIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIENHVi5jaGVja2VkPWZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkaXZXUEJ0bnMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiXSwic291cmNlUm9vdCI6IiJ9