WikiLerni/front/public/JS/manageQuestionnaires.app.js

2199 lines
329 KiB
JavaScript

/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // 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 });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/manageQuestionnaires.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "../config/instance.js":
/*!*****************************!*\
!*** ../config/instance.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _module$exports;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var users = __webpack_require__(/*! ./users */ "../config/users.js");
var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
module.exports = (_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 "@" !
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: 10,
freeAccountExpirationNotificationInDays: 5,
accountExpirationFirstNotificationInDays: 14,
accountExpirationSecondNotificationInDays: 5,
inactiveAccountTimeToDeleteInDays: 180,
// Questionnaires:
nbQuestionsMin: 1,
// minimum number of questions for the questionnaire to be publishable
nbQuestionsMax: 2,
// if 0 = not maximum
nbChoicesMax: 10,
nbNewQuestionnaires: 10,
// for RSS, etc.
hourGiveNewQuestionnaireBegin: 1,
// in user local time
hourGiveNewQuestionnaireEnd: 24,
// idem
numberNewQuestionnaireAtSameTime: 50,
// for mass mailing
minSearchQuestionnaires: 3,
// Illustrations:
nbIllustrationsMin: 0,
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: 400,
illustrationsMiniaturesWidthMaxInPx: 200,
// Links:
nbLinksMin: 1,
nbLinksMax: 1
}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports);
/***/ }),
/***/ "../config/questionnaires.js":
/*!***********************************!*\
!*** ../config/questionnaires.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
questionnaireRoutes: "/questionnaire",
getQuestionnaireRoutes: "/get",
previewQuestionnaireRoutes: "/preview",
publishedQuestionnaireRoutes: "/quiz/",
saveAnswersRoute: "/answer/",
getStatsQuestionnaires: "/stats/",
searchQuestionnairesRoute: "/search",
getRandomQuestionnairesRoute: "/getrandom",
searchAdminQuestionnairesRoute: "/searchadmin",
getListNextQuestionnaires: "/getlistnextquestionnaires/",
regenerateHTML: "/htmlregenerated",
// -- questions & choices :
questionsRoute: "/question/",
// -- tags :
tagsSearchRoute: "/tags/search/",
// -- answers :
getQuestionnairesWithoutAnswer: "/withoutanswer/user/",
getPreviousAnswers: "/user/answers/",
getStatsAnswers: "/user/anwswers/stats/",
getAdminStats: "/getadminstats/",
// 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 vide
introduction: {
required: true
}
},
searchQuestionnaires: {
minlength: 3,
required: true
},
Question: {
text: {
maxlength: 255,
required: true
},
rank: {
required: true,
min: 1,
defaultValue: 1
}
},
Choice: {
text: {
maxlength: 255,
required: true
}
},
nbQuestionsMin: 1,
nbQuestionsMax: 0,
nbChoicesMax: 10,
nbTagsMin: 0,
nbTagsMax: 0,
// 0 = not max
// JSON and HTML dir
dirCacheQuestionnaires: "datas/questionnaires",
dirCacheQuestions: "datas/questionnaires/questions",
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
dirCacheTags: "datas/questionnaires/tags",
dirHTMLQuestionnaire: "front/public/quiz",
dirHTMLTags: "front/public/quizs",
dirWebQuestionnaire: "quiz",
//pour url page
dirWebTags: "quizs",
// idem
nbRandomResults: 3 // limite les résultat du moteur de recherche quand demande de résultats au hasard
};
/***/ }),
/***/ "../config/users.js":
/*!**************************!*\
!*** ../config/users.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
userRoutes: "/user",
subscribeRoute: "/signup",
getGodfatherRoute: "/getgodfatherid",
checkIfIsEmailfreeRoute: "/isemailfree",
checkSubscribeTokenRoute: "/validation/",
checkLoginRoute: "/checklogin/",
connectionRoute: "/login",
getLoginLinkRoute: "/getloginlink",
connectionWithLinkRoute: "/checkloginlink",
getUserInfos: "/get/",
createUserRoute: "/create",
validateUserRoute: "/validate/",
updateUserInfos: "/modify/",
searchUserRoute: "/search/",
getGodChilds: "/getgodchilds/",
checkNewLoginLinkRoute: "/confirmnewlogin/",
checkDeleteLinkRoute: "/confirmdelete/",
getPayments: "/payment/getforoneuser/",
unsubscribeRoute: "/subscription/stop/",
getAdminStats: "/getadminstats/",
// 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
},
timeDifferenceMin: -720,
timeDifferenceMax: 840,
// JSON dir
dirCacheUsers: "datas/users",
dirCacheUsersAnswers: "datas/users/questionnaires/answers"
};
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
/*!**************************************!*\
!*** ../lang sync ^\.\/.*\/general$ ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/general": "../lang/fr/general.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 = "../lang sync recursive ^\\.\\/.*\\/general$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/illustration$":
/*!*******************************************!*\
!*** ../lang sync ^\.\/.*\/illustration$ ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/illustration": "../lang/fr/illustration.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 = "../lang sync recursive ^\\.\\/.*\\/illustration$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/link$":
/*!***********************************!*\
!*** ../lang sync ^\.\/.*\/link$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/link": "../lang/fr/link.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 = "../lang sync recursive ^\\.\\/.*\\/link$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/question$":
/*!***************************************!*\
!*** ../lang sync ^\.\/.*\/question$ ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/question": "../lang/fr/question.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 = "../lang sync recursive ^\\.\\/.*\\/question$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$":
/*!********************************************!*\
!*** ../lang sync ^\.\/.*\/questionnaire$ ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/questionnaire": "../lang/fr/questionnaire.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 = "../lang sync recursive ^\\.\\/.*\\/questionnaire$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
/*!***********************************!*\
!*** ../lang sync ^\.\/.*\/user$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/user": "../lang/fr/user.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 = "../lang sync recursive ^\\.\\/.*\\/user$";
/***/ }),
/***/ "../lang/fr/general.js":
/*!*****************************!*\
!*** ../lang/fr/general.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
siteHTMLTitle: "WikiLerni : Wikipédia en questions",
siteMetaDescription: "Avec WikiLerni, recevez chaque jour de nouveaux quizs pour tester vos connaissances et apprendre de nouvelles choses.",
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",
serverErrorAdmin: "Bug de l'application :",
neededParams: "Des paramètres nécessaires manquants sont manquants.",
badUrl: "Tentative d'accès à une page n'existant pas :",
notValidFormat: "Format non valide.",
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
notRequired: "Facultatif.",
updateBtnTxt: "Modifier",
addBtnTxt: "Ajouter",
deleteBtnTxt: "Supprimer",
addOkMessage: "Les données ont bien été enregistrées.",
updateOkMessage: "La mise à jour à jour a bien été enregistrée.",
deleteOkMessage: "La suppression a bien été enregistrée.",
failAuth: "Erreur d'authentification.",
failAuthHeader: "Absence de header Authorization.",
failAuthToken: "Token invalide ou utilisateur non trouvé.",
failAuthId: "Identifiant non valide : ",
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
previousPage: "Page précédente",
nextPage: "Page suivante",
alertNewWindow: "nouvelle fenêtre",
btnLinkToQuestionnaire: "Aller au quiz !",
statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.<br>En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.<br>Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium."
};
/***/ }),
/***/ "../lang/fr/illustration.js":
/*!**********************************!*\
!*** ../lang/fr/illustration.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
needUrl: "Merci de fournir une url pour l'image.",
needUniqueUrl: "L'url est déjà utilisée par une autre image.",
needGoodLongUrl: "L'url de l'image doit contenir entre 5 et 255 caractères.",
needGoodLongAlt: "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.",
needGoodLongTitle: "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.",
needGoodLongCaption: "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.",
needGoodFile: "Votre fichier n'a pas été accepté.",
needQuestionnaireForIllustration: "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.",
needMaxIllustrationsForQuestionnaire: "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.",
notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ",
addedOkMessage: "L'illustration a bien été enregistrée.",
updatedOkMessage: "L'illustration a bien été modifiée.",
deletedOkMessage: "L'illustration a bien été supprimée.",
defaultAlt: "Illustration du quiz",
introTitle: "Illustrations du quiz",
introNoIllustration: "Aucune illustration pour l'instant."
};
/***/ }),
/***/ "../lang/fr/link.js":
/*!**************************!*\
!*** ../lang/fr/link.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
needUrl: "Merci de saisir l'url du lien.",
needValidUrl: "Merci de saisir un url ayant un format valide.",
needNotTooLongUrl: "Merci de saisir un url ne comptant pas plus de 255 caractères.",
needAnchor: "Merci de fournir une ancre pour ce lien.",
needGoodLongAnchor: "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.",
needQuestionnaire: "Le questionnaire du lien n'a pas été trouvé.",
needMaxLinksForQuestionnaire: "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.",
updatedOkMessage: "Le lien a bien été modifié.",
addedOkMessage: "Le lien a bien été ajouté.",
deletedOkMessage: "Le lien a bien été supprimé.",
notFound: "L'enregistrement du lien n'a pas été trouvé.",
introTitle: "Lectures proposées",
introNoLink: "Aucun lien pour l'instant.",
defaultValue: "Lire l'article sur Wikipédia."
};
/***/ }),
/***/ "../lang/fr/question.js":
/*!******************************!*\
!*** ../lang/fr/question.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
needText: "Merci de saisir le texte de la question !",
needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.",
needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.",
needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ",
notFound: "L'enregistrement de la question n'a pas été trouvé.",
addOkMessage: "La question a bien été ajoutée.",
updateOkMessage: "La question a bien été modifiée.",
deleteOkMessage: "La question a bien été supprimée.",
introTitle: "Les questions enregistrées",
introNoQuestion: "Aucune question n'a été saisie pour l'instant",
needNumberForRank: "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question."
};
/***/ }),
/***/ "../lang/fr/questionnaire.js":
/*!***********************************!*\
!*** ../lang/fr/questionnaire.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
needTitle: "Merci de fournir un titre à votre quiz.",
needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.",
needUrl: "Merci de fournir l'url à votre quiz.",
needUniqueUrl: "L'url du quiz doit être unique.",
needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.",
needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.",
needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.",
needLanguage: "Vous devez sélectionner la langue de ce quiz.",
needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.",
notFound: "Aucun quiz n'a pas été trouvé.",
searchResultTitle: "Résultat pour votre recherche",
searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche",
searchWithResult: "Voici #NB quizs pour votre recherche :",
questionnairesName: "quiz",
publishedBy: "Quiz publié par",
publishedAt: ", le",
lastUpdated: "Dernière mise à jour, le ",
estimatedTime: "Durée de lecture estimée : ",
estimatedTimeOption: {
short: "courte",
medium: "moyenne",
long: "longue"
},
explanationBeforeTxt: "Extrait :",
correctAnswerTxt: "Bonne réponse",
wrongAnswerTxt: "Mauvaise réponse",
btnSendResponse: "Testez vos réponses.",
btnProposeSubscribe: "Je crée mon compte.",
btnProposeConnection: "Je me connecte.",
btnShowQuestionnaire: "Afficher le quiz !",
btnShareQuizTxt: "Partager ce quiz sur ",
nextQuestionnairesList: "Les #NB prochains quizs devant être publiés",
needBeCompleted: "Quiz incomplet",
nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ",
haveBeenPublished: ":NB nouveaux questionnaires ont été publiés.",
haveBeenRegenerated: "Les fichiers HTML de #NB1 questionnaires et #NB2 rubriques ont été regénérés."
};
/***/ }),
/***/ "../lang/fr/user.js":
/*!**************************!*\
!*** ../lang/fr/user.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
notFound: "L'utilisateur n'a pas été trouvé.",
needName: "Merci de choisir un nom d'utilisateur.",
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
needEmail: "Merci de saisir votre adresse e-mail.",
needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
needPassWord: "Merci de fournir un mot de passe.",
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
passwordCopied: "Le mot de passe généré a été copié dans votre presse-papier. Vous pouvez le recopier (Ctrl+V) où vous le souhaitez.",
needStatus: "Il manque le statut.",
needLanguage: "Il manque le code langue.",
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
needSMTP: "Il manque le serveur SMTP.",
needSMTPNotFound: "Il manque le serveur SMTP.",
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ",
godfatherNotFound: "Aucun utilisateur n'a été trouvé pour ce code parrain.",
godfatherFound: "Votre parrain a bien été trouvé !",
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.",
mailValidationLinkSubject: "Merci de valider votre inscription",
mailValidationLinkTxt: "Valider mon compte.",
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.",
validationMessageAdmin: "Le compte a bien été validé.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.",
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
mailWelcomeSubject: "Bienvenue !",
mailWelcomeLinkTxt: "Me connecter à mon compte.",
mailWelcomeBodyTxt: "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nEncore merci et à bientôt.",
mailWelcomeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en <i>spam</i>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>Encore merci et à bientôt.",
mailThankGodfatherSubject: "Merci !",
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.</p><p>Merci et à bientôt !</p>",
badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau <a href='#URL'>en cliquant ici</a>.",
emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.",
alreadyConnected: "Vous êtes déjà connecté(e) au site !",
needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.",
connectionOk: "Connexion réussie.",
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.",
tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",
badPassword: "Le mot de passe n'est pas le bon.",
mailLoginLinkSubject: "Votre lien de connexion.",
mailLoginLinkTxt: "Me connecter.",
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ",
updatedOkMessage: "Vos informations ont bien été mises à jour.",
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas un format correct.",
updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
mailUpdateLoginLinkTxt: "Valider.",
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et <b>vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement</b>. En attendant, merci de continuer à utiliser vos anciens identifiants.",
updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.",
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
mailDeleteSubject: "Confirmer la suppression de votre compte.",
mailDeleteLinkTxt: "Confirmer.",
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.",
deleteOkMessage: "L'utilisateur a bien été supprimé.",
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.",
mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.",
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
welcomeMessage: "Bienvenue #NAME !",
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
infosAdminNbGodChilds: "Ses #NB filleuils : "
};
/***/ }),
/***/ "../tools/main.js":
/*!************************!*\
!*** ../tools/main.js ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
// Quelques fonctions utiles pour les chaînes
var Tool = /*#__PURE__*/function () {
function Tool() {
_classCallCheck(this, Tool);
}
_createClass(Tool, null, [{
key: "isEmpty",
value: function 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;
}
}
}, {
key: "trimIfNotNull",
value: function trimIfNotNull(myString) {
if (Tool.isEmpty(myString)) myString = null;else {
myString += ""; // si autre chose qu'une chaîne envoyé...
myString = myString.trim();
}
return myString;
}
}, {
key: "shortenIfLongerThan",
value: function 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
}, {
key: "replaceAll",
value: function replaceAll(myString, mapObj) {
var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
return myString.replace(replaceElts, function (matched) {
return mapObj[matched];
});
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
}, {
key: "getRandomInt",
value: function 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
}, {
key: "dateFormat",
value: function dateFormat(dateString) {
var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr";
if (Tool.isEmpty(dateString)) return "";
var myDate = new Date(dateString);
var myDay = myDate.getDate() + "";
if (myDay.length === 1) myDay = "0" + myDay;
var myMounth = myDate.getMonth() + 1 + "";
if (myMounth.length === 1) myMounth = "0" + myMounth;
var 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;
}
}]);
return Tool;
}();
module.exports = Tool;
/***/ }),
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
/*!**********************************!*\
!*** ../views sync ^\.\/.*\.js$ ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, 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$";
/***/ }),
/***/ "../views/default/config/fr.js":
/*!*************************************!*\
!*** ../views/default/config/fr.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports) {
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.<br>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.<br>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.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>",
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é.<br>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.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>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 ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>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.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
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 ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
headLinks: [{
anchor: "Contact",
attributes: {
href: "/contact.html",
rel: "nofollow"
}
}, {
anchor: "Parcourir",
attributes: {
href: "/quizs/",
id: "indexHeadLink",
title: "Les derniers quizs"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html"
}
}],
footLinks: [{
anchor: "Blog",
attributes: {
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
title: "Blog WikiLerni sur diaspora*"
}
}, {
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: "CGV & CGU",
attributes: {
href: "/CGV-CGU.html",
rel: "nofollow"
}
}],
maxQuestionnairesSiteHomePage: 3,
maxQuestionnairesByPage: 9,
nbQuestionnairesUserHomePage: 3,
userHomePage: "accueil.html",
adminHomePage: "admin.html",
managerHomePage: "gestion.html",
subscribePage: "inscription.html",
connectionPage: "connexion.html",
validationLinkPage: "validation.html?t=",
loginLinkPage: "login.html?t=",
newLoginLinkPage: "newlogin.html?t=",
deleteLinkPage: "aurevoir.html?t=",
stopMailPage: "stop-mail.html?t=",
accountPage: "compte.html",
updateAccountPage: "mon-compte.html",
questionnairesManagementPage: "gestion-quizs.html",
usersManagementPage: "gestion-utilisateurs.html",
aboutPage: "a-propos.html",
illustrationDir: "/img/quizs/",
siteSlogan: "Cultivons notre jardin !",
homePageTxt: "Page d'accueil",
homeTitle1: "De nature curieuse ?",
homeP1: "Avec WikiLerni, vous apprenez chaque jour de nouvelles choses.<br>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.<br>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 <span class='postscriptum'>(*)</span>, le logiciel et le contenu partagé sur WikiLerni sont libres.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><span class='postscriptum'>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</span>",
homeBtnAboutTxt: "En savoir plus sur WikiLerni !",
homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.",
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é.<br>Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.<br><br>Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. <b>C'est toujours le contenu de l'article Wikipédia qui fait foi concernant les \"bonnes\" réponses</b>. Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement</b>.<br><br>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 ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. Ce compte vous permettra de <b>tester de nouveau ce quiz</b> pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Grâce à ce compte, vous pourrez aussi <b>recevoir régulièrement de nouveaux quizs</b> pour continuer à \"cultiver votre jardin\".<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
newsListTitle: "Les dernières graines de savoir",
tagsListTxt: "Parcourir les rubriques",
mailRecipientTxt: "Message envoyé à :"
};
/***/ }),
/***/ "./src/manageQuestionnaires.js":
/*!*************************************!*\
!*** ./src/manageQuestionnaires.js ***!
\*************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__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_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.)
/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz
/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés.
/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément.
/// Sinon pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau avec ses tags.
// Fichier de configuration côté client :
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile
// Dictionnaires :
var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire");
var txtQuestion = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question");
var txtLink = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link");
var txtIllustration = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration");
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Principaux éléments du DOM manipulés :
var divMain = document.getElementById("main-content");
var divMessage = document.getElementById("message");
var divResponse = document.getElementById("response");
var formQuestionnaire = document.getElementById("questionnaires");
var inputClassification = document.getElementById("classification");
var helpClassification = document.getElementById("helpClassification");
var helpPublishingAt = document.getElementById("helpPublishingAt");
var deleteCheckBox = document.getElementById("deleteOkLabel");
var btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire");
var btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire");
var divQuestionnaires = document.getElementById("questionnairesList");
var formSearch = document.getElementById("search");
var divSearchResult = document.getElementById("searchResult");
var formLink = document.getElementById("links");
var formIllustration = document.getElementById("illustrations");
var formQuestion = document.getElementById("questions");
var divLinks = document.getElementById("linksList");
var divIllustrations = document.getElementById("illustrationsList");
var divQuestions = document.getElementById("questionsList");
var initialise = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var config, isConnected, user, hideAllForms, showLinkInfos, showIllustrationInfos, showQuestionInfos, showFormLinkInfos, showFormIllustrationInfos, showFormQuestionInfos, showFormQuestionnaireInfos, urlDatas, showNextQuestionnaires, sendLinkForm, sendIllustrationForm, sendQuestionForm;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getConfig"])();
case 3:
config = _context.sent;
if (config) {
_context.next = 8;
break;
}
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
_context.next = 12;
break;
case 8:
_context.next = 10;
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, {
message: txtUsers.needBeConnected,
color: "error"
}, window.location);
case 10:
isConnected = _context.sent;
if (isConnected) {
divMain.style.display = "block";
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
}
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); // Initialisation du formulaire de recherche :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Initialise le formulaire permettant de mettre à jour les infos de base du questionnaire :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Questionnaire, formQuestionnaire); // Case de suppression cachée par défaut, car inutile pour formulaire de création
deleteCheckBox.style.display = "none"; // Fonction vidant et cachant tous les formulaires annexes
hideAllForms = function hideAllForms() {
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formLink);
if (txtLink.defaultValue != 0) document.getElementById("anchor").value = txtLink.defaultValue;
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formIllustration);
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formQuestion);
};
hideAllForms(); // Affiche les infos connues concernant les liens
showLinkInfos = function showLinkInfos(Links) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "h4", txtLink.introTitle); // remplace l'existant dans divLinks
var listLinks = "";
for (var i in Links) {
listLinks += "<li><a href='" + Links[i].url + "' target='_blank'>" + Links[i].anchor + "</a> | <a href='#updateLink" + Links[i].id + "' id='#updateLink" + Links[i].id + "' >" + txt.updateBtnTxt + "</a> | <a href='#deleteLink" + Links[i].id + "' id='#deleteLink" + Links[i].id + "' >" + txt.deleteBtnTxt + "</a></li>";
}
if (listLinks === "") listLinks = "<li>" + txtLink.introNoLink + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "ul", listLinks, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite
var _loop = function _loop(_i) {
document.getElementById("#updateLink" + Links[_i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[_i]);
window.location.assign("#links");
});
document.getElementById("#deleteLink" + Links[_i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[_i]);
formLink.elements["deleteOk"].value = true;
sendLinkForm();
});
};
for (var _i in Links) {
_loop(_i);
}
if (config.nbLinksMax > Links.length || config.nbLinksMax === 0) {
if (Links.length < config.nbLinksMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "a", txt.addBtnTxt, "#newLink", ["error"], {
href: "#newLink"
}, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "a", txt.addBtnTxt, "#newLink", ["information"], {
href: "#newLink"
}, false);
document.getElementById("#newLink").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formLink.style.display = "block";
formLink.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#links");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Link, formLink);
});
}
}; // Affiche les infos connues concernant les illustrations
showIllustrationInfos = function showIllustrationInfos(Illustrations) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "h4", txtIllustration.introTitle); // remplace l'existant dans divIllustrations
var listIllustrations = "";
for (var i in Illustrations) {
listIllustrations += "<li><a href='" + configFrontEnd.illustrationDir + Illustrations[i].url + "' target='_blank'><img src='" + configFrontEnd.illustrationDir + Illustrations[i].url + "' alt='" + txtIllustration.defaultAlt + "' style='max-height:150px'></a> | <a href='#updateIllustration" + Illustrations[i].id + "' id='#updateIllustration" + Illustrations[i].id + "' >" + txt.updateBtnTxt + "</a> | <a href='#deleteIllustration" + Illustrations[i].id + "' id='#deleteIllustration" + Illustrations[i].id + "' >" + txt.deleteBtnTxt + "</a></li>";
}
if (listIllustrations === "") listIllustrations = "<li>" + txtIllustration.introNoIllustration + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "ul", listIllustrations, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite
var _loop2 = function _loop2(_i2) {
document.getElementById("#updateIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
window.location.assign("#illustrations");
});
document.getElementById("#deleteIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
formIllustration.elements["deleteOk"].value = true;
sendIllustrationForm();
});
};
for (var _i2 in Illustrations) {
_loop2(_i2);
}
if (config.nbIllustrationsMax > Illustrations.length || config.nbIllustrationsMax === 0) {
if (Illustrations.length < config.nbIllustrationsMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["error"], {
href: "#newIllustration"
}, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["information"], {
href: "#newIllustration"
}, false);
document.getElementById("#newIllustration").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formIllustration.style.display = "block";
formIllustration.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#illustrations");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Illustration, formIllustration);
});
}
}; // Affiche les infos connues concernant les questions
showQuestionInfos = function showQuestionInfos(Questions) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "h4", txtQuestion.introTitle); // remplace l'existant dans divQuestions
var listQuestions = "";
for (var i in Questions) {
listQuestions += "<li>" + Questions[i].Question.text + " | <a href='#updateQuestion" + Questions[i].Question.id + "' id='#updateQuestion" + Questions[i].Question.id + "' >" + txt.updateBtnTxt + "</a> | <a href='#deleteQuestion" + Questions[i].Question.id + "' id='#deleteQuestion" + Questions[i].Question.id + "' >" + txt.deleteBtnTxt + "</a></li>";
}
if (listQuestions === "") listQuestions = "<li>" + txtQuestion.introNoQuestion + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "ul", listQuestions, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite
var _loop3 = function _loop3(_i3) {
document.getElementById("#updateQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
window.location.assign("#links");
});
document.getElementById("#deleteQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
formQuestion.elements["deleteOk"].value = true;
sendQuestionForm();
});
};
for (var _i3 in Questions) {
_loop3(_i3);
}
console.log(config.nbQuestionsMax);
console.log(Questions.length);
if (config.nbQuestionsMax > Questions.length || config.nbQuestionsMax === 0) {
if (Questions.length < config.nbQuestionsMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["error"], {
href: "#newQuestion"
}, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["information"], {
href: "#newQuestion"
}, false);
document.getElementById("#newQuestion").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formQuestion.style.display = "block";
formQuestion.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
formQuestion.elements["rank"].value = config.Question.rank.defaultValue;
window.location.assign("#questions");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion);
});
}
}; // Fonction affichant les infos d'un lien dans le formulaire adhoc
showFormLinkInfos = function showFormLinkInfos(Link) {
// on commence par cacher et vider tous les formulaires annexes
hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
formLink.style.display = "block";
for (var data in Link) {
if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];
} // + les contraintes de champ :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Link, formLink);
}; // Fonction affichant les infos d'une illustration dans le formulaire adhoc
showFormIllustrationInfos = function showFormIllustrationInfos(Illustration) {
// on commence par cacher et vider tous les formulaires annexes
hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
formIllustration.style.display = "block";
for (var data in Illustration) {
if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];
} // + les contraintes de champ :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Illustration, formIllustration); // sauf le champ file qui n'est plus requis quand un fichier existe déjà !
formIllustration.elements["image"].removeAttribute("required");
}; // Fonction affichant les infos d'une question + ses réponses possibles dans le formulaire adhoc
showFormQuestionInfos = function showFormQuestionInfos(Question) {
// on commence par cacher et vider tous les formulaires annexes
hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
formQuestion.style.display = "block";
for (var data in Question.Question) {
if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data];
}
for (var _data in Question.Choices) {
if (formQuestion.elements["choiceText" + _data] !== undefined) {
formQuestion.elements["choiceText" + _data].value = Question.Choices[_data].text;
if (Question.Choices[_data].isCorrect == true) formQuestion.elements["choiceIsCorrect" + _data].checked = true;
formQuestion.elements["idChoice" + _data].value = Question.Choices[_data].id;
}
} // + les contraintes de champ :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion);
}; // Fonction affichant les infos connues concernant un questionnaire et ses dépendances
showFormQuestionnaireInfos = function showFormQuestionnaireInfos(id) {
var xhrGetInfos = new XMLHttpRequest();
xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnaireRoutes + "/" + id);
xhrGetInfos.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && response.Questionnaire != undefined) {
formQuestionnaire.reset(); // pour ne pas garder données déjà affichées si vide dans ce qui est retourné
for (var data in response.Questionnaire) {
if (formQuestionnaire.elements[data] !== undefined) {
if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.Questionnaire[data], "form"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
else formQuestionnaire.elements[data].value = response.Questionnaire[data];
}
}
deleteCheckBox.style.display = "block";
}
if (response.Tags != undefined) {
var classification = "";
for (var i in response.Tags) {
if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name;
}
formQuestionnaire.elements["classification"].value = classification;
}
divLinks.style.display = "block";
divQuestions.style.display = "block";
divIllustrations.style.display = "block";
if (response.Links != undefined) showLinkInfos(response.Links);
if (response.Questions != undefined) showQuestionInfos(response.Questions);
if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations);
helpPublishingAt.style.display = "none"; // info utile pour "placer" un nouveau quiz
// à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden :
btnNewQuestionnaire.style.display = "block";
btnNewQuestionnaire.setAttribute("href", configFrontEnd.questionnairesManagementPage);
btnPreviewQuestionnaire.style.display = "block";
if (response.Questionnaire["isPublished"] === false) btnPreviewQuestionnaire.setAttribute("href", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.previewQuestionnaireRoutes + "/" + id + "/" + user.token);else btnPreviewQuestionnaire.setAttribute("href", config.siteUrl + config.publishedQuestionnaireRoutes + response.Questionnaire["slug"] + ".html");
}
};
xhrGetInfos.send();
}; // Si un id est passé par l'url, on essaye d'afficher le questionnaire :
urlDatas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_6__["getUrlParams"])();
if (urlDatas && urlDatas.id !== undefined) showFormQuestionnaireInfos(urlDatas.id); // Traitement du lancement d'une recherche
formSearch.addEventListener("submit", function (e) {
e.preventDefault();
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch);
var xhrSearch = new XMLHttpRequest();
xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.searchAdminQuestionnairesRoute);
xhrSearch.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txtQuestionnaire.notFound, "", ["information"]);else {
var selectHTML = "<option value=''></option>";
for (var i in response) {
selectHTML += "<option value='" + response[i].id + "'>" + response[i].title + "</option>";
}
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch");
var searchSelect = document.getElementById("selectSearch");
searchSelect.addEventListener("change", function () {
if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value);
});
}
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txt.serverError, "", ["error"]);
}
};
xhrSearch.setRequestHeader("Content-Type", "application/json");
xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrSearch.send(JSON.stringify(datas));
}); // Les questionnaires bientôt publiés. Dans une fonction car devant être rechargé.
showNextQuestionnaires = function showNextQuestionnaires() {
var xhrNextQuestionnaires = new XMLHttpRequest();
xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getListNextQuestionnaires);
xhrNextQuestionnaires.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response.questionnaires)) {
var listHTML = "";
for (var i in response.questionnaires) {
listHTML += "<li>" + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.questionnaires[i].datePublishing, "fr") + ": <a href='" + configFrontEnd.questionnairesManagementPage + "?id=" + response.questionnaires[i].id + "' id='questionnaire_" + response.questionnaires[i].id + "'>" + response.questionnaires[i].title + "</a>";
if (response.questionnaires[i].isPublishable === false) listHTML += " <span class='error'>(" + txtQuestionnaire.needBeCompleted + ")</li>";
listHTML += "</li>";
}
if (response.questionnaires.length !== 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h3", txtQuestionnaire.nextQuestionnairesList.replace("#NB", response.questionnaires.length));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpPublishingAt, "em", txtQuestionnaire.nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(new Date(response.dateNeeded), "fr"));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false);
for (var _i4 in response.questionnaires) {
document.getElementById("questionnaire_" + response.questionnaires[_i4].id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionnaireInfos(e.target.id.split("_")[1]);
window.location.assign("#questionnaires");
});
}
}
}
};
xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + user.token);
xhrNextQuestionnaires.send();
};
showNextQuestionnaires(); // Aide saisie classement du quiz
inputClassification.addEventListener("input", function (e) {
divResponse.innerHTML = "";
var tags = inputClassification.value.split(",");
tags.reverse();
var lastTag = tags[0].trim();
if (lastTag.length >= 2) {
// à revoir : importer la liste des tags lors de l'initialisation pour éviter les appels multiples
// mais dans ce cas actualiser cette liste après chaque mise à jour.
var xhrSearchTags = new XMLHttpRequest();
xhrSearchTags.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.tagsSearchRoute);
xhrSearchTags.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
helpClassification.innerHTML = "";
for (var i in response) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpClassification, "a", response[i].name, "#tag" + response[i].id, ["information"], {
href: "#tag" + response[i].id
}, false);
document.getElementById("#tag" + response[i].id).addEventListener("click", function (e) {
e.preventDefault();
tags[0] = e.target.innerHTML;
tags.reverse();
inputClassification.value = tags.join(",");
});
}
}
}
};
xhrSearchTags.setRequestHeader("Content-Type", "application/json");
xhrSearchTags.setRequestHeader("Authorization", "Bearer " + user.token);
xhrSearchTags.send(JSON.stringify({
search: lastTag
}));
}
}); // Traitement de l'envoi du formulaire des infos de base du quiz
formQuestionnaire.addEventListener("submit", function (e) {
e.preventDefault();
divResponse.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestionnaire);
var xhrQuestionnaireDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && datas.deleteOk !== undefined) xhrQuestionnaireDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/" + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionnaireDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/" + datas.id);else xhrQuestionnaireDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/");
xhrQuestionnaireDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 201 && response.id != undefined) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.addOkMessage, "", ["success"]);
datas.id = response.id;
showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé
} else if (this.status === 200 && response.message != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = txt.serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
if (datas.deleteOk === undefined) showFormQuestionnaireInfos(datas.id);else formQuestionnaire.reset();
}
};
xhrQuestionnaireDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionnaireDatas.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrQuestionnaireDatas.send(JSON.stringify(datas));
}); // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer
sendLinkForm = function sendLinkForm() {
var divResponseLink = document.getElementById("responseLink");
divResponseLink.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formLink);
var xhrLinkDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrLinkDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrLinkDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute + datas.id);else xhrLinkDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute);
xhrLinkDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showLinkInfos(response.questionnaire.Links); // le serveur me retourne une version actualisée de la liste des liens
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#linksList");
showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = txt.serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", txt.serverError, "", ["error"]);
}
};
xhrLinkDatas.setRequestHeader("Content-Type", "application/json");
xhrLinkDatas.setRequestHeader("Authorization", "Bearer " + user.token);
xhrLinkDatas.send(JSON.stringify(datas));
};
formLink.addEventListener("submit", function (e) {
e.preventDefault();
sendLinkForm();
}); // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer
sendIllustrationForm = function sendIllustrationForm() {
var divResponseIllustration = document.getElementById("responseIllustration");
divResponseIllustration.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formIllustration);
var datasWithFiles = new FormData(formIllustration); // il me manque les informations du fichier avec ma fonction getDatasFromInputs
var xhrIllustrationDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrIllustrationDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrIllustrationDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute + datas.id);else xhrIllustrationDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute);
xhrIllustrationDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showIllustrationInfos(response.questionnaire.Illustrations); // le serveur me retourne une version actualisée de la liste des liens
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#illustrationsList");
showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = txt.serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", txt.serverError, "", ["error"]);
}
};
xhrIllustrationDatas.setRequestHeader("Authorization", "Bearer " + user.token);
xhrIllustrationDatas.send(datasWithFiles);
};
formIllustration.addEventListener("submit", function (e) {
e.preventDefault();
sendIllustrationForm();
}); // L'envoi des données d'une question et de ses réponse qui peut être généré par le bouton submit ou par le lien supprimer
sendQuestionForm = function sendQuestionForm() {
var divResponseQuestion = document.getElementById("responseQuestion");
divResponseQuestion.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestion);
var xhrQuestionDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrQuestionDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute + datas.id);else xhrQuestionDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute);
xhrQuestionDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showQuestionInfos(response.questionnaire.Questions); // le serveur me retourne une version actualisée de la liste des questions
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#questionsList");
showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = txt.serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", txt.serverError, "", ["error"]);
}
};
xhrQuestionDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionDatas.setRequestHeader("Authorization", "Bearer " + user.token);
xhrQuestionDatas.send(JSON.stringify(datas));
};
formQuestion.addEventListener("submit", function (e) {
e.preventDefault();
sendQuestionForm();
});
}
case 12:
_context.next = 18;
break;
case 14:
_context.prev = 14;
_context.t0 = _context["catch"](0);
console.error(_context.t0);
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
case 18:
case "end":
return _context.stop();
}
}
}, _callee, null, [[0, 14]]);
}));
return function initialise() {
return _ref.apply(this, arguments);
};
}();
initialise();
/***/ }),
/***/ "./src/tools/clientstorage.js":
/*!************************************!*\
!*** ./src/tools/clientstorage.js ***!
\************************************/
/*! exports provided: saveLocaly, getLocaly, removeLocaly */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
// 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
var saveLocaly = function saveLocaly(name, data) {
localStorage.setItem(name, JSON.stringify(data));
};
var getLocaly = function getLocaly(name) {
var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
};
var removeLocaly = function removeLocaly(name) {
localStorage.removeItem(name);
};
/***/ }),
/***/ "./src/tools/dom.js":
/*!**************************!*\
!*** ./src/tools/dom.js ***!
\**************************/
/*! exports provided: addElement */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
// Fonction associant les attributs fournis à un champ de formulaire
var addElement = function addElement(eltParent, eltType) {
var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
var newElement = document.createElement(eltType);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
newElement.id = eltId;
if (Array.isArray(eltClass) && eltClass.length != 0) {
for (var i in eltClass) {
newElement.classList.add(eltClass[i]);
}
}
if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
{
for (var attributName in eltAttributes) {
newElement.setAttribute(attributName, eltAttributes[attributName]);
}
}
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "<br>"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.
if (replace) eltParent.innerHTML = "";
eltParent.appendChild(newElement);
}
};
/***/ }),
/***/ "./src/tools/everywhere.js":
/*!*********************************!*\
!*** ./src/tools/everywhere.js ***!
\*********************************/
/*! exports provided: helloDev, updateAccountLink */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; });
// Ce script fournit des fonctions utilisées sur toutes les pages du site
var helloDev = function helloDev() {
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\nhttps://gitlab.com/lefablab/wikilerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
return true;
};
var updateAccountLink = function updateAccountLink(status, configTemplate) {
var link = document.getElementById("accountHeadLink");
var homePage = status + "HomePage";
link.href = "/" + configTemplate[homePage];
};
/***/ }),
/***/ "./src/tools/forms.js":
/*!****************************!*\
!*** ./src/tools/forms.js ***!
\****************************/
/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// Fonction associant les attributs fournis à un champ de formulaire
var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
for (var i in myForm.elements) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
var idInput = myForm.elements[i].id;
if (inputsConf[idInput] !== undefined) {
var inputHTML = document.getElementById(idInput);
for (var attribute in inputsConf[idInput]) {
inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
}
}
}
}
return true;
}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
var getDatasFromInputs = function getDatasFromInputs(myForm) {
var datas = {};
var formData = new FormData(myForm);
var _iterator = _createForOfIteratorHelper(formData.entries()),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var entrie = _step.value;
datas[entrie[0]] = entrie[1];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return datas;
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
// Revoir pour les select
var empyForm = function empyForm(myForm) {
var formData = new FormData(myForm);
var _iterator2 = _createForOfIteratorHelper(formData.entries()),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var entrie = _step2.value;
if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return true;
}; // Vide et cache le formulaire
var empyAndHideForm = function empyAndHideForm(myForm) {
empyForm(myForm);
myForm.style.display = "none";
};
/***/ }),
/***/ "./src/tools/url.js":
/*!**************************!*\
!*** ./src/tools/url.js ***!
\**************************/
/*! exports provided: getUrlParams */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction récupérant les paramètres passés par l'url
var getUrlParams = function getUrlParams() {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false;
var parameters = location.search.substring(1).split("&");
if (!Array.isArray(parameters) || parameters.length === 0) return false;
var param,
datas = {};
for (var i in parameters) {
param = parameters[i].split("=");
if (param.length === 2) datas[param[0]] = decodeURI(param[1]);
}
return datas;
};
/***/ }),
/***/ "./src/tools/users.js":
/*!****************************!*\
!*** ./src/tools/users.js ***!
\****************************/
/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; });
/* 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__);
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
// Récupère les données de configuration des utilisateurs
// À terme, un fichier statique importable comme module devrait éviter une requête ajax
var getConfig = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig");
xhr.onload = function () {
return resolve(JSON.parse(xhr.responseText));
};
xhr.onerror = function () {
return reject(xhr.statusText);
};
xhr.send();
}));
case 1:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function getConfig() {
return _ref.apply(this, arguments);
};
}();
var getTimeDifference = function 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
var 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;
}; // On enlève volontairement les 0/O pour éviter les confusions !
// Et mieux vaut aussi débuter et finir par une lettre simple.
var getPassword = function getPassword(nbCarMin, nbCarMax) {
var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
var password = letters[Math.floor(Math.random() * letters.length)];
for (var 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;
}; // 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.
var setSession = function setSession(userId, token, durationTS) {
var storageUser = {
id: userId,
token: token,
duration: durationTS
};
Object(_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
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
var checkAnswerDatas = function checkAnswerDatas(datas) {
var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer");
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) {
var answer = JSON.parse(lastAnswer);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) {
datas.duration = answer.duration;
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
datas.QuestionnaireId = answer.QuestionnaireId;
datas.nbQuestions = answer.nbQuestions;
}
}
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é
var checkSession = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
var status,
urlRedirection,
message,
urlWanted,
_args2 = arguments;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : [];
urlRedirection = _args2.length > 1 ? _args2[1] : undefined;
message = _args2.length > 2 ? _args2[2] : undefined;
urlWanted = _args2.length > 3 ? _args2[3] : undefined;
return _context2.abrupt("return", new Promise(function (resolve, reject) {
var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user");
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var user = JSON.parse(userDatas);
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var 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 = function () {
var 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
Object(_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) {
var 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 {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
} else {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
};
xhr.onerror = function () {
return reject(xhr.statusText);
};
xhr.send();
}
}
}));
case 5:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function checkSession() {
return _ref2.apply(this, arguments);
};
}(); // Cette fonction sert à la précédente en cas de connexion non valide
var redirectUser = function redirectUser(urlRedirection, message, urlWanted) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
};
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9saW5rJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9uJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvbGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInJlZ2VuZXJhdGVIVE1MIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5lZWRVcmwiLCJuZWVkVW5pcXVlVXJsIiwibmVlZEdvb2RMb25nVXJsIiwibmVlZEdvb2RMb25nQWx0IiwibmVlZEdvb2RMb25nVGl0bGUiLCJuZWVkR29vZExvbmdDYXB0aW9uIiwibmVlZEdvb2RGaWxlIiwibmVlZFF1ZXN0aW9ubmFpcmVGb3JJbGx1c3RyYXRpb24iLCJuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUiLCJub3RGb3VuZCIsImFkZGVkT2tNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsImRlbGV0ZWRPa01lc3NhZ2UiLCJkZWZhdWx0QWx0IiwiaW50cm9UaXRsZSIsImludHJvTm9JbGx1c3RyYXRpb24iLCJuZWVkVmFsaWRVcmwiLCJuZWVkTm90VG9vTG9uZ1VybCIsIm5lZWRBbmNob3IiLCJuZWVkR29vZExvbmdBbmNob3IiLCJuZWVkUXVlc3Rpb25uYWlyZSIsIm5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUiLCJpbnRyb05vTGluayIsIm5lZWRUZXh0IiwibmVlZE5vdFRvb0xvbmdUZXh0IiwibmVlZE1heFF1ZXN0aW9ucyIsImludHJvTm9RdWVzdGlvbiIsIm5lZWROdW1iZXJGb3JSYW5rIiwibmVlZFRpdGxlIiwibmVlZE5vdFRvb0xvbmdUaXRsZSIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlIiwibmVlZEtub3dJZklzUHVibGlzaGVkIiwibmVlZExhbmd1YWdlIiwibmVlZEVzdGltYXRlZFRpbWUiLCJzZWFyY2hSZXN1bHRUaXRsZSIsInNlYXJjaE5vUmVzdWx0Iiwic2VhcmNoV2l0aFJlc3VsdCIsInF1ZXN0aW9ubmFpcmVzTmFtZSIsInB1Ymxpc2hlZEJ5IiwicHVibGlzaGVkQXQiLCJsYXN0VXBkYXRlZCIsImVzdGltYXRlZFRpbWUiLCJlc3RpbWF0ZWRUaW1lT3B0aW9uIiwic2hvcnQiLCJtZWRpdW0iLCJsb25nIiwiZXhwbGFuYXRpb25CZWZvcmVUeHQiLCJjb3JyZWN0QW5zd2VyVHh0Iiwid3JvbmdBbnN3ZXJUeHQiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5TaG93UXVlc3Rpb25uYWlyZSIsImJ0blNoYXJlUXVpelR4dCIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJuZWVkQmVDb21wbGV0ZWQiLCJuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlIiwiaGF2ZUJlZW5QdWJsaXNoZWQiLCJoYXZlQmVlblJlZ2VuZXJhdGVkIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rVHh0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5MaW5rVHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwidGFnc0xpc3RUeHQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsInZhbGlkYXRpb25MaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwiZGVsZXRlTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsImFib3V0UGFnZSIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJtYWlsUmVjaXBpZW50VHh0IiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsInR4dFF1ZXN0aW9ubmFpcmUiLCJ0eHRRdWVzdGlvbiIsInR4dExpbmsiLCJ0eHRJbGx1c3RyYXRpb24iLCJoZWxsb0RldiIsImRpdk1haW4iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZGl2TWVzc2FnZSIsImRpdlJlc3BvbnNlIiwiZm9ybVF1ZXN0aW9ubmFpcmUiLCJpbnB1dENsYXNzaWZpY2F0aW9uIiwiaGVscENsYXNzaWZpY2F0aW9uIiwiaGVscFB1Ymxpc2hpbmdBdCIsImRlbGV0ZUNoZWNrQm94IiwiYnRuTmV3UXVlc3Rpb25uYWlyZSIsImJ0blByZXZpZXdRdWVzdGlvbm5haXJlIiwiZGl2UXVlc3Rpb25uYWlyZXMiLCJmb3JtU2VhcmNoIiwiZGl2U2VhcmNoUmVzdWx0IiwiZm9ybUxpbmsiLCJmb3JtSWxsdXN0cmF0aW9uIiwiZm9ybVF1ZXN0aW9uIiwiZGl2TGlua3MiLCJkaXZJbGx1c3RyYXRpb25zIiwiZGl2UXVlc3Rpb25zIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImNvbmZpZyIsImFkZEVsZW1lbnQiLCJjaGVja1Nlc3Npb24iLCJtZXNzYWdlIiwiY29sb3IiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImlzQ29ubmVjdGVkIiwic3R5bGUiLCJkaXNwbGF5IiwiZ2V0TG9jYWx5IiwicmVtb3ZlTG9jYWx5IiwidXNlciIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiaGlkZUFsbEZvcm1zIiwiZW1weUFuZEhpZGVGb3JtIiwic2hvd0xpbmtJbmZvcyIsIkxpbmtzIiwibGlzdExpbmtzIiwiaSIsInVybCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJzaG93Rm9ybUxpbmtJbmZvcyIsImFzc2lnbiIsImVsZW1lbnRzIiwic2VuZExpbmtGb3JtIiwiTGluayIsInNob3dJbGx1c3RyYXRpb25JbmZvcyIsIklsbHVzdHJhdGlvbnMiLCJsaXN0SWxsdXN0cmF0aW9ucyIsInNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MiLCJzZW5kSWxsdXN0cmF0aW9uRm9ybSIsIklsbHVzdHJhdGlvbiIsInNob3dRdWVzdGlvbkluZm9zIiwiUXVlc3Rpb25zIiwibGlzdFF1ZXN0aW9ucyIsInNob3dGb3JtUXVlc3Rpb25JbmZvcyIsInNlbmRRdWVzdGlvbkZvcm0iLCJjb25zb2xlIiwibG9nIiwiZGF0YSIsInJlbW92ZUF0dHJpYnV0ZSIsIkNob2ljZXMiLCJpc0NvcnJlY3QiLCJjaGVja2VkIiwic2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MiLCJ4aHJHZXRJbmZvcyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJyZXNldCIsImRhdGVGb3JtYXQiLCJUYWdzIiwiY2xhc3NpZmljYXRpb24iLCJzZXRBdHRyaWJ1dGUiLCJ0b2tlbiIsInNlbmQiLCJ1cmxEYXRhcyIsImdldFVybFBhcmFtcyIsImRhdGFzIiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwieGhyU2VhcmNoIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VsZWN0SFRNTCIsInNlYXJjaFNlbGVjdCIsInNldFJlcXVlc3RIZWFkZXIiLCJzdHJpbmdpZnkiLCJzaG93TmV4dFF1ZXN0aW9ubmFpcmVzIiwieGhyTmV4dFF1ZXN0aW9ubmFpcmVzIiwibGlzdEhUTUwiLCJkYXRlUHVibGlzaGluZyIsImlzUHVibGlzaGFibGUiLCJkYXRlTmVlZGVkIiwidGFyZ2V0Iiwic3BsaXQiLCJpbm5lckhUTUwiLCJ0YWdzIiwicmV2ZXJzZSIsImxhc3RUYWciLCJ4aHJTZWFyY2hUYWdzIiwic2VhcmNoIiwieGhyUXVlc3Rpb25uYWlyZURhdGFzIiwiZGVsZXRlT2siLCJlcnJvcnMiLCJkaXZSZXNwb25zZUxpbmsiLCJ4aHJMaW5rRGF0YXMiLCJsaW5rc1JvdXRlIiwicXVlc3Rpb25uYWlyZSIsImRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uIiwiZGF0YXNXaXRoRmlsZXMiLCJGb3JtRGF0YSIsInhocklsbHVzdHJhdGlvbkRhdGFzIiwiaWxsdXN0cmF0aW9uc1JvdXRlIiwiZGl2UmVzcG9uc2VRdWVzdGlvbiIsInhoclF1ZXN0aW9uRGF0YXMiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwiYXBwZW5kQ2hpbGQiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJ0eXBlIiwicGFyYW1ldGVycyIsInBhcmFtIiwiZGVjb2RlVVJJIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ4aHIiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FB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TUFBTSxDQUFDQyxHQUFHLENBQUNHLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBSCxxQkFBRyxDQUFDOUUsSUFBSjtBQUNIO0FBQ0o7QUFDSixhQXRFTSxDQUZpQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFaaEUsWUFBWTtBQUFBO0FBQUE7QUFBQSxHQUFsQixDLENBMEVQOztBQUNBLElBQU15SyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDSCxjQUFELEVBQWlCckssT0FBakIsRUFBMEJzSyxTQUExQixFQUNyQjtBQUNJLE1BQUcsQ0FBQzVRLDJEQUFPLENBQUNzRyxPQUFELENBQVgsRUFDSXdHLG9FQUFVLENBQUMsU0FBRCxFQUFZeEcsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDdEcsMkRBQU8sQ0FBQzRRLFNBQUQsQ0FBWCxFQUNJOUQsb0VBQVUsQ0FBQyxLQUFELEVBQVE4RCxTQUFSLENBQVY7QUFDSixNQUFHLENBQUM1USwyREFBTyxDQUFDMlEsY0FBRCxDQUFYLEVBQ0luSyxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JxQixNQUFoQixDQUF1QjZJLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwid2lraWxlcm5pXCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJXTFwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMiwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIGdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9nZXRyYW5kb21cIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgcmVnZW5lcmF0ZUhUTUw6IFwiL2h0bWxyZWdlbmVyYXRlZFwiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLC8vIGlkZW1cbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLy8gbGltaXRlIGxlcyByw6lzdWx0YXQgZHUgbW90ZXVyIGRlIHJlY2hlcmNoZSBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvaWxsdXN0cmF0aW9uXCI6IFwiLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9pbGx1c3RyYXRpb24kXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2xpbmtcIjogXCIuLi9sYW5nL2ZyL2xpbmsuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9saW5rJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvblwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9xdWVzdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvcXVlc3Rpb25uYWlyZVwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb25uYWlyZS5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9ubmFpcmUkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBXaWtpcMOpZGlhIGVuIHF1ZXN0aW9uc1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkF2ZWMgV2lraUxlcm5pLCByZWNldmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlYXV4IHF1aXpzIHBvdXIgdGVzdGVyIHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYWxlcnROZXdXaW5kb3c6IFwibm91dmVsbGUgZmVuw6p0cmVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZFVybCA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgdXJsIHBvdXIgbCdpbWFnZS5cIixcbiAgICBuZWVkVW5pcXVlVXJsIDogXCJMJ3VybCBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW5lIGF1dHJlIGltYWdlLlwiLFxuICAgIG5lZWRHb29kTG9uZ1VybCA6IFwiTCd1cmwgZGUgbCdpbWFnZSBkb2l0IGNvbnRlbmlyIGVudHJlIDUgZXQgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ0FsdCA6IFwiTGUgdGV4dGUgZGUgbGEgcHJvcHJpw6l0w6kgJ2FsdCcgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdUaXRsZSA6IFwiTGUgdGV4dGUgZGUgbGEgcHJvcHJpw6l0w6kgJ3RpdGxlJyBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ0NhcHRpb24gOiBcIkxlIHRleHRlIGRlIGxhIGzDqWdlbmRlIGRlIGwnaW1hZ2UgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZEZpbGUgOiBcIlZvdHJlIGZpY2hpZXIgbidhIHBhcyDDqXTDqSBhY2NlcHTDqS5cIixcbiAgICBuZWVkUXVlc3Rpb25uYWlyZUZvcklsbHVzdHJhdGlvbiA6IFwiVGVudGF0aXZlIGQnYWpvdXQvbWlzZSDDoCBqb3VyL3N1cHByZWVzc2lvbiBkJ3VuZSBpbGx1c3RyYXRpb24gcG91ciB1biBxdWVzdGlvbm5haXJlIG4nYXlhbnQgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE1heElsbHVzdHJhdGlvbnNGb3JRdWVzdGlvbm5haXJlIDogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZCdpbGx1c3RyYXRpb25zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZS5cIixcbiAgICBub3RGb3VuZDogXCJMJ2VucmVnaXN0cmVtZW50IGRlIGwnaWxsdXN0cmF0aW9uIG4nYSBwYXMgw6l0w6kgdHJvdXbDqSA6IFwiLFxuICAgIGFkZGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6llLlwiLFxuICAgIGRlbGV0ZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIHN1cHByaW3DqWUuXCIsXG4gICAgZGVmYXVsdEFsdCA6IFwiSWxsdXN0cmF0aW9uIGR1IHF1aXpcIixcbiAgICBpbnRyb1RpdGxlIDogXCJJbGx1c3RyYXRpb25zIGR1IHF1aXpcIixcbiAgICBpbnRyb05vSWxsdXN0cmF0aW9uIDogXCJBdWN1bmUgaWxsdXN0cmF0aW9uIHBvdXIgbCdpbnN0YW50LlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIGwndXJsIGR1IGxpZW4uXCIsXG4gICAgbmVlZFZhbGlkVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIHVuIHVybCBheWFudCB1biBmb3JtYXQgdmFsaWRlLlwiLFxuICAgIG5lZWROb3RUb29Mb25nVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIHVuIHVybCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEFuY2hvciA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgYW5jcmUgcG91ciBjZSBsaWVuLlwiLFxuICAgIG5lZWRHb29kTG9uZ0FuY2hvciA6IFwiTWVyY2kgZGUgZm91cm5pciB1bmUgYW5jcmUgcG91ciBjZSBsaWVuIGNvbXB0YW50IGVudHJlIDUgZXQgMTUwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRRdWVzdGlvbm5haXJlIDogXCJMZSBxdWVzdGlvbm5haXJlIGR1IGxpZW4gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUgOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkZSBsaWVucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBtb2RpZmnDqS5cIixcbiAgICBhZGRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBham91dMOpLlwiLFxuICAgIGRlbGV0ZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIG5vdEZvdW5kIDogXCJMJ2VucmVnaXN0cmVtZW50IGR1IGxpZW4gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIGludHJvVGl0bGUgOiBcIkxlY3R1cmVzIHByb3Bvc8OpZXNcIixcbiAgICBpbnRyb05vTGluayA6IFwiQXVjdW4gbGllbiBwb3VyIGwnaW5zdGFudC5cIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiTGlyZSBsJ2FydGljbGUgc3VyIFdpa2lww6lkaWEuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWRUZXh0OiBcIk1lcmNpIGRlIHNhaXNpciBsZSB0ZXh0ZSBkZSBsYSBxdWVzdGlvbiAhXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdUZXh0OiBcIkxhIHF1ZXN0aW9uIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmU6IFwiTGUgcXVlc3Rpb25uYWlyZSBjb25jZXJuw6kgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRNYXhRdWVzdGlvbnM6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGRlIHF1ZXN0aW9ucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUgOiBcIixcbiAgICBub3RGb3VuZDogXCJMJ2VucmVnaXN0cmVtZW50IGRlIGxhIHF1ZXN0aW9uIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBhZGRPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIGFqb3V0w6llLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpZS5cIixcbiAgICBpbnRyb1RpdGxlOiBcIkxlcyBxdWVzdGlvbnMgZW5yZWdpc3Ryw6llc1wiLFxuICAgIGludHJvTm9RdWVzdGlvbjogXCJBdWN1bmUgcXVlc3Rpb24gbidhIMOpdMOpIHNhaXNpZSBwb3VyIGwnaW5zdGFudFwiLFxuICAgIG5lZWROdW1iZXJGb3JSYW5rIDogXCJWb3VzIGRldmV6IGZvdXJuaXIgdW4gbm9tYnJlIHN1cMOpcmlldXIgb3Ugw6lnYWwgw6AgMSBwb3VyIGxlIHJhbmcgZGUgY2V0dGUgcXVlc3Rpb24uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWRUaXRsZTogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRpdHJlIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdUaXRsZTogXCJMZSB0aXRyZSBkdSBxdWl6IG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFVybDogXCJNZXJjaSBkZSBmb3VybmlyIGwndXJsIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZFVuaXF1ZVVybDogXCJMJ3VybCBkdSBxdWl6IGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICAgIG5lZWRJbnRyb2R1Y3Rpb246IFwiTWVyY2kgZGUgZm91cm5pciB1biB0ZXh0ZSBkJ2ludHJvZHVjdGlvbiDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGU6IFwiTGEgZGF0ZSBkZSBwdWJsaWNhdGlvbiBmb3VybmllIG4nYSBwYXMgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBuZWVkS25vd0lmSXNQdWJsaXNoZWQ6IFwiSWwgZmF1dCBzYXZvaXIgc2kgY2UgcXVpeiBlc3QgcHVibGnDqS5cIixcbiAgICBuZWVkTGFuZ3VhZ2U6IFwiVm91cyBkZXZleiBzw6lsZWN0aW9ubmVyIGxhIGxhbmd1ZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5lZWRFc3RpbWF0ZWRUaW1lOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgdW5lIGVzdGltYXRpb24gZGUgbGEgZHVyw6llIGRlIGNlIHF1aXouXCIsXG4gICAgbm90Rm91bmQgOiBcIkF1Y3VuIHF1aXogbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHNlYXJjaFJlc3VsdFRpdGxlIDogXCJSw6lzdWx0YXQgcG91ciB2b3RyZSByZWNoZXJjaGVcIixcbiAgICBzZWFyY2hOb1Jlc3VsdCA6IFwiQXVjdW4gcsOpc3VsdGF0IG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoV2l0aFJlc3VsdCA6IFwiVm9pY2kgI05CIHF1aXpzIHBvdXIgdm90cmUgcmVjaGVyY2hlIDpcIixcbiAgICBxdWVzdGlvbm5haXJlc05hbWU6IFwicXVpelwiLFxuICAgIHB1Ymxpc2hlZEJ5OiBcIlF1aXogcHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGVzdGltYXRlZFRpbWVPcHRpb24gOlxuICAgIHtcbiAgICAgICAgc2hvcnQ6IFwiY291cnRlXCIsXG4gICAgICAgIG1lZGl1bTogXCJtb3llbm5lXCIsXG4gICAgICAgIGxvbmc6IFwibG9uZ3VlXCJcbiAgICB9LFxuICAgIGV4cGxhbmF0aW9uQmVmb3JlVHh0OiBcIkV4dHJhaXQgOlwiLFxuICAgIGNvcnJlY3RBbnN3ZXJUeHQ6IFwiQm9ubmUgcsOpcG9uc2VcIixcbiAgICB3cm9uZ0Fuc3dlclR4dDogXCJNYXV2YWlzZSByw6lwb25zZVwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJUZXN0ZXogdm9zIHLDqXBvbnNlcy5cIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsXG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsXG4gICAgYnRuU2hvd1F1ZXN0aW9ubmFpcmU6IFwiQWZmaWNoZXIgbGUgcXVpeiAhXCIsXG4gICAgYnRuU2hhcmVRdWl6VHh0OiBcIlBhcnRhZ2VyIGNlIHF1aXogc3VyIFwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiLFxuICAgIGhhdmVCZWVuUmVnZW5lcmF0ZWQgOiBcIkxlcyBmaWNoaWVycyBIVE1MIGRlICNOQjEgcXVlc3Rpb25uYWlyZXMgZXQgI05CMiBydWJyaXF1ZXMgb250IMOpdMOpIHJlZ8OpbsOpcsOpcy5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyB2b3RyZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciAoQ3RybCtWKSBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rVHh0IDogXCJWYWxpZGVyIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIGRhbnMgbGVzIDI0aC48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyIMOgIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhXFxuXFxuU2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIEVNQUlMLlxcblxcbkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIEVNQUlMIMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZHUgc2l0ZSBuJ2Fycml2ZW50IGVuIFxcXCJzcGFtXFxcIi5cXG5cXG5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZXMgcXVpenMgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLlxcblxcblBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gc3VpdmFudCA6IExJTktfVVJMXFxuXFxuRW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0LlwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+PGJyPlNpIHZvdXMgYXZleiBsYSBtb2luZHJlIHF1ZXN0aW9uIG91IHN1Z2dlc3Rpb24gY29uY2VybmFudCBOT01fU0lURSwgbidow6lzaXRleiBwYXMgw6AgbWUgY29udGFjdGVyIGVuIMOpY3JpdmFudCDDoCA8Yj5FTUFJTDwvYj4uPGJyPjxicj5KZSB2b3VzIGNvbnNlaWxsZSBkJ2FpbGxldXJzIGQnYWpvdXRlciA8Yj5FTUFJTDwvYj4gw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkdSBzaXRlIG4nYXJyaXZlbnQgZW4gPGk+c3BhbTwvaT4uPGJyPjxicj5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZXMgcXVpenMgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLjxicj48YnI+UG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBjaS1kZXNzb3VzLjxicj48YnI+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0LlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rVHh0IDogXCJWYWxpZGVyLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtUeHQgOiBcIkNvbmZpcm1lci5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJQYXJjb3VyaXJcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL3F1aXpzL1wiLCBpZDpcImluZGV4SGVhZExpbmtcIiwgdGl0bGU6XCJMZXMgZGVybmllcnMgcXVpenNcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogOSxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICB2YWxpZGF0aW9uTGlua1BhZ2UgOiBcInZhbGlkYXRpb24uaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBuZXdMb2dpbkxpbmtQYWdlIDogXCJuZXdsb2dpbi5odG1sP3Q9XCIsXG4gICAgZGVsZXRlTGlua1BhZ2UgOiBcImF1cmV2b2lyLmh0bWw/dD1cIixcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1cGRhdGVBY2NvdW50UGFnZTogXCJtb24tY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVBhZ2VUeHQ6IFwiUGFnZSBkJ2FjY3VlaWxcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhIDxzcGFuIGNsYXNzPSdwb3N0c2NyaXB0dW0nPigqKTwvc3Bhbj4sIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c3BhbiBjbGFzcz0ncG9zdHNjcmlwdHVtJz4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvc3Bhbj5cIixcbiAgICBob21lQnRuQWJvdXRUeHQ6IFwiRW4gc2F2b2lyIHBsdXMgc3VyIFdpa2lMZXJuaSAhXCIsXG4gICAgaG9tZUJ0blN1YnNjcmliZVR4dDogXCJUZXN0ZXIgV2lraUxlcm5pIGdyYXR1aXRlbWVudC5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5TdWl2YW50IGxlcyBxdWVzdGlvbnMsIHVuZSBvdSBwbHVzaWV1cnMgcsOpcG9uc2VzIHBldXZlbnQgw6p0cmUgY29ycmVjdGVzIGV0IGRvaXZlbnQgZG9uYyDDqnRyZSBjb2Now6llcy4gPGI+Qydlc3QgdG91am91cnMgbGUgY29udGVudSBkZSBsJ2FydGljbGUgV2lraXDDqWRpYSBxdWkgZmFpdCBmb2kgY29uY2VybmFudCBsZXMgXFxcImJvbm5lc1xcXCIgcsOpcG9uc2VzPC9iPi4gTWFpcyBsZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBwZXV2ZW50IMOpdm9sdWVyLCBkb25jIG4naMOpc2l0ZXogcGFzIDxhIGhyZWY9Jy9jb250YWN0Lmh0bWwnPsOgIG1lIHNpZ25hbGVyIHVuZSBlcnJldXI8L2E+Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlcywgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50PC9iPi48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuIENlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSA8Yj50ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6PC9iPiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEdyw6JjZSDDoCBjZSBjb21wdGUsIHZvdXMgcG91cnJleiBhdXNzaSA8Yj5yZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVhdXggcXVpenM8L2I+IHBvdXIgY29udGludWVyIMOgIFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCJMZXMgZGVybmnDqHJlcyBncmFpbmVzIGRlIHNhdm9pclwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxufTsiLCIvLyAtLSBHRVNUSU9OIERVIEZPUk1VTEFJUkUgUEVSTUVUVEFOVCBERSBTQUlTSVIgLyDDiURJVEVSIExFUyBRVUlaUyBFVCBMRVVSUyBEw4lQRU5EQU5DRVMgKExJRU5TLCBJTUFHRVMsIFRBR1MsIEVUQy4pXG5cbi8vLyBWw6lyaWZpZSBxdWUgbCd1dGlsaXNhdGV1ciBlc3QgYmllbiBjb25uZWN0w6ksIGEgbGUgYm9uIHN0YXR1dCBldCBsZSByZWRpcmlnZSB2ZXJzIGxlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbiBzaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLlxuLy8vIFNpIGMnZXN0IG9rLCBwcm9wb3NlIHVuIG1vdGV1ciBkZSByZWNoZXJjaGUgcGVybWV0dGFudCBkZSBjaGVyY2hlciB1biBxdWl6XG4vLy8gU2kgdW4gaWQgZXN0IHBhc3PDqSBwYXIgbCd1cmwgb24gYWZmaWNoZSBsZXMgaW5mb3JtYXRpb25zIGR1IHF1aXogZGFucyB1biBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbCfDqWRpdGVyL3N1cHByaW1lciBhdmVjIHVuZSBsaXN0ZSBkZXMgw6lsw6ltZW50cyBsacOpcyAobGllbnMsIGlsbHVzdHJhdGlvbnMsIHF1ZXN0aW9ucy4uLikgcG91dmFudCBldXgtbcOqbWVzIMOqdHJlIMOpZGl0w6lzL3N1cHByaW3DqXMuXG4vLy8gU2kgbGUgbm9tYnJlIG1heCBjb25maWd1csOpIHBvdXIgY2hhY3VuIGRlIHNlcyDDqWzDqW1lbnRzIG4nZXN0IHBhcyBhdHRlaW50LCBpbCBlc3QgYXVzc2kgcHJvcG9zw6kgZCdham91dGVyIHVuIG5vdXZlbCDDqWzDqW1lbnQuXG4vLy8gU2lub24gcGFzIGQnaWQgcGFzc8OpIHBhciBsJ3VybCwgb24gYWZmaWNoZSB1biBmb3JtdWxhaXJlIHZpZGUgcGVybWV0dGFudCBkJ2VuIHNhaXNpciB1biBub3V2ZWF1IGF2ZWMgc2VzIHRhZ3MuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgdXRpbGVzIGF1IHNjcmlwdCA6ICEhIHJldm9pciBxdWFuZCBsZSByZXN0ZSBzZXJhIGZpbmkgcG91ciB2w6lyaWZpZXIgc2kgdG91dCBlc3QgdXRpbGVcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYsIHVwZGF0ZUFjY291bnRMaW5rIH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZW1weUFuZEhpZGVGb3JtLCBlbXB5Rm9ybSwgZ2V0RGF0YXNGcm9tSW5wdXRzLCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgZGF0ZUZvcm1hdCwgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcbmNvbnN0IHR4dFF1ZXN0aW9ubmFpcmUgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCB0eHRRdWVzdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvcXVlc3Rpb25cIik7XG5jb25zdCB0eHRMaW5rID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9saW5rXCIpO1xuY29uc3QgdHh0SWxsdXN0cmF0aW9uID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9pbGx1c3RyYXRpb25cIik7XG5cbmhlbGxvRGV2KCk7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZm9ybVF1ZXN0aW9ubmFpcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVzXCIpO1xuY29uc3QgaW5wdXRDbGFzc2lmaWNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2xhc3NpZmljYXRpb25cIik7XG5jb25zdCBoZWxwQ2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlbHBDbGFzc2lmaWNhdGlvblwiKTtcbmNvbnN0IGhlbHBQdWJsaXNoaW5nQXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlbHBQdWJsaXNoaW5nQXRcIik7XG5jb25zdCBkZWxldGVDaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsZXRlT2tMYWJlbFwiKTtcbmNvbnN0IGJ0bk5ld1F1ZXN0aW9ubmFpcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndhbnROZXdRdWVzdGlvbm5haXJlXCIpO1xuY29uc3QgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInByZXZpZXdRdWVzdGlvbm5haXJlXCIpO1xuXG5jb25zdCBkaXZRdWVzdGlvbm5haXJlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNMaXN0XCIpO1xuXG5jb25zdCBmb3JtU2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hcIik7XG5jb25zdCBkaXZTZWFyY2hSZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFJlc3VsdFwiKTtcblxuY29uc3QgZm9ybUxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtzXCIpO1xuY29uc3QgZm9ybUlsbHVzdHJhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWxsdXN0cmF0aW9uc1wiKTtcbmNvbnN0IGZvcm1RdWVzdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25zXCIpO1xuY29uc3QgZGl2TGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtzTGlzdFwiKTtcbmNvbnN0IGRpdklsbHVzdHJhdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlsbHVzdHJhdGlvbnNMaXN0XCIpO1xuY29uc3QgZGl2UXVlc3Rpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNMaXN0XCIpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7ICAgICAgICBcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1wibWFuYWdlclwiLCBcImFkbWluXCJdLCBcIi9cIitjb25maWdGcm9udEVuZC5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiB0eHRVc2Vycy5uZWVkQmVDb25uZWN0ZWQsIGNvbG9yOlwiZXJyb3JcIiB9LCB3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGl2TWFpbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICBpZighaXNFbXB0eShnZXRMb2NhbHkoXCJtZXNzYWdlXCIpKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnRnJvbnRFbmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzYXRpb24gZHUgZm9ybXVsYWlyZSBkZSByZWNoZXJjaGUgOlxuICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcsIGZvcm1TZWFyY2gpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpc2UgbGUgZm9ybXVsYWlyZSBwZXJtZXR0YW50IGRlIG1ldHRyZSDDoCBqb3VyIGxlcyBpbmZvcyBkZSBiYXNlIGR1IHF1ZXN0aW9ubmFpcmUgOlxuICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuUXVlc3Rpb25uYWlyZSwgZm9ybVF1ZXN0aW9ubmFpcmUpO1xuICAgICAgICAgICAgICAgIC8vIENhc2UgZGUgc3VwcHJlc3Npb24gY2FjaMOpZSBwYXIgZMOpZmF1dCwgY2FyIGludXRpbGUgcG91ciBmb3JtdWxhaXJlIGRlIGNyw6lhdGlvblxuICAgICAgICAgICAgICAgIGRlbGV0ZUNoZWNrQm94LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBGb25jdGlvbiB2aWRhbnQgZXQgY2FjaGFudCB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgICAgICAgICAgICAgY29uc3QgaGlkZUFsbEZvcm1zID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHR4dExpbmsuZGVmYXVsdFZhbHVlIT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhbmNob3JcIikudmFsdWU9dHh0TGluay5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgZW1weUFuZEhpZGVGb3JtKGZvcm1RdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFmZmljaGUgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCBsZXMgbGllbnNcbiAgICAgICAgICAgICAgICBjb25zdCBzaG93TGlua0luZm9zID0gKExpbmtzKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZMaW5rcywgXCJoNFwiLCB0eHRMaW5rLmludHJvVGl0bGUpOy8vIHJlbXBsYWNlIGwnZXhpc3RhbnQgZGFucyBkaXZMaW5rc1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdExpbmtzPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBMaW5rcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMaW5rcys9XCI8bGk+PGEgaHJlZj0nXCIrTGlua3NbaV0udXJsK1wiJyB0YXJnZXQ9J19ibGFuayc+XCIrTGlua3NbaV0uYW5jaG9yK1wiPC9hPiB8IDxhIGhyZWY9JyN1cGRhdGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGlkPScjdXBkYXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyA+XCIrdHh0LnVwZGF0ZUJ0blR4dCtcIjwvYT4gfCA8YSBocmVmPScjZGVsZXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyBpZD0nI2RlbGV0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgPlwiK3R4dC5kZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYobGlzdExpbmtzPT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMaW5rcz1cIjxsaT5cIit0eHRMaW5rLmludHJvTm9MaW5rK1wiPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZMaW5rcywgXCJ1bFwiLCBsaXN0TGlua3MsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdLCBcIlwiLCBmYWxzZSk7Ly8gw6AgaW50w6lncmVyIGRhbnMgbGUgRE9NIHBvdXIgcG91dm9pciBham91dGVyIGRlcyBhZGRFdmVudExpc3RlbmVyIGVuc3VpdGVcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIExpbmtzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN1cGRhdGVMaW5rXCIrTGlua3NbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUxpbmtJbmZvcyhMaW5rc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjZGVsZXRlTGlua1wiK0xpbmtzW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1MaW5rSW5mb3MoTGlua3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1MaW5rLmVsZW1lbnRzW1wiZGVsZXRlT2tcIl0udmFsdWU9dHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTGlua0Zvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZy5uYkxpbmtzTWF4ID4gTGlua3MubGVuZ3RoIHx8IGNvbmZpZy5uYkxpbmtzTWF4PT09MClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoTGlua3MubGVuZ3RoIDwgY29uZmlnLm5iTGlua3NNaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZMaW5rcywgXCJhXCIsIHR4dC5hZGRCdG5UeHQsIFwiI25ld0xpbmtcIiwgW1wiZXJyb3JcIl0sIHsgaHJlZjpcIiNuZXdMaW5rXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdMaW5rXCIsIFtcImluZm9ybWF0aW9uXCJdLCB7IGhyZWY6XCIjbmV3TGlua1wiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI25ld0xpbmtcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1MaW5rLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1MaW5rLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLkxpbmssIGZvcm1MaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFmZmljaGUgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCBsZXMgaWxsdXN0cmF0aW9uc1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dJbGx1c3RyYXRpb25JbmZvcyA9IChJbGx1c3RyYXRpb25zKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcImg0XCIsIHR4dElsbHVzdHJhdGlvbi5pbnRyb1RpdGxlKTsvLyByZW1wbGFjZSBsJ2V4aXN0YW50IGRhbnMgZGl2SWxsdXN0cmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdElsbHVzdHJhdGlvbnM9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIElsbHVzdHJhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0SWxsdXN0cmF0aW9ucys9XCI8bGk+PGEgaHJlZj0nXCIrY29uZmlnRnJvbnRFbmQuaWxsdXN0cmF0aW9uRGlyK0lsbHVzdHJhdGlvbnNbaV0udXJsK1wiJyB0YXJnZXQ9J19ibGFuayc+PGltZyBzcmM9J1wiK2NvbmZpZ0Zyb250RW5kLmlsbHVzdHJhdGlvbkRpcitJbGx1c3RyYXRpb25zW2ldLnVybCtcIicgYWx0PSdcIit0eHRJbGx1c3RyYXRpb24uZGVmYXVsdEFsdCtcIicgc3R5bGU9J21heC1oZWlnaHQ6MTUwcHgnPjwvYT4gfCA8YSBocmVmPScjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgaWQ9JyN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyA+XCIrdHh0LnVwZGF0ZUJ0blR4dCtcIjwvYT4gfCA8YSBocmVmPScjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgaWQ9JyNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyA+XCIrdHh0LmRlbGV0ZUJ0blR4dCtcIjwvYT48L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBpZihsaXN0SWxsdXN0cmF0aW9ucz09PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0SWxsdXN0cmF0aW9ucz1cIjxsaT5cIit0eHRJbGx1c3RyYXRpb24uaW50cm9Ob0lsbHVzdHJhdGlvbitcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJ1bFwiLCBsaXN0SWxsdXN0cmF0aW9ucywgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0sIFwiXCIsIGZhbHNlKTsvLyDDoCBpbnTDqWdyZXIgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgZGVzIGFkZEV2ZW50TGlzdGVuZXIgZW5zdWl0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gSWxsdXN0cmF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MoSWxsdXN0cmF0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1JbGx1c3RyYXRpb25JbmZvcyhJbGx1c3RyYXRpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW1wiZGVsZXRlT2tcIl0udmFsdWU9dHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kSWxsdXN0cmF0aW9uRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnLm5iSWxsdXN0cmF0aW9uc01heCA+IElsbHVzdHJhdGlvbnMubGVuZ3RoIHx8IGNvbmZpZy5uYklsbHVzdHJhdGlvbnNNYXg9PT0wKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmKElsbHVzdHJhdGlvbnMubGVuZ3RoIDwgY29uZmlnLm5iSWxsdXN0cmF0aW9uc01pbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdJbGx1c3RyYXRpb25cIiwgW1wiZXJyb3JcIl0sIHsgaHJlZjpcIiNuZXdJbGx1c3RyYXRpb25cIiB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3SWxsdXN0cmF0aW9uXCIsIFtcImluZm9ybWF0aW9uXCJdLCB7IGhyZWY6XCIjbmV3SWxsdXN0cmF0aW9uXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjbmV3SWxsdXN0cmF0aW9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJRdWVzdGlvbm5haXJlSWRcIl0udmFsdWU9Zm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJpZFwiXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5JbGx1c3RyYXRpb24sIGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBxdWVzdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBzaG93UXVlc3Rpb25JbmZvcyA9IChRdWVzdGlvbnMpID0+XG4gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcImg0XCIsIHR4dFF1ZXN0aW9uLmludHJvVGl0bGUpOy8vIHJlbXBsYWNlIGwnZXhpc3RhbnQgZGFucyBkaXZRdWVzdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RRdWVzdGlvbnM9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIFF1ZXN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RRdWVzdGlvbnMrPVwiPGxpPlwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi50ZXh0K1wiIHwgPGEgaHJlZj0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBpZD0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyA+XCIrdHh0LnVwZGF0ZUJ0blR4dCtcIjwvYT4gfCA8YSBocmVmPScjZGVsZXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInIGlkPScjZGVsZXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInID5cIit0eHQuZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxpc3RRdWVzdGlvbnM9PT1cIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFF1ZXN0aW9ucz1cIjxsaT5cIit0eHRRdWVzdGlvbi5pbnRyb05vUXVlc3Rpb24rXCI8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ucywgXCJ1bFwiLCBsaXN0UXVlc3Rpb25zLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSwgXCJcIiwgZmFsc2UpOy8vIMOgIGludMOpZ3JlciBkYW5zIGxlIERPTSBwb3VyIHBvdXZvaXIgYWpvdXRlciBkZXMgYWRkRXZlbnRMaXN0ZW5lciBlbnN1aXRlXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBRdWVzdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjZGVsZXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9uSW5mb3MoUXVlc3Rpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJkZWxldGVPa1wiXS52YWx1ZT10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRRdWVzdGlvbkZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29uZmlnLm5iUXVlc3Rpb25zTWF4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coUXVlc3Rpb25zLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnLm5iUXVlc3Rpb25zTWF4ID4gUXVlc3Rpb25zLmxlbmd0aCB8fCBjb25maWcubmJRdWVzdGlvbnNNYXg9PT0wKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmKFF1ZXN0aW9ucy5sZW5ndGggPCBjb25maWcubmJRdWVzdGlvbnNNaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdRdWVzdGlvblwiLCBbXCJlcnJvclwiXSwgeyBocmVmOlwiI25ld1F1ZXN0aW9uXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3UXVlc3Rpb25cIiwgW1wiaW5mb3JtYXRpb25cIl0sIHsgaHJlZjpcIiNuZXdRdWVzdGlvblwiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI25ld1F1ZXN0aW9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wicmFua1wiXS52YWx1ZT1jb25maWcuUXVlc3Rpb24ucmFuay5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5RdWVzdGlvbiwgZm9ybVF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBkJ3VuIGxpZW4gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0Zvcm1MaW5rSW5mb3MgPSAoTGluaykgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVpcyBvbiBhZmZpY2hlIGNlbHVpIGRvbnQgbCdpZCBlc3QgcGFzc8OpIGF2ZWMgc2VzIGRvbm7DqWVzIGNvbm51ZXNcbiAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZGF0YSBpbiBMaW5rKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtTGluay5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tkYXRhXS52YWx1ZT1MaW5rW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICsgbGVzIGNvbnRyYWludGVzIGRlIGNoYW1wIDpcbiAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5MaW5rLCBmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgZCd1bmUgaWxsdXN0cmF0aW9uIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gY29tbWVuY2UgcGFyIGNhY2hlciBldCB2aWRlciB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwdWlzIG9uIGFmZmljaGUgY2VsdWkgZG9udCBsJ2lkIGVzdCBwYXNzw6kgYXZlYyBzZXMgZG9ubsOpZXMgY29ubnVlc1xuICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gSWxsdXN0cmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9SWxsdXN0cmF0aW9uW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICsgbGVzIGNvbnRyYWludGVzIGRlIGNoYW1wIDpcbiAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5JbGx1c3RyYXRpb24sIGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYXVmIGxlIGNoYW1wIGZpbGUgcXVpIG4nZXN0IHBsdXMgcmVxdWlzIHF1YW5kIHVuIGZpY2hpZXIgZXhpc3RlIGTDqWrDoCAhXG4gICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJpbWFnZVwiXS5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBkJ3VuZSBxdWVzdGlvbiArIHNlcyByw6lwb25zZXMgcG9zc2libGVzIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtUXVlc3Rpb25JbmZvcyA9IChRdWVzdGlvbikgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVpcyBvbiBhZmZpY2hlIGNlbHVpIGRvbnQgbCdpZCBlc3QgcGFzc8OpIGF2ZWMgc2VzIGRvbm7DqWVzIGNvbm51ZXNcbiAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gUXVlc3Rpb24uUXVlc3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9UXVlc3Rpb24uUXVlc3Rpb25bZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIFF1ZXN0aW9uLkNob2ljZXMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImNob2ljZVRleHRcIitkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0udmFsdWU9UXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFF1ZXN0aW9uLkNob2ljZXNbZGF0YV0uaXNDb3JyZWN0PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VJc0NvcnJlY3RcIitkYXRhXS5jaGVja2VkPXRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiaWRDaG9pY2VcIitkYXRhXS52YWx1ZT1RdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyArIGxlcyBjb250cmFpbnRlcyBkZSBjaGFtcCA6XG4gICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuUXVlc3Rpb24sIGZvcm1RdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgdW4gcXVlc3Rpb25uYWlyZSBldCBzZXMgZMOpcGVuZGFuY2VzXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MgPSAoaWQpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJHZXRJbmZvcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcuZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitpZCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5RdWVzdGlvbm5haXJlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLnJlc2V0KCk7Ly8gcG91ciBuZSBwYXMgZ2FyZGVyIGRvbm7DqWVzIGTDqWrDoCBhZmZpY2jDqWVzIHNpIHZpZGUgZGFucyBjZSBxdWkgZXN0IHJldG91cm7DqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gcmVzcG9uc2UuUXVlc3Rpb25uYWlyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YT09PVwicHVibGlzaGluZ0F0XCIgJiYgcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSE9PW51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW2RhdGFdLnZhbHVlPWRhdGVGb3JtYXQocmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSwgXCJmb3JtXCIpOy8vICEhIHJldm9pciBjYXIgZm9ybWF0IHBvdXZhbnQgcG9zZXIgc291Y2lzIHNpIG5hdmlnYXRldXIgbmUgZ8OocmUgcGFzIGxlcyBjaGFtcHMgZGUgdHlwZSBcImRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1yZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlRhZ3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzaWZpY2F0aW9uPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5UYWdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpPT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uKz1yZXNwb25zZS5UYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24rPVwiLFwiK3Jlc3BvbnNlLlRhZ3NbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImNsYXNzaWZpY2F0aW9uXCJdLnZhbHVlPWNsYXNzaWZpY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZMaW5rcy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZRdWVzdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2SWxsdXN0cmF0aW9ucy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5MaW5rcyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMaW5rSW5mb3MocmVzcG9uc2UuTGlua3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlF1ZXN0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dRdWVzdGlvbkluZm9zKHJlc3BvbnNlLlF1ZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuSWxsdXN0cmF0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbGx1c3RyYXRpb25JbmZvcyhyZXNwb25zZS5JbGx1c3RyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwUHVibGlzaGluZ0F0LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7Ly8gaW5mbyB1dGlsZSBwb3VyIFwicGxhY2VyXCIgdW4gbm91dmVhdSBxdWl6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6AgcmV2b2lyIDogcmVtcGxhY2VyIGxpZW4gcG91ciB1biBib3V0b24gKyByZXNldCBjb21wbGV0IGR1IGZvcm11bGFpcmUsIHkgY29tcHJpcyBjaGFtcHMgaGlkZGVuIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5OZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bk5ld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWdGcm9udEVuZC5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wiaXNQdWJsaXNoZWRcIl09PT1mYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2lkK1wiL1wiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWcuc2l0ZVVybCtjb25maWcucHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcytyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wic2x1Z1wiXStcIi5odG1sXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaSB1biBpZCBlc3QgcGFzc8OpIHBhciBsJ3VybCwgb24gZXNzYXllIGQnYWZmaWNoZXIgbGUgcXVlc3Rpb25uYWlyZSA6XG4gICAgICAgICAgICAgICAgbGV0IHVybERhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKHVybERhdGFzICYmIHVybERhdGFzLmlkIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyh1cmxEYXRhcy5pZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFpdGVtZW50IGR1IGxhbmNlbWVudCBkJ3VuZSByZWNoZXJjaGVcbiAgICAgICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5sZW5ndGg9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLm5vdEZvdW5kLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdEhUTUw9XCI8b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhUTUwrPVwiPG9wdGlvbiB2YWx1ZT0nXCIrcmVzcG9uc2VbaV0uaWQrXCInPlwiK3Jlc3BvbnNlW2ldLnRpdGxlK1wiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlNlYXJjaFJlc3VsdCwgXCJzZWxlY3RcIiwgc2VsZWN0SFRNTCwgXCJzZWxlY3RTZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTZWxlY3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWxlY3RTZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoU2VsZWN0LnZhbHVlIT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3Moc2VhcmNoU2VsZWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIExlcyBxdWVzdGlvbm5haXJlcyBiaWVudMO0dCBwdWJsacOpcy4gRGFucyB1bmUgZm9uY3Rpb24gY2FyIGRldmFudCDDqnRyZSByZWNoYXJnw6kuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd05leHRRdWVzdGlvbm5haXJlcyA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5nZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0SFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjxsaT5cIitkYXRlRm9ybWF0KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmRhdGVQdWJsaXNoaW5nLCBcImZyXCIpK1wiOiA8YSBocmVmPSdcIitjb25maWdGcm9udEVuZC5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJyBpZD0ncXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIic+XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0udGl0bGUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pc1B1Ymxpc2hhYmxlPT09ZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiIDxzcGFuIGNsYXNzPSdlcnJvcic+KFwiK3R4dFF1ZXN0aW9ubmFpcmUubmVlZEJlQ29tcGxldGVkK1wiKTwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCI8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcImgzXCIsIHR4dFF1ZXN0aW9ubmFpcmUubmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGhlbHBQdWJsaXNoaW5nQXQsIFwiZW1cIiwgdHh0UXVlc3Rpb25uYWlyZS5uZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQobmV3IERhdGUocmVzcG9uc2UuZGF0ZU5lZWRlZCksIFwiZnJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcInVsXCIsIGxpc3RIVE1MLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlX1wiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MoZS50YXJnZXQuaWQuc3BsaXQoXCJfXCIpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9ubmFpcmVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpO1xuIFxuICAgICAgICAgICAgICAgIC8vIEFpZGUgc2Fpc2llIGNsYXNzZW1lbnQgZHUgcXVpelxuICAgICAgICAgICAgICAgIGlucHV0Q2xhc3NpZmljYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncz1pbnB1dENsYXNzaWZpY2F0aW9uLnZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGFncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RUYWc9dGFnc1swXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxhc3RUYWcubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIMOgIHJldm9pciA6IGltcG9ydGVyIGxhIGxpc3RlIGRlcyB0YWdzIGxvcnMgZGUgbCdpbml0aWFsaXNhdGlvbiBwb3VyIMOpdml0ZXIgbGVzIGFwcGVscyBtdWx0aXBsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1haXMgZGFucyBjZSBjYXMgYWN0dWFsaXNlciBjZXR0ZSBsaXN0ZSBhcHLDqHMgY2hhcXVlIG1pc2Ugw6Agam91ci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaFRhZ3MgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy50YWdzU2VhcmNoUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscENsYXNzaWZpY2F0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscENsYXNzaWZpY2F0aW9uLCBcImFcIiwgcmVzcG9uc2VbaV0ubmFtZSwgXCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQsIFtcImluZm9ybWF0aW9uXCJdLCB7IGhyZWY6XCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnc1swXT1lLnRhcmdldC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENsYXNzaWZpY2F0aW9uLnZhbHVlPXRhZ3Muam9pbihcIixcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2VuZChKU09OLnN0cmluZ2lmeSh7c2VhcmNoOiBsYXN0VGFnfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZHUgZm9ybXVsYWlyZSBkZXMgaW5mb3MgZGUgYmFzZSBkdSBxdWl6XG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb25uYWlyZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclF1ZXN0aW9ubmFpcmVEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgcmVzcG9uc2UuaWQhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuYWRkT2tNZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMuaWQ9cmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLmRlbGV0ZU9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBMJ2Vudm9pIGRlcyBkb25uw6llcyBkJ3VuIGxpZW4gcGV1dCDDqnRyZSBnw6luw6lyw6kgcGFyIGxlIGJvdXRvbiBmb3JtdWxhaXJlIG91IHBhciBsZSBsaWVuIHN1cHByaW1lclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRMaW5rRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZUxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZUxpbmtcIik7XG4gICAgICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlTGluay5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockxpbmtEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLmxpbmtzUm91dGUrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcubGlua3NSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLmxpbmtzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xpbmtJbmZvcyhyZXNwb25zZS5xdWVzdGlvbm5haXJlLkxpbmtzKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc0xpc3RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUxpbmssIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlTGluaywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTGlua0RhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtTGluay5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRMaW5rRm9ybSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gTCdlbnZvaSBkZXMgZG9ubsOpZXMgZCd1biBsaWVuIHBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gZm9ybXVsYWlyZSBvdSBwYXIgbGUgbGllbiBzdXBwcmltZXJcbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kSWxsdXN0cmF0aW9uRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlSWxsdXN0cmF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzV2l0aEZpbGVzPW5ldyBGb3JtRGF0YShmb3JtSWxsdXN0cmF0aW9uKTsgLy8gaWwgbWUgbWFucXVlIGxlcyBpbmZvcm1hdGlvbnMgZHUgZmljaGllciBhdmVjIG1hIGZvbmN0aW9uIGdldERhdGFzRnJvbUlucHV0c1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJJbGx1c3RyYXRpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcuaWxsdXN0cmF0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcuaWxsdXN0cmF0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5pbGx1c3RyYXRpb25zUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAyMDEpICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZCAmJiByZXNwb25zZS5xdWVzdGlvbm5haXJlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5JbGx1c3RyYXRpb25zKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNMaXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKCk7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24sIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNlbmQoZGF0YXNXaXRoRmlsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZElsbHVzdHJhdGlvbkZvcm0oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgIC8vIEwnZW52b2kgZGVzIGRvbm7DqWVzIGQndW5lIHF1ZXN0aW9uIGV0IGRlIHNlcyByw6lwb25zZSBxdWkgcGV1dCDDqnRyZSBnw6luw6lyw6kgcGFyIGxlIGJvdXRvbiBzdWJtaXQgb3UgcGFyIGxlIGxpZW4gc3VwcHJpbWVyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZFF1ZXN0aW9uRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZVF1ZXN0aW9uPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VRdWVzdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2VRdWVzdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJRdWVzdGlvbkRhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbnNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1F1ZXN0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5RdWVzdGlvbnMpOy8vIGxlIHNlcnZldXIgbWUgcmV0b3VybmUgdW5lIHZlcnNpb24gYWN0dWFsaXPDqWUgZGUgbGEgbGlzdGUgZGVzIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ucywgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zTGlzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFF1ZXN0aW9uRm9ybSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG5cXG5MZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgdm91cyBwb3V2ZXogbGUgdHJvdXZlciBzaSBHaXRsYWIgOlxcbmh0dHBzOi8vZ2l0bGFiLmNvbS9sZWZhYmxhYi93aWtpbGVybmlcXG5cXG5Qb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICAvLyBtdWx0aXBsaWVyIHBhciAtMSwgY2FyIGMnZXN0IGNlIHF1J2lsIGZhdXQgXCJham91dGVyXCIgw6AgbCdoZXVyZSBVVEMgcG91ciByZXZlbmlyIGVuIGhldXJlIGxvY2FsZSBxdWkgbSdpbnTDqXJlc3NlIGV0IG5vbiBsJ2ludmVyc2VcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpKi0xO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gYydlc3QgbGUgdG9rZW4gcXVpIHNlcnQgw6AgdsOpcmlmaWVyIGxlIHN0YXR1dCDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlLmFjY291bnRQYWdlK1wiI3N1YnNjcmliZVwiKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=