1564 lines
201 KiB
JavaScript
1564 lines
201 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/questionnaire.js");
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ({
|
||
|
||
/***/ "../config/instance.js":
|
||
/*!*****************************!*\
|
||
!*** ../config/instance.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
const users = __webpack_require__(/*! ./users */ "../config/users.js");
|
||
|
||
const questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
|
||
|
||
module.exports = {
|
||
apiUrl: "http://localhost:3000/api",
|
||
siteUrl: "http://localhost:8080",
|
||
adminName: "Fabrice",
|
||
adminEmail: "dev@wikilerni.com",
|
||
senderName: "WikiLerni (local)",
|
||
senderEmail: "bonjour@wikilerni.com",
|
||
adminLang: "fr",
|
||
theme: "wikilerni",
|
||
// le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.
|
||
availableLangs: ["fr"],
|
||
// Languages in which the site is available. The first one is the default one.
|
||
siteName: "WikiLerni (local)",
|
||
beginCodeGodfather: "WL",
|
||
// case-sensitive and can't contain "@" !
|
||
defaultReceiptDays: "147",
|
||
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
|
||
cronTimingAlertInSeconde: 120,
|
||
// for logs
|
||
responseTimingAlertInSeconde: 3,
|
||
// idem
|
||
tokenSignupValidationTimeInHours: "48h",
|
||
// https://github.com/zeit/ms
|
||
tokenLoginLinkTimeInHours: "1h",
|
||
tokenConnexionMinTimeInHours: "24h",
|
||
tokenConnexionMaxTimeInDays: "180 days",
|
||
tokenLoginChangingTimeInHours: "1h",
|
||
// for email & password changing
|
||
tokenDeleteUserTimeInHours: "1h",
|
||
tokenUnsubscribeLinkTimeInDays: "7 days",
|
||
// token send with subscription's emails
|
||
freeAccountTimingInDays: 0,
|
||
// if 0 = unlimited
|
||
freeAccountExpirationNotificationInDays: 3,
|
||
accountExpirationFirstNotificationInDays: 10,
|
||
accountExpirationSecondNotificationInDays: 3,
|
||
inactiveAccountTimeToDeleteInDays: 180,
|
||
// Questionnaires:
|
||
nbQuestionsMin: 1,
|
||
// minimum number of questions for the questionnaire to be publishable
|
||
nbQuestionsMax: 2,
|
||
// if 0 = not maximum
|
||
nbChoicesMax: 10,
|
||
nbNewQuestionnaires: 12,
|
||
// for RSS, etc.
|
||
hourGiveNewQuestionnaireBegin: 7,
|
||
// in user local time
|
||
hourGiveNewQuestionnaireEnd: 21,
|
||
// idem
|
||
maxQuestionnaireSendedAtSameTime: 50,
|
||
// for subscription's e-mailing
|
||
minSearchQuestionnaires: 3,
|
||
fieldNewQuestionnaires: "publishingAt",
|
||
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
|
||
// Groups :
|
||
nbQuestionnairesByGroupMin: 1,
|
||
nbQuestionnairesByGroupMax: 0,
|
||
// Illustrations:
|
||
nbIllustrationsMin: 1,
|
||
nbIllustrationsMax: 1,
|
||
maxIllustrationSizeinOctet: 1000000,
|
||
// pas contrôlé pour l'instant. À revoir.
|
||
mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"],
|
||
// -- Upload and resize:
|
||
illustrationsWidthMaxInPx: 500,
|
||
illustrationsMiniaturesWidthMaxInPx: 200,
|
||
// Links:
|
||
nbLinksMin: 1,
|
||
nbLinksMax: 0,
|
||
// Questions & responses:
|
||
nbQuestionsMin: 1,
|
||
nbQuestionsMax: 0,
|
||
nbChoicesMax: 10,
|
||
// à supprimer quand tous les "require" à jour:
|
||
passwordMinLength: users.password.minlength,
|
||
dirCacheUsers: users.dirCacheUsers,
|
||
dirCacheUsersAnswers: users.dirCacheUsersAnswers,
|
||
dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,
|
||
dirCacheQuestions: questionnaires.dirCacheQuestions,
|
||
dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,
|
||
dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,
|
||
dirWebQuestionnaires: questionnaires.dirWebQuestionnaires
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/matomo.js":
|
||
/*!***************************!*\
|
||
!*** ../config/matomo.js ***!
|
||
\***************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.
|
||
// Revoir comment réorganiser cela sous-forme de module indépendant.
|
||
module.exports = {
|
||
// Stats Matomo :
|
||
matomo: {
|
||
url: "https://stats.le-fab-lab.com/",
|
||
siteId: "5"
|
||
}
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/questionnaires.js":
|
||
/*!***********************************!*\
|
||
!*** ../config/questionnaires.js ***!
|
||
\***********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
// API'routes (after "apiUrl" defined in instance.js)
|
||
questionnaireRoutes: "/questionnaire",
|
||
// la base à laquelle s'ajoute les routes suivantes
|
||
getListNextQuestionnaires: "/getlistnextquestionnaires/",
|
||
getQuestionnaireRoutes: "/get",
|
||
getRandomQuestionnairesRoute: "/getrandom",
|
||
getStatsQuestionnaires: "/stats/",
|
||
previewQuestionnaireRoutes: "/preview",
|
||
publishedQuestionnaireRoutes: "/quiz/",
|
||
regenerateHTML: "/htmlregenerated",
|
||
searchAdminQuestionnairesRoute: "/searchadmin",
|
||
searchQuestionnairesRoute: "/search",
|
||
// -- groupes :
|
||
groupRoutes: "/group",
|
||
getGroupRoute: "/get/",
|
||
previewGroupRoutes: "/preview",
|
||
searchGroupsRoute: "/search",
|
||
// -- questions & choices :
|
||
questionsRoute: "/question/",
|
||
// -- tags :
|
||
tagsSearchRoute: "/tags/search/",
|
||
// -- answers :
|
||
getAdminStats: "/getadminstats/",
|
||
getPreviousAnswers: "/user/answers/",
|
||
getStatsAnswers: "/user/anwswers/stats/",
|
||
// fonctionne aussi pour les groupes
|
||
saveAnswersRoute: "/answer/",
|
||
// idem
|
||
// forms : à compléter avec valeurs par défaut, etc. cf modèle
|
||
Questionnaire: {
|
||
title: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
slug: {
|
||
maxlength: 150
|
||
},
|
||
// champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
|
||
introduction: {
|
||
required: true
|
||
}
|
||
},
|
||
searchQuestionnaires: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
Group: {
|
||
title: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
slug: {
|
||
maxlength: 150
|
||
} // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
|
||
|
||
},
|
||
Question: {
|
||
text: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
rank: {
|
||
required: true,
|
||
min: 1,
|
||
defaultValue: 1
|
||
}
|
||
},
|
||
Choice: {
|
||
text: {
|
||
maxlength: 255,
|
||
required: true
|
||
}
|
||
},
|
||
search: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
searchGroups: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
// Emplacement des fichiers JSON générés :
|
||
dirCacheGroups: "datas/questionnaires/groups",
|
||
dirCacheQuestionnaires: "datas/questionnaires",
|
||
dirCacheQuestions: "datas/questionnaires/questions",
|
||
dirCacheTags: "datas/questionnaires/tags",
|
||
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
|
||
// Emplacement des fichiers HTML générés :
|
||
dirHTMLGroups: "front/public/quiz/gp",
|
||
dirHTMLQuestionnaires: "front/public/quiz",
|
||
dirHTMLNews: "front/public/quizs",
|
||
dirHTMLTags: "front/public/quizs",
|
||
// Idem mais pour urls :
|
||
dirWebGroups: "quiz/gp",
|
||
dirWebQuestionnaires: "quiz",
|
||
dirWebNews: "quizs/",
|
||
dirWebTags: "quizs/",
|
||
// limite des résultat du moteur de recherche, quand demande de résultats au hasard :
|
||
nbRandomResults: 3,
|
||
|
||
/* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */
|
||
nbQuestionsMin: 1,
|
||
nbQuestionsMax: 0,
|
||
nbChoicesMax: 10,
|
||
nbTagsMin: 0,
|
||
nbTagsMax: 0 // 0 = not max
|
||
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/users.js":
|
||
/*!**************************!*\
|
||
!*** ../config/users.js ***!
|
||
\**************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
// API'routes (after "apiUrl" defined in instance.js)
|
||
userRoutes: "/user",
|
||
checkDeleteLinkRoute: "/confirmdelete/",
|
||
checkIfIsEmailfreeRoute: "/isemailfree",
|
||
checkLoginRoute: "/checklogin/",
|
||
checkNewLoginLinkRoute: "/confirmnewlogin/",
|
||
checkSubscribeTokenRoute: "/validation/",
|
||
connectionRoute: "/login",
|
||
connectionWithLinkRoute: "/checkloginlink",
|
||
createUserRoute: "/create",
|
||
getAdminStats: "/getadminstats/",
|
||
getGodChilds: "/getgodchilds/",
|
||
getGodfatherRoute: "/getgodfatherid",
|
||
getLoginLinkRoute: "/getloginlink",
|
||
getPayments: "/payment/getforoneuser/",
|
||
getUserInfos: "/get/",
|
||
getUsersQuestionnairesRoute: "/getusersquestionnaires/",
|
||
// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
|
||
searchUserRoute: "/search/",
|
||
signupCompletionRoute: "/signupcompletion/",
|
||
subscribeRoute: "/signup",
|
||
unsubscribeRoute: "/subscription/stop/",
|
||
updateUserInfos: "/modify/",
|
||
validateUserRoute: "/validate/",
|
||
// forms : à compléter avec valeurs par défaut, etc. cf modèle
|
||
name: {
|
||
maxlength: 70,
|
||
required: true
|
||
},
|
||
email: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
password: {
|
||
minlength: 8,
|
||
maxlength: 72,
|
||
required: true
|
||
},
|
||
// https://www.npmjs.com/package/bcrypt#security-issues-and-concerns
|
||
newPassword: {
|
||
minlength: 8,
|
||
maxlength: 72
|
||
},
|
||
codeGodfather: {
|
||
maxlength: 255
|
||
},
|
||
cguOk: {
|
||
value: "true",
|
||
required: true
|
||
},
|
||
search: {
|
||
minlength: 1,
|
||
required: true
|
||
},
|
||
timeDifferenceMin: -720,
|
||
timeDifferenceMax: 840,
|
||
// JSON dir
|
||
dirCacheUsers: "datas/users",
|
||
dirCacheUsersAnswers: "datas/users/questionnaires/answers",
|
||
dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/answer$":
|
||
/*!*************************************!*\
|
||
!*** ../lang sync ^\.\/.*\/answer$ ***!
|
||
\*************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/answer": "../lang/fr/answer.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 ^\\.\\/.*\\/answer$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../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/fr/answer.js":
|
||
/*!****************************!*\
|
||
!*** ../lang/fr/answer.js ***!
|
||
\****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
checkResponsesOuputFail: "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est certain, vous ferez mieux la prochaine fois !",
|
||
checkResponsesOuputMedium: "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est pas mal du tout !",
|
||
checkResponsesOuputSuccess: "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. Bravo ! Rien ne vous échappe !",
|
||
needIntegerNumberCorrectResponses: "Le nombre de réponses correctes doit être un nombre entier.",
|
||
needIntegerNumberSecondesResponse: "La durée de la réponse doit être un nombre entier de secondes.",
|
||
needIntegerNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.",
|
||
needMaxNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.",
|
||
needMinNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.",
|
||
needNumberCorrectResponses: "Le nombre de réponses correctes doit être fourni.",
|
||
needNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.",
|
||
needMaxNumberCorrectResponses: "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.",
|
||
needMinNumberCorrectResponses: "Le nombre de réponses correctes ne peut être négatif.",
|
||
needMinNumberSecondesResponse: "La durée de la réponse ne peut être négative.",
|
||
noPreviousAnswer: "On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !",
|
||
previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.",
|
||
previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant <b>AVGCORRECTANSWERS % de bonnes réponses</b>.",
|
||
previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz",
|
||
responseSavedError: "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. <a href='/#URL'>Accèder à tous vos quizs</a>.",
|
||
responseSavedMessage: "Votre résultat a été enregistré. <a href='/#URL'>Accèder à tous vos quizs</a>.",
|
||
statsUser: "Vous avez enregistré <b>NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3</b> sur les NBTOTQUESTIONNAIRES proposéS4 par le site.<br>En moyenne, vous avez mis AVGDURATION secondes à répondre et avez <b>correctement répondu à AVGCORRECTANSWERS % des questions</b>.",
|
||
wantToSaveResponses: "Si vous le souhaitez, vous pouvez <u><b>sauvegarder votre résultat</b></u> en créant votre compte ci-dessous. Cela vous permettra aussi de <u><b>recevoir régulièrement de nouvelles \"graines de culture\"</b></u> directement sur votre e-mail."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/general.js":
|
||
/*!*****************************!*\
|
||
!*** ../lang/fr/general.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
addBtnTxt: "Ajouter",
|
||
addOkMessage: "Les données ont bien été enregistrées.",
|
||
alertNewWindow: "nouvelle fenêtre",
|
||
badUrl: "Tentative d'accès à une page n'existant pas :",
|
||
btnLinkToQuestionnaire: "Afficher !",
|
||
btnProposeConnection: "Je me connecte.",
|
||
btnProposeSubscribe: "Je crée mon compte.",
|
||
btnShowOnWebSite: "Lire la suite sur #SITE_NAME",
|
||
deleteBtnTxt: "Supprimer",
|
||
deleteFailMessage: "La suppression de l'enregistrement #ID a échoué.",
|
||
deleteOkMessage: "La suppression a bien été enregistrée.",
|
||
failAuth: "Erreur d'authentification.",
|
||
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
|
||
failAuthHeader: "Absence de header Authorization.",
|
||
failAuthId: "Identifiant non valide : ",
|
||
failAuthToken: "Token invalide ou utilisateur non trouvé.",
|
||
neededParams: "Des paramètres nécessaires manquants sont manquants.",
|
||
nextPage: "Page suivante",
|
||
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
|
||
notRequired: "Facultatif.",
|
||
notValidFormat: "Format non valide.",
|
||
previousPage: "Page précédente",
|
||
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 :",
|
||
siteHTMLTitle: "WikiLerni : la culture générale en liberté",
|
||
siteMetaDescription: "Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",
|
||
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
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.",
|
||
subscriptionCall: "Inscrivez-vous !",
|
||
updateBtnTxt: "Modifier",
|
||
updateOkMessage: "La mise à jour à jour a bien été enregistrée."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../tools/main.js":
|
||
/*!************************!*\
|
||
!*** ../tools/main.js ***!
|
||
\************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
// Quelques fonctions utiles pour les chaînes
|
||
class Tool {
|
||
static isEmpty(myVar) {
|
||
if (myVar === undefined || myVar === null) return true;else {
|
||
myVar += ""; // si autre chose qu'une chaîne envoyé...
|
||
|
||
myVar = myVar.trim();
|
||
if (myVar === "") return true;else return false;
|
||
}
|
||
}
|
||
|
||
static trimIfNotNull(myString) {
|
||
if (Tool.isEmpty(myString)) myString = null;else {
|
||
myString += ""; // si autre chose qu'une chaîne envoyé...
|
||
|
||
myString = myString.trim();
|
||
}
|
||
return myString;
|
||
}
|
||
|
||
static shortenIfLongerThan(myString, max) {
|
||
myString += ""; // au cas où cela ne serait pas une chaîne...
|
||
|
||
if (myString.length > max) myString = myString.substring(0, max - 3) + "…";
|
||
return myString;
|
||
} // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
|
||
|
||
|
||
static replaceAll(myString, mapObj) {
|
||
const replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
|
||
return myString.replace(replaceElts, matched => {
|
||
return mapObj[matched];
|
||
});
|
||
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
|
||
|
||
|
||
static getRandomInt(min, max) {
|
||
min = Math.ceil(min);
|
||
max = Math.floor(max);
|
||
return Math.floor(Math.random() * (max - min)) + min;
|
||
} // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country
|
||
|
||
|
||
static dateFormat(dateString, lang = "fr") {
|
||
if (Tool.isEmpty(dateString)) return "";
|
||
let myDate = new Date(dateString);
|
||
let myDay = myDate.getDate() + "";
|
||
if (myDay.length === 1) myDay = "0" + myDay;
|
||
let myMounth = myDate.getMonth() + 1 + "";
|
||
if (myMounth.length === 1) myMounth = "0" + myMounth;
|
||
let myYear = myDate.getFullYear();
|
||
if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09
|
||
return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear;
|
||
} // On enlève volontairement les 0/O pour éviter les confusions !
|
||
// Et mieux vaut aussi débuter et finir par une lettre simple.
|
||
|
||
|
||
static getPassword(nbCarMin, nbCarMax) {
|
||
const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
|
||
const letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
|
||
const others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
|
||
let password = letters[Math.floor(Math.random() * letters.length)];
|
||
|
||
for (let i = 1; i < nbCar - 1; i++) {
|
||
if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];
|
||
}
|
||
|
||
password += letters[Math.floor(Math.random() * letters.length)];
|
||
return password;
|
||
}
|
||
|
||
}
|
||
|
||
module.exports = Tool;
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views 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 = {
|
||
// liens de l'interface
|
||
headLinks: [{
|
||
anchor: "Contact",
|
||
attributes: {
|
||
href: "/contact.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Parcourir",
|
||
attributes: {
|
||
href: "/quizs/",
|
||
id: "indexHeadLink",
|
||
title: "Les dernières publications"
|
||
}
|
||
}, {
|
||
anchor: "Mon compte",
|
||
attributes: {
|
||
href: "/connexion.html",
|
||
id: "accountHeadLink",
|
||
title: "Accéder ou créez votre compte WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "À propos",
|
||
attributes: {
|
||
href: "/a-propos.html",
|
||
title: "En savoir + sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "Accueil",
|
||
attributes: {
|
||
href: "/",
|
||
title: "Page d'accueil"
|
||
}
|
||
}],
|
||
footLinks: [{
|
||
anchor: "Blog",
|
||
attributes: {
|
||
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
|
||
title: "Le blog WikiLerni sur diaspora*"
|
||
}
|
||
}, {
|
||
anchor: "Crédits",
|
||
attributes: {
|
||
href: "/credits.html",
|
||
title: "Qui a créé WikiLerni ? Quels sont vos droits ?"
|
||
}
|
||
}, {
|
||
anchor: "Mentions légales",
|
||
attributes: {
|
||
href: "/mentions-legales.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Données personnelles",
|
||
attributes: {
|
||
href: "/donnees.html",
|
||
title: "Vos données personnelles sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "CGV & CGU",
|
||
attributes: {
|
||
href: "/CGV-CGU.html",
|
||
rel: "nofollow"
|
||
}
|
||
}],
|
||
accountPage: "compte.html",
|
||
aboutPage: "a-propos.html",
|
||
adminHomePage: "admin.html",
|
||
cguPage: "CGV-CGU.html",
|
||
connectionPage: "connexion.html",
|
||
deleteLinkPage: "aurevoir.html?t=",
|
||
loginLinkPage: "login.html?t=",
|
||
managerHomePage: "gestion.html",
|
||
newLoginLinkPage: "newlogin.html?t=",
|
||
questionnairesManagementPage: "gestion-quizs.html",
|
||
stopMailPage: "stop-mail.html?t=",
|
||
subscribePage: "inscription.html",
|
||
updateAccountPage: "compte.html",
|
||
userHomePage: "accueil.html",
|
||
userHomePageTxt: "Ma page d'accueil.",
|
||
usersManagementPage: "gestion-utilisateurs.html",
|
||
validationLinkPage: "validation.html?t=",
|
||
|
||
/* Textes (général) */
|
||
siteSlogan: "Cultivons notre jardin !",
|
||
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
|
||
mailRecipientTxt: "Message envoyé à :",
|
||
licenceTxt: "@copyleft Le contenu de WikiLerni <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous est offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif avec contre-parties\">participer à son financement en cliquant ici</a>.",
|
||
|
||
/* Page d'accueil */
|
||
homePageTxt: "Page d'accueil",
|
||
homeTitle1: "De nature curieuse ?",
|
||
homeP1: "<b>Avec WikiLerni, vous apprenez régulièrement de nouvelles choses</b>.<br>Vous recevez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettent ensuite de tester ce que vous avez retenu.<br>De jour en jour <b>de nouvelles graines de culture sont ainsi semées dans votre jardin</b>.",
|
||
homeTitle2: "La culture générale en liberté",
|
||
homeP2: "<b>Pas de faits alternatifs</b>, tous les contenus sont <b>sourcés par des articles Wikipédia</b>.<br>Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus sur ce sujet\">sont partagés sous licences libres</a>.<br>Le tout sans publicité, ni commercialisation de vos données.<br><b>Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.</b>",
|
||
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
|
||
homeBtnSubscribeTxt: "Testez WikiLerni",
|
||
homeSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
|
||
|
||
/* Page dernières publications... */
|
||
newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni",
|
||
newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
|
||
newsListTitle: "<p><b>Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau</b><br>Si dessous les dernières publications. Vous pouvez aussi <a href='/quizs/themes.html'>parcourir le site par thèmes ou mots-clés</a>.</p>",
|
||
|
||
/* Plan du site, liste des tags */
|
||
tagListTitle: "Culture générale - des articles et quizs sur de nombreux thèmes !",
|
||
tagListMetaDesc: "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site.",
|
||
tagListIntro: "<h3>Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)</h3><blockquote>Aristote : « L’homme a naturellement la passion de connaître… »</blockquote>",
|
||
|
||
/* Page quizs */
|
||
answersExplanationsLinkText: "Relire",
|
||
quizElementLinksIntro: "En savoir plus",
|
||
quizElementSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
|
||
explanationTitle: "Vous découvrez WikiLerni ?",
|
||
explanationTxt: "<p>Le principe est simple : <b>vous commencez par lire l’article Wikipédia dont le lien vous est proposé</b>. Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>. Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées. C’est toujours <b>le contenu de l’article Wikipédia qui fait foi</b> concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose d’autres solutions pour améliorer votre culture générale</b>. Pour en savoir plus, cliquez sur le bouton ci-dessous.</p>",
|
||
explanationElementTxt: "<p>WikiLerni vous propose de <b>recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes</b> et portant sur des sujets très variés de <b>culture générale</b> (arts, histoire, littérature, sciences, etc.).</p><p>Ces articles sont basés sur <b>une ou plusieurs pages de Wikipédia</b> (fournies en lien), dont <b>ils extraient certaines informations</b>.</p><p>Chaque série d’articles est <b>suivie d’un quiz</b> permettant de tester ce que vous en avez retenu.</p><p><b>Vous apprenez ainsi régulièrement de nouvelles choses</b> très simplement.</p>",
|
||
|
||
/* Autres */
|
||
illustrationDir: "/img/quizs/",
|
||
twitterAccount: "WikiLerni",
|
||
maxQuestionnairesByPage: 12,
|
||
maxQuestionnairesSiteHomePage: 3,
|
||
nbQuestionnairesUserHomePage: 3
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/config/general.js":
|
||
/*!*******************************!*\
|
||
!*** ./src/config/general.js ***!
|
||
\*******************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
// à supprimer une fois que tout récupérer du backend :
|
||
module.exports = {
|
||
apiUrl: "http://localhost:3000/api",
|
||
usersGetConfigUrl: "/user/getconfig",
|
||
lang: "fr",
|
||
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/"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/questionnaire.js":
|
||
/*!******************************!*\
|
||
!*** ./src/questionnaire.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 _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
|
||
/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _tools_answers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/answers.js */ "./src/tools/answers.js");
|
||
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
|
||
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_7__);
|
||
/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/matomo.js */ "./src/tools/matomo.js");
|
||
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
|
||
// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ
|
||
/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat.
|
||
/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat.
|
||
/// Dans ce but son résultat est stocké dans son navigateur.
|
||
/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés.
|
||
// Fichier de configuration tirés du backend :
|
||
|
||
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
|
||
|
||
|
||
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Dictionnaires :
|
||
|
||
const {
|
||
noPreviousAnswer,
|
||
previousAnswersLine,
|
||
previousAnswersStats,
|
||
previousAnswersTitle,
|
||
responseSavedError,
|
||
wantToSaveResponses
|
||
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer");
|
||
|
||
const {
|
||
serverError
|
||
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); // Principaux éléments du DOM manipulés :
|
||
|
||
|
||
const myForm = document.getElementById("questionnaire");
|
||
const divResponse = document.getElementById("response");
|
||
const btnShow = document.getElementById("showQuestionnaire");
|
||
const btnSubmit = document.getElementById("checkResponses");
|
||
const explanationsTitle = document.getElementById("explanationsTitle");
|
||
const explanationsContent = document.getElementById("explanationsContent");
|
||
let isConnected, user;
|
||
|
||
const initialise = async () => {
|
||
try {
|
||
btnShow.style.display = "inline"; // bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses
|
||
|
||
isConnected = await Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_9__["checkSession"])(["user"]); // "user" car seuls les utilisateurs de base peuvent enregistrer leurs réponses aux quizs
|
||
// Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux
|
||
|
||
if (isConnected) {
|
||
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__["getLocaly"])("user", true);
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["updateAccountLink"])(user.status, configTemplate); // lien vers le compte adapté pour les utilisateurs connectés
|
||
|
||
checkPreviousResponses(user);
|
||
} else Object(_tools_matomo_js__WEBPACK_IMPORTED_MODULE_8__["loadMatomo"])();
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
};
|
||
|
||
initialise();
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); // Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url.
|
||
// Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions.
|
||
|
||
const showQuestionnaire = () => {
|
||
chronoBegin = Date.now();
|
||
myForm.style.display = "block";
|
||
btnShow.style.display = "none";
|
||
const here = window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview".
|
||
|
||
if (window.location.hash !== "") {
|
||
window.location.hash = ""; // ! le "#" reste
|
||
|
||
window.location.assign(here + "questionnaire");
|
||
} else window.location.assign(here + "#questionnaire");
|
||
};
|
||
|
||
let chronoBegin = 0;
|
||
btnShow.addEventListener("click", function (e) {
|
||
try {
|
||
e.preventDefault();
|
||
showQuestionnaire();
|
||
} catch (e) {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", serverError, "", ["error"]);
|
||
console.error(e);
|
||
}
|
||
}); // Lien passé par mail pour voir directement le quiz
|
||
|
||
if (location.hash != "" && location.hash === "#questionnaire") showQuestionnaire(); // Traitement de l'envoi de la réponse de l'utilisateur :
|
||
|
||
let answer = {};
|
||
myForm.addEventListener("submit", function (e) {
|
||
try {
|
||
e.preventDefault();
|
||
btnSubmit.style.display = "none"; // seulement un envoi à la fois, SVP :)
|
||
|
||
divResponse.innerHTML = ""; // supprime les éventuels messages déjà affichés
|
||
|
||
const userResponses = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_6__["getDatasFromInputs"])(myForm);
|
||
answer.duration = Math.round((Date.now() - chronoBegin) / 1000);
|
||
answer.nbQuestions = 0;
|
||
answer.nbCorrectAnswers = 0;
|
||
answer.QuestionnaireId = document.getElementById("questionnaireId").value; // Les réponses sont regroupées par question, donc quand idQuestion change, on connaît le résultat pour la question précédente.
|
||
// Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à la question ET cocher aucune des mauvaises.
|
||
|
||
let idChoice,
|
||
idQuestion = "",
|
||
goodResponse = false;
|
||
|
||
for (let item in userResponses) {
|
||
if (item.startsWith("isCorrect_response_")) // = Nouvelle réponse possible.
|
||
{
|
||
idChoice = item.substring(item.lastIndexOf("_") + 1); // si on change de queston
|
||
|
||
if (userResponses["question_id_response_" + idChoice] != idQuestion) // on commence à traiter une nouvelle question
|
||
{
|
||
idQuestion = userResponses["question_id_response_" + idChoice];
|
||
answer.nbQuestions++;
|
||
if (goodResponse) // résultat de la question précédente
|
||
answer.nbCorrectAnswers++;
|
||
goodResponse = true; // réponse bonne jusqu'à la première erreur...
|
||
}
|
||
|
||
if (userResponses[item] == "true") {
|
||
document.getElementById("response_" + idChoice).parentNode.classList.add("isCorrect");
|
||
if (userResponses["response_" + idChoice] === undefined) // une bonne réponse n'a pas été sélectionnée
|
||
goodResponse = false;
|
||
} else {
|
||
if (userResponses["response_" + idChoice] === "on") // réponse cochée ne faisant pas partie des bonnes
|
||
{
|
||
goodResponse = false;
|
||
document.getElementById("response_" + idChoice).parentNode.classList.add("isNotCorrect");
|
||
}
|
||
}
|
||
}
|
||
} // si j'ai bien répondu à la dernière question, il faut le compter ici, car je suis sorti de la boucle :
|
||
|
||
|
||
if (goodResponse) answer.nbCorrectAnswers++; // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score :
|
||
|
||
let getOuput = Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["checkAnswerOuput"])(answer);
|
||
|
||
if (isConnected) {
|
||
// Si l'utilisateur est connecté, on enregistre son résultat sur le serveur.
|
||
const xhrSaveAnswer = new XMLHttpRequest();
|
||
xhrSaveAnswer.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["saveAnswersRoute"]);
|
||
|
||
xhrSaveAnswer.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
let xhrResponse = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 201 && xhrResponse.message) {
|
||
getOuput += "<br>" + xhrResponse.message.replace("#URL", configTemplate.userHomePage);
|
||
checkPreviousResponses(user);
|
||
} else getOuput += "<br>" + responseSavedError.replace("#URL", configTemplate.userHomePage); // on redirige vers le résultat
|
||
|
||
|
||
window.location.hash = "";
|
||
const here = window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview"...
|
||
|
||
window.location.assign(here + "explanations");
|
||
}
|
||
};
|
||
|
||
xhrSaveAnswer.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrSaveAnswer.setRequestHeader("Content-Type", "application/json");
|
||
answer.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_9__["getTimeDifference"])(); // on en profite pour mettre les pendules à l'heure.
|
||
|
||
xhrSaveAnswer.send(JSON.stringify(answer));
|
||
} else {
|
||
// si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion.
|
||
if (Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["saveAnswer"])(answer)) {
|
||
getOuput += "<br><br>" + wantToSaveResponses;
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["info"]);
|
||
document.querySelector(".subscribeBtns").style.display = "block";
|
||
} else // inutile de proposer de créer un compte si le stockage local ne fonctionne pas
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["info"]); // on redirige vers le résultat
|
||
|
||
|
||
window.location.hash = "";
|
||
const here = window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview"...
|
||
|
||
window.location.assign(here + "response");
|
||
} // + affichage des textes d'explications pour chaque question
|
||
|
||
|
||
const explanations = document.querySelectorAll(".help");
|
||
|
||
for (let i in explanations) {
|
||
if (explanations[i].style != undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?)
|
||
explanations[i].style.display = "block";
|
||
}
|
||
} catch (e) {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", serverError, "", ["error"]);
|
||
console.error(e);
|
||
}
|
||
}); // Fonction vérifiant les précédentes réponses de l'utilisateur
|
||
// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse
|
||
|
||
const checkPreviousResponses = user => {
|
||
const xhrPreviousRes = new XMLHttpRequest();
|
||
xhrPreviousRes.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["getPreviousAnswers"] + user.id + "/" + document.getElementById("questionnaireId").value);
|
||
|
||
xhrPreviousRes.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
let response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200) {
|
||
const nbResponses = response.length;
|
||
let previousAnswersContent = "";
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsTitle, "span", previousAnswersTitle.replace("#NOM", user.name));
|
||
|
||
if (nbResponses !== 0) {
|
||
let totNbQuestions = 0,
|
||
totNbCorrectAnswers = 0,
|
||
totDuration = 0,
|
||
mapLineContent;
|
||
|
||
for (let i in response) {
|
||
totNbQuestions += response[i].nbQuestions; // ! on ne peut se baser sur la version actuelle du quiz, car le nombre de questions a pu évoluer.
|
||
|
||
totNbCorrectAnswers += response[i].nbCorrectAnswers;
|
||
totDuration += response[i].duration;
|
||
mapLineContent = {
|
||
DATEANSWER: Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["dateFormat"])(response[i].createdAt, lang),
|
||
NBCORRECTANSWERS: response[i].nbCorrectAnswers,
|
||
NBQUESTIONS: response[i].nbQuestions,
|
||
AVGDURATION: response[i].duration
|
||
};
|
||
previousAnswersContent += "<li>" + Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["replaceAll"])(previousAnswersLine, mapLineContent) + "</li>";
|
||
}
|
||
|
||
mapLineContent = {
|
||
AVGDURATION: Math.round(totDuration / nbResponses),
|
||
AVGCORRECTANSWERS: Math.round(totNbCorrectAnswers / totNbQuestions * 100)
|
||
};
|
||
previousAnswersContent = "<h5>" + Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["replaceAll"])(previousAnswersStats, mapLineContent) + "</h5>" + previousAnswersContent;
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsContent, "ul", previousAnswersContent);
|
||
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsContent, "ul", noPreviousAnswer); // dans un cas comme dans l'autre, bouton pour revenir à l'accueil du compte
|
||
|
||
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsContent, "p", "<a href=\"/" + configTemplate.userHomePage + "\" class=\"button cardboard\">" + configTemplate.userHomePageTxt + "</a>", "", ["btn"], "", false);
|
||
}
|
||
}
|
||
};
|
||
|
||
xhrPreviousRes.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrPreviousRes.send();
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/answers.js":
|
||
/*!******************************!*\
|
||
!*** ./src/tools/answers.js ***!
|
||
\******************************/
|
||
/*! exports provided: saveAnswer, checkAnswerOuput */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveAnswer", function() { return saveAnswer; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerOuput", function() { return checkAnswerOuput; });
|
||
/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__);
|
||
const configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js");
|
||
|
||
|
||
|
||
|
||
const txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + configFrontEnd.lang + "/answer"); // Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté
|
||
|
||
|
||
const saveAnswer = answer => {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions) && (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) || !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.GroupId))) {
|
||
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("lastAnswer", answer);
|
||
return true;
|
||
} else return false;
|
||
}; // Retourne un texte suivant le nombre de bonnes réponses
|
||
|
||
const checkAnswerOuput = answer => {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) {
|
||
const ratio = answer.nbCorrectAnswers / answer.nbQuestions;
|
||
const mapObj = {
|
||
DURATION: answer.duration,
|
||
NBCORRECTANSWERS: answer.nbCorrectAnswers,
|
||
NBQUESTIONS: answer.nbQuestions
|
||
};
|
||
let output = "";
|
||
if (ratio < 0.4) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputFail, mapObj);else if (ratio < 0.8) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputMedium, mapObj);else output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputSuccess, mapObj);
|
||
if (output) return output;else return "";
|
||
} else return "";
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./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
|
||
const saveLocaly = (name, data) => {
|
||
localStorage.setItem(name, JSON.stringify(data));
|
||
};
|
||
const getLocaly = (name, json = false) => {
|
||
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
|
||
};
|
||
const removeLocaly = name => {
|
||
localStorage.removeItem(name);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/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__);
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
const addElement = (eltParent, eltType, eltContent = "", eltId = "", eltClass = [], eltAttributes = {}, replace = true) => {
|
||
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
|
||
const 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 (let i in eltClass) newElement.classList.add(eltClass[i]);
|
||
}
|
||
|
||
if (typeof eltAttributes === "object") // !! tous les objets ne sont pas ok
|
||
{
|
||
for (let 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
|
||
const helloDev = () => {
|
||
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
|
||
return true;
|
||
};
|
||
const updateAccountLink = (status, configTemplate) => {
|
||
const link = document.getElementById("accountHeadLink");
|
||
const homePage = status + "HomePage";
|
||
link.href = "/" + configTemplate[homePage];
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/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__);
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
const setAttributesToInputs = (inputsConf, myForm) => {
|
||
for (let i in myForm.elements) {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
|
||
let idInput = myForm.elements[i].id;
|
||
|
||
if (inputsConf[idInput] !== undefined) {
|
||
let inputHTML = document.getElementById(idInput);
|
||
|
||
for (let 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.
|
||
|
||
const getDatasFromInputs = myForm => {
|
||
const datas = {};
|
||
const formData = new FormData(myForm);
|
||
|
||
for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];
|
||
|
||
return datas;
|
||
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
|
||
// Revoir pour les select
|
||
|
||
const empyForm = myForm => {
|
||
const formData = new FormData(myForm);
|
||
|
||
for (let entrie of formData.entries()) {
|
||
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 = "";
|
||
}
|
||
|
||
return true;
|
||
}; // Vide et cache le formulaire
|
||
|
||
const empyAndHideForm = myForm => {
|
||
empyForm(myForm);
|
||
myForm.style.display = "none";
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/matomo.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/tools/matomo.js ***!
|
||
\*****************************/
|
||
/*! exports provided: loadMatomo */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadMatomo", function() { return loadMatomo; });
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ "../config/matomo.js");
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Fonction chargeant le code matomo
|
||
|
||
const loadMatomo = () => {
|
||
// chargement de matomo
|
||
var _paq = window._paq = window._paq || []; //ajout cnil :
|
||
|
||
|
||
_paq.push([function () {
|
||
var self = this;
|
||
|
||
function getOriginalVisitorCookieTimeout() {
|
||
var now = new Date(),
|
||
nowTs = Math.round(now.getTime() / 1000),
|
||
visitorInfo = self.getVisitorInfo();
|
||
var createTs = parseInt(visitorInfo[2]);
|
||
var cookieTimeout = 33696000; // 13 mois en secondes
|
||
|
||
var originalTimeout = createTs + cookieTimeout - nowTs;
|
||
return originalTimeout;
|
||
}
|
||
|
||
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
|
||
}]); //--fin ajout cnil
|
||
|
||
|
||
_paq.push(['trackPageView']);
|
||
|
||
_paq.push(['enableLinkTracking']);
|
||
|
||
(function () {
|
||
var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__["matomo"].url;
|
||
|
||
_paq.push(['setTrackerUrl', u + 'matomo.php']);
|
||
|
||
_paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__["matomo"].siteId]);
|
||
|
||
var d = document,
|
||
g = d.createElement('script'),
|
||
s = d.getElementsByTagName('script')[0];
|
||
g.type = 'text/javascript';
|
||
g.async = true;
|
||
g.src = u + 'matomo.js';
|
||
s.parentNode.insertBefore(g, s);
|
||
})();
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/users.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/users.js ***!
|
||
\****************************/
|
||
/*! exports provided: getTimeDifference, setSession, checkAnswerDatas, checkSession */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
|
||
/* 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__);
|
||
|
||
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
|
||
|
||
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
|
||
|
||
|
||
|
||
|
||
const getTimeDifference = () => {
|
||
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
|
||
const timeLocal = new Date().getTimezoneOffset() * -1;
|
||
if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal;
|
||
}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
|
||
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
|
||
|
||
const setSession = (userId, token, durationTS) => {
|
||
const storageUser = {
|
||
id: userId,
|
||
token: token,
|
||
duration: durationTS
|
||
};
|
||
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 ou d'un groupe de quizs
|
||
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
|
||
|
||
const checkAnswerDatas = datas => {
|
||
const lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer");
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) {
|
||
const 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.nbQuestions) && (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) || !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.GroupId))) {
|
||
datas.duration = answer.duration;
|
||
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
|
||
datas.nbQuestions = answer.nbQuestions;
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;
|
||
}
|
||
}
|
||
|
||
return datas;
|
||
}; // Cette fonction teste la connexion de l'utilisateur d'une page
|
||
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
|
||
|
||
const checkSession = async (status = [], urlRedirection, message, urlWanted) => {
|
||
return new Promise((resolve, reject) => {
|
||
const userDatas = 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 {
|
||
const 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 {
|
||
const xhr = new XMLHttpRequest();
|
||
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token);
|
||
|
||
xhr.onload = () => {
|
||
let response = JSON.parse(xhr.responseText);
|
||
|
||
if (xhr.status === 200 && response.isValid && response.id != undefined) {
|
||
if (response.id === user.id) {
|
||
user.name = response.name;
|
||
user.language = response.language;
|
||
user.timeDifference = response.timeDifference;
|
||
user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API
|
||
|
||
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) {
|
||
const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate.accountPage;
|
||
if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate.accountPage + "#subscribe"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?
|
||
|
||
resolve(true);
|
||
} else {
|
||
if (status.length !== 0 && status.indexOf(response.status) === -1) {
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else resolve(true);
|
||
}
|
||
} else {
|
||
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 = () => reject(xhr.statusText);
|
||
|
||
xhr.send();
|
||
}
|
||
}
|
||
});
|
||
}; // Cette fonction sert à la précédente en cas de connexion non valide
|
||
|
||
const 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL21hdG9tby5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvYW5zd2VyLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Fuc3dlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL21hdG9tby5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmRNaW5MZW5ndGgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlcyIsImRpcldlYlF1ZXN0aW9ubmFpcmVzIiwibWF0b21vIiwidXJsIiwic2l0ZUlkIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJyZWdlbmVyYXRlSFRNTCIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJncm91cFJvdXRlcyIsImdldEdyb3VwUm91dGUiLCJwcmV2aWV3R3JvdXBSb3V0ZXMiLCJzZWFyY2hHcm91cHNSb3V0ZSIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0QWRtaW5TdGF0cyIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsInNhdmVBbnN3ZXJzUm91dGUiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIkdyb3VwIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsInNlYXJjaCIsInNlYXJjaEdyb3VwcyIsImRpckNhY2hlR3JvdXBzIiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTEdyb3VwcyIsImRpckhUTUxOZXdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJHcm91cHMiLCJkaXJXZWJOZXdzIiwiZGlyV2ViVGFncyIsIm5iUmFuZG9tUmVzdWx0cyIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsInVzZXJSb3V0ZXMiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiY3JlYXRlVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwiZ2V0VXNlckluZm9zIiwiZ2V0VXNlcnNRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoVXNlclJvdXRlIiwic2lnbnVwQ29tcGxldGlvblJvdXRlIiwic3Vic2NyaWJlUm91dGUiLCJ1bnN1YnNjcmliZVJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwidmFsaWRhdGVVc2VyUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsImRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyIsImNoZWNrUmVzcG9uc2VzT3VwdXRGYWlsIiwiY2hlY2tSZXNwb25zZXNPdXB1dE1lZGl1bSIsImNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzIiwibmVlZEludGVnZXJOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwibmVlZEludGVnZXJOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE1heE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWROdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWF4TnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRNaW5OdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UiLCJub1ByZXZpb3VzQW5zd2VyIiwicHJldmlvdXNBbnN3ZXJzTGluZSIsInByZXZpb3VzQW5zd2Vyc1N0YXRzIiwicHJldmlvdXNBbnN3ZXJzVGl0bGUiLCJyZXNwb25zZVNhdmVkRXJyb3IiLCJyZXNwb25zZVNhdmVkTWVzc2FnZSIsInN0YXRzVXNlciIsIndhbnRUb1NhdmVSZXNwb25zZXMiLCJhZGRCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJhbGVydE5ld1dpbmRvdyIsImJhZFVybCIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJidG5Qcm9wb3NlQ29ubmVjdGlvbiIsImJ0blByb3Bvc2VTdWJzY3JpYmUiLCJidG5TaG93T25XZWJTaXRlIiwiZGVsZXRlQnRuVHh0IiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoQ3JvbiIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoVG9rZW4iLCJuZWVkZWRQYXJhbXMiLCJuZXh0UGFnZSIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsIm5vdFZhbGlkRm9ybWF0IiwicHJldmlvdXNQYWdlIiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNjcmlwdFRpbWluZ0luZm8iLCJzdGF0c0FkbWluIiwic3Vic2NyaXB0aW9uQ2FsbCIsInVwZGF0ZUJ0blR4dCIsInVwZGF0ZU9rTWVzc2FnZSIsIlRvb2wiLCJpc0VtcHR5IiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwidHJpbUlmTm90TnVsbCIsIm15U3RyaW5nIiwic2hvcnRlbklmTG9uZ2VyVGhhbiIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsInJlcGxhY2VBbGwiLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJnZXRSYW5kb21JbnQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZUZvcm1hdCIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsImkiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ0YWdzTGlzdFR4dCIsImFib3V0UGFnZSIsImNndVBhZ2UiLCJkZWxldGVMaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJ1c2VySG9tZVBhZ2VUeHQiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJtYWlsUmVjaXBpZW50VHh0IiwibGljZW5jZVR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsImhvbWVTdWJjcmlwdGlvbkZvcm1UaXRsZSIsIm5ld3NMaXN0VGl0bGUiLCJ0YWdMaXN0VGl0bGUiLCJ0YWdMaXN0TWV0YURlc2MiLCJ0YWdMaXN0SW50cm8iLCJhbnN3ZXJzRXhwbGFuYXRpb25zTGlua1RleHQiLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwiZXhwbGFuYXRpb25FbGVtZW50VHh0IiwidHdpdHRlckFjY291bnQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsInVzZXJzR2V0Q29uZmlnVXJsIiwiY29uZmlnVGVtcGxhdGUiLCJteUZvcm0iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZGl2UmVzcG9uc2UiLCJidG5TaG93IiwiYnRuU3VibWl0IiwiZXhwbGFuYXRpb25zVGl0bGUiLCJleHBsYW5hdGlvbnNDb250ZW50IiwiaXNDb25uZWN0ZWQiLCJ1c2VyIiwiaW5pdGlhbGlzZSIsInN0eWxlIiwiZGlzcGxheSIsImNoZWNrU2Vzc2lvbiIsImdldExvY2FseSIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwiY2hlY2tQcmV2aW91c1Jlc3BvbnNlcyIsImxvYWRNYXRvbW8iLCJlIiwiY29uc29sZSIsImVycm9yIiwiaGVsbG9EZXYiLCJzaG93UXVlc3Rpb25uYWlyZSIsImNocm9ub0JlZ2luIiwibm93IiwiaGVyZSIsIndpbmRvdyIsImxvY2F0aW9uIiwiaGFzaCIsImFzc2lnbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJwcmV2ZW50RGVmYXVsdCIsImFkZEVsZW1lbnQiLCJhbnN3ZXIiLCJpbm5lckhUTUwiLCJ1c2VyUmVzcG9uc2VzIiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwiZHVyYXRpb24iLCJyb3VuZCIsIm5iUXVlc3Rpb25zIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsImlkQ2hvaWNlIiwiaWRRdWVzdGlvbiIsImdvb2RSZXNwb25zZSIsIml0ZW0iLCJzdGFydHNXaXRoIiwibGFzdEluZGV4T2YiLCJwYXJlbnROb2RlIiwiY2xhc3NMaXN0IiwiYWRkIiwiZ2V0T3VwdXQiLCJjaGVja0Fuc3dlck91cHV0IiwieGhyU2F2ZUFuc3dlciIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwieGhyUmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJtZXNzYWdlIiwic2V0UmVxdWVzdEhlYWRlciIsInRva2VuIiwidGltZURpZmZlcmVuY2UiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInNlbmQiLCJzdHJpbmdpZnkiLCJzYXZlQW5zd2VyIiwicXVlcnlTZWxlY3RvciIsImV4cGxhbmF0aW9ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ4aHJQcmV2aW91c1JlcyIsInJlc3BvbnNlIiwibmJSZXNwb25zZXMiLCJwcmV2aW91c0Fuc3dlcnNDb250ZW50IiwidG90TmJRdWVzdGlvbnMiLCJ0b3ROYkNvcnJlY3RBbnN3ZXJzIiwidG90RHVyYXRpb24iLCJtYXBMaW5lQ29udGVudCIsIkRBVEVBTlNXRVIiLCJjcmVhdGVkQXQiLCJOQkNPUlJFQ1RBTlNXRVJTIiwiTkJRVUVTVElPTlMiLCJBVkdEVVJBVElPTiIsIkFWR0NPUlJFQ1RBTlNXRVJTIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJHcm91cElkIiwic2F2ZUxvY2FseSIsInJhdGlvIiwiRFVSQVRJT04iLCJvdXRwdXQiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImFwcGVuZENoaWxkIiwibG9nIiwibGluayIsImhvbWVQYWdlIiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiaW5wdXRzQ29uZiIsImVsZW1lbnRzIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImRhdGFzIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZSIsImVudHJpZXMiLCJlbXB5Rm9ybSIsInR5cGUiLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwiX3BhcSIsInB1c2giLCJzZWxmIiwiZ2V0T3JpZ2luYWxWaXNpdG9yQ29va2llVGltZW91dCIsIm5vd1RzIiwiZ2V0VGltZSIsInZpc2l0b3JJbmZvIiwiZ2V0VmlzaXRvckluZm8iLCJjcmVhdGVUcyIsInBhcnNlSW50IiwiY29va2llVGltZW91dCIsIm9yaWdpbmFsVGltZW91dCIsInNldFZpc2l0b3JDb29raWVUaW1lb3V0IiwidSIsImQiLCJnIiwicyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXN5bmMiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ4aHIiLCJvbmxvYWQiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIiwib25lcnJvciIsInN0YXR1c1RleHQiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSxNQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJQyxRQUFNLEVBQUUsMkJBRFo7QUFFSUMsU0FBTyxFQUFFLHVC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RCxFQUFpQm5HLE9BQWpCLEVBQTBCb0csU0FBMUIsS0FDckI7QUFDSSxNQUFHLENBQUN0USwyREFBTyxDQUFDa0ssT0FBRCxDQUFYLEVBQ0k0QixvRUFBVSxDQUFDLFNBQUQsRUFBWTVCLE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ2xLLDJEQUFPLENBQUNzUSxTQUFELENBQVgsRUFDSXhFLG9FQUFVLENBQUMsS0FBRCxFQUFRd0UsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDdFEsMkRBQU8sQ0FBQ3FRLGNBQUQsQ0FBWCxFQUNJeEksTUFBTSxDQUFDQyxRQUFQLENBQWdCRSxNQUFoQixDQUF1QnFJLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvcXVlc3Rpb25uYWlyZS5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9xdWVzdGlvbm5haXJlLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcIndpa2lsZXJuaVwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwiV0xcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGRlZmF1bHRSZWNlaXB0RGF5czogXCIxNDdcIiwgLy8gUGFyIGTDqWZhdXQsIHF1ZWwocykgam91cihzKSBkZSBsYSBzZW1haW5lLCBsJ3V0aWxpc2F0ZXVyIHJlw6dvaXQtaWwgcXVlbHF1ZSBjaG9zZSA/ICgxPWRpbWFuY2hlLCAyPWx1bmRpLi4uIDc9c2FtZWRpKVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMCwvLyBpZiAwID0gdW5saW1pdGVkXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDEwLFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDIsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTIsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjcsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyMSwgLy8gaWRlbVxuICAgIG1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIHN1YnNjcmlwdGlvbidzIGUtbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIGZpZWxkTmV3UXVlc3Rpb25uYWlyZXMgOiBcInB1Ymxpc2hpbmdBdFwiLCAvLyBmaWVsZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgbGFzdCBxdWVzdGlvbm5haXJlcywgY2FuIGJlIFwiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIgb3IgXCJwdWJsaXNoaW5nQXRcIlxuICAgIC8vIEdyb3VwcyA6XG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW46IDEsXG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXg6IDAsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDEsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNTAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAwLFxuICAgIC8vIFF1ZXN0aW9ucyAmIHJlc3BvbnNlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVzXG59OyIsIi8vIFNpIG5vbiB1dGlsaXPDqSwgc3VwcHJpbWVyIGwnYXBwZWwgZGVzIEpTIGZyb250LWVuZCBwdWlzIHJlY29tcGlsZXIuXG4vLyBSZXZvaXIgY29tbWVudCByw6lvcmdhbmlzZXIgY2VsYSBzb3VzLWZvcm1lIGRlIG1vZHVsZSBpbmTDqXBlbmRhbnQuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gU3RhdHMgTWF0b21vIDpcbiAgICBtYXRvbW86IHsgdXJsOiBcImh0dHBzOi8vc3RhdHMubGUtZmFiLWxhYi5jb20vXCIsIHNpdGVJZDogXCI1XCIgfSxcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLC8vIGxhIGJhc2Ugw6AgbGFxdWVsbGUgcydham91dGUgbGVzIHJvdXRlcyBzdWl2YW50ZXNcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIGdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9nZXRyYW5kb21cIiwgXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICByZWdlbmVyYXRlSFRNTDogXCIvaHRtbHJlZ2VuZXJhdGVkXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgLy8gLS0gZ3JvdXBlcyA6XG4gICAgZ3JvdXBSb3V0ZXM6IFwiL2dyb3VwXCIsXG4gICAgZ2V0R3JvdXBSb3V0ZTogXCIvZ2V0L1wiLFxuICAgIHByZXZpZXdHcm91cFJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHNlYXJjaEdyb3Vwc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLC8vIGZvbmN0aW9ubmUgYXVzc2kgcG91ciBsZXMgZ3JvdXBlc1xuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIiwvLyBpZGVtXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgbGFpc3PDqSB2aWRlIGRhbnMgbGUgZm9ybXVsYWlyZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBHcm91cCA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgbGFpc3PDqSB2aWRlIGRhbnMgbGUgZm9ybXVsYWlyZVxuICAgIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzZWFyY2hHcm91cHM6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBKU09OIGfDqW7DqXLDqXMgOlxuICAgIGRpckNhY2hlR3JvdXBzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9ncm91cHNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEhUTUwgZ8OpbsOpcsOpcyA6XG4gICAgZGlySFRNTEdyb3VwcyA6IFwiZnJvbnQvcHVibGljL3F1aXovZ3BcIixcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZXMgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTE5ld3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICAvLyBJZGVtIG1haXMgcG91ciB1cmxzIDpcbiAgICBkaXJXZWJHcm91cHMgOiBcInF1aXovZ3BcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlcyA6IFwicXVpelwiLFxuICAgIGRpcldlYk5ld3MgOiBcInF1aXpzL1wiLFxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzL1wiLFxuICAgIC8vIGxpbWl0ZSBkZXMgcsOpc3VsdGF0IGR1IG1vdGV1ciBkZSByZWNoZXJjaGUsIHF1YW5kIGRlbWFuZGUgZGUgcsOpc3VsdGF0cyBhdSBoYXNhcmQgOlxuICAgIG5iUmFuZG9tUmVzdWx0cyA6IDMsXG4gICAgLyogVmFsZXVycyBlbiBmYWl0IGTDqWZpbmllcyBkYW5zIGluc3RhbmNlLmpzIGRvbmMgw6Agc3VwcHJpbWVyIHF1YW5kIHBsdXMgdXRpbGlzw6llcyBhaWxsZXVycyA6ICovXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsICAgXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIiwgICAgXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgZ2V0VXNlcnNRdWVzdGlvbm5haXJlc1JvdXRlOiBcIi9nZXR1c2Vyc3F1ZXN0aW9ubmFpcmVzL1wiLC8vIGxlcyBxdWVzdGlvbm5haXJlcyBhdXhxdWVscyBsJ3V0aWxpc2F0ZXVyIGEgZMOpasOgIGV1IGFjY8OocyB2aWEgc29uIGFib25uZW1lbnQgICAgXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgc2lnbnVwQ29tcGxldGlvblJvdXRlOiBcIi9zaWdudXBjb21wbGV0aW9uL1wiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzZWFyY2g6IHsgbWlubGVuZ3RoOiAxLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4OiA4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy93aXRob3V0XCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvYW5zd2VyXCI6IFwiLi4vbGFuZy9mci9hbnN3ZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9hbnN3ZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0RmFpbCA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogPHU+PGI+TkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMgcXVlc3Rpb25zPC9iPjwvdT4uIEMnZXN0IGNlcnRhaW4sIHZvdXMgZmVyZXogbWlldXggbGEgcHJvY2hhaW5lIGZvaXMgIVwiLFxuICAgIGNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0gOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IDx1PjxiPk5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TIHF1ZXN0aW9uczwvYj48L3U+LiBDJ2VzdCBwYXMgbWFsIGR1IHRvdXQgIVwiLFxuICAgIGNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiA8dT48Yj5OQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUyBxdWVzdGlvbnM8L2I+PC91Pi4gQnJhdm8gISBSaWVuIG5lIHZvdXMgw6ljaGFwcGUgIVwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyU2Vjb25kZXNSZXNwb25zZSA6IFwiTGEgZHVyw6llIGRlIGxhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllciBkZSBzZWNvbmRlcy5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IG5lIHBldXQgw6p0cmUgYXVzc2kgw6lsZXbDqS5cIixcbiAgICBuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBuZSBwZXV0IMOqdHJlIGluZsOpcmlldXIgw6AgMS5cIixcbiAgICBuZWVkTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgZG9pdCDDqnRyZSBmb3VybmkuXCIsXG4gICAgbmVlZE51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgZG9pdCDDqnRyZSBmb3VybmkuXCIsXG4gICAgbmVlZE1heE51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIG5lIHBldXQgw6p0cmUgc3Vww6lyaWV1ciBhdSBub21icmUgZGUgcXVlc3Rpb25zLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIDogXCJMYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgbmUgcGV1dCDDqnRyZSBuw6lnYXRpdmUuXCIsXG4gICAgbm9QcmV2aW91c0Fuc3dlcjogXCJPbiBkaXJhaXQgcXVlIGMnZXN0IGxhIHByZW1pw6hyZSBmb2lzIHF1ZSB2b3VzIHLDqXBvbmRleiDDoCBjZSBxdWl6LiBCb25uZSBsZWN0dXJlICFcIixcbiAgICBwcmV2aW91c0Fuc3dlcnNMaW5lOiBcIkxlIERBVEVBTlNXRVIsIHZvdXMgYXZleiByw6lwb25kdSBjb3JyZWN0ZW1lbnQgw6AgTkJDT1JSRUNUQU5TV0VSUyBxdWVzdGlvbnMgc3VyIE5CUVVFU1RJT05TIGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLlwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc1N0YXRzOiBcIkVuIG1veWVubmUsIHZvdXMgYXZleiByw6lwb25kdSDDoCBjZSBxdWl6IGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLCBlbiBheWFudCA8Yj5BVkdDT1JSRUNUQU5TV0VSUyAlIGRlIGJvbm5lcyByw6lwb25zZXM8L2I+LlwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc1RpdGxlOiBcIkJvbmpvdXIgI05PTSwgdm9pY2kgdm9zIHByw6ljw6lkZW50cyByw6lzdWx0YXRzIMOgIGNlIHF1aXpcIixcbiAgICByZXNwb25zZVNhdmVkRXJyb3IgOiBcIkNlcGVuZGFudCB1bmUgZXJyZXVyIGEgw6l0w6kgcmVuY29udHLDqWUgZHVyYW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgdm90cmUgcsOpc3VsdGF0LiA8YSBocmVmPScvI1VSTCc+QWNjw6hkZXIgw6AgdG91cyB2b3MgcXVpenM8L2E+LlwiLFxuICAgIHJlc3BvbnNlU2F2ZWRNZXNzYWdlIDogXCJWb3RyZSByw6lzdWx0YXQgYSDDqXTDqSBlbnJlZ2lzdHLDqS4gPGEgaHJlZj0nLyNVUkwnPkFjY8OoZGVyIMOgIHRvdXMgdm9zIHF1aXpzPC9hPi5cIixcbiAgICBzdGF0c1VzZXI6IFwiVm91cyBhdmV6IGVucmVnaXN0csOpIDxiPk5CQU5TV0VSUyByw6lwb25zZVMxIMOgIE5CUVVFU1RJT05OQUlSRVMgcXVpelMyIGRpZmbDqXJlbnRTMzwvYj4gc3VyIGxlcyBOQlRPVFFVRVNUSU9OTkFJUkVTIHByb3Bvc8OpUzQgcGFyIGxlIHNpdGUuPGJyPkVuIG1veWVubmUsIHZvdXMgYXZleiBtaXMgQVZHRFVSQVRJT04gc2Vjb25kZXMgw6AgcsOpcG9uZHJlIGV0IGF2ZXogPGI+Y29ycmVjdGVtZW50IHLDqXBvbmR1IMOgIEFWR0NPUlJFQ1RBTlNXRVJTICUgZGVzIHF1ZXN0aW9uczwvYj4uXCIsXG4gICAgd2FudFRvU2F2ZVJlc3BvbnNlczogXCJTaSB2b3VzIGxlIHNvdWhhaXRleiwgdm91cyBwb3V2ZXogPHU+PGI+c2F1dmVnYXJkZXIgdm90cmUgcsOpc3VsdGF0PC9iPjwvdT4gZW4gY3LDqWFudCB2b3RyZSBjb21wdGUgY2ktZGVzc291cy4gQ2VsYSB2b3VzIHBlcm1ldHRyYSBhdXNzaSBkZSA8dT48Yj5yZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIFxcXCJncmFpbmVzIGRlIGN1bHR1cmVcXFwiPC9iPjwvdT4gZGlyZWN0ZW1lbnQgc3VyIHZvdHJlIGUtbWFpbC5cIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICBhbGVydE5ld1dpbmRvdzogXCJub3V2ZWxsZSBmZW7DqnRyZVwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBZmZpY2hlciAhXCIsXG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsXG4gICAgYnRuUHJvcG9zZVN1YnNjcmliZTogXCJKZSBjcsOpZSBtb24gY29tcHRlLlwiLFxuICAgIGJ0blNob3dPbldlYlNpdGU6IFwiTGlyZSBsYSBzdWl0ZSBzdXIgI1NJVEVfTkFNRVwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gZGUgbCdlbnJlZ2lzdHJlbWVudCAjSUQgYSDDqWNob3XDqS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IGxhIGN1bHR1cmUgZ8OpbsOpcmFsZSBlbiBsaWJlcnTDqVwiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFwcHJlbmV6IHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgY2hvc2VzLiBWb3VzIHJlY2V2ZXogZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuIERlcyBxdWl6cyB2b3VzIHBlcm1ldHRlbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUuXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIixcbiAgICBzdWJzY3JpcHRpb25DYWxsOiBcIkluc2NyaXZlei12b3VzICFcIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIuKAplwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxuXG4gICAgLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4gICAgLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG4gICAgc3RhdGljIGdldFBhc3N3b3JkIChuYkNhck1pbiwgbmJDYXJNYXgpXG4gICAge1xuICAgICAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgICAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICAgICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgICAgICB9XG4gICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBsaWVucyBkZSBsJ2ludGVyZmFjZVxuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIlBhcmNvdXJpclwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvcXVpenMvXCIsIGlkOlwiaW5kZXhIZWFkTGlua1wiLCB0aXRsZTpcIkxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9uc1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIsIHRpdGxlOlwiQWNjw6lkZXIgb3UgY3LDqWV6IHZvdHJlIGNvbXB0ZSBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiLCB0aXRsZTpcIkVuIHNhdm9pciArIHN1ciBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiLCB0aXRsZTpcIlBhZ2UgZCdhY2N1ZWlsXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkxlIGJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiwgdGl0bGU6XCJRdWkgYSBjcsOpw6kgV2lraUxlcm5pID8gUXVlbHMgc29udCB2b3MgZHJvaXRzID9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiLCB0aXRsZTpcIlZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZTogXCJhZG1pbi5odG1sXCIsXG4gICAgY2d1UGFnZTogXCJDR1YtQ0dVLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBkZWxldGVMaW5rUGFnZSA6IFwiYXVyZXZvaXIuaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIG5ld0xvZ2luTGlua1BhZ2UgOiBcIm5ld2xvZ2luLmh0bWw/dD1cIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLCAgICBcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIHVwZGF0ZUFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2VUeHQgOiBcIk1hIHBhZ2UgZCdhY2N1ZWlsLlwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIHZhbGlkYXRpb25MaW5rUGFnZSA6IFwidmFsaWRhdGlvbi5odG1sP3Q9XCIsXG4gICAgLyogVGV4dGVzIChnw6luw6lyYWwpICovXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIG1haWxSZWNpcGllbnRUeHQ6IFwiTWVzc2FnZSBlbnZvecOpIMOgIDpcIixcbiAgICBsaWNlbmNlVHh0OiBcIkBjb3B5bGVmdCBMZSBjb250ZW51IGRlIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgP1xcXCI+ZXN0IGxpYnJlPC9hPiBldCB2b3VzIGVzdCBvZmZlcnQgc2FucyBwdWJsaWNpdMOpLiBWb3VzIHBvdXZleiA8YSBocmVmPVxcXCIvcGFydGljaXBlci1maW5hbmNlbWVudC5odG1sXFxcIiB0aXRsZT1cXFwiRmluYW5jZW1lbnQgcGFydGljaXBhdGlmIGF2ZWMgY29udHJlLXBhcnRpZXNcXFwiPnBhcnRpY2lwZXIgw6Agc29uIGZpbmFuY2VtZW50IGVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgLyogUGFnZSBkJ2FjY3VlaWwgKi9cbiAgICBob21lUGFnZVR4dDogXCJQYWdlIGQnYWNjdWVpbFwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiPGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+Ljxicj5Wb3VzIHJlY2V2ZXogZGUgY291cnRzIGFydGljbGVzLCBsaXNpYmxlcyBlbiBxdWVscXVlcyBtaW51dGVzLjxicj5EZXMgcXVpenMgdm91cyBwZXJtZXR0ZW50IGVuc3VpdGUgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgPGI+ZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgY3VsdHVyZSBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBqYXJkaW48L2I+LlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIjxiPlBhcyBkZSBmYWl0cyBhbHRlcm5hdGlmczwvYj4sIHRvdXMgbGVzIGNvbnRlbnVzIHNvbnQgPGI+c291cmPDqXMgcGFyIGRlcyBhcnRpY2xlcyBXaWtpcMOpZGlhPC9iPi48YnI+RXQgdG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwdWJsacOpIHN1ciBXaWtpTGVybmkgPGEgaHJlZj1cXFwiL2NyZWRpdHMuaHRtbFxcXCIgdGl0bGU9XFxcIkVuIHNhdm9pciBwbHVzIHN1ciBjZSBzdWpldFxcXCI+c29udCBwYXJ0YWfDqXMgc291cyBsaWNlbmNlcyBsaWJyZXM8L2E+Ljxicj5MZSB0b3V0IHNhbnMgcHVibGljaXTDqSwgbmkgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzLjxicj48Yj5TdXIgV2lraUxlcm5pLCB2b3VzIGN1bHRpdmV6IHZvdHJlIGphcmRpbiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjwvYj5cIixcbiAgICBob21lQnRuQWJvdXRUeHQ6IFwiRW4gc2F2b2lyIHBsdXMgc3VyIFdpa2lMZXJuaSA/XCIsXG4gICAgaG9tZUJ0blN1YnNjcmliZVR4dDogIFwiVGVzdGV6IFdpa2lMZXJuaVwiLFxuICAgIGhvbWVTdWJjcmlwdGlvbkZvcm1UaXRsZTogIFwiUmVjZXZleiBsZXMgcHJvY2hhaW5zIGFydGljbGVzIFdpa2lMZXJuaVwiLFxuICAgIC8qIFBhZ2UgZGVybmnDqHJlcyBwdWJsaWNhdGlvbnMuLi4gKi8gICBcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIldpa2lMZXJuaSA6IHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIG5ld3NMaXN0VGl0bGU6IFwiPHA+PGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgcXVlbHF1ZSBjaG9zZSBkZSBub3V2ZWF1PC9iPjxicj5TaSBkZXNzb3VzIGxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4gVm91cyBwb3V2ZXogYXVzc2kgPGEgaHJlZj0nL3F1aXpzL3RoZW1lcy5odG1sJz5wYXJjb3VyaXIgbGUgc2l0ZSBwYXIgdGjDqG1lcyBvdSBtb3RzLWNsw6lzPC9hPi48L3A+XCIsXG4gICAgLyogUGxhbiBkdSBzaXRlLCBsaXN0ZSBkZXMgdGFncyAqLyAgIFxuICAgIHRhZ0xpc3RUaXRsZTogXCJDdWx0dXJlIGfDqW7DqXJhbGUgLSBkZXMgYXJ0aWNsZXMgZXQgcXVpenMgc3VyIGRlIG5vbWJyZXV4IHRow6htZXMgIVwiLFxuICAgIHRhZ0xpc3RNZXRhRGVzYzogXCJXaWtpTGVybmkgOiBkw6ljb3V2cmlyIGxlcyBkaWZmw6lyZW50cyB0aMOobWVzIGFib3Jkw6lzIHBhciBXaWtpTGVybmkuIElueGV4IGR1IHNpdGUuXCIsXG4gICAgdGFnTGlzdEludHJvOiBcIjxoMz5BdmVjIFdpa2lMZXJuaSwgZGV2ZW5leiBmb3J0IGVuIHRow6htZXMuLi4gT3VpIG1haXMgcXVlbHMgdGjDqG1lcyA/IDopPC9oMz48YmxvY2txdW90ZT5BcmlzdG90ZeKArzogwqvigK9M4oCZaG9tbWUgYSBuYXR1cmVsbGVtZW50IGxhIHBhc3Npb24gZGUgY29ubmHDrnRyZeKApuKAr8K7PC9ibG9ja3F1b3RlPlwiLFxuICAgIC8qIFBhZ2UgcXVpenMgKi9cbiAgICBhbnN3ZXJzRXhwbGFuYXRpb25zTGlua1RleHQ6IFwiUmVsaXJlXCIsXG4gICAgcXVpekVsZW1lbnRMaW5rc0ludHJvOiBcIkVuIHNhdm9pciBwbHVzXCIsXG4gICAgcXVpekVsZW1lbnRTdWJjcmlwdGlvbkZvcm1UaXRsZTogXCJSZWNldmV6IGxlcyBwcm9jaGFpbnMgYXJ0aWNsZXMgV2lraUxlcm5pXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5p4oCvP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIjxwPkxlIHByaW5jaXBlIGVzdCBzaW1wbGXigK86IDxiPnZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpPC9iPi4gUHVpcyB2b3VzIDxiPmFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZTwvYj4uIFN1aXZhbnQgbGVzIHF1ZXN0aW9ucywgPGI+dW5lIG91IHBsdXNpZXVycyByw6lwb25zZXMgcGV1dmVudCDDqnRyZSBjb3JyZWN0ZXM8L2I+IGV0IGRvaXZlbnQgZG9uYyDDqnRyZSBjb2Now6llcy4gQ+KAmWVzdCB0b3Vqb3VycyA8Yj5sZSBjb250ZW51IGRlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgcXVpIGZhaXQgZm9pPC9iPiBjb25jZXJuYW50IGxlcyDCq+KAr2Jvbm5lc+KAr8K7IHLDqXBvbnNlcy4gQ+KAmWVzdCB1bmUgZmHDp29uIGRlIHRlc3RlciDDoCBsYSBmb2lzIHZvdHJlIGNhcGFjaXTDqSBk4oCZYXR0ZW50aW9uIGV0IHZvdHJlIG3DqW1vaXJlLiBMZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBwZXV2ZW50IMOpdm9sdWVyLCBkb25jIG7igJlow6lzaXRleiBwYXMgPGEgaHJlZj0nL2NvbnRhY3QuaHRtbCc+w6AgbWUgc2lnbmFsZXIgdW5lIGVycmV1cjwvYT4uPC9wPjxwPjxiPldpa2lMZXJuaSB2b3VzIHByb3Bvc2UgZOKAmWF1dHJlcyBzb2x1dGlvbnMgcG91ciBhbcOpbGlvcmVyIHZvdHJlIGN1bHR1cmUgZ8OpbsOpcmFsZTwvYj4uIFBvdXIgZW4gc2F2b2lyIHBsdXMsIGNsaXF1ZXogc3VyIGxlIGJvdXRvbiBjaS1kZXNzb3VzLjwvcD5cIixcbiAgICBleHBsYW5hdGlvbkVsZW1lbnRUeHQ6IFwiPHA+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBkZSA8Yj5yZWNldm9pciBwYXIgZS1tYWlsIMOgIGxhIGZyw6lxdWVuY2UgY2hvaXNpZSwgZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXM8L2I+IGV0IHBvcnRhbnQgc3VyIGRlcyBzdWpldHMgdHLDqHMgdmFyacOpcyBkZSA8Yj5jdWx0dXJlIGfDqW7DqXJhbGU8L2I+IChhcnRzLCBoaXN0b2lyZSwgbGl0dMOpcmF0dXJlLCBzY2llbmNlcywgZXRjLikuPC9wPjxwPkNlcyBhcnRpY2xlcyBzb250IGJhc8OpcyBzdXIgPGI+dW5lIG91IHBsdXNpZXVycyBwYWdlcyBkZSBXaWtpcMOpZGlhPC9iPiAoZm91cm5pZXMgZW4gbGllbiksIGRvbnQgPGI+aWxzIGV4dHJhaWVudCBjZXJ0YWluZXMgaW5mb3JtYXRpb25zPC9iPi48L3A+PHA+Q2hhcXVlIHPDqXJpZSBk4oCZYXJ0aWNsZXMgZXN0IDxiPnN1aXZpZSBk4oCZdW4gcXVpejwvYj4gcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPC9wPjxwPjxiPlZvdXMgYXBwcmVuZXogYWluc2kgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+IHRyw6hzIHNpbXBsZW1lbnQuPC9wPlwiLFxuICAgIC8qIEF1dHJlcyAqL1xuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICB0d2l0dGVyQWNjb3VudDogXCJXaWtpTGVybmlcIixcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTIsXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNTaXRlSG9tZVBhZ2U6IDMsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDMsXG59OyIsIi8vIMOgIHN1cHByaW1lciB1bmUgZm9pcyBxdWUgdG91dCByw6ljdXDDqXJlciBkdSBiYWNrZW5kIDpcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybCA6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHVzZXJzR2V0Q29uZmlnVXJsIDogXCIvdXNlci9nZXRjb25maWdcIixcbiAgICBsYW5nIDogXCJmclwiLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiXG59OyIsIi8vIC0tIEdFU1RJT04gRFUgRk9STVVMQUlSRSBQRVJNRVRUQU5UIEQnQUZGSUNIRVIgRVQgUsOJUE9ORFJFIMOAIFVOIFFVSVpcblxuLy8vIElsIG4nZXN0IHBhcyBuw6ljZXNzYWlyZSBkJ8OqdHJlIGNvbm5lY3TDqSBwb3VyIHLDqXBvbmRyZSBhdSBxdWl6IGV0IHZvaXIgc29uIHLDqXN1bHRhdC5cbi8vLyBNYWlzIHNpIHBhcyBjb25uZWN0w6ksIG9uIHByb3Bvc2Ugw6AgbCdpbnRlcm5hdXRlIGRlIHNlIGNvbm5lY3RlciBvdSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgc2F1dmVnYXJkZXIgc29uIHLDqXN1bHRhdC5cbi8vLyBEYW5zIGNlIGJ1dCBzb24gcsOpc3VsdGF0IGVzdCBzdG9ja8OpIGRhbnMgc29uIG5hdmlnYXRldXIuXG4vLy8gU2kgaWwgZXN0IGNvbm5lY3TDqSwgbCdlbnJlZ2lzdHJlbWVudCBkZSBzb24gcsOpc3VsdGF0IHNlIGZhaXQgYXV0b21hdGlxdWVtZW50IGPDtHTDqSBzZXJ2ZXVyIGV0IHNlcyDDqXZlbnR1ZWxzIHByw6ljw6lkZW50cyByw6lzdWx0YXRzIHNvbnQgYWZmaWNow6lzLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuaW1wb3J0IHsgZ2V0UHJldmlvdXNBbnN3ZXJzLCBxdWVzdGlvbm5haXJlUm91dGVzLCBzYXZlQW5zd2Vyc1JvdXRlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9xdWVzdGlvbm5haXJlcy5qc1wiO1xuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbmltcG9ydCB7IGNoZWNrQW5zd2VyT3VwdXQsIHNhdmVBbnN3ZXIgfSBmcm9tIFwiLi90b29scy9hbnN3ZXJzLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXRMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBnZXREYXRhc0Zyb21JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgZGF0ZUZvcm1hdCwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBsb2FkTWF0b21vIH0gZnJvbSBcIi4vdG9vbHMvbWF0b21vLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldFRpbWVEaWZmZXJlbmNlIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB7IG5vUHJldmlvdXNBbnN3ZXIsIHByZXZpb3VzQW5zd2Vyc0xpbmUsIHByZXZpb3VzQW5zd2Vyc1N0YXRzLCBwcmV2aW91c0Fuc3dlcnNUaXRsZSwgcmVzcG9uc2VTYXZlZEVycm9yLCB3YW50VG9TYXZlUmVzcG9uc2VzIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2Fuc3dlclwiKTtcbmNvbnN0IHsgc2VydmVyRXJyb3IgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcblxuLy8gUHJpbmNpcGF1eCDDqWzDqW1lbnRzIGR1IERPTSBtYW5pcHVsw6lzIDpcbmNvbnN0IG15Rm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcbmNvbnN0IGJ0blNob3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNob3dRdWVzdGlvbm5haXJlXCIpO1xuY29uc3QgYnRuU3VibWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGVja1Jlc3BvbnNlc1wiKTtcbmNvbnN0IGV4cGxhbmF0aW9uc1RpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJleHBsYW5hdGlvbnNUaXRsZVwiKTtcbmNvbnN0IGV4cGxhbmF0aW9uc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImV4cGxhbmF0aW9uc0NvbnRlbnRcIik7XG5cbmxldCBpc0Nvbm5lY3RlZCwgdXNlcjtcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgYnRuU2hvdy5zdHlsZS5kaXNwbGF5PVwiaW5saW5lXCI7Ly8gYm91dG9uIGNhY2jDqSBzaSBKUyBpbmFjdGlmLCBjYXIgSlMgbsOpY2Vzc2FpcmUgcG91ciB2w6lyaWZpZXIgbGVzIHLDqXBvbnNlc1xuICAgICAgICBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1widXNlclwiXSk7Ly8gXCJ1c2VyXCIgY2FyIHNldWxzIGxlcyB1dGlsaXNhdGV1cnMgZGUgYmFzZSBwZXV2ZW50IGVucmVnaXN0cmVyIGxldXJzIHLDqXBvbnNlcyBhdXggcXVpenNcbiAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBlc3QgY29ubmVjdMOpIGV0IGEgZMOpasOgIHLDqXBvbmR1IMOgIGNlIHF1aXosIG9uIGFmZmljaGUgc2VzIHByw6ljw6lkZW50ZXMgcsOpcG9uc2VzIMOgIGxhIHBsYWNlIGR1IHRleHRlIHNlcnZhbnQgw6AgZXhwbGlxdWVyIGxlIHRvcG8gYXV4IG5vdXZlYXV4XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnVGVtcGxhdGUpOy8vIGxpZW4gdmVycyBsZSBjb21wdGUgYWRhcHTDqSBwb3VyIGxlcyB1dGlsaXNhdGV1cnMgY29ubmVjdMOpc1xuICAgICAgICAgICAgY2hlY2tQcmV2aW91c1Jlc3BvbnNlcyh1c2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2FkTWF0b21vKCk7XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcbmhlbGxvRGV2KCk7XG5cbi8vIEFmZmljaGFnZSBkdSBxdWVzdGlvbm5haXJlIHF1YW5kIGwndXRpbGlzYXRldXIgY2xpcXVlIHN1ciBsZSBib3V0b24gb3Ugc2kgbCdpZCBkdSBmb3JtdWxhaXJlIGVzdCBwYXNzw6llIHBhciBsJ3VybC5cbi8vIETDqWNsZW5jaGUgZW4gbcOqbWUgdGVtcHMgbGUgY2hyb25vbcOodHJlIG1lc3VyYW50IGxhIGR1csOpZSBkZSBsYSByw6lwb25zZSBhdXggcXVlc3Rpb25zLlxuY29uc3Qgc2hvd1F1ZXN0aW9ubmFpcmUgPSAoKSA9Plxue1xuICAgIGNocm9ub0JlZ2luPURhdGUubm93KCk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIGJ0blNob3cuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICBjb25zdCBoZXJlPXdpbmRvdy5sb2NhdGlvbjsvLyB3aW5kb3cubG9jYXRpb24gw6AgYWpvdXRlciBwb3VyIG5lIHBhcyBxdWl0dGVyIGxhIHBhZ2UgZW4gbW9kZSBcInByZXZpZXdcIi5cbiAgICBpZih3aW5kb3cubG9jYXRpb24uaGFzaCE9PVwiXCIpXG4gICAge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaD1cIlwiOy8vICEgbGUgXCIjXCIgcmVzdGVcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihoZXJlK1wicXVlc3Rpb25uYWlyZVwiKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGhlcmUrXCIjcXVlc3Rpb25uYWlyZVwiKTtcbn1cbmxldCBjaHJvbm9CZWdpbj0wO1xuYnRuU2hvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2hvd1F1ZXN0aW9ubmFpcmUoKTtcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn0pO1xuLy8gTGllbiBwYXNzw6kgcGFyIG1haWwgcG91ciB2b2lyIGRpcmVjdGVtZW50IGxlIHF1aXpcbmlmKGxvY2F0aW9uLmhhc2ghPVwiXCIgJiYgbG9jYXRpb24uaGFzaD09PVwiI3F1ZXN0aW9ubmFpcmVcIilcbiAgICBzaG93UXVlc3Rpb25uYWlyZSgpO1xuXG4vLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZGUgbGEgcsOpcG9uc2UgZGUgbCd1dGlsaXNhdGV1ciA6XG5sZXQgYW5zd2VyID0ge307XG5teUZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAgICAgICBcbiAgICAgICAgYnRuU3VibWl0LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7Ly8gc2V1bGVtZW50IHVuIGVudm9pIMOgIGxhIGZvaXMsIFNWUCA6KVxuICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjsvLyBzdXBwcmltZSBsZXMgw6l2ZW50dWVscyBtZXNzYWdlcyBkw6lqw6AgYWZmaWNow6lzXG4gICAgICAgIGNvbnN0IHVzZXJSZXNwb25zZXM9Z2V0RGF0YXNGcm9tSW5wdXRzKG15Rm9ybSk7XG4gICAgICAgIGFuc3dlci5kdXJhdGlvbj1NYXRoLnJvdW5kKChEYXRlLm5vdygpLWNocm9ub0JlZ2luKS8xMDAwKTtcbiAgICAgICAgYW5zd2VyLm5iUXVlc3Rpb25zPTA7XG4gICAgICAgIGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzPTA7XG4gICAgICAgIGFuc3dlci5RdWVzdGlvbm5haXJlSWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlSWRcIikudmFsdWU7XG4gICAgICAgIC8vIExlcyByw6lwb25zZXMgc29udCByZWdyb3Vww6llcyBwYXIgcXVlc3Rpb24sIGRvbmMgcXVhbmQgaWRRdWVzdGlvbiBjaGFuZ2UsIG9uIGNvbm5hw650IGxlIHLDqXN1bHRhdCBwb3VyIGxhIHF1ZXN0aW9uIHByw6ljw6lkZW50ZS5cbiAgICAgICAgLy8gUG91ciBxdSd1bmUgcsOpcG9uc2Ugc29pdCBib25uZSwgaWwgZmF1dCBjb2NoZXIgdG91dGVzIGxlcyBib25uZXMgcsOpcG9uc2VzIChzaSBRQ00pIMOgIGxhIHF1ZXN0aW9uIEVUIGNvY2hlciBhdWN1bmUgZGVzIG1hdXZhaXNlcy5cbiAgICAgICAgbGV0IGlkQ2hvaWNlLCBpZFF1ZXN0aW9uPVwiXCIsIGdvb2RSZXNwb25zZT1mYWxzZTtcbiAgICAgICAgZm9yKGxldCBpdGVtIGluIHVzZXJSZXNwb25zZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKGl0ZW0uc3RhcnRzV2l0aChcImlzQ29ycmVjdF9yZXNwb25zZV9cIikpLy8gPSBOb3V2ZWxsZSByw6lwb25zZSBwb3NzaWJsZS5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZENob2ljZSA9IGl0ZW0uc3Vic3RyaW5nKGl0ZW0ubGFzdEluZGV4T2YoXCJfXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gc2kgb24gY2hhbmdlIGRlIHF1ZXN0b25cbiAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicXVlc3Rpb25faWRfcmVzcG9uc2VfXCIraWRDaG9pY2VdIT1pZFF1ZXN0aW9uKSAvLyBvbiBjb21tZW5jZSDDoCB0cmFpdGVyIHVuZSBub3V2ZWxsZSBxdWVzdGlvblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWRRdWVzdGlvbj11c2VyUmVzcG9uc2VzW1wicXVlc3Rpb25faWRfcmVzcG9uc2VfXCIraWRDaG9pY2VdO1xuICAgICAgICAgICAgICAgICAgICBhbnN3ZXIubmJRdWVzdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYoZ29vZFJlc3BvbnNlKSAvLyByw6lzdWx0YXQgZGUgbGEgcXVlc3Rpb24gcHLDqWPDqWRlbnRlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIubmJDb3JyZWN0QW5zd2VycysrO1xuICAgICAgICAgICAgICAgICAgICBnb29kUmVzcG9uc2U9dHJ1ZTsvLyByw6lwb25zZSBib25uZSBqdXNxdSfDoCBsYSBwcmVtacOocmUgZXJyZXVyLi4uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHVzZXJSZXNwb25zZXNbaXRlbV09PVwidHJ1ZVwiKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZV9cIitpZENob2ljZSkucGFyZW50Tm9kZS5jbGFzc0xpc3QuYWRkKFwiaXNDb3JyZWN0XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicmVzcG9uc2VfXCIraWRDaG9pY2VdPT09dW5kZWZpbmVkKS8vIHVuZSBib25uZSByw6lwb25zZSBuJ2EgcGFzIMOpdMOpIHPDqWxlY3Rpb25uw6llXG4gICAgICAgICAgICAgICAgICAgICAgICBnb29kUmVzcG9uc2U9ZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHVzZXJSZXNwb25zZXNbXCJyZXNwb25zZV9cIitpZENob2ljZV09PT1cIm9uXCIpLy8gcsOpcG9uc2UgY29jaMOpZSBuZSBmYWlzYW50IHBhcyBwYXJ0aWUgZGVzIGJvbm5lc1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnb29kUmVzcG9uc2U9ZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlX1wiK2lkQ2hvaWNlKS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoXCJpc05vdENvcnJlY3RcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2kgaidhaSBiaWVuIHLDqXBvbmR1IMOgIGxhIGRlcm5pw6hyZSBxdWVzdGlvbiwgaWwgZmF1dCBsZSBjb21wdGVyIGljaSwgY2FyIGplIHN1aXMgc29ydGkgZGUgbGEgYm91Y2xlIDpcbiAgICAgICAgaWYoZ29vZFJlc3BvbnNlKVxuICAgICAgICAgICAgYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMrKztcblxuICAgICAgICAvLyBBZmZpY2hhZ2UgZHUgcsOpc3VsdGF0LCBzdWl2YW50IHNpIGwndXRpbGlzYXRldXIgZXN0IGNvbm5lY3TDqSBvdSBwYXMgZXQgc29uIHNjb3JlIDpcbiAgICAgICAgbGV0IGdldE91cHV0PWNoZWNrQW5zd2VyT3VwdXQoYW5zd2VyKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFNpIGwndXRpbGlzYXRldXIgZXN0IGNvbm5lY3TDqSwgb24gZW5yZWdpc3RyZSBzb24gcsOpc3VsdGF0IHN1ciBsZSBzZXJ2ZXVyLlxuICAgICAgICAgICAgY29uc3QgeGhyU2F2ZUFuc3dlciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyU2F2ZUFuc3dlci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrcXVlc3Rpb25uYWlyZVJvdXRlcytzYXZlQW5zd2Vyc1JvdXRlKTtcbiAgICAgICAgICAgIHhoclNhdmVBbnN3ZXIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4aHJSZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgKHhoclJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXB1dCs9XCI8YnI+XCIreGhyUmVzcG9uc2UubWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS51c2VySG9tZVBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQcmV2aW91c1Jlc3BvbnNlcyh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXB1dCs9XCI8YnI+XCIrcmVzcG9uc2VTYXZlZEVycm9yLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ1RlbXBsYXRlLnVzZXJIb21lUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlZGlyaWdlIHZlcnMgbGUgcsOpc3VsdGF0XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlcmU9d2luZG93LmxvY2F0aW9uOy8vIHdpbmRvdy5sb2NhdGlvbiDDoCBham91dGVyIHBvdXIgbmUgcGFzIHF1aXR0ZXIgbGEgcGFnZSBlbiBtb2RlIFwicHJldmlld1wiLi4uXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oaGVyZStcImV4cGxhbmF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHJTYXZlQW5zd2VyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgeGhyU2F2ZUFuc3dlci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgIGFuc3dlci50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZSgpOy8vIG9uIGVuIHByb2ZpdGUgcG91ciBtZXR0cmUgbGVzIHBlbmR1bGVzIMOgIGwnaGV1cmUuXG4gICAgICAgICAgICB4aHJTYXZlQW5zd2VyLnNlbmQoSlNPTi5zdHJpbmdpZnkoYW5zd2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7ICAgLy8gc2kgcGFzIGNvbm5lY3TDqSwgb24gZW5yZWdpc3RyZSBsZSByw6lzdWx0YXQgY8O0dMOpIGNsaWVudCBwb3VyIHBlcm1ldHRyZSBkZSBsZSByZXRyb3V2ZXIgYXUgbW9tZW50IGRlIGxhIGNyw6lhdGlvbiBkdSBjb21wdGUgb3UgZGUgbGEgY29ubmV4aW9uLlxuICAgICAgICAgICAgaWYoc2F2ZUFuc3dlcihhbnN3ZXIpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICBnZXRPdXB1dCs9XCI8YnI+PGJyPlwiK3dhbnRUb1NhdmVSZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBnZXRPdXB1dCwgXCJcIiwgW1wiaW5mb1wiXSk7XG4gICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3Vic2NyaWJlQnRuc1wiKS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgLy8gaW51dGlsZSBkZSBwcm9wb3NlciBkZSBjcsOpZXIgdW4gY29tcHRlIHNpIGxlIHN0b2NrYWdlIGxvY2FsIG5lIGZvbmN0aW9ubmUgcGFzXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIGdldE91cHV0LCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgIC8vIG9uIHJlZGlyaWdlIHZlcnMgbGUgcsOpc3VsdGF0XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaD1cIlwiO1xuICAgICAgICAgICAgY29uc3QgaGVyZT13aW5kb3cubG9jYXRpb247Ly8gd2luZG93LmxvY2F0aW9uIMOgIGFqb3V0ZXIgcG91ciBuZSBwYXMgcXVpdHRlciBsYSBwYWdlIGVuIG1vZGUgXCJwcmV2aWV3XCIuLi5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oaGVyZStcInJlc3BvbnNlXCIpOyAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgLy8gKyBhZmZpY2hhZ2UgZGVzIHRleHRlcyBkJ2V4cGxpY2F0aW9ucyBwb3VyIGNoYXF1ZSBxdWVzdGlvblxuICAgICAgICBjb25zdCBleHBsYW5hdGlvbnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5oZWxwXCIpO1xuICAgICAgICBmb3IobGV0IGkgaW4gZXhwbGFuYXRpb25zKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZihleHBsYW5hdGlvbnNbaV0uc3R5bGUhPXVuZGVmaW5lZCkgLy8gc2lub24sIGxhIGNvbnNvbGUgYWZmaWNoZSB1bmUgZXJyZXVyIFwiVHlwZUVycm9yOiBleHBsYW5hdGlvbnNbaV0uc3R5bGUgaXMgdW5kZWZpbmVkXCIsIGJpZW4gcXVlIHRvdXQgZm9uY3Rpb25uZSAoPylcbiAgICAgICAgICAgICAgICBleHBsYW5hdGlvbnNbaV0uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn0pXG5cbi8vIEZvbmN0aW9uIHbDqXJpZmlhbnQgbGVzIHByw6ljw6lkZW50ZXMgcsOpcG9uc2VzIGRlIGwndXRpbGlzYXRldXJcbi8vIFV0aWxlIHNpIGNvbm5lY3TDqSBsb3JzIGR1IHByZW1pZXIgY2hhcmdlbWVudCBkZSBsYSBwYWdlLCBwdWlzIGFwcsOocyB1bmUgbm91dmVsbGUgcsOpcG9uc2VcbmNvbnN0IGNoZWNrUHJldmlvdXNSZXNwb25zZXMgPSAodXNlcikgPT5cbntcbiAgICBjb25zdCB4aHJQcmV2aW91c1JlcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoclByZXZpb3VzUmVzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3F1ZXN0aW9ubmFpcmVSb3V0ZXMrZ2V0UHJldmlvdXNBbnN3ZXJzK3VzZXIuaWQrXCIvXCIrZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlSWRcIikudmFsdWUpO1xuICAgIHhoclByZXZpb3VzUmVzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJSZXNwb25zZXM9cmVzcG9uc2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c0Fuc3dlcnNDb250ZW50PVwiXCI7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChleHBsYW5hdGlvbnNUaXRsZSwgXCJzcGFuXCIsIHByZXZpb3VzQW5zd2Vyc1RpdGxlLnJlcGxhY2UoXCIjTk9NXCIsIHVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIGlmKG5iUmVzcG9uc2VzIT09MClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3ROYlF1ZXN0aW9ucz0wLCB0b3ROYkNvcnJlY3RBbnN3ZXJzPTAsIHRvdER1cmF0aW9uPTAsIG1hcExpbmVDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdE5iUXVlc3Rpb25zKz1yZXNwb25zZVtpXS5uYlF1ZXN0aW9uczsvLyAhIG9uIG5lIHBldXQgc2UgYmFzZXIgc3VyIGxhIHZlcnNpb24gYWN0dWVsbGUgZHUgcXVpeiwgY2FyIGxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYSBwdSDDqXZvbHVlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdE5iQ29ycmVjdEFuc3dlcnMrPXJlc3BvbnNlW2ldLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3REdXJhdGlvbis9cmVzcG9uc2VbaV0uZHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBMaW5lQ29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURUFOU1dFUiA6IGRhdGVGb3JtYXQocmVzcG9uc2VbaV0uY3JlYXRlZEF0LCBsYW5nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkNPUlJFQ1RBTlNXRVJTIDogcmVzcG9uc2VbaV0ubmJDb3JyZWN0QW5zd2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQlFVRVNUSU9OUyA6IHJlc3BvbnNlW2ldLm5iUXVlc3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR0RVUkFUSU9OIDogcmVzcG9uc2VbaV0uZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0Fuc3dlcnNDb250ZW50Kz1cIjxsaT5cIityZXBsYWNlQWxsKHByZXZpb3VzQW5zd2Vyc0xpbmUsIG1hcExpbmVDb250ZW50KStcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWFwTGluZUNvbnRlbnQgPVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBVkdEVVJBVElPTiA6IE1hdGgucm91bmQodG90RHVyYXRpb24vbmJSZXNwb25zZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgQVZHQ09SUkVDVEFOU1dFUlMgOiBNYXRoLnJvdW5kKHRvdE5iQ29ycmVjdEFuc3dlcnMvdG90TmJRdWVzdGlvbnMqMTAwKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0Fuc3dlcnNDb250ZW50PVwiPGg1PlwiK3JlcGxhY2VBbGwocHJldmlvdXNBbnN3ZXJzU3RhdHMsIG1hcExpbmVDb250ZW50KStcIjwvaDU+XCIrcHJldmlvdXNBbnN3ZXJzQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChleHBsYW5hdGlvbnNDb250ZW50LCBcInVsXCIsIHByZXZpb3VzQW5zd2Vyc0NvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZXhwbGFuYXRpb25zQ29udGVudCwgXCJ1bFwiLCBub1ByZXZpb3VzQW5zd2VyKTtcbiAgICAgICAgICAgICAgICAvLyBkYW5zIHVuIGNhcyBjb21tZSBkYW5zIGwnYXV0cmUsIGJvdXRvbiBwb3VyIHJldmVuaXIgw6AgbCdhY2N1ZWlsIGR1IGNvbXB0ZVxuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZXhwbGFuYXRpb25zQ29udGVudCwgXCJwXCIsIFwiPGEgaHJlZj1cXFwiL1wiK2NvbmZpZ1RlbXBsYXRlLnVzZXJIb21lUGFnZStcIlxcXCIgY2xhc3M9XFxcImJ1dHRvbiBjYXJkYm9hcmRcXFwiPlwiK2NvbmZpZ1RlbXBsYXRlLnVzZXJIb21lUGFnZVR4dCtcIjwvYT5cIiwgXCJcIiwgW1wiYnRuXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhyUHJldmlvdXNSZXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgeGhyUHJldmlvdXNSZXMuc2VuZCgpO1xufSIsImNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG5pbXBvcnQgeyBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9sYW5nL1wiK2NvbmZpZ0Zyb250RW5kLmxhbmcrXCIvYW5zd2VyXCIpO1xuXG4vLyBFbnJlZ2lzdHJlbWVudCBjw7R0w6kgY2xpZW50IGR1IGRlcm5pZXIgcsOpc3VsdGF0IMOgIHVuIHF1aXogZW4gYXR0ZW5kYW50IGQnw6p0cmUgY29ubmVjdMOpXG5leHBvcnQgY29uc3Qgc2F2ZUFuc3dlciA9IChhbnN3ZXIpID0+XG57XG4gICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSAmJiAoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgfHwgIWlzRW1wdHkoYW5zd2VyLkdyb3VwSWQpKSlcbiAgICB7XG4gICAgICAgIHNhdmVMb2NhbHkoXCJsYXN0QW5zd2VyXCIsIGFuc3dlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gUmV0b3VybmUgdW4gdGV4dGUgc3VpdmFudCBsZSBub21icmUgZGUgYm9ubmVzIHLDqXBvbnNlc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyT3VwdXQgPSAoYW5zd2VyKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAge1xuICAgICAgICBjb25zdCByYXRpbz1hbnN3ZXIubmJDb3JyZWN0QW5zd2Vycy9hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIGNvbnN0IG1hcE9iaj1cbiAgICAgICAge1xuICAgICAgICAgICAgRFVSQVRJT046IGFuc3dlci5kdXJhdGlvbixcbiAgICAgICAgICAgIE5CQ09SUkVDVEFOU1dFUlM6IGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzLFxuICAgICAgICAgICAgTkJRVUVTVElPTlM6IGFuc3dlci5uYlF1ZXN0aW9uc1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXQ9XCJcIjtcbiAgICAgICAgaWYocmF0aW8gPCAwLjQpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwsIG1hcE9iaik7XG4gICAgICAgIGVsc2UgaWYocmF0aW8gPCAwLjgpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dE1lZGl1bSwgbWFwT2JqKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb3V0cHV0PXJlcGxhY2VBbGwodHh0LmNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzLCBtYXBPYmopO1xuICAgICAgICBpZihvdXRwdXQpXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gXCJcIjtcbn0iLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG5cXG5MZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgdm91cyBwb3V2ZXogbGUgdHJvdXZlciDDoCBjZXR0ZSBhZHJlc3NlIDpcXG5odHRwczovL2ZvcmdlLmNoYXByaWwub3JnL0ZhYl9CbGFiL1dpa2lMZXJuaVxcblxcblBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBtYXRvbW8gfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL21hdG9tby5qc1wiO1xuXG4vLyBGb25jdGlvbiBjaGFyZ2VhbnQgbGUgY29kZSBtYXRvbW9cbmV4cG9ydCBjb25zdCBsb2FkTWF0b21vID0gKCkgPT5cbntcbiAgICAvLyBjaGFyZ2VtZW50IGRlIG1hdG9tb1xuICAgIHZhciBfcGFxID0gd2luZG93Ll9wYXEgPSB3aW5kb3cuX3BhcSB8fCBbXTtcbiAgICAvL2Fqb3V0IGNuaWwgIDpcbiAgICBfcGFxLnB1c2goW2Z1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxWaXNpdG9yQ29va2llVGltZW91dCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgbm93VHMgPSBNYXRoLnJvdW5kKG5vdy5nZXRUaW1lKCkgLyAxMDAwKSxcbiAgICAgICAgICAgIHZpc2l0b3JJbmZvID0gc2VsZi5nZXRWaXNpdG9ySW5mbygpO1xuICAgICAgICAgICAgdmFyIGNyZWF0ZVRzID0gcGFyc2VJbnQodmlzaXRvckluZm9bMl0pO1xuICAgICAgICAgICAgdmFyIGNvb2tpZVRpbWVvdXQgPSAzMzY5NjAwMDsgLy8gMTMgbW9pcyBlbiBzZWNvbmRlc1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsVGltZW91dCA9IGNyZWF0ZVRzICsgY29va2llVGltZW91dCAtIG5vd1RzO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZpc2l0b3JDb29raWVUaW1lb3V0KCBnZXRPcmlnaW5hbFZpc2l0b3JDb29raWVUaW1lb3V0KCkgKTtcbiAgICB9XSk7XG4gICAgLy8tLWZpbiBham91dCBjbmlsXG4gICAgX3BhcS5wdXNoKFsndHJhY2tQYWdlVmlldyddKTtcbiAgICBfcGFxLnB1c2goWydlbmFibGVMaW5rVHJhY2tpbmcnXSk7XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdT1tYXRvbW8udXJsO1xuICAgICAgICBfcGFxLnB1c2goWydzZXRUcmFja2VyVXJsJywgdSsnbWF0b21vLnBocCddKTtcbiAgICAgICAgX3BhcS5wdXNoKFsnc2V0U2l0ZUlkJywgbWF0b21vLnNpdGVJZF0pO1xuICAgICAgICB2YXIgZD1kb2N1bWVudCwgZz1kLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBzPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgICBnLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7IGcuYXN5bmM9dHJ1ZTsgZy5zcmM9dSsnbWF0b21vLmpzJzsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLHMpO1xuICAgIH0pKCk7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6IG91IGQndW4gZ3JvdXBlIGRlIHF1aXpzXG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpICYmICghaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSB8fCAhaXNFbXB0eShhbnN3ZXIuR3JvdXBJZCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkpXG4gICAgICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGF0YXMuR3JvdXBJZD1hbnN3ZXIuR3JvdXBJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
|